gpt4 book ai didi

c - 如何优化此代码并将正在读取的数据排序到数组中?

转载 作者:行者123 更新时间:2023-11-30 21:24:57 27 4
gpt4 key购买 nike

我想编写一个C程序来读取一个数组,计算所有单个条目的总和,平均值,最小等级,最大等级,并打印所有这些值。这是一种有效的分类方法吗?我试图按输入时的最大值和最小值对数据值进行排序。我的编译器还将所有float值都引发声明错误。

#include <stdio.h>
#include <stdlib.h>
#include <float.h>
float main()

int i;
float grades[10];
float grade;
float sum;
float avg;
float count;
float max;
float min;

{
max =0;
min=0;

printf("Enter your grades (Type <0 and >100 to quit): ");
scanf("%f", &grade);

sum=0;
i=0;
while(grades>0 && i<10)
{grades[i]= grade;
i++;
if(i<10)
{printf("Enter grade, (Type <0 or >100 to quit): ");
scanf("%f", &grade); }}
for (i=0; i < 10; i++)
{if (grades[i] > max)
{
max=grades[i];
}
else if (grades[i] < min)
{
min = grades[i];
}}

count=i;
for(i=0; i<count; i++)
{printf("Grade %d is %f \n", i+1, grades[i]);}
grade=0;
for(i=0;i<count; i++)
{sum= sum + grades[i];}
if(count>0)
{avg=sum/count;}
else
{avg=0;}
printf("The average of the %f grades is %f \n",count, avg);
printf("The Minimum Grade is %f",min);
printf("The Maximum Grade is %f", max);
printf("Count is %f ", count);
printf("Sum is %f", sum);
printf("Average is %f", avg);
}

最佳答案

解决您的问题的最严格的代码是

#include <stdio.h>
#include <stdlib.h>
#include <float.h>

#define GRADE_ARRAY_LEN 10

int main()
{
int i = 0;
double grades[GRADE_ARRAY_LEN];
double grade;
double max;
double min;

while(i<GRADE_ARRAY_LEN)
{
printf("Enter grade, (Type <0 or >100 to quit): ");
if(scanf("%lf", &grade) != 1)
{
printf("The value entered could not be converted to double. Please enter another value.\n");
scanf("%s");
continue;
}
if(grade < 0.0 || grade > 100.0)
{
return 1;
}
else
{
if(i == 0)
{
max = grade;
min = grade;
}
else
{
if(grade > max)
{
max = grade;
}
if(grade < min)
{
min = grade;
}
}
grades[i]= grade;
i++;
}
}

double sum = 0;
for(i=0; i<GRADE_ARRAY_LEN; i++)
{
printf("Grade %d is %lg \n", i+1, grades[i]);
sum+=grades[i];
}

double avg = sum/GRADE_ARRAY_LEN;

printf("The average of the %d grades is %g \n", GRADE_ARRAY_LEN, avg);
printf("The Minimum Grade is %lg\n",min);
printf("The Maximum Grade is %lg\n", max);
printf("Number of grades is %d\n", GRADE_ARRAY_LEN);
printf("Sum is %lg\n", sum);
printf("Average is %lg\n", avg);
return 0;
}


我可能错过了一些东西,但是我检查了一下,它可以工作。
-工作原理有点长。

首先,要输入的成绩数量是固定的,并在 #define GRADE_ARRAY_LEN 10中定义,可以轻松更改要输入的成绩数量。

然后,程序读取输入并检查输入是否为double或可以转换为double。此检查是简单的 if(scanf("%lf", &grade) != 1)scanf()返回成功填充的参数数目,格式“%lf”表示您希望将输入参数填充为双精度。因此,如果输入的值可以转换为double值,则 scanf("%lf", &grade)将仅返回等于1的值。

现在,如果输入不是双倍或双倍或可以转换为双倍,程序会询问您输入双倍还是可以转换为双倍的输入。强制需要 scanf("%s");,因为当 scanf("%lf", &grade)失败时,输入流中会保留一个换行符,您必须实际读取。如果不这样做,那么下一个 scanf("%lf", &grade)实际上将其作为输入,然后再次失败,从而创建一个无限循环。

成功填写输入后,这意味着您具有等级价值。该程序检查输入的值,如果该值小于0或大于100则退出。我这样做是因为printf实际上输出,如果该值小于0或大于100则程序将退出。

如果等级的值在0到100之间,则程序将检查它是否是使用此 if(i == 0)扫描的第一个值。其中,i是成功扫描的值的数量。如果i == 0则还没有扫描任何值,因此必须使用此值初始化max和min,才能使max和min正常工作,因为必须对照第一个值检查所有其他值。如果i!= 0,则针对最大最小值检查该值,并在需要时对其进行修改。

在检查了最小值和最大值之后,将值最终添加到我们的值数组中,并且成功扫描的值的数量增加了。

i++;grades[i]= grade;
i++;


