




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C语言程序设计上机A设计报告题目名称:_学生籍贯信息记录簿_设计环境:_WindowsXp_ _指导教师:_ _肖 德 成 _专业班级:_工力0801_ _姓 名:_ _ _学 号:_ _ _联系电话:_ _ _ _电子邮件:_ _ _ _设计日期: 2010年 11月 6 日至2010年 11 月 21 日报告成绩:_ _ 指导教师签名:_ _ _学生籍贯信息记录簿一、 课题内容和要求1、 设计目标:按照软件工程的规范,以Visual C+为开发工具,设计并实现一个能模拟学生籍贯信息记录簿的系统。2、 基本要求:编制一个学生籍贯信息记录簿,每个学生信息包括:学号
2、、姓名、籍贯。具体功能:(1)创建信息链表并以磁盘文件保存;(2)读取磁盘文件并显示输出所有学生的籍贯信息;(3)按学号或姓名查询其籍贯;(4)按籍贯查询并输出该籍贯的所有学生;(5)能添加、删除和修改学生的籍贯信息; (6)显示输出四川籍和非四川籍学生的信息并可分别存盘。3、 需求描述该系统应实现以下功能:(1)、添加功能:使用者通过屏幕的输入将一条新的学生的相关信息存取到源数据文件(sichuan.txt)或者(feisichuan.txt)中去。每次默认将所添加的信息存放在文件的最后一行的位置。(2)、删除功能:使用者通过在屏幕中输入要删除的学生的学号,完成删除该学生的所有籍贯的信息。
3、(3)、修改: 使用者在屏幕中输入要修改的学生的学号,再输入修改之后的信息,即可完成修改。(4)、查询功能:1按学号查询:使用者通过在屏幕中输入要查询的学生的学号,即可在屏幕上显示要查询的学生的籍贯的相关信息。2按姓名查询:使用者通过在屏幕中输入要查询的学生的姓名,即可在屏幕上显示要查询的学生的籍贯的相关信息。3按籍贯查询:使用者通过在屏幕中输入要查询的学生的籍贯,即可在屏幕上显示所有该籍贯的学生的相关信息。(5)、显示功能:1显示所有学生的信息: 实现将所有的学生的籍贯的信息全部输出到屏幕上的功能。2显示四川学生的信息: 实现将所有四川的学生的籍贯的信息全部输出到屏幕上的功能。3显示非四川学
4、生的信息: 实现将所有非四川的学生的籍贯的信息全部输出到屏幕上的功能。(6)、读取功能: 读取两个不同的txt文件中的学生数据到两个链表中。(7)、融合功能: 融合两个链表到一个链表当中。(8)、写入功能: 把链表中的信息按籍贯的不同分别写入到两个不同的文件中。 一、 需求分析1、 功能模块:(1)、添加功能模块:将所要添加的学生的籍贯信息按四川籍和非四川籍分别存入“sichuan.txt”或者“feisichuan.txt”中。(2)、删除功能模块:输入学生的学号,可以在文件中将相关学生的籍贯信息全部删掉。 (3)、查询功能模块:输入学号或者姓名,显示该学号和姓名所对应的学生的籍贯信息。或者
5、输入籍贯,显示所有该籍贯的学生的信息。(4)、显示功能模块: 显示全部学生的籍贯信息。包括学号、姓名、籍贯。或分别显示四川籍的学生或非四川籍的学生。2、 数据储存:用txt文件来存储学生学号、姓名、籍贯。其中,sichuan.txt和feisichuan.txt文件有两次打开方式,第一次是以读写方式打开已存在的sichuan.txt和feisichuan.txt文件,将其中的所有信息存储在线性链表中。然后在完成一系列的查询、删除、添加操作后,再次打开sichuan.txt和feisichuan.txt文件,以读写方式打开,就用一个空的sichuan.txt和feisichuan.txt文件来覆
6、盖原来的还有学生籍贯的sichuan.txt和feisichuan.txt文件,再将改变后的线性表里面的数据再次存储在sichuan.txt和feisichuan.txt文件里面。一、 概要设计1、整体流程图:2、存储结构:主要是通过建立一个线性链表,其中包含一个Head型的头指针,而Head是一个结点类,包括两个部分(数据和指针)。在整个程序运行的时候, Readstudent1函数首先从sichuan.txt文件中,用fgets()函数和sscanf()函数配合使用,将学生信息读取到一个线性链表中。再用Readstudent2函数从feisichuan.txt文件中,再用fgets()函数
7、和sscanf()函数配合使用,将学生信息读取到另一个线性链表中。再用Add_studentlink函数将两个链表融合。添加时,用到Insert()函数,将所要添加的学生的信息作为数据域形成一个新的结点,然后将这个新的节点插入到所规定的位置后面即可。删除时,用到Delete()函数,即将线性链表中该序号的结点的数据全部删掉即可。查找时,用到SearchID(),Searchname(),Searchprovince ()函数,查找线性链表中该序号的结点的全部数据。 显示时,用到Show()函数,显示线性链表中所有结点的全部数据。用Show1()显示线性链表中四川籍学生和用Show2()显示线性
8、链表中非四川籍学生。 存入时,用到Writestudent()函数,判断学生的籍贯,再根据四川和非四川的籍贯,分别存盘,其中要用到sprintf()函数和fwrite()函数。四、源程序代码 1、主程序:#include<stdio.h>#include<fcntl.h>#include<string.h>#include<errno.h>#include<stdlib.h>#define FILENAME1 "sichuan.txt" /*定义sichuan.txt文件*/#define FILENAME2 &q
9、uot;feisichuan.txt" /*定义feisichuan.txt文件*/typedef struct student_info int studentID; /*学号*/char name8; /*姓名*/char province10; /*籍贯*/struct student_info * next;StudentLink;void Insert(student_info *Head); /*函数声明*/void SearchID(student_info * Head);void Searchname(student_info * Head);void Search
10、province(student_info * Head);void Update(student_info * Head);void Delete(student_info *Head);void Show(student_info * Head);void Show1(student_info * Head);void Show2(student_info * Head);void Readstudent1(student_info * * Head);void Readstudent2(student_info * * Head);void Writestudent(student_in
11、fo *Head);struct student_info *Add_studentlink(student_info *Head1,student_info *Head2,student_info *Head);int main() student_info * Head=NULL; /*定义表头指针*/student_info * Head1=NULL;student_info * Head2=NULL; int i=0; Readstudent1 (&Head1); /*读sichuan.txt文件*/ Readstudent2 (&Head2); /*读feisichu
12、an.txt文件*/ Head=Add_studentlink(Head1,Head2,Head);do /*显示一个简易菜单*/ printf("n"); printf("-欢迎使用学生籍贯信息记录薄系统-n"); printf(" 1-添加(Insert)n"); printf(" 2-按学号查询(SearchID)n"); printf(" 3-按姓名查询(Searchname)n"); printf(" 4-按籍贯查询(Searchprovince)n"); prin
13、tf(" 5-修改(Update)n"); printf(" 6-删除(Delete)n"); printf(" 7-显示所有学生(Show)n"); printf(" 8-显示四川学生(Show1)n"); printf(" 9-显示非四川学生(Show2)n"); printf(" 0-退出(Exit)n"); printf("-n"); printf(" 请选择要进行的操作:");scanf("%d",&
14、;i); /*接收用户的选择*/switch(i) /*调用对应的函数*/case 1:Insert(&Head);break; case 2:SearchID(Head);break; case 3:Searchname(Head);break;case 4:Searchprovince(Head);break; case 5:Update(Head);break; case 6:Delete(&Head);break; case 7:Show(Head);break; case 8:Show1(Head);break; case 9:Show2(Head);break; c
15、ase 0:break;default:printf("错误选择!请重选");break;while(i!=0); Writestudent(Head); /*写链表到txt文件*/return 0;void Readstudent1(student_info * * Head) /*读sichuan.txt文件的函数定义*/ int a; char b8, c10; FILE *fp = NULL; /*定义文件指针*/ char buffer30; /*开辟一个30长度的空间*/ if(fp=fopen("sichuan.txt","r+&
16、quot;)=NULL) /*以读写方式打开sichuan.txt文件*/ printf("error"); while(fgets(buffer,30,fp)!=0) /*从fp指向的文件取得一个长度为30的字符串,存入起始地址为buffer的空间*/ student_info * p,*q,*r; p=q=*Head; while(p!=NULL) q=p;p=p->next; /*走链*/ r=(student_info *)malloc(sizeof(StudentLink); /*申请空间*/ r->next=NULL; /*设置指针域*/ if(r=
17、NULL) printf("分配空间失败!"); exit(0); if (q=NULL) /*原链表为空表*/ *Head=r; /*新结点作为头元素*/ else q->next=r; /*在表尾插入元素*/ sscanf(buffer, "%d %s %sn",&a,&b,&c); /*把buffer中的数据按指定的类型赋给a,b,c*/ r->studentID=a; /*接收插入a,b,c*/ memcpy(r->name,b,8); memcpy(r->province,c,10);fclose
18、(fp); /*关闭文件*/void Readstudent2(student_info * * Head) /*读feisichuan.txt文件的函数定义*/ int a; char b8, c10; FILE *fp = NULL; /*定义文件指针*/ char buffer30; /*开辟一个30长度的空间*/ if(fp=fopen("feisichuan.txt","r+")=NULL) /*以读写方式打开feisichuan.txt文件*/printf("error"); while(fgets(buffer,30,f
19、p)!=0) /*从fp指向的文件取得一个长度为30的字符串,存入起始地址为buffer的空间*/ student_info * p,*q,*r; p=q=*Head; while(p!=NULL) q=p;p=p->next; /*走链*/ r=(student_info *)malloc(sizeof(StudentLink); /*申请空间*/ r->next=NULL; /*设置指针域*/ if(r=NULL) printf("分配空间失败!"); exit(0); if (q=NULL) /*原链表为空表*/ *Head=r; /*新结点作为头元素*/
20、 else q->next=r; /*在表尾插入元素*/ sscanf(buffer, "%d %s %sn",&a,&b,&c); /*把buffer中的数据按指定的类型赋给a,b,c*/ r->studentID=a; /*接收插入a,b,c*/ memcpy(r->name,b,8); memcpy(r->province,c,10);fclose(fp); /*关闭文件*/struct student_info *Add_studentlink(student_info *Head1,student_info *Hea
21、d2,student_info *Head) /*融合函数的定义*/ student_info *p1,*p2; p1=Head1; p2=Head2;while(p1->next!=NULL) /*指向第一个链表的链表尾*/p1=p1->next;p1->next=p2; /*把第二个链表的头文件指向第一个文件的链表尾*/Head=Head1; return Head;void Insert(student_info * *Head) /*插入函数的定义*/int in_studentID; /*说明变量*/student_info * p,*q,*r; /*定义指针*/p
22、rintf("请输入学号:");scanf("%d",&in_studentID);p=q=*Head; /*查找符合条件的记录*/while(p!=NULL)if(p->studentID= in_studentID) /*找到相同的编号*/printf("已经有相同的学号:");return;else q=p;p=p->next; /*走链*/r=(student_info *)malloc(sizeof(StudentLink); /*申请空间*/r->next=NULL; /*设置指针域*/if(r=
23、NULL) printf("分配空间失败!");return;if (q=NULL) /*原链表为空表*/*Head=r; /*新结点作为头元素*/elseq->next=r; /*在表尾插入元素*/r->studentID=in_studentID; /*接收插入数据*/ printf("请输入姓名:");scanf(" %s",r->name); printf("请输入籍贯:");scanf(" %s",r->province);void SearchID(stude
24、nt_info * Head) /*查找函数的定义*/int flag=1; /*设定标记变量的初值*/int studentID;student_info * p;printf("请输入要查询的学号:");scanf("%d",&studentID);p=Head; while(p!=NULL && flag) /*查找符合条件的记录*/ if(p->studentID=studentID) printf("姓名:%-10s",p->name);printf("籍贯:%-10s"
25、;,p->province);flag=0; /*找到标记变量设为0*/elsep=p->next; /*指针走到下一个结点*/if(flag)printf("没有查询到!");void Searchname(student_info * Head) /*查找函数的定义*/ int flag=1; /*设定标记变量的初值*/char name8;student_info * p;printf("请输入要查询的姓名:");scanf("%s",&name);p=Head; while(p!=NULL &&am
26、p; flag) /*查找符合条件的记录*/ if(strcmp(p->name,name)=0) printf("学号:%-10d",p->studentID);printf("姓名:%-10s",p->name);printf("籍贯:%-10s",p->province);flag=0; /*找到标记变量设为0*/elsep=p->next; /*指针走到下一个结点*/if(flag)printf("没有查询到!");void Searchprovince(student_inf
27、o * Head) /*查找函数的定义*/ int flag=1; /*设定标记变量的初值*/char province10;student_info * p;printf("请输入要查询的籍贯:");scanf("%s",&province);p=Head; while(p!=NULL) /*查找符合条件的记录*/ if(strcmp(p->province,province)=0) printf("学号:%-10d",p->studentID);printf("姓名:%-10s",p->
28、;name);printf("籍贯:%-10sn",p->province);flag=0; /*找到标记变量设为0*/p=p->next; /*指针走到下一个结点*/if(flag)printf("没有查询到!");void Update(student_info * Head) /*修改函数的定义*/ int flag=1; /*设定标记变量的初值*/int studentID;student_info * p;printf("请输入要修改的学号:");scanf("%d",&student
29、ID);p=Head;while(p!=NULL && flag) /*查找符合条件的记录*/ if (p->studentID=studentID)printf("请输入姓名:");scanf("%s",p->name);printf("请输入籍贯:");scanf("%s",p->province);flag=0;elsep=p->next; /*指针走到下一个结点*/if (flag)printf("没有找到要修改的记录!");void Delete
30、(student_info * * Head) /*删除函数的定义*/ int flag=1;int studentID;student_info * p,*q;printf("请输入要删除学生的学号:");scanf("%d",&studentID);p=q=*Head;while(p!=NULL && flag) /*查找符合条件的记录*/ if (p->studentID=studentID) if(p=*Head) /*删除的是表头元素*/ *Head=p->next;free(p);else q->ne
31、xt=p->next; /*删除普通元素*/free(p);flag=0;else q=p;p=p->next; /*指针走到下一个结点*/ /*q所指结点为p所指结点的前驱*/if(flag)printf("没有找到可以删除的数据!");void Show(student_info * Head) /*列表显示所有学生数据*/ student_info * p;p=Head;while(p!=NULL) printf("学号:%-10d",p->studentID);printf("姓名:%-10s",p->
32、name);printf("籍贯:%-10sn",p->province);p=p->next;void Show1(student_info * Head) /*列表显示四川学生数据*/ student_info * p;p=Head;while(p!=NULL) if(strcmp(p->province,"四川")=0) printf("学号:%-10d",p->studentID); printf("姓名:%-10s",p->name); printf("籍贯:%-1
33、0sn",p->province);p=p->next;void Show2(student_info * Head) /*列表显示非四川学生数据*/ student_info * p;p=Head;while(p!=NULL) if(strcmp(p->province,"四川")!=0) printf("学号:%-10d",p->studentID); printf("姓名:%-10s",p->name); printf("籍贯:%-10sn",p->provinc
34、e);p=p->next;void Writestudent(student_info *Head) /*写数据到txt文件的函数定义*/ FILE* fp1 = fopen("sichuan.txt", "w+"); /*以读写方式打开文件sichuan.txt*/ FILE* fp2 = fopen("feisichuan.txt", "w+"); /*以读写方式打开文件feisichuan.txt*/char new_buff11000; /*开辟一个1000长度的空间*/char new_buff21
35、000; /*开辟一个1000长度的空间*/int i=0,j=0;student_info * p;p=Head;while(p!=NULL) if(strcmp(p->province,"四川")=0)sprintf(new_buff1+i, "%d %s %sn",p->studentID,p->name, p->province);/*把链表中的结点数据按指定类型,存入起始地址为new_buffer1的空间*/ i = strlen(new_buff1); /*统计字符串new_buff1中字符的个数*/if(strcmp
36、(p->province,"四川")!=0)sprintf(new_buff2+j, "%d %s %sn",p->studentID,p->name, p->province);/*把链表中的结点数据按指定类型,存入起始地址为new_buffer2的空间*/ j = strlen(new_buff2); /*统计字符串new_buff2中字符的个数*/p=p->next; fwrite(new_buff1,sizeof(char), strlen(new_buff1),fp1); /*把new_buff1所指向的sizeo
37、f(char)*strlen(new_buff)个字节输出到fp1所指向的文件中*/ fwrite(new_buff2,sizeof(char), strlen(new_buff2),fp2); /*把new_buff2所指向的sizeof(char)*strlen(new_buff)个字节输出到fp2所指向的文件中*/ fclose(fp1); /*关闭文件*/ fclose(fp2); /*关闭文件*/四、 测试数据及其结果分析1、欢迎菜单:2、显示所有学生信息:3、显示四川学生信息4、显示非四川学生信息5、添加操作:6、删除操作:7、修改操作:8、按学号查询:9、按姓名查询:10、按籍贯查询:9、操作前sichuan.txt文件中的信息:10、操作前feisichuan.txt文件中的信息:11、操作后sichuan.txt文件中的信息:12、操作后feisichuan.txt文件中的信息:六、调试过程中的问题1、Readstudent函数: 由于要从原来的文件中读取通信录的信息,并存在线性链表中,所以,要用到fgets()函数和sscanf()函数,但是由于student_info变量由三个字符串变量stud
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025福建三明市城市建设发展集团有限公司公开招聘工作人员18人的考前自测高频考点模拟试题及答案详解1套
- 2025福建泉州市德化县公办学校专项招聘编制内新任教师19人(二)考前自测高频考点模拟试题及一套参考答案详解
- 2025河南新乡新华医院新乡市中西医结合医院招聘考前自测高频考点模拟试题及答案详解(网校专用)
- 2025江苏苏州凌晔进出口有限公司招聘7人考前自测高频考点模拟试题及一套参考答案详解
- 2025杭州大有供电服务有限公司招聘115人模拟试卷及答案详解(新)
- 2025国家文物局考古研究中心招聘专业技术人员11人模拟试卷及参考答案详解一套
- 2025年福建省三明市尤溪县总医院招聘10人考前自测高频考点模拟试题有答案详解
- 2025辽宁沈阳盛京资产管理集团有限公司所属子公司沈阳对外事务服务中心有限公司招聘1人模拟试卷有完整答案详解
- 2025黑龙江黑河市北安市乡村医生招聘21人考前自测高频考点模拟试题及答案详解(有一套)
- 2025年春季中国光大银行济南分行校园招聘(滨州有岗)考前自测高频考点模拟试题附答案详解(模拟题)
- (安徽卷)2025年高考历史试题
- 腰大池引流管护理查房
- 国网网络信息安全培训课件
- 中国精神障碍防治指南课件
- 《中国的经济发展概览》课件
- 2024重组胶原蛋白行业白皮书
- 2024N-Jet工法超高压喷射注浆技术规程
- 高职高考数学复习第五章数列5-2等差数列课件
- 矿泉水卫生管理制度
- 慢性肺源性心脏病的护理(内科护理学第七版)
- 小学四年级数学学情分析报告
评论
0/150
提交评论