


下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验报告C语言程序设计专业计算机科学与技术班级0809日期2009-4-3成绩实验组别第次实验3指导教师卢萍学生姓名邓入弋学号U200814504同组人姓名数组实验实验名称_、实验目的1.掌握数组的说明、初始化和使用。2. 掌握一维数组作为函数参数时实参和形参的用法。3. 掌握字符串处理函数的设计,包括串操作函数及数字串与数之间转换函数实现算法。4. 掌握基于分治策略的二分查找算法和选择法排序算法的思想,以及相关算法的实现。二、实验任务利用数组实现有关排序,串操作和查找的程序,解决一些经典问题(如瑟夫问题,八皇后问题等)三、实验步骤及结果(要求给出源程序和程序运行结果。另外,根据实验内容,记录
2、编辑、编译、链接、调试程序的操作过程和实验现象)源程序改错题下面程序用来将数组a中元素按升序排序后输出。分析程序中存在的问题,并对程序进行修改,使之能够正确完成任务。#include<stdio.h>voidmain(void)inta10=27,13,5,32,23,3,17,43,55,39;voidsort(int,int);inti;sort(a0,10);for(i=0;i<10;i+)printf(m,ai);printf();voidsort(intb,intn)inti,j,t;for(i=0;i<n-1;i+)for(j=0;j<n-i-1;j+
3、)if(bj<bj+1)t=bj,bj=bj+1,bj+1=t;)'function':'int*'differsinlevelsof输入以上源程序,进行编译,没有错误但有两个警告:1.indirectionfrom'int'和'sort':differenttypesforformalandactualparameter1,进行修改得如下程序:#include<stdio.h>voidmain(void)inta10=27,13,5,32,23,3,17,43,55,39;voidsort(int,int);i
4、nti;sort(a,10);/*此处的形参应用数组名,作为一个指针常量,代表数组首元素的地址*/for(i=0;i<10;i+)printf(m,ai);printf();voidsort(intb,intn)inti,j,t;for(i=0;i<n-1;i+)for(j=0;j<n-i-1;j+)if(bj<bj+1)1. t=bj,bj=bj+1,bj+1=t;进行连接,没有错误。2. 运行该程序,得如下运行结果:SS4339322?231713533. (是按降序排列的,证明有逻辑错误)经过调试,对程序进行修改,得如下结果:#include<stdio.h
5、>voidmain(void)inta10=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,ai);printf();)voidsort(intb,intn)(inti,j,t;for(i=0;i<n-1;i+)for(j=0;j<n-i-1;j+)*/时才替换bj>bj+1按升序排列应为if(bj>bj+1)/*t=bj,bj=bj+1,bj+1=t;2.源程序完善、修改、替换题(1)下面程序用于求解瑟夫问题。M个人围成一圈,从第一
6、个人开始依次从1至N循环报数,)程序运行结果:每当报数为N时报数人出圈,直到圈中只剩下一个人为止。请在下划线处填写合适的代码来完善该程序。#include<stdio.h>#defineM10#defineN3voidmain(void)(intaM,bM;/*inti,j,k;for(i=0;i<M;i+)/*ai=i+1;for(i=M,j=0;i>1;i-)(/*i表示圈中人个数,初始为for(k=1;k<=N;k+)/*1if(+j>i-1)j=0;/*bM-i=j?:;/*if(j)for(k=-j;k<i;k+)/*数组a存放圈中人的编号,
7、数组对圈中人按顺序编号M个,剩1个人时结束循环;至N报数*/b存放出圈人的编号*/1M*/j表示当前报数人的位置*/*/最后一个人报数后第一个人接着报,形成一个圈将报数为N的人的编号存入数组压缩数组a,使报数为N的人出圈*/b*/)for(i=0;i<M1;i+)/*按次序输出出圈人的编号*/printf("m",bi);printf("mn”,a0);/*输出圈中最后一个人的编号*/)(2)上面程序用数组元素的值表示圈中人的编号,每当有人出圈时都要压缩数组,这种算法不够精炼。如果采用做标记的办法,即每当有人出圈时对相应数组元素做标记,省掉压缩数组的时间,这
8、样处理效率更高一些。请采用做标记的办法修改(1)中程序,使修改后的程序与(1)中程序具有相同的功能。(1) 填写代码后,源程序如下:#include<stdio.h>#defineM10#defineN3voidmain(void)(intaM,bM;/*数组a存放圈中人的编号,数组b存放出圈人的编号*/inti,j,k;M*/1对圈中人按顺序编号/*for(i=0;i<M;i+)ai=i+1;for(i=M,j=0;i>1;i-)(/*i表示圈中人个数,初始为M个,剩1个人时结束循环;j表示当前报数人的位置*/for(k=1;k<=N;k+)/*1至N报数*/i
9、f(+j>i-1)j=0;/*最后一个人报数后第一个人接着报,形成一个圈*/aj-1aj+1;/*将报数为:N的人的编号存入数组bM-i=j?b*/if(j)/*压缩数组afor(k=-j;k<i;k+),使报数为N的人出圈*/ak=ak+1;/*for(i=0;i<M1;i+)按次序输出出圈人的编号*/,bi);printf("m”/*输出圈中最后一个人的编号*/mnprintf(,a0);程序运行结果:ie(2)上面程序用数组元素的值表示圈中人的编号,每当有人出圈时都要压缩数组,这种算法不够精炼。如果采用做标记的办法,即每当有人出圈时对相应数组元素做标记,省掉压
10、缩数组的时间,这样处理效率更高一些。请采用做标记的办法修改(1)中程序,使修改后的程序与(1)中程序具有相同的功能。编写程序如下:#include<stdio.h>#defineM10#defineN3voidmain(void)(intaM,bM;/*inti,j,k;for(i=0;i<M;i+)/*ai=i+1;for(i=M,j=0;i>1;i-)数组a存放圈中人的编号,数组b存放出圈人的编号*/对圈中人按顺序编号1M*/*i表示圈中人个数,初始为M个,剩1个人时结束循环;j表示当前报数人的位置*/(for(k=1;k<=N;k+)/*1(if(+j>
11、;M)j=1;/*if(aj-1=0)k-;/*)bM-i=aj-1;/*aj-1=0;/*至N报数*/最后一个人报数后,第一个人接着报*/碰到已标记的元素,报数减1*/将报数为N的人的编号存入数组b*/)for(i=0;i<M-1;i+)printf(m,bi);for(i=0;i<M;i+)/*if(ai!=0)printf(mn,ai);输出数组a中不为0的元素*/)程序运行结果:并将其标记为0*/跟踪调试题#include<stdio.h>voidstrncat(char,char,int);voidmain(void)(chara50=Theadoptedsy
12、mbolis,b27=abcdefghijklmnopqrstuvwxyz;strncat(a,b,4);printf(%sn,a);)voidstrncat(chars,chart,intn)(inti=0,j;while(si+);for(j=0;j<n&&tj;)si+=tj+;si='0')函数strncat(s,t,n)本来应该将字符数组t的前n个字符连接到字符数组s中字符串的尾部。但函数strncat在定义时代码有误,不能实现上述功能。按下面的要求进行操作,回答问题并排除错误。单步执行。进入函数strncat后观察表达式s、t和i。当光条落在f
13、or语句所在行时,i的值为23;当光条落在strncat函数块结束标记(右花括号)所在行时,s为0x0012ff4cTheadoptedsymbolis,t为砰?晦?憨换殿枚植歪浬潮煽獴畴暗祸小己。(1) 分析函数出错的原因,排除错误,使函数正确实现功能,最后写出程序的输出结果。通过分析,执行完while语句后,i对应的是串尾'0'后面一个单元的位置,所以先要自减i,使它对应0'所在单元。修改后程序如下:#include<stdio.h>voidstrncat(char,char,int);voidmain(void)chara50=Theadoptedsy
14、mbolis,b27=abcdefghijklmnopqrstuvwxyz;strncat(a,b,4);printf(%sn,a);voidstrncat(chars,chart,intn)inti=0,j;while(si+);i-;/*i自减,使它指向'0'所指单元*/for(j=0;j<n&&tj;)si+=tj+;si='0'Theadoptedsymbolisabed程序运行结果:编程设计题341)编写程序从键盘读取数据,对一个矩阵进行赋值,求其转置矩阵,然后输出原(矩阵和转置矩阵。编写程序如下:#include<stdi
15、o.h>#defineN3#defineM4voidconvert(intarray1M,intarray2N,intn,intm);voidmain(void)inti,j;intarray1NM,array2MN;/*定义两个二维数组,array1为3*4,array2为4*3*/printf(inputarray:n);for(i=0;i<N;i+)for(j=0;j<M;j+)scanf(%d,&array1ij);printf(originalarray:n);for(i=0;i<N;i+)for(j=0;j<M;j+)printf(,array
16、1ij);printf();)convert(array1,array2,N,M);/*调用转置函数*/printf(convertarray:n);for(i=0;i<M;i+)for(j=0;j<N;j+)printf(,array2ij);printf();)voidconvert(intarray1M,intarray2N,intn,intm)inti,j;for(i=0;i<N;i+)for(j=0;j<M;j+)*/中array2互换存入j、i将下标array2ji=array1ij;/*)hpubm234hf>?8012345G7»9012
17、3457890S7UL2J4S7Hriglna1Aid*123456787891234array:90901123程序运行结果:fls7o字告(2)输入一个整数,将它在内存中二进制表示的每一位转换成为对应的数字字符,存放到一个字符数组中,然后输出该整数的二进制表示。编写程序如下:#include<stdio.h>#include<string.h>#defineBASE2/*用宏定义基为2*/voiditoa(intn,chars);voidmain(void)inti;chars20;抽潼晴龙请输入一个整数:n);scanf(%d,&i);itoa(i,s);
18、抽潼晴龙该整数的二进制表示为%sn,s);)voidreverse(chars)/*定义字符串反转函数*/(intc,j,k;for(j=0,k=strlen(s)-1;j<k;j+,k-)c=sj,sj=sk,sk=c;)voiditoa(intn,chars)(intsign,j=0;if(sign=n)<0)/*若为一负数,按正数处理*/n=-n;while(n>0)sj+=noSE+'0'n/=BASE;)sj='0'reverse(s);)青输入一个坚数,2767程序运行结果:夏整蒙队一卅利表示为ILLHUiniMU输入n个学生的姓名
19、和C语言课程的成绩,将成绩按从高到低的次序排序,姓名同时作相应调整,输出排序后学生的姓名和C语言课程的成绩。然后,输入一个C语言课程成绩值,用二分查找进行搜索。如果查找到有该成绩,输出该成绩同学的姓名和C语言课程的成绩;否则输出提示“notfound!”。编写程序如下:#include<stdio.h>#include<string.h>#defineN10/*用宏定义学生人数*/voidbubble_sort(chara12,intb,intn);intBinarySearch(intc,intx,intn);voidmain(void)inti,m,index;ch
20、arnameN12;/*定义一个二维字符数组,每以夯实一个字符串*/intscoreN;抽潼晴龙请输入学生的姓名和C语言课程成绩:n);for(i=0;i<N;i+)scanf(%s%d,namei,&scorei);bubble_sort(name,score,N);抽潼晴龙成绩排序后的结果:n);for(i=0;i<N;i+)printf(%st%dn,namei,scorei);printf(请输入一个C语言课程成绩值:n);scanf(%d,&m);index=BinarySearch(score,m,N);if(index!=-1)printf(ame:%
21、stscore:%d,nameindex,scoreindex);elseprintf(otfound!n);voidbubble_sort(chara12,intb,intn)/*冒泡法排序函数*/inti,j,t;charsN12;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;应用函数strcpy进行字strcpy(sj,aj),strcpy(aj,aj+1),strcpy(aj+1,sj);/*符串拷贝*/intfront=0,back=n-1,middle;while(front&
22、lt;=back)middle=(front+back)/2;/*if(x>cmiddle)back=middle-1;/*elseif(x<cmiddle)front=middle+1;/*elsereturn(middle);/*return-1;/*intBinarySearch(intc,intx,intn)计算中间单元的下标*/修改前半部分中最后元素的下标为middle-1*/修改后半部分中最前元素的下标为middle+1*/找到,返回该数所在单元下标*/没有找到,返回-1*/I请输入孚生的姓名和"言言爆程戍绩;fKateS9Jake7BJinUliite料Ba
23、ke%LJaHenS3Ulnce94HillS5Dull73恢统排序后的型昊:Eak«9。Uince的KatoS9HILI«5JacWhite79Dull7JLlakn7ALrin65ffllucli5fi请榆入一-M语言i异程成演值:«j程序运行结果如下:选做题5.(1)编写函数strnins(s,t,n)。它将字符数组个字符的后面。将编好的函数用在程序中,编写程序如下:#include<stdio.h>#defineN3/*voidstrnins(chars,chart,intn);/*voidmain(void)chars50=howyou?,t
24、10=are;/*strnins(s,t,N);printf(%sn,s);t中的字符串插入到字符数组宏定义插入到第三个字符后函数声明*/初始化两个字符数组*/s中字符串的第n*/voidstrnins(chars,chart,intn)inti=0,j=0,k;while(si+);/*测字符串s的长度*/while(tj+);/*测字符串t的长度*/i-,j-;for(;i>=n;i-)/*si+j=si;for(k=0;k<j;k+)先将字符串/*中的字符向右移字符数组t的长度位(不包括串尾)*/将t插入*/sn+k=tk;navio-:S3Pr4Qio辄n*hoy上。continuo程序运行结果:liowareyou?(2)八皇后问题,在8*8方格国际象棋盘上放置8个皇后,任意两个皇后不能位于同一行、同一列或同一斜线(正斜线或反斜线)上,输出所有可能
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 社区文明长效管理制度
- 云岩区财政管理制度
- 导诊台卫生管理制度
- 社区医院人员管理制度
- 管理公寓日常管理制度
- 电厂设备维修管理制度
- 丝印厂安全管理制度
- 石斛加工车间管理制度
- 小企业薪酬管理制度
- 社会团体用人管理制度
- 防治脑卒中专业知识讲座
- 平压平模切机安全操作规程、风险告知卡、应急处置
- JJG 646-2006移液器
- GB/T 40167-2021纸和纸板加速老化(100 ℃)
- GB/T 17626.4-2018电磁兼容试验和测量技术电快速瞬变脉冲群抗扰度试验
- GB/T 1094.12-2013电力变压器第12部分:干式电力变压器负载导则
- 活性炭改性及吸附条件研究性实验
- 小学体育教研活动记录(有内容)
- 核级阀门强度计算方法的分析
- 中国古代朝代历史知识大汉王朝科普图文PPT教学课件
- 氯氧铋光催化剂的晶体结构
评论
0/150
提交评论