注意!!!:以上所有操作都在一个单独的循环 while(i<GRADE_ARRAY_LEN)中提交。这样可以确保您输入正确的值量并获得正确的最大值和最小值。您实际上并不需要额外的循环来获取正确的最小值和最大值。

循环后,对成绩的 sum进行计数。此后,计算成绩的 avg

注意!!!:您无需在此处进行任何检查,因为循环可确保您输入正确数量的要素。

最后,结果将打印到命令行。

我将尝试指出我编辑的主要部分。

首先:变量声明必须在 main()的内部,并且main必须返回一个int,这意味着您的代码具有以下内容:

float main()

int i;
float grades[10];
float grade;
float sum;
float avg;
float count;
float max;
float min;

{


但一定是这样

int main()
{
int i = 0;
double grades[GRADE_ARRAY_LEN];
double grade;
double max;
double min;


第二:您的代码未检查 scanf("%lf", &grade)是否成功填充 grade。这是错误的,因为您实际上可以在命令行中输入字符和数字的任何组合,但是唯一正确的输入是当您输入数字时,可以将其转换为双精度。这意味着您必须检查scanf返回什么。

第三: max = 0; and min = 0;不是初始化最大值和最小值的正确方法。 min=0;是错误的,因为在仅正分数的情况下,分数永远不会小于min,因此min始终为0。正确的方法是使用从输入中第一个正确读取的分数来初始化min值,因此如果存在如果输入较小的值,则可以根据需要更改最小值。 max=0;是不正确的,因为在仅负分数的情况下,分数永远不会大于max,因此max始终为0。正确的方法是使用从输入中第一个正确读取的分数初始化max值,因此如果存在如果输入一个较大的值,则可以根据需要更改最大值。

第三:正如我上面所说,您实际上不需要单独的循环来查找最大值和最小值。可以在读取数据的循环内部完成。它并不是真正的必需品,但是在一个循环内做所有您想做的事情都是一种好习惯。

第四:优良作法是使用 #define在主函数之前定义固定长度的数组的长度。 Quote:“ #define创建一个宏,该宏是标识符或参数化标识符与令牌字符串的关联。定义宏后,编译器可以用令牌字符串替换源文件中每次出现的标识符。” 。基本上,这意味着您在主代码之前添加 #define GRADE_ARRAY_LEN 10,如上面的代码所示,然后使用10作为迭代次数和数组元素(如 double grades[10]; while(i<10); for(i=0;i<10;i++))的数量
您实际上使用了 double grades[GRADE_ARRAY_LEN]; while(i<GRADE_ARRAY_LEN); for(i=0;i<GRADE_ARRAY_LEN;i++)。编译器会自动将GRADE_ARRAY_LEN替换为10;这样,您就可以仅在一个位置上将任意其他数字更改为10(当然是正数),而不必在多个位置进行更改。

第五: printf("Enter grade, (Type <0 or >100 to quit): ")输出,如果您键入值<0或> 100,则程序应退出。考虑到根本没有检查输入值,因此不会发生这种情况。

第六:while(grades> 0 && i <10)是错误的,因为grades是一个数组,您不能将数组与单个数字进行比较。

现在继续我实际上对代码进行的工作:

1)移动了var声明并更改了main的返回值

2)进行了 scanf("%lf", &grade)是否成功填满等级的检查。

3)如果输入<0或> 100 ;,则退出程序。这意味着,如果您输入一个小于0且大于100的数字,则该程序实际上将退出

4)实现了 #define GRADE_ARRAY_LEN 10用作长度数组的长度

5)重新制作循环,使其要求输入正确的输入数据GRADE_ARRAY_LEN次。现在,除非您正确输入正确的输入数据GRADE_ARRAY_LEN次,否则该程序将不会继续。

6)将对 minmax值的查找移动到while循环中。如上所述,您实际上并不需要单独的循环来查找它们。还修改了最小值和最大值的初始化

7)由于上述更改,最终做了一些更改。

7.1)改变了 sum的计数方式
是:

 for(i=0;i<count; i++)
{sum= sum + grades[i];}


现在:

double sum = 0;
for(i=0; i<GRADE_ARRAY_LEN; i++)
{
printf("Grade %d is %lg \n", i+1, grades[i]);
sum+=grades[i];
}


7.2)在计算 avg时删除了不必要的检查
是:

if(count>0)
{avg=sum/count;}
else
{avg=0;}


现在:

double avg = sum/GRADE_ARRAY_LEN;


8)将所有浮点值更改为两倍。 float为var分配的字节数实际上取决于系统体系结构,其中double实际上是Quote:“ IEEE 754双精度二进制浮点格式:binary64”。

9)由于上述更改,输入数据的格式从%f更改为%lf,输出数据的格式从%f更改为%lg。现在两者都可以加倍使用。

关于c - 如何优化此代码并将正在读取的数据排序到数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33885968/

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