1、 C语言程序设计训练报告 姓 名: 李康 班 级: 电子13-1 学 号: 13034520123 指 导 教 师: 姚明 设 计 时 间:2014.6.23-2014.6.27 广东石油化工学院计算机与电子信息学院 目 录 一.训练目的 7 二.训练题目描述和
2、要求 7 三.训练报告内容 8 3.1需求分析 8 3.2 概要设计 8 3.3 详细设计 8 3.4 主要源程序代码 8 3.5 测试分析 9 3.6 设计结果 9 四.结论与心得 9 一.训练目的 (报告正文部分): (要求:正文部分一律用小四号字,宋体,1.5倍行距。) 1、通过本次课程设计,锻炼我们应用C语言的语法规则和已经掌握的一些较为简单的算法,自己解决一个较简单的课题,初步积累编程经验。 2、通过学习掌握程序设计的方法与编程技术,学会良好的程序设计风格,为计算机在不同领域的应用打下坚实的基础。
3、 二.训练题目描述和要求 题目:学生成绩管理系统 应用链表及外部文件,独立设计上述应用系统,并编程实现以下功能: ① 信息录入 录入学生信息(包括姓名、学号、各科成绩)。 ② 信息查询 输入学号,查询与学号相对应的信息(包括成绩),并按可选的自定义规则进行排序。 按班级查询学生成绩。 按班级统计学科总分、平均分等。 ③ 信息删除与修改 输入学号,删除该学号对应的成绩信息。 输入学号,查询并显示出该学号信息,并在此基础上进行修改。 ④ 计算学生成绩 计算每位学生的总分。 计算每位学生的平均分。 成绩排序。 ⑤信息保存 将学
4、生信息保存在文件中。
⑥根据以上功能需求,定义通讯录信息结构,并采用链表结构对数据进行存储。
⑦提供友好的用户界面,方便用户操作。
三.训练报告内容
3.1需求分析
3.2 概要设计
3.3 详细设计
3.4 主要源程序代码
3.5 测试分析
3.6 设计结果
#include
5、lude
6、Date;//学生基本信息 typedef struct student { char name[20];//学生姓名 StudentDate one;//学生其他信息 int rank;//成绩排名 struct student *next; }Student, *List; Student *startCheck(void);//开始检查 Student *createListHead(void);//创建链表的头 void menu(void);//主菜单 void sortList(Student *pHead);//排序链表 void readLi
7、stWithFile(Student *pHead, char *file_name);//从文件中读取数据,并保存在链表中 void sorttList(Student *pHead);//排序链表 int userChioce(Student *pHead);//用户选择 int sortMenu(void);//打印选择菜单 void passwordCheck(void);//密码检测 void correctWord(void);//修改密码 void addStudentInfo(Student *pHead);//向链表的末尾添加数据 int scanMenu(vo
8、id);//浏览菜单 void findStudentInfo(Student *pHead);//查找学生信息 void delStudentInfo(Student *pHead);//删除某一个学生信息 void alterStudentInfo(Student *pHead);//修改学生信息 void saveList(Student *pHead);//将链表保存在文件里 void printList(Student *pHead);//打印链表 void statisStudentInfo(Student *pHead);//查看学生信息 int statisMen
9、u(void);//查看菜单 void gotoxy(int x, int y);//改变光标位置函数 void inputData(Student *pHead, Student *node);//输入信息,并检测是否合法 int main(void) { Student *pHead; HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);//得到窗口句柄 SMALL_RECT rc = { 0, 0, 94 - 1, 30 - 1 }; //{Y位置,X位置,宽,高} SetConsoleWindowInfo(h
10、Out, true, &rc);// 重置窗口位置和大小 system("color 5B");//设置控制台颜色 pHead = startCheck();//读取信息 while (1) { if (9 == userChioce(pHead)) //按9时退出系统 { break; } } return 0; } void menu(void) { system("CLS");//清屏 printf("\n\n\n\t\t\t\t┌─────────────────┐\n"); printf("\t\t
11、\t\t│ 学生成绩统计系统 │\n"); printf("\t\t\t\t├─────────────────┤\n"); printf("\t\t\t\t│ 1 增加学生记录 │\n"); printf("\t\t\t\t├─────────────────┤\n"); printf("\t\t\t\t│ 2 删除学生记录 │\n"); printf("\t\t\t\t├─────────────────┤\n"); printf("\t\t\t\t│
12、 3 修改学生记录 │\n"); printf("\t\t\t\t├─────────────────┤\n"); printf("\t\t\t\t│ 4 查找学生信息 │\n"); printf("\t\t\t\t├─────────────────┤\n"); printf("\t\t\t\t│ 5 统计学生成绩 │\n"); printf("\t\t\t\t├─────────────────┤\n"); printf("\t\t\t\t│ 6 查看
13、学生成绩 │\n"); printf("\t\t\t\t├─────────────────┤\n"); printf("\t\t\t\t│ 7 修改登陆密码 │\n"); printf("\t\t\t\t├─────────────────┤\n"); printf("\t\t\t\t│ 8 关于 │\n"); printf("\t\t\t\t├─────────────────┤\n"); printf("\t\t\t\t│ 9 退出系统
14、 │\n"); printf("\t\t\t\t└─────────────────┘\n"); } void gotoxy(int x, int y)//x为列坐标,y为行坐标 { COORD pos = { x, y }; HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hOut, pos); } Student *startCheck(void) { Student *pHead; FILE *fp1; char passwo
15、rd[20] = "123456"; int i; if ((fp1 = fopen("password.dat", "rb")) == NULL)//若密码文件不存在,新建密码文件 { fp1 = fopen("password.dat", "wb"); fwrite(password, 20, 1, fp1); fclose(fp1); printf("密码初始化完成!(默认密码为:123456)"); passwordCheck(); } else { passwordCheck(); } //读条 system
16、"CLS"); system("title 学生成绩统计系统-载入中");//将标题栏命名为“学生成绩统计系统” printf("\n\n\t\t\t欢迎进入本系统!正在载入....."); printf("\n\n\n\n\t\t\t┏━━━━━━━━━━┓\n"); printf("\t\t\t┃ ┃\n"); printf("\t\t\t┗━━━━━━━━━━┛\n"); gotoxy(26, 7); for ( i = 0; i < 10; i++) { printf("█"); Sleep(100);
17、 } pHead = createListHead(); readListWithFile(pHead, "stud.dat"); return pHead; } Student *createListHead(void) { Student *pHead; pHead = (List)malloc(sizeof(Student)); pHead->next = NULL; return pHead; } void readListWithFile(Student *pHead, char *file_name) { FI
18、LE *fp; Student *p1, *p2; int count, rank = 0; StudentDate dat; char stu_name[20]; fp = fopen(file_name, "r"); if (fp == NULL) { fp = fopen(file_name, "w"); fclose(fp); return; } fseek(fp, 0L, 2); count = ftell(fp); p1 = pHead; fp = fopen(file_name, "r"); while (
19、feof(fp)) { p2 = (List)malloc(sizeof(Student)); fscanf(fp, "%d%s %c%f%f%f%f%f\n", &p2->one.num, p2->name, &p2->one.sex, &p2->one.chin_score, &p2->one.math_score, &p2->one.engl_score, &p2->one.chem_score, &p2->one.phy_score); p2->one.sum_score = (double)(p2->one.chin_score + p2->one.c
20、hin_score + p2->one.engl_score + p2->one.chem_score + p2->one.phy_score); p2->one.aver_score = p2->one.sum_score / 5; p2->next = NULL; p1->next = p2; p1 = p2; if (ftell(fp) == count) { break; } } //将链表排序,并初始化排名 for (p1 = pHead->next; p1 != NULL; p1 = p1->next) {
21、 for (p2 = p1->next; p2 != NULL; p2 = p2->next) { if (p2->one.aver_score > p1->one.aver_score) { dat = p2->one; strcpy(stu_name, p2->name); p2->one = p1->one; strcpy(p2->name, p1->name); p1->one = dat; strcpy(p1->name, stu_name); } } p1->rank = ++
22、rank; } fclose(fp); } void sortList(Student *pHead) { Student *p1, *p2; StudentDate dat; char stu_name[20]; int bum, count = 0, rank; system("title 学生成绩统计系统-查看");//将标题栏命名为“学生成绩统计系统” bum = sortMenu(); if (bum == 1)//按平均分高低排序 { for (p1 = pHead->next; p1 != NULL; p1 = p1->
23、next) { for (p2 = p1->next; p2 != NULL; p2 = p2->next) { if (p2->one.aver_score > p1->one.aver_score) { dat = p2->one; rank = p2->rank; strcpy(stu_name, p2->name); p2->one = p1->one; p2->rank = p1->rank; strcpy(p2->name, p1->name); p1->o
24、ne = dat; p1->rank = rank; strcpy(p1->name, stu_name); } } } } else { if (bum == 2)//按学号高低排序 { for (p1 = pHead->next; p1 != NULL; p1 = p1->next) { for (p2 = p1->next; p2 != NULL; p2 = p2->next) { if (p2->one.num < p1->one.num) {
25、 dat = p2->one; rank = p2->rank; strcpy(stu_name, p2->name); p2->one = p1->one; p2->rank = p1->rank; strcpy(p2->name, p1->name); p1->one = dat; p1->rank = rank; strcpy(p1->name, stu_name); } } } } else { if (bum ==
26、3) { return; } else { sortList(pHead); } } } printList(pHead); } void printList(Student *pHead) { int count = 0; pHead = pHead->next; system("CLS"); printf("\t\t\t\t计科6班成绩!"); printf("\n\n ┏━━━┳━━━━┳━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━┓"); printf("
27、\n ┃ 学号 ┃ 姓 名 ┃性别┃语 文┃数 学┃英 语┃化 学┃物 理┃平均分┃总 分┃名次┃\n"); while (pHead) { printf(" ┣━━━╋━━━━╋━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━┫\n"); printf(" ┃ %-5d┃ %-6s ┃ %c ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃ %-3d┃\n", pHead->one.num, pHead->name, pHead->one.sex, pHead->one.
28、chin_score, pHead->one.math_score, pHead->one.engl_score, pHead->one.chem_score , pHead->one.phy_score, pHead->one.aver_score, pHead->one.sum_score, pHead->rank); pHead = pHead->next; count++; } printf(" ┗━━━┻━━━━┻━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━┛\n"); printf("\t\t\t该班一共%d个人!"
29、 count); getch(); } int userChioce(Student *pHead) { int bum; system("title 学生成绩统计系统-主菜单");//将标题栏命名为“学生成绩统计系统” menu(); printf("请按键选择: "); bum = (int)(getch() - '0'); switch (bum) { case 1: addStudentInfo(pHead); break; case 2: delStudentInfo(pHead); break; c
30、ase 3: alterStudentInfo(pHead); break; case 4: findStudentInfo(pHead); break; case 5: statisStudentInfo(pHead); break; case 9: break; case 6: sortList(pHead); break; case 7: correctWord(); break; case 8: MessageBox(NULL, TEXT("特性:进入系统需输入密码,可以修改密码;展示学生信
31、息时,以表格的方式呈现;输入学生信息时,不能输入已存在的学号;以链表、文件为基础;作者:HappyBeers"), TEXT("关于"), MB_OK); break; default: break; } return bum; } int sortMenu(void) { int bum; system("CLS"); printf("\n\n\n"); printf("\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n"); printf("\t\t┃ 以什么
32、方式查询 ? ┃\n"); printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n"); printf("\t\t┃ 1 按成绩的高低 ┃\n"); printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n"); printf("\t\t┃ 2 按学号的升次 ┃\n"); printf("\t\t┣━━━━
33、━━━━━━━━━━━━━━━━━━━━━━━━━┫\n"); printf("\t\t┃ 3 返回主菜单 ┃\n"); printf("\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n"); printf("请按键选择:"); bum = (int)(getch() - '0'); system("CLS"); return bum; } void passwordCheck(void) { char password[20], inpu
34、tword[20]; int i = 0, j = 0; char c = 0; FILE *fp = fopen("password.dat", "rb"); system("title 学生成绩统计系统-密码输入");//将标题栏命名为“学生成绩统计系统” fread(password, 20, 1, fp); for (i = 0; i < 5; i++) { j = 0; printf("\n\n\n\t\t你还有%d次机会输入正确密码: ", 3-i); printf("\n\n\n\n\t\t\t┏━━━━━━━━┓\n");
35、 printf("\t\t\t┃ ┃\n"); printf("\t\t\t┗━━━━━━━━┛\n"); gotoxy(26, 8); while ((c = getch()) != 13 && j < 20) { if (c == '\b' && j >0) { putchar('\b'); putchar(' '); putchar('\b'); j--; } else { if (isprint(c))//isprint为检测C是否为可打印的函
36、数 { putchar('*'); inputword[j] = c; j++; } } } inputword[j] = '\0'; if (strcmp(inputword, password) == 0) { return; } else { system("CLS"); printf("\t\t\t密码输入错误"); } } if (5 == i) { system("CLS"); printf("\n\n\n\t\t你已浪费
37、所有机会!程序即将退出!"); Sleep(2000); exit(0); } fclose(fp); system("CLS"); return; } void correctWord(void) { char password[20]; FILE *fp; int i = 0; char c; system("title 学生成绩统计系统-修改密码");//将标题栏命名为“学生成绩统计系统” system("CLS"); printf("\n\n\n\n\t\t\t请输入新的密码:"); while ((c
38、 getch()) != 13 && i < 20) { if (c == '\b'&&i > 0) { putchar('\b'); putchar(' '); putchar('\b'); i--; } else { if (isprint(c))//isprint为检测C是否为可打印的函数 { putchar('*'); password[i] = c; i++; } } } password[i] = '\0'; printf("\n\t\t\t
39、是否将密码修改为<%s>? Y or N:", password); c = getch(); if (c == 'Y' || c == 'y') { fp = fopen("password.dat", "wb"); fwrite(password, 20, 1, fp); fclose(fp); printf("\n\t\t\t修改成功!\n"); } else { return; } getch(); } void addStudentInfo(Student *pHead) { FILE *fp; Stud
40、ent *p1, *p2, *p3 = pHead; StudentDate dat; int judge = YES, rank = 0; char bum, stu_name[20]; system("title 学生成绩统计系统-添加");//将标题栏命名为“学生成绩统计系统” fp = fopen("stud.dat", "a"); while (pHead->next) { pHead = pHead->next; } while (judge) { p1 = (List)malloc(sizeof(Student));
41、 inputData(p3, p1); p1->next = NULL; pHead->next = p1; pHead = p1; fprintf(fp, "%d %s %c %.1f %.1f %.1f %.1f %.1f\n", p1->one.num, p1->name, p1->one.sex, p1->one.chin_score, p1->one.math_score, p1->one.engl_score, p1->one.chem_score, p1->one.phy_score); printf("是否继续添加?(Y/N)");
42、 bum = getch(); if (bum == 'n' || bum == 'N') { break; } } //并交换排名 for (p1 = p3->next; p1 != NULL; p1 = p1->next) { for (p2 = p1->next; p2 != NULL; p2 = p2->next) { if (p2->one.aver_score > p1->one.aver_score) { dat = p2->one; strcpy(stu_name, p2->n
43、ame); p2->one = p1->one; strcpy(p2->name, p1->name); p1->one = dat; strcpy(p1->name, stu_name); } } p1->rank = ++rank; } fclose(fp); } int scanMenu(void) { int bum; system("CLS"); printf("\n\n\n"); printf("\t\t┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓\n"); pr
44、intf("\t\t┃ 以什么方式查询 ? ┃\n"); printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n"); printf("\t\t┃ 1 按学生的学号 ┃\n"); printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n"); printf("\t\t┃ 2 按学生的姓名
45、 ┃\n"); printf("\t\t┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫\n"); printf("\t\t┃ 3 返回主菜单 ┃\n"); printf("\t\t┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛\n"); printf("请按键选择:"); bum = (int)(getch() - '0'); system("CLS"); return bum; } void findStudent
46、Info(Student *pHead) { int bum, count = 0; int num; char student_name[20]; pHead = pHead->next; system("title 学生成绩统计系统-查找");//将标题栏命名为“学生成绩统计系统” bum = scanMenu(); if (bum == 1) { printf("请输入学生的学号:"); scanf("%d", &num); while (pHead) { if (pHead->one.num == num)
47、{ if (count == 0) { printf("\n\t\t\t已经查到!\n"); printf("\n\n\n\n ┏━━━┳━━━━┳━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━┓"); printf("\n ┃ 学号 ┃ 姓 名 ┃性别┃语 文┃数 学┃英 语┃化 学┃物 理┃平均分┃总 分┃名次┃\n"); count = 1; } printf(" ┣━━━╋━━━━╋━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━━╋━━┫\n");
48、 printf(" ┃ %-5d┃ %-6s ┃ %c ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃%5.1f ┃ %-3d┃\n", pHead->one.num, pHead->name, pHead->one.sex, pHead->one.chin_score, pHead->one.math_score, pHead->one.engl_score, pHead->one.chem_score , pHead->one.phy_score, pHead->one.aver_score, pHe
49、ad->one.sum_score, pHead->rank); break; } pHead = pHead->next; } if (pHead == NULL) { printf("\n\t\t\t没有该学生记录!\n"); } else { printf(" ┗━━━┻━━━━┻━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━━┻━━┛\n"); } } else { if (bum == 2) { printf("请输入学生姓名:"); scanf(
50、"%s", student_name); while (pHead) { if (strcmp(student_name, pHead->name) == 0) { if (count == 0) { printf("\n\t\t\t已经查到!\n"); printf("\n\n\n\n ┏━━━┳━━━━┳━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━━┳━━┓"); printf("\n ┃ 学号 ┃ 姓 名 ┃性别┃语 文┃数 学┃英 语┃化 学┃物 理┃平均






