#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)
meansscanf()
считывает значение в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
, который не делает то, что вы думаете, я не буду повторять это здесь.