C语言程序设计第三次25实验报告.docx
- 文档编号:7364642
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:17
- 大小:149.38KB
C语言程序设计第三次25实验报告.docx
《C语言程序设计第三次25实验报告.docx》由会员分享,可在线阅读,更多相关《C语言程序设计第三次25实验报告.docx(17页珍藏版)》请在冰豆网上搜索。
C语言程序设计第三次25实验报告
C语言程序设计实验报告
专业班级日期11月26日成绩
实验组别第3(2.7)次实验指导教师李开
学生姓名学号同组人姓名
实验名称数组实验
一、实验目的
(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("%6d",a[i]);
printf("\n");
}
voidsort(intb[],intn)
{
inti,j,t;
for(i=0;i for(j=0;j if(b[j] 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;i a[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? a[j-1]: a[i-1];/*将报数为N的人的编号存入数组b*/ if(j) for(k=--j;k a[k]=a[k+1]; } for(i=0;i printf(“%6d”,b[i]); printf(“%6d\n”,a[0]);/*输出圈中最后一个人的编号*/ } (2)上面程序用数组元素的值表示圈中人的编号,每当有人出圈时都要压缩数组,这种算法不够精炼。 如果采用做标记的办法,即每当有人出圈时对相应数组元素做标记,省掉压缩数组的时间,这样处理效率更高一些。 请采用做标记的办法修改 (1)中程序,使修改后的程序与 (1)中程序具有相同的功能。 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;j s[i++]=t[j++]; s[i]='\0'; } 函数strncat(s,t,n)本来应该将字符数组t的前n个字符连接到字符数组s中字符串的尾部。 但函数strncat在定义时代码有误,不能实现上述功能。 按下面的要求进行操作,回答问题并排除错误。 (1)单步执行。 进入函数strncat后观察表达式s、t和i。 当光条落在for语句所在行时,i为何值? 当光条落在strncat函数块结束标记(右花括号})所在行时,s、t分别为何值? (2)分析函数出错的原因,排除错误,使函数正确实现功能,最后写出程序的输出结果。 4.程序设计 (1)编写程序从键盘读取数据,对一个34矩阵进行赋值,求其转置矩阵,然后输出原矩阵和转置矩阵。 (2)输入一个整数,将它在内存中二进制表示的每一位转换成为对应的数字字符,存放到一个字符数组中,然后输出该整数的二进制表示。 (3)输入n个学生的姓名和C语言课程的成绩,将成绩按从高到低的次序排序,姓名同时作相应调整,输出排序后学生的姓名和C语言课程的成绩。 然后,输入一个C语言课程成绩值,用二分查找进行搜索。 如果查找到有该成绩,输出该成绩同学的姓名和C语言课程的成绩;否则输出提示“notfound! ”。 5.选做题 (1)编写函数strnins(s,t,n)。 它将字符数组t中的字符串插入到字符数组s中字符串的第n个字符的后面。 (2)八皇后问题,在8*8方格国际象棋盘上放置8个皇后,任意两个皇后不能位于同一行、同一列或同一斜线(正斜线或反斜线)上,输出所有可能的放法。 三、实验步骤及结果 (要求给出源程序和程序运行结果。 另外,根据实验内容,记录编辑、编译、链接、调试程序的操作过程和实验现象) 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("%6d",a[i]); printf("\n"); } voidsort(intb[],intn) { inti,j,t; for(i=0;i for(j=0;j if(b[j] 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;i a[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;i printf(“%6d”,b[i]); printf(“%6d\n”,a[0]);/*输出圈中最后一个人的编号*/ } (2)上面程序用数组元素的值表示圈中人的编号,每当有人出圈时都要压缩数组,这种算法不够精炼。 如果采用做标记的办法,即每当有人出圈时对相应数组元素做标记,省掉压缩数组的时间,这样处理效率更高一些。 请采用做标记的办法修改 (1)中程序,使修改后的程序与 (1)中程序具有相同的功能。 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;j s[i++]=t[j++]; s[i]='\0'; } 函数strncat(s,t,n)本来应该将字符数组t的前n个字符连接到字符数组s中字符串的尾部。 但函数strncat在定义时代码有误,不能实现上述功能。 按下面的要求进行操作,回答问题并排除错误。 (1)单步执行。 进入函数strncat后观察表达式s、t和i。 当光条落在for语句所在行时,i为何值? 当光条落在strncat函数块结束标记(右花括号})所在行时,s、t分别为何值? (1)i=23 s,t值如下图所示 (2)分析函数出错的原因,排除错误,使函数正确实现功能,最后写出程序的输出结果。 #include voidstrncat(chars[],chart[],intn); intmain(void) { chara[50]="Theadoptedsymbolis",b[27]="abcdefghijklmnopqrstuvwxyz"; strncat(a,b,4); printf("%s\n",a); return0; } voidstrncat(chars[],chart[],intn) { inti=0,j; while(s[i++]); for(j=0;j { s[i-1]=t[j]; } } 4.程序设计 (1)编写程序从键盘读取数据,对一个34矩阵进行赋值,求其转置矩阵,然后输出原矩阵和转置矩阵。 #include intmain(void) { inta[3][4],b[4][3],i,t; for(i=0;i<3;i++) { for(t=0;t<4;t++) scanf("%d",&a[i][t]); } for(i=0;i<4;i++) { for(t=0;t<3;t++) { b[i][t]=a[t][i]; } } printf("inputa\n"); for(i=0;i<3;i++) { for(t=0;t<4;t++) printf("%6d",a[i][t]); printf("\n"); } printf("nowinputb\n"); for(i=0;i<4;i++) { for(t=0;t<3;t++) printf("%6d",b[i][t]); printf("\n"); } return0; } (2)输入一个整数,将它在内存中二进制表示的每一位转换成为对应的数字字符,存放到一个字符数组中,然后输出该整数的二进制表示。 #include intmain(void) { intn,i,t,s=0,a[50]; printf("inputanintnumberasyoulike! \n"); scanf("%d",&n); for(;n! =0;s++) { i=n%2; n=n/2; a[s]=i; } for(t=s-1;t>=0;t--) printf("%4d",a[t]); return0; } (3)输入n个学生的姓名和C语言课程的成绩,将成绩按从高到低的次序排序,姓名同时作相应调整,输出排序后学生的姓名和C语言课程的成绩。 然后,输入一个C语言课程成绩值,用二分查找进行搜索。 如果查找到有该成绩,输出该成绩同学的姓名和C语言课程的成绩;否则输出提示“notfound! ”。 #include #defineM3 intsearch(floatm,floatb[]); voidsort(char*a,floatb[],intn); intmain(void) { chara[M][30]; floatb[M]; inti; for(i=0;i { printf("inputname\n"); scanf("%s",a[i]); printf("inputthegrades\n"); scanf("%f",&b[i]); } sort(a[0],b,M); for(i=0;i { printf("Name: %s",a[i]); printf("%f\n",b[i]); } floatt; printf("SearchByGrades! \n"); scanf("%f",&t); if(search(t,b)==0) { printf("notfound! \n"); } else {printf("Thepersonis%s\n",a[search(t,b)]); printf("Andhisgradesare%f\n",b[search(t,b)]); } return0; } voidsort(chara[],floatb[],intn) { into,k; for(o=0;o { chars; for(k=0;k { if(b[k]>b[k+1]) { b[k]=b[k]+b[k+1],b[k+1]=b[k]-b[k+1],b[k]=a[k]-b[k+1]; s=a[k];a[k]=a[k+1];a[k+1]=s; } } } } intsearch(floatm,floatb[]) { intlow=0,high=M-1,mid; while(b[low]<=b[high]) { mid=(low+high)/2; if(m==b[mid]) returnmid; elseif(m high=mid-1; else low=mid+1;} return0; } 5.选做题 (1)编写函数strnins(s,t,n)。 它将字符数组t中的字符串插入到字符数组s中字符串的第n个字符的后面。 (main函数未写) char*strnins(chars[],chart[],intn) { inti=0,j=0,p,q,r,u; while(s[i]! ='\0')i++; while(t[j]! ='\0')j++; if(i printf("nistoobig"); else { for(p=i+j-1,q=i-1;p>n+j-1;p--,q--)s[p]=s[q]; for(r=n,u=0;r s[i+j]='\0'; } returns; } (2)八皇后问题,在8*8方格国际象棋盘上放置8个皇后,任意两个皇后不能位于同一行、同一列或同一斜线(正斜线或反斜线)上,输出所有可能的放法。 #include intchess[8][8]={0}; inta[8],b[15],c[15]; intsum=0;//统计所有摆法 voidPutQueen(intn) { intcol,i,j; for(col=0;col<8;col++) { if(a[col]&&b[n+col]&&c[n-col+7])//判断安全位置 { chess[n][col]=1;//放置皇后 a[col]=0; b[n+col]=0; c[n-col+7]=0; if(n==7) { sum++; printf("THE%dMETHODS: \n\n",sum);//输出皇后摆法 for(i=0;i<8;i++){ printf("\n"); for(j=0;j<8;j++) printf("%d",chess[i][j]); printf("\n"); } printf("\n\n"); //gotoEND;//输出第一种摆法 } else PutQueen(n+1);//递归 chess[n][col]=0;//取消皇后 b[n+col]=1; c[n-col+7]=1; a[col]=1; } } //END: return; } intmain() { inti; for(i=0;i<8;++i) a[i]=1; for(i=0;i<15;++i) { b[i]=1; c[i]=1; } PutQueen(0); printf("THESUMOFTHEEIGHT-QUEEN: %d\n",sum); return0; } 四、实验体会 好好敲代码,扎扎实实敲代码,脚踏实地,搞懂一切再前行。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 第三次 25 实验 报告