我需要为我的第一学期c作业编写一个函数。如果有人可以帮助我,我已经编写了我需要验证用户输入的所有任务。这就是老师给我的......如果这还不够,我可以发布更多信息
必须使用 double get_double(void)
函数来验证每项费用的输入
和收入。它将不断提示用户输入数值,直到它满足为止
条件。该值必须为numeric且大于或等于0.如果有任何字符输入
在输入被视为无效的数字之前或之后。
#include <stdio.h>
#include <conio.h>
double get_expenses(double* pSchool, double* pLiving, double* pTransp, double* pOther); /* function prototype */
double get_income(double* pEmploy, double* pOther); /* function prototype */
double display_report(double School, double Living, double Transp, double OtherExp, double Employ, double OtherInc); /* function prototype */
char get_char(char* pRecalculate); /* function prototype */
void clear_buffer(void); /* function prototype */
double get_double(void); /* function prototype */
main() {
double school, living, transp, otherExp;
double employ, otherInc;
char recalculate;
int counter = 1;
while (counter > 0){
printf("Student Budget Planner\n");
printf("~~~~~~~~~~~~~~~~~~~\n");
printf("Input Set: %d\n\n", counter);
get_expenses(&school, &living, &transp, &otherExp);
get_income(&employ, &otherInc);
display_report(school, living, transp, otherExp, employ, otherInc);
clear_buffer();
get_char(&recalculate);
if (recalculate == 'Y' || recalculate == 'y'){
counter = counter + 1;
} else {
counter = 0;
}
}
return 0;
}
double get_expenses(double* pSchool, double* pLiving, double* pTransp, double* pOther) {
*pSchool = *pLiving = *pTransp = *pOther = 0;
double tuition, textbooks, supplies, rent, utilities, phone, groceries;
double entertainment, transportation, car, insurance, gas, other;
printf("School Expenses:\n");
printf("~~~~~~~~~~~~~~\n");
printf("Tuition (per semester): ");
scanf("%lf", &tuition);
printf("\nTextbooks(per semester): ");
scanf("%lf", &textbooks);
printf("\nSupplies: ");
scanf("%lf", &supplies);
*pSchool = (tuition / 4) + (textbooks / 4) + supplies;
printf("\n\nLiving Expenses:\n");
printf("~~~~~~~~~~~~~\n");
printf("Residence/Rent/Mortgage: ");
scanf("%lf", &rent);
printf("\nUtilities: ");
scanf("%lf", &utilities);
printf("\nPhone/Internet: ");
scanf("%lf", &phone);
printf("\nGroceries/Eating out: ");
scanf("%lf", &groceries);
printf("\nEntertainment: ");
scanf("%lf", &entertainment);
*pLiving = rent + utilities + phone + groceries + entertainment;
printf("\n\nTransportation: \n");
printf("~~~~~~~~~~~~~\n");
printf("Public Transportation: ");
scanf("%lf", &transportation);
printf("\nCar: ");
scanf("%lf", &car);
printf("\nAuto Insurance: ");
scanf("%lf", &insurance);
printf("\nGas/Maintenance: ");
scanf("%lf", &gas);
*pTransp = transportation + car + insurance + gas;
printf("\n\nOther: \n");
printf("~~~~~\n");
printf("Any other expenses: ");
scanf("%lf", &other);
*pOther = other;
return *pSchool, *pLiving, *pTransp, *pOther;
}
double get_income(double* pEmploy, double* pOther){
*pEmploy = *pOther = 0;
double wages, family, scholarship, other;
printf("\n\nEmployment income:\n");
printf("~~~~~~~~~~~~~~~~~\n");
printf("Expected Wages/Tips: ");
scanf("%lf", &wages);
*pEmploy = wages;
printf("\n\nOther income:\n");
printf("~~~~~~~~~~~\n");
printf("Family Support: ");
scanf("%lf", &family);
printf("\nScholarship/Bursaries (per semester): ");
scanf("%lf", &scholarship);
printf("\nOther: ");
scanf("%lf", &other);
*pOther = family + scholarship + other;
return *pEmploy, *pOther;
}
double display_report(double School, double Living, double Transp, double OtherExp, double Employ, double OtherInc) {
printf("\n\nStudent Name Budget Report\n");
printf("~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("Expenses:\n");
printf("~~~~~~~~\n");
printf(" MONTHLY ANNUALY\n");
printf("School Expenses: $%.2lf $%.2lf\n", School, School * 12);
printf("Living Expenses: $%.2lf $%.2lf\n", Living, Living * 12);
printf("Transportation Expenses: $%.2lf $%.2lf\n", Transp, Transp * 12);
printf("Other Expenses: $%.2lf $%.2lf\n", OtherExp, OtherExp * 12);
printf("total Expenses: $%.2lf $%.2lf\n", School + Living + Transp + OtherExp, School * 12 + Living * 12 + Transp * 12 + OtherExp * 12);
printf("Income:\n");
printf("~~~~~~~\n");
printf("Employment Income: $%.2lf $%.2lf\n", Employ, Employ * 12);
printf("Other Income: $%.2lf $%.2lf\n", OtherInc, OtherInc * 12);
printf("Total Income: $%.2lf $%.2lf\n", Employ + OtherInc, Employ * 12 + OtherInc * 12);
printf("Total Savings Available for your Goals: $%.2lf $%.2lf\n", (Employ + OtherInc) - (School + Living + Transp + OtherExp), (Employ * 12 + OtherInc * 12)- (School * 12 + Living * 12 + Transp * 12 + OtherExp * 12));
return 0;
}
char get_char(char* pRecalculate){
int valid_input;
valid_input = 0;
while (valid_input == 0){
printf("\nWould you like to recalculate your budget? (Y/N): ");
scanf("%c", &*pRecalculate);
*pRecalculate = toupper(*pRecalculate);
if (*pRecalculate == 'Y' || *pRecalculate == 'y' || *pRecalculate == 'N' || *pRecalculate == 'n') valid_input = 1;
else printf("Error Invalid choice\n");
printf("\n");
}
return *pRecalculate;
}
void clear_buffer(void) {
while ( getchar() != '\n' );
}
double get_double()
{
// What to put here?
}
答案 0 :(得分:2)
考虑一下流程,并考虑您希望程序或功能遵循的流程图/决策树。
在输入有效输入之前,您不想停止要求用户输入。您可以保证至少询问用户一次,但可能会多次询问。输入有效或无效。
现在我们开始起草一些伪代码。我就是这样做的:
double get_double(void)
{
double d;
int ask_again = 1; /* continue if 1 (true), exit if 0 (false) */
do {
/* display message to user to let them know to type a number */
/* read user input */
if (/* user input didn't input a valid double */)
{
/* display appropriate error message */
}
else if (/* user entered a double, but it wasn't greater than or equal to zero */)
{
/* display appropriate error message */
}
else /* user entered valid input, so ... */
{
/* ... do something to make sure the loop exists */
}
} while (/* we need to ask again */);
}
这对我大吼大叫,所以我在do-while循环中写了它。我提供了一个int ask_again
变量,但是如果有的话,我会把它留给你。
您应该考虑所有评论所针对的真实代码 请查看您的课程笔记,了解您的老师希望您了解哪些技术可以在此处申请。
阅读和清理用户输入是所有计算机语言中一个臭名昭着的问题,尤其是C. StackOverflow可以为您提供有关如何执行特定操作的想法。
答案 1 :(得分:1)
试试这个:
double get_double()
{
double d;
if (scanf("%lf", &d) != 1)
/* handle error */
reurn -1;
if (d < 0)
/* handle error */
return -1;
return d;
}
或者,正如Keith Thompson指出的那样,你也可以安全:
double get_double()
{
double d;
char *line = NULL;
size_t len;
getline(&line, &len, stdin);
if (line == NULL)
return -1;
d = strtod(line, NULL);
free(line);
if (d < 0)
/* handle error */
return -1;
return d;
}
你可以像这样使用它(因为没有办法在一个双精度中返回所有输入的双精度数 - 也许你想要一个数组,但问题是将目标签名指定为double(*)()):
double d;
while ((d = get_double()) >= 0)
{
/* do what you want */
}