本文共 9481 字,大约阅读时间需要 31 分钟。
程序设计课程设计报告书
题目 : “学生成绩管理”的设计与实现
学院 : 信息工程学院班级 : 软件Q1841班学号 : 18130216作者 : 华书磊指导老师 : 李 祥二〇一八年四月二十六日
目 录
第1章 需求分析 1一、 市场需求 1第2章 功能介绍 2一、 成绩添加及显示 2二、 查找或修改个人成绩 2第3章 总体设计 3一、 结构框架 3二、 功能的实现 3总 结 6附 录 1第1章需求分析
一、市场需求1.学生成绩管理项目具备极大的市场需求,许多学校都需要这样一个项目来统计学生的成绩情况,本软件,本项目属于极简单式操作项目,可行性比较大,容易上手,市场需求量大。第2章功能介绍
一、成绩添加及显示1.成绩的添加1)成绩的添加是按照菜单的形式进行。2)输入成绩极其简便,只需按照项目所给内容一步一步地输入即可。2.成绩的显示1)成绩的显示也是在菜单上进行。2)显示出来的程序是按总分的降幂排列。二、查找或修改个人成绩1.查找个人成绩1)查找时只需输入学号即可显示相对于的成绩(因为学号是唯一的)。2.修改个人成绩1)修改时按照步骤进行,先输入对应的学号,输入完毕后就显示出相对应的成绩,然后按照菜单进行修改。第3章总体设计一、结构框架1.单链表的储存方式1)由于每个人的信息量太大,本项目采用单链表的储存结构,防止每次的数据交换,动用指针而不动数据,使得排序更加快捷。二、功能的实现1.主函数的构建1)主函数采取菜单的模式进行构建,使得项目形成一个整体。2.功能函数的添加1)在基本框架都构建完成后进行功能函数的添加。2)功能的添加基于对广大使用者的需求并后期进行维护升级。总 结做项目时,首先进行结构体的选择,选择了单链表储存结构。对于单链表储存结构进行编写,
打算先把“龙骨架”搭建完毕,然后再向其中添加“血肉”,即把大致结构框架搭建完毕再向其
添加功能函数,在搭建结构体的过程中出现了很多问题,许多的编译出错,但经过不懈的努力
之后,这些错误都一一找尽,终于完成了一个只包含输入和输出的单链表“骨架”,在骨架完工
后,便在其中又慢慢的添加功能性函数,函数的添加远远比骨架的搭建轻松,添加好一系列函
数后,程序也调通了,最后再弄文件,在读写文件时出现了一个错误,就是每次存入txt文件再
显示个人成绩后多了一项混乱的数据,经过几番检查后发现txt文件的最后有一个空格,我猜想
应该是那个空格影响了数据,就把fprintf里面的换行用if-else进行选择,解决了多出一项混乱
数据的问题。最终项目圆满完成。
附 录程序清单Main.c#include <stdio.h>#include <stdlib.h>#include <conio.h>#include "Grade.h"int main()
{ int id, t, x; // 学号,索引号 PERSON person;GRADE grade;char choice;char filename[1000] = "MyFile.txt";GradeCreate(&grade);GradeRead(filename, &grade);system("color f0");do{ system("cls"); printf("A-添加 S-显示 F-查找 M-修改 Q-退出 > "); scanf(" %c", &choice); choice = toupper(choice); switch (choice) { case 'A': printf("添加:\n"); PersonInput(&person); GradeAppend(&grade,&person); break; case 'S': if (grade.head->next != NULL) { GradeSort(&grade); printf("学号 姓名 语文 数学 英语 物理 化学 生物 总分\n"); } GradeOutput(&grade); getch(); break; case 'F': printf("请输入学号:"); scanf(" %d", &id); t = GradeFind(&grade, id); GradeOutputPerson(&grade, t); getch(); break; case 'M': printf("请输入学号:"); scanf(" %d", &id); t = GradeFind(&grade, id); GradeOutputPerson(&grade, t); GradeModify(&grade, t); case 'Q': break; default: printf("错误的操作!!!\n"); }}while (choice != 'Q');GradeWrite(filename, &grade);GradeDestroy(&grade);return 0;
}
Grade.h#ifndef _Gradeh#define _Gradeh#include "Person.h"
// 定义成绩表(单链表)类型
typedef struct{ int length;// 头指针PERSON *head;}GRADE;// 创建成绩表
void GradeCreate(GRADE grade);// 清空成绩表 void GradeClear(GRADE grade);// 销毁成绩表void GradeDestroy(GRADE grade);// 显示成绩表void GradeOutput(const GRADE grade);// 添加学生信息void GradeAppend(GRADE grade, const PERSON person);// 写成绩表void GradeWrite(const char filename, const GRADE grade);// 读成绩单void GradeRead(const char filename, GRADE grade);// 查找个人学号查询 int GradeFind(const GRADE grade, const int id);// 输出个人信息void GradeOutputPerson(const GRADE grade, int x);//排序void GradeSort(GRADE grade);//修改void GradeModify(GRADE grade, int x);#endif
Grade.c#include <stdio.h>#include <stdlib.h>#include <string.h>#include "Grade.h"// 创建成绩表
void GradeCreate(GRADE grade){ grade->head = (PERSON)malloc(sizeof(PERSON));grade->length = 0;grade->head->next = NULL;}// 清空成绩表 void GradeClear(GRADE grade){ PERSON p;while (grade->head->next){ p = grade->head->next;grade->head->next = p->next;free(p);}grade->length = 0;}// 销毁成绩表void GradeDestroy(GRADE grade){ GradeClear(grade);free(grade->head);grade->head = NULL;grade->length = 0;}// 显示成绩表void GradeOutput(const GRADE grade){ PERSON p = grade->head->next;if (p){ while (p){ PersonOutput(p);p = p->next;}}else{ puts("目前还没上传成绩,请等待教务处通知^_^");} }// 添加学生信息void GradeAppend(GRADE grade, const PERSON person){ PERSON s;s = (PERSON*)malloc(sizeof(PERSON));s->id = person->id;strcpy(s->name,person->name);s->math = person->math;s->chinese = person->chinese;s->english = person->english;s->physics = person->physics;s->chemistry = person->chemistry;s->biology = person->biology;s->sum = person->sum;s->next = grade->head->next;grade->head->next = s;grade->length++;}// 写成绩表
void GradeWrite(const char filename, const GRADE grade){ PERSON p = grade->head->next;FILE file = fopen(filename, "w");if (file){ fprintf(file, "%d\n", grade->length);while (p){ PersonWrite(file, p);p = p->next;}fclose(file);}}// 读成绩单
void GradeRead(const char filename, GRADE grade){ PERSON p, q;FILE file = fopen(filename, "r");q = grade->head;if (file){ fscanf(file, "%d%c", &grade->length);while (!feof(file)){ p = (PERSON)malloc(sizeof(PERSON));PersonRead(file, p);p->next = q->next;q->next = p;q = q->next;}q->next = NULL;fclose(file);}}// 查找个人学号 int GradeFind(const GRADE grade, const int id){ int k = 0, loop = 1;PERSON *p = grade->head->next;while (p && loop){ if (p->id == id){ loop = 0;}k++;p = p->next;}k = k <= grade->length ? k : 0;return k;}// 输出个人信息
void GradeOutputPerson(const GRADE grade, int x){ int i;PERSON p = grade->head;for (i = 0; i < x; i++){ p = p->next; }PersonOutput(p);}//排序void GradeSort(GRADE grade){ PERSON h = grade->head->next, s, p, q;grade->head->next = NULL;while (h){ s = h;h = s->next;p = grade->head;q = p->next;while (q && s->sum < q->sum){ p = q;q = p->next;}p->next = s;s->next = q;}}//修改void GradeModify(GRADE grade, int x){ int i;PERSON *p = grade->head;for (i = 0; i < x; i++){ p = p->next; }PersonModify(p);}Person.h#ifndef _Personh#define _personhvoid SelectAll();
void SelectId();void SelectChinese();void SelectMath();void SelectEnglish();void SelectPhysics();void SelectChemistry();void SelectBiology();void SelectSum();int SelectCol();// 定义单链表结点类型
typedef struct PERSON{ // 数据域int id; //学号 char name[16]; // 姓名 int chinese, math, english, physics, chemistry, biology; // 学科 int sum;//总分 // 指针域struct PERSON *next;}PERSON;//输入个人
void PersonInput(PERSON person);//输出个人void PersonOutput(const PERSON person); // 写个人成绩void PersonWrite(FILE file, const PERSON person);// 读个人成绩void PersonRead(FILE file, PERSON person);//修改个人数据 void PersonModify(PERSON *person);#endif
Person.c#ifndef#include <stdio.h>#include <string.h>#include "Person.h"static int col;
void SelectAll()
{ col = 0;}void SelectId()
{ col = 1;}void SelectChinese()
{ col = 2;}void SelectMath()
{ col = 3;}void SelectEnglish()
{ col = 4;}void SelectPhysics()
{ col = 5;}void SelectChemistry()
{ col = 6;}void SelectBiology()
{ col = 7;}void SelectSum()
{ col = 8;}int SelectCol()
{ int t;printf("1-学号 2-语文 3-数学 4-英语 5-物理 6-化学 7-生物 8-总分 > ");scanf(" %d", &t);if (t > 0 && t < 9){ col = t;}}//输入个人成绩 void PersonInput(PERSON person){ printf("学号:");scanf("%d%c", &person->id);printf("姓名:");gets(person->name);printf("语文分数:");scanf("%d%c", &person->chinese);printf("数学分数:");scanf("%d%c", &person->math);printf("英语分数:");scanf("%d%c", &person->english);printf("物理分数:");scanf("%d%c", &person->physics);printf("化学分数:");scanf("%d%c", &person->chemistry);printf("生物分数:");scanf("%d%c", &person->biology);person->sum = person->chinese + person->math + person->english + person->physics + person->biology + person->chemistry;}//输出个人成绩
void PersonOutput(const PERSON *person){ printf("%-6d %-6s %-3d %-3d %-3d %-3d %-3d %-3d %-3d\n", person->id, person->name, person->chinese, person->math, person->english, person->physics, person->chemistry, person->biology, person->sum);}// 写个人成绩
void PersonWrite(FILE file, const PERSON person){ fprintf(file, "%d\n", person->id);fprintf(file, "%s\n", person->name);fprintf(file, "%d\n",person->chinese);fprintf(file, "%d\n",person->math);fprintf(file, "%d\n",person->english);fprintf(file, "%d\n",person->physics);fprintf(file, "%d\n",person->chemistry);fprintf(file, "%d\n",person->biology);if (person->next != NULL){ fprintf(file, "%d\n",person->sum);}else{ fprintf(file, "%d",person->sum);}}// 读个人成绩
void PersonRead(FILE file, PERSON person){ int n;char s[1000];fscanf(file, "%d%c", &person->id);fgets(s, 1000, file);n = strlen(s);s[n - 1] = '\0';strcpy(person->name, s);fscanf(file, "%d%c", &person->chinese);fscanf(file, "%d%c", &person->math);fscanf(file, "%d%c", &person->english);fscanf(file, "%d%c", &person->physics);fscanf(file, "%d%c", &person->chemistry);fscanf(file, "%d%*c", &person->biology);fscanf(file, "%d", &person->sum);}//修改个人数据
void PersonModify(PERSON person){ int t;do{ printf("1-学号 2-语文 3-数学 4-英语 5-物理 6-化学 7-生物 8-姓名 0-退出 > \n请输入修改信息的代号:");scanf(" %d", &t);if (t >= 0 && t <= 8){ switch (t){ case 1:printf("学号修改为:");scanf(" %d%c", &person->id);break;case 2:printf("语文成绩修改为:");scanf(" %d%c", &person->chinese);break;case 3:printf("数学成绩修改为:");scanf(" %d%c", &person->math);break;case 4:printf("英语成绩修改为:");scanf(" %d%c", &person->english);break;case 5:printf("物理成绩修改为:");scanf(" %d%c", &person->physics);break;case 6:printf("化学成绩修改为:");scanf(" %d%c", &person->chemistry);break;case 7:printf("生物成绩修改为:");scanf(" %d%c", &person->biology);break;case 8:printf("姓名修改为:");gets(person->name);}person->sum = person->chinese + person->math + person->english + person->physics + person->biology + person->chemistry;}else{ puts("请输入正确的代号^_^");}}while (t != 0);}转载于:https://blog.51cto.com/14301832/2382972