C语言求解!!

假定有一组学生成绩,要求写一个程序读入这些成绩,然后输出不及格的成绩,再输出及格的成绩,最后输出不及格和及格的人数统计。假设成绩不超过200个... 假定有一组学生成绩,要求写一个程序读入这些成绩,然后输出不及格的成绩,再输出及格的成绩,最后输出不及格和及格的人数统计。假设成绩不超过200个 展开
 我来答
自我编程
2018-06-07 · 科技优质答主
自我编程
采纳数:1481 获赞数:4282

向TA提问 私信TA
展开全部

学生名字我懒得起,都用“学生名”代替。

学生成绩信息,我放在txt文件中,从文件中读取生成链表,再统计。

txt格式如下:学生名字 空格 学生成绩

#include <stdio.h>
#include <malloc.h>
#include <string.h>
typedef struct stus
{
    char name[10];
    int score;
    int num;//统计总节点数,只在头节点中成员保存该值
    struct stus *next;
}STUS;
#define pass 60//及格分
STUS *readFile(FILE *fp);//读取文件,生成链表,返回链表头节点
int findUnpass(STUS *stuHead);//找到不及格,返回不及格人数
int main()
{
    int unPassCnt;
    FILE *fp;
    STUS *stuHead=NULL;
    fp=fopen("c:\\list.txt","rt+");
    if(fp==NULL)
    {
        printf("Cannot open file strike any key exit!");
        return 1;
    }
    stuHead=readFile(fp);
    unPassCnt=findUnpass(stuHead);
    printf("总人数:%d,不及格人数:%d,及格人数:%d\n",stuHead->num,unPassCnt,stuHead->num-unPassCnt);
    return 0;
}
int findUnpass(STUS *stuHead)
{
    int unPassCnt=0;
    printf("不及格的学生有:\n");
    while(stuHead->next!=NULL)
    {
        if(stuHead->next->score<pass)
        {
            unPassCnt++;
            printf("%s  %d\n",stuHead->next->name,stuHead->next->score);
        }
        stuHead=stuHead->next;
    }
    return unPassCnt;
}
STUS *readFile(FILE *fp)
{
    char name[10];
    int score;
    STUS *stusNew=NULL,*stuHead=NULL,*stuTail=NULL;
    stuHead=(STUS *)malloc(sizeof(STUS));
    stuHead->num=0;
    stuHead->next=NULL;
    while(fscanf(fp,"%s%d",name,&score)!=-1)
    {
        (stuHead->num)++;
        stusNew=(STUS *)malloc(sizeof(STUS));
        strcpy(stusNew->name,name);
        stusNew->score=score;
        stusNew->next=NULL;
        if(stuHead->next==NULL)
            stuHead->next=stusNew;
        else
            stuTail->next=stusNew;
        stuTail=stusNew;
    }
    return stuHead;
}
fallx
2018-06-07 · TA获得超过5485个赞
知道大有可为答主
回答量:2321
采纳率:73%
帮助的人:698万
展开全部
#include <stdio.h>
#define N 200

int main() { 
  
  int arr[N];   
  int i;  
  int s,su=0,so=0;
  do{
    scanf("%d",&s);
  }while(s<0|| s>200);//人数超出或者是负数时,重输

  for(i=0;i<s;++i){
    scanf("%d",&arr[i]);//输入数据
  }
  //Bubble(arr,N);
  printf("不合格成绩:\n");
  for(i=0;i<s;++i)
    {
      if(arr[i]<60){
        ++su;
        printf("%d ",arr[i]);
      }
    }
      printf("\n合格成绩:\n");
    for(i=0;i<s;++i)
    {
      if(arr[i]>=60){
        ++so;
        printf("%d ",arr[i]);
      }
    }
    printf("\n不合格人数:%d, 合格人数%d.\n",su,so);

  }
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
袁灵凡腾煜
2019-10-18 · TA获得超过3万个赞
知道大有可为答主
回答量:1.1万
采纳率:34%
帮助的人:863万
展开全部
第四题
是因为你在for循环后加了一个
";"即一个空语句,后边输出的内容不在循环体中
%md
m为指定输出字段宽度,如果位数小于m则前补空格,若实际位数大于m则按实际输出。
第五题为死循环吧
main()
{
char
*s={"ABC"};
do{

printf("%d",*s%10);

}while(*++s);
}
这样就行了。
第七题
我的输出的是2。。。
第八题
应该是位运算,不懂就看看谭浩强的书,“c程序设计(第三版)”319页。此0010
0011&0010
0011
其中&是与运算,结果还是0010
0011
即十进制的35。
最后
fun(&a[i]);相当与
fun(a+i);函数调用时,形参a的值为实参的值a+i,这两个a没有什么联系,纯粹迷惑大众的。现在fun函数里的a就是a+i了,a[0]相当于*((a+i)+0),
a[1]相当于是*((a+i)+1),简化一下就是a[i]
=
a[i+1];
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
一变班爱麻啊堡0J
高粉答主

2020-01-13 · 醉心答题,欢迎关注
知道答主
回答量:11.4万
采纳率:2%
帮助的人:5508万
展开全部
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式