成绩记录簿课程设计报告_第1页
成绩记录簿课程设计报告_第2页
成绩记录簿课程设计报告_第3页
成绩记录簿课程设计报告_第4页
成绩记录簿课程设计报告_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程设计报告课程名称 程序设计基础C语言 设计题目 成绩记录簿 姓 名 杨国俊 专 业 计算机工程 班 级 学 号 指导教师 日期 2012.6.25 7.6 目录一、目的及要求4二、课程设计内容4三、总体设计53.1 功能模块设计53.1.1成绩记录簿执行的主流程53.1.2输入信息模块53.1.3修改成绩模块53.1.4删除模块63.1.5查学生成绩模块63.1.6查班成绩表模块63.1.7入文件模块63.1.8取文件模块63.1.9出模块。63.2数据结构设计93.2.1 stu 结构体93.2.2 全局变量93.3 函数功能描述101)init()102)input_list()103

2、)insert()104)input_info()105)check_number(char* s)和same_numder(char* s)106)check_name(char* s)107)check_number2(char* s)和same_number2(student*p,int i)118)int cheak_result(float s)和cheak_credit(float s)119)void add_result()1110)search_delete()、delete_stu(student* s)和 student*searchfront_stu()1111)sea

3、ch_findstudent()、 output_stuinfo(student* p)1212)seach_findclass()、output_classinfo(int i)1213)save_tofile()、output_tofile(FILE* fp, student* p)1214)load_file()1215)end()、free_list(student* p)13四、 程序实现134.1 源码分析131)程序预处理132).主函数main153).程序初始化164).各种合法性检测165).输入数据(添加)186).修改成绩227)删除成绩258).查询信息(班级和个人)

4、27查询班级329).保存和打开文件3210).退出系统35五、结论及体会42参考文献43一、目的及要求1、目的a) 本课程设计是计算机科学与技术专业重要的实践性环节之一,是在学生学习完程序设计语言课程后进行的一次全面的综合练习。本课程设计的目的和任务:b) 巩固和加深学生对C语言课程的基本知识的理解和掌握;c) 掌握C语言编程和程序调试的基本技能;d) 利用C语言进行基本的软件设计;e) 掌握书写程序设计说明文档的能力f) 提高运用C语言解决实际问题的能力。2. 课程设计要求 a) 分析课程设计题目的要求; b) 写出详细设计说明; c) 编写程序代码,调试程序使其能正确运行; d) 设计完

5、成的软件要便于操作和使用,有整齐、美观的使用界面; e) 设计完成后提交课程设计报告和源代码文件的电子文档。 二、课程设计内容题目四:成绩记录簿1. 设计要求:基本要求:g) 添加成绩 h) 删除成绩 i) 查询学生成绩 j) 查询班级成绩 k) 退出 拓展功能:l) 写入文件m) 读取文件创新(自拟)功能:程序实现的其它功能由个人自拟。2. 设计要求具体说明 基本功能: l 成绩记录簿中记录以下数据:学号、姓名、课程编号、课程名称、成绩、学分,所有成绩都以百分制计分;输入信息时要检查数据项学号、课程编号、成绩、学分的合法性,学号:8位数字;课程编号:5位数字;成绩:0 100 之间的整数,学

6、分: 1 5之间的实型数。 l 添加成绩:需要输入学生的学号或姓名、课程编号及成绩,如已有该门课程成绩给出提示; l 查询(班级或个人)成绩: l 查询个人成绩:以学号或姓名作为关键字,可查询一个学生的所有成绩,和已完成的总学分。 l 查询班级成绩:以课程编号为关键字,成绩表后面要统计平均分、及格率及全班同学不同课程在不同分数段分布的人数及百分比。 拓展功能: a) 程序启动时先从文件读入数据,如果文件中没有数据则给出提示; b) 每次修改的数据写入文件。3. 提示 定义合适的结构体类型,使用链表或数组的方式组织数据。 三、总体设计3.1 功能模块设计3.1.1成绩记录簿执行的主流程主要的流程

