实验七实验报告卓越14彭佳伟Word文档格式.docx
《实验七实验报告卓越14彭佳伟Word文档格式.docx》由会员分享,可在线阅读,更多相关《实验七实验报告卓越14彭佳伟Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。
printf("
%6d"
a[i]);
\n"
);
return0;
}
voidsort(intb[],intn)
inti,j,t;
n-1;
for(j=0;
j<
n-i-1;
j++)
if(b[j]<
b[j+1])
t=b[j],b[j]=b[j+1],b[j+1]=t;
2.源程序完善、修改、替换
(1)下面的源程序用于求解瑟夫问题:
M个人围成一圈,从第一个人开始依次从1至N循环报数,每当报数为N时报数人出圈,知道圈中只剩下一个人为止。
请在源程序2中的下划线处填写合适的代码来完善该程序。
源程序2:
#defineM10
#defineN3
inta[M],b[M];
/*数组a存放圈中人的编号,数组b存放出圈人的编号*/
inti,j,k;
M;
i++)/*对圈中人安顺序编号1~M*/
a[i]=i+1;
for(i=M,j=0;
i>
1;
i--){/*i表示圈中人的个数,初始为M个,剩一个时循环结束;
j表示当前报数人的位置*/
for(k=1;
k<
=N;
k++)/*1至N报数*/
if(++j>
i-1)j=0;
/*最后一个人报数后第一个人接着报,形成一个圈*/
b[M-i]=j?
:
;
/*将报数为N的人的编号存入数组b*/
if(j)
for(k=--j;
i;
k++)/*压缩数组a,使报数为N的人出圈*/
;
}
M-1;
i++)/*按次输出出圈人的编号*/
b[i]);
%6d\n"
a[0]);
/*圈中最后一个人的编号*/
(2)上面的源程序中使用数组元素的值表示圈中人的编号,故每当有人出圈时都要压缩数组,这种算法不够精炼。
如果采用做标记的方法,即每当有人出圈时对相应数组元素做标记,从而可省掉压缩数组的时间,这样处理效率会更高一些。
因此,请采用做标记的方法修改
(1)中的程序,并使修改后的程序与
(1)中的程序具有相同的功能。
3.跟踪调试源程序
在下面所给的源程序中,函数strncat(s,t,n)本来应该将字符数组t的前n个字符连接到字符数组s中字符串的尾部。
但函数strncat在定义时代码有误,不能实现上述功能。
请按下面的要求进行操作,并回答问题和排除错误。
(1)单步执行源程序。
进入函数strncat后观察表达式s、t和i。
当光条落在for语句所在行时,i为何值?
当光条落在strncat函数块结束标记“}”所在行时,s、t分别为何值?
(2)分析函数出错的原因,排除错误,使函数正确实现功能,最后写出程序的输出结果。
源程序3:
voidstrncat(char[],char[],int);
chara[50]="
Theadoptedsymbolis"
b[27]="
abcdefghijklmnopqrstuvwxyz"
;
strncat(a,b,4);
%s\n"
a);
voidstrncat(chars[],chart[],intn)
inti=0,j;
while(s[i++]);
n&
&
t[j];
)
s[i++]=t[j++];
s[i]='
\0'
4.程序设计
编写并上机调试运行能实现一下功能的程序:
(1)编写一个程序,从键盘读取数据,对一个3*4矩阵进行赋值,求其转置矩阵,然后输出原矩阵和转置矩阵。
(2)编写一个程序,其功能要求是:
输入一个整数,将它在内存中二进制表示的每一位转换成对应的数字字符,存放到一个字符数组中,然后输出该整数的二进制表示。
(3)编写一个程序,其功能要求是:
输入n个学生的姓名和C语言课程的成绩,将成绩按从高到低的次序排序,姓名同时作相应的调整,输出排序后学生的姓名和C语言课程的成绩。
然后,输入一个C语言课程成绩值,用二分查找进行搜索。
如果查找到有该成绩,输出该成绩同学的姓名和C语言课程的成绩;
否则输出提示“notfound”。
三、实验步骤及结果
1源代码:
//
//main.c
//2.7.1
//Createdbyappleon14/12/3.
//Copyright(c)2014年pjw-hust.Allrightsreserved.
sort(a,10);
%-3d"
j<
n-i-1;
if(b[j]>
运行结果:
2.1源代码:
//2.7.2.1
a[j-1]:
a[i];
i-1;
a[k]=a[k+1];
%3d"
%3d\n"
2.2源代码:
//2.7.2.2
inti,j,k,t;
for(i=0;
i<
M;
a[i]=i+1;
for(i=M,j=0;
i--){
for(k=1;
k++){
for(;
a[j]>
10;
j++);
if(j++>
=(M-1))j=0;
b[M-i]=j?
a[j-1]:
a[M-1];
if(j){
b[M-i]=a[j-1];
a[j-1]=11;
else
{
for(t=1;
a[M-t]>
t++);
b[M-i]=a[M-t];
a[M-t]=11;
i<
M-1;
%-6d"
for(i=0;
i<
i++)
if(a[i]<
11)printf("
thelastoneis%6d\n"
a[i]);
3源代码:
//2.7.3
#include<
voidmy_strncat(chars[],chart[],int);
my_strncat(a,b,4);
voidmy_strncat(chars[],chart[],intn)
4.1源代码:
//2.7.4.1
#defineM4
inta1[N][M];
inta2[M][N];
inti,j;
for(i=0;
N;
i++){
Pleaseinput%dthrow:
"
i+1);
for(j=0;
scanf("
%d"
&
a1[i][j]);
a2[i][j]=a1[j][i];
theoriginalarrayis:
%d\t"
a1[i][j]);
thechangedarrayis:
a2[i][j]);
4.2源代码:
//2.7.4.2
intn;
pleaseinputthenumber:
%d"
n);
intmax;
max=sizeof(int)*8;
charch[max];
for(i=max-1;
i>
=0;
i--){
ch[i]=(n&
1)+'
0'
n>
>
=1;
thebinaryis:
max;
%c"
ch[i]);
4.4源代码:
//2.7.4
#defineN5
intBinaryChop(inta[],intx,intn);
charname[N][10],s[N][10];
intscore[N],t,i,j,k,score0,index;
i++){
pleaseinputnames:
%s"
name[i]);
pleaseinputscores:
score[i]);
for(k=1;
k<
k++){
N-k;
if(score[i]<
score[i+1]){
t=score[i],score[i]=score[i+1],score[i+1]=t;
for(j=0;
name[i][j]!
='
j++)
s[i][j]=name[i][j];
name[i][j]=name[i+1][j];
name[i+1][j]=s[i][j];
%s\t%d\n"
name[i],score[i]);
pleaseinputascoreyouwant:
score0);
index=BinaryChop(score,score0,N);
if(index!
=-1)
%s\t%d"
name[index],score[index]);
elseprintf("
Notfound!
intBinaryChop(inta[],intx,intn)
intmiddle,front=0,back=n-1;
middle=(front+back)/2;
front<
=back;
middle=(front+back)/2){
if(x==a[middle])
returnmiddle;
if(x>
a[middle])
back=middle-1;
if(x<
front=middle+1;
return-1;
四、实验体会
一维字符数组是构造字符串的基础,也是构成文本的基础。
在C语言的一维数组中,一维字符数组是需要重点掌握的。
包括一维数组的声明和使用以及初始化。
在此基础上掌握字符串处理函数的设计与编程。
同时还要掌握多维数组的使用和二分查找及选择排序法程序的设计编写。