Проблемы с функцией (char * приглашение) — вычисление

#c

#c

Вопрос:

Я пишу программу, которая вычисляет общую зарплату путем вычисления переменной ratePerHour, HoursWorked, bonus, overtimeSalary. Все работает нормально, но когда я пытаюсь запустить его, он не сохраняет входные значения каких-либо переменных и не выполняет вычисления.

Я думаю, что проблемы из-за чего-то неправильного в моей функции readNumber:

 double readNumber(char *prompt) {
    double val;
    //print the prompt:
    printf("%s", prompt);
    scanf(" %lf", amp;val);

    if (scanf("%lf", amp;val) != 1) {
      printf("Invalid input.n");
    exit(0);
}
 

Также другая проблема заключается в том, что программа должна спрашивать пользователя, получает ли он бонус или нет, и если пользователь вводит n его, не следует просить его ввести бонус, но по какой-то причине моя программа это делает.

 char readYesOrNo(char *prompt) {
     char yn = 'n';
     //display the prompt:
     printf("%s", prompt);

     yn = scanf(" %c", amp;yn);

     //return the value
     return(yn);
 }
 

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

введите описание изображения здесь

Комментарии:

1. Ваш пример кода перегружен, поэтому невозможно определить, что такое код, а что комментарий. Это затрудняет помощь людям. Оператор вида yn = scanf("%c", amp;yn) means scanf() считывает значение в yn , а затем немедленно отбрасывает его (перезаписывая возвращаемым значением scanf() — усеченным от int до char ).

2. Вы не хотите exit(0); readNumber() этого; вы, вероятно, хотите return val; вместо этого. Кроме того, пожалуйста, используйте нотацию комментариев для встраивания комментариев в ваш код. Ваш код очень похож на C и очень не похож на C .

3. Публикуйте текст как текст, а не изображения!

Ответ №1:

В readnumber() вы должны вернуть val вместо или exit(0) .

В readYesorNo() вы возвращаете возвращаемое значение scanf , которое равно 1 , даже если вы вводите a N .

Ответ №2:

Как вы думаете, сколько раз вам нужно прочитать val ??

 double readNumber(char *prompt) {
    double val;            /* you have 1 val */
    print the prompt:
    printf("%s", prompt);
    scanf(" %lf", amp;val);           /* you read it the 1st time here (unneeded) */

    if (scanf("%lf", amp;val) != 1) { /* you read whatever the next num is here */
      printf("Invalid input.n");
    exit(0);
}
 

Вам лучше избавиться от ненужного начального чтения и вернуть a double , как вы объявили функцию для выполнения, например:

 double readNumber (const char *prompt) 
{
    double val;
    printf ("%s", prompt);          /* print the prompt */
    if (scanf ("%lf", amp;val) != 1) { /* read/validate the double value */
        fprintf (stderr, "error: Invalid input.n");

        exit(0);  /* you can handle the error how ever you like here 
                   * since you are returning a double, indicating success or
                   * failure by numeric return is a difficult proposition.
                   */
    }
    return val;
}
 

(примечание: передача prompt as const char *prompt поможет компилятору в дальнейшей оптимизации процедуры — знание prompt не подлежит изменению)

(по мере продвижения в C, вы можете рассмотреть возможность чтения строки за раз, fgets а затем анализировать нужные вам значения из буфера sscanf , или использовать пару указателей на символы, что позволяет отделить чтение от анализа / преобразования, обеспечивая более гибкую обработку входных непредвиденных обстоятельств).

попробуйте, readNumber как изменено выше (и обратите внимание: readnumber избегайте camelCase переменных, которые не используются с большой пользой в C, как в C , это стиль, так что решать вам, но это, безусловно, будет выделяться так, как вы, возможно, не захотите, для тех, кто читает ваш Cкод)

Другие ответы касались scanf возврата yn , который не делает то, что вы думаете, я не буду повторять это здесь.