学生成绩管理项目

程序设计课程设计报告书

题目 : “学生成绩管理”的设计与实现
学院 : 信息工程学院
班级 : 软件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 _personh

void 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);
}

猜你喜欢

转载自blog.51cto.com/14301832/2382972
今日推荐