




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1. 设计要求:成绩记录簿中记录以下数据:学号、姓名、课程编号、课程名称、成绩、学分,所有成绩都以百分制计分。在程序中可以输入新的成绩记录,可以按学号或姓名查询一个学生的所有成绩,和已完成的总学分。也可以按课程编号查出一个班的成绩表,班成绩表后面要统计平均分,和及格率。2. 提高水平在程序中增加将数据写入文本文件和从文件中读入数据的功能,文件名由用户输入。3. 提示在没有使用文件时,数据可以保存在一个大的数组中,要注意的数据项的类型。知识范围;C程序设计第三版谭浩强答案一/ 包含必须的头文件#include<stdio.h>#include<stdlib.h>#incl
2、ude<string.h>/ 定义课程的结构体struct course int num; /课程编号 char name20; / 课程名字 int result; / 学生的成绩 float credit; / 学分;/ 定义成绩记录簿的结构体,每个学生修了4门课struct scorelistint num; /学号char name10; /学生姓名 struct course subject4; /课程相关的数据。意思是一个学生修了4门课;int n=0; / n用来存储一共有多少个学生struct scorelist score200; /初始化成绩记录簿,上限为200
3、条学生成绩/ 查询课程的函数void queryclass() int number,i,j,max=0,count=0;float average;/平均分 float pass=0; /及格人数 printf("*请输入要查询的课程编号:"); scanf("%d",&number); / 遍历所有的学生,打印每个学生修的课程成绩 for(i=0;i<n;i+) / 遍历所有学生 for(j=0;j<4;j+) / 遍历当前学生所修的4门课 if(scorei.subjectj.num=number) / 如果符合此条件,说明当前
4、条目即为用户查询的课程 printf("学号:%d 姓名:%s %s:%dn",scorei.num,,,scorei.subjectj.result); if(scorei.subjectj.result>=60) pass+; max+=scorei.subjectj.result; count+; if(count!=0) average=(float)max/count; pass=pass/count; printf("平均分:%fn",average); printf(&qu
5、ot;及格率:%.2f%cnn",pass*100,37); / 查询学生信息void querystudent() char xm10; int i,flag=0,j,a,xh; printf("*请输入要查询的项目: 1.学号 2.姓名;"); scanf("%d",&a); if(a=1) scanf("%d",&xh); else scanf("%s",xm); / 根据用户输入判定用户是根据学号还是姓名查询 switch(a) / 根据学号查询 case 1: / 遍历查找用户所
6、输入的学号 for(i=0;i<n;i+) if(scorei.num=xh) j=i;flag=1; if(flag=0) printf("*抱歉没有找到.*"); / 没有找到,跳出 else /找到了用户输入的学号,打印 printf("学号:%d 姓名: %sn",scorej.num,); printf("*课程编号 课程名称 课程成绩 课程学分*n"); for(i=0;i<4;i+) printf("%d %s %d %5.2fn",scorej.subjecti.n
7、um, ,scorej.subjecti.result,scorej.subjecti.credit); break; / 根据姓名查询 case 2: / 遍历查找用户输入的姓名 for(i=0;i<n;i+) if(strcmp(,xm)=0) j=i;flag=1; if(!flag) printf("*抱歉没有找到.*"); else / 找到了用户输入的学生姓名,打印 printf("学号:%d 姓名: %sn",scorej.num,); printf(
8、"课程编号 课程名称 课程成绩 课程学分n"); for(i=0;i<4;i+) printf("%d %s %d %fn",scorej.subjecti.num, ,scorej.subjecti.result,scorej.subjecti.credit); break; default:printf("*输入错误!*"); / 删除一条学生记录void del() char xm10; int i,flag=0,j,a,xh; printf("*请输入要删除的项目 : 1
9、.学号 2.姓名: "); scanf("%d",&a); / 根据用户输入进行不同的查找 switch(a) / 接收用户输入为学号 case 1:scanf("%d",&xh); / 查找此学号的记录 for(i=0;i<n;i+) if(scorei.num=xh) / 找到 for(j=i;j<n-1;j+) /进行删除,策略是用后一项覆盖前一项,达到删除目的 scorej=scorej+1; n=n-1;flag=1; if(!flag)printf("*抱歉没有找到.*n");brea
10、k; / 接收用户输入为姓名。原理同上 case 2:scanf("%d",&xm); for(i=0;i<n;i+) if(strcmp(,xm)=0) for(j=i;j<n-1;j+) scorej=scorej+1; n=n-1;flag=1; if(!flag)printf("not found!n");break; default:printf("错!请再输入一遍"); / 添加一条记录。原理是提示并接收用户输入,然后储存到当前的学生记录(用n的值指示当前记录)void appen
11、d() char ch;int choice; int i; while(1) system("cls"); printf("*请输入学号: "); scanf("%d",&scoren.num); printf("*请输入姓名: "); scanf("%s",);ch=getchar(); for(i=0;i<4;i+) printf("*请输入第%d门的课程编号 : ",i+1); scanf("%d",&s
12、coren.subjecti.num); printf("*请输入第%d门的课程名称 : ",i+1); scanf("%s",); printf("*请输入第%d门的课程成绩 : ",i+1); scanf("%d",&scoren.subjecti.result); printf("*请输入第%d门的课程学分 : ",i+1); scanf("%f",&scoren.subjecti.credit); n+; pri
13、ntf("n1、继续添加 2、退出 bb"); scanf("%d",&choice); if(choice=2) break; / 写入文件void writefile() FILE *fp;int i; fp=fopen("score_list","wb");/以写二进制的模式打开文件 /遍历所有记录,并把每一个结构体对象以二进制形式写入文件 for(i=0;i<=n-1;i+) fwrite(&scorei,sizeof(struct scorelist),1,fp); printf(&
14、quot; !文件已保存为scorelistnn"); fclose(fp); /关闭文件 / 读文件,并初始化学生成绩数组void readfile() struct scorelist add;FILE *fp;n=0;fp=fopen("score_list","rb"); / 以读取二进制文件的模式打开文件fread(&add,sizeof(struct scorelist),1,fp); / 读取一个结构体长度的数据并把它付给add对象。 / 持续读取文件,初始化新的add对象,并把它加到score的数组中去 while(!f
15、eof(fp) scoren=add;n+; fread(&add,sizeof(struct scorelist),1,fp); printf(" ! 文件scorelist已读取n"); fclose(fp);/ 关闭文件/ 主程序入口main()int a;struct scorelist add;FILE *fp; / 如果没有score_list这个文件,创建它 if(fp=fopen("score_list","rb")=NULL) fp=fopen("score_list","wb&
16、quot;); else / 如果有score_list这个文件,那么将其中的数据读取到全局的score数组。参考readfile() fread(&add,sizeof(struct scorelist),1,fp); while(!feof(fp) scoren=add;n+; fread(&add,sizeof(struct scorelist),1,fp); fclose(fp); / 程序一直读取用户输入并解析,然后调用不同的函数进行处理,并返回结果。while(1)printf("*"); printf("tt 欢迎 Welcome t
17、on"); printf("nttt 使用成绩记录簿系统1.0n"); printf("*copyright归山东超峰所有*在此鸣谢 百度知道 老师*n") ; printf("*MENU*"); printf("n");printf(" 成绩记录簿n");printf("* *1.添加n");printf("* *2.删除n");printf("* *3.查学生成绩n");printf("* *4.查班成绩表(附加
18、功能显示平均分和及格率)n");printf("* *5.写入文件n");printf("* *6.读取文件n");printf("* *0.退出n");printf("ntt输入你的选择Enter your choice(0-6):"); scanf("%d",&a);getchar();switch(a) case 1:append();break; case 2:del();break; case 3:querystudent();break; case 4:queryc
19、lass();break; case 5:writefile();break; case 6:writefile();readfile();break; case 0:writefile();exit(0);break; default:printf("*错!请再输入一遍*"); 答案二#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX 1000typedef struct Lesson /定义课程结构体 int Lesson_Num; char Less
20、on_Name50; int Lesson_Mark; int Lesson_Credit;Lesson;typedef struct Student /定义学生的结构体 char Name50; int Num; int Lesson_Count; Lesson L20;Student;Student SMAX;static int Student_Count = 0; /记录学生数的变量void PrintInterface(); /打印界面int AddStudent(); /添加,带返回值,提示操作成功int DelStudent(); /删除,带返回值,提示操作成功void Chec
21、kStudent(); /查学生成绩void CheckClass(); /查班成绩表void WriteFile(); /写入文本文件void ReadFile(); /读取文本文件void main() int Choice; while (1) PrintInterface(); scanf("%d%*c", &Choice); /"%*c"是吸收回车的,因为后面会输入字母类型 if (Choice >= 0 && Choice <= 6) /选择操作合法 switch (Choice) case 0: exit
22、(1); case 1: system("cls"); if (AddStudent() printf("n添加成功.回车继续n"); else printf("n添加失败.回车继续n"); getchar(); getchar(); system("cls"); break; case 2: system("cls"); if (DelStudent() printf("n删除成功.回车继续n"); else printf("n删除失败.回车继续n");
23、 getchar(); getchar(); system("cls"); break; case 3: system("cls"); CheckStudent(); system("cls"); break; case 4: system("cls"); CheckClass(); system("cls"); break; case 5: WriteFile();system("cls");break; case 6: ReadFile();system("cl
24、s");break; default:; else printf("无此功能.重新选择.回车确定n"); /选择操作非法 getchar(); system("cls"); /清屏函数 void PrintInterface() printf("t - n"); printf("t| 1、添加 |n"); printf("t| |n"); printf("t| 2、删除 |n"); printf("t| |n"); printf("t|
25、 3、查学生成绩 |n"); printf("t| |n"); printf("t| 4、查班成绩表 |n"); printf("t| |n"); printf("t| 5、写入文本文件 |n"); printf("t| |n"); printf("t| 6、读取文本文件 |n"); printf("t| |n"); printf("t| 0、退出 |n"); printf("t - n"); printf
26、("t选择操作:");int AddStudent() int S_count, i, j; printf("n添加中.n"); printf("n添加学生人数(如1、2 999):"); scanf("%d", &S_count); if (Student_Count + S_count >= MAX) return 0; /超过了数组上限 for (i = Student_Count; i < Student_Count + S_count; i+) printf("nt第%d个学
27、生:n", i - Student_Count + 1); printf("nt学生学号:"); scanf("%d%*c", &Si.Num); printf("nt学生姓名:"); gets(Si.Name); printf("nt该学生所修课程数:"); scanf("%d", &Si.Lesson_Count); for (j = 0; j < Si.Lesson_Count; j+) printf("nt第%d门课:n", j + 1
28、); printf("ntt课程编号:"); scanf("%d%*c", &Si.Lj.Lesson_Num); printf("ntt课程名称:"); gets(Si.Lj.Lesson_Name); printf("ntt课程成绩:"); scanf("%d", &Si.Lj.Lesson_Mark); printf("ntt课程学分:"); scanf("%d", &Si.Lj.Lesson_Credit); if (Si.
29、Lj.Lesson_Mark < 60) Si.Lj.Lesson_Credit = 0; /不及格的课程学分为0 Student_Count += S_count; return 1;int DelStudent() char *D_Name; int D_Num; int i, j; printf("n填写待删除学生的信息:n"); printf("n学生姓名:"); gets(D_Name); printf("n学生学号:"); scanf("%d", &D_Num); for (i = 0;
30、i < Student_Count; i+) if (!strcmp(Si.Name, D_Name) && Si.Num = D_Num) printf("n找到该学生,删除中.n"); for (j = i + 1; j < Student_Count; j+) Sj - 1 = Sj; break; if (i = Student_Count) printf("n未找到该学生.请核对所填信息nn"); return 0; else Student_Count-; return 1; void CheckStudent()
31、 int C_Choice; char C_Name50; int C_Num; int i, j; printf("n输入所查学生信息(1.姓名 2.学号)选择:"); scanf("%d%*c", &C_Choice); printf("n查找中.n"); if (C_Choice = 1 | C_Choice = 2) /选择合法 if (C_Choice = 1) printf("n姓名:"); gets(C_Name); for (i = 0; i < Student_Count; i+)
32、/全部穷举,防止同名同姓 if (!strcmp(Si.Name, C_Name) printf("n学号:%dt姓名:%sn", Si.Num, Si.Name); printf("n课程编号t课程名称t课程成绩t课程学分n"); printf("-n"); for (j = 0; j < Si.Lesson_Count; j+) printf("%dtt%stt%dtt%dn", Si.Lj.Lesson_Num, Si.Lj.Lesson_Name, Si.Lj.Lesson_Mark, Si.Lj.L
33、esson_Credit); printf("-n"); printf("nn"); else printf("n学号:"); scanf("%d%*c", &C_Num); for (i = 0; i < Student_Count; i+) /不用全部穷举,学号唯一 if (Si.Num = C_Num) printf("n学号:%dt姓名:%sn", Si.Num, Si.Name); printf("n课程编号t课程名称t课程成绩t课程学分n"); pr
34、intf("-n"); for (j = 0; j < Si.Lesson_Count; j+) printf("%dtt%stt%dtt%dn", Si.Lj.Lesson_Num, Si.Lj.Lesson_Name, Si.Lj.Lesson_Mark, Si.Lj.Lesson_Credit); printf("-n"); printf("nn"); break; printf("查找完毕.回车继续n"); getchar(); else /选择不合法 printf("选
35、择错误.回车继续n"); getchar(); return; void CheckClass() int C_LNum; double SSNum = 0, PassSNum = 0, SMark = 0; int i, j; printf("n请输入课程编号:"); scanf("%d%*c", &C_LNum); printf("n查找中.nn"); printf("学号t姓名t课程名称t课程成绩t课程学分n"); printf("-n"); for (i = 0; i
36、< Student_Count; i+) for (j = 0; j < Si.Lesson_Count; j+) if (Si.Lj.Lesson_Num = C_LNum) printf("%dt%st%stt%dtt%dn", Si.Num, Si.Name, Si.Lj.Lesson_Name, Si.Lj.Lesson_Mark, Si.Lj.Lesson_Credit); printf("-n"); SMark += Si.Lj.Lesson_Mark; SSNum +; if (Si.Lj.Lesson_Mark >= 60) PassSNum+; break; printf("n平均分:%.2lft及格率:%.2lf%nn", SMark / SSNum, PassSNum / SSNum * 100); printf("n查找完毕.回车继续n"); getchar();void WriteFile() FILE *fp; int i, j; char A
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 正阳县种植培训考试题及答案
- 台山建筑倾斜加固方案设计
- 离婚协议书高级版全方位维护双方权益与子女福祉
- 智能社区物业股权收购与绿色能源应用合作协议
- 离婚协议书模板专业离婚协议续签解除范本
- 知识产权租赁合同证明书(含授权许可)
- 离婚房产过户与子女抚养费支付协议范本
- 保密协议模板定制与保密风险评估与培训合同
- 中信博BIPV施工方案
- 夫妻离婚后财产分配与子女监护权执行合同样本
- 一例外周静脉炎的护理个案讲课件
- 2025年云南省中考英语试卷真题(含标准答案及解析)
- 数字成瘾机制研究-洞察及研究
- 2024-2025学年统编版(2024)初中历史七年级下册(全册)教学设计(附目录P162)
- 国网安规培训课件
- 干部教育培训工作条例解读
- 机械设计方案评审
- 《婴幼儿睡眠习惯培养》课件
- 公司有关进一步改组股份合作制实施方案
- 房建工程监理规划范本
- 高速通信管道迁改施工方案
评论
0/150
提交评论