1、实 验 二 学 生 成 绩 管 理 系 统一 : 实 验 目 的使 用 标 准 C 或 C+实 现 一 般 管 理 系 统 的 基 本 功 能 。 进 一 步 巩 固 C语 言 的 学 习 , 培 养 一 定 的 综 合 编 程 能 力 。二 : 需 要 处 理 的 基 础 数 据学 生 基 本 信 息 包 括 :学 号 ( 如 2011级 24班 13号 写 作 52112413)姓名性 别出 生 年 月 日课 程 对 应 的 考 试 成 绩 ( 外 语 SCORE0、 高 数 SCORE1、C语 言 SCORE2、 马 哲 SCORE3)平 均 成 绩 和 总 成 绩三 :本 系 统 主
2、要 具 备 以 下 三 个 功 能 学 生 基 本 情 况 录 入 。要 求 对 输 入 的 性 别 、 出 生 年 月 日 的 合 理 性 进 行 判 断 ( 如 0代表 “ 女 ” , 1代 表 “ 男 ” , 输 入 其 他 值 非 法 , 年 龄 不 能 为 负 ,月 份 不 能 大 于 13等 ) 。 允 许 对 已 经 录 入 的 数 据 进 行 显 示 。 允 许 进 行 数 据 的 插 入 。 删 除 基 本 数 据 的 相 关 信 息 。 基 于 姓 名 的 查 询 。 如 : 姓 张 的 所 有 同 学 。 基 于 各 种 基 本 数 据 的 统 计 计 算 。 如 : 统
3、 计 每 个 学 生 各 门 功 课 的 平 均 成 绩 , 并 按 平 均 成 绩 从 高 到 低 的次 序 排 名 输 出 每 个 学 生 各 门 功 课 的 综 合 成 绩 和 平 均 成 绩 ( 名次 、 学 号 、 姓 名 、 平 均 成 绩 、 各 门 功 课 的 考 试 成 绩 ) 。 列 出 90分 及 以 上 、 80分 及 以 上 、 70分 及 以 上 、 60分 及 以 上 、不 及 格 学 生 清 单 ( 学 号 、 姓 名 、 不 及 格 的 课 程 和 成 绩 ) 。 统 计 并 输 出 各 门 功 课 的 平 均 成 绩 和 总 平 均 成 绩 。 按 班 级
4、统 计 并 输 出 总 成 绩 ( 需 对 学 号 进 行 解 析 ) 。四 : 数 据 结 构 设 计 及 用 法 说 明需 处 理 的 车 辆 及 违 章 基 本 信 息 包 括 : 车 牌 号 、 车 主 姓 名 、 违 章 停车 次 数 、 闯 红 灯 次 数 、 超 速 次 数 。 这 些 信 息 采 用 结 构 体 数 据 类 型 表 示更 为 方 便 , 因 为 违 章 信 息 数 量 的 不 确 定 性 , 所 以 信 息 应 采 用 链 表 进 行存 储 , 这 更 符 合 实 际 应 用所 以 采 用 的 数 据 结 构 如 下typedef struct St1 char
5、 IDNumber16;/*学 号 */char FamilyName16; /*姓 */char GivenName16; /*名 */int sex; /*性 别 ( 0代 表 “ 女 ” , 1代 表 “ 男 ” ) */int BirthYear; /*出 生 年 */int BirthMonth; /*出 生 月 */int BirthDay; /*出 生 日 */float score4; /*成 绩 */float sum; /*总 分 */float average; /*平 均 分 */struct St1 *next;StudentNode该 程 序 中 需 要 处 理 的
6、 基 础 数 据 有 :学 生 基 本 信 息 : 学 号 ( 例 如 2003级 12班 6号 写 作 20031206) 、 姓 、 名 、性 别 、 出 生 年 月 日 、 课 程 名 称 ( 外 语 SCORE0、 高 数 SCORE1、 C语 言 SCORE2、马 哲 SCORE3) 、 考 试 成 绩 等 。 因 此 定 义 结 构 体 重 要 包 括 所 以 要 素 , 另 外 , 本程 序 用 链 表 方 法 来 处 理 对 象 。 对 象 之 间 连 接 起 来 的 程 序 为 : p1=p1-next.数 据 交换 的 代 码 为 : p2=p1-next;P1-next=
7、p2-next;P2-next=p1;P1=p2;五 : 各 模 块 的 功 能该 程 序 包 含 的 函 数 以 及 作 用 :head=Enterlist() 输 入 记 录head=Delet(head) 从 表 中 删 除 记 录Searchrecordonname(head) 按 照 姓 名 查 找 记 录Printf Savethefile(head) 显 示 链 表 中 所 有 记 录Loadthefile(head) 从 文 件 中 读 入 记 录Computethescore(head) 计 算 所 有 学 生 的 总 分 和 均 分Querybyclass(head) 按
8、班 级 查 询 显 示 学 生 成 绩head=Insert(head) 插 入 记 录 到 表 中exit(0) 退 出sortbyaverage(head) 以 平 均 成 绩 排 序waiyu(head) 输 出 英 语 成 绩 的 平 均 分 , 总 分 , 各 分 数 段 的 同 学 的 信 息gaoshu(head) 输 出 高 数 成 绩 的 平 均 分 , 总 分 , 各 分 数 段 的 同 学 的 信 息cyuyan(head) 输 出 c语 言 成 绩 的 平 均 分 , 总 分 , 各 分 数 段 的 同 学 的 信 息mazhe(head) 输 出 马 哲 绩 的 平
9、均 分 , 总 分 , 各 分 数 段 的 同 学 的 信 息bujige(head) 输 出 不 及 格 同 学 的 信 息六 : 程 序 结 构 图七 : 试 验 结 果 ( 包 括 输 入 数 据 和 输 出 结 果 )菜 单 :密 码 是 : sundayang。 然 后 回 车输 入 2:输 入 11个 0, 结 束 输 入输 入 2:输 入 错 误 , 会 有 提 示 。 。输 入 正 确 信 息 后 , 再 输 入 11个 零 退 出 输 入 :输 入 4: 按 平 均 成 绩 排 序输 入 9, 按 照 姓 氏 查 询 学 生 信 息 :输 入 3, 删 除 学 生 信 息 :
10、输 入 8退 出 程 序 并 且 保 存 :输 入 9退 出 程 序 。八 : 体 会此 次 的 编 程 实 验 是 “ 学 生 成 绩 管 理 系 统 ” , 主 要 运 用 链 表 实 现 其 功 能 。 为 了做 好 本 次 试 验 , 我 在 实 验 之 前 通 过 翻 阅 书 籍 和 上 网 查 询 获 取 了 所 用 的 基 础 函 数 。然 后 分 析 每 一 模 块 怎 么 做 , 思 路 是 什 么 。 把 整 个 一 个 大 程 序 分 为 几 个 部 分 去 做 ,这 样 编 程 才 会 更 简 单 。 为 了 使 做 出 的 系 统 更 加 新 颖 , 我 在 书 上
11、学 习 了 一 种 新 的 函数 getch ,这 种 函 数 能 将 在 键 盘 上 键 入 的 信 息 在 屏 幕 上 不 显 示 , 只 显 示 *号 。 这样 一 个 密 码 系 统 就 完 成 了 。在 完 成 程 序 的 过 程 中 , 我 也 碰 到 了 很 多 问 题 , 函 数 误 用 , 调 用 指 针 不 明 确 ,还 有 一 些 细 小 的 问 题 , 所 以 以 后 的 实 验 过 程 中 我 会 更 加 仔 细 。附 录 : 程 序 清 单 及 源 程 序#include#include#include#include #include #define NULL 0
12、#define LEN sizeof(StudentNode)typedef struct St1 char IDNumber16; /*学 号 */char FamilyName16; /*姓 */char GivenName16; /*名 */int sex; /*性 别 ( 0 代 表 “ 女 ” , 1 代 表 “ 男 ” ) */int BirthYear; /*出 生 年 */int BirthMonth; /*出 生 月 */int BirthDay; /*出 生 日 */float score4; /*成 绩 */float sum; /*总 分 */float average
13、; /*平 均 分 */struct St1 *next;StudentNode;int n,m;char mima12;/*密 码 验 证 */void paw() int k,i,p=0;char c;system(“cls“);printf(“nnnn“);printf(“t“);for(k=0;k=3) printf(“nntt - 输 入 密 码 错 误 超 过 3 次 ,自 动退 出 程 序 ! 密 码 错 误 %d 次 ,请 重 新 输 入 ! 密 码 :“);for(i = 0; i IDNumber,p1-sum=p1-score0+p1-score1+p1-score2+p
14、1-score3;p1-average=p1-sum/4;head=NULL;while(strcmp(p1-IDNumber,“0“)while(p1-BirthYearBirthMonth12|p1-BirthMonthsex!=1n=n+1;if(n=2)head=p1;else p2-next=p1;p2=p1;p1=(StudentNode *)malloc(LEN);printf(“t “);scanf(“%s %s %s %d %d %d %d %f %f %f %f“,p1-sum=p1-score0+p1-score1+p1-score2+p1-score3; p1-aver
15、age=p1-sum/4;p2-next=NULL;return(head);/*输 出 学 生 信 息 */void print(StudentNode *head) system(“cls“);printf(“nn*欢 迎 使 用 学 生 成 绩 管理 系 统 *nn“);StudentNode *p;printf(“t n“);printf(“t 学 号 姓 名 性 别 出 生 日 期 外 语 成绩 高 数 成 绩 C 语 言 成 绩 马 哲 成 绩 平 均 成 绩 总 成 绩 n“);printf(“t n“);p=head;if(head!=NULL)doprintf(“t %-8s
16、 %1s%st %-6d %4d/%2d/%2d %-8.2f %-8.2f %-10.2f %-8.2f %-8.2f %-6.2f n“,p-IDNumber,p-FamilyName,p-GivenName,p-sex,p-BirthYear,p-BirthMonth,p-BirthDay,p-score0,p-score1,p-score2,p-score3,p-average,p-sum);printf(“t n“); p=p-next;while(p!=NULL);printf(“t n“);system(“pause“);/*按 平 均 分 排 序 */void comp(Stu
17、dentNode *p) system(“cls“);StudentNode t,*p2;StudentNode *p0,*p1;p0=p;while(p0-next!=NULL) p1=p0-next;while(p1!=NULL) if(p0-averagep1-average) t=*p1;*p1=*p0;*p0=t;p2=p1-next;p1-next=p0-next;p0-next=p2;p1=(p1-next);p0=p0-next;print(p);/*删 除 学 生 信 息 */StudentNode *del(StudentNode *head) system(“cls“);
18、StudentNode *p1,*p2;char del_no16;printf(“nntt*欢 迎 使 用 学 生 成 绩 管 理 系 统*nn“);printf(“ttt提 示 : 输 入 0 结 束 当 前 操 作 nn“);printf(“tt要 删 除 学 生 的 学 号 : “);scanf(“%s“,while(strcmp(del_no,“0“) if(head=NULL)printf(“n 无 信 息 n“);return head;p1=head;while(strcmp(del_no,p1-IDNumber)p1=p1-next;if(!strcmp(del_no,p1-
19、IDNumber) if(p1=head)head=p1-next;else p2-next=p1-next;n=n-1;printf(“删 除 成 功 ! n“);else printf(“n 没 找 到 此 学 生 信 息 n“);printf(“tt要 删 除 学 生 的 学 号 : “);scanf(“%s“,return(head);/*添 加 学 生 信 息 */StudentNode *insert(StudentNode *head) system(“cls“);printf(“nntt*欢 迎 使 用 学 生 成 绩 管 理 系 统*nn“);StudentNode *p,*
20、p0;printf(“ttt提 示 : 输 入 0 结 束 当 前 操 作 nn“);printf(“ttt请 输 入 要 添 加 的 信 息 nn“);printf(“t (学 号 ,姓 ,名 ,性 别 ,出 生 年 ,出 生 月 ,出 生 日 ,外 语成 绩 ,高 数 成 绩 ,C 语 言 成 绩 ,马 哲 成 绩 )n“);p=(StudentNode *)malloc(LEN);printf(“t “);scanf(“%s %s %s %d %d %d %d %f %f %f %f“,p-sum=p-score0+p-score1+p-score2+p-score3;p-average
21、=p-sum/4;while(strcmp(p-IDNumber,“0“) if(head=NULL) head=p;p-next=NULL;else p0=head;head=p;p-next=p0;while(p-BirthYearBirthMonth12|p-BirthMonthsex!=1 n=n+1;p=(StudentNode *)malloc(LEN);printf(“t “);scanf(“%s %s %s %d %d %d %d %f %f %f %f“,p-sum=p-score0+p-score1+p-score2+p-score3;p-average=p-sum/4;r
22、eturn(head);/*查 询 学 生 信 息 */void select(StudentNode *head) system(“cls“);char name16;int k=0;StudentNode *p;printf(“nntt*欢 迎 使 用 学 生 成 绩 管 理 系 统*nn“);printf(“tt请 输 入 要 查 询 的 学 生 的 姓 : “);scanf(“%s“,p=head;printf(“tt( 学 号 ,姓 名 ,性 别 ,出 生 日 期 ,外 语 成 绩 ,高 数 成 绩 ,C语 言 成 绩 ,马 哲 成 绩 ,平 均 成 绩 ,总 成 绩 ) n“);w
23、hile(p!=NULL) if(!strcmp(name,p-FamilyName)printf(“tt“);printf(“%-6st%s%st%-6dt%4d/%2d/%2dt%-6.2f%-6.2f%-6.2f%-6.2ft%-6.2ft%-6.2fn“,p-IDNumber,p-FamilyName,p-GivenName,p-sex,p-BirthYear,p-BirthMonth,p-BirthDay,p-score0,p-score1,p-score2,p-score3,p-average,p-sum);k=1;p=p-next;if(k=0) printf(“输 入 的 姓
24、氏 不 存 在 , 请 重 新 输 入 另 一 个 姓 氏 “);system(“pause“);select(head);system(“pause“);/*保 存 到 文 件 */void file_wri(StudentNode *p) char file20;printf(“请 输 入 保 存 文 件 名 称 : “);scanf(“%s“,file);FILE *fp;if(fp=fopen(file,“w+“)=NULL)printf(“cannot open filen“);exit(0);while(p!=NULL) /fwrite(p,sizeof(StudentNode),
25、1,fp);fprintf(fp,“%s %s %s %d %d %d %d %f %f %f %f %f %fn“,p-IDNumber,p-FamilyName,p-GivenName,p-sex,p-BirthYear,p-BirthMonth,p-BirthDay,p-score0,p-score1,p-score2,p-score3,p-average,p-sum);p=p-next;fclose(fp);/*从 文 件 中 读 出 数 据 */StudentNode *file_rea() char file20;int a=0;printf(“请 输 入 载 入 文 件 的 名
26、称 : “);scanf(“%s“,file);FILE *fp;int n=1;StudentNode *p0=NULL,*p,*head;if(fp=fopen(file,“r+“)=NULL)printf(“cannot open filen“);exit(0);while(!feof(fp) /fread(p,sizeof(StudentNode),1,fp);if(n=1) head=p=(StudentNode *)malloc(LEN);else p0=p;p=(StudentNode *)malloc(LEN);p0-next=p;fscanf(fp,“%s%s%s%d%d%d%d%f%f%f%f%f%f“,n+;p0-next=NULL;fclose(fp);