C语言!!!

C语言!!!编程第11题,我这里是哪里错了,比如输入ABCD应该是(4+3+2+1)/4=2.5的啊,小写字母转换成大写字母那里哪里错了,怎么换不了?... C语言!!!编程第11题,我这里是哪里错了,比如输入A B C D应该是(4+3+2+1)/4=2.5的啊,小写字母转换成大写字母那里哪里错了,怎么换不了? 展开
 我来答
沧海雄风2009
2018-03-25 · TA获得超过1.1万个赞
知道大有可为答主
回答量:8525
采纳率:79%
帮助的人:2828万
展开全部

错误很多啊 小伙子

#include <stdio.h>
#include <ctype.h>
#include <malloc.h>
#include <memory.h>

float comptuer_GPA(int n,char grades[])
{
int i;
float num =0.0;
for (i=0;i<n;i++)
{
switch(grades[i])
{
case 'A':num+=4;break;
case 'B':num+=3;break;
case 'C':num+=2;break;
case 'D':num+=1;break;
case 'F':num+=0;break;
default: num+=0;break;
}
}
return num/n;
}

int main(void)
{
int n,i;
float average;
char *grades=NULL;


printf("Please Enter the length of array:");
scanf("%d",&n);

grades = (char*)malloc(sizeof(char)*n); //这里只能用动态数组 你那个 char grades[n]在VC6根本编译都过不了

for (i=0;i<n;i++)
{
fflush(stdin);     //吸收过滤掉回车 第一次是过滤掉输入长度4的 第二次是过滤掉A的 第三次是过滤掉B的 以此类推
scanf("%c",&grades[i]);
grades[i] = toupper(grades[i]);  //在这里转 toupper不能直接转一个数组,只能一个字符一个字符转
}

average = comptuer_GPA(n,grades);

printf("average = %3.2f\n",average);

return 0;
}
更多追问追答
追问
大佬我只刚学完函数,指针还没开始学,你这代码看不懂啊
追答
这种不定长度数组 char graddes[n]不行的 除非malloc一个动态数组
当然 用链表也行 不过链表就比动态数组复杂多了
在菩萨山写故事的林雕
2018-03-25 · TA获得超过939个赞
知道小有建树答主
回答量:362
采纳率:79%
帮助的人:106万
展开全部

“沧海雄风2009 ”的回答是正确的。

我在这里给出一个更简单的代码(不需要提前输入数组长度,想算多少输多少,但不符合题目要求),抛砖引玉吧

#include<stdio.h>
#include<ctype.h>
//将a转化为对应的GPA,例如a转换为4,b转换为3... 
#define gpa(a) ('E'-toupper(a)>0)?('E'-toupper(a)):0;
int main(void)
{
    char c;
    float grade=0.0;
    int count=0;
    while(scanf("%c",&c))
    {
        if(c=='\n')break;//遇到回车符结束计算 
        else if(isspace(c))continue; //忽视输入的空格 
        grade+=gpa(c)
        count++;
    }
    if(count==0)return 1;
    printf("Average = %3.2f\n",grade/count);
    return 1;
}

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
大兔君永不言弃
2018-03-25 · TA获得超过1万个赞
知道小有建树答主
回答量:1736
采纳率:51%
帮助的人:276万
展开全部
你的1.75 是 (4+3)/4 的结果,只输入正确了a和b. 我不太同意1楼的说法,占位置的应该不是空格,而是你的回车键,这是c语言里面一个经典错误,因为在你的情况下scanf只会把第一个字符记录,而回车键会残留在buffer里面,而且你的读取键盘是连续的,所以下一次读取会读取回车键,应该是这个原因,只需要在你的scanf后面加一行getchar();来清空buffer就行了,或者根本就不用scanf,直接用getchar来获取字符。
更多追问追答
追问
大神不行啊,后来加getchar();,直接不管怎么输入答案都是0.00
不是在后面,是在scanf前面加了一个getchar(),已经好了,
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
White_MouseYBZ
2018-03-25 · TA获得超过4万个赞
知道大有可为答主
回答量:2.1万
采纳率:82%
帮助的人:6587万
展开全部
  1. 输入时字母间不要留空格。

  2. 把grades[i]=toupper(grades[i]);前的}移到这一句之后。

  3. 还有什么问题续问。

更多追问追答
追问
嗯,输入的时候没留空格了,输入4个字母abcd!答案还是错了,答案这回是2.25了,正确答案是10/4=2.5
已经好了,感谢大佬
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友c1a1b1d11
2018-03-25 · TA获得超过1001个赞
知道小有建树答主
回答量:2657
采纳率:22%
帮助的人:552万
展开全部
输入 a b c d 空格占字符了 应该是这样。
更多追问追答
追问
我也觉得,但没道理,这些不是编译器规定的吗?嗯,我再写个程序测试下
追答
什么叫没道理。 你这是往数组里输入 。空格直接占用了啊。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式