【推荐】2011年重庆高考数学试题及答案理科-可编辑
课 程 设 计 报 告
课程名称 《C语言程序
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
》 课题名称 班级成绩管理系统 专 业
班 级
学 号
姓 名 指导教师
2012 年 1月09 日
湖南工程学院
课 程 设 计 任 务
书
关于书的成语关于读书的排比句社区图书漂流公约怎么写关于读书的小报汉书pdf
课程名称 《C语言程序设计》 课 题 班级管理系统
专业班级
学生姓名
学 号
指导老师 王颖 审 批
任务书下达日期 2011年12月28日
任务完成日期2012年1月 09 日
一、设计
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
与设计要求
1.课程设计目的:
全面熟悉、掌握C语言基本知识,增强对不同的问题运用和灵活选择合适的数据结构以及算法描述的本领,熟悉编制和调试程序的技巧,掌握分析结果的若干有效方法,进一步提高上机动手能力,培养使用计算机解决实际问题的能力,养成提供文档资料的习惯和
规范
编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载
编程的思想,为后继课程(数据结构、数据库和汇编语言等课程)的实验以及课程设计打下较扎实的基础。
2.课题题目
?班级成绩管理系统
?班级档案管理系统
?飞机订票系统
?猜数字游戏
?电子英汉词典设计
?心算抢答系统
?运动会分数统计系统
?小学生心算CAI系统
3.设计要求:
掌握结构化程序设计的主体思想,以自顶向下逐步求精的方法编制程序解决一些实际的中型问题,为将来开发软件积累一些典型的案例处理经验。具体要求如下:
?设计课题题目:每位同学根据自己学号除以8所得的余数加一选择相应题号的课题。换题者不记成绩。
?根据自己对应的课题完成以下主要工作:?完成系统需求分析:包括系统设计目的与意义;系统功能需求;输入输出的要求。?完成系统概要设计:程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系;每个模块的功能;课题涉及的数据结构和数据库结构;即要存储什么数据,
这些数据是什么样的结构,它们之间有什么关系等。?完成系统详细设计:包括采用C语言定义相关的数据类型;写出各模块的类C码算法;画出函数的调用关系图。?调试分析以及设计体会:测试数据:准备典型的测试数据和测试
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
,包括正确的输入及输出结果和含有错误的输入及输出结果;程序调试中遇到的问题以及解决问题的方法;课程设计过程经验教训、心得体会。
?关键源程序(带注释)
?按规定格式完成课程设计报告,将其打印稿(A4纸)上交给老师存档。
?不得抄袭他人程序、课程设计报告,每个人应体现自己的个性设计。
设计课题一:班级成绩管理系统 一、问题描述:
对一个有N个学生的班级,每个学生有M门课程。该系统实现对班级成绩的录入、显示、修改、排序、保存等操作的管理。
二、功能要求:
1、本系统采用一个结构体数组,每个数据的结构应当包括:学号、姓名、
M门课程名称。
2、本系统显示这样的菜单:
请选择系统功能项:
a、成绩录入
b、 成绩显示
c、成绩保存
d、成绩排序
e、成绩修改(要求先输入密码)
f、成绩统计
(1) 显示每门课程成绩最高的学生的基本信息
(2) 显示每门课程的平均成绩
(3) 显示超过某门课程平均成绩的学生人数
g、退出系统
3、执行一个具体的功能之后,程序将重新显示菜单。
4、将学生成绩保存到文件中。
三、算法提示:
1、数据结构:结构体类型数组。
2、数据库结构:下表构成该系统的基本数据库。
学号 课程名称1 课程名称2
姓名 ??????
char Char float float
四、测试数据:
学生人数N=10
课程门数M=4
课程名:数学、语文、英语、政治
五、其它
对该系统有兴趣的同学可以在实现上述基本功能后,完善系统的其它功能。
目 录
一: 需求分析: ................................... 7
二:概要设计: ................................... 8 三(详细设计 .................................... 10 四:程序调试 .................................... 16 五(心得体会 .................................... 17
一: 需求分析:
1(程序的功能
学生成绩管理系统有13种功能。可以把每个功能写成各个子函数,共有13个子函数。在主函数当中设计一个菜单对这13个子函数进行管理,以便实现对整个系统的操作。
2(输入输出的要求。
根据课题的要求。每一个学生的包括姓名(char)、学号(char)、M门课程的成绩(float),.再加上系统功能上的要求每一学生的信息还要总分和名次等。所以想到要用结构体来定义每一个学生的信息结构。然后用链表把它们组成一个有序的整体,用对链表的操作来实现对所有学生信息的统一管理(成绩显示、成绩排序、成绩修改等)。最后为了以后按照处理后的顺序保存到文件中。
二:概要设计:
1(程序的模块组成及各函数的主要功能
主 函 数: int main()
新建函数:STUDENT *init()
输入函数 :STUDENT *create()
显示函数: void print(STUDENT *head)
删除函数::STUDENT *delete(STUDENT *head)
按名字寻找函数::void lookup(STUDENT *head)
保存函数: void save(STUDENT *head)
按总分排序函数: STUDENT *sort(STUDENT *head)
计算总分和均分函数: void computer(STUDENT *h)
修改函数: STUDENT *Modify(STUDENT *head,STUDENT *new)
按学号排序函数: STUDENT *index(STUDENT *h)
菜单函数:int menu_select()
各函数的主要功能:
输入函数: 随时输入数据。
菜单函数:显示系统主菜单。
显示函数: 显示所有学生的信息。
寻找函数: 方便学生查找自己的成绩。
删除函数: 删除某学生的信息。
排序函数: 按总成绩排序。
按学号排序函数: 按学号排序。
插入函数: 可以插入新的信息。
保存函数: 保存好学生成绩,以免丢失。
统计函数:
1显示每门课程成绩最高的学生的基本信息。
2显示每门课程的平均成绩。
3显示超过某门课程平均成绩的学生人数。
2(课题的功能模块的划分:
开始
菜单界面
功能选择
初始化函数
输入学生信息
删除学生信息
显示学生信息
查找学生信息
按成绩排序
保存到文件
从文件读数据
插入学生成绩
分类合计
退出系统
结束
三(详细设计
1(定义相关的数据类型
整个系统除了主函数外,另外还有14个函数,实现八大功能:输入功能、显示功能、查找功能、排序功能、插入功能、保存功能、读取功能。各个函数的详细设计说明分别如下:
主函数 main()
利用无限次循环for(;;)和swithch()实现各函数的调用,系统根据输入的数字选项来调用相应的函数。
菜单选择函数 int menu_select()
这是一个无参函数,主要实现“功能选择”的界面,在这个界面里有显示系统的九大功能,根据每个功能前面的序号进行选择。等执行完每一个函数功能后,返回菜单。
2(各函数的C类算法
显示记录函void print(STUDENT *head)
算法:先将p结点的指针指向第一个结点,将p结点(即第一个结点)的数据输出。然后再将p结点的指针指向p指针的的指针(即下一结点),将p结点(即第一结点)的数据输出。重复执行此步聚直到p指针指向NULL为止。 查找记录函数 void lookup(STUDENT *head)
算法:采用线性查找法往下一个结点查找。输入所要查找的学生的学号s,设一个指针变量p,先指向第一个结点,当strcmp(p->name,s) && p != NULL
时,使p后移一个结点,如果p!=NULL,输出p所指的结点。
删除记录函数 STUDENT *delete(STUDENT *h)
算法:主函数链表的头指针,用一个输出语句printf("Input your
password:");
提示用户输入密码。在输入过程中如果需要用到退格。putchar(8);putchar(' ');
putchar(8);来达到视觉和功能上的要求。如果密码错误,则两秒后自动返回主菜单。正确后输入要删除的学生学号,进行删除。
修改函数 STUDENT *Modify(STUDENT *head)
算法:
首先向系统申请一块空间,用于存放输入的信息。程序会跟据用户输入的学号。采用线性查找法往下一个结点查找。设一个指针变量p,先指向第一个结点,当strcmp(p->name,s) && p != NULL时,使p后移一个结点,如果p!=NULL,输出
p所指的结点。如果有该学生就修改。并出现提示信息"***Modify success!***"。如果没有该学生则出现“***Find out No.%s student***”提示。并2秒后返回主菜单。
3代码设计和流程图
初始化函数 STUDENT *init()
这是一个无参函数,里面只有两个语句,它的作用是使链表初始化,使head
的值为NULL和一个清屏语句。比如:没有这个函数的话,在你没有输入任
何数据的情况下,去执行 显示功能的时候会显示一些乱码~
输入记录函数 STUDENT *create()
这是一个无参函数,用来执行学生成绩记录的输入,当学生为@时停止输入,函数结束后,带回一个链表头的指针指向一下个学生的信息插在表头。
N-S流程图如下:
head=NULL
无条件循环
指针p指向新开辟的单元
指针p是否为空
是 否
输入学号p->num 输出p-> num是否为@
内存 溢出
是 否 输入姓名p->name 停止 for(i=0;i<3;i++) 输入成绩p->sum=s; 返回菜单 p->average=(float)s/3;
p->order=0;
p->next=head; head=p;
显示记录函void print(STUDENT *head) N-S流程图如下:
void save(STUDENT *head) 保存数据到文件函数
这是一个不返回值的有参函数,形参为“链表头的指针”,可以把学生记录保存
在电脑上由自己任意命名的二进制文件。
N-S流程图如下:
输入要保存记录的文件地址outfile
文
件不能打开 是
否
p=head;
输出一个出错信
当p不为空时 息,并返回菜单
fwrite(p,LEN,1,fp); (写入
一条记录)
p=p—>next; (指
针后移)
fclose(fp); (关闭
文件)
查找记录函数 void lookup(STUDENT *head)
这是一个不返回值的有参函数,形参为“链表头的指针”,实现按学号对某个学
生进行查找,并显示所查找到的记录。
N-S流程图如下:
输入要查找的学生的学号s
p=head,使p指向第一结点
当记录的学号不是要找的,或指指针不为空
p=p->next
p!=NULL如果指针不为空
是 否
显示没有该
输学生
出p所指向的结点
STUDENT *delete(STUDENT *h) 删除记录函数
这是一个有返回值的有参函数。形参为“链表头的指针”,在核对密码后。实现对所要删除学生按学号进行查找。找到后显示该学生的信息。按任意键进行删除。 N-S流程图如下:
传递头指针;输入密码;
密码正确
否 是
printf( "Password is 输入要删除学生的学号 mistake Tow seconds to return!");
有该学生的信息
是 否 显示该学生信息 printf( "Password is mistake Tow printf("\n have deleted No %s seconds student\n",s) to return!"); printf("Don't forget save\n"); sleep(2);clrscr(); 按任意键确认删除
修改函数 STUDENT *Modify(STUDENT *head)
这是一个有参函数,一个是“链表头的指针”修改之后,并返回链表的头指针。
q=head原来的链表是空的
是 否
两秒后返回菜单 当记录的学号不是要找的,
或指针不为空时
info指向q位置 q向后移一个结点
!strcmp(p->no,info->no)
是 否
info->next=p->next; printf("Don't
forget
save\n")
q->next=info;
从文件读数据函数 STUDENT *load()
这是一个不返回值的有参函数,形参为“链表头的指针”,根据输入的文件地址进行读取。
N-S流程图如下:
定义两个指针变量p1,p2
输入要打开的记录文件地址infile
文件不能打开
否 是
开辟一个新单元 返回菜单
指针p1是否为
空
否 是
读入记录 fclose(fp); (关
闭文件)
按部分排序函数 STUDENT *sort(STUDENT *head) 这是一个有参函数,形参为“链表头的指针”,按学生成绩的平均分高低进行排序,还可以显示名次。
N-S流程图:
temp=head->next,head->next=NULL
当temp!=NULL时 当
t->average
average&&p1!=NULL
时
t=temp;temp=temp->next; p2=p1;p1=p1->next;
p1=head;p2=head;
p1=p2
是 否
t->next=p1; t->next=p1;
head=t; p2->next=t;
p1=head;
当p1!=NULL时
i++;p1—>order=i;p1=p1—>next;
输出“排序成功”
四:程序调试
1(程序调试中遇到的问题以及解决问题的方法。
开始设计出来的菜单不是预想的那样,而是总个窗中出现混乱。解决的这个
for 循环的问题的办法是调整。最后还是在学姐的帮助下找到了问题的所在——次超过了链表中结点的数量。再就是自定义函数时由于课本的概念不清楚,多写了空格键,以至函数调用不出来。又如:在设计修改学生信息时的密密码时。当用户发现输入密码错误按了退格键后,因为“*”并没有消去。导致用户再次按退格键,又出现前面的情况。最终导致输入密码错误。所以用了两次退格键: putchar(8); /*退格键*/
putchar(' '); /*以空格代替*/
putchar(8); /*再次退格*/。
在对链表操作时,要特别链表指针的移动(p=p->next)和链表尾的判断 (p= =NULL)。没有指针的移动,就很容易出现死循环。而在运行过程中不能控制。所以你就会认为是死机。如果没有链表尾的判断。就会在运行过程出现想不到的错误。如:在显示链表信息时,后面就会出现乱码。 一个系统的菜单和提示信息非常重要。如果没有这些用户根本不知道怎么用你设计的这个系统。在设计的调试过程中也无法顺利的完成调试工作。有了一个清晰简单的菜单和一些提示信息这后,调试过程完成的非常顺利。
五(心得体会
通过半学期的C语言程序设计的学习,使自己对计算机方面的认识,如果用文学词汇说,那就使从感性认识上升到了理性认识。以前,我只知道计算机用途很广,但不知道它为什么能这样作,通过学习才知道这是程序在指挥着计算机的运作。
刚接触到这门课程,我由于底子差,感觉到了它的难度,但通过渐渐的学习,我认识到了它的重要性,更认识到这是一种能力的培养,我下定决心要把它学好。经过几次的上机操作,看到自己设计的程序能运行出正确的结果,我对C语言产生了兴趣。
刚拿到课程设计时,心里十分的没底,不知道该如何下手,怕自己完成不了任务。原因便是自己没把知识真正学到手,不敢找出自己的问题并解决它,不知道到底学了些什么,更别说问出什么问题。但学习就是要不断的发现问题,才能不断的解决问题,不然不会有什么成效,更谈不上进步啦。实际上,问题是最好的老师,是学生学习的引导没有问题便没有深入。在C程序设计过程中,我们就是在问题解决中学习,即提出问题,老师也留了大量的时间给我们思考、讨论、解决问题,从而更深入地展开学习。这样就充分的调动了我们学习的积极性和主动性。
这次实验课题,老师给了我们大量的时间让我们准备,让我们自己发现问题,并通过自己最大的努力解决问题。在准备的过程中,我们查阅书籍,请教同学,其实就是一个对知识进行运用的过程,也是自己发现问题并解决问题的最好体现。C语言课程设计不仅能提高教学质量、增强教学效果、而且能培养和提高我们分析问题、解决问题能力和创新能力。老师在给我们定制的任务书中中,围绕我们的所学的书本的基本知识点引导引导我们思考和探索,是我们的思想活跃起来。
经过自己的努力,问题一个接一个的被我解决了,课程知识也逐渐在自己脑海里形成了一体系,使自己读课程知识有了一次全面的认识。老师教给学生正确的学习方法,给我们这么好的机会,让我们掌握程C语言的的思想精髓在这次的实践过程中我独立的思考着这些问题,自己试着设计着这些比较有趣的课题,
把课堂上学的for,Switch和while语句还有结构体的使用和指针的用法与作用都有了进一步的认识。
这次课题中,遇到的最大问题便是文件的使用。在自己的程序中由于没有建立文件,使得删除功能和查找功能不能实现。但在老师的引导下,我发现了问题,在老师的帮助下我建立了文件,成功的运行了删除功能和查找功能。还有就是密码的设置,自己设置的密码不能运行,但在自己查阅书籍后,引用了一个比较函数,便能实行了。
通过这次课程设计,使我认识到,课本上的知识只是给自己对知识的理论认识,要真正掌握知识,必须得通过实践操作。自己对知识的不熟悉,使得自己不敢去发现自己的问题,由于怕困难,使得自己不敢去解决问题,最终使得自己不能完成任务,这不是自己没能力完成,而是自己能完成却没去完成。
通过这次课题,我对课程的认识加深了,使自己对课程有了一个整体的把握,也提高了自己发现问题,分析问题,解决问题的能力,更对程序设计产生了更大的兴趣。
这次课题的设计不仅是知识能力的体现,而且也反映了一个人的做事态度。要勇于发现问题,不逃避问题;面对困难要勇于克服,而不是遇难而退;遇到麻烦要冷静思考,不要心烦气躁,那只能失败。
附1 源代码
源程序清单
:
#include "stdio.h" /*I/O函数*/
#include "stdlib.h" /*其它说明*/
#include "string.h" /*字符串函数*/
#include "conio.h" /*屏幕操作函数*/
#include "mem.h" /*内存操作函数*/
#include "ctype.h" /*字符操作函数*/
#include "alloc.h" /*动态地址分配函数*/
#include "dos.h"
#define N 4 /*定义常数*/
typedef struct z1 /*定义数据结构*/
{
char no[12];
char name[20];
int score[N];
float sum;
float average;
int order;
struct z1 *next;
}STUDENT;
/*以下是函数原型*/
STUDENT *init(); /*初始化函数*/
STUDENT *create(); /*创建链表*/
STUDENT *delete(STUDENT *h); /*删除记录*/
/* 显示所有记录*/ void print(STUDENT *h);
void lookup(STUDENT *h); /*查找*/
void save(STUDENT *h); /*保存*/
/*读入记录*/ STUDENT *load();
void computer(STUDENT *h); /*计算总分和均分*/
STUDENT *Modify(STUDENT *h); /*修改记录*/
void append(); /*追加记录*/
STUDENT *sort(STUDENT *h); /*按总分排序*/
STUDENT *index(STUDENT *h); /*按学号排序*/
int menu_select(); /*菜单函数*/
/******主函数开始*******/
main()
{
int i;
STUDENT *head; /*链表定义头指针*/
printf("\n\n\n\n\n\n\n\n\n");
printf(" * * ******* * ***** ***** * * ******* \n");
printf(" * * * * * * * ** *
* * \n");
printf(" * * * * ******* * * * * * *** * ******* \n" );
printf(" * * *
* * * * * * * * * * \n");
printf(" * * ******* ******* ***** *
*** * * * ******* \n");
printf("\n");
printf("\n");
printf("\n");
sleep(2);
head=init(); /*初始化链表*/
clrscr(); /*清屏*/
for(;;) /*无限循环*/
{
switch(menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/
{ /*值不同,执行的函数不同,break 不能省略*/
case 0:head=init();break; /*执行初始化*/
case 1:head=create();break; /*创建链表*/
case 2:print(head);break; /*显示全部记录*/
case 3:head=delete(head);break; /*删除记录*/
case 4:lookup(head);break; /*按名字查找记录*/
case 5:save(head);break; /*保存文件*/
case 6:head=load(); break; /*读文件*/
case 7:computer(head);break; /*计算总分和均分*/
case 8:head=Modify(head); break; /*修改记录,一般会插在表尾*/
case 9:head=sort(head);break; /*按部分排序*/
case 10:append();break; /*追加记录*/
case 11:head=index(head);break; /*按学号排序*/
case 12: exit(0); /*如菜单返回值为14程序结束*/
}
}
}
/*菜单函数,返回值为整数*/
menu_select()
{
char *menu[]={"***************MENU***************", /*定义菜单字符串数组*/
" 00. init list", /*初始化*/
" 01. Enter list", /*输入记录*/
" 02. print list ", /*显示单链表中所有记录*/
" 03. Delete a record from list", /*从表中删除记录*/
" 04. Search record on name", /*按照姓名查找记录*/
" 05. Save the file", /*将单链表中记录保存到文件中*/
" 06. Load the file", /*从文件中读入记录*/
" 07. compute the score", /*计算所有学生的总分和均分*/
" 08. Modify an information ", /*修改某学号的信息*/
" 09. sort to make new file", /*排序*/
" 10. append record to file", /*追加记录到文件中*/
" 11. index on nomber", /*按学号排序*/
" 12. Quit"}; /*退出*/
char s[3]; /*以字符形式保存选择号*/
int c,i; /*定义整形变量*/
gotoxy(1,1); /*移动光标*/
textcolor(YELLOW); /*设置文本显示颜色为黄色*/
textbackground(BLUE); /*设置背景颜色为蓝色*/
gotoxy(10,2); /*移动光标*/
putch(0xc9); /*输出左上角边框?*/
for(i=1;i<44;i++)
putch(0xcd); /*输出上边框水平线*/
putch(0xbb); /*输出右上角边框 ?*/
for(i=3;i<20;i++)
{
gotoxy(10,i);putch(0xba); /*输出左垂直线*/
gotoxy(54,i);putch(0xba);
} /*输出右垂直线*/
gotoxy(10,20);putch(0xc8); /*输出左上角边框?*/
for(i=1;i<44;i++)
putch(0xcd); /*输出下边框水平线*/
putch(0xbc); /*输出右下角边框?*/
window(11,3,53,19); /* 制作显示菜单的窗口,大小根据菜单条数设
计*/
clrscr(); /*清屏*/
for(i=0;i<16;i++) /*输出主菜单数组*/
{
gotoxy(10,i+1);
cprintf("%s",menu[i]);
}
textbackground(BLACK); /*设置背景颜色为黑色*/
window(1,1,80,25); /*恢复原窗口大小*/
gotoxy(10,21); /*移动光标*/
do{printf("\n make by wenwei");
printf("\n Enter you choice(0~13):"); /*在菜单窗口外显示
提示信息*/
scanf("%s",s); /*输入选择项*/
c=atoi(s); /*将输入的字符串转化为整形数*/
}while(c<0||c>14); /*选择项不在0~14之间重输*/
return c; /*返回选择项,主程序根据该数调用相应的函数*/
}
STUDENT *init()
{ clrscr();
return NULL;
}
/*创建链表*/
STUDENT *create()
{
int i; int s;
STUDENT *h=NULL,*info; /* STUDENT指向结构体的指针*/
clrscr();
for(;;)
{
info=(STUDENT *)malloc(sizeof(STUDENT)); /*申请空间*/
if(!info) /*如果指针info为空*/
{
printf("\nout of memory"); /*输出内存溢出*/
return NULL; /*返回空指针*/
}
inputs("enter no:",info->no,11); /*输入学号并校验*/
if(info->no[0]=='@') { clrscr();break; } /*如果学号首字符为@则结束输入,清屏后返回*/
inputs("enter name:",info->name,15); /*输入姓名,并进行校验*/
printf("please input %d score \n",N); /*提示开始输入成绩*/
s=0; /*计算每个学生的总分,初值为0*/
for(i=0;iscore[i]); /*输入成绩*/
if(info->score[i]>100||info->score[i]<0) /*确保成绩在0~100之间*/
printf("bad data,repeat input\n"); /*出错提示信息*/
}while(info->score[i]>100||info->score[i]<0);
s=s+info->score[i]; /*累加各门课程成绩*/
}
info->sum=s; /*将总分保存*/
info->average=(float)s/N; /*求出平均值*/
info->order=0; /*未排序前此值为0*/
info->next=h; /*将头结点做为新输入结点的后继结点*/
h=info; /*新输入结点为新的头结点*/
clrscr();
}
return(h); /*返回头指针*/
}
/*输入字符串,并进行长度验证*/
inputs(char *prompt, char *s, int count)
{
char p[255];
do{
printf(prompt); /*显示提示信息*/
scanf("%s",p); /*输入字符串*/
if(strlen(p)>count)printf("\n too long! \n"); /*进行长度校验,超过count值重输入*/
}while(strlen(p)>count);
strcpy(s,p); /*将输入的字符串拷贝到字符串s中*/
}
/*输出链表中结点信息*/
void print(STUDENT *h)
{
int i=0; /* 统计记录条数*/
STUDENT *p; /*移动指针*/
clrscr(); /*清屏*/
p=h; /*初值为头指针*/
printf("\n\n\n*********************************STUDENT************
************************\n");
printf("|rec|nO | name | sc1| sc2| sc3|
sc4| sum | ave |order|\n");
----------|---------------|----|----|----|----|------ printf("|---|
--|--------|-----|\n");
while(p!=NULL) /*只要p不是尾结点,就输出记录*/
{
i++;
printf("|%3d|%-10s|%-15s|%4d|%4d|%4d|%4d| %6.2f | %6.2f | %3d
|\n", i,
p->no,p->name,p->score[0],p->score[1],p->score[2],p->score[3],p->sum,
p->average,p->order);
p=p->next;
}
printf("***********************************end********************
******************\n");
getch(); /*输入任一键返回主菜单*/
clrscr(); /*清屏*/
}
/*删除记录*/
STUDENT *delete(STUDENT *h) {
STUDENT *p,*q; /*p为查找到要删除的结点指针,q为其前驱指针*/
char s[12]; /*存放学号*/
char *pass="wenwei28";
char a[20],b=NULL;
int i=0;
clrscr();
printf("Input your password:");
while((i<20)&&(b!='\r'))
{
b=getch(); /*无回显输入*/
if(b==8)
{ if(i>0)
{
a[--i]=NULL;
putchar(8); /*退格键*/
putchar(' '); /*以空格代替*/
putchar(8);
}
else putchar(7); /*没有任何字符的退格,响铃警告*/
}
else if(b!='\r')
{
/*只要不是退格和回车就接受*/ a[i++]=b;
putchar('*');
}
else
{
a[i]=NULL; break; /*密码输入完了,记得加个NULL到后面*/
}
}
if(strcmp(a,pass)!=0)
{
clrscr();
printf("Password is mistake Tow seconds to return!");
sleep(2);clrscr();return h;
}
else {printf("Password is OK! Welcome to come!"); sleep(3);
}
clrscr(); /*清屏*/
printf("please deleted no\n"); /*显示提示信息*/
scanf("%s",s); /*输入要删除记录的学号*/
q=p=h; /*给q和p赋初值头指针*/
while(strcmp(p->no,s)&&p!=NULL) /*当记录的学号不是要找的,或指针不为空时*/
{
q=p; /*将p指针值赋给q作为p的前驱指针*/
p=p->next; /*将p指针指向下一条记录*/
}
if(p==NULL) /*如果p为空,说明链表中没有该结点*/
{
printf("\nlist no %s student\n",s);sleep(2);clrscr();return h;}
else /*p不为空,显示找到的记录信息*/
{
printf("*********************************have found********************************\n");
printf("|no | name | sc1| sc2| sc3| sc4| sum | ave |order|\n");
printf("|------------|---------------|----|----|----|----|-----
---|--------|-----|\n");
printf("|%-12s|%-15s|%4d|%4d|%4d|%4d| %6.2f | %6-5.2f | %3d |\n",
p->no,
p->name,p->score[0],p->score[1],p->score[2],p->score[3],p->sum
,
p->average,p->order);
printf("************************************end****************
*********************\n");
getch(); /*按任一键后,开始删除*/
if(p==h) /*如果p==h,说明被删结点是头结点*/
h=p->next; /*修改头指针指向下一条记录*/
else
q->next=p->next; /*不是头指针,将p的后继结点作为q的后继结点*/
free(p); /*释放p所指结点空间*/
printf("\n have deleted No %s student\n",s);
printf("Don't forget save\n");/*提示删除后不要忘记保存文件*/
sleep(2);clrscr();
}
return(h); /*返回头指针*/
}
/*按名字查找记录*/
void lookup(STUDENT *h)
{
STUDENT *p; /*移动指针*/
char s[15]; /*存放姓名的字符数组*/
clrscr(); /*清屏幕*/
printf("please enter name for lookup\n");
scanf("%s",s); /*输入姓名*/
p=h; /*将头指针赋给p*/
while(strcmp(p->name,s)&&p!=NULL) /*当记录的姓名不是要找的,或指针
不为空时*/
p=p->next; /*移动指针,指向下一结点*/
if(strcmp(p->name,s)) /*如果p结点不是要找的记录。注意不能
用p!=NULL 做判断条件,因为不能判断最后一个结点*/
{
printf("\nlist no %s student\n",s); sleep(2);clrscr();} /*显示没有该学生*/
else /*显示找到的记录信息*/
{
printf("\n\n**********************************havefound********
************************\n");
printf("|nO | name | sc1| sc2| sc3|
sc4| sum | ave |order|\n");
printf("|------------|---------------|----|----|----|----|-----
---|--------|-----|\n");
printf("|%-12s|%-15s|%4d|%4d|%4d|%4d| %6.2f | %6.2f | %3d |\n",
p->no,
p->name,p->score[0],p->score[1],p->score[2],p->score[3],p->sum,p->ave
rage,p->order);
printf("************************************end****************
********************\n");
getch();clrscr();
}
}
/*保存数据到文件*/
void save(STUDENT *h)
{
FILE *fp; /*定义指向文件的指针*/
STUDENT *p; /* 定义移动指针*/
char outfile[10]; /*保存输出文件名*/
clrscr();
printf("Enter outfile name,for example c:\\f1\\te.txt:\n"); /*提示文件名格式信息*/
scanf("%s",outfile);
if((fp=fopen(outfile,"wb"))==NULL) /*为输出打开一个二进制文件,如没有则建立*/
{
printf("can not open file\n");
sleep(2);clrscr();
}
printf("\nSaving file......\n"); /*打开文件,提示正在保存*/
p=h; /*移动指针从头指针开始*/
while(p!=NULL) /*如p不为空*/
{
fwrite(p,sizeof(STUDENT),1,fp);/*写入一条记录*/
p=p->next; /*指针后移*/
}
fclose(fp); /*关闭文件*/
printf("-----save success!!-----\n"); /*显示保存成功*/
getch();clrscr();
}
/* 从文件读数据*/
STUDENT *load()
{
STUDENT *p,*q,*h=NULL; /*定义记录指针变量*/
FILE *fp; /* 定义指向文件的指针*/
char infile[10]; /*保存文件名*/
clrscr();
printf("Enter infile name,for example c:\\f1\\te.txt:\n"); scanf("%s",infile); /*输入文件名*/
if((fp=fopen(infile,"rb"))==NULL) /*打开一个二进制文件,为读方式*/
{
printf("can not open file\n"); /*如不能打开,则结束程序*/
sleep(2);clrscr();return h;
}
printf("\n -----Loading file!-----\n");
/*申请空间*/ p=(STUDENT *)malloc(sizeof(STUDENT));
if(!p)
{
printf("out of memory!\n"); /*如没有申请到,则内存溢出*/
sleep(2);clrscr();return h; /*返回空头指针*/
}
h=p; /*申请到空间,将其作为头指针*/
while(!feof(fp)) /*循环读数据直到文件尾结束*/
{
if(1!=fread(p,sizeof(STUDENT),1,fp))
break; /*如果没读到数据,跳出循环*/
p->next=(STUDENT *)malloc(sizeof(STUDENT)); /*为下一个结点申请空间*/
if(!p->next)
{
printf("out of memory!\n"); /*如没有申请到,则内存溢出*/
sleep(2);clrscr();return h ;
}
q=p; /*保存当前结点的指针,作为下一结点的前驱*/
p=p->next; /*指针后移,新读入数据链到当前表尾*/
}
q->next=NULL; /*最后一个结点的后继指针为空*/
fclose(fp); /*关闭文件*/
printf("---You have success read data from file!!!---\n");
getch(); /*按任意键返回主菜单*/
clrscr();
return h; /*返回头指针*/
}
/*成绩统计*/
void computer(STUDENT *h)
{
STUDENT *p,*t,*q; /*定义移动指针*/
float saverage[N]={0}; /*均分初值为0*/
int i;
clrscr();
for (i=0;iscore[i]; /*累加总分*/
j++; /*统计记录条数*/
p=p->next; /*指针后移*/
}
saverage[i]=(float)s/j;/* 求均分,均分为浮点数,总分为整数,所以做类型转换*/
p=h;
while(p!=NULL)
{
if (p->score[i]>saverage[i]) {n++; p=p->next; } /*指针后移*/
else p=p->next;
}
printf("score%d average is %5.2f, Big in the arerage
numbers %d. \n",i+1,saverage[i],n);
p=h;
q=h;
while(p!=NULL) /*当p不为空时处理*/
{
if (p->score[i]score[i]) p=p->next;
else {q=p;p=p->next; } }
printf("\n\n\n*********************************STUDENT************
*************************\n");
printf("|rec|nO | name | sc1| sc2| sc3|
sc4| sum | ave |order|\n");
printf("|---|----------|---------------|----|----|----|----|------
--|--------|-----|\n");
printf("|%3d|%-10s|%-15s|%4d|%4d|%4d|%4d| %4.2f | %6.2f | %3d |\n",
i+1,
q->no,q->name,q->score[0],q->score[1],q->score[2],q->score[3],q->sum,
q->average,q->order);
printf("***********************************end********************
*******************\n");
getch();
clrscr();
}
}
/*修改信息*/
STUDENT *Modify(STUDENT *h) {
STUDENT *p,*q,*info; /* q是前驱结点,p指向插入位置,info指新插入记录*/
/*保存修改点位置的学号*/ char s[11];
int s1,i;
clrscr();
\nplease new record\n"); /*提示输入记录信息*/ printf("
info=(STUDENT *)malloc(sizeof(STUDENT)); /*申请空间*/
if(!info)
{
printf("\nout of memory"); /*如没有申请到,内存溢出*/
sleep(2);clrscr();return NULL; /*返回空指针*/
}
inputs("enter no:",info->no,11); /*输入学号并校验*/
if(info->no[0]=='@') { clrscr();return h; } /*如果学号首字符为@则结束输入,清屏后返回*/
inputs("enter name:",info->name,15); /*输入姓名*/
printf("please input %d score \n",N); /*提示输入分数*/
s1=0; /*保存新记录的总分,初值为0*/
for(i=0;iscore[i]);
if(info->score[i]>100||info->score[i]<0)
printf("bad data,repeat input\n");
} while(info->score[i]>100||info->score[i]<0); /*如果输入数据不合要求则重输*/
s1=s1+info->score[i]; /*计算总分*/
}
info->sum=s1; /*将总分存入新记录中*/
info->average=(float)s1/N; /*计算均分*/
info->order=0; /*名次赋值0*/
info->next=NULL; /*设后继指针为空*/
p=h; /*将头指针赋值给p*/
while(strcmp(p->no,info->no)&&p!=NULL) /*查找修改位置*/
{
p=p->next; /*将指针p后移*/
}
if(!strcmp(p->no,info->no)) /*如时没有第到,说明没有指定结点*/
{
strcpy( p->no,info->no);
strcpy( p->name,info->name);
p->score[0]=info->score[0];
p->score[1]=info->score[1];
p->score[2]=info->score[2];
p->score[3]=info->score[3];
p->sum=info->sum;
p->average=info->average;
p->order=info->order;
printf("***Modify success!***\n");
printf("Don't forget save\n");/*提示删除后不要忘记保存文件*/
sleep(2);clrscr();return h; /*返回头指针*/
}
else
printf("\n ***Find out No.%s student***\n",info->no);
sleep(2);clrscr();return h; /*返回头指针*/
}
/*排序*/
STUDENT *sort(STUDENT *h)
{
int i=0; /*保存名次*/
STUDENT *p,*q,*t,*h1; /*定义临时指针*/
clrscr();
h1=h->next; /*将原表的头指针所指的下一个结点作头指针*/
h->next=NULL; /*第一个结点为新表的头结点*/
while(h1!=NULL) /*当原表不为空时,进行排序*/
{
t=h1; /*取原表的头结点*/
h1=h1->next; /*原表头结点指针后移*/
p=h; /*设定移动指针p,从头指针开始*/
q=h; /*设定移动指针q做为p的前驱,初值为头指针*/
while(t->sumsum&&p!=NULL) /*作总分比较*/
{
q=p; /*待排序点值小,则新表指针后移*/
p=p->next;
}
if(p==q) /*p==q,说明待排序点值大,应排在首位*/
{
t->next=p; /*待排序点的后继为p*/
h=t; /*新头结点为待排序点*/
}
else /*待排序点应插入在中间某个位置q和p之间,如p为空则是尾部*/
{
t->next=p; /*t的后继是p*/
q->next=t; /*q的后继是t*/
}
}
p=h; /*已排好序的头指针赋给p,准备填写名次*/
/*当p不为空时,进行下列操作*/ while(p!=NULL)
{
i++; /*结点序号*/
p->order=i; /*将名次赋值*/
p=p->next; /*指针后移*/
}
printf("sort sucess!!!\n"); /*排序成功*/
sleep(2);clrscr();
return h; /*返回头指针*/
}
/*追加记录到文件*/
void append()
{
FILE *fp; /*定义指向文件的指针*/
STUDENT *info; /*新记录指针*/
int s1,i;
char infile[10]; /*保存文件名*/
clrscr();
printf("\nplease new record\n");
info=(STUDENT *)malloc(sizeof(STUDENT)); /*申请空间*/
if(!info)
{
printf("\nout of memory"); /*没有申请到,内存溢出本函数结束*/
sleep(2);clrscr();return;
}
inputs("enter no:",info->no,11); /*输入学号并校验*/
if(info->no[0]=='@') { clrscr(); return;} /*如果学号首字符为@则结束输入,清屏后返回*/
inputs("enter name:",info->name,15); /*调用inputs输入姓名*/
printf("please input %d score \n",N); /*提示输入成绩*/
s1=0;
for(i=0;iscore[i]); /*输入成绩*/
if(info->score[i]>100||info->score[i]<0)printf("bad data,repeat
input\n");
}while(info->score[i]>100||info->score[i]<0); /*成绩数据验证*/
s1=s1+info->score[i]; /*求总分*/
}
info->sum=s1; /*保存总分*/
info->average=(float)s1/N; /*求均分*/
->order=0; /*名次初始值为0*/ info
info->next=NULL; /*将新记录后继指针赋值为空*/
printf("Enter infile name,for example c:\\f1\\te.txt:\n"); scanf("%s",infile); /*输入文件名*/
if((fp=fopen(infile,"ab"))==NULL) /*向二进制文件尾增加数据方式打开文件*/
{
printf("can not open file\n"); /*显示不能打开*/
sleep(2);clrscr();return; /*退出程序*/
}
printf("\n -----Appending record!-----\n");
if(1!=fwrite(info,sizeof(STUDENT),1,fp)) /*写文件操作*/
{
printf("-----file write error!-----\n");
sleep(2);clrscr();return; /*返回*/
}
printf("-----append sucess!!----\n");
fclose(fp); /*关闭文件*/
getch();clrscr();return;
}
/*按学号排序*/
STUDENT *index(STUDENT *h)
{
STUDENT *p,*q,*t,*h1; /*定义临时指针*/
clrscr();
h1=h->next; /*将原表的头指针所指的下一个结点作头指针*/
h->next=NULL; /*第一个结点为新表的头结点*/
while(h1!=NULL) /*当原表不为空时,进行排序*/
{
t=h1; /*取原表的头结点*/
h1=h1->next; /*原表头结点指针后移*/
p=h; /*设定移动指针p,从头指针开始*/
q=h; /*设定移动指针q做为p的前驱,初值为头指针*/
while(strcmp(t->no,p->no)>0&&p!=NULL) /*作学号比较*/
{
q=p; /*待排序点值大,应往后插,所以新表指针后移*/
p=p->next;
}
if(p==q) /*p==q,说明待排序点值小,应排在首位*/
{
t->next=p; /*待排序点的后继为p*/
h=t; /*新头结点为待排序点*/
}
else /*待排序点应插入在中间某个位置q和p之间,如p为空则是
尾部*/
{
t->next=p; /*t的后继是p*/
q->next=t; /*q的后继是t*/
}
}
printf("index sucess!!!\n"); /*索引排序成功*/
sleep(2);clrscr();return h; /*返回头指针*/ }
附2 参考文献
[1] 廖雷.罗代忠 C语言程序设计基础实验教程 .高等教育出版社,2005.7,056-765
[2] 谭浩强. C语言程序设计(第二版).清华大学出版社,1999.12,298-327
[3] 谭浩强. C语言程序设计题解与上机指导(第二版).清华大学出版社,1999
[4] 廖雷. C语言程序设计基础. 北京:高等教育出版社,2004
评分表
土木工程课程设计评分表
课程名称:C语言程序设计
项 目 评 价 设计方案的合理性与创造性
设计与调试结果
设计说明书的质量 答辩陈述与回答问题情况
课程设计周表现情况
综合成绩
教师签名:
日 期: