Хранить пользовательский ввод в переменной - PullRequest
2 голосов
/ 07 августа 2010

Мне было интересно, как я мог бы предложить конечному пользователю моей программы ввести значение, которое он хочет преобразовать из Фаренгейта в Цельсий в С.

По сути, так как я всего n00b иЯ пишу удивительные «программы», такие как эта:

    //Simple program to convert Fahrenheit to Celsius

    int main (int argc, char *argv[])
    {
     double celsius, fahrenheit, result;

     celsius = result;
     fahrenheit = 27;
     result = (fahrenheit - 32) / 1.8;

     printf("27 degress Fahrenheit is %g degrees Celsius!", result);

     return 0;
    }

Я хотел бы добавить к этому некоторую реальную «функциональность», если вы понимаете, о чем я.Вместо того, чтобы просто сделать это тестовой программой, где на самом деле она просто показывает некоторую простую оценку арифметических выражений, я бы хотел сделать ее несколько более полезной.

В любом случае, мне было интересно, смогу ли я использовать функцию, перечисленную в страница справки scanf (3) , чтобы помочь мне в распознавании введенных пользователем данных, а затем каким-то образом сохранить их в переменной Фаренгейта.

Теперь было бы здорово, если быПосле запуска программа может задать конечному пользователю вопрос, спрашивающий, хочет ли он или она перевести из градуса Цельсия в градусы Фаренгейта или из градуса Фаренгейта в градусы Цельсия, но давайте просто сделаем это шаг за шагом, и я подожду, покаЯ прочитал главу в моей книге о "Принятии решений"!:)

ОБНОВЛЕНИЕ:

Удаляет бесполезный переменный результат, как указано kiamlaluno:

    //Simple program to convert Fahrenheit to Celsius

    int main (int argc, char *argv[])
    {
 double fahrenheit, celsius;

 fahrenheit = 27;
 celsius = (fahrenheit - 32) / 1.8;

 printf("27 degress Fahrenheit is %g degrees Celsius!", celsius);

 return 0;
    }

ОБНОВЛЕНИЕ ОБНОВЛЕНИЕ:

Я пытался включить все полезные предложения, опубликованные здесь, но у меня больше проблем с моим кодом:

//Simple program to convert Fahrenheit to Celsius and Celsius to Fahrenheit

int main (int argc, char *argv[])
{
int celsius, fahrenheit, celsiusResult, fahrenheitResult;
celsiusResult = (fahrenheit - 32)*(5/9);
fahrenheitResult = (celsius*(9/5)) + 32;
int prompt;

printf("Please press 1 to convert Fahrenheit to Celsius, or 0 to convert Celsius to Fahrenheit please:\n ");
scanf("%i", &prompt);
if(prompt == 1) {
    printf("Please enter a temperature in Fahrenheit to be converted into Celsius!:\n");
    scanf("%i", &fahrenheit);
    printf("%i degress Fahrenheit is %i degrees Celsius!", fahrenheit, celsiusResult);

}
else {
    printf("Please enter a temperature in Celsius to be converted into Fahrenheit:\n");
    scanf("%i", &celsius);
    printf("%i degreses Celsius is %i degrees Fahrenheit", celsius, fahrenheitResult);
}

return 0;
}

Все работает отлично, кроме самих вычислений,которые выходят совершенно неправильно .. На секунду я подумал, что это могло быть из-за того, что я изменил сами числа на типы целых чисел, но я снова сделал их двойными, и это все еще было немного странно.

Есть какие-нибудь мысли?

Ответы [ 4 ]

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

Чтобы использовать scanf() для чтения двойного, вам нужно использовать правильную строку формата. Это было бы %lf для "длинного числа с плавающей точкой" (где одно только 1003 * читалось бы как число с плавающей точкой). Затем вы могли бы читать прямо в двойном. То же самое касается печати. ​​

int main (int argc, char *argv[])
{
    double fahrenheit, celsius;

    printf("farenheit? ");     /* write a prompt */
    scanf("%lf", &fahrenheit); /* read a double into the fahrenheit variable */

    celsius = (fahrenheit - 32) / 1.8;

    printf("%lf degress Fahrenheit is %lf degrees Celsius!\n", fahrenheit, celsius);

    return 0;
}

