gpt4 book ai didi

c - 分解 C 中的代码块

转载 作者:太空宇宙 更新时间:2023-11-04 00:00:33 25 4
gpt4 key购买 nike

我遇到了我的函数在太多行上运行的情况。显然有重复因素,我还不确定如何分解它。我试过将相同的代码放入另一个函数中,但它占用的代码行数几乎相同。有更好的分解方法吗?谢谢。

int purchase_meal() {

FILE *fptr;

char meal_choice[5];
char *item;
float price, sumtax, tax;
unsigned int quantity;
float total=0, grand_total=0;

while(strcmp(meal_choice, "-1") != 0) {

printf("Please enter a meal order option and how many orders. Example: C0001 2 \n");
scanf("%s %d", meal_choice, &quantity);

if (meal_choice[0] == '-' && meal_choice[1] == '1') {
print_receipt();
order();
}
else if (meal_choice[0] == 'C' && meal_choice[1] == '0' && meal_choice[2] == '0' && meal_choice[3] == '0') {
fptr = fopen("receipt.txt", "a+"); //opens receipt txt file and appends
if(fptr == NULL) //check whether the file is empty or not
{
printf("File cannot be found\n");

}
else {
switch (meal_choice[4]) {
case '1': // assuming they chose set 1 with code C0001
price = combo1.price;
item = combo1.name;
tax = taxing(combo1.price, quantity);
total = (combo1.price * quantity) + tax;
grand_total += total;
sumtax += tax;
csum.combo_trans++;
sum.total = grand_total;
sum.tax = sumtax;

fprintf(fptr, "%-15d%-27s%-17.2f\n", quantity, combo1.name, combo1.price);
print_order(quantity, item, price, grand_total);

break;
case '2':
price = combo2.price;
item = combo2.name;
tax = taxing(combo2.price, quantity);
total = (combo2.price * quantity) + tax;
grand_total += total;
sumtax += tax;
csum.combo_trans++;
sum.total = grand_total;
sum.tax = sumtax;

fprintf(fptr, "%-15d%-27s%-17.2f\n", quantity, combo2.name, combo2.price);
print_order(quantity, item, price, grand_total);

break;
case '3':
price = combo3.price;
item = combo3.name;
tax = taxing(combo3.price, quantity);
total = (combo3.price * quantity) + tax;
grand_total += total;
sumtax += tax;
csum.combo_trans++;
sum.total = grand_total;
sum.tax = sumtax;

fprintf(fptr, "%-15d%-27s%-17.2f\n", quantity, combo3.name, combo3.price);
print_order(quantity, item, price, grand_total);


break;
case '4':
price = combo4.price;
item = combo4.name;
tax = taxing(combo4.price, quantity);
total = (combo4.price * quantity) + tax;
grand_total += total;
sumtax += tax;
csum.combo_trans++;
sum.total = grand_total;
sum.tax = sumtax;

fprintf(fptr, "%-15d%-27s%-17.2f\n", quantity, combo4.name, combo4.price);
print_order(quantity, item, price, grand_total);

break;
case '5':
price = combo5.price;
item = combo5.name;
tax = taxing(combo5.price, quantity);
total = (combo5.price * quantity) + tax;
grand_total += total;
sumtax += tax;
csum.combo_trans++;
sum.total = grand_total;
sum.tax = sumtax;

fprintf(fptr, "%-15d%-27s%-17.2f\n", quantity, combo5.name, combo5.price);
print_order(quantity, item, price, grand_total);

break;
default:
puts("Invalid meal option!");

}
fclose(fptr); //close the file
}
}
else if (meal_choice[0] == 'A' && meal_choice[1] == '0' && meal_choice[2] == '0' && meal_choice[3] == '0') {
fptr = fopen("receipt.txt", "a"); //opens txt file and READS only
if(fptr == NULL) //check whether the file is empty or not
{
printf("File cannot be found\n");

} else {
switch (meal_choice[4]) {
case '1': // assuming they chose set 1 with code C0001
price = addon1.price;
item = addon1.name;
tax = taxing(addon1.price, quantity);
total = (addon1.price * quantity) + tax;
grand_total += total;
sumtax += tax;
asum.ala_trans++;
sum.total = grand_total;
sum.tax = sumtax;

fprintf(fptr, "%d\t%s\t\t\t%.2f\n", quantity, addon1.name, addon1.price);
print_order(quantity, item, price, grand_total);

break;
case '2':
price = addon2.price;
item = addon2.name;
tax = taxing(addon2.price, quantity);
total = (addon2.price * quantity) + tax;
grand_total += total;
sumtax += tax;
asum.ala_trans++;
sum.total = grand_total;
sum.tax = sumtax;

fprintf(fptr, "%d\t%s\t\t\t%.2f\n", quantity, addon2.name, addon2.price);
print_order(quantity, item, price, grand_total);

break;
case '3':
price = addon3.price;
item = addon3.name;
tax = taxing(addon3.price, quantity);
total = (addon3.price * quantity) + tax;
grand_total += total;
sumtax += tax;
asum.ala_trans++;
sum.total = grand_total;
sum.tax = sumtax;

fprintf(fptr, "%d\t%s\t\t\t%.2f\n", quantity, addon3.name, addon3.price);
print_order(quantity, item, price, grand_total);


break;
case '4':
price = addon4.price;
item = addon4.name;
tax = taxing(addon4.price, quantity);
total = (addon4.price * quantity) + tax;
grand_total += total;
sumtax += tax;
asum.ala_trans++;
sum.total = grand_total;
sum.tax = sumtax;

fprintf(fptr, "%d\t%s\t\t\t%.2f\n", quantity, addon4.name, addon4.price);
print_order(quantity, item, price, grand_total);

break;
case '5':
price = addon5.price;
item = addon5.name;
tax = taxing(addon5.price, quantity);
total = (addon5.price * quantity) + tax;
grand_total += total;
sumtax += tax;
asum.ala_trans++;
sum.total = grand_total;
sum.tax = sumtax;

fprintf(fptr, "%d\t%s\t\t\t%.2f\n", quantity, addon5.name, addon5.price);
print_order(quantity, item, price, grand_total);

break;
default:
puts("Invalid meal option!");

}
fclose(fptr); //close the file
} //end else for file found
} //end else for menu option A or C
} //end of while loop

return 0;
}

