《程序设计基础(C语言)》
课程设计说明书
学 院: 信息与电气工程学院
班 级: 电子系1001
学 号: 20093615276
姓 名: 曹怀宝
教 师: 胡凤珠
日 期: 2012年6月 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;
此模块实现该系统的初始化,即学生相关信息的输入。本系统设置两种学生信息的输入函数,使用者既可以手动输入文件,又可以通过文本文档将已有学生信息导入。通过建立学生动态链表,将每一个学生的信息作为一个整体(此处不符合题目关于建立八个班级的学生信息指针要求)用链表连接起来。定义*p1,*p2指针变量,分配内存空间p2=p1=(Student *)malloc(sizeof(Student));然后通过键盘键入数据,通过p1与p2指针的相互移动,将每个学生的信息通过链表建立起来。
定义结构体指针Student *p=head->next;,控制对链表上的数据输出
两种查询方式,学号查询和姓名查询。控制指针,向系统输入相关数据,通过判断,移动指针找到学号和姓名相同的节点,然后输出。学号查询比较方式和姓名查询比较方式略有不同。定义学号为整型变量,因而用比较法。定义姓名为长度为20的数组,因而调用头文件”string.h”中比较字符串大小的函数strcmp,如果为0,则意味着输入的姓名和该节点的姓名相同,则输出数据。
定义三个结构体数组指针Student *p1,*p2,*q;先用malloc函数申请内存空间,通过键盘输入要追加的学生数据,用指针*q指向该数据。通过移动*p1,*p2指针对应链表节点,并判断相关位置,最后找到最终的位置,将p2->next=q;q->next=p1则链表插入成功。
通过键入学生学号,控制结构体指针的移动找到节点上需要修改的学生学号对应的节点,然后用scanf修改相关信息,并完成学生信息的修改
通过键盘键入学生学号,控制结构体指针的移动找到节点上需要删除的学生学号对应的节点,然后用*p.*q, 通过q->next=p->next;free(p);删除节点,用free函数释放内存空间。从而实现学生信息的删除。
定义文件指针*fp和结构体指针*p, FILE *fp;Student *p;使用fopen函数打开"幼儿园学生资料.txt"文件,并设置为"wb"写打开。控制结构体指针*p的移动,使用fwrite函数,对结构体数组数据读取并写入txt文件中。
定义文件指针*fp和结构体指针*p, FILE *fp;Student *p;使用fopen函数打开"本季度学费未交统计.txt"文件,并设置为"wb"写打开。控制结构体指针*p的移动,并用if(strcmp(p->tutions,Tution)==0)判断本季度学费是否未交,如果未交则使用fprintf函数,对未交学生的相关的信息写入写入txt文件中。
定义文件指针*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格式