7、图如下图(图1所示),首先,程序进入main函数程序调用菜单函数menu(),在主函数运行时,调用init()函数默认对系统进行初始化,并将初始化函数返回的值付给头指针head,在屏幕上显示菜单。3.1.2输入信息模块执行“1.添加”操作时时,调用input_list()函数,要求用户键入添加的人数。进入input_list()函数时,将调用insert()函数对每个的信息用头插法建立链表节点并同时进行对每一个人的信息进行输入(由insert()函数调用input_info()函数实现)。(如下图3.1.2)3.1.3修改成绩模块执行“2.修改成绩”时,调用add_result()函数,要求用

8、户键入要修改的学生的姓名或者是学号,然后键入要修改的课程编号,在输入成绩时,如果是已经有成绩则提示“已经有程序”以后有“是否修改成绩?”的提示。3.1.4删除模块执行“3.删除”时,用户输入要删除的学生姓名或学号,检查合法性后,调用查找函数search_number(char*)(学号查找)或search_name(char*)(姓名查找),将返回的链表地址给utput_stuinfo(student*)(显示在屏幕)并且提示用户是否删除。如过删除,则继续将返回的链表给delete_stu(student*)函数,将这个链表的下一个节点的头指针连接到这个链表的上一个尾指针,则删除成功。3.1.

9、5查学生成绩模块调用seach_findstudent()函数,要求用户输入学号或者是姓名,通过check_name()和check_number2()函数判断姓名或者学号的合法性(即是否姓名为字母,学号为)。3.1.6查班成绩表模块通过调用seach_findclass()函数,要求用户输入课程编号进入,通过课程编号查找所有节点的相同课程编号,并且输出所有学生的这一课程编号的成绩、学分和平均分;成绩表后面要统计平均分、及格率及全班同学不同课程在不同分数段分布的人数及百分比。 3.1.7入文件模块通过调用save_tofile()函数,提示用户输入文件名,这里为用户自己定义,文件以“w”方式,

10、当程序开始运行时,提示是否打开文件,文件名称要用户自己定义。3.1.8取文件模块通过load_file()函数,可将本程序保存的数据文件在程序重新期待时读写到系统内存里,可对其进行查看、编辑、处理等任务。3.1.9出模块。退出时,释放链表内存。然后exit(0)退出程序。1总体框图修改成绩add_result()添加input_list()删除信息search_delete()查询学生信息seach_findstudent()查询班级信息seach_findclass()写入文件save_tofile()读取文件load_file()退出end()菜单menu()开始是否退出?结束否是图1 总

11、体框图2 目录函数menu()修改成绩add_result()添加input_list()删除信息search_delete()查询学生信息seach_findstudent()查询班级信息seach_findclass()写入文件save_tofile()读取文件load_file()退出end()菜单menu()开始图2 目录函数(menu)流程图3 目录主要源码int menu() int n;char ch;printf(*n);printf(* 成绩记录簿 *n);printf(*n);printf(* 1. 添加 *n);printf(* 2. 修改成绩 *n);printf(*

12、3. 删除 *n);printf(* 4. 查学生成绩 *n);printf(* 5. 查班成绩表 *n);printf(* 6. 写入文件 *n);printf(* 7. 读取文件 *n);printf(* 0. 退出 *n);printf(*n);if(!SWITCH3)SWITCH3=1;printf(是否打开文件?(y为打开,任意键取消!)n);scanf(%c,&ch);if(ch=y|ch=Y)load_file();/打开文件 printf(nn输入程序序号:);scanf(%d,&n);return n;4. 源码解释menu()函数完成打印菜单和接收用户选择功能。3.2数据结

13、构设计3.2.1 stu 结构体typedef struct stuchar number20;/学号char name20;/姓名char curriculum_numberCLASS6;/课程代号 float creditCLASS; /学分 float resultCLASS;/分数 float sum;/ 总分 float ave;/平均分 float sum_credit;/总学分 struct stu *next;student;源码解释: 对结构体使用链表处理。3.2.2 全局变量char result_nameCLASS30=数学,英语,政治,计算机;对课程的名字进行定义。in

14、t SWITCH4=0,0,0,0;为程序设定开关,方便特定条件下决定部分程序是否运行char classnameCLASS6;为了记录第一次定义的课程编码 。int number_student =0;记录输入数据的学生人数 “输入链表 ”即“添加”菜单步骤里做自增,计算人数。 student *head = NULL; 为链表的头指针。FILE* fp;为文件指针。3.3 函数功能描述1)init()函数原型student* init(); init()函数用于初始化程序,对头函数进行初值的操作。其返回值赋值给头指针head。2)input_list() 函数原型void input_li

