C 我编写的程序显示了移动公司收入百分比的差异
我写了一个程序,但它是不完整的,显示了移动公司收入百分比的差异。 我应该使用数组平均值来保存过去3年的销售收入。 示例输出在移动公司收入百分比下面给出C 我编写的程序显示了移动公司收入百分比的差异,c,C,我写了一个程序,但它是不完整的,显示了移动公司收入百分比的差异。 我应该使用数组平均值来保存过去3年的销售收入。 示例输出在移动公司收入百分比下面给出 输入2017年收入:100000 输入2018年的收入:250000 输入2018年收入:150000 输入2018年收入:150000 年份%备注 2018年增加150 减少40-2019年 不更改“0,0 2020” #包括 int main(){ printf(“--------------------------------------
输入2017年收入:100000
输入2018年的收入:250000
输入2018年收入:150000
输入2018年收入:150000
年份%备注
2018年增加150
减少40-2019年
不更改“0,0 2020”
#包括
int main(){
printf(“--------------------------------------------------------------\n”);
printf(“移动公司收入百分比”);
printf(“--------------------------------------------------------------\n”);
int i;
浮动收入[4],总和=0.0,平均值;
浮动版本1、版本2、版本3、版本4;
printf(“输入2017年收入:”);
scanf(“%f”和rev1);
printf(“输入2018年收入:”);
scanf(“%f”和rev2);
printf(“输入2018年收入:”);
scanf(“%f”和rev3);
printf(“输入2018年收入:”);
scanf(“%f”和第4版);
对于(i=0;i<5;++i){
总和+=收入[i];
}
平均值=总额/规模(收入);
printf(“平均值=%.2f”,平均值);
返回0;
}
很明显,您遇到了一些问题。如上所述,在我的评论中,您遇到了许多问题并调用了未定义的行为,试图使用具有自动存储持续时间的数组值。这些值是不确定的(未初始化)。问题是由于您在代码中使用了幻数。这会导致循环限制偏离1(太多)
为了避免使用幻数,请计算您需要的内容并将值分配给变量。例如,您需要计算Revenue
中的元素数。这可以通过将数组大小除以第一个元素的大小来确定
int nelem = sizeof Revenue/sizeof *Revenue;
(注意:正确的类型应该是size\u t
,但C也允许返回int
)
设置元素数后,您可以循环适当的次数,并使用适当的除数计算平均值,例如
for (i = 0; i < nelem; i++)
sum += Revenue[i];
avg = sum / nelem;
printf ("\nAverage = %.2f\n", avg);
请注意,函数将持续循环,直到用户提供有效的浮点值
或取消输入。这就是您处理每个用户输入的方式。如果不处理该错误并确保您获得程序所需的输入,请不要允许用户提供输入
在上面的getfloat()
中调用的empty\u stdin()
helper函数只需丢弃stdin
中的任何无关字符,直到下一个'\n'
或EOF
中的任何字符,以先发生的为准。这样,如果用户输入类似“大量金钱”的内容“
而不是有效的金额,在下次尝试输入之前从stdin
中删除。只需要:
/* simple helper to clear stdin */
void empty_stdin (void)
{
int c = getchar();
while (c != '\n' && c != EOF)
c = getchar();
}
现在,您的main()
函数简化为一段可读代码,完成获取四个float
值并计算平均值,例如
int main (void) {
float Revenue[4] = {0}, sum = 0.0, avg = 0;
int i, nelem = sizeof Revenue/sizeof *Revenue;
puts ("--------------------------------------------------\n"
"Mobile Company Revenue Percentage\n"
"--------------------------------------------------\n ");
Revenue[0] = getfloat ("Enter Revenue for 2017: ");
Revenue[1] = getfloat ("Enter Revenue for 2018: ");
Revenue[2] = getfloat ("Enter Revenue for 2019: ");
Revenue[3] = getfloat ("Enter Revenue for 2020: ");
for (i = 0; i < nelem; i++)
sum += Revenue[i];
avg = sum / nelem;
printf ("\nAverage = %.2f\n", avg);
}
如果用户提供错误输入,程序将不接受,例如:
$ ./bin/mobileco
--------------------------------------------------
Mobile Company Revenue Percentage
--------------------------------------------------
Enter Revenue for 2017: A whole lot of $Money$ :)
error: invalid float input.
Enter Revenue for 2017: 100
Enter Revenue for 2018: 200
Enter Revenue for 2019: three-hundred
error: invalid float input.
Enter Revenue for 2019: 300
Enter Revenue for 2020: 400
Average = 250.00
计算各年收入的百分比变化 作为对以下评论的回应,您可以使用百分比变化公式计算平均收入的增加百分比或减少百分比。要计算该值,您需要一个
原始值
和新值。在计算平均值的变化时,您的原始值是平均值,新值是当年的收入。如果收入超过平均水平,则需要应用百分比增加公式;如果收入低于平均水平,则需要应用百分比减少公式
增加百分比和减少百分比的公式为:
及
您只需创建一个百分比变化函数,检查原始值
和新值
并应用正确的公式并返回该值。例如:
/* percent change between new_value and orig_value */
float percentchg (const float new_value, const float orig_value)
{
if (new_value < orig_value)
return (orig_value - new_value) / orig_value * 100.;
return (new_value - orig_value) / orig_value * 100.;
}
(注意:三元数用于确定是否输出“减少”
或“增加”
,作为输出的一部分。三元数只是if(condition){if_true}else{if_false}
的缩写,其语法为:
condition ? if_true : if_false
您可以看到它作为参数包含在printf()
函数中,该函数向%s”
格式说明符提供输入)
新示例输出
$ ./bin/mobileco
--------------------------------------------------
Mobile Company Revenue Percentage
--------------------------------------------------
Enter Revenue for 2017: 100
Enter Revenue for 2018: 200
Enter Revenue for 2019: 300
Enter Revenue for 2020: 400
Average = 250.00
$ ./bin/mobileco
--------------------------------------------------
Mobile Company Revenue Percentage
--------------------------------------------------
Enter Revenue for 2017: 100
Enter Revenue for 2018: 200
Enter Revenue for 2019: 300
Enter Revenue for 2020: 400
Average = 250.00
year 1 revenue: 60.00% (decrease) from average
year 2 revenue: 20.00% (decrease) from average
year 3 revenue: 20.00% (increase) from average
year 4 revenue: 60.00% (increase) from average
完整代码
如果您希望在更新后看到Competite代码,即:
#include <stdio.h>
#include <stdlib.h>
/* simple helper to clear stdin */
void empty_stdin (void)
{
int c = getchar();
while (c != '\n' && c != EOF)
c = getchar();
}
/* display prompt and return float (exit on manual EOF) */
float getfloat (const char *prompt)
{
float f = 0;
while (1) { /* loop continually until valid float provided by user */
if (prompt) /* prompt if not NULL */
fputs (prompt, stdout);
int rtn = scanf ("%f", &f); /* read float, save return */
if (rtn == EOF) { /* check for manual EOF */
puts ("(user canceled input)");
exit (EXIT_SUCCESS);
}
empty_stdin(); /* empty to end of line */
if (rtn == 1) /* if good input, break loop */
break;
fputs (" error: invalid float input.\n", stderr); /* handle error */
}
return f; /* return float value */
}
/* percent change between new_value and orig_value */
float percentchg (const float new_value, const float orig_value)
{
if (new_value < orig_value)
return (orig_value - new_value) / orig_value * 100.;
return (new_value - orig_value) / orig_value * 100.;
}
int main (void) {
float Revenue[4] = {0}, sum = 0.0, avg = 0;
int i, nelem = sizeof Revenue/sizeof *Revenue;
puts ("--------------------------------------------------\n"
"Mobile Company Revenue Percentage\n"
"--------------------------------------------------\n ");
Revenue[0] = getfloat ("Enter Revenue for 2017: ");
Revenue[1] = getfloat ("Enter Revenue for 2018: ");
Revenue[2] = getfloat ("Enter Revenue for 2019: ");
Revenue[3] = getfloat ("Enter Revenue for 2020: ");
for (i = 0; i < nelem; i++)
sum += Revenue[i];
avg = sum / nelem;
printf ("\nAverage = %.2f\n\n", avg);
for (i = 0; i < nelem; i++)
printf ("year %d revenue: %.2f%% (%s) from average\n", i + 1,
percentchg (Revenue[i], avg),
Revenue[i] < avg ? "decrease" : "increase");
}
#包括
#包括
/*清除stdin的简单助手*/
void empty\u stdin(void)
{
int c=getchar();
而(c!='\n'&&c!=EOF)
c=getchar();
}
/*显示提示和返回浮动(手动EOF时退出)*/
float getfloat(常量字符*提示符)
{
浮点数f=0;
而(1){/*则持续循环,直到用户提供有效的浮点*/
如果(提示)/*如果不为空则提示*/
FPUT(提示、标准输出);
int rtn=scanf(“%f”,&f);/*读取浮点,保存返回*/
如果(rtn==EOF){/*检查手动EOF*/
puts(“(用户取消输入)”);
退出(退出成功);
}
空的_stdin();/*空到行尾*/
如果(rtn==1)/*如果输入良好,则断开循环*/
打破
fputs(“错误:无效的浮点输入。\n”,stderr);/*句柄错误*/
}
返回f;/*返回浮点值*/
}
/*新值和原始值之间的百分比变化*/
浮动百分比CHG(常量浮动新值、常量浮动原始值)
{
if(新值<原始值)
返回值(原始值-新值)/原始值*100。;
返回值(新值-原始值)/原始值*100。;
}
内部主(空){
/* percent change between new_value and orig_value */
float percentchg (const float new_value, const float orig_value)
{
if (new_value < orig_value)
return (orig_value - new_value) / orig_value * 100.;
return (new_value - orig_value) / orig_value * 100.;
}
...
printf ("\nAverage = %.2f\n\n", avg);
for (i = 0; i < nelem; i++)
printf ("year %d revenue: %.2f%% (%s) from average\n", i + 1,
percentchg (Revenue[i], avg),
Revenue[i] < avg ? "decrease" : "increase");
condition ? if_true : if_false
$ ./bin/mobileco
--------------------------------------------------
Mobile Company Revenue Percentage
--------------------------------------------------
Enter Revenue for 2017: 100
Enter Revenue for 2018: 200
Enter Revenue for 2019: 300
Enter Revenue for 2020: 400
Average = 250.00
year 1 revenue: 60.00% (decrease) from average
year 2 revenue: 20.00% (decrease) from average
year 3 revenue: 20.00% (increase) from average
year 4 revenue: 60.00% (increase) from average
#include <stdio.h>
#include <stdlib.h>
/* simple helper to clear stdin */
void empty_stdin (void)
{
int c = getchar();
while (c != '\n' && c != EOF)
c = getchar();
}
/* display prompt and return float (exit on manual EOF) */
float getfloat (const char *prompt)
{
float f = 0;
while (1) { /* loop continually until valid float provided by user */
if (prompt) /* prompt if not NULL */
fputs (prompt, stdout);
int rtn = scanf ("%f", &f); /* read float, save return */
if (rtn == EOF) { /* check for manual EOF */
puts ("(user canceled input)");
exit (EXIT_SUCCESS);
}
empty_stdin(); /* empty to end of line */
if (rtn == 1) /* if good input, break loop */
break;
fputs (" error: invalid float input.\n", stderr); /* handle error */
}
return f; /* return float value */
}
/* percent change between new_value and orig_value */
float percentchg (const float new_value, const float orig_value)
{
if (new_value < orig_value)
return (orig_value - new_value) / orig_value * 100.;
return (new_value - orig_value) / orig_value * 100.;
}
int main (void) {
float Revenue[4] = {0}, sum = 0.0, avg = 0;
int i, nelem = sizeof Revenue/sizeof *Revenue;
puts ("--------------------------------------------------\n"
"Mobile Company Revenue Percentage\n"
"--------------------------------------------------\n ");
Revenue[0] = getfloat ("Enter Revenue for 2017: ");
Revenue[1] = getfloat ("Enter Revenue for 2018: ");
Revenue[2] = getfloat ("Enter Revenue for 2019: ");
Revenue[3] = getfloat ("Enter Revenue for 2020: ");
for (i = 0; i < nelem; i++)
sum += Revenue[i];
avg = sum / nelem;
printf ("\nAverage = %.2f\n\n", avg);
for (i = 0; i < nelem; i++)
printf ("year %d revenue: %.2f%% (%s) from average\n", i + 1,
percentchg (Revenue[i], avg),
Revenue[i] < avg ? "decrease" : "increase");
}