华师大C语言实验报告C实验报告3学号姓名课件docWord文档下载推荐.docx
《华师大C语言实验报告C实验报告3学号姓名课件docWord文档下载推荐.docx》由会员分享,可在线阅读,更多相关《华师大C语言实验报告C实验报告3学号姓名课件docWord文档下载推荐.docx(20页珍藏版)》请在冰豆网上搜索。
版]
Maxi=getMax(a,n);
printf("
Maxi=%d\n"
Maxi);
return0;
}
intread(intarr[])
inti=0,n;
FILE*fp;
if((fp=fopen("
data.txt"
"
r"
))==NULL)
{printf("
cantfindthefile!
"
);
while(!
feof(fp))
fscanf(fp,"
%d"
&
arr[i++]);
n=i;
fclose(fp);
returnn;
intgetMax(intarr[],intn)
inti,Maxi=0;
#版^*%]
for(i=0;
i<
n;
i++)
if(arr[Maxi]<
arr[i])
{[新#*新@^版]
arr[Maxi]=arr[i];
Maxi=i;
Max=%d\n"
arr[Maxi]);
returnMaxi;
运行结果窗口
任务二掌握一维数组的删除操作
1.编写功能函数:
删除第i个数组元素,返回数组实际长度。
需要考虑异常情况,给出出错
提示
intdelArray(intarr[],intn,inti)
2.编写数组构造函数,数组中存储1-n的整数序列
voidmakeArray(intarr[],intn)
3.编写输出函数,输出数组中前n个数。
voidpntArray(intarr[]intn)
4.编写主函数:
输入n个数,删除奇数位置上的数后输出。
调用上述子函数完成功能。
源程序清单ex03_02.cpp
#defineMAX100
intdelArray(intarr[],intn,inti);
voidmakeArray(intarr[],intn);
voidpntArray(intarr[],intn);
intmain()
intn,j,i,m;
n:
scanf("
n);
if(n<
=1)[新@~版版*#]
wrong,sometingwrong啦!
"
else
makeArray(a,n);
m=n;
for(j=(m+1)/2+(m+1)/2-1;
j>
0;
j=j-2)
delArray(a,n,j);
n=n-1;
pntArray(a,n);
intdelArray(intarr[],intn,inti)
intk;
for(k=i;
k<
k++)
arr[k]=arr[k+1];
voidmakeArray(intarr[],intn)
{[新%新版#~@]
for(k=1;
=n;
arr[k]=k;
arr[k]);
\n"
voidpntArray(intarr[],intn)
[新~*#新版版]
}[新版%新~@&
]
.测试用例设计
(1)n为奇数
n=7
输出:
246
(2)n为偶数
n=6[新版新^%#版]
(3)n=0
wrong,sometingwrong啦!
(4)n=1
任务三掌握一维数组的查找操作
删除第i个数组元素
intdel(intarr[],intn,inti)
2.编写功能函数:
寻找值为x的数组元素,返回下标值。
考虑:
找不到x时的处理
intfind(intarr[],intn,intx)
3.编写功能函数:
从文本文件data.txt读取数据到数组a,返回n
intgetData(intarr[])
4.编写功能函数:
将数组a的数据写入文件result.txt,成功返回1,否则0;
intsaveData(intarr[],intn)
5.编写主函数:
从文件读入数据,输入需要删除的数,处理数组数据后写入文件。
输出反馈,
删除成功还是失败。
源程序清单ex03_03.cpp
intdel(intarr[],intn,inti);
intfind(intarr[],intn,intx);
intgetData(intarr[]);
intsaveData(intarr[],intn);
inta[100];
intx,n,i,m,t;
n=getData(a);
t=n;
删除x:
x);
m=find(a,n,x);
[新*@版新#^]
if(m>
=0)
del(a,n,m);
saveData(a,n);
if(t!
=n)
删除成功"
删除失败,找不到要求的x值\n"
intdel(intarr[],intn,inti)
intfind(intarr[],intn,intx)
for(k=0;
if(arr[k]==x)
returnk;
if(k==n)
return-1;
{[新新%@版&
^]
FILE*fp;
[新%版@版#*]
intk=0;
arr[k]);
k++;
intsaveData(intarr[],intn)
result.txt"
w"
[新版版#~^%]
}[新版~新&
版@]
fprintf(fp,"
%d"
[新版@~^版&
运行结果:
(1)窗口
(2)data.txt的内容
2356892178783247845783478804675793678956632454678135879734562
57556345
(3)result.txt的内容
2356892178324453480467579
367895663245467813587973456257[新版版%~*&
556345
任务四掌握一维数组的插入操作[新^@版*&
%]
(1)编写功能函数
插入第i个数组元素
intinsert(int*pa,intn,inti,intx)
(2)编写主函数:
输入n个有序数,输入x,将x插入数组合适的地方使数组仍然有序。
源程序清单ex03_04.cpp[新*&
版~@%]
intinsert(int*pa,intn,inti,intx);
voidpntArray(intarr[],intn);
intn,x,k,i=-1;
请输入n:
if(n==0)
数组不存在!
a[k]);
请输入x:
[新%#版版^*]
[新新#版版*@]
k++)[新版版~^@新]
if(a[0]<
a[1])
if(a[k]>
x)[新%版*~@^]
i=k;
break;
[新~&
%^*版]
if(a[k]<
x)
if(i==-1)
i=n;
n=insert(a,n,i,x);
intinsert(int*pa,intn,inti,intx)
int*p=pa;
for(k=n;
k>
i;
k--)[新版新@版&
*(p+k)=*(p+k-1);
*(p+i)=x;
n=n+1;
voidpntArray(intarr[],intn)
{inti;
%5d"
arr[i]);
(1)插入值位置在序列中间
有序序列:
2456912[新^%版&
24567912
(2)插入值位置在序列第一位
234567
1234567
(3)插入值位置在序列最后
12345678
(4)插入值是序列中的重复值[新*版&
^%#]
123456
1234456
(5)n=0
数组不存在!
实验二一维数组算法
1.理解并掌握求最大(小)值,排序,查找,倒置算法。
2.了解使用文件中的数值进行测试的方法。
任务一:
最大数最小数算法
编写一个函数,功能为在一个数组中根据要求查找并返回最大值或最小值的下标,例如给一
个标志变量为1时最大值,为2时求最小值,标志变量为参数由程序员调用时指定。
intgetMaxorMin(intarrInt[],intn)
inti,Maxj=0,flag,Minj=0;
请指定标志变量flag:
flag);
if(flag==1)
if(arrInt[i]>
arrInt[Maxj])
Maxj=i;
returnMaxj;
if(arrInt[i]<
arrInt[Minj])
Minj=i;
returnMinj;
[新%^版&
任务二:
排序算法
编写三个函数,功能为按从小到大的顺序对数据中的数据进行排序。
分别采用起泡,选择,
插入算法。
[新%新@#版&
起泡算法
voidbubbleSort(intarrInt[],intn)
inti,t,j;
for(j=1;
j<
j++)
n-j;
arrInt[i+1])
t=arrInt[i];
arrInt[i]=arrInt[i+1];
arrInt[i+1]=t;
}[新~&
版%@#]
}[新版%&
@#版]
插入算法
voidInsertSort(intarrInt[],intn)
inti,j;
for(i=1;
for(j=0;
if(arrInt[j]>
arrInt[i])
Insert(arrInt,arrInt[i],j,i);
}[新@#&
*版版]
intInsert(intarrInt[],intx,intk,intn)
intj,t;
[新版%版新*@]
t=x;
for(j=n-1;
=k;
j--)
arrInt[j+1]=arrInt[j];
arrInt[k]=t;
任务三:
查找
编写两个函数,功能为查找数组中是否存在X,如存在返回下标,如不存在返回标志值。
分
别采用顺序查找和二分查找法完成。
顺序查找
intfind(intarrInt[],intbrr[],intn,intx)
intk,i=0;
if(arrInt[k]==x)
brr[i]=k;
i++;
returni;
二分法:
intbiFind(intarrInt[],intn,intx)
intl,h,m,q,num=0;
l=0;
h=n-1;
q=n;
while(h>
=l)
m=(h+l)/2;
if(arrInt[m]>
h=m;
if(arrInt[m]<
{l=m;
#*版新@]
if(h-l==1&
&
x==arrInt[h])
{m=h;
num++;
if(num>
q)
m=-1;
找不到与x等值的数\n"
returnm;
}[新版新~#&
任务四:
倒置
编写一个函数,功能为将一个数据中的数据逆序存放。
voidreverse(intarrInt[],intn)
inti,t;
=n/2-1;
{t=arrInt[i];
arrInt[i]=arrInt[n-i-1];
arrInt[n-i-1]=t;
任务五:
验证以上编写的函数。
编写main函数,安排合适的输入输出和函数调用语句,验证上述编写的函数功能。
要求
(1)有清晰的输入输出提示语句。
(2)数组必须在main函数中定义。
(3)数组中数据,调用一个用户自定义函数,从文本文件中读取。
源程序:
ex03_05.cpp[新*新版@&
只需列举完整main函数和其它所有函数的函数声明。
请加注释说明函数功能
intgetMaxorMin(intarrInt[],intn);
voidbubbleSort(intarrInt[],intn);
[新版版*#&
voidInsertSort(intarrInt[],intn);
[新*@^#%版]
intInsert(intarrInt[],intx,intk,intn);
[新^版版@新#]
intfind(intarrInt[],intbrr[],intn,intx);
intbiFind(intarrInt[],intn,intx);
voidreverse(intarrInt[],intn);
{[新%&
版^版@]
intb[100];
[新%新版~版#]
intn,x,y,z,m,i;
求最大或最小值:
(求最大值请将标志值定为1,否则就是求最小值啦)\n"
最大值或最小值的下标是%d\n"
getMaxorMin(a,n));
接下来是排序。
请输入选择排序的方式\n1表示起泡排序;
2表示插入排序\nx:
if(x==1)
bubbleSort(a,n);
}[新版^新#~版]
InsertSort(a,n);
}[新&
新#版@*]
接下来进行查找。
请选择查找方式\n1表示顺序查找;
2表示二分法查找\n要注
意的是其中二分法查找首先要进行排序,所以和上步操作顺序不可互换\n"
y);
在输入需要查找的数字z:
z);
if(y==1)[新%@#新版~]
m=find(a,b,n,z);
所找数字的下标依次是:
m;
b[i]);
m=biFind(a,n,z);
所找数字的下标是:
m);
最后一步倒置操作\n"
reverse(a,n);
[新%~@版*新]
思考题
1.请画出下列数据序列,使用起泡法,选择法和插入算法的排序过程。
46,12,172,98,46,9
2.我们经常会讨论排序算法的稳定性,若待排序的序列中,存在多个具有相同关键字的记[新~%*版^&
录,经过排序,这些记录的相对次序保持不变,则称该算法是稳定的;
若经排序后,记录的
相对次序发生了改变,则称该算法是不稳定的。
请问起泡,选择和插入算法的稳性如何
3.请设计符合下面要求的测试用例,画出使用二分查找算法的查找过程。
(1)没有找到
(2)第一次就找到
(3)需要查找的数在数组的第一个
(4)需要查找的数在数组的最后一个
4.如果在main要求从大到小排序,使用现有的函数,如何实现,写出功能实现语句。
实验三:
自选实验
1.加深对结构化程序结构的理解:
使用函数
2.加深对数组的掌握
3.学习二维数组
实验内容[新&
版版%@#]
任务一:
Craps
Craps是一种在娱乐场所很流行的游戏,它的规则如下:
游戏者投掷两个筛子,每个筛子有
六面,就可能得到1,2,3,4,5,6点。
当筛子停下来后,计算两个筛子的和。
如果第一
次两个筛子的和是7或11,游戏者获胜。
如果第一次两个筛子的和是2,3或12,游戏者输
了。
如果第一次两个筛子的和是4,5,6,8,9或10,两个筛子的和变成游戏者的积点,
游戏者可以继续投掷,直到两个筛子的和等于积点的值,游戏者输了。
但如果其中有一次两
个筛子的和等于7,游戏者获胜。
游戏开始时,游戏者设置参与游戏的筹码,在游戏中,游
戏者可以下注,获胜得到下注数,输了扣去下注数,当游戏者的筹码用完,整个游戏结束。
编写程序,模拟Craps游戏。
(1)编写一个函数:
投掷两个筛子,返回两个筛子的和
提示:
求随机数的方法
#include“stdlib.h”
n=rand()%(Y-X+1)+X;
/*n为X~Y之间的随机数*/
(2)编写一个函数:
检查下注值是否有效,应小于游戏者的筹码数
(3)编写一个处理函数:
根据游戏者是否获胜,修正游戏者的筹码。
(4)显示画面应如下信息,一个可能执行过程如下
源程序清单:
ex03_06.cpp
二维数组
编写程序输入一个数n,再输入一个n*n二维数组,求该数组中除副对角线,第一行和最后
一列之外的数组元素之和。
要求:
编写一个函数getSum用于实现求和操作。
ex03_07.cpp
编写程序实现输出n行杨辉三角。
用两种方法实现,编写两个函数,一个函数用一维数组实现,一个函数用二维数组实
现。
主函数中输入n值后,分别调用两函数输出杨辉三角。