成绩记录簿课程设计报告 - 范文中心

成绩记录簿课程设计报告

03/09

课程设计报告

课程名称 程序设计基础C 语言

设计题目 成绩记录簿

姓 名 杨国俊 专 业 计算机工程 班 级 学 号 指导教师 日期 2012.6.25 ~7.6

目录

一、目的及要求............................................................................................................................... 4 二、课程设计内容........................................................................................................................... 4 三、总体设计................................................................................................................................... 5

3.1 功能模块设计 . ................................................................................................................... 5

3.1.1成绩记录簿执行的主流程 . ................................................................................... 5 3.1.2输入信息模块 . ....................................................................................................... 5 3.1.3修改成绩模块 . ....................................................................................................... 6 3.1.4删除模块 . ............................................................................................................... 6 3.1.5查学生成绩模块 . ................................................................................................... 6 3.1.6查班成绩表模块 . ................................................................................................... 6 3.1.7入文件模块 . ........................................................................................................... 6 3.1.8取文件模块 . ........................................................................................................... 6 3.1.9出模块。 . ............................................................................................................... 7 3.2数据结构设计 . .................................................................................................................... 9

3.2.1 stu 结构体 ............................................................................................................... 9 3.2.2 全局变量 . ................................................................................................................ 9 3.3 函数功能描述 . ................................................................................................................. 10

1)init() . .......................................................................................................................... 10 2)input_list() ................................................................................................................. 10 3)insert() ....................................................................................................................... 10 4)input_info() ............................................................................................................... 10 5)check_number(char* s)和same_numder(char* s) . ................................................... 11 6)check_name(char* s) . ................................................................................................ 11 7)check_number2(char* s)和same_number2(student*p,int i) .................................... 11 8)int cheak_result(float s)和cheak_credit(float s) ....................................................... 11 9)void add_result() ....................................................................................................... 11 10)search_delete()、delete_stu(student* s)和 student*searchfront_stu() ................... 12 11)seach_findstudent()、 output_stuinfo(student* p) ................................................. 12 12)seach_findclass()、output_classinfo(int i) . ............................................................. 12 13)save_tofile()、output_tofile(FILE* fp, student* p) ................................................ 13 14)load_file() . ............................................................................................................... 13 15)end()、free_list(student* p) .................................................................................... 13

四、 程序实现............................................................................................................................... 13

4.1 源码分析 . ......................................................................................................................... 13

1)程序预处理 . .............................................................................................................. 13 2). 主函数main ............................................................................................................... 15 3). 程序初始化 ................................................................................................................ 16 4). 各种合法性检测 ........................................................................................................ 16 5). 输入数据(添加) .................................................................................................... 19 6). 修改成绩 .................................................................................................................... 22 7) .删除成绩 ................................................................................................................. 25 8). 查询信息(班级和个人) ........................................................................................ 27 查询班级 . ........................................................................................................................ 32

9). 保存和打开文件 ........................................................................................................ 32 10). 退出系统 .................................................................................................................. 35

五、结论及体会............................................................................................................................. 42 参考文献......................................................................................................................................... 43

一、目的及要求

1、目的

a) 本课程设计是计算机科学与技术专业重要的实践性环节之一,是在

学生学习完《程序设计语言》课程后进行的一次全面的综合练习。本课程设计的目的和任务:

b) 巩固和加深学生对C 语言课程的基本知识的理解和掌握; c) 掌握C 语言编程和程序调试的基本技能; d) 利用C 语言进行基本的软件设计; e) 掌握书写程序设计说明文档的能力 f) 提高运用C 语言解决实际问题的能力。

2. 课程设计要求

a) 分析课程设计题目的要求; b) 写出详细设计说明;

c) 编写程序代码,调试程序使其能正确运行;

d) 设计完成的软件要便于操作和使用,有整齐、美观的使用界面; e) 设计完成后提交课程设计报告和源代码文件的电子文档。

二、课程设计内容

题目四:成绩记录簿 1. 设计要求: 基本要求:

g) 添加成绩 h) 删除成绩 i) 查询学生成绩 j) 查询班级成绩 k) 退出

拓展功能:

l) 写入文件 m) 读取文件

创新(自拟)功能:

