幼儿园学生信息管理系统

发布时间:2012-06-23 12:42:59   来源:文档文库   
字号:

《程序设计基础(C语言)》

课程设计说明书

院: 信息与电气工程学院

级: 电子系1001

号: 20093615276

名: 曹怀宝

胡凤珠

20126 21


作业要求:设计一个《幼儿园信息管理系统》。要求采用链式存储结构。按照班内学生学号(2位整数)次序排列。

每位小朋友的信息包含:学号、姓名、出生年月日、父亲姓名、父亲电话、母亲姓名、母亲电话、病史、本季度学费是否已交、本月餐费余额。

说明要求《幼儿园信息管理系统》界面简洁、友好,可实现下列功能:

1、初始化系统;

2、幼儿数据追加;

3、幼儿数据修改;(找到该生后,提示根据用户选择进行修改)

4、幼儿数据删除;

5、幼儿数据信息检索;(例如:输入学生姓名,输出该生所有信息)

6、本季度学费未交统计; (未交费的学生以下信息:班级、学号、姓名、父亲姓名、父亲电话、母亲姓名、母亲电话 写入到指定的本季度学费未交统计.txt文件

7、本月餐费余额不足0统计;(餐费余额不足0的学生以下信息:班级、学号、姓名、父亲姓名、父亲电话、母亲姓名、母亲电话 写入到指定的本月餐费余额不足0统计.txt文件

每个功能分别用函数实现。按照统一格式书写实验报告。

课程设计要求:

1.本课程设计作为《程序设计基础(C语言)》的期末考核,占该课程总成绩的70%

2.本课程设计的题目可以由老师指定或学生自选。

3.知识点要求包括:

1)文件常用操作(打开,读/写数据,关闭等);

2)选择结构;

3)循环结构;

4)自定义函数;

5)数组的使用;

6)指针的定义与引用;

7)结构体类型的定义与使用

注意:需要在源代码相应的位置注释出以上知识点;

4.课程设计的主体包括题目名称、算法分析、流程设计、代码设计及运行结果。

题目名称: 幼儿园学生信息管理系统

算法分析:(提示:该部分内容填写课程设计所实现的系统具有哪些功能模块,每个模块能完成的功能及需要考虑的逻辑算法。)

链表的定义(结构体)

struct Date

{

int year;

int month;

int day;

};

typedef struct Student

{

char classes[2];//

int num;//学号

char name[20];//姓名

struct Date birthday;/*出生日期*/

char Fname[20];/*父亲的姓名*/

char Mname[20];/*母亲的姓名*/

char Fnumber[15];/*父亲的电话*/

char Mnumber[15];/*母亲的电话*/

char medicals[10];/*有无病史('y' || 'Y')*/

char tutions[10];/*本季度学费是否已交('y' || 'Y')*/

int meals;/*本月餐费余额*/

struct Student *next;

}Student;

void create();//系统的初始化

此模块实现该系统的初始化,即学生相关信息的输入。本系统设置两种学生信息的输入函数,使用者既可以手动输入文件,又可以通过文本文档将已有学生信息导入。通过建立学生动态链表,将每一个学生的信息作为一个整体(此处不符合题目关于建立八个班级的学生信息指针要求)用链表连接起来。定义*p1,*p2指针变量,分配内存空间p2=p1=(Student *)malloc(sizeof(Student));然后通过键盘键入数据,通过p1p2指针的相互移动,将每个学生的信息通过链表建立起来。

void display();//学生信息的输出

定义结构体指针Student *p=head->next;,控制对链表上的数据输出

void search();//学生信息的查询

两种查询方式,学号查询和姓名查询。控制指针,向系统输入相关数据,通过判断,移动指针找到学号和姓名相同的节点,然后输出。学号查询比较方式和姓名查询比较方式略有不同。定义学号为整型变量,因而用比较法。定义姓名为长度为20的数组,因而调用头文件”string.h”中比较字符串大小的函数strcmp,如果为0,则意味着输入的姓名和该节点的姓名相同,则输出数据。

void insert();//学生信息的追加

定义三个结构体数组指针Student *p1,*p2,*q;先用malloc函数申请内存空间,通过键盘输入要追加的学生数据,用指针*q指向该数据。通过移动*p1,*p2指针对应链表节点,并判断相关位置,最后找到最终的位置,将p2->next=q;q->next=p1则链表插入成功。

void corret();//学生信息的修改

通过键入学生学号,控制结构体指针的移动找到节点上需要修改的学生学号对应的节点,然后用scanf修改相关信息,并完成学生信息的修改

void Delete();//学生信息的删除

