C程序设计大数据结构综合模拟实习Word下载.docx

上传人:b****5 文档编号:18142025 上传时间:2022-12-13 格式:DOCX 页数:49 大小:544.69KB
下载 相关 举报
C程序设计大数据结构综合模拟实习Word下载.docx_第1页
第1页 / 共49页
C程序设计大数据结构综合模拟实习Word下载.docx_第2页
第2页 / 共49页
C程序设计大数据结构综合模拟实习Word下载.docx_第3页
第3页 / 共49页
C程序设计大数据结构综合模拟实习Word下载.docx_第4页
第4页 / 共49页
C程序设计大数据结构综合模拟实习Word下载.docx_第5页
第5页 / 共49页
点击查看更多>>
下载资源
资源描述

C程序设计大数据结构综合模拟实习Word下载.docx

《C程序设计大数据结构综合模拟实习Word下载.docx》由会员分享,可在线阅读,更多相关《C程序设计大数据结构综合模拟实习Word下载.docx(49页珍藏版)》请在冰豆网上搜索。

C程序设计大数据结构综合模拟实习Word下载.docx

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();

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 临床医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1