程序实现的其它功能由个人自拟。

2. 设计要求具体说明 基本功能:

● 成绩记录簿中记录以下数据:学号、姓名、课程编号、课程名称、成绩、学

分,所有成绩都以百分制计分;输入信息时要检查数据项学号、课程编号、成绩、学分的合法性,学号:8位数字;课程编号:5位数字;成绩:0 ~ 100 之间的整数,学分: 1~ 5之间的实型数。

● 添加成绩:需要输入学生的学号或姓名、课程编号及成绩,如已有该门课程

成绩给出提示;

● 查询(班级或个人)成绩:

● 查询个人成绩:以学号或姓名作为关键字,可查询一个学生的所有成绩,和

已完成的总学分。

● 查询班级成绩:以课程编号为关键字,成绩表后面要统计平均分、及格率及

全班同学不同课程在不同分数段分布的人数及百分比。

拓展功能:

a) 程序启动时先从文件读入数据,如果文件中没有数据则给出提示; b) 每次修改的数据写入文件。

3. 提示 定义合适的结构体类型,使用链表或数组的方式组织数据。

三、总体设计

3.1 功能模块设计

3.1.1成绩记录簿执行的主流程

主要的流程图如下图(图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()函数,要求用户键入要修改

的学生的姓名或者是学号,然后键入要修改的课程编号,在输入成绩时,如果是已经有成绩则提示“已经有程序”以后有“是否修改成绩?”的提示。

3.1.4删除模块

执行“3. 删除”时,用户输入要删除的学生姓名或学号,检查合法性后,

调用查找函数search_number(char*)(学号查找)或search_name(char*)(姓名查找),将返回的链表地址给utput_stuinfo(student*)(显示在屏幕)并且提示用户是否删除。如过删除,则继续将返回的链表给delete_stu(student*)函数,将这个链表的下一个节点的头指针连接到这个链表的上一个尾指针,则删除成功。

3.1.5查学生成绩模块

调用seach_findstudent()函数,要求用户输入学号或者是姓名,通过check_name()和check_number2()函数判断姓名或者学号的合法性(即是否姓名为字母,学号为)。

3.1.6查班成绩表模块

通过调用seach_findclass()函数,要求用户输入课程编号进入,通过

课程编号查找所有节点的相同课程编号,并且输出所有学生的这一课程编号的成绩、学分和平均分;成绩表后面要统计平均分、及格率及全班同学不同课程在不同分数段分布的人数及百分比。

3.1.7入文件模块

通过调用save_tofile()函数,提示用户输入文件名,这里为用户自己定义,文件以“w ”方式,当程序开始运行时,提示是否打开文件,文件名称要用户自己定义。

3.1.8取文件模块

通过load_file()函数,可将本程序保存的数据文件在程序重新期待时

读写到系统内存里,可对其进行查看、编辑、处理等任务。

3.1.9出模块。

退出时,释放链表内存。然后exit(0)退出程序。

1.总体框图

图1 总体框图

2. 目录函数menu()

图2 目录函数(menu)流程图

3. 目录主要源码

int menu() { int n; char ch;

printf("************************\n"); printf("** 成绩记录簿 **\n"); printf("************************\n"); printf("** 1. 添加 **\n"); printf("** 2. 修改成绩 **\n"); printf("** 3. 删除 **\n"); printf("** 4. 查学生成绩 **\n"); printf("** 5. 查班成绩表 **\n"); printf("** 6. 写入文件 **\n"); printf("** 7. 读取文件 **\n"); printf("** 0. 退出 **\n"); printf("************************\n"); if(!SWITCH[3])

{

} 4. 源码解释

menu()函数完成打印菜单和接收用户选择功能。

SWITCH[3]=1;

printf("是否打开文件?(y为打开,任意键取消!)\n"); scanf("%c",&ch); if(ch=='y'||ch=='Y') }

printf("\n\n输入程序序号:"); scanf("%d",&n); return n;

load_file();

//打开文件

3.2数据结构设计

3.2.1 stu 结构体

typedef struct stu{ char number[20]; char name[20];

//学号

//姓名

char curriculum_number[CLASS][6]; float credit[CLASS]; float result[CLASS];

//课程代号

//学分

//分数

// 总分 //平均分

float sum; float ave;

float sum_credit; struct stu *next;

}student;

//总学分

源码解释: 对结构体使用链表处理。

3.2.2 全局变量

char result_name[CLASS][30]={"数学"," 英语"," 政治"," 计算机"}; 对课程的名字进行定义。

int SWITCH[4]={0,0,0,0};为程序设定开关,方便特定条件下决定部分程序是否运行

char classname[CLASS][6];为了记录第一次定义的课程编码 。

int number_student =0; 记录输入数据的学生人数 “输入链表 ”即“添加”菜单步骤里做自增,计算人数。

student *head = NULL; 为链表的头指针。

FILE* fp;

为文件指针。

3.3 函数功能描述

1)init()