通过键盘键入学生学号,控制结构体指针的移动找到节点上需要删除的学生学号对应的节点,然后用*p.*q, 通过q->next=p->next;free(p);删除节点,用free函数释放内存空间。从而实现学生信息的删除。

void save();//学生信息的保存

定义文件指针*fp和结构体指针*p FILE *fp;Student *p;使用fopen函数打开"幼儿园学生资料.txt"文件,并设置为"wb"写打开。控制结构体指针*p的移动,使用fwrite函数,对结构体数组数据读取并写入txt文件中。

void Tution();//本季度学费未交统计

定义文件指针*fp和结构体指针*p FILE *fp;Student *p;使用fopen函数打开"本季度学费未交统计.txt"文件,并设置为"wb"写打开。控制结构体指针*p的移动,并用if(strcmp(p->tutions,Tution)==0)判断本季度学费是否未交,如果未交则使用fprintf函数,对未交学生的相关的信息写入写入txt文件中。

void Meals();//餐费为0学生统计

定义文件指针*fp和结构体指针*p FILE *fp;Student *p;使用fopen函数打开"餐费为0学生统计.txt"文件,并设置为"wb"写打开。控制结构体指针*p的移动,并用if(p->meals==0)判断学生餐费为0,如果为0则使用fprintf函数,对相关学生的相关的信息写入写入txt文件中。

流程设计:

1.主模板

2.程序

3.查询模块

4.删除模块

代码设计:

#include

#include

#include

#include//字符串之间的比较,如姓名查询

void create();//系统的初始化

void display();//学生信息的输出

void search();//学生信息的查询

void insert();//学生信息的追加

void corret();//学生信息的修改

void Delete();//学生信息的删除

void save();//学生信息的保存

void Tution();//本季度学费未交统计

void Meals();//餐费为0学生统计

void menu();//系统主界面显示

struct Date

{

int year;

int month;

int day;

};

typedef struct Student

{

char classes[2];

int num;

char name[20];

struct Date birthday;/*出生日期*/

char Fname[20];/*父亲的姓名*/

char Mname[20];/*母亲的姓名*/

char Fnumber[15];/*父亲的电话*/

char Mnumber[15];/*母亲的电话*/

char medicals[10];/*有无病史('y' || 'Y')*/

char tutions[10];/*本季度学费是否已交('y' || 'Y')*/

int meals;/*本月餐费余额*/

struct Student *next;

}Student,*Link;

/**********系统的初始化*********/

Student *head=NULL;

int length;

void create()

