C语言程序设计实验报告_第1页
C语言程序设计实验报告_第2页
C语言程序设计实验报告_第3页
C语言程序设计实验报告_第4页
C语言程序设计实验报告_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言程序设计 实验报告专业 计算机科学与技术 班级 0809 日期 2009-4-3 成绩 实验组别 第 次实验 3 指导教师 卢萍 学生姓名 邓入弋 学号 u200814504 同组人姓名 实验名称 数组实验 一、实验目的1掌握数组的说明、初始化和使用。2掌握一维数组作为函数参数时实参和形参的用法。3掌握字符串处理函数的设计,包括串操作函数及数字串与数之间转换函数实现算法。4掌握基于分治策略的二分查找算法和选择法排序算法的思想,以及相关算法的实现。二、实验任务利用数组实现有关排序,串操作和查找的程序,解决一些经典问题(如瑟夫问题,八皇后问题等)。三、实验步骤及结果(要求给出源程序和程序运行结果。另外,根据实验内容,记录编辑、编译、链接、调试程序的操作过程和实验现象)1源程序改错题下面程序用来将数组a中元素按升序排序后输出。分析程序中存在的问题,并对程序进行修改,使之能够正确完成任务。#includevoid 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(%6d,ai); printf(n);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;1.输入以上源程序,进行编译,没有错误但有两个警告:function : int * differs in levels of indirection from int 和sort : different types for formal and actual parameter 1,进行修改得如下程序:#includevoid 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(%6d,ai); printf(n);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.进行连接,没有错误。3.运行该程序,得如下运行结果:(是按降序排列的,证明有逻辑错误)4.经过调试,对程序进行修改,得如下结果:#includevoid 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(%6d,ai); printf(n);void sort(int b, int n) int i, j, t; for (i = 0; i n - 1; i+) for ( j = 0; j bj+1) /*按升序排列应为bjbj+1时才替换*/ t = bj, bj = bj+1, bj+1 = t;程序运行结果:2源程序完善、修改、替换题(1)下面程序用于求解瑟夫问题。M个人围成一圈,从第一个人开始依次从1至N循环报数,每当报数为N时报数人出圈,直到圈中只剩下一个人为止。请在下划线处填写合适的代码来完善该程序。#include#define M 10#define N 3void main(void) int aM, bM;/*数组a存放圈中人的编号,数组b存放出圈人的编号*/int i, j, k; for(i = 0; i 1; i-)/*i表示圈中人个数,初始为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(“%6d”, bi); printf(“%6dn”, a0);/*输出圈中最后一个人的编号*/(2)上面程序用数组元素的值表示圈中人的编号,每当有人出圈时都要压缩数组,这种算法不够精炼。如果采用做标记的办法,即每当有人出圈时对相应数组元素做标记,省掉压缩数组的时间,这样处理效率更高一些。请采用做标记的办法修改(1)中程序,使修改后的程序与(1)中程序具有相同的功能。(1)填写代码后,源程序如下:#include#define M 10#define N 3void main(void) int aM, bM;/*数组a存放圈中人的编号,数组b存放出圈人的编号*/int i, j, k; for(i = 0; i 1; i-)/*i表示圈中人个数,初始为M个,剩1个人时结束循环;j表示当前报数人的位置*/ for(k = 1; k i - 1) j = 0;/*最后一个人报数后第一个人接着报,形成一个圈*/ bM-i = j? aj-1 : aj+1;/*将报数为N的人的编号存入数组b*/ if(j)for(k = -j; k i; k+)/*压缩数组a,使报数为N的人出圈*/ ak=ak+1; for(i = 0;i M 1; i+)/*按次序输出出圈人的编号*/ printf(“%6d”, bi); printf(“%6dn”, a0);/*输出圈中最后一个人的编号*/程序运行结果:(2)上面程序用数组元素的值表示圈中人的编号,每当有人出圈时都要压缩数组,这种算法不够精炼。如果采用做标记的办法,即每当有人出圈时对相应数组元素做标记,省掉压缩数组的时间,这样处理效率更高一些。请采用做标记的办法修改(1)中程序,使修改后的程序与(1)中程序具有相同的功能。编写程序如下:#include#define M 10#define N 3void 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-; /*碰到已标记的元素,报数减1*/ bM-i=aj-1; /*将报数为N的人的编号存入数组b*/ aj-1=0; /*并将其标记为0*/ for(i=0;iM-1;i+) printf(%6d,bi); for(i=0;iM;i+) /*输出数组a中不为0的元素*/ if(ai!=0) printf(%6dn,ai);程序运行结果:3跟踪调试题#includevoid strncat(char ,char ,int);void main(void) char a50=The adopted symbol is ,b27=abcdefghijklmnopqrstuvwxyz; strncat(a, b, 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为0x0012ff30abcdefghijklmnopqrstuvwxyz。(2)分析函数出错的原因,排除错误,使函数正确实现功能,最后写出程序的输出结果。 通过分析,执行完while语句后,i 对应的是串尾0后面一个单元的位置,所以先要自减i ,使它对应0所在单元。修改后程序如下:#includevoid strncat(char ,char ,int);void main(void) char a50=The adopted symbol is ,b27=abcdefghijklmnopqrstuvwxyz; strncat(a, b, 4);printf(%sn,a);void strncat(char s,char t, int n) int i = 0, j;while(si+) ;i-; /*i自减,使它指向0所指单元*/for(j = 0; j n & tj;)si+ = tj+; si = 0;程序运行结果:4编程设计题(1)编写程序从键盘读取数据,对一个34矩阵进行赋值,求其转置矩阵,然后输出原矩阵和转置矩阵。 编写程序如下:#include#define N 3 #define M 4void convert(int array1M,int array2N,int n,int m);void main(void)int i,j;int array1NM,array2MN;/*定义两个二维数组,array1为3*4,array2为4*3*/printf(input array:n);for(i=0;iN;i+)for(j=0;jM;j+)scanf(%d,&array1ij);printf(noriginal array:n);for(i=0;iN;i+)for(j=0;jM;j+)printf(%5d,array1ij);printf(n);convert(array1,array2,N,M); /*调用转置函数*/printf(convert array:n); for(i=0;iM;i+)for(j=0;jN;j+) printf(%5d,array2ij); printf(n);void convert(int array1M,int array2N,int n,int m)int i,j;for(i=0;iN;i+)for(j=0;jM;j+)array2ji=array1ij; /*将下标i、j互换存入array2中*/程序运行结果:(2)输入一个整数,将它在内存中二进制表示的每一位转换成为对应的数字字符,存放到一个字符数组中,然后输出该整数的二进制表示。编写程序如下:#include#include#define BASE 2 /*用宏定义基为2*/void itoa(int n,char s);void main(void)int i;char s20;printf(请输入一个整数:n);scanf(%d,&i);itoa(i,s);printf(该整数的二进制表示为 %sn,s);void reverse(char s) /*定义字符串反转函数*/int c,j,k;for(j=0,k=strlen(s)-1;jk;j+,k-)c=sj,sj=sk,sk=c;void itoa(int n,char s)int sign,j=0;if(sign=n)0)sj+=n%BASE+0;n/=BASE;sj=0;reverse(s);程序运行结果:(3)输入n个学生的姓名和C语言课程的成绩,将成绩按从高到低的次序排序,姓名同时作相应调整,输出排序后学生的姓名和C语言课程的成绩。然后,输入一个C语言课程成绩值,用二分查找进行搜索。如果查找到有该成绩,输出该成绩同学的姓名和C语言课程的成绩;否则输出提示“not found!”。编写程序如下:#include#include#define N 10 /*用宏定义学生人数*/void bubble_sort(char a12,int b,int n);int BinarySearch(int c,int x,int n);void main(void)int i,m,index;char nameN12; /*定义一个二维字符数组,每以夯实一个字符串*/int scoreN;printf(请输入学生的姓名和C语言课程成绩:n);for(i=0;iN;i+)scanf(%s%d,namei,&scorei);bubble_sort(name,score,N);printf(成绩排序后的结果:n);for(i=0;iN;i+)printf(%st%dn,namei,scorei);printf(n请输入一个C语言课程成绩值:n);scanf(%d,&m);index=BinarySearch(score,m,N);if(index!=-1)printf(name:%stscore:%d,nameindex,scoreindex);else printf(not found!n);void bubble_sort(char a12,int b,int n) /*冒泡法排序函数*/int i,j,t;char sN12;for(i=0;in-1;i+)for(j=0;jn-i-1;j+)if(bjbj+1)t=bj,bj=bj+1,bj+1=t;strcpy(sj,aj),strcpy(aj,aj+1),strcpy(aj+1,sj);/*应用函数strcpy进行字符串拷贝*/int BinarySearch(int c,int x,int n)int front=0,back=n-1,middle;while(frontcmiddle)back=middle-1; /*修改前半部分中最后元素的下标为middle-1*/else if(xcmiddle)front=middle+1; /*修改后半部分中最前元素的下标为middle+1*/else return (middle); /*找到,返回该数所在单元下标*/return -1; /*没有找到,返回-1*/程序运行结果如下:5选做题(1)编写函数strnins(s,t,n)。它将字符数组 t中的字符串插入到字符数组 s中字符串的第n个字符的后面。将编好的函数用在程序中,编写程序如下:#include#define N 3 /*宏定义插入到第三个字符后*/void strnins(char s,char t,int n); /*函数声明*/void main(void)char s50=how you?,t10= are; /*初始化两个字符数组*/strnins(s,t,N);printf(%sn,s);void strnins(char s,char t

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论