华中科技大学 C语言实验与课程设计实验报告 CS1408赵晓雁
,
(2)CHANGE值为1时,结果正确:
4.3 实验体会
源程序改错中,依赖于平时良好的输入习惯,在输入过程中已经可以检查出大多数语法错误,或者拼写错误。接下来再检查一下逻辑是否有误,无误则进行多组数据的编译检验,确认最终无误。
源程序修改与替换题锻炼我们将函数功能转化为带参数的宏定义的能力,同时要注意宏定义的引用方式,时刻注意加上括号,防止在引用过程中由于优先级不同导致引用产生歧义,严谨杜绝副作用。
程序设计题则是自主的设计实践,根据题目要求自主设计宏定义,增强对于所学知识的熟练度和理解程度,锻炼编写代码的能力以及并通过问题的进一步引申锻炼思维的灵活性。
36
华中科技大学 C语言实验与课程设计实验报告 CS1408赵晓雁
5数组实验
5.1实验目的
(1)掌握数组的说明、初始化和使用。
(2)掌握一维数组作为函数参数时实参和形参的用法。
(3)掌握字符串处理函数的设计,包括串操作函数及数字串与数之间转换函数的实现算法。
(4)掌握基于分治策略的二分查找算法和选择法排序算法的思想,以及相关算法的实现。
5.2实验内容及要求
5.2.1. 源程序改错
下面是用来将数组a中元素按升序排序后输出的源程序。分析源程序中存在的问题,并对源程序进行修改,使之能够正确完成任务。
程序代码:
#include
int a[10]={27,13,5,32,23,3,17,43,55,39}; void sort(int [],int); int i;
sort(a[0],10); for(i=0;i<10;i++) printf(\printf(\return 0; }
void sort(int b[], int n) {
int i,j,t;
for (i=0;i for (j=0;j t=b[j],b[j]=b[j+1],b[j+1]=t; } 37 华中科技大学 C语言实验与课程设计实验报告 CS1408赵晓雁 【分析及改正】本程序共存在3处错误,分析如下: (1)void sort(int [],int); 错误原因:函数声明位置错误,应该在main函数之前,声明以后才可以再main函数内部调用。 改正:void sort(int [],int); int main() (2)sort(a[0],10); 错误原因:调用sort函数时,第一个参数类型为指针型,所以引用的参数值应该是a,表示一个地址,即数组a的首地址。而不是a[0],一个具体的数值。 改正:sort(a,10); (3)t=b[j],b[j]=b[j+1],b[j+1]=t; 错误原因:在语句和语句之间使用分号。 改正:t=b[j];b[j]=b[j+1];b[j+1]=t; 5.2.2 源程序修改替换 (1)下面的源程序用于求解瑟夫问题:M个人围成一圈,从第一个人开始依次从1至N循环报数,每当报数为N时报数人出圈,知道圈中只剩下一个人为止。请在源程序2中的下划线处填写合适的代码来完善该程序。 (2)上面的源程序中使用数组元素的值表示圈中人的编号,故每当有人出圈时都要压缩数组,这种算法不够精炼。如果采用做标记的方法,即每当有人出圈时对相应数组元素做标记,从而可省掉压缩数组的时间,这样处理效率会更高一些。因此,请采用做标记的方法修改(1)中的程序,并使修改后的程序与(1)中的程序具有相同的功能。 程序代码: #include int a[M],b[M]; /*数组a存放圈中人的编号,数组b存放出圈人的编号*/ int i, j, k; for (i=0; i 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; k < i; k++)/*压缩数组a,使报数为N的人出圈*/ ______=_______; } 38 华中科技大学 C语言实验与课程设计实验报告 CS1408赵晓雁 for(i=0;i printf(\/*圈中最后一个人的编号*/ return 0; } 【分析】(1)按照题目要求及程序中的注释理解题意,将被提出成员序号装 入新数组,并将原数组一次向前移动。重复循环直到最后一个。 (2)对数组进行标记,利用0、1值对数组进行真值判断,确定数组元素是否在数组中,从而省去清除数组的步骤。 【程序】(1) #include int a[M],b[M]; int i,j,k; for(i=0;i b[M-i]=j?a[j-1]:a[i-1]; if(j) for(k=--j;k for(i=0;i (2) #include int a[M]={0},b[M]; int i,j,k; for(i=M,j=0;i>0;i--){ for(k=1;k<=N;k++){ if(++j>M-1)j=0; if((j==0&&a[9]==1)||(j!=0&&a[j-1]==1))k=k-1; } b[M-i]=j?j:M; a[j-1]=1; } 39 华中科技大学 C语言实验与课程设计实验报告 CS1408赵晓雁 for(i=0;i 【测试】(1)程序运行结果如下,程序正确。 (2)程序运行结果如下,程序正确。 5.2.3跟踪调试 在下面所给的源程序中,函数strncat(s, t, n)本来应该将字符数组t的前n个字符连接到字符数组s中字符串的尾部。但函数strncat在定义时代码有误,不能实现上述功能。请按下面的要求进行操作,并回答问题和排除错误。 (1)单步执行源程序。进入函数strncat后观察表达式s、t和i。当光条落在for语句所在行时,i为何值?当光条落在strncat函数块结束标记“}”所在行时,s、t分别为何值? 进入时 结束时 (2)分析函数出错的原因,排除错误,使函数正确实现功能,最后写出程序的输出结果。 题目程序代码: #include void strncat(char [], char [], int); int main(void) { char a[50] = \ \ strncat(a, b, 4); printf(\return 0; } void strncat(char s[], char t[], int n) { int i = 0, j; while (s[i++]); for (j = 0; j < n && t[j];) s[i++] = t[j++]; s[i] = '\\0'; } 【修改后的源程序】 #include void strncat(char[],char[],int); int main() 40