函数原型student* init();

init()函数用于初始化程序,对头函数进行初值的操作。其返回值赋值给头指针head 。

2)input_list()

函数原型void input_list();

input_list()函数为输入链表操作的第一步,接收用户输入的节点数(即记录的学生人数)。对头插法函数进行插入循环。 3)insert()

原型函数void insert();

insert()函数为将数据运用头插法插入。

4)input_info()

原型函数void input_info(student*p);

input_info(student*)函数为给接收到的p 指向的节点输入数据。数据有学号、姓名、课程代码(第一次运行程序并且没有一开始读取文件的时候执行输入,否则程序内部将课程代码复制给下一个学生的信息里。)、每个课程代码对应的课程的分数和学分,并且自动计算个人总分、平均分和总学分。

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(char* 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 s)

cheak_result(char* s)函数为检测输入的分数是否为1~100; cheak_credit(float s)函数则检测学分是否为大于0且小于5的。

9) void add_result()

函数原型void add_result()

add_result()函数进行修改成绩的操作,用户输入学号,查找是否有学号,如果有此学号,则程序查找到这个学号对应的节点,然后要求用户输入要修改的课程代号,找到需要修改的课程,输入成绩,最后判断是否修改,若否则不修改退出此操作。学分在成绩以后修改。

10)search_delete()、delete_stu(student* s) 和 student*searchfront_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)(返回前一个节点的功能),将所要删除的信息的后一个链表连接到要删除的信息的前一个链表。

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*)按学号查找,或调用student*

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 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)函数实现写入文件操作。

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(student)) #define MAX_NO 8 typedef struct stu{

char number[20]; char name[20];

//学号

//姓名

//课程代号

char curriculum_number[CLASS][6]; float credit[CLASS]; //学分 float result[CLASS]; //分数 float sum; float ave;

// 总分 //平均分 //总学分

float sum_credit; struct stu *next; }student;

char result_name[CLASS][30]={"数学"," 英语"," 政治"," 计算机"}; /*开关*/

int SWITCH[4]={0,0,0,0}; char classname[CLASS][6]; 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*); int check_number2(char*); int cheak_result(float); int cheak_credit(float*);

int same_number2(char*,int);

int check_name(char*); int same_result(int*);

//检测姓名 //检测相同成绩

// 按学号查找 //总分与平均分 //按姓名查找

int same_numder(char*); //检测相同姓名

student* search_number(char*); student* search_name(char*); void compute(student*); void input(student*); void search_delete();

student* searchfront_stu(student*); //返回前一个节点 用于删除

//输入

//查询学生信息 // 删除数据 //输出 个人信息 //查询班级信息

// 删除操作

void seach_findstudent(); void delete_stu(student*);

void output_stuinfo(student*); void seach_findclass(); void result_outside(); void save_tofile();

void output_classinfo(student*,int*);//输出 班级信息

//成绩表

//保存到文件

void output_tofile(FILE*,student*); //写入文件 void load_file(); void end();

//读出文件 //结束链表 // 结束

void free_list(student*);

2). 主函数main

int main(void) { int n;

head = init(); //初始化 while(2){ n = menu(); switch(n){

case 1: input_list();

break;

//修改成绩 //删除信息

break;

case 2: add_result();

//键入信息

//菜单

case 3: search_delete();

break;

//清屏

//查询学生信息

//查询班级信息

seach_findstudent();

case 4: system("cls");

break;

case 5: system("cls");

seach_findclass(); break;

case 6: save_tofile();

break;

case 7:

head = init();

//写入文件

load_file(); break;

end();

//文件中读取

//退出

case 0: default:

break;

printf("无效命令!\n"); fflush(stdin); } }