15、st();input_list()函数为输入链表操作的第一步,接收用户输入的节点数(即记录的学生人数)。对头插法函数进行插入循环。3)insert()原型函数void insert();insert()函数为将数据运用头插法插入。4)input_info() 原型函数void input_info(student*p);input_info(student*)函数为给接收到的p指向的节点输入数据。数据有学号、姓名、课程代码(第一次运行程序并且没有一开始读取文件的时候执行输入,否则程序内部将课程代码复制给下一个学生的信息里。)、每个课程代码对应的课程的分数和学分,并且自动计算个人总分、平均分和总

16、学分。5)check_number(char* s)和same_numder(char* s)原型函数int check_number(char* s) 和int same_numder(char* s)check_number(char* s)是检测学号是否为8位阿拉伯数字。same_numder(char* s)函数为检测这一次输入的学号是否与前面所有学号有相同。6)check_name(char* s)函数原型int check_name(char* s) check_name(char* s)函数为检测输入的姓名是否合法,是否为空,是否为英文字母。7)check_number2(cha

17、r* s)和same_number2(student*p,int i)函数原型:int check_number2(char* s)和check_number2(char* s) check_number2(char* s)为检测接收的课程编码是否为5位阿拉伯数字。same_number2(student*p,int i)检测在有输入课程编码时,查找输入的课程编码是否与原有的课程编码有相同。8)int cheak_result(float s)和cheak_credit(float s)函数原型:int cheak_result(char* s)和int cheak_credit(float

18、s)cheak_result(char* s)函数为检测输入的分数是否为1100;cheak_credit(float s)函数则检测学分是否为大于0且小于5的。9)void add_result()函数原型void add_result()add_result()函数进行修改成绩的操作,用户输入学号,查找是否有学号,如果有此学号,则程序查找到这个学号对应的节点,然后要求用户输入要修改的课程代号,找到需要修改的课程,输入成绩,最后判断是否修改,若否则不修改退出此操作。学分在成绩以后修改。10)search_delete()、delete_stu(student* s)和 student*sea

19、rchfront_stu()函数原型void search_delete()、void delete_stu(student* s) 和student* searchfront_stu(student* n)void search_delete()为主函数调用的删除指令,在调用check_number(char*)和check_name(char*)判断输入合法性和正确性后确认删除时,打印要删除的信息,如果确认删除,则调用delete_stu(student* s)(删除接受的s节点的指令)函数运行student* searchfront_stu(student* n)(返回前一个节点的功能)

20、,将所要删除的信息的后一个链表连接到要删除的信息的前一个链表。11)seach_findstudent()、 output_stuinfo(student* p)函数原型:void seach_findstudent()、void output_stuinfo(student* p)seach_findstudent()函数为查询查学生成绩的操作,用户输入要查询的学生学号或者是姓名,调用check_number(char*)和check_name(char*)判断输入合法性和正确性后和判断是学号还是姓名,最后再调用student*search_number(char*)按学号查找,或调用stu

21、dent* search_name(char*)按姓名查找,若查找到,则返回查找的指针,最后通过函数output_stuinfo(student* p)打印学生信息。12)seach_findclass()、output_classinfo(int i)函数原型void seach_findclass(),void output_classinfo(int i)seach_findclass()函数为查询班级信息的操作,用户输入要查询的课程编码,在通过调用check_number2(char*)检测编码合法性后,执行按节点查找课程编码位置步骤,然后调用output_classinfo(int

22、i)(输出班级信息)函数,将位置固定,查找head之后所有节点的同一课程编码并且输出。然后计算head之后的所有节点的该课程编码情况计算统计平均分、及格率及全班同学不同课程在不同分数段分布的人数及百分比并且列出。 13)save_tofile()、output_tofile(FILE* fp, student* p)函数原型void save_tofile()、void output_tofile(FILE* fp, student* p)save_tofile()函数为主函数调用,并检测输入合法性。 output_tofile(FILE* fp, student* p)函数实现写入文件操作。

