#c #octal
#c #восьмеричные
Вопрос:
Что делает мой код, так это:
- Пользователь выбирает либо преобразование из десятичного числа в восьмеричное, либо из восьмеричного числа в десятичное.
- Пользователь вводит число
- Пользователь получает результат преобразования
Теперь я хочу разрешить только числа otcal при преобразовании из восьмеричного числа в десятичное и выдавать сообщение об ошибке, если число не является восьмеричным. Как этого можно достичь?
#include <stdio.h>
#include <math.h>
int UmrechnungDezimalZuOktal(int dezimalzahl), UmrechnungOktalZuDezimal(int oktalzahl);
int main()
{
char auswahl;
int dezimalzahl, oktalzahl, nichtBeendet = 1, c;
while (nichtBeendet) {
printf("nn ################## AUSWAHL ##################n"
" # #n"
" # 1) Konvertierung Dezimal -> Oktal #n"
" # 2) Konvertierung Oktal -> Dezimal #n"
" # 3) Abbruch #n"
" # #n"
" ###############################################nn");
printf("Auswahl: ");
scanf("%c", amp;auswahl);
switch (auswahl) {
case '1': { /* Konvertierung Dezimal -> Oktal */
printf("Geben Sie eine positive, ganze Dezimalzahl ein: ");
scanf("%d", amp;dezimalzahl);
if (dezimalzahl >= 0)
{
printf("Die Dezimalzahl %d entspricht der Oktalzahl %d", dezimalzahl, UmrechnungDezimalZuOktal(dezimalzahl));
}
else
{
printf("Bitte nur positive Zahlen eingeben!");
}
break;
}
case '2': { /* Konvertierung Oktal-> Dezimal */
printf("Geben Sie eine positive, ganze Oktalzahl ein: ");
scanf("%d", amp;oktalzahl);
if (oktalzahl >= 0)
{
printf("Die Oktalzahl %d entspricht der Dezimalzahl %d", oktalzahl, UmrechnungOktalZuDezimal(oktalzahl));
}
else
{
printf("Bitte nur positive Zahlen eingeben!");
}
break;
}
case '3': { /* Abbruch */
nichtBeendet = 0;
break;
}
default: { /* Ungültige Eingabe*/
printf("Ungueltige Eingabe!");
break;
}
}
while ((c = getchar()) != 'n' amp;amp; c != EOF) {};
}
}
int UmrechnungDezimalZuOktal(int dezimalzahl) /* Rechnung Dezimal -> Oktal */
{
int oktalzahl = 0, i = 1;
while (dezimalzahl != 0)
{
oktalzahl = (dezimalzahl % 8) * i;
dezimalzahl /= 8;
i *= 10;
}
return oktalzahl;
}
int UmrechnungOktalZuDezimal(int oktalzahl) /* Rechnung Oktal -> Dezimal*/
{
int dezimalzahl = 0, i = 0;
while (oktalzahl != 0)
{
dezimalzahl = (oktalzahl % 10) * pow(8, i);
i;
oktalzahl /= 10;
}
i = 1;
return dezimalzahl;
}
Комментарии:
1. Вы можете принять восьмеричное значение в виде строки, а затем извлечь из него числовую часть. Например, попросите пользователя ввести восьмеричное значение с добавлением
0c
в начале (скажем0c12
). Затем проверьте, содержит ли ввод0c
, если он содержит эти два символа, продолжайте дальше, в противном случае завершите.2. Также вы можете проверить входные данные, если таковые
digit > 7
имеются, то это не восьмеричное число.3. не используйте
pow
или другие математические функции при использовании целых чисел
Ответ №1:
Я бы заменил все функции scanf
and, закодированные в формате harcoded , на fgets
and strtol
:
enum {oct = 8, dec = 10, hex = 16};
int to_number(int base, bool *match)
{
char str[32];
long num = 0;
*match = false;
if (fgets(str, sizeof str, stdin))
{
char *ptr;
num = strtol(str, amp;ptr, base);
*match = (*ptr == 'n'); // match is true if strtol stops scanning
// at the newline left by fgets
}
return (int)num;
}
...
bool match;
int num = to_number(oct, amp;match);
printf("%d %s an octaln", num, match ? "is" : "is not");
Редактировать:
Как указано @klutt в комментариях, поскольку strtol
возвращает a long
, в идеале функция также должна возвращаться long
, чтобы избежать приведения, тогда, если вам действительно нужно int
, вы можете привести возврат функции:
long to_number(int base, bool *match);
int num = (int)to_number(oct, amp;match);
Комментарии:
1. Я бы поставил круглые скобки
*ptr == 'n'
просто для ясности.2. Но с какой стати вы объявляете
num
как long, а затем приводите результат вместо изменения возвращаемого типа?3. @klutt хорошая мысль, я предпочитаю избегать их, но я согласен, так понятнее
4. @klutt OP работает с
int
s в своем примере, зачем возвращать along
, если OP хочет anint
?5. Хорошо, я понимаю вашу точку зрения, но я бы все равно вернулся надолго. И я склонен видеть красный цвет, когда вижу ненужные броски. 🙂