system("pause"); return 0; }

3). 程序初始化

student* init() //初始化 { student *head; head = MALLOC; return head;

//建立head 头链表

//设定头指针也是尾指针

//返回头指针

head->next = NULL;

4). 各种合法性检测

/*姓名检测*/

int check_name(char* s)

{

if (strlen(s) == 0)

return 0;

for (int i = 0; i

if (!(s[i] >= 'a' && s[i] = 'A' && s[i]

return 0;

} return 1; }

/*课程编码检测*/ int check_number2(char* s) {

if (strlen(s) !=5)

return 0;

for (int i = 0; i

if (s[i] '9') }

/*相同课程编码检测*/

int same_number2(student*p,int i) {if(SWITCH[1]) }

return 0;

} return 1;

{

for(int j=0;j

{if(strcmp(p->curriculum_number[i],p->curriculum_number[j])==0) } else return 1;

return 0;}

/*分数检测*/

int cheak_result(float s) { }

/*学分检测*/

int cheak_credit(float s) {

if(s5) }

/*学号检测*/

int check_number(char* s) {

if (strlen(s)!=8)

return 0;

for (int i = 0; i

if (s[i] '9') }

/* 检查相同学号 */ int same_numder(char* s) {

student *p = head->next;

if(s100) return 0; else return 1;

return 0; return 1;

else

return 0;

} return 1;

}

while(p != NULL) { } return 0;

if (strcmp(s, p->number) == 0) return 1; p = p->next;

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) {

/* 学号 */

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("数据违法,请重新输入姓名: "); }

}while (!check_name(s->name));

/*课程编号; 成绩;学分的存入*/ float stu_resurt;

float stu_credit; /*课程编码输入*/ if(!SWITCH[0]) {

printf("\n课程编码输入第一个学生时定义!\n"); for(int j=0;j

printf("请输入 %s 课程编号: ",result_name[j]);

do

scanf("%s",s->curriculum_number[j]);

{

printf("\n数据违法,请重新输入课程编号: "); else if(!same_number2(s,j)) printf("\n课程编号重复,请重新输入编号:"); }while

(!check_number2(s->curriculum_number[j])||!same_number2(s,j));

SWITCH[1]=1;

strcpy(classname[j],s->curriculum_number[j]);

}

SWITCH[0]=1;

SWITCH[2]=1;

}

if(SWITCH[2])

{

for(int j=0;j

strcpy(s->curriculum_number[j],classname[j]);

}

float mun=0,avg=0,mun1=0;

for(int i=0;i

{

/* 成绩 */

printf("\n\n");

printf("请输入 %s 成绩: ", result_name[i]);

do

{

scanf("%f",&stu_resurt);

if (!cheak_result(stu_resurt))

{

printf("数据违法,请重新输入

result_name[i]);

}

}while (!cheak_result(stu_resurt));

s->result[i]=stu_resurt; //存入成绩

mun += s->result[i]; // 记录总分

成绩: ", %s

}

说明:调用input_list()函数,要求用户键入添加的人数。进入input_list()函数时,将调用insert()函数对每个的信息用头插法建立链表节点并同时进行对每一个人的信息进行输入(由insert()函数调用input_info()。

} do { scanf("%f",&stu_credit); if (!cheak_credit(stu_credit)) { printf("数据违法,请重新输入 %s 学 } }while (!cheak_credit(stu_credit)); s->credit[i]=stu_credit; mun1 += s->credit[i]; // 存入学分 //记录总学分 分:",result_name[i]); s->ave=mun/CLASS; //存入平均分 s->sum=mun; fflush(stdin); // 存入总分 //清屏 s->sum_credit=mun1; //存入总学分

6). 修改成绩

/*修改成绩*/

void add_result()

{ char ch; char str[20]; student*s=head->next; // 输入合法性判断

printf("请输入你要修改的学生的 姓名 或 学号: ");

do

scanf("%s",str);

if ((check_number2(str)&&!check_name(str)))

{

printf("数据违法,请重新输入姓名或学号: ");

}

}

while ((check_number2(str)&&!check_name(str)));

// 判断是姓名还是学号

if (str[0] >= '0' && str[0]

{

s = search_number(str); //按学号查找

if (s == NULL)

printf("对不起,找不到这个学号\n");

}

else

{

s = search_name(str);

if (s == NULL)

printf("对不起,找不到这个学号\n");

}

//输入课程编码

char curriculum[6];

int n;

do { scanf("%s",curriculum); if (!check_number2(curriculum)) printf("\n数据违法,请重新输入课程编号: "); }while (!check_number2(curriculum)); for(int i=0;i

if(strcmp(s->curriculum_number[i],curriculum)==0)

//记录 课程顺序 printf("输入课程编码:");

} break;

}

float stu_resurt,stu_credit; // 修改成绩操作 printf("\n\n"); printf("请输入 %s 成绩: ", result_name[n]); do { scanf("%f",&stu_resurt); if (!cheak_result(stu_resurt)) printf("数据违法,请重新输入 %s 成绩: ", }while (!cheak_result(stu_resurt)); if(s->result[n]!=0) { printf("成绩已经存在! 是否修改?(输入 y 确认修改,任getchar(); scanf("%c",&ch); if(ch=='y'||ch=='Y') { s->result[n]=stu_resurt; //输入课程学分 result_name[n]); 意键取消):\n"); printf("请输入该课程学分: "); do { scanf("%f",&stu_credit); if (!cheak_credit(stu_credit)) { printf("数据违法,请重新输入 %s 学分:",result_name[n]);

}

说明:

执行“2. 修改成绩”时,调用add_result()函数,要求用户键入要修改的学生的姓名或者是学号,然后键入要修改的课程编号,在输入成绩时,如果是已经有成绩则提示“已经有程序”以后有“是否修改成绩?”的提示。

s->credit[n]=stu_credit; // 存入学分 printf("成绩修改为:%.2f\n",s->result[n]); printf("学分修改为:%.2f\n",s->credit[n]); } } char a; printf("是否保存到文件?(y为确认,任意键为取消!)"); getchar(); scanf("%c",&a); if(a=='y'||a=='Y') save_tofile(); else printf("已经取消保存!\n");

7) .删除成绩

/*删除选项 */

void search_delete()

{

student *p;

char str[20];

char sure[20];

//输入合法性判断

printf("请输入你要删除的学生的 姓名 或 学号: ");

do

{

if (!(check_number(str) || !check_name(str)))

{

printf("数据违法,请重新输入姓名或学号: ");

}

}

while (!(check_number(str) || !check_name(str)));

//判断是姓名还是学号

if (str[0] >= '0' && str[0]

{

p = search_number(str); //按学号查找

if (p == NULL)

{

printf("对不起,找不到这个学号\n");

}

else

{

output_stuinfo(p);

printf("确认删除? (输入\"y\"确认,任意键取消): ");

if (strcmp(gets(sure), "y") == 0)

{

--number_student; //计算总人数 delete_stu(p); printf("删除成功\n");

}

}

}

else

{

p = search_name(str);

if (p == NULL)

{

printf("对不起,找不到这个姓名\n");

}

else

{

printf("确认删除? (输入\"y\"确认,任意键取消): ");

if (strcmp(gets(sure), "y") == 0)

{

--number_student; //计算总人数 delete_stu(p); printf("删除成功!\n");

}

}

}

}

说明:

执行“3. 删除”时,用户输入要删除的学生姓名或学号,检查合法性后,调用查找函数search_number(char*)(学号查找)或search_name(char*)(姓名查找),将返回的链表地址给utput_stuinfo(student*)(显示在屏幕)并且提示用户是否删除。如果确认删除,则继续将返回的链表给delete_stu(student*)函数,将这个链表的下一个节点的头指针连接到这个链表的上一个尾指针,则删除成功。

8). 查询信息(班级和个人)

/* 输出p 指向节点的信息 (个人信息) */

void output_stuinfo(student* p)

{

int i ;

fflush(stdin);

printf("\n");

printf("\n姓名: %s\n", p->name);

printf("\n学号: %s\n", p->number);

for (i = 0; i

{

printf("课程编号:");

printf("%s",p->curriculum_number[i]);

}

/* 计算 */

compute(p);

printf("总分: %.2f\n", p->sum);

printf("平均分: %.2f\n", p->ave);

printf("总学分:%.2f\n",p->sum_credit);

}

/* 输出班级信息*/

void output_classinfo(int i)

{

int n=0; float j=0; float sum[CLASS] = {0};

student *p = head->next;

if (p == NULL)

{

printf("暂无班级信息!\n");

return;

}

p = head->next;

//输出成绩

while (p != NULL)

{

printf("学号:%s的 %s为: %.2f\n", p->number ,result_name[i], p->result[i]);

//统计各科总分

sum[i] += p->result[i];

if(p->result[i]>60||p->result[i]==60)

j++;

p = p->next;

}

/*查询学生个人信息*/

void seach_findstudent()

{

student *p;

char str[20];

// 输入合法性判断

printf("请输入你要查询的学生的 姓名 或 学号(建议使用学号): "); do

{

scanf("%s",str);

if ((!check_number(str)) &&(!check_name(str)))

{

printf("数据违法,请重新输入姓名或学号: ");

}

}

while ((!check_number(str)) &&(!check_name(str)));

// 判断是姓名还是学号

if (str[0] >= '0' && str[0]

{

p = search_number(str); //按学号查找

if (p == NULL)

{

printf("对不起,找不到这个学生!(学号为8位数字!)\n"); }

else

printf("\n%s 总平均分: %.2f\n", result_name[i], sum[i] / printf("\n%s 及格率: %.2f\n", result_name[i], (j/number_student)); number_student); printf("\n"); output_stuinfo(p); //输出p 指向节点的信息

else

{

p = search_name(str);

if (p == NULL)

{

printf("对不起,找不到这个学生!\n"); }

else

output_stuinfo(p);

}

}

/*查询班级信息*/

void seach_findclass()

{

student *p = head->next;

char str[6];

int i,t,go = 1;

//提示课程编码

if(p!=NULL)

{printf("**************友情提示:*************\n"); for(int j=0;j

{

printf("%s课程的编码为%s\n",

result_name[j],p->curriculum_number[j]);

}

printf("**************友情提示:*************\n"); }

// 输入合法性判断

printf("请输入你要查询的班级课程编码:");

do

{

scanf("%s",str);

{

printf("数据违法,请重新输入课程编码: "); }

}while(!check_number2(str));

//按节点查找编号

//输出成绩表 int j,k; float n;

for(i=0;i

student *p = head->next; int num[]={0,0,0,0,0,0,0,0,0,0}; while(p!=NULL) {

if(p->result[i]

else if(p->result[i]>=10&&p->result[i]result[i]>=20&&p->result[i]result[i]>=30&&p->result[i]result[i]>=40&&p->result[i]result[i]>=50&&p->result[i]result[i]>=60&&p->result[i]result[i]>=70&&p->result[i]result[i]>=80&&p->result[i]

for(i=0;i

if(strcmp(p->curriculum_number[i], str) == 0)

{ t=i; go=0; break; }

output_classinfo(t);

else if ( p->result[i]>=90&&p->result[i]

printf("对不起,找不到这个班级!\n"); } } 说明:

查询个人

调用seach_findstudent()函数,要求用户输入学号或者是姓名,通过check_name()和check_number2()函数判断姓名或者学号的合法性(即是否姓名为字母,学号为)。

查询班级

通过调用seach_findclass()函数,要求用户输入课程编号进入,通过课程编号查找所有节点的相同课程编号,并且输出所有学生的这一课程编号的成绩、学分和平均分;成绩表后面要统计平均分、及格率及全班同学不同课程在不同分数段分布的人数及百分比。

printf("%s课程\n",result_name[i]); for(j=0;j

printf("\n");

printf("%d~%d分数段的人数:%d 百分比为:"

,j*10,(j+1)*10,num[j]); n=(float)num[j];

printf("%.2f %\n",(n/number_student)*100);

p=p->next;

9). 保存和打开文件

/* 保存到文件 */

void save_tofile() {

FILE *fp; char file[20];

printf("请输入文件名: "); scanf("%s",file);

if ((fp = fopen(file, "w")) == NULL) {

printf("对不起,无法创建文件!\n"); return; }

student *p = head->next; while (p != NULL) {

output_tofile(fp, p); p = p->next; }

printf("文件保存成功!\n"); fclose(fp); }

/* 从文件中读入记录 */ void load_file() { int i; FILE *fp; char file[20];

printf("请输入文件名: "); scanf("%s",file);

if ((fp = fopen(file, "r")) == NULL) {

printf("对不起,无法打开文件!\n"); return; }

/* 文件未结束时读入数据 */ while (!feof(fp)) {

student *s = MALLOC;

fscanf(fp, "%s\n", s->number);

fscanf(fp, "%s\n",s->name); for (i = 0; i

fscanf(fp, "%s\n",s->curriculum_number[i]);

fscanf(fp, "%f\n",&s->result[i]); fscanf(fp, "%f\n",&s->credit[i]); }

fscanf(fp, "%f\n",&s->sum);

fscanf(fp, "%f\n",&s->ave);

fscanf(fp, "%f\n",&s->sum_credit); s->next = head->next; head->next = s; }

printf("文件读取成功!\n"); fclose(fp);

student *p=head->next; number_student=0; while(p!=NULL) {

if(p->number!=NULL) number_student++; for(int j=0;j

if(p->curriculum_number[j]!=NULL)

strcpy(classname[j],p->curriculum_number[j]); //对课程编码设

{ 定

}

p=p->next; }

SWITCH[0]=1; //将课程编码输入在读入文件后设定不可运行的开关 SWITCH[2]=1; //将打开文件后再输入学生信息时,对课程编码默认输入的操作开关打开

}

说明:

保存文件

通过调用save_tofile()函数,提示用户输入文件名,这里为用户自己定义,文件以“w ”方式,当程序开始运行时,提示是否打开文件,文件名称要用户自己定义。

读取文件

通过load_file()函数,可将本程序保存的数据文件在程序重新期待时读写到系统内存里,可对其进行查看、编辑、处理等任务。

10). 退出系统

void free_list(student* p) { }

/* 退出 */ void end() {

if (head != NULL) {

free_list(head); } exit(0);

if (p->next != NULL) { } free(p);

free_list(p->next);

}

说明:

退出时,释放链表内存。然后exit(0)退出程序。

五、运行结果

1. 系统初始化

当用户运行程序时,程序默认初始化。如果运行程序后打开文件,则也默认初始化。

2. 添加

3.修改成绩

4.删除

5.查看学生成绩

6.查看班级成绩

7.写入文件

8.打开文件

五、结论及体会

这是我第一次做课程设计,我的题目是成绩记录簿,这是对我个人能力的一次测验和挑战。在开始做设计之前还是一片迷茫,有一种有心无力的感觉。第一次编写这样大的程序,我想我应该要按照指导书是指导,一步一步的做:分析课题的要求,确定设计方案; 按功能模块编写详细设计说明; 绘制程序流程图;编写程序;调试程序;写课程设计报告等等。

对于完成的程序,我觉得有几个部分可以完善。

一、

二、

虽然缺点很多,但我觉得在想要有功能的拓展,就必须使原有的功能坚

固不漏。

我将我编写的程序加入了稍微的一些强制性,这样会使用户少犯错。检

测所有操作的合法性与正确性。例如,在输入课程编码时,我将它设置为第一次运行时并且没有读文件时执行,除此之外不给用户操作,以避免用户违规操作,在查看班级成绩时列出提示,防止遗忘课程代码的情况等。

看似漫长而又简短的两周,我体会到了作为一个程序员的不易。

界面的美观,在设计的时候想到的应该是做用户喜欢的东西为主旨的,界面是第一印象。 功能的拓展,例如插入一个学生信息到链表中、排序并打印学生信息等。可惜时间关系、个人关系,没能很好的完成。 那么一句话,世界上没有完美的东西。

在发现课题要求后,我思考该如处理用户输入错误信息或者非法操作,该如何提示和处理,这让我想到了函数。但是我却运用了我不熟练的链表,这就造成了代码量增多。虽然对于现在的电脑来说,这点还影响不了用户,但却是一名程序员的禁忌。老师说过程序是应该简练易懂的··· 这使我在程序快要写完的时候,有一种想不用链表的想法、想从头来,做到最后发觉链表比想象里让我更头痛。

但幸运的是,我在各自压力和彷徨下坚持到了最后,我觉得,这或许就是一个程序员所必须拥有的根本吧。

参考文献

[1] 谭浩强.C 程序设计(第三版) .北京:清华大学出版社,2005

[2] 谭浩强.C 程序设计题解与上机指导(第三版) .北京:清华大学出版社,2005

[3] [美] Herbert Schildt .C 语言大全(第四版).北京:电子工业出版社, 2004

[4] Samuel P.Harbison Ⅲ,Guy L.Steele .C 语言参考手册(第5版) .北京:机

械工业出版社,2003

[5] 王士元.C 高级实用程序设计.北京:清华大学出版社,1996

[6] 梁翎,李爱齐.C 语言程序设计实用技巧与程序实例.上海:上海科普出版

社,1996

[7] 张基温.C 语言程序设计案例教程.北京:清华大学出版社,2005

[8] 耿国.华计算机导论与C 语言.北京:电子工业出版社,2005

[9] 李大友.C 语言程序设计.北京:清华大学出版社,1999

[10] 程序设计语言课程设计指导书


相关内容

  • c语言程序设计报告 学生成绩管理系统
    课程设计报告书 学生成绩管理系统 单 位: 分院 班 级: 学 号: 姓 名: 指导老师: 完成日期:2010年7月14日 内容摘要 摘要:本次课程设计的课题是学生成绩管理系统,本文介绍课程设计课题的 选题意义,说明了本系统提供的主要功能, ...
  • 三位一体的基础实验课程考试改革研究
    摘 要: 本文针对基础实验课程考试的现状和特点,兼顾实验考核的过程性和结果性评价,构建了"三位一体"的基础实验课程考核体系:在课程的考核方式.考核内容和考核标准等方面做了深入研究,系统提出了基础实验考试改革的基本内容与评 ...
  • 本科毕业论文存在的问题及解决的途径
    第9卷第2期 潍坊学院学报 Vol.9No.2 2009年3月 JournalofWeifangUniversity Mar.2009 本科毕业论文存在的问题及解决的途径 李慎恒 (潍坊学院,山东 潍坊 261061) 3 摘 要:这几年大 ...
  • 图书馆系统课程设计报告(20**年)
    课程设计 设计人专业 软件工程 年级 设计人学号 [1**********]1姓名 吴翼佳 成绩 设 计 题 目 集美大学图书馆借阅管理系统 设计人学号 [1**********]4姓名 吴树森 成绩 设计人学号 姓名 设计人学号 姓名 成 ...
  • 农机构造与工作原理
    农业机械学 Agricultural machinery 课程编号:901120513 学时数:54学时(理论学时:44:实验学时:10 课外学时:无) 学分数:3 执笔人:任文涛 讨论参加人:任文涛,林静,宋玉秋,辛明金,王瑞丽,白晓虎, ...
  • 教师管理制度
    篇一:小学教师管理制度范文 1.学习制度.准时参加学校政治.业务学习,认真做好会议记录.经常读书看报,每学期阅读一本教育专著,做好读书笔记.每学期课改实验老师撰写5篇教学反思或随笔, 2.研讨制度.乐意承担公开课教学,主动搜集教学信息和改进 ...
  • 教学常规管理自评自查报告
    海子街小学2014-2015年度 教学常规管理自评自查报告 为抓好我校的教学常规管理工作,促进我校教育教学质量的提高,推动基础教育和课程改革.因此,我校根据七星关区教育局关于转发的<毕节市教育局关于对全市各县(区).市直中小学校进行教 ...
  • 物料需求计划编制指导书
    吉林化工学院 生产计划与控制课程设计报告 (工业工程专业) 教 学 院 机电工程学院 专业班级 工程00801 学生姓名 王滨义 学生学号 08440106 目 录 第1章 课程设计目的和要求........................ ...
  • 毕业设计目录
    目 录 1 毕业设计(论文)简介------------------------------------------------------1 2 毕业设计(论文)总体要求 --------------------------------- ...