C语言程序设计实验报告.docx
《C语言程序设计实验报告.docx》由会员分享,可在线阅读,更多相关《C语言程序设计实验报告.docx(17页珍藏版)》请在冰豆网上搜索。
![C语言程序设计实验报告.docx](https://file1.bdocx.com/fileroot1/2022-10/18/68455d0d-6155-411c-834d-b83e3534fd9a/68455d0d-6155-411c-834d-b83e3534fd9a1.gif)
C语言程序设计实验报告
实验报告C语言程序设计专业计算机科学与技术班级0809日期2009-4-3成绩
实验组别第次实验3指导教师卢萍
学生姓名邓入弋学号u200814504同组人姓名
数组实验实验名称一、实验目的1.掌握数组的说明、初始化和使用。
2.掌握一维数组作为函数参数时实参和形参的用法。
3.掌握字符串处理函数的设计,包括串操作函数及数字串与数之间转换函数实现算法。
4.掌握基于分治策略的二分查找算法和选择法排序算法的思想,以及相关算法的实现。
二、实验任务
利用数组实现有关排序,串操作和查找的程序,解决一些经典问题(如瑟夫问题,八皇后问题等)。
三、实验步骤及结果
(要求给出源程序和程序运行结果。
另外,根据实验内容,记录编辑、编译、链接、调试程序的操作过程和实验现象)
1.源程序改错题
下面程序用来将数组a中元素按升序排序后输出。
分析程序中存在的问题,并对程序进行修改,使之能够正确完成任务。
#include
voidmain(void)
{
inta[10]={27,13,5,32,23,3,17,43,55,39};
voidsort(int[],int);
inti;
sort(a[0],10);
for(i=0;i<10;i++)
printf(m,a[i]);
printf(\
);
}
voidsort(intb[],intn)
{
inti,j,t;
for(i=0;ifor(j=0;jif(b[j]
t=b[j],b[j]=b[j+1],b[j+1]=t;
}
'function':
'int*'differsinlevelsof
输入以上源程序,进行编译,没有错误但有两个警告:
1.
indirectionfrom'int'和'sort':
differenttypesforformalandactualparameter1,进行修改得如下程序:
#include
voidmain(void)
{
inta[10]={27,13,5,32,23,3,17,43,55,39};
voidsort(int[],int);
inti;
sort(a,10);/*此处的形参应用数组名,作为一个指针常量,代表数组首元素的地址*/
for(i=0;i<10;i++)
printf(m,a[i]);
printf(\
);
}
voidsort(intb[],intn)
{
inti,j,t;
for(i=0;ifor(j=0;jif(b[j]
t=b[j],b[j]=b[j+1],b[j+1]=t;
}
2.进行连接,没有错误。
3.运行该程序,得如下运行结果:
(是按降序排列的,证明有逻辑错误)
4.经过调试,对程序进行修改,得如下结果:
#include
voidmain(void)
{
inta[10]={27,13,5,32,23,3,17,43,55,39};
voidsort(int[],int);
inti;
sort(a,10);
for(i=0;i<10;i++)
printf(m,a[i]);
printf(\
);
}
voidsort(intb[],intn)
{
inti,j,t;
for(i=0;ifor(j=0;j*/
时才替换b[j]>b[j+1]按升序排列应为if(b[j]>b[j+1])/*
t=b[j],b[j]=b[j+1],b[j+1]=t;
}
程序运行结果:
2.源程序完善、修改、替换题
(1)下面程序用于求解瑟夫问题。
M个人围成一圈,从第一个人开始依次从1至N循环报数,每当报数为N时报数人出圈,直到圈中只剩下一个人为止。
请在下划线处填写合适的代码来完善该程序。
#include
#defineM10
#defineN3
voidmain(void)
{
inta[M],b[M];/*数组a存放圈中人的编号,数组b存放出圈人的编号*/
inti,j,k;
for(i=0;ia[i]=i+1;
for(i=M,j=0;i>1;i--){
/*i表示圈中人个数,初始为M个,剩1个人时结束循环;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;k
;
}
for(i=0;iprintf(“m”,b[i]);
printf(“m\n”,a[0]);/*输出圈中最后一个人的编号*/
}
(2)上面程序用数组元素的值表示圈中人的编号,每当有人出圈时都要压缩数组,这种算法不够精炼。
如果采用做标记的办法,即每当有人出圈时对相应数组元素做标记,省掉压缩数组的时间,这样处理效率更高一些。
请采用做标记的办法修改
(1)中程序,使修改后的程序与
(1)中程序具有相同的功能。
(1)填写代码后,源程序如下:
#include
#defineM10
#defineN3
voidmain(void)
{
inta[M],b[M];/*数组a存放圈中人的编号,数组b存放出圈人的编号*/
inti,j,k;
M*/
—1对圈中人按顺序编号/*for(i=0;ia[i]=i+1;
for(i=M,j=0;i>1;i--){
/*i表示圈中人个数,初始为M个,剩1个人时结束循环;j表示当前报数人的位置*/
for(k=1;k<=N;k++)/*1至N报数*/
if(++j>i-1)j=0;/*最后一个人报数后第一个人接着报,形成一个圈*/
a[j-1]a[j+1];/*将报数为:
N的人的编号存入数组b[M-i]=j?
b*/
if(j)
/*压缩数组afor(k=--j;k
,使报数为N的人出圈*/
a[k]=a[k+1];
}
/*for(i=0;ib[i]);
printf(“m”/*输出圈中最后一个人的编号*/
m\nprintf(“”,a[0]);
}
程序运行结果:
(2)上面程序用数组元素的值表示圈中人的编号,每当有人出圈时都要压缩数组,这种算法不够精炼。
如果采用做标记的办法,即每当有人出圈时对相应数组元素做标记,省掉压缩数组的时间,这样处理效率更高一些。
请采用做标记的办法修改
(1)中程序,使修改后的程序与
(1)中程序具有相同的功能。
编写程序如下:
#include
#defineM10
#defineN3
voidmain(void)
{inta[M],b[M];/*数组a存放圈中人的编号,数组b存放出圈人的编号*/
inti,j,k;
for(i=0;ia[i]=i+1;
for(i=M,j=0;i>1;i--)
/*i表示圈中人个数,初始为M个,剩1个人时结束循环;j表示当前报数人的位置*/
{
for(k=1;k<=N;k++)/*1至N报数*/
{
if(++j>M)j=1;/*最后一个人报数后,第一个人接着报*/
if(a[j-1]==0)k--;/*碰到已标记的元素,报数减1*/
}
b[M-i]=a[j-1];/*将报数为N的人的编号存入数组b*/
a[j-1]=0;/*并将其标记为0*/
}
for(i=0;iprintf(m,b[i]);
for(i=0;iif(a[i]!
=0)
printf(m\n,a[i]);
}
程序运行结果:
3.跟踪调试题
#include
voidstrncat(char[],char[],int);
voidmain(void)
{
chara[50]=Theadoptedsymbolis,b[27]=abcdefghijklmnopqrstuvwxyz;
strncat(a,b,4);
printf(%s\n,a);
}
voidstrncat(chars[],chart[],intn)
{
inti=0,j;
while(s[i++]);
for(j=0;js[i++]=t[j++];
s[i]='\0';
}
函数strncat(s,t,n)本来应该将字符数组t的前n个字符连接到字符数组s中字符串的尾部。
但函数strncat在定义时代码有误,不能实现上述功能。
按下面的要求进行操作,回答问题并排除错误。
(1)单步执行。
进入函数strncat后观察表达式s、t和i。
当光条落在for语句所在行时,i的值为23;当光条落在strncat函数块结束标记(右花括号})所在行时,s为0x0012ff4cTheadoptedsymbolis,t为砰?
㈱晦?
慜换敤杦楨歪浬潮煰獲畴睶祸屺。
(2)分析函数出错的原因,排除错误,使函数正确实现功能,最后写出程序的输出结果。
通过分析,执行完while语句后,i对应的是串尾'\0'后面一个单元的位置,所以先要自减i,使它对应'\0'所在单元。
修改后程序如下:
#include
voidstrncat(char[],char[],int);
voidmain(void)
{
chara[50]=Theadoptedsymbolis