C语言求解!!
假定有一组学生成绩,要求写一个程序读入这些成绩,然后输出不及格的成绩,再输出及格的成绩,最后输出不及格和及格的人数统计。假设成绩不超过200个...
假定有一组学生成绩,要求写一个程序读入这些成绩,然后输出不及格的成绩,再输出及格的成绩,最后输出不及格和及格的人数统计。假设成绩不超过200个
展开
4个回答
展开全部
学生名字我懒得起,都用“学生名”代替。
学生成绩信息,我放在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;
}
展开全部
#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);
}
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
第四题
是因为你在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];
是因为你在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];
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询