1、C语言程序设计实验报告 实验报告 C语言程序设计 专业 计算机科学与技术 班级 0809 日期 2009-4-3 成绩 实验组别 第 次实验 3 指导教师 卢萍 学生姓名 邓入弋 学号 u200814504 同组人姓名 数组实验 实验名称 一、实验目的1掌握数组的说明、初始化和使用。 2掌握一维数组作为函数参数时实参和形参的用法。 3掌握字符串处理函数的设计,包括串操作函数及数字串与数之间转换函数实现算法。 4掌握基于分治策略的二分查找算法和选择法排序算法的思想,以及相关算法的实现。 二、实验任务 利用数组实现有关排序,串操作和查找的程序,解决一些经典问题(如瑟夫问题,八皇后问题等)。 三、实
2、验步骤及结果 (要求给出源程序和程序运行结果。另外,根据实验内容,记录编辑、编译、链接、调试程序的操作过程和实验现象) 1源程序改错题 下面程序用来将数组a中元素按升序排序后输出。分析程序中存在的问题,并对程序进行修改,使之能够正确完成任务。 #include void main(void) int a10 = 27, 13, 5, 32, 23, 3, 17, 43, 55, 39; void sort(int ,int); int i; sort(a0,10); for(i = 0; i 10; i+) printf(m,ai); printf(); void sort(int b, in
3、t n) int i, j, t; for (i = 0; i n - 1; i+) for ( j = 0; j n - i - 1; j+) if(bj bj+1) t = bj, bj = bj+1, bj+1 = t; function : int * differs in levels of 输入以上源程序,进行编译,没有错误但有两个警告:1.indirection from int 和sort : different types for formal and actual parameter 1,进行修改得如下程序: #include void main(void) int a10
4、 = 27, 13, 5, 32, 23, 3, 17, 43, 55, 39; void sort(int ,int); int i; sort(a,10); /*此处的形参应用数组名,作为一个指针常量,代表数组首元素的地址*/ for(i = 0; i 10; i+) printf(m,ai); printf(); void sort(int b, int n) int i, j, t; for (i = 0; i n - 1; i+) for ( j = 0; j n - i - 1; j+) if(bj bj+1) t = bj, bj = bj+1, bj+1 = t; 2.进行连接
5、,没有错误。 3.运行该程序,得如下运行结果: (是按降序排列的,证明有逻辑错误) 4.经过调试,对程序进行修改,得如下结果: #include void main(void) int a10 = 27, 13, 5, 32, 23, 3, 17, 43, 55, 39; void sort(int ,int); int i; sort(a,10); for(i = 0; i 10; i+) printf(m,ai); printf(); void sort(int b, int n) int i, j, t; for (i = 0; i n - 1; i+) for ( j = 0; j b
6、j+1按升序排列应为 if(bj bj+1) /* t = bj, bj = bj+1, bj+1 = t; 程序运行结果: 2源程序完善、修改、替换题 (1)下面程序用于求解瑟夫问题。M个人围成一圈,从第一个人开始依次从1至N循环报数,每当报数为N时报数人出圈,直到圈中只剩下一个人为止。请在下划线处填写合适的代码来完善该程序。 #include #define M 10 #define N 3 void main(void) int aM, bM; /*数组a存放圈中人的编号,数组b存放出圈人的编号*/ int i, j, k; for(i = 0; i 1; i-) /*i表示圈中人个数,
7、初始为M个,剩1个人时结束循环;j表示当前报数人的位置*/ for(k = 1; k i - 1) j = 0;/*最后一个人报数后第一个人接着报,形成一个圈*/ bM-i = j? : ; /*将报数为N的人的编号存入数组b*/ if(j) for(k = -j; k i; k+) /*压缩数组a,使报数为N的人出圈*/ ; for(i = 0;i M 1; i+) /*按次序输出出圈人的编号*/ printf(“m”, bi); printf(“mn”, a0); /*输出圈中最后一个人的编号*/ (2)上面程序用数组元素的值表示圈中人的编号,每当有人出圈时都要压缩数组,这种算法不够精炼。
8、如果采用做标记的办法,即每当有人出圈时对相应数组元素做标记,省掉压缩数组的时间,这样处理效率更高一些。请采用做标记的办法修改(1)中程序,使修改后的程序与(1)中程序具有相同的功能。 (1)填写代码后,源程序如下: #include #define M 10 #define N 3 void main(void) int aM, bM; /*数组a存放圈中人的编号,数组b存放出圈人的编号*/ int i, j, k; M*/ 1对圈中人按顺序编号/* for(i = 0; i 1; i-) /*i表示圈中人个数,初始为M个,剩1个人时结束循环;j表示当前报数人的位置*/ for(k = 1;
9、k i - 1) j = 0;/*最后一个人报数后第一个人接着报,形成一个圈*/ aj-1 aj+1; /*将报数为: N的人的编号存入数组 bM-i = j? b*/ if(j) /*压缩数组afor(k = -j; k i; k+) ,使报数为N的人出圈*/ ak=ak+1; /* for(i = 0;i M 1; i+) 按次序输出出圈人的编号*/ , bi); printf(“m”/*输出圈中最后一个人的编号*/ mn printf(“”, a0); 程序运行结果: (2)上面程序用数组元素的值表示圈中人的编号,每当有人出圈时都要压缩数组,这种算法不够精炼。如果采用做标记的办法,即每当
10、有人出圈时对相应数组元素做标记,省掉压缩数组的时间,这样处理效率更高一些。请采用做标记的办法修改(1)中程序,使修改后的程序与(1)中程序具有相同的功能。 编写程序如下: #include #define M 10 #define N 3 void main(void) int aM,bM; /*数组a存放圈中人的编号,数组b存放出圈人的编号*/ int i,j,k; for(i=0;i1;i-) /*i表示圈中人个数,初始为M个,剩1个人时结束循环;j表示当前报数人的位置*/ for(k=1;kM)j=1; /*最后一个人报数后,第一个人接着报*/ if(aj-1=0) k-; /*碰到已标
11、记的元素,报数减1*/ bM-i=aj-1; /*将报数为N的人的编号存入数组b*/ aj-1=0; /*并将其标记为0*/ for(i=0;iM-1;i+) printf(m,bi); for(i=0;iM;i+) /*输出数组a中不为0的元素*/ if(ai!=0) printf(mn,ai); 程序运行结果: 3跟踪调试题 #include void strncat(char ,char ,int); void main(void) char a50=The adopted symbol is ,b27=abcdefghijklmnopqrstuvwxyz; strncat(a, b,
12、4); printf(%sn,a); void strncat(char s,char t, int n) int i = 0, j; while(si+) ; for(j = 0; j n & tj;) si+ = tj+; si = 0; 函数strncat(s,t,n)本来应该将字符数组t的前n个字符连接到字符数组s中字符串的尾部。但函数strncat在定义时代码有误,不能实现上述功能。按下面的要求进行操作,回答问题并排除错误。 (1)单步执行。进入函数strncat后观察表达式s、t和i。当光条落在for语句所在行时,i的值为23;当光条落在strncat函数块结束标记(右花括号 )所在行时,s为0x0012ff4cThe adopted symbol is ,t为砰?晦?慜换敤杦楨歪浬潮煰獲畴睶祸屺。 (2)分析函数出错的原因,排除错误,使函数正确实现功能,最后写出程序的输出结果。 通过分析,执行完while语句后,i 对应的是串尾0后面一个单元的位置,所以先要自减i ,使它对应0所在单元。修改后程序如下: #include void strncat(char ,char ,int); void main(void) char a50=The adopted symbol is
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1