23、14)load_file()函数原型void load_file()load_file()函数实现从文件里将数据读到内存里,从而能进行对数据的处理。15)end()、free_list(student* p)函数原型为void end()、void free_list(student* p)void end()函数调用free_list(student* p)函数将空间返回内存。四、 程序实现4.1 源码分析1)程序预处理#include #include#include #define CLASS 4/课程多少#define MALLOC (student*) malloc(sizeof(s

24、tudent)#define MAX_NO 8/学号长度typedef struct stuchar number20;/学号char name20;/姓名char curriculum_numberCLASS6;/课程代号 float creditCLASS; /学分 float resultCLASS;/分数 float sum;/ 总分 float ave;/平均分 float sum_credit;/总学分 struct stu *next;student;char result_nameCLASS30=数学,英语,政治,计算机; /*开关*/ int SWITCH4=0,0,0,0;

25、char classnameCLASS6;/记录第一次定义的课程 int number_student =0;/记录输入数据的学生人数 “输入链表 ”即“添加”菜单步骤里计算人数。 /* 头指针 */student *head = NULL;/*文件指针*/ FILE* fp; /*声明*/ int menu();/菜单student* init();/初始化void insert();/ 头插法插入节点void input_list();/(写入链表的操作) void input_info(student*);/真正输入的函数。int check_number(char*);/学号检测。 i

26、nt check_number2(char*);/检测课程编号 int same_number2(char*,int);/检测相同课程编码 int cheak_result(float);/检测分数 int cheak_credit(float*);/检测学分 int check_name(char*);/检测姓名int same_numder(char*); /检测相同姓名int same_result(int*);/检测相同成绩 student* search_number(char*);/ 按学号查找 student* search_name(char*);/按姓名查找 void com

27、pute(student*);/总分与平均分 student* searchfront_stu(student*);/返回前一个节点 用于删除 void input(student*);/输入 void seach_findstudent(); /查询学生信息 void search_delete();/ 删除操作 void delete_stu(student*);/ 删除数据 void output_stuinfo(student*);/输出 个人信息 void output_classinfo(student*,int*);/输出 班级信息 void seach_findclass();

28、/查询班级信息 void result_outside();/成绩表void output_tofile(FILE*,student*);/写入文件 void save_tofile();/保存到文件 void load_file(); /读出文件 void free_list(student*);/结束链表 void end();/ 结束2).主函数mainint main(void) int n; head = init(); /初始化 while(2)n = menu();/菜单 switch(n)case 1: input_list();/键入信息 break; case 2: add

29、_result();/修改成绩 break;case 3: search_delete();/删除信息 break;case 4: system(cls);/清屏 seach_findstudent();/查询学生信息 break; case 5: system(cls); seach_findclass();/查询班级信息 break;case 6: save_tofile();/写入文件 break;case 7: head = init(); load_file();/文件中读取 break;case 0: end();/退出 break;default: printf(无效命令!n);

30、 fflush(stdin); system(pause);return 0;3).程序初始化student* init() /初始化 student *head; head = MALLOC;/建立head头链表 head-next = NULL;/设定头指针也是尾指针 return head;/返回头指针4).各种合法性检测/*姓名检测*/int check_name(char* s) if (strlen(s) = 0) return 0; for (int i = 0; i= a & si = A & si = Z) return 0; return 1;/*课程编码检测*/ int

31、check_number2(char* s) if (strlen(s) !=5) return 0; for (int i = 0; i (int) strlen(s); i+) if (si 9) return 0; return 1;/*相同课程编码检测*/ int same_number2(student*p,int i)if(SWITCH1) for(int j=0;jcurriculum_numberi,p-curriculum_numberj)=0) return 0;elsereturn 1;/*分数检测*/int cheak_result(float s)if(s100)re

