Простой конвертер в C - PullRequest
       1

Простой конвертер в C

1 голос
/ 27 августа 2010

Я купил «Книгу на C» для своего урока процедурного программирования и выполнял некоторые из упражнений.Глава 2 Упражнение 9 посвящено созданию конвертера единиц, который может работать с унциями, фунтами, граммами и килограммами.

Код, который я написал, работает, но я действительно думаю, что он мог бы быть гораздо чище.Использование вложенных операторов if кажется сложным.

Кроме того, я заметил одну проблему: если в scanf () в строке 27 будет задан символ или строка, он сохранится и будет передан.в scanf () в строке 95. Например, если вы введете «y» в качестве значения для преобразования, программа перейдет к началу, не позволяя пользователю ответить «Хотите выполнить дополнительные преобразования?»Как я могу исправить это так, чтобы, если вводится NaN, он отбрасывался?

Мой код может быть расположен по адресу: http://pastebin.com/4tST0i7T

Ответы [ 3 ]

2 голосов
/ 27 августа 2010

Одним из способов очистки структуры if было бы преобразование значения из «fromUnit» в общее значение, а затем преобразование его в «toUnit».Это упрощает структуру, оставляя только две структуры if вокруг.(Это также лучше масштабируется.) Итак, это было бы что-то вроде:

if (!strcmp(fromUnit, "pound")) {  
    tempval = input / 16;  
} else if (!strcmp(fromUnit, "gram") == 0) {  
    tempval = input * OUNCESTOGRAMS;  
}  

if (!strcmp(toUnit, "pound")) {  
    output = tempval * 16;  
} else if (!strcmp(toUnit, "gram")) {  
    output = tempval / OUNCESTOGRAMS;  
}  

Конечно, эта математика не верна, это просто для примера.Вам просто нужно (1) выбрать временную единицу, которую вы хотите использовать (2) преобразовать из единицы ввода в эту единицу и (3) преобразовать из временной единицы в единицу вывода.

И каккто-то еще упомянул, get () - определенно путь.

1 голос
/ 27 августа 2010

Я бы сделал это примерно так:

#include <stdio.h>

typedef struct _unit {
    char * name;
    float grams;
} unit; 

unit units[] = {
    {"gram", 1.0},
    {"kilogram", 1000.0},
    {"pound", 500.0},
    {"ounce", 28.3495231}
};

unit * search_unit(char * name)
{
    int i;
    for (i = 0; i < (sizeof(units) / sizeof(unit)); i++)
    {
        printf("%d %s\n", i, units[i].name);
        if (0 == strcmp(units[i].name, name))
        {
            return & units[i];
        }
    }
    return NULL;
}
int main() {
    char line[10];
    char unitname[10];
    int number;
    unit * found_unit;

    while (1)
    {
        fgets(line, sizeof(line), stdin);
        if (1 == sscanf(line, "%d", &number))
        {
            break;
        }
        printf("not a number\n");
    }

    while (1)
    {
        fgets(line, sizeof(line), stdin);
        sscanf(line, "%s\n", unitname);
        found_unit = search_unit(unitname);
        if (found_unit)
        {
            printf("%d %s is %f grams\n", number, unitname, found_unit->grams * number);
            break;
        }
        printf("unknown unit\n");
    }
}
  • Сохраните ваши данные в некоторой структуре данных, а не в коде.
  • Сначала прочитайте строку текста,затем проверьте, является ли это число.
  • При чтении из стандартного ввода учтите размер буфера.
  • Используйте циклы вместо goto.
  • Используйте некоторые общие единицы, граммы, например, чтобы вычислить что-либо к чему-либо.
0 голосов
/ 27 августа 2010

Самый надежный способ - прочитать входную строку, используя функцию fgets () , проверить, содержит ли она цифру, используя isdigit () (все символы в строке), а затем преобразовать ее вчисловое значение с использованием atoi () .

Кстати, последние две операции можно заменить на strtol () .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...