《C语言程序设计》实验报告实验项目一:数组2)将上述程序的第四行改成scanf(“%s”,&str);,重新运行上述程序,观察输出结果有什么不同,为什么?重新运行的结果:分析:前者能输入字符串,而后者只能输入字符,相当于只输入了how3)如果用%c格式输入输出字符串,程序应怎样修改?根据用%c格式输入输出字符的特点,修改后的程序为:#include<stdio.h>int main(){int i;char str[11]={'h','o','w','','a','r','e','','y','o','u'};for(i=0;i<=10;i++)printf("%c",str[i]);printf("\n");return0;}3.改错有一个3×4的矩阵,要求输出其中值最大的元素的值,以及它的行号和列号。
#include<stdio.h>#define M3#define N4int main(){int max,i,j,r,c;r=0;c=0;int a[M][N]={{323,94,-10,218},{3,9,10,-83},{45,16,44,-99}};max=a[0][0];for(i=0;i<M;i++)for(j=0;j<N;j++)if(a[i][j]>max){max=a[i][j];r=i;c=j;}printf("max=%d,行=%d,列=%d\n",max,r,c);return0;}4.改错下面是用来将数组a中元素按升序排序后输出的源程序。
分析源程序中存在的问题,并对源程序进行修改,使之能争取完成任务。
#include<stdio.h>int main(){int a[10]={27,13,5,32,23,3,17,43,55,39};int i;int sort(int[],int);sort(a,10);for(i=0;i<10;i++)printf("%6d",a[i]);printf("\n");return0;}int sort(int b[],int n){int i,j,t;for(i=0;i<n-1;i++)for(j=0;j<n-1;j++)if(b[j]<b[j+1]){t=b[j];b[j]=b[j+1];b[j+1]=t;}return0;}5.编一个程序,输入10个整数,统计并输出其中正数、负数和零的个数。
)#include<stdio.h>int main(){int a[10],i,zheng,fu,ling;zheng=0;fu=0;ling=0;for(i=0;i<=9;i++)scanf("%d",&a[i]);for(i=0;i<=9;i++){if(a[i]>0)zheng=zheng+1;if(a[i]<0)fu=fu+1;if(a[i]==0)ling=ling+1;}printf("正数的个数是%d\n",zheng);printf("负数的个数是%d\n",fu);printf("零的个数是%d\n",ling);return0;6.应用数组求Fabonacci数列的前40项(该数列前两项为1,以后各项均为前相邻两项之和)要求以每行8个输出。
#include<stdio.h>int main(){int f[40]={1,1},i;for(i=1;i<=38;i++)f[i+1]=f[i]+f[i-1];for(i=0;i<=39;i++){if((i+1)%8==0)printf("\n");printf("%9ld",f[i]);}return0;}7.用冒泡法对20个整数排序。
20个整数需要键盘键入。
#include<stdio.h>int main(){int a[20],i,j,t;for(i=0;i<=19;i++)scanf("%d",&a[i]);for(i=18;i>=0;i--)for(j=0;j<=i;j++)if(a[j]<a[j+1]){t=a[j];a[j]=a[j+1];a[j+1]=t;};for(j=0;j<=19;j++)printf("%3d",a[j]);printf("\n");return0;}8.用选择法对20个整数排序。
20个整数需要键盘键入。
#include<stdio.h>int main(){int a[20],i,j,t;for(i=0;i<=19;i++)scanf("%d",&a[i]);for(i=0;i<=18;i++)for(j=i+1;j<=19;j++)if(a[i]<a[j]){t=a[i];a[i]=a[j];a[j]=t;}for(i=0;i<=19;i++)printf("%3d",a[i]);printf("\n");return0;}9.编程实现:对任意一个一维数组,从中找出数组元素的最大值和最小值。
要求:(1)数组为整型数组(10个元素)。
(2)使用scanf函数实现数组元素的输入。
在输入前给出必要的提示。
(3)输出时给出必要的说明,首先输出原始的10个元素,换行后输出最大值以及最大值在数组中的位置、最小值以及最小值在数组中的位置。
(4)如果现改为20个元素的数组,怎样修改程序?修改程序后,运行程序进行检查。
如果需要数组元素不断改变,应怎样修改程序?答:将数组a【10】扩大范围就可以,比如要输入20个数,就把数组定义成a【20】#include<stdio.h>int main(){int a[10],i,max,min,t1,t2;t1=1,t2=1;1printf("请输入元素:");for(i=0;i<10;i++)scanf("%d",&a[i]);printf("输入的元素为:");max=a[0],min=a[0];for(i=0;i<10;i++)printf("%5d",a[i]);printf("\n");for(i=1;i<=9;i++){if(a[i]>max){max=a[i];t1=i+1;}if(a[i]<min){min=a[i];t2=i+1;}}printf("最小的数为%d,为第%d个数\n",min,t2);printf("最大的数为%d,为第%d个数\n",max,t1);return0;}10.编写一个程序,从键盘读入数据,对一个3*4矩阵进行赋值,求其转置矩阵,然后输出原矩阵和转置矩阵。
#include<stdio.h>int main(){int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};int b[4][3],i,j;for(i=0;i<=2;i++){for(j=0;j<=3;j++){printf("%5d",a[i][j]);b[j][i]=a[i][j];}printf("\n");}printf("\n");for(i=0;i<=3;i++){for(j=0;j<=2;j++)printf("%5d",b[i][j]);printf("\n");}return0;}11.编程实现“折半查找”的过程。
折半查找的处理过程是:在一个数据已排好序的数组中,首先比较关键字与数组中间的元素,如果两者相等,则查找结束;如果前者比后者小,则要查找的数据必然在数组的前半部,此后只需在数组的前半部中继续折半查找;如果前者的数值比后者大,则要查找的数据必然在数组的后半部,此后只需在数组的后半部继续进行折半查找。
要求:(1)设定一个数组存放20个数据,用赋初值的方法在程序中给出(假设这些数据已排序)。
(2)用scanf函数输入一个要找的数。
(3)对查找的结果给出相应的说明,如果找到该数,则给出该数是数组中第几个元素。
如果该数不在数组中,则输出“无此数”信息。
(4)任意输入一些数据,检查程序的正确性。
(5)修改程序,设定输入的数据是无序的,采用scanf函数的形式输入,首先要对这些无序的数据进行排序,然后再采用“折半查找”。
最后通过测试几组差别较大的数据检查程序的正确性。
(6)修改程序,改为函数调用的形式。
编写一个选择法排序函数,对无序数据进行排序;编写一个查找函数对已排好序的数据进行查找。
在主函数中输入数据(无序),调用上述函数,输出结果。
#include<stdio.h>int main(){int a[20]={1,2,5,6,12,13,15,16,18,19,20,24,25,26,28,29,31,34,54,56};int x,low,found,high,mid;low=0,high=19,found=0;scanf("%d",&x);while(low<high&&!found){mid=(low+high)/2;if(x>a[mid])low=mid+1;else if(x<a[mid])high=mid-1;else found=1;}if(found)printf("这个数是第%d个数\n",mid+1);elseprintf("未找到\n");return0;}、#include<stdio.h>int main(){int a[20],x,t,i;for(i=0;i<=19;i++)scanf("%d",&a[i]);int paixu(int[],int);paixu(a,20);printf("排好序列的数为:");for(i=0;i<=19;i++)printf("%4d",a[i]);printf("\n");scanf("%d",&x);int low,found,high,mid;low=0,high=19,found=0;while(low<high&&!found){mid=(low+high)/2;if(x>a[mid])low=mid+1;else if(x<a[mid])high=mid-1;else{found=1;t=mid+1;}}if(found)printf("这个数是第%d个数\n",t);elseprintf("未找到\n");return0;}int paixu(int b[],int n){int i,j,k;for(i=0;i<=n-2;i++)for(j=i+1;j<=n-1;j++)if(b[i]>b[j]){k=b[i];b[i]=b[j];b[j]=k;}return0;}四、分析与讨论对上机实践结果进行分析,上机的心得体会。