杭电数据结构课程设计报告模板内附C代码文档格式.docx
- 文档编号:20316119
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:57
- 大小:887.02KB
杭电数据结构课程设计报告模板内附C代码文档格式.docx
《杭电数据结构课程设计报告模板内附C代码文档格式.docx》由会员分享,可在线阅读,更多相关《杭电数据结构课程设计报告模板内附C代码文档格式.docx(57页珍藏版)》请在冰豆网上搜索。
//出栈
intPopStack(Stack&
return*(--s.top);
intmain()
intpeach=0;
voidshuZu();
intdigui(inti,intj);
intchanggui();
shuZu();
peach=digui(1,1);
cout<
<
"
递归方法实现结果:
peach<
endl;
//以下为链表实现
inti=10,data;
Stacks;
InitStack(s);
PushStack(s,1);
//先将第10天的桃子数1入栈
while(i-->
1)
data=PopStack(s);
//出栈一个元素保存在data中
PushStack(s,2*(data+1));
//再将2*(data+1)入栈
//最后栈中剩余的那个元素就是第1天摘的桃子数
链表方法实现结果:
PopStack(s)<
常规方法实现结果:
changgui()<
return0;
voidshuZu()
//数组方式实现
intpeach[10];
peach[9]=1;
for(inti=8;
i>
=0;
i--)
peach[i]=(peach[i+1]+1)*2;
数组方法实现结果:
peach[0]<
intdigui(inti,intj)
//递归方法实现
staticintpeach=i;
staticintday=j;
if(day==10)
returnpeach;
elsepeach=(digui(peach,++day)+1)*2;
returnpeach;
intchanggui()
intpeach=1;
for(inti=1;
i<
10;
i++)
peach=(peach+1)*2;
1.4程序运行结果
2进制数转化问题
2.1需求分析
任意给定一个M进制的数x,请实现如下要求
1)求出此数x的10进制值(用MD表示)
2)实现对x向任意的一个非M进制的数的转换。
3)至少用两种或两种以上的方法实现上述要求(用栈解决,用数组解决,其它方法解决)
2.2程序设计思想
假如N为输入的数,n为要转换为的进制,若要将十进制231转换为8进制数,过程如下;
NN/nN%n
231287
2834
303
则输出为347,可以看出,首先得到的应该是7,然后才是4,最后是3,但是要逆序显示,自然就类似压栈出栈的数据结构了。
所以,只需要初始化栈后,将N%n不断的压入栈底,需要注意的是如果要转换为16进制,则需要对大于9的数字作字符处理。
2.3程序源代码
#include<
stdio.h>
stdlib.h>
string.h>
math.h>
voidTransIntoDec(doubleM,intX)
voidTransIntoAny(intX);
char*p=NULL;
intlen=0;
inti;
intsum=0;
intby=1;
十进制数为:
"
p=(char*)malloc(32);
itoa(X,p,10);
len=strlen(p);
for(i=0;
len;
by*=pow(M,len-i-1);
by*=(*(p+i)-'
0'
sum+=by;
by=1;
%d\n"
sum);
TransIntoAny(sum);
}voidTransIntoAny(intX)
intr;
inttemp[32];
inti=0;
请输入转化进制:
scanf("
%d"
&
r);
while(X)
temp[i++]=X%r;
X/=r;
经转化为:
while(i)
temp[--i]);
}voidmain()
intm;
intx;
intlength;
char*p=NULL;
请输入数字及确定其进制:
%d%d"
m,&
x);
itoa(x,p,10);
length=strlen(p);
length;
if(*(p+i)-'
>
m)
break;
if(i==length)
TransIntoDec(m,x);
Inputerror\n"
return;
2.4程序运行结果
3长整数运算
3.1需求分析
设计一个程序实现两个任意长的整数求和运算。
提示:
可利用双项循环链表实现长整数的存储,每个结点含一个整型变量。
3.2程序设计思想
定义双链表的节点结构,每个节点存储一个4位的数,比如1,0031,0056存入链表后就是1,31,56三个节,输出的时候再补0输出,由此完成长整数加法或减法运算。
3.3程序源代码
//以下是双链表的节点结构,每个节点存储一个4位的数,比如1,0031,0056存入链表后就是1,31,56三个节,输出的时候再补0输出!
typedefstructnode{
intn;
structnode*next;
structnode*prev;
}node;
node*p;
charnum1[1024],num2[1024];
intconv(char*a)
intn=0,i;
for(i=0;
a[i];
++i)
n*=10;
n+=(a[i]-'
returnn;
charc[2];
inti,f;
node*q;
p=(node*)malloc(sizeof(node));
p->
next=p->
prev=0;
q=p;
num1[0]=num2[0]='
'
;
请输入第一个数字:
%s"
num1+1);
for(i=strlen(num1);
--i)
if(num1[i]=='
)
num1[i]=0;
q->
next=(node*)malloc(sizeof(node));
next->
prev=q;
next=0;
q=q->
next;
n=conv(num1+i+1);
next=p;
请输入运算符号:
c);
*c=*c=='
+'
?
0:
1;
请输入第二个数字:
num2+1);
f=0;
if(!
*c)//+
for(i=strlen(num2);
if(num2[i]=='
num2[i]=0;
if(q->
next==p)
n=0;
prev=q->
n+=(conv(num2+i+1)+f);
n<
10000)
f=0;
f=1;
n-=10000;
if(f)
n=1;
while(q->
next!
=p)
n+=1;
%d,"
p->
prev->
n);
for(q=p->
prev;
q!
=p;
q=q->
prev)
%04d,"
q->
else//-
n-=(conv(num2+i+1)+f);
n>
=0)
n+=10000;
n-=1;
3.4程序运行结果
4学生成绩管理系统
4.1需求分析
现有学生成绩信息文件1(1.txt),内容如下(数据可以自拟)
姓名学号语文数学英语
张明明01677882
李成友02789188
张辉灿03688256
王露04564577
陈东明05673847
….......…
学生成绩信息文件2(2.txt),内容如下:
陈果31576882
李华明32889068
张明东33484256
李明国34504587
陈道亮35475877
试编写一管理系统,要求如下:
1)实现对两个文件数据进行合并,生成新文件3.txt
2)抽取出三科成绩中有补考的学生并保存在一个新文件4.txt
3)对合并后的文件3.txt中的数据按总分降序排序(至少采用两种排序方法实现)
4)输入一个学生姓名后,能查找到此学生的信息并输出结果(至少采用两种查找方法实现)
5)要求使用结构体,链或数组等实现上述要求。
4.2程序设计思想
建立学生信息保存在文本文档中,具体对学生信息进行插入删除查询操作时,将保存在文本文档中的学生信息提取出来保存在自己定义的数据结构中,然后再对该数据结构进行操作,所有操作完成后或者在相应的命令后再将学生信息保存到文本文档中。
数据类型主要是char、int、float等数据类型,内容包括学号、姓名等数据。
4.3程序源代码
string>
chartop[50];
//成绩文件顶部的标题用top保存
typedefstructstudent{//单个学生成绩的记录
charname[10];
//姓名
intnumber;
//学号
intchinese;
//语文
intmath;
//数学
intenglish;
//英语
structstudent*next;
}student,*gradelist;
gradelistfileread(char*adress){//读取成绩文件
FILE*fp;
if((fp=fopen(adress,"
r"
))==NULL){//打开文件
文件打开出错"
gradelistfile=(student*)malloc(sizeof(student));
//申请空间
file->
next=NULL;
student*p=file;
//操作指针
intn=0;
//循环标记,具体作用是在第一次循环时方便处理标题
while(!
feof(fp)){
if(n==0){
fgets(top,50,fp);
//处理标题,并且文件指针移到第二行
if(n==1){//申请空间
next=(student*)malloc(sizeof(student));
p=p->
fscanf(fp,"
%s%d%d%d%d"
name,&
p->
number,&
chinese,&
math,&
english);
//将文件的数据输入到链表中
n=1;
if(fclose(fp)){//关闭文件
文件关闭失败"
returnfile;
voidFilePrint(gradelistfile){//将成绩文件打印到屏幕上
student*p=file;
%s\n"
top);
//打印标题
while(p->
=NULL){
%6s%2d%d%d%d\n"
name,p->
number,p->
chinese,p->
math,p->
//循环打印
voidmerger(){//合并文件
char*address1="
F:
/1.txt"
*address2="
/2.txt"
*address3="
/3.txt"
gradelistfile1=fileread(address1),file2=fileread(address2);
FILE*fp;
if((fp=fopen("
3.txt"
"
w+"
))==NULL){//先新建一个3.txt,然后将1.txt和2.txt的内容输入到里面
合并成绩文档失败,原因:
建立文档出错"
student*p1=file1,*p2=file2;
fprintf(fp,"
//先输入标题
while(p1->
p1->
name,p1->
number,p1->
chinese,p1->
math,p1->
//输入1.txt
p1=p1->
while(p2->
p2->
name,p2->
number,p2->
chinese,p2->
math,p2->
//输入2.txt
p2=p2->
if(fclose(fp)){
voidextract(){//抽取补考的成绩记录
char*address4="
/4.txt"
))==NULL){//新建文件4.txt
抽取补考学生成绩记录建立新文件失败"
gradelistfile3=fileread(address3);
student*p=file3;
if((p->
chinese)<
60||(p->
math)<
english)<
60){//补考条件
voidsort(inti){
char*address3="
//先将3.txt读入链表
if(remove("
)){//由于排序后的内容也要保存到3.txt,故删除3.txt
删除文件出错"
//学生个数
))==NULL){//新建一个空的3.txt
新建文件出错"
//标题先输入
n++;
typedefstruct{
inttotalgrade;
}gradenote;
//成绩记录
typedefstruct{
gradenoter[100];
//只初始化了100了空间,学生人数超过100就不能了,懒得动态分配了
}grade_list;
//待排序成绩表
grade_listL;
p=file3;
intt,k,j,k1,j1;
for(t=1;
t<
=n;
t++,p=p->
next){//将链表的内容复制到结构数组里
strcpy(L.r[t].name,p->
name);
L.r[t].number=p->
number;
L.r[t].chinese=p->
chinese;
L.r[t].math=p->
math;
L.r[t].english=p->
english;
L.r[t].totalgrade=p->
chinese+p->
math+p->
if(i==1){//直接插入排序
for(k=2;
k<
++k){
if(L.r[k].totalgrade<
L.r[k-1].totalgrade){
L.r[0]=L.r[k];
L.r[k]=L.r[k-1];
for(j=k-2;
L.r[0].totalgrade<
L.r[j].totalgrade;
--j){
L.r[j+1]=L.r[j];
L.r[j+1]=L.r[0];
if(i==2){
for(k1=2;
k1<
++k1){
L.r[0]=L.r[k1];
intlow=1,hi
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告 模板 代码