Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我编写的程序显示了移动公司收入百分比的差异_C - Fatal编程技术网

C 我编写的程序显示了移动公司收入百分比的差异

C 我编写的程序显示了移动公司收入百分比的差异,c,C,我写了一个程序,但它是不完整的,显示了移动公司收入百分比的差异。 我应该使用数组平均值来保存过去3年的销售收入。 示例输出在移动公司收入百分比下面给出 输入2017年收入:100000 输入2018年的收入:250000 输入2018年收入:150000 输入2018年收入:150000 年份%备注 2018年增加150 减少40-2019年 不更改“0,0 2020” #包括 int main(){ printf(“--------------------------------------

我写了一个程序,但它是不完整的,显示了移动公司收入百分比的差异。 我应该使用数组平均值来保存过去3年的销售收入。 示例输出在移动公司收入百分比下面给出

输入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");
}