C程序设计大数据结构综合模拟实习Word下载.docx
- 文档编号:18142025
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:49
- 大小:544.69KB
C程序设计大数据结构综合模拟实习Word下载.docx
《C程序设计大数据结构综合模拟实习Word下载.docx》由会员分享,可在线阅读,更多相关《C程序设计大数据结构综合模拟实习Word下载.docx(49页珍藏版)》请在冰豆网上搜索。
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->
average,则待插入的结点不应插在p1所指的结点之前。
此时将p1后移,并使p2指向刚才p1所指的结点。
重复以上的步骤,直到p0->
average>
=p1->
average为止。
这时将p0指向的结点插到p1所指结点之前。
但是如果p1所指的已是表尾结点,则p1就不应后移了。
average比所有结点的average都小,则应将p0所指的结点插到链表末尾。
如果插入的位置既不在第一个结点之前,又不在表尾结点之后,则将p0的值赋给p2->
,使p2->
next指向待插入的结点,然后将p1的值赋给p0->
next,使得p0->
next指向p1指向的变量。
如果插入位置为第一个结点之前,则将p0赋给head,将p1赋给p0->
next。
如果要插到表尾之后,应将p0赋给p1->
next,NULL赋给p0->
最后再调用排序的函数,将学生成绩重新排序.
10、保存数据到文件函数voidsave(STUDENT*head)
这是一个不返回值的有参函数,形参为“链表头的指针”,可以把学生记录保存在电脑上由自己任意命名的二进制文件。
11、从文件读数据函数STUDENT*load()
这是一个不返回值的有参函数,形参为“链表头的指针”,根据输入的文件地址进行读取。
2.程序代码
#include<
stdio.h>
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的倍数进行状态翻转。
i++)
if((i+1)%j==0)
card[i]=card[i]?
1;
printf("
positivecardare:
"
);
i++)//对翻转处理后状态仍然是正面的(card保持为1)的将其编号输出。
{
if(card[i])
%d"
i+1);
}
}
iostream>
fstream>
assert.h>
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;
=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;
//向链表结点赋值
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->
//h为头指针的下一个结点的指针
intmm;
mm=ko;
//将全局变量的值赋给mm
for(intrr=0;
rr<
ko;
rr++)
if(h->
data=='
\n'
)//如果结点的内容为回车
{mm--;
}//mm的值减一,最后mm的值就是字符数
h=h->
这篇文章共有"
mm<
个字。
endl;
/////////////查文章中共有多少个数字////////////////////
voidcountnumber(ListNode*w)//w的返回指针为first指针
intsum=0;
ListNode*m;
m=w->
//m为头指针的下一个结点的指针
for(intcc=0;
cc<
cc++)//ko为全局变量
if(m->
data>
0'
&
m->
data<
9'
)//如果字符在0~9之间
{sum++;
}//sum加一,sum的最后值就是数字的个数
m=m->
文章中的数字个数是:
sum<
//////////////查文章中共有多少个字母/////////////////////
voidcountletter(ListNode*e)//e的返回指针为first指针
m=e->
for(intccc=0;
ccc<
ccc++)
if((m->
A'
Z'
)||(m->
a'
z'
))
文章中的字母个数是:
///////////////查文章中共有多少个空格////////////////////////
voidcountspace(ListNode*i)//i的返回指针为first指针
m=i->
for(intss=0;
ss<
ss++)
'
)
文章中的空格个数是:
////////////////自由查找字符/////////////////////////////////////
voidcountcharnumber(ListNode*r)//r的返回指针为first指针
intm;
请输入需要查找的字符数量:
cin>
>
m;
//定义要查找的字符链表长度
if(m==1)//长度为1时的查找方式
ListNode*o;
charc;
请输入要统计个数的字符:
c;
o=r;
for(ints=0;
s<
s++)
if(o->
data==c)
sum++;
o=o->
文章中"
c<
的个数是:
if(m!
=1)//当要查找的长度大于1的情况
ListNode*hh,*h,*n,*hhh,*o,*oo;
hh=newListNode;
h=hh;
hhh=hh;
//hhh为存储要查字符的链表的头指针
请输入字符:
for(intj=0;
j++)//建立链表存储要查的字符
i;
n=newListNode;
n->
h->
link=n;
h=n;
hh=hhh->
oo=r;
//让oo指向存储文章链表的头结点
o=r->
//o为头结点的下一个结点的指针
intsumadd=0;
//sumadd为记数变量
=ko;
if(o!
=NULL)//当文章链表结点的内空不为空时
if(hh!
=NULL)//当记录要查找的字符的链表指针不指向最后结点时
data!
=hh->
data)//如果文章链表的内容和要找的内容不一致时
o=oo->
//oo为记录第一个一样内容的位置的指针
//oo始终在o的前面,两指针一起后移
oo=oo->
//hh是存储查找内容链表的第一个结点的指针
else
{//如果两链表的内容相同,hh和o指针后移
hh=hh->
//oo不动,用来定位,方便指针的回溯
else//如果存储要查内容的链表的指向最后
{//说明找到一个相符,sumadd加一
//hh回到存储要查找内容链表的第一个结点
sumadd++;
文章中要查找的字符个数是:
sumadd<
////////////////删除指定的字符/////////////////////////////////////////////////////
voiddeletechar(ListNode*rr1)//rr1的返回指针为first指针
intm1;
请输入需要删除的字符数量:
m1;
if(m1==1)//当要删除一个字符时的情况
ListNode*oo1,*g1;
charc1;
请输入要删除字符:
c1;
oo1=rr1;
while(oo1->
link!
=NULL)
if(oo1->
link->
data==c1)
g1=oo1->
oo1->
link=g1->
oo1=oo1->
if(m1!
=1)//当要删除多个字符时的情况
ListNode*o2,*oo2,*hhh2,*n2,*hh2,*h2;
chari2;
hh2=newListNode;
//hh2为头指针
h2=hh2;
hhh2=hh2;
//让hhh2指向头指针
for(intj2=0;
j2<
j2++)//建立链表存储要删除的内容
i2;
n2=newListNode;
n2->
data=i2;
h2->
link=n2;
h2=n2;
hh2=hhh2->
//hh2后移一个,为头指针指向的结点的指针
oo2=rr1;
//oo2为存储文章链表的头结点
o2=rr1->
//o2为头结点所指向的结点指针
for(ints2=0;
s2<
s2++)
if(o2!
if(hh2!
=NULL)//当记录要删除的字符的链表指针不指向最后结点时
if(o2->
=hh2->
data)
o2=oo2->
o2=o2->
//与查找功能类似,oo2为定位指针,方便回溯
oo2=oo2->
//如果两链表的内容不同,指针分别后移
hh2=hh2->
//如果两链表内容相同,两指针同时后移
//oo2不移,定位作用
//找到符合条件的链表后,hh2回到头结点的下一个结点
oo2->
link=o2;
//定位指针指向符合条件的最后的一个结点的下一个结点
}//符合内容的链表结点被删除
/////////////////输出链表内容函数////////////////////////////
voidputch(ListNode*uuu)//uuu的返回指针为first指针
ListNode*uu;
uu=uuu->
while(uu!
uu->
data;
uu=uu->
//////////////////存储链表内容到文本文件的函数///////////////////////
voidwritech(ListNode*yyyy)//yyyy的返回指针为first指针
ListNode*yyy;
intcc=0;
yyy=yyyy->
ofstreamoutfile("
f1.txt"
ios:
:
trunc);
//清空并打开文件
for(intnn=1;
nn<
nn++)
while(yyy!
outfile.put(yyy->
data);
yyy=yyy->
outfile.close();
/////////////////将删除字符后的文本存到文件中的函数////////////////////////
voidwritech1(ListNode*yy)//yy的返回指针为first指针
yyy=yy->
f2.txt"
for(intnn=0;
intmain()
first=CreatList();
countchar(first);
countletter(first);
countspace(first);
countnumber(first);
countcharnumber(first);
writech(first);
charch;
ListNode*milk;
milk=first->
ifstreaminfile("
in);
//打开文件
if(!
infile)
cerr<
openf1.txterror!
exit
(1);
while(infile.get(ch))//将文件内容赋给链表
{
milk->
data=ch;
milk=milk->
infile.close();
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 数据结构 综合 模拟 实习