Обратите внимание, что это не обрабатывает нечисловые вводы вообще. Вам нужно будет использовать другие методы ввода.

[править]

Вы, конечно, делаете скачки в своем коде, который, кажется, делает большой прогресс. :)

Для решения вашего самого последнего обновления существует пара проблем. Ваш код фактически ничего не вычисляет, вы применили формулу слишком рано. Вам следует подождать, пока fahrenheit или celsius не будут иметь значимых значений (т.е. после того, как пользователь введет значение, которое будет преобразовано). Было бы неплохо переместить эти формулы в функции для выполнения преобразования. Вы также должны придерживаться использования двойных, а не целых чисел. Вы не получите ту точность, которую хотите, используя целые числа.

double convert_fahrenheit_to_celsius(double fahrenheit)
{
    return (fahrenheit - 32)*(5/9);
}

double convert_celsius_to_fahrenheit(double celsius)
{
    return (celsius*(9/5)) + 32;
}

int main (int argc, char *argv[])
{
    double celsius, fahrenheit, celsiusResult, fahrenheitResult;
    int prompt;

    printf("Please press 1 to convert Fahrenheit to Celsius, or 0 to convert Celsius to Fahrenheit please:\n ");
    scanf("%i", &prompt);
    if(prompt == 1) {
        printf("Please enter a temperature in Fahrenheit to be converted into Celsius!:\n");
        scanf("%lf", &fahrenheit);

        /* now convert user-input fahrenheit to celsius */
        celsiusResult = convert_fahrenheit_to_celsius(fahrenheit);

        printf("%lf degress Fahrenheit is %lf degrees Celsius!", fahrenheit, celsiusResult);
    }
    else {
        printf("Please enter a temperature in Celsius to be converted into Fahrenheit:\n");
        scanf("%lf", &celsius);

        /* now convert user-input celsius to fahrenheit */
        fahrenheitResult = convert_celsius_to_fahrenheit(celsius);

        printf("%lf degreses Celsius is %lf degrees Fahrenheit", celsius, fahrenheitResult);
    }

    return 0;
}
1 голос
/ 07 августа 2010

Хорошо, если вы хотите предложить пользователю ввести данные, просто используйте scanf с тегом% lf:

//Simple program to convert Fahrenheit to Celsius

int main (int argc, char *argv[])
{
    double fahrenheit, result;

    printf("Please enter a number for farenheit: ");
    scanf("%lf", &fahrenheit);
    result = (fahrenheit - 32) / 1.8;

    printf("27 degress Fahrenheit is %g degrees Celsius!", result);

    return 0;
}

Что касается запроса пользователя, хочет ли он / она по Цельсию или по Фаренгейту, вам нужно что-то вызвать, а также оператор if и else.

int main (int argc, char *argv[])
{
    double celsius, fahrenheit, result;
    int ForC;

    printf("1 for Celsius or 0 for Fahrenheit plz: ");
    scanf("%d", &ForC);
    if(ForC == 1) {
        scanf("%lf", &fahrenheit);
        result = (fahrenheit - 32) / 1.8;
        printf("fahrenheit to celsius:%lf", result);
    }
    else {
        scanf("%lf", &celsius);
        result = (celsius*9.0)/5.0 + 32;
        printf("celsius to farenheit:%lf", result);
    }

    return 0;
}
0 голосов
/ 08 августа 2010

ОБНОВЛЕНИЕ ОБНОВЛЕНИЯ: попробуйте выполнить расчет после получения значения от пользователя.Если нет, то результирующее значение celsius, fahrenheit, celsiusResult, fahrenheitResult неизвестно.

0 голосов
/ 07 августа 2010

Обработка возможного ошибочного пользовательского ввода может быть выполнена путем проверки возвращаемого значения scanf ().Оно должно быть равно количеству ожидаемых значений (в данном случае 1).В другом случае ввод следует повторить.

...