我编写了一个程序,允许我首先输入一个字符c,后跟一个整数n和n浮点值表示成绩。使用数组来存储我输入的等级,并且可以引入不超过100个等级。当我输入's'时,程序允许我计算数组中元素的总和,当我输入'p'时计算数组中元素的产生,并计算当我输入其他单词时元素s的平均值。在我输入成绩和角色之后。当我点击返回继续时,该程序没有响应。那么我的代码中的错误在哪里
#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'所有等级的乘积,如果引入了另一个字符,那么所有等级的算术平均值。 *使用开关 *您可以放心地认为输入有效。
答案 0 :(得分:2)
思考。
这是未定义的行为。您将读取整数和浮点数分配给那些不存在的数组中的偏移量为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
的值会很快增长(并且可能会溢出)。
切换语句对案例使用了突破。这意味着如果你的情况是's'
,它将运行switch语句中的所有代码,包括所有三种情况。如果您不想要这种行为,则应在每个案例结尾处放置break语句。
请返回您的图书/教师/互联网资源,阅读for循环的工作原理。这不符合你的想法。事实上,这是一个无限循环!
for (n=0; n=100; n++)
答案 1 :(得分:0)
无论你在这里尝试做什么,它根本就不对。
首先:声明2个100个元素的数组,然后分配该数组边界之外的值(100个元素数组从0开始,结束于99)
第二:你创建指向那些数组边界之外的2个指针。
第三:在开关内部,for (n=0;n=100;n++)
错误,应该是for(n = 0; n < 100; n++)
第四:这个
for (n=0;n=100;n++)
*a+=*a;
*b+=*b;
它会增加(如果for
是正确的)只有第一个语句。
正确的方法是
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;
}