我是计算机科学的新手,我目前正在大学读第一年。 今天遇到一个问题我有问题。 问题是:
编写程序以允许用户输入3种产品的销售代码和数量(使用不同的变量来存储这5种不同的产品代码)。您的计划需要计算每种产品的总金额(数量x单价)和所有销售产品的总计。
最后,您的程序将显示每种产品的产品代码,产品描述,单价和总金额,以及所有销售产品的总金额。使用下表中的信息作为参考:
PS:您需要使用许多变量,并且程序中会出现许多相同代码的冗余,这很好,因为这里不需要循环。
额外要求:
- 将价格设为2位小数
- 使用常量方法修复产品代码。
- 使用switch语句获取产品价格。
- 在总计中包含6%的税额计算。
醇>
这是我的答案,在编译代码时运行没有错误,但是当我尝试运行它时,它有问题:
运行时检查失败#3 - 正在使用变量'pro1'而未初始化。
我的回答代码:
#include <stdio.h>
int main()
{
float pro1, pro2, pro3, pro4, pro5;
float subtotal, Tax, total;
int unit;
char code;
int x, y, z, a, b;
printf("Enter the quantity of the product.\n");
scanf("%d", &unit);
printf("Enter the product code.(x=12345,y=56789,z=45678,a=13579,b=34567)\n");
scanf("%d", &code);
switch (code)
{
case 'x':
pro1 = unit*3.50;
break;
case 'y':
pro2 = unit*3.50;
break;
case 'z':
pro3 = unit*1.20;
break;
case 'a':
pro4 = unit*4.50;
break;
case 'b':
pro5 = unit*1.00;
break;
default:
printf("Invalid code.\n");
break;
}
printf("Enter the quantity of the product.\n");
scanf("%d", &unit);
printf("Enter the product code.(x=12345,y=56789,z=45678,a=13579,b=34567)\n");
scanf("%d", &code);
switch (code)
{
case 'x':
pro1 = unit*3.50;
break;
case 'y':
pro2 = unit*3.50;
break;
case 'z':
pro3 = unit*1.20;
break;
case 'a':
pro4 = unit*4.50;
break;
case 'b':
pro5 = unit*1.00;
break;
default:
printf("Invalid code.\n");
break;
}
printf("Enter the quantity of the product.\n");
scanf("%d", &unit);
printf("Enter the product code.(x=12345,y=56789,z=45678,a=13579,b=34567)\n");
scanf("%d", &code);
switch (code)
{
case 'x':
pro1 = unit*3.50;
break;
case 'y':
pro2 = unit*3.50;
break;
case 'z':
pro3 = unit*1.20;
break;
case 'a':
pro4 = unit*4.50;
break;
case 'b':
pro5 = unit*1.00;
break;
default:
printf("Invalid code.\n");
break;
}
printf("Enter the quantity of the product.\n");
scanf("%d", &unit);
printf("Enter the product code.(x=12345,y=56789,z=45678,a=13579,b=34567)\n");
scanf("%d", &code);
switch (code)
{
case 'x':
pro1 = unit*3.50;
break;
case 'y':
pro2 = unit*3.50;
break;
case 'z':
pro3 = unit*1.20;
break;
case 'a':
pro4 = unit*4.50;
break;
case 'b':
pro5 = unit*1.00;
break;
default:
printf("Invalid code.\n");
break;
}
printf("Enter the quantity of the product.\n");
scanf("%d", &unit);
printf("Enter the product code.(x=12345,y=56789,z=45678,a=13579,b=34567)\n");
scanf("%d", &code);
switch (code)
{
case 'x':
pro1 = unit*3.50;
break;
case 'y':
pro2 = unit*3.50;
break;
case 'z':
pro3 = unit*1.20;
break;
case 'a':
pro4 = unit*4.50;
break;
case 'b':
pro5 = unit*1.00;
break;
default:
printf("Invalid code.\n");
break;
}
printf("Artline 500A Black (Whiteboard Marker): %f", pro1);
printf("Artline 500A Red (Whiteboard Marker): %f", pro2);
printf("Pocket File (Yellow): %f", pro3);
printf("Pencil Casing: RM %f", pro4);
printf("A4 Exercise Book: %f", pro5);
subtotal = pro1 + pro2 + pro3 + pro4 + pro5;
Tax = subtotal*0.06;
total = subtotal + Tax;
printf("Subtotal : %f", subtotal);
printf("Tax : %f", Tax);
printf("Total : %f", total);
system("pause");
return 0;
}
到目前为止,我只学习了基本的I / O操作,if-else语句和switch case语句。
答案 0 :(得分:1)
想象一下,您的所有switch
语句都会通过default
个案,然后点击printf()
并pro
。
当然,未初始化的自动局部变量的写入前读取方案将导致应用程序中出现undefined behavior,因为您尝试阅读的值不确定。
建议:始终初始化本地变量。
答案 1 :(得分:1)
如果用户从未将pro1
作为代码,那么x
的值是多少?然后pro1
永远不会被分配一个值 - 当C lingo表示当控件到达时未初始化
subtotal = pro1 + pro2 + pro3 + pro4 + pro5;
如果意图对未使用的产品使用0,则应使用
初始化它们float pro1 = 0, pro2 = 0, pro3 = 0, pro4 = 0, pro5 = 0;
重要提示:
还有另一个错误char code;
scanf("%d", &code);
如果您使用code
格式进行扫描,则 int
必须为%d
。打开编译器的所有警告!此外,您必须使用
scanf
的返回
if (scanf("%d", &code) != 1) {
/* error: could not convert the input to a number. */
}
不检查来自scanf
的回报确实是令人惊讶的秘诀。
答案 2 :(得分:0)
初始化变量,
float pro1=0, pro2=0, pro3=0, pro4=0, pro5=0;
如果switch
语句落在default
语句中,则可能会使用这些变量而没有设置任何值。
答案 3 :(得分:0)
您的代码存在许多问题:
您违反DRY principle的方式实际上已被宣传。
您永远不会检查scanf()
的返回值,这可能会导致变量保持其先前的值或在您使用时未初始化。
您打印probN
变量的值,但可能会发生用户从未输入N
产品的代码。
您应该将它们初始化为0
,因为如果用户从未插入该值,则表示&#34; 无单位&#34;被卖了。
如果您使用switch
说明符输入x
,则"%d"
语句将永远不会有效,这4点的第二点将是问题是因为当您到达code
时switch
将被取消初始化,您应该使用"%c"
说明符,并检查scanf()
返回的值,以确保扫描了某些内容。
所以而不是
scanf("%d", &code);
你需要
if (scanf(" %c", &code) != 1)
wow_this_is_really_unexpected_but_I_am_glad_to_be_careful();
使用char *
说明符时传递"%d"
也是错误的,而且它实际上是一个严重的错误。