{

FILE *fp;

Student *p1,*p2,*q1,*q2;

int Create;

length=0;

printf("\t\t\t\t幼儿园学生信息管理系统\n\t\t\t\t-------10级电子 曹怀宝(20093615276)\n");

fp=fopen("幼儿园学生资料.txt","rb");

if(fp==NULL)

{

printf("不存在系统文件,请按如下提示操作!\n");

printf("请输入要创建的学生人数:");

scanf("%d",&Create);

p2=p1=(Student *)malloc(sizeof(Student));

printf("请输入学生的班级、学号、姓名、出生(年、月、日)、父亲姓名、父亲电话、母亲姓名、母亲电话、病史(有或无)、本季度学费是否已交(“已交”或“未交”)、本月餐费余额:\n");

while(length

{

length++;

if(length==1) head=p1;

else p2->next=p1;

p2=p1;

p1=(Student *)malloc(sizeof(Student));

scanf("%s %d %s %d %d %d %s %s %s %s %s %s %d",&p1->classes,&p1->num,&p1->name,&p1->birthday.year,&p1->birthday.month,&p1->birthday.day,&p1->Fname,&p1->Fnumber,&p1->Mname,&p1->Mnumber,&p1->medicals,&p1->tutions,&p1->meals);

}

p2->next=NULL;

return;

}

else

{

printf("\n=====>提示:文件已经打开,正在导入记录......\n");

head=q1 = q2 = ( Student *)malloc(sizeof(Student));

while(!feof(fp))

{

q1 = ( Student *)malloc(sizeof(Student));

fscanf(fp,"%s %d %s %d %d %d %s %s %s %s %s %s %d\r\t",&q1->classes,&q1->num,&q1->name,&q1->birthday.year,&q1->birthday.month,&q1->birthday.day,&q1->Fname,&q1->Fnumber,&q1->Mname,&q1->Mnumber,&q1->medicals,&q1->tutions,&q1->meals);

q2->next = q1;

q2 = q1;

length++;

}

q2->next = NULL;

printf("\n=====>提示:记录导入完毕,共导入%d条记录.\n",length);

}

fclose(fp);

}

/**********学生信息的输出*********/

void display()

{

Student *p=head->next;

printf("链表中所有学生信息如下:\n");

while(p!=NULL)

{

printf("%s %d %s %d %d %d %s %s %s %s %s %s %d\n",p->classes,p->num,p->name,p->birthday.year,p->birthday.month,p->birthday.day,p->Fname,p->Fnumber,p->Mname,p->Mnumber,p->medicals,p->tutions,p->meals);

p=p->next;

}

return ;

}

/**********学生信息的查询*********/

void search()

{

int num,n;

char name[20];

Student *p=head->next;

printf("================================================================\n");

printf("| 1、按学号查询 |\n");

printf("| 2、按姓名查询 |\n");

printf("================================================================\n");

printf("请选择查询方式:");

scanf("%d",&n);

if(n==1)

{

printf("输入需要查找的学生学号:");/*学号查找*/

scanf("%d",&num);

while(p!=NULL)

{

if(p->num==num)

{

printf("学号为%d的学生信息如下:\n",p->num);

printf("%s %d %s %d-%d-%d %s %s %s %s %s %s %d\n",p->classes,p->num,p->name,p->birthday.year,p->birthday.month,p->birthday.day,p->Fname,p->Fnumber,p->Mname,p->Mnumber,p->medicals,p->tutions,p->meals);

return;

}

p=p->next;

}

if(p==NULL) printf("查无此人\n");

return;

}

else if(n==2)

{

printf("输入需要查找的学生姓名:");/*姓名查找*/

scanf("%s",&name);

while(p!=NULL)

{

if(strcmp(p->name,name)==0)

{

printf("姓名为%s的学生信息如下:\n",p->name);

printf("%s %d %s %d-%d-%d %s %s %s %s %s %s %d\n",p->classes,p->num,p->name,p->birthday.year,p->birthday.month,p->birthday.day,p->Fname,p->Fnumber,p->Mname,p->Mnumber,p->medicals,p->tutions,p->meals);

return;

}

p=p->next;

}

if(p==NULL) printf("查无此人\n");

return;

}

}

/**********学生信息的修改*********/

void corret()

{

int num;

Student *p=head->next;

printf("请输入要修改学生的学号:\n");

scanf("%d",&num);

while(p!=NULL)

{

if(p->num=num)

{

printf("找到该学生,请按如下操作进行修改!\n");

printf("请输入新的班级(原来的班级为%s):",p->classes);

scanf("%s",&p->classes);

printf("请输入新的学号(原来的学号为%d):",p->num);

scanf("%d",&p->num);

printf("请输入新的姓名(原来的姓名为%s):",p->name);

scanf("%s",&p->name);

printf("请输入新的出生年份(原来的出生年月%d-%d-%d):",p->birthday.year,p->birthday.month,p->birthday.day);

scanf("%d %d %d",&p->birthday.year,&p->birthday.month,&p->birthday.day);

printf("请输入新的学生父亲姓名(原来的父亲姓名为%s):",p->Fname);

scanf("%s",&p->Fname);

printf("请输入新的学生母亲姓名(原来的母亲姓名为%s):",p->Mname);

scanf("%s",&p->Mname);

printf("请输入新的学生父亲电话(原来的父亲的电话为%s):",p->Fnumber);

scanf("%s",&p->Fnumber);

printf("请输入新的学生母亲电话(原来的母亲的电话为%s):",p->Mnumber);

scanf("%s",&p->Mnumber);

printf("请输入新的本季度学费是否已交(原来的本季度学费是否已交为(%s)):",p->tutions);

scanf("%s",&p->tutions);

printf("请输入新的本月餐费余额(原来的本月餐费余额为%d):",p->meals);

scanf("%d",&p->meals);

printf("请输入新的病史(原来的病史为(%s)):",p->medicals);

scanf("%s",&p->medicals);

return;

}

p=p->next;

}

if(p=NULL) printf("查无此人,请重新输入!");

printf("修改成功!\n");

return ;

}

/**********学生信息的追加*********/

void insert()

{

Student *p1,*p2,*q;

p1=head;

printf("请输入你要插入的学生的班级、学号、姓名、出生(年、月、日)、父亲姓名、父亲电话、母亲姓名、母亲电话、病史(有或无)、本季度学费是否已交(已交或未交)、本月餐费余额信息:\n");

q=(Student *)malloc(sizeof(Student));

scanf("%s %d %s %d %d %d %s %s %s %s %s %s %d",&q->classes,&q->num,&q->name,&q->birthday.year,&q->birthday.month,&q->birthday.day,&q->Fname,&q->Fnumber,&q->Mname,&q->Mnumber,&q->medicals,&q->tutions,&q->meals);

while(p1!=NULL)

{

if(p1->num==q->num)

{

printf("该学号已经存在,无法插入!\n");

return ;

}

p1=p1->next;

}

p1=head; /*使p1指向第一个结点*/

if(head==NULL)/*原来的链表为空表*/

{head=q;q->next=NULL;}

else

{

while((q->num>p1->num)&&(p1->next!=NULL))

{p2=p1; p1=p1->next;}

if(q->num<=p1->num)/*因为何种原因执行到此处?*/

{

if(head==p1)head=q;

else p2->next=q;

q->next=p1;}

else {p1->next=q;q->next=NULL;}

}

length++;

printf("插入成功!\n");

return ;

}

/**********学生信息的删除*********/

void Delete()

{

int num;

Student *q,*p;

q=head,p=head->next;

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

scanf("%d",&num);

while(p!=NULL)

{

if(p->num==num)

{

q->next=p->next;

free(p);

length--;

printf("删除成功!\n");

return ;

}

p=p->next;

q=q->next;

}

if(p==NULL)

{

printf("找不到要删除的编号!\n");

return ;

}

}

/*********学生信息的保存**********/

void save()

{

FILE *fp;

Student *p;

p=head->next;

if((fp=fopen("幼儿园学生资料.txt","wb"))==NULL)

{

printf("打开文件发生错误!\n");

exit(1);

}

while(p!=NULL)

{

fprintf(fp,"%s %d %s %d %d %d %s %s %s %s %s %s %d\r\n",p->classes,p->num,p->name,p->birthday.year,p->birthday.month,p->birthday.day,p->Fname,p->Fnumber,p->Mname,p->Mnumber,p->medicals,p->tutions,p->meals);

p=p->next;

}

fclose(fp);

}

/*********本季度学费未交统计**********/

void Tution()

{

FILE *fp;

Student *p;

char Tution[10]={"未交"};

p=head->next;

if((fp=fopen("本季度学费未交统计.txt","wb"))==NULL)

{

printf("打开文件发生错误!\n");

exit(1);

}

fprintf(fp,"班级 姓名 学号 父亲姓名 父亲电话 母亲姓名 母亲电话\r\n");

while(p!=NULL)

{

if(strcmp(p->tutions,Tution)==0)

fprintf(fp,"%s %s %d %s %s %s %s\r\n",p->classes,p->name,p->num,p->Fname,p->Fnumber,p->Mname,p->Mnumber);

p=p->next;

}

fclose(fp);

return ;

}

/*********本月餐费不足0学生统计**********/

void Meals()

{

FILE *fp;

Student *p;

p=head->next;

if((fp=fopen("本月餐费不足0统计.txt","wb"))==NULL)

{

printf("打开文件发生错误!\n");

exit(1);

}

fprintf(fp,"班级 姓名 学号 父亲姓名 父亲电话 母亲姓名 母亲电话\r\n");

while(p!=NULL)

{

if(p->meals==0)

fprintf(fp,"%s %s %d %s %s %s %s\r\n",p->classes,p->name,p->num,p->Fname,p->Fnumber,p->Mname,p->Mnumber);

p=p->next;

}

fclose(fp);

return ;

}

/*********系统主界面显示**********/

void menu()

{

printf("·=·=·=·=·=·=幼儿园信息管理系统·=·=·=·=·=\n");

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

printf("| 0:系统初始化 |\n");

printf("| 1:显示学生资料 |\n");

printf("| 2:搜索学生资料 |\n");

printf("| 3:修改学生资料 |\n");

printf("| 4:追加学生资料 |\n");

printf("| 5:删除学生资料 |\n");

printf("| 6:保存学生资料 |\n");

printf("| 7:本季度学费未交统计 |\n");

printf("| 8:本月餐费余额不足0统计 |\n");

printf("| 9:退出系统 |\n");

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

}

void main()

{

int a;

menu();

while(1)

{

printf("请选择相应的功能:");

scanf("%d",&a);

switch(a)

{

case 0:

create();

menu();

break;

case 1:

display();

menu();

break;

case 2:

search();

menu();

break;

case 3:

corret();

menu();

break;

case 4:

insert();

menu();

break;

case 5:

Delete();

menu();

break;

case 6:

save();

menu();

break;

case 7:

Tution();

menu();

break;

case 8:

Meals();

menu();

break;

case 9:

return;

}

}

return ;

}

运行结果:

(说明:截取运行结果的状态图即可)

0:输入学生资料

1:显示学生资料

2:搜索学生资料 (学号和姓名查询)

3:修改学生资料

4:追加学生资料

5:删除学生资料

6:保存学生资料

7:本季度学费未交统计

8:本月餐费余额不足0统计

9:退出系统

附加:新增文件导入功能

本文来源:https://www.2haoxitong.net/k/doc/4d896a6ea98271fe910ef98f.html

《幼儿园学生信息管理系统.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式