32、turn 0;elsereturn 1;/*学分检测*/int cheak_credit(float s) if(s5)return 0; elsereturn 1;/*学号检测*/int check_number(char* s) if (strlen(s)!=8) return 0; for (int i = 0; i (int) strlen(s); i+) if (si 9) return 0; return 1;/* 检查相同学号 */int same_numder(char* s)student *p = head-next;while(p != NULL)if (strcmp(s

33、, p-number) = 0) return 1;p = p-next;return 0;5).输入数据(添加)void insert() student * p= MALLOC; input_info(p); p-next = head-next; head-next = p;/* 输入链表 */void input_list() int n; printf(输入要插入的人数: ); scanf(%d, &n); number_student += n; while (n-) insert(); /* 给p指向的节点输入信息 */void input_info(student* s) /*

34、 学号 */ printf(n请输入学号: ); do scanf(%s,s-number); if (!check_number(s-number) printf(数据违法,请重新输入学号: );if(same_numder(s-number)printf(学号相同,请重新输入学号:); while (!check_number(s-number)|same_numder(s-number); /* 姓名 */ printf(请输入姓名: ); getchar(); do gets(s-name); if (!check_name(s-name) printf(数据违法,请重新输入姓名: )

35、; while (!check_name(s-name); /*课程编号; 成绩;学分的存入*/ float stu_resurt; float stu_credit;/*课程编码输入*/if(!SWITCH0)printf(n课程编码输入第一个学生时定义!n);for(int j=0;jcurriculum_numberj); if (!check_number2(s-curriculum_numberj) printf(n数据违法,请重新输入课程编号: );else if(!same_number2(s,j) printf(n课程编号重复,请重新输入编号:); while (!check_

36、number2(s-curriculum_numberj)|!same_number2(s,j);SWITCH1=1;strcpy(classnamej,s-curriculum_numberj); SWITCH0=1; SWITCH2=1;if(SWITCH2)for(int j=0;jcurriculum_numberj,classnamej);float mun=0,avg=0,mun1=0; for(int i=0;iresulti=stu_resurt;/存入成绩 mun += s-resulti;/ 记录总分 /*输入课程学分*/printf(请输入课程学分: ); do scan

37、f(%f,&stu_credit); if (!cheak_credit(stu_credit) printf(数据违法,请重新输入 %s 学分:,result_namei); while (!cheak_credit(stu_credit); s-crediti=stu_credit;/ 存入学分 mun1 += s-crediti;/记录总学分 s-ave=mun/CLASS;/存入平均分 s-sum=mun;/ 存入总分 s-sum_credit=mun1; /存入总学分 fflush(stdin);/清屏 说明:调用input_list()函数,要求用户键入添加的人数。进入input_

38、list()函数时,将调用insert()函数对每个的信息用头插法建立链表节点并同时进行对每一个人的信息进行输入(由insert()函数调用input_info()。6).修改成绩/*修改成绩*/void add_result()char ch;char str20;student*s=head-next;/ 输入合法性判断 printf(请输入你要修改的学生的 姓名 或 学号: ); do scanf(%s,str); if (check_number2(str)&!check_name(str) printf(数据违法,请重新输入姓名或学号: ); while (check_number2

39、(str)&!check_name(str); / 判断是姓名还是学号 if (str0 = 0 & str0 = 9) s = search_number(str); /按学号查找 if (s = NULL) printf(对不起,找不到这个学号n); else s = search_name(str); if (s = NULL) printf(对不起,找不到这个学号n); /输入课程编码 char curriculum6; int n;/记录 课程顺序 printf(输入课程编码:); do scanf(%s,curriculum); if (!check_number2(curricu

40、lum) printf(n数据违法,请重新输入课程编号: ); while (!check_number2(curriculum); for(int i=0;icurriculum_numberi,curriculum)=0) n=i;break; float stu_resurt,stu_credit;/ 修改成绩操作 printf(nn); printf(请输入 %s 成绩: , result_namen); do scanf(%f,&stu_resurt); if (!cheak_result(stu_resurt) printf(数据违法,请重新输入 %s 成绩: , result_n

41、amen); while (!cheak_result(stu_resurt); if(s-resultn!=0)printf(成绩已经存在!是否修改?(输入 y 确认修改,任意键取消):n);getchar();scanf(%c,&ch);if(ch=y|ch=Y) s-resultn=stu_resurt; /输入课程学分 printf(请输入该课程学分: ); do scanf(%f,&stu_credit); if (!cheak_credit(stu_credit) printf(数据违法,请重新输入 %s 学分:,result_namen); while (!cheak_credit(stu_credit); s-creditn=stu_credit;/ 存入学分 printf(成绩修改为:%.2fn,s-resultn

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论