C程序设计数据结构综合模拟实习.docx
- 文档编号:5453167
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:49
- 大小:544.35KB
C程序设计数据结构综合模拟实习.docx
《C程序设计数据结构综合模拟实习.docx》由会员分享,可在线阅读,更多相关《C程序设计数据结构综合模拟实习.docx(49页珍藏版)》请在冰豆网上搜索。
C程序设计数据结构综合模拟实习
一、实习目的
通过模拟实习,主要要达到两个目的,一是检验和巩固专业知识、二是提高综合素质和能力。
信管08级学生的模拟实习主要是复杂程序和简单软件的实现。
通过该模拟实习,可以将学生课堂上掌握的理论知识与处理数据的业务相结合,以检验我们同学们掌握知识的宽度、深度及对知识的综合运用能力。
二、实习环境(如软硬件)
(1)硬件:
CPUPⅣ,内存1G
(2)操作系统:
Windows7
(3)软件:
Visualc++6.0,MicrosoftWord2003
三、实习内容
内容一:
纸牌游戏
任务:
编号为1-52张牌,正面向上,从第2张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;然后…从第4张开始,以4为基数,是4的倍数的牌翻一次,直到最后一张牌;...再依次5的倍数的牌翻一次,6的,7的直到以52为基数的翻过,输出:
这时正面向上的牌有哪些?
内容二:
文章编辑
功能:
输入一页文字,程序可以统计出文字、数字、空格的个数。
静态存储一页文章,每行最多不超过80个字符,共N行;要求
(1)分别统计出其中英文字母数和空格数及整篇文章总字数;
(2)统计某一字符串在文章中出现的次数,并输出该次数;(3)删除某一子串,并将后面的字符前移。
存储结构使用线性表,分别用几个子函数实现相应的功能;
输入数据的形式和范围:
可以输入大写、小写的英文字母、任何数字及标点符号。
输出形式:
(1)分行输出用户输入的各行字符;
(2)分4行输出"全部字母数"、"数字个数"、"空格个数"、"文章总字数"(3)输出删除某一字符串后的文章
内容三:
1.设计学生成绩管理系统。
该系统中存储学生的学号、姓名、性别、年龄、课程成绩等信息。
要求:
1)浏览学生信息
2)添加学生信息
3)删除学生信息
4)查找学生信息
5)修改学生信息
6)对成绩的处理
求出每个学生各门课程的总成绩、平均成绩、最高分和最低分。
求出某一门课程所有学生的总成绩、平均成绩、最高分和最低分。
7)按照学生某门课程的成绩对学生排序
四、算法分析、设计与描述
1.算法分析和设计
内容一:
当每个号码每次遇到是某个数的倍数时,都会相应的翻一次,这样,每张牌会翻的次数就各不一样,可能很多次,也可能只有一两次,结果就只是要输出在经过各个不同次数的翻牌后,正面向上的牌都有哪几个。
举例说明一下,比如24,第一次它是2的倍数时要从正面翻到背面,当进行到3时,就又要从背面翻回来,而到4时还要在翻,同理呢,到6.8.12…它都要来回的翻。
如果它在多次的翻牌后,正面还向上了,那么它就是要输出的结果之一。
内容二:
定义结构体structline,文本行采用顺序存储,行与行之间采用链式存储。
利用指针、链表来实现文章编辑数据结构设计
内容三:
(1)整个系统均用C语言实现;
(2)利用指针、链表来实现学生成绩的数据结构设计;
(3)系统具有输入、显示、查询、删除、排序、插入,保存、读取基本功能;
(4)系统的各个功能模块都用函数的形式来实现;
(5)可以将学生成绩信息保存在文件中;
(6)可以将学生信息从文件中读取出来。
2.算法描述(可插入流程图)
内容一:
内容二:
内容三:
五、程序设计
1.程序设计的基本思路
内容一:
用#defineOPPOSITE(i)i=i?
0:
1这个宏将牌的状态标志求反,也即为翻牌操作。
将所有的牌建立一个数组,运用for的循环嵌套执行以下操作:
把52张牌初始化成正面朝上、控制基数和翻牌次数,判断最终的纸牌朝向并打印出结果
内容二:
将文本框中的信息读入,系统处理了大多记事本应有的功能,进行简单的文件处理(包括保存,另存为,新建等)。
同时对读入的数据进行相关的统计功能。
系统处理了大多记事本应有的功能,进行简单的数据统计和文件处理(包括保存,另存为,新建等)。
内容三:
(1)主函数main()
利用无限次循环for(;;)和swithch()实现各函数的调用,系统根据输入的数字选项来调用相应的函数。
2.初始化函数STUDENT*init()
这是一个无参函数,里面只有一个语句,它的作用是使链表初始化,使head的值为NULL。
比如:
没有这个函数的话,在你没有输入任何数据的情况下,去执行显示功能的时候会显示一些乱码!
3.菜单选择函数intmenu_select();
这是一个无参函数,主要实现“功能选择”的界面,在这个界面里有显示系统的九大功能,根据每个功能前面的序号进行选择,中间还显示系统当前的时间。
等执行完每一个函数功能后,按任一键回到主界面也要通过这个函数来实现!
4.输入记录函数STUDENT*create()
这是一个无参函数,用来执行第学生成绩记录的输入,当学生为0时停止输入,函数结束后,带回一个指向链表头的指针head。
算法:
先声明一个首节点head,并将head->next设为NULL。
每输入一个数据就声明一个新节点p,把p->next设为NULL,并且链接到之前列表的尾端。
5.显示记录函数voidprint(STUDENT*head)
这是一个不返回值的有参函数,形参为“链表头的指针”,负责对全部学生成绩记录的输出,不足之处就是不能对学生成绩进行分页显示。
算法:
先将p结点的指针指向第一个结点,将p结点(即第一个结点)的数据输出。
然后再将p结点的指针指向p指针的的指针(即下一结点),将p结点(即第一结点)的数据输出。
重复执行此步聚直到p指针指向NULL为止。
6.查找记录函数voidsearch(STUDENT*head)
这是一个不返回值的有参函数,形参为“链表头的指针”,实现按学号对某个学生进行查找,并显示所查找到的记录。
算法:
采用线性查找法往下一个节点查找。
输入所要查找的学生的学号s,设一个指针变量p,先指向第一个结点,当strcmp(p->name,s)&&p!
=NULL时,使p后移一个结点,如果p!
=NULL,输出p所指的结点。
7.删除记录函数STUDENT*delete(STUDENT*head)
这是一个有参函数,形参为“链表头的指针”,先输入要删除的学生记录的学号,找到后显示该学生信息,等确认后便可按“Y”进行删除。
算法:
从p指向的第一个结点开始,检查该结点中的num值是否等于输入的要求删除的那个学号。
如果相等就将该结点删除,如不相等,就将p后移一个结点,再如此进行下去,直到遇到表尾为止。
8.排序函数STUDENT*sort(STUDENT*head)
这是一个有参函数,形参为“链表头的指针”,按学生成绩的平均分高低进行排序,还可以显示名次。
9、插入函数STUDENT*insert(STUDENT*head,STUDENT*new)
这是一个有参函数,形参有两个,一个是“链表头的指针”,一个是“待插入指针”,按照原来成绩平均分的高低进行插入,插入后会重新进行排序,并返回。
算法:
先将学生的成绩按平均分由高分到低分进行排序,再插入一个新生的结点,要求按平均分的高低顺序插入。
先用指针变量p0指向待插入的结点,p1指向第一个结点。
如果p0->average
此时将p1后移,并使p2指向刚才p1所指的结点。
重复以上的步骤,直到p0->average>=p1->average为止。
这时将p0指向的结点插到p1所指结点之前。
但是如果p1所指的已是表尾结点,则p1就不应后移了。
如果p0->average比所有结点的average都小,则应将p0所指的结点插到链表末尾。
如果插入的位置既不在第一个结点之前,又不在表尾结点之后,则将p0的值赋给p2->,使p2->next指向待插入的结点,然后将p1的值赋给p0->next,使得p0->next指向p1指向的变量。
如果插入位置为第一个结点之前,则将p0赋给head,将p1赋给p0->next。
如果要插到表尾之后,应将p0赋给p1->next,NULL赋给p0->next。
最后再调用排序的函数,将学生成绩重新排序.
10、保存数据到文件函数voidsave(STUDENT*head)
这是一个不返回值的有参函数,形参为“链表头的指针”,可以把学生记录保存在电脑上由自己任意命名的二进制文件。
11、从文件读数据函数STUDENT*load()
这是一个不返回值的有参函数,形参为“链表头的指针”,根据输入的文件地址进行读取。
2.程序代码
内容一:
#include
voidmain()
{
inti,j,card[52];
for(i=0;i<52;i++)//52张牌所有状态均为1,即均为正面
card[i]=1;
for(j=2;j<=52;j++)//对52张牌(序号放在i里)对2,3...52(放在j里)按i+1是否是j的倍数进行状态翻转。
for(i=0;i<52;i++)
if((i+1)%j==0)
card[i]=card[i]?
0:
1;
printf("positivecardare:
");
for(i=0;i<52;i++)//对翻转处理后状态仍然是正面的(card保持为1)的将其编号输出。
{
if(card[i])
printf("%d",i+1);
}
}
内容二:
#include
#include
#include
usingnamespacestd;
structListNode
{
chardata;
ListNode*link;
};
ListNode*first;
intko;//定义全局变量,存储键盘输入的长度(包括回车)
ListNode*CreatList()
{
ListNode*first,*p,*q;
chari;
intm=1000000;
intcount=0;
boolflag;
cout<<"请输入文章,以#号结束:
";
/////////创建链表//////////
first=newListNode;
q=first;
for(intj=1;j<=m;j++)
{
p=newListNode;
cin.get(i);//接收字符函数
if(i!
='#'){flag=true;}
if(i=='#'){flag=false;}//如果遇到结束标识符,flag的值为false
if(flag==true)
{
count++;//每输入一个字符,count加一,记录文章长度
p->data=i;//向链表结点赋值
p->link=NULL;
q->link=p;//指针向后移
q=q->link;
}
if(flag==false)//当输入结束,将count的值赋给ko
{
ko=count;
gotoloop;
}
}
loop:
returnfirst;//返回first指针
}
//////////////查文章中共有多少个字符//////////////////
voidcountchar(ListNode*j)//j的返回指针为first指针
{
ListNode*h;
h=j->link;//h为头指针的下一个结点的指针
intmm;
mm=ko;//将全局变量的值赋给mm
for(intrr=0;rr { if(h->data=='\n')//如果结点的内容为回车 {mm--;}//mm的值减一,最后mm的值就是字符数 h=h->link; } cout<<"这篇文章共有"< "< } /////////////查文章中共有多少个数字//////////////////// voidcountnumber(ListNode*w)//w的返回指针为first指针 { intsum=0; ListNode*m; m=w->link;//m为头指针的下一个结点的指针 for(intcc=0;cc { if(m->data>='0'&&m->data<='9')//如果字符在0~9之间 {sum++;}//sum加一,sum的最后值就是数字的个数 m=m->link; } cout<<"文章中的数字个数是: "< } //////////////查文章中共有多少个字母///////////////////// voidcountletter(ListNode*e)//e的返回指针为first指针 { intsum=0; ListNode*m; m=e->link;//m为头指针的下一个结点的指针 for(intccc=0;ccc { if((m->data>='A'&&m->data<='Z')||(m->data>='a'&&m->data<='z')) {sum++;} m=m->link; } cout<<"文章中的字母个数是: "< } ///////////////查文章中共有多少个空格//////////////////////// voidcountspace(ListNode*i)//i的返回指针为first指针 { intsum=0; ListNode*m; m=i->link;//m为头指针的下一个结点的指针 for(intss=0;ss { if(m->data=='') {sum++;} m=m->link; } cout<<"文章中的空格个数是: "< } ////////////////自由查找字符///////////////////////////////////// voidcountcharnumber(ListNode*r)//r的返回指针为first指针 { intm; cout<<"请输入需要查找的字符数量: "; cin>>m;//定义要查找的字符链表长度 if(m==1)//长度为1时的查找方式 { ListNode*o; charc; cout<<"请输入要统计个数的字符: "; cin>>c; o=r; intsum=0; for(ints=0;s { if(o->data==c) { sum++; } o=o->link; } cout<<"文章中"< "< } if(m! =1)//当要查找的长度大于1的情况 { chari; ListNode*hh,*h,*n,*hhh,*o,*oo; hh=newListNode; h=hh; hhh=hh;//hhh为存储要查字符的链表的头指针 cout<<"请输入字符: "; for(intj=0;j { cin>>i; n=newListNode; n->data=i; h->link=n; h=n; } h->link=NULL; hh=hhh->link; oo=r;//让oo指向存储文章链表的头结点 o=r->link;//o为头结点的下一个结点的指针 intsumadd=0;//sumadd为记数变量 for(ints=0;s<=ko;s++) { if(o! =NULL)//当文章链表结点的内空不为空时 { if(hh! =NULL)//当记录要查找的字符的链表指针不指向最后结点时 { if(o->data! =hh->data)//如果文章链表的内容和要找的内容不一致时 { o=oo->link;//oo为记录第一个一样内容的位置的指针 o=o->link;//oo始终在o的前面,两指针一起后移 oo=oo->link; hh=hhh->link;//hh是存储查找内容链表的第一个结点的指针 } else {//如果两链表的内容相同,hh和o指针后移 hh=hh->link;//oo不动,用来定位,方便指针的回溯 o=o->link; } } else//如果存储要查内容的链表的指向最后 {//说明找到一个相符,sumadd加一 hh=hhh->link;//hh回到存储要查找内容链表的第一个结点 sumadd++; } } } cout<<"文章中要查找的字符个数是: "< } } ////////////////删除指定的字符///////////////////////////////////////////////////// voiddeletechar(ListNode*rr1)//rr1的返回指针为first指针 { intm1; cout<<"请输入需要删除的字符数量: "; cin>>m1; if(m1==1)//当要删除一个字符时的情况 { ListNode*oo1,*g1; charc1; cout<<"请输入要删除字符: "; cin>>c1; oo1=rr1; while(oo1->link! =NULL) { if(oo1->link->data==c1) { g1=oo1->link; oo1->link=g1->link; } oo1=oo1->link; } } if(m1! =1)//当要删除多个字符时的情况 { ListNode*o2,*oo2,*hhh2,*n2,*hh2,*h2; chari2; hh2=newListNode;//hh2为头指针 h2=hh2; hhh2=hh2;//让hhh2指向头指针 cout<<"请输入字符: "; for(intj2=0;j2 { cin>>i2; n2=newListNode; n2->data=i2; h2->link=n2; h2=n2; } h2->link=NULL; hh2=hhh2->link;//hh2后移一个,为头指针指向的结点的指针 oo2=rr1;//oo2为存储文章链表的头结点 o2=rr1->link;//o2为头结点所指向的结点指针 for(ints2=0;s2<=ko;s2++) { if(o2! =NULL)//当文章链表结点的内空不为空时 { if(hh2! =NULL)//当记录要删除的字符的链表指针不指向最后结点时 { if(o2->data! =hh2->data) { o2=oo2->link; o2=o2->link;//与查找功能类似,oo2为定位指针,方便回溯 oo2=oo2->link;//如果两链表的内容不同,指针分别后移 hh2=hhh2->link; } else { hh2=hh2->link;//如果两链表内容相同,两指针同时后移 o2=o2->link;//oo2不移,定位作用 } } else { hh2=hhh2->link;//找到符合条件的链表后,hh2回到头结点的下一个结点 oo2->link=o2;//定位指针指向符合条件的最后的一个结点的下一个结点 }//符合内容的链表结点被删除 } } } } /////////////////输出链表内容函数//////////////////////////// voidputch(ListNode*uuu)//uuu的返回指针为first指针 { ListNode*uu; uu=uuu->link; while(uu! =NULL) { cout< uu=uu->link; } cout< } //////////////////存储链表内容到文本文件的函数/////////////////////// voidwritech(ListNode*yyyy)//yyyy的返回指针为first指针 { ListNode*yyy; intcc=0; yyy=yyyy->link; ofstreamoutfile("f1.txt",ios: : trunc);//清空并打开文件 for(intnn=1;nn<=ko;nn++) { while(yyy! =NULL) { outfile.put(yyy->data); yyy=yyy->link; } } outfile.close(); } /////////////////将删除字符后的文本存到文件中的函数//////////////////////// voidwritech1(ListNode*yy)//yy的返回指针为first指针 { ListNode*yyy; yyy=yy->link; ofstreamoutfile("f2.txt",ios: : trunc);//清空并打开文件 for(intnn=0;nn { while(yyy! =NULL) { outfile.put(yyy->data); yyy=yyy->link; } } outfile.close(); } intmain() { first=CreatList(); countchar(first); countletter(first); countspace(first); countnumber(first); countcharnumber(first); writech(first); charch; ListNode*milk; milk=first->link; ifstreaminfile("f1.txt",ios: : in);//打开文件 if(! infile) { cerr<<"openf1.txterror! "< exit (1); } while(infile.get(ch))//将文件内容赋给链表 { milk->data=ch; milk=milk->link; } infile.close();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 数据结构 综合 模拟 实习