建立一个结构体类型,编写c语言程序。

1.建立一个结构体类型,包括了学生姓名和两门课的成绩,用这个类型定义结构体数组,保存多个学生信息。编写程序,当输入一个学生姓名时,可以输出他的两门课成绩。
2.进一步完善上题编写的程序,编写程序可以分别输出有一门课不及格的学生姓名和成绩。
(我要越简单越好!!C语言的)。好的话追加分!!

第1个回答  推荐于2017-09-05
#include <stdio.h>
char *SubjectName[] = {"数学","物理","化学","生物","语文","外语","政治","历史","体育","美术","音乐"}; //科目名称列表 可调整顺序
#define SUBJECT 2 //科目数 可设定 1 - 11门,超过11门时得添加上行科目名称列表
#define STUDENTS_MAX 100 //最大可输入的学生数量 根据实际情况调整

typedef struct student{char name[12]; float core[SUBJECT+1];} Student;//最长姓名只许有五个汉字长度,超长会出错 改一下这个名字长度或规定名字最长5个字多余的不输入也成

Student Stu[STUDENTS_MAX]; //结构体数组 全局变量 虽可以不用全局的,要是你自己写了很多函数,都要访问它们,不如就让它们做全局变量的好

void main()
{
int total,i,j,k;
printf("请输入学生总数[1-%d]:",STUDENTS_MAX);
scanf("%d",&total);

if(total>STUDENTS_MAX){printf("超出设计总数了");exit(-1);}
else if(total<1){printf("没有学生统计个屁呀"); exit(-1);}

printf("请输入学生成绩,格式:\n\t姓名 ");
for(j=0;j<SUBJECT;j++) printf("%s ",SubjectName[j]);
printf("\n");
for(i=0;i<total;i++)
{
Stu[i].core[SUBJECT]=0.0;//平均分
printf("No.%-3d ",i+1);
fflush(stdin); //清输入缓冲区
scanf("%s %f",Stu[i].name,&Stu[i].core[0]); //至少有一门科目的
for(j=1;j<SUBJECT;j++) //其它科目 定义了多少就输入多少
{
scanf("%f",&Stu[i].core[j]);
Stu[i].core[SUBJECT] += Stu[i].core[j];
}
Stu[i].core[SUBJECT] /= SUBJECT; //平均分 只是求了没有输出
}

printf("\n不及格情况统计:\n");
for(k=0,i=0;i<total;i++)
{
char putbuf[128],buf1[5];
int flag = 0;
strcpy(putbuf,Stu[i].name); //记下名字
for(j=0;j<SUBJECT;j++)
if(Stu[i].core[j]<60)
{
flag++;
strcat(putbuf," ");
strcat(putbuf,SubjectName[j]);//不及格的科目名称
strcat(putbuf,":");
sprintf(buf1,"%4.1f",Stu[i].core[j]);strcat(putbuf,buf1);//分数
}
if(flag)
{
printf("%s %d门不及格\n",putbuf,flag); //有不及格则输出
k++; //统计不及格人数
}
}
if(!k)
printf("没有不及格的学生");
else
printf("有不及格科目的学生个数:%d",k);
}
//常看到有要这类程序的,今天写一个,给大家参考,别天天上来要程序啊,仿照这个自己编吧
//程序在VC7.1下编译通过,测试运行正常追问

第一题没写完哦,,还有“当输入一个学生姓名时,可以输出他的两门课成绩。”......

追答

//下面代码插到上边的最后一个花括号之前... 昨晚可能有点心不焉,没注意题中还有查询
while(1)
{
char stdName[80];
int cx = 1; //标记有无查到结果
printf("\n输入学生姓名进行查询,或Ctrl+C退出程序\n");
fflush(stdin);
scanf("%s",stdName);
stdName[10] = '\0';//如果名字太长,直接截断,最多只留五个汉字长度
for(i=0;i<total;i++)
{
if(!strcmp(stdName,Stu[i].name))
{
printf("姓名:%s %s %.1f", Stu[i].name, SubjectName[0], Stu[i].core[0]);
for(j=1;j<SUBJECT;j++) printf(" %s %.1f", SubjectName[j], Stu[i].core[j]);
cx = 0;
printf("\n");
break;
}
}
if(cx)
{
printf("没有查询结果,指定的学生[%s]未被录入\n",stdName);
}
}
//程序在VC7.1下调试通过且运行结果正常 可以采纳了
//不要说两门科了,只要改一下开头的这个定义值 #define SUBJECT 2
//可以应付 1 门到 11 门课的情况,超过的话,得多改一点点,上面有注释说明的

本回答被提问者采纳
相似回答