您好,欢迎来到钮旅网。
搜索
您的当前位置:首页中南大学C实验课程设计报告(学生信息管理系统)

中南大学C实验课程设计报告(学生信息管理系统)

来源:钮旅网


中南大学

《C/C++程序设计》课程设计

题 目 学生姓名 学生学号 专业班级

指导教师 完成时间

一、 设计目的:

1. 通过课程设计加强应用C/C++语言进行程序设计的能力。 2. 掌握用C++语言进行简单的菜单设计。

二、 设计要求:

1. 2. 3.

能够认真完成老师布置的设计任务。 在设计中充分运用所学知识。 设计期间按时出勤。

三、 设计任务:

设计包括如下几部分: (1) 主菜单如右图 (2) 完成各个子菜单设计。 (3) 退出菜单

用户选择子菜单“Quit”后,出现结束信息。如:“BYE BYE”等。正常结束程序。或者以动画形式结束。 实验1:

1.定义一个结构体,存放下列信息:

学号、姓名、性别、系名、班级名、电话号码、住址等 2.从控制台输入一个学生信息,并保存在一个结构体变量中 3.允许用户输入多个学员信息,保存在结构体数组中 4.在控制台上打印结构体数组中的每个学员信息

5.将结构体数组改为结构体指针数组,并且通过指针存放输入的学员信息 实验2:

自己动手编写下列函数(不调用系统函数) strlen strcpy strcat 实验3:

1、查找整数数组中的最大值和最小值 2、使用冒泡法对整数数组排序 3、对学员信息数组进行排序

4、对学员信息链表进行插、删、查、排序 实验4:

编写一个简单的学生信息管理系统

1. 将输入的学生数据存贮在单独的文件中,每个学生的信息至少包括:学号、姓名、性别、

系名、班级名、电话号码、住址等,可以对文件进行报表输出;

2. 用菜单进行管理。该学生信息管理系统实现功能包括:学生信息的输入、信息的显示、

信息的修改、学生信息的删除、按学号的排序、信息的查询等功能;用户输入1个选项,进行相应的操作;各模块要求能循环多次操作(输出报表除外),直到操作员回答不再进行为止,完成后要求能返回主菜单;

3. 数据输入:输入学生的相关信息,若用户输入数据或信息不正确,给出“错误”信息显

示,重复刚才的操作;至少要输入10个学生的数据;可以随时插入学生信息记录; 4. 每个学生数据能够进行修改并进行保存; 5. 可以根据学号或者姓名删除某学生数据;

6. 查询模块要求能按学号,按姓名,按班级等条件进行查询; 7. 界面要求美观,提示信息准确,所有功能可以反复使用。

四、 设计思想、流程图

1.学生成绩管理程序从总体设计方面来看,基本的功能包括主控模块,数据输入模块,数据修改模块,数据查询模块等。

主控模块 主界面 输入模块 2、详细设计

删除模块 查找模块 排序模块 输出模块 对于总体设计说明的软件模块,进一步细化,要说明各个模块的逻辑实现方法。下面逐个说明。

主控模块:主要完成初始化工作,包括屏幕的初始化,显示初始操作界面。初始界面中主要包括功能的菜单选择项。

程序运行流程图如下:

选择功能选项 开始 是否为“退出” N 执行相应功能 Y 退出 输入处理:利用链表技术输入多名学生的数据,直到输入学生的学号以“@”开头,则结束

数据的输入。程序运行流程图如下:

删除处理:利用链表技术删除某学号的学生成绩信息,如果找到该学号则进行删除,否则输出“未找到”的信息。程序运行流程图略。

查找处理:利用链表技术根据学生学号或姓名等方式查找某学号的学生成绩信息,其程序流程图略。

排序处理:利用链表技术根据学生学号对学生数据进行排序,其程序流程图略。

输入学生学号、姓名开始,定义变量 是否为“@”开头 N 输入成绩 Y 成绩<0 N Y 退出 五、 心得体会

通过此次语言C程序设计实践,我受益匪浅!课程设计是培养学生综合运用知识、发现、提

出、分析和解决问题、锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。回顾起此次课程设计,至今我仍感慨颇多,的确,从从拿到题目到完成整个编程,从理论到实践,在整整三周的日子里,可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,比如说结构体……通过这次课程设计之后,一定把以前所学过的知识重新温故。