最佳答案

所以这是我所能做的最好的重构,方法是将求和放在 switch 语句的末尾。是的,验证适用于不接受无效的膳食代码,例如 C0001、C0002、C0003、C0004、C0005、A0001、A0002、A0003、A0004、A0005(如果您想知道什么是膳食代码),但是如果用户输入是 float 的,它会导致一个我仍在研究的无限循环。我还添加了信息以退出循环,标记值为 -1。感谢大家的友好反馈。

int purchase_meal() {

FILE *fptr; //flie pointer for receipt text file
char meal_choice[5]; //user input meal code
char *item;
float price;
unsigned int quantity=0;
float total=0, grand_total=0;

while(strcmp(meal_choice, "-1") != 0) {
printf("Please enter a meal order option (-1 to exit). Example: C0001.\n");
scanf("%s", meal_choice);

if (meal_choice[0] == '-' && meal_choice[1] == '1') {
print_receipt();
order();
}
else if (strlen(meal_choice) == 5 && meal_choice[0] == 'C' && meal_choice[1] == '0' && meal_choice[2] == '0' && meal_choice[3] == '0'){
printf("Enter quantity of order. \n");
scanf("%d", &quantity);

fptr = fopen("receipt.txt", "a+"); //opens receipt txt file and appends
if(fptr == NULL) //check whether the file is empty or not
{
printf("File cannot be found\n");

}
else {
switch (meal_choice[4]) {
case '1': // assuming they chose set 1 with code C0001
price = combo1.price;
item = combo1.name;
total = combo1.price * quantity;
grand_total += total;
csum.combo_trans++;
fprintf(fptr, "%-15u%-27s%-17.2f\n", quantity, combo1.name, combo1.price);
print_order(quantity, item, price, grand_total);
break;
case '2':
price = combo2.price;
item = combo2.name;
total = combo2.price * quantity;
grand_total += total;
csum.combo_trans++;
fprintf(fptr, "%-15u%-27s%-17.2f\n", quantity, combo2.name, combo2.price);
print_order(quantity, item, price, grand_total);
break;
case '3':
price = combo3.price;
item = combo3.name;
total = combo3.price * quantity;
grand_total += total;
csum.combo_trans++;
fprintf(fptr, "%-15u%-27s%-17.2f\n", quantity, combo3.name, combo3.price);
print_order(quantity, item, price, grand_total);
break;
case '4':
price = combo4.price;
item = combo4.name;
total = combo4.price * quantity;
grand_total += total;
csum.combo_trans++;
fprintf(fptr, "%-15u%-27s%-17.2f\n", quantity, combo4.name, combo4.price);
print_order(quantity, item, price, grand_total);
break;
case '5':
price = combo5.price;
item = combo5.name;
total = combo5.price * quantity;
grand_total += total;
csum.combo_trans++;
fprintf(fptr, "%-15u%-27s%-17.2f\n", quantity, combo5.name, combo5.price);
print_order(quantity, item, price, grand_total);
break;
default:
total =0;
}
fclose(fptr); //close the file
}
}
else if (strlen(meal_choice) == 5 && meal_choice[0] == 'A' && meal_choice[1] == '0' && meal_choice[2] == '0' && meal_choice[3] == '0') {
printf("Enter quantity of order. \n");
scanf("%d", &quantity);

fptr = fopen("receipt.txt", "a"); //opens txt file and READS only
if(fptr == NULL) //check whether the file is empty or not
{
printf("File cannot be found\n");

} else {
switch (meal_choice[4]) {
case '1': // assuming they chose set 1 with code C0001
price = addon1.price;
item = addon1.name;
total = addon1.price * quantity;
asum.ala_trans++;
grand_total += total;
fprintf(fptr, "%d\t%s\t\t\t%.2f\n", quantity, addon1.name, addon1.price);
print_order(quantity, item, price, grand_total);
break;
case '2':
price = addon2.price;
item = addon2.name;
total = addon2.price * quantity;
asum.ala_trans++;
grand_total += total;
fprintf(fptr, "%d\t%s\t\t\t%.2f\n", quantity, addon2.name, addon2.price);
print_order(quantity, item, price, grand_total);
break;
case '3':
price = addon3.price;
item = addon3.name;
total = addon3.price * quantity;
asum.ala_trans++;
grand_total += total;
fprintf(fptr, "%d\t%s\t\t\t%.2f\n", quantity, addon3.name, addon3.price);
print_order(quantity, item, price, grand_total);
break;
case '4':
price = addon4.price;
item = addon4.name;
total = addon4.price * quantity;
asum.ala_trans++;
grand_total += total;
fprintf(fptr, "%d\t%s\t\t\t%.2f\n", quantity, addon4.name, addon4.price);
print_order(quantity, item, price, grand_total);
break;
case '5':
price = addon5.price;
item = addon5.name;
total = addon5.price * quantity;
asum.ala_trans++;
grand_total += total;
fprintf(fptr, "%d\t%s\t\t\t%.2f\n", quantity, addon5.name, addon5.price);
print_order(quantity, item, price, grand_total);
break;
default:
total =0;
}
fclose(fptr); //close the file
} //end else for file found
} else {
quantity = 0; //declare quantity 0 because to prevent dummy data
price = 0; //declare price of certain order 0 because to prevent added into total
total =0; //declare total in order 0 because to prevent added into grand total
printf("Invalid meal code. \n");
} //end else for menu option A or C
sum.total = grand_total;
sum.grand_total += total;
} //end of while loop
return 0;
}

关于c - 分解 C 中的代码块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46832169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com