计算C中的平均成绩
我写了一个程序,允许我首先输入一个字符c,然后输入一个整数n和代表等级的n浮点值。使用数组存储我输入的成绩,最多只能输入100个成绩。该程序允许我在输入's'时计算数组中元素的总和,在输入'p'时计算数组中元素的产量,在输入其他单词时计算元素s的平均值。在我输入成绩和性格之后。当我点击return继续时,程序没有响应。那么我的代码中的错误在哪里呢计算C中的平均成绩,c,C,我写了一个程序,允许我首先输入一个字符c,然后输入一个整数n和代表等级的n浮点值。使用数组存储我输入的成绩,最多只能输入100个成绩。该程序允许我在输入's'时计算数组中元素的总和,在输入'p'时计算数组中元素的产量,在输入其他单词时计算元素s的平均值。在我输入成绩和性格之后。当我点击return继续时,程序没有响应。那么我的代码中的错误在哪里呢 #include<stdio.h> #include<stdio.h> int main() { char c;
#include<stdio.h>
#include<stdio.h>
int main()
{
char c;
int integer_grade [100];
float floting_grade [100];
printf("Enter a grade");
scanf("%i,%f",&integer_grade[100],&floting_grade[100]);
int *a;
a=&integer_grade[100];
int *b;
b=&floting_grade[100];
printf("Enter a character");
getchar();
scanf("%c",&c);
int n;
switch(c)
{
case 's':
for (n=0;n=100;n++)
*a+=*a;
*b+=*b;
printf("Sum is %d",*a+*b);
case 'p':
for (n=0;n=100;n++)
*a*=*a;
*b*=*b;
printf("Sum is %d",*a**b);
default:
for (n=0;n=100;n++)
*a+=*a;
*b+=*b;
printf("average is %d",(*a+*b)/100);
}
return 0;
}
任务是:
编写一个程序,首先输入一个字符c,后跟一个整数n和代表等级的n浮点值。使用数组存储等级。您可以假设引入的等级不超过100个。您的程序应该计算并打印以下内容:如果c是“s”等级的总和,如果c是“p”所有等级的乘积,如果引入了另一个字符,则是所有等级的算术平均值。
*使用开关
*您可以放心地假设您的输入是有效的。想法
这是未定义的行为。您正在将读取整数和浮点赋值给这些数组中不存在的偏移量100
int integer_grade[100];
float floting_grade[100];
scanf("%i,%f", &integer_grade[100], &floting_grade[100]);
这些指针指向超出各自数组边界的内存
int *a = &integer_grade[100];
int *b = &floting_grade[100];
您要求输入一个字符,然后忽略该字符的值:
getchar();
然后,通过获取以下角色来跟进。这很奇怪。但是你确实使用了正确的类型,而不是什么。所以这是一场胜利
scanf("%c",&c);
这些for循环中的缩进意味着您认为这两条语句都将作为循环的一部分进行迭代。那是不对的。使用{…}完成以下操作:
for (n=0;n=100;n++)
*a+=*a;
*b+=*b;
我不知道你认为你通过*a+=*a完成了什么。我知道*a的值将快速增长,并且可能会溢出
Switch语句在案例中使用fallthrough。这意味着,如果您的case是“s”,它将运行switch语句中的所有代码,包括所有三种情况。如果不希望出现这种行为,则应在每个案例的结尾处放置break语句
请回到您的书/教员/互联网资源,阅读for循环是如何工作的。这并不像你想象的那样。事实上,这是一个无限循环
for (n=0; n=100; n++)
不管你想在这里做什么,都是不对的 首先:声明两个包含100个元素的数组,然后在数组边界之外赋值100个元素数组从0开始,在99结束 第二:创建两个指向这些数组边界之外的指针 第三:在开关内部,n=0的值;n=100;n++是错误的,它应该类似于forn=0;n<100;n++ 第四:这个
for (n=0;n=100;n++)
*a+=*a;
*b+=*b;
如果只有第一个语句正确,则它将递增。
正确的方法是
for (n = 0; n < 100; n++)
{
*a += *a;
*b += *b;
}
正确的代码是
#include <stdio.h>
int main()
{
char c;
int integer_grade[100];
float floting_grade[100];
int nr_of_grades;
int i = 0;
printf("Enter number of grades: ");
scanf("%d", &nr_of_grades);
for(i = 0; i < nr_of_grades; i++)
{
printf("Enter a int grade: ");
scanf("%d", &integer_grade[i]);
printf("Enter a float grade: ");
scanf("%f", &floting_grade[i]);
}
int operation_i = 0;
float operation_f = 0;
printf("Enter a character");
scanf(" %c", &c);
int n;
switch(c)
{
case 's':
for (n = 0; n < nr_of_grades; n++)
{
operation_i += integer_grade[n];
operation_f += floting_grade[n];
}
printf("Sums are Int: %d Float: %f", operation_i, operation_f);
case 'p':
operation_i = 1;
operation_f = 1;
for (n = 0; n < nr_of_grades; n++)
{
operation_i *= integer_grade[n];
operation_f *= floting_grade[n];
}
printf("Products are Int: %d Float: %f", operation_i, operation_f);
default:
for (n = 0; n < nr_of_grades; n++)
{
operation_i += integer_grade[n];
operation_f += floting_grade[n];
}
printf("Average is Int: %d Float: %f", operation_i / nr_of_grades, operation_f / nr_of_grades);
}
return 0;
}
请注意,它是浮动的而不是浮动的,你可能会失分。C!=C++。如果你正在学习C,除非你要求比较,否则不要交叉标记C++。不同语言的本地解决方案可能会非常不同。删除C++标签,这也是C.,为什么指针?你只在一级,一个索引100,这是一个无效的索引,所以你的程序是未定义的。我建议重读你书中介绍数组的部分。在你的循环周围一定要用大括号。而且for循环的中断条件是中断的,不是有意的双关语。它们将永远运行,因为n=100总是正确的。循环条件是一个赋值。我相信getchar的意思是从上一个输入中跳过换行符。但最好编写scanf%c和c.5。是错误的,它会使每次迭代的值加倍,因此结果将是*a*=1@mch:其中一个用乘法,一个用加法。我说的是添加版本。但不管怎样,for循环都不会迭代100次。它迭代inf次。我也是。加法版本将每次迭代加倍,因此它将在从1开始的第31次迭代中溢出。乘法版本在每次迭代中将其值平方,并在从2开始的第5次迭代时溢出*a*=100;如果附加值不增加的话,我会的,但这里不是这样。谢谢你的帮助。这就是我想要得到的结果。我想我可能不太明白这个问题。@UniCell也许你应该因为做作业而得到分数。@vlad_tepesch是的,我知道,那是我的错。我这么做只是因为在看到他写的恐怖之后,我不敢相信他会做一些正确的事情。我同情他,我接受我的错误。