六、 参考文献

《C语言成绩设计基础》

七、 附录源程序

实验1:#include struct student { char num[10]; char name[10]; char sex[3]; char major[10]; char banji[10]; char tele[10]; char address[20]; };

void main() {

struct student stu[2]; int i=0,j; do {

printf(\"Please input the number:\"); scanf(\"%s\

printf(\"Please input the name:\"); scanf(\"%s\

printf(\"Please input sex,M or F:\"); scanf(\"%s\

printf(\"Please input the major:\"); scanf(\"%s\

printf(\"Please input the classname:\"); scanf(\"%s\

printf(\"Please input the telephone number:\"); scanf(\"%s\

printf(\"Please input the address:\"); scanf(\"%s\ i++;

}while(i<1);

printf(\"Num\Name\sex\Major\Class\Tele\Address\\\n\"); for(j=0;j<=i;j++) {

printf(\"%-5s%-10s%5s%5s%6s%10s%11s\\n\jor,stu[j].banji,stu[j].tele,stu[j].address); }

getch();}

指针方法:#include \"stdlib.h\" #include \"stdio.h\" struct stud_type {char num[10]; char name[20]; char sex;

char class[10]; char major[10]; char tele[10];

char address[10];}; void main()

{struct stud_type student[2],*p; int i;

char numstr[20],answer;

for(i=0,p=student;i<2;p++,i++)

{printf(\"Enter all dara of student[%d]:\\n\

scanf(\"%s%s%c%s%s%s%s%s\ss);}

for(i=0,p=student;pprintf(\"%3d%10s%20s%5c%10s%10s%10s%10s\,p->tele,p->address); getch(); }

实验2:#include void main() {

char s1[80],s2[80];

void strlen(char s1[]);

void strcpy(char s1[],char s2[]); void strcat(char s1[],char s2[]); scanf(\"%s\ scanf(\"%s\ strlen(s1); strcat(s1,s2); strcpy(s1,s2); getch();}

void strlen(char s1[]) {int i=0;

while(s1[i]!='\\0') {i++;}

printf(\"The length of s1 is %d.\\n\ void strcpy(char s1[],char s2[]) {char *p,*q; p=s1;q=s2;

while(*q!='\\0') {*p=*q; p++;q++;} *p='\\0';

printf(\"%s\\n\ }

void strcat(char s1[],char s2[]) {int i=0; char *p,*q; p=s1;q=s2;

while(s1[i]!='\\0') {i++;} p+=i;

while(*q!='\\0') {*p=*q; p++;q++; }

*p='\\0';

printf(\"%s\\n\

实验3:

1.#include #define N 5 void main()

{int i,max,min; int a[N];

for(i=0;i{if(maxelse if(min>a[i]) min=a[i];}

printf(\"max:%d,min:%d\2.

#define N 5

#include void main()

{int a[N],temp,i,j;

printf(\"input numbers:\\n\"); for(i=0;ia[j+1])

{temp=a[j];a[j]=a[j+1];a[j+1]=temp;} for(i=0;i3. #include \"stdio.h\" struct stud {int no;

char name[10]; int score[3]; float average; };

indata(struct stud st[]) {int i;

for(i=0;i<10;i++)

{printf(\"number\");scanf(\"%d\ printf(\"name\");scanf(\"%s\

printf(\"score\");scanf(\"%d,%d,%d\; } }

outdata(struct stud st[]) {int i;

printf(\"number name score average\"); for(i=0;i<10;i++)

printf(\"%2d%5s%12d,%d,%d%10.2f\\n\1],st[i].score[2],st[i].average); }

main()

{struct stud st[10],temp; int i,j; float s;

printf(\"Please enter 10 students'data\");

indata(st);

for(i=0;i<10;i++) {s=0;

for(j=0;j<3;j++)s=s+st[i].score[j]; st[i].average=s/3; }

for(i=0;i<9;i++) for(j=i+1;j<10;j++)

if(st[i].average>st[j].average)

{temp=st[i];st[i]=st[j];st[j]=temp;} printf(\"The sorted data is:\"); outdata(st); }

4. /***********xuesheng.c***********/ /******头文件(.h)***********/ #include \"stdio.h\" /*I/O函数*/ #include \"stdlib.h\" /*其它说明*/ #include \"string.h\" /*字符串函数*/ #include \"conio.h\" /*屏幕操作函数*/ #include \"mem.h\" /*内存操作函数*/ #include \"ctype.h\" /*字符操作函数*/

#include \"alloc.h\" /*动态地址分配函数*/ #define N 3 /*定义常数*/

typedef struct z1 /*定义数据结构*/ {

char no[11]; char name[15]; char sex[5]; char major[15]; char class[15]; char tele[15]; char address[15]; int order;

struct z1 *next; }STUDENT;

/*以下是函数原型*/

STUDENT *init(); /*初始化函数*/ STUDENT *create(); /*创建链表*/

STUDENT *dele(STUDENT *h); /*删除记录*/ void print(STUDENT *h); /* 显示所有记录*/ void search(STUDENT *h); /*查找*/ STUDENT *sort(STUDENT *h); /*排序*/

int menu_select(); /*菜单函数*/ STUDENT *insert(STUDENT *h); /*插入记录*/ void save(STUDENT *h); /*保存*/ STUDENT *load(); /*读入记录*/

void inputs(char *prompt, char *s, int count); /******主函数开始*******/ main() {

int i;

STUDENT *head; /*链表定义头指针*/ head=init(); /*初始化链表*/ clrscr(); /*清屏*/ for(;;) /*无限循环*/ {

switch(menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件*/ { /*值不同,执行的函数不同,break 不能省略*/ case 0:head=init();break; /*执行初始化*/ case 1:head=create();break; /*创建链表*/ case 2:head=dele(head);break; /*删除记录*/ case 3:print(head);break; /*显示全部记录*/ case 4:search(head);break; /*查找记录*/

case 5:head=insert(head); break; /*插入记录*/ case 6:head=sort(head);break; /*排序*/ case 7:save(head);break; /*保存文件*/ case 8:head=load(); break; /*读文件*/

case 9:exit(0); /*如菜单返回值为14程序结束*/ } } }

/*菜单函数,返回值为整数*/ int menu_select() {

char *menu[]={\"***************MENU***************\定义菜单字符串数组*/ \" 0. init list\初始化*/ \" 1. Input\输入记录*/ \" 2. Delete\删除记录*/ \" 3. List\显示记录*/

\" 4. Seek(name)\查找*/

\" 5. insert record to list \插入记录到表中*/ \" 6. Sort\排序*/ \" 7. Save\保存*/

\" 8. Load\从文件中读入记录*/ \" 9. Quit\退出*/ \" \ \" \ \" \ \" \ \" \

char s[3]; /*以字符形式保存选择号*/ int c,i; /*定义整形变量*/ gotoxy(1,25); /*移动光标*/

printf(\"press any key enter menu......\\n\"); /*压任一键进入主菜单*/ getch(); /*输入任一键*/ clrscr(); /*清屏幕*/ 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(,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\ }

textbackground(BLACK); /*设置背景颜色为黑色*/ window(1,1,80,25); /*恢复原窗口大小*/ gotoxy(10,21); /*移动光标*/ do{

printf(\"\\n Enter you choice(0~9):\"); /*在菜单窗口外显示提示信息*/ scanf(\"%s\输入选择项*/

c=atoi(s); /*将输入的字符串转化为整形数*/ }while(c<0||c>9); /*选择项不在0~14之间重输*/

return c; /*返回选择项,主程序根据该数调用相应的函数*/ }

STUDENT *init() {

return NULL; }

/*创建链表*/

STUDENT *create() {

int i; int s;

STUDENT *h=NULL,*info; /* STUDENT指向结构体的指针*/ for(;;) {

info=(STUDENT *)malloc(sizeof(STUDENT)); /*申请空间*/ if(!info) /*如果指针info为空*/ {

printf(\"\\nout of memory\"); /*输出内存溢出*/ return NULL; /*返回空指针*/ }

inputs(\"enter no:(If you want to end,press @ )\输入学号并校验*/

if(info->no[0]=='@') break; /*如果学号首字符为@则结束输入*/ inputs(\"enter name:\输入姓名,并进行校验*/ inputs(\"enter sex:\输入性别,并进行校验*/

inputs(\"enter major:\输入专业名,并进行校验*/ inputs(\"enter class:\输入班级名,并进行校验*/ inputs(\"enter tele:\输入电话,并进行校验*/

inputs(\"enter address:\输入地址,并进行校验*/ info->next=h; /*将头结点做为新输入结点的后继结点*/ h=info; /*新输入结点为新的头结点*/ }

return(h); /*返回头指针*/ }

/*输入字符串,并进行长度验证*/

void inputs(char *prompt, char *s, int count) { char p[255]; do{

printf(prompt); /*显示提示信息*/ scanf(\"%s\输入字符串*/

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 | sex |major|class | tele | address |\\n\"); printf(\"|---|-----|----------|-----|-----|------|----------|-----------|\\n\"); while(p!=NULL) {

i++;

printf(\"|%3d|%-5s|%-10s|%5s|%5s|%6s|%10s|%11s|\\n\i, p->no,p->name,p->sex,p->major,p->class,p->tele,p->address); p=p->next; }

printf(\"**********************************end*********************************\\n\"); }

/*删除记录*/

STUDENT *dele(STUDENT *h) {

STUDENT *p,*q; /*p为查找到要删除的结点指针,q为其前驱指针*/ char s[11]; /*存放学号*/ clrscr(); /*清屏*/

printf(\"please deleted no\\n\"); /*显示提示信息*/ scanf(\"%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\

else /*p不为空,显示找到的记录信息*/ {

printf(\"\\n\\n\\n****************************STUDENT********************************\\n\");

printf(\"|nO | name | sex |major|class | tele | address |\\n\");

printf(\"|---|-----|----------|-----|-----|------|----------|-----------|\\n\");

printf(\"|%-5s|%-10s|%5s|%5s|%6s|%10s|%11s|\\n\ass,p->tele,p->address);

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\

printf(\"Don't forget save\\n\");/*提示删除后不要忘记保存文件*/ }

return(h); /*返回头指针*/ }

/*查找记录*/

void search(STUDENT *h) {

STUDENT *p; /* 移动指针*/

char s[15]; /*存放姓名的字符数组*/ clrscr(); /*清屏幕*/

printf(\"please enter name for search\\n\"); scanf(\"%s\输入姓名*/ p=h; /*将头指针赋给p*/

while(strcmp(p->name,s)&&p!=NULL) /*当记录的姓名不是要找的,或指针不为空时*/ p=p->next; /*移动指针,指向下一结点*/ if(p==NULL) /*如果指针为空*/

printf(\"\\nlist no %s student\\n\显示没有该学生*/ else /*显示找到的记录信息*/

{printf(\"\\n\\n\\n****************************STUDENT********************************\\n\");

printf(\"|nO | name | sex |major|class | tele | address |\\n\"); printf(\"|-----|----------|-----|-----|------|----------|-----------|\\n\") ;

printf(\"|%-5s|%-10s|%5s|%5s|%6s|%10s|%11s|\\n\ass,p->tele,p->address);

printf(\"********************************end*******************************\\n\"); } }

/*排序*/

STUDENT *sort(STUDENT *h) {

int i=0; /*保存名次*/ STUDENT *p,*q,*t,*h1; /*定义临时指针*/

h1=h->next; /*将原表的头指针所指的下一个结点作头指针*/ h->next=NULL; /*第一个结点为新表的头结点*/ while(h1!=NULL) /*当原表不为空时,进行排序*/ {

t=h1; /*取原表的头结点*/

h1=h1->next; /*原表头结点指针后移*/

p=h; /*设定移动指针p,从头指针开始*/

q=h; /*设定移动指针q做为p的前驱,初值为头指针*/ while(t->nono&&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,准备填写名次*/ while(p!=NULL) /*当p不为空时,进行下列操作*/ {

i++; /*结点序号*/

p->order=i; /*将名次赋值*/ p=p->next; /*指针后移*/ }

printf(\"sort sucess!!!\\n\"); /*排序成功*/ return h; /*返回头指针*/ }

STUDENT *insert(STUDENT *h) {

STUDENT *p,*q,*info; /*p指向插入位置,q是其前驱,info指新插入记录*/ char s[11]; /*保存插入点位置的学号*/ int s1,i;

printf(\"please enter location before the no\\n\"); scanf(\"%s\输入插入点学号*/

printf(\"\\nplease new record\\n\"); /*提示输入记录信息*/ info=(STUDENT *)malloc(sizeof(STUDENT)); /*申请空间*/ if(!info) {

printf(\"\\nout of memory\"); /*如没有申请到,内存溢出*/ return NULL; /*返回空指针*/ }

inputs(\"enter no:\输入学号并校验*/

inputs(\"enter name:\输入姓名,并进行校验*/ inputs(\"enter sex:\输入性别,并进行校验*/

inputs(\"enter major:\输入专业名,并进行校验*/ inputs(\"enter class:\输入班级名,并进行校验*/ inputs(\"enter tele:\输入电话,并进行校验*/

inputs(\"enter address:\输入地址,并进行校验*/ info->order=0; /*名次赋值0*/ info->next=NULL; /*设后继指针为空*/ p=h; /*将指针赋值给p*/ q=h; /*将指针赋值给q*/

while(strcmp(p->no,s)&&p!=NULL) /*查找插入位置*/ {

q=p; /*保存指针p,作为下一个p的前驱*/ p=p->next; /*将指针p后移*/ }

if(p==NULL) /*如果p指针为空,说明没有指定结点*/ if(p==h) /*同时p等于h,说明链表为空*/ h=info; /*新记录则为头结点*/ else

q->next=info; /*p为空,但p不等于h,将新结点插在表尾*/ else

if(p==h) /*p不为空,则找到了指定结点*/ {

info->next=p; /*如果p等于h,则新结点插入在第一个结点之前*/ h=info; /*新结点为新的头结点*/ } else {

info->next=p; /*不是头结点,则是中间某个位置,新结点的后继为p*/ q->next=info; /*新结点作为q的后继结点*/ }

printf(\"\\n ----have inserted %s student----\\n\forget save---\\n\"); /*提示存盘*/ return(h); /*返回头指针*/ }

/* 从文件读数据*/ STUDENT *load() {

STUDENT *p,*q,*h=NULL; /*定义记录指针变量*/ FILE *fp; /* 定义指向文件的指针*/ char infile[10]; /*保存文件名*/

printf(\"Enter infile name,for example c:\\\\f1\\\e.txt:\\n\"); scanf(\"%s\/*输入文件名*/

if((fp=fopen(infile,\"rb\"))==NULL) /*打开一个二进制文件,为读方式*/ {

printf(\"can not open file\\n\"); /*如不能打开,则结束程序*/ exit(1); }

printf(\"\\n -----Loading file!-----\\n\");

p=(STUDENT *)malloc(sizeof(STUDENT)); /*申请空间*/ if(!p) {

printf(\"out of memory!\\n\"); /*如没有申请到,则内存溢出*/ 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\"); /*如没有申请到,则内存溢出*/ return h; }

q=p; /*保存当前结点的指针,作为下一结点的前驱*/ p=p->next; /*指针后移,新读入数据链到当前表尾*/ }

q->next=NULL; /*最后一个结点的后继指针为空*/ fclose(fp); /*关闭文件*/

printf(\"---You have success read data from file!!!---\\n\"); return h; /*返回头指针*/ } /*保存数据到文件*/ void save(STUDENT *h) {

FILE *fp; /*定义指向文件的指针*/ STUDENT *p; /* 定义移动指针*/

char outfile[10]; /*保存输出文件名*/

printf(\"Enter outfile name,for example c:\\\\f1\\\e.txt:\\n\"); /*提示文件名格式信息*/

scanf(\"%s\

if((fp=fopen(outfile,\"wb\"))==NULL) /*为输出打开一个二进制文件,如没有则建立*/ {

printf(\"can not open file\\n\"); exit(1); }

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\"); /*显示保存成功*/ }

实验4:/***********xuesheng.c***********/ /******头文件(.h)***********/ #include \"stdio.h\" /*I/O函数*/ #include \"stdlib.h\" /*其它说明*/ #include \"string.h\" /*字符串函数*/ #include \"conio.h\" /*屏幕操作函数*/ #include \"mem.h\" /*内存操作函数*/ #include \"ctype.h\" /*字符操作函数*/

#include \"alloc.h\" /*动态地址分配函数*/ #define N 3 /*定义常数*/

typedef struct z1 /*定义数据结构*/ {

char no[11]; char name[15]; char sex[5]; char major[15]; char class[15]; char tele[15]; char address[15]; int order;

struct z1 *next; }STUDENT;

/*以下是函数原型*/

STUDENT *init(); /*初始化函数*/ STUDENT *create(); /*创建链表*/ void edit(); /*修改记录*/

STUDENT *dele(STUDENT *h); /*删除记录*/ void print(STUDENT *h); /* 显示所有记录*/ void search1(STUDENT *h); /*查找*/ void search2(STUDENT *h); /*查找*/ void search3(STUDENT *h); /*查找*/ STUDENT *sort(STUDENT *h); /*排序*/

int menu_select(); /*菜单函数*/ void save(STUDENT *h); /*保存*/ STUDENT *load(); /*读入记录*/

void inputs(char *prompt, char *s, int count); /******主函数开始*******/ main() {

int i;

STUDENT *head; /*链表定义头指针*/ 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:edit();break; /*修改记录*/

case 4:head=dele(head);break; /*删除记录*/ case 5:head=sort(head);break; /*排序*/ case 6:search1(head);break; /*查找记录*/ case 7:search2(head);break; /*查找记录*/ case 8:search3(head);break; /*查找记录*/ case 9:save(head);break; /*保存文件*/ case 10: head=load(); break; /*读文件*/

case 11:exit(0); /*如菜单返回值为14程序结束*/} } }

/*菜单函数,返回值为整数*/ int menu_select() {

char *menu[]={\"***************MENU***************\定义菜单字符串数组*/ \" 0. init list\初始化*/ \" 1. Input\输入记录*/ \" 2. List\显示记录*/

\" 3. Edit \修改记录*/ \" 4. Delete\删除记录*/ \" 5. Sort\排序*/

\" 6. Seek(name)\查找*/ \" 7. Seek(number)\查找*/ \" 8. Seek(class)\查找*/ \" 9. Save\保存*/

\" 10. Load\从文件中读入记录*/ \" 11.Quit\退出*/ \" \ \" \ \" \

char s[3]; /*以字符形式保存选择号*/ int c,i; /*定义整形变量*/ gotoxy(1,25); /*移动光标*/

printf(\"press any key enter menu......\\n\"); /*压任一键进入主菜单*/ getch(); /*输入任一键*/ clrscr(); /*清屏幕*/ 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(,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\ }

textbackground(BLACK); /*设置背景颜色为黑色*/ window(1,1,80,25); /*恢复原窗口大小*/ gotoxy(10,21); /*移动光标*/ do{

printf(\"\\n Enter you choice(0~11):\"); /*在菜单窗口外显示提示信息*/ scanf(\"%s\输入选择项*/

c=atoi(s); /*将输入的字符串转化为整形数*/ }while(c<0||c>11); /*选择项不在0~11之间重输*/

return c; /*返回选择项,主程序根据该数调用相应的函数*/ }

STUDENT *init() {

return NULL; }

/*创建链表*/

STUDENT *create() {

int i; int s;

STUDENT *h=NULL,*info; /* STUDENT指向结构体的指针*/ for(;;) {

info=(STUDENT *)malloc(sizeof(STUDENT)); /*申请空间*/ if(!info) /*如果指针info为空*/ {

printf(\"\\nout of memory\"); /*输出内存溢出*/ return NULL; /*返回空指针*/ }

inputs(\"enter no:(If you want to end,press @ )\输入学号并校验*/

if(info->no[0]=='@') break; /*如果学号首字符为@则结束输入*/ inputs(\"enter name:\输入姓名,并进行校验*/ inputs(\"enter sex:\输入性别,并进行校验*/

inputs(\"enter major:\输入专业名,并进行校验*/ inputs(\"enter class:\输入班级名,并进行校验*/ inputs(\"enter tele:\输入电话,并进行校验*/

inputs(\"enter address:\输入地址,并进行校验*/ info->next=h; /*将头结点做为新输入结点的后继结点*/

h=info; /*新输入结点为新的头结点*/ }

return(h); /*返回头指针*/ }

/*输入字符串,并进行长度验证*/

void inputs(char *prompt, char *s, int count) { char p[255]; do{

printf(prompt); /*显示提示信息*/ scanf(\"%s\输入字符串*/

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 | sex |major|class | tele | address |\\n\"); printf(\"|---|-----|----------|-----|-----|------|----------|-----------|\\n\"); while(p!=NULL) {

i++;

printf(\"|%3d|%-5s|%-10s|%5s|%5s|%6s|%10s|%11s|\\n\i, p->no,p->name,p->sex,p->major,p->class,p->tele,p->address); p=p->next; }

printf(\"**********************************end*********************************\\n\"); }

/*删除记录*/

STUDENT *dele(STUDENT *h) {

STUDENT *p,*q; /*p为查找到要删除的结点指针,q为其前驱指针*/ char s[11]; /*存放学号*/ clrscr(); /*清屏*/

printf(\"please deleted no\\n\"); /*显示提示信息*/ scanf(\"%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\

else /*p不为空,显示找到的记录信息*/ {

printf(\"\\n\\n\\n****************************STUDENT********************************\\n\");

printf(\"|nO | name | sex |major|class | tele | address |\\n\");

printf(\"|---|-----|----------|-----|-----|------|----------|-----------|\\n\");

printf(\"|%-5s|%-10s|%5s|%5s|%6s|%10s|%11s|\\n\s,p->tele,p->address);

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\

printf(\"Don't forget save\\n\");/*提示删除后不要忘记保存文件*/ }

return(h); /*返回头指针*/ }

/*查找记录*/

void search1(STUDENT *h) {

STUDENT *p; /* 移动指针*/

char s[15]; /*存放姓名的字符数组*/ clrscr(); /*清屏幕*/

printf(\"please enter name for search\\n\"); scanf(\"%s\输入姓名*/ p=h; /*将头指针赋给p*/

while(strcmp(p->name,s)&&p!=NULL) /*当记录的姓名不是要找的,或指针不为空时*/ p=p->next; /*移动指针,指向下一结点*/ if(p==NULL) /*如果指针为空*/

printf(\"\\nlist no %s student\\n\显示没有该学生*/ else /*显示找到的记录信息*/

{printf(\"\\n\\n\\n****************************STUDENT********************************\\n\");

printf(\"|nO | name | sex |major|class | tele | address |\\n\"); printf(\"|-----|----------|-----|-----|------|----------|-----------|\\n\") ;

printf(\"|%-5s|%-10s|%5s|%5s|%6s|%10s|%11s|\\n\s,p->tele,p->address);

printf(\"********************************end*******************************\\n\"); }

}

/*查找记录*/

void search2(STUDENT *h) {

STUDENT *p; /* 移动指针*/

char s[15]; /*存放学号的字符数组*/ clrscr(); /*清屏幕*/

printf(\"please enter number for search\\n\"); scanf(\"%s\输入学号*/ p=h; /*将头指针赋给p*/

while(strcmp(p->no,s)&&p!=NULL) /*当记录的学号不是要找的,或指针不为空时*/ p=p->next; /*移动指针,指向下一结点*/ if(p==NULL) /*如果指针为空*/

printf(\"\\nlist no %s student\\n\显示没有该学生*/ else /*显示找到的记录信息*/

{printf(\"\\n\\n\\n****************************STUDENT********************************\\n\");

printf(\"|nO | name | sex |major|class | tele | address |\\n\"); printf(\"|-----|----------|-----|-----|------|----------|-----------|\\n\") ;

printf(\"|%-5s|%-10s|%5s|%5s|%6s|%10s|%11s|\\n\s,p->tele,p->address);

printf(\"********************************end*******************************\\n\"); } }

/*查找记录*/

void search3(STUDENT *h) {

STUDENT *p; /* 移动指针*/

char s[15]; /*存放班级的字符数组*/ clrscr(); /*清屏幕*/

printf(\"please enter class for search\\n\"); scanf(\"%s\输入姓名*/ p=h; /*将头指针赋给p*/

while(strcmp(p->class,s)&&p!=NULL) /*当记录的班级不是要找的,或指针不为空时*/ p=p->next; /*移动指针,指向下一结点*/ if(p==NULL) /*如果指针为空*/

printf(\"\\nlist no %s student\\n\显示没有该学生*/ else /*显示找到的记录信息*/

{printf(\"\\n\\n\\n****************************STUDENT********************************\\n\");

printf(\"|nO | name | sex |major|class | tele | address |\\n\"); printf(\"|-----|----------|-----|-----|------|----------|-----------|\\n\") ;

printf(\"|%-5s|%-10s|%5s|%5s|%6s|%10s|%11s|\\n\s,p->tele,p->address);

printf(\"********************************end*******************************\\n\");

} }

/*保存数据到文件*/ void save(STUDENT *h) {

FILE *fp; /*定义指向文件的指针*/ STUDENT *p; /* 定义移动指针*/

char outfile[10]; /*保存输出文件名*/

printf(\"Enter outfile name,for example c:\\\\f1\\\e.txt:\\n\"); /*提示文件名格式信息*/

scanf(\"%s\

if((fp=fopen(outfile,\"wb\"))==NULL) /*为输出打开一个二进制文件,如没有则建立*/ {

printf(\"can not open file\\n\"); exit(1); }

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\"); /*显示保存成功*/ }

/* 从文件读数据*/ STUDENT *load() {

STUDENT *p,*q,*h=NULL; /*定义记录指针变量*/ FILE *fp; /* 定义指向文件的指针*/ char infile[10]; /*保存文件名*/ printf(\"Enter infile name,for example c:\\\\f1\\\e.txt:\\n\"); scanf(\"%s\/*输入文件名*/

if((fp=fopen(infile,\"rb\"))==NULL) /*打开一个二进制文件,为读方式*/ {

printf(\"can not open file\\n\"); /*如不能打开,则结束程序*/ exit(1); }

printf(\"\\n -----Loading file!-----\\n\");

p=(STUDENT *)malloc(sizeof(STUDENT)); /*申请空间*/ if(!p) {

printf(\"out of memory!\\n\"); /*如没有申请到,则内存溢出*/ 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\"); /*如没有申请到,则内存溢出*/ return h; }

q=p; /*保存当前结点的指针,作为下一结点的前驱*/ p=p->next; /*指针后移,新读入数据链到当前表尾*/ }

q->next=NULL; /*最后一个结点的后继指针为空*/ fclose(fp); /*关闭文件*/

printf(\"---You have success read data from file!!!---\\n\"); return h; /*返回头指针*/ }

/*排序*/

STUDENT *sort(STUDENT *h) {

int i=0; /*保存名次*/ STUDENT *p,*q,*t,*h1; /*定义临时指针*/

h1=h->next; /*将原表的头指针所指的下一个结点作头指针*/ h->next=NULL; /*第一个结点为新表的头结点*/ while(h1!=NULL) /*当原表不为空时,进行排序*/ {

t=h1; /*取原表的头结点*/

h1=h1->next; /*原表头结点指针后移*/

p=h; /*设定移动指针p,从头指针开始*/

q=h; /*设定移动指针q做为p的前驱,初值为头指针*/ while(t->nono&&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,准备填写名次*/ while(p!=NULL) /*当p不为空时,进行下列操作*/ {

i++; /*结点序号*/

p->order=i; /*将名次赋值*/

p=p->next; /*指针后移*/ }

printf(\"sort sucess!!!\\n\"); /*排序成功*/ return h; /*返回头指针*/ }

/*追加记录到文件*/ void edit() {

FILE *fp; /*定义指向文件的指针*/ STUDENT *info; /*新记录指针*/ int s1,i;

char infile[10]; /*保存文件名*/ printf(\"\\nplease new record\\n\");

info=(STUDENT *)malloc(sizeof(STUDENT)); /*申请空间*/ if(!info) {

printf(\"\\nout of memory\"); /*没有申请到,内存溢出本函数结束*/ return ; }

inputs(\"enter no:\输入学号并校验*/

inputs(\"enter name:\输入姓名,并进行校验*/ inputs(\"enter sex:\输入性别,并进行校验*/

inputs(\"enter major:\输入专业名,并进行校验*/ inputs(\"enter class:\输入班级名,并进行校验*/ inputs(\"enter tele:\输入电话,并进行校验*/

inputs(\"enter address:\输入地址,并进行校验*/ info->next=NULL; /*将新记录后继指针赋值为空*/ printf(\"Enter infile name,for example c:\\\\f1\\\e.txt:\\n\"); scanf(\"%s\/*输入文件名*/

if((fp=fopen(infile,\"ab\"))==NULL) /*向二进制文件尾增加数据方式打开文件*/ {

printf(\"can not open file\\n\"); /*显示不能打开*/ exit(1); /*退出程序*/ }

printf(\"\\n -----Edit record!-----\\n\");

if(1!=fwrite(info,sizeof(STUDENT),1,fp)) /*写文件操作*/ {

printf(\"-----file write error!-----\\n\"); return; /*返回*/ }

printf(\"-----edit sucess!!----\\n\"); fclose(fp); /*关闭文件*/ }

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- niushuan.com 版权所有 赣ICP备2024042780号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务