资源描述
实验四 数 组实验课程名:C语言程序设计专业班级: 14电气工程2班 学号: 201440210237 姓名: 熊帆 实验时间: 5.12-5.26 实验地点: K4-208 指导教师: 祁文青 一、实验目的和要求1. 掌握一维数组和二维数组的定义、赋值和输入输出的方法;2. 掌握字符数组和字符串函数的使用;3. 掌握与数组有关的算法(特别是排序算法)。二、实验内容1. 调试下列程序,使之具有如下功能:输入10个整数,按每行3个数输出这些整数,最后输出10个整数的平均值。写出调试过程。#include #define N 10void main( ) int i,aN,av;for(i=0;iN;i+) scanf(%d,ai);for(i=0;iN;i+) printf(%d,ai); if(i%3=0) printf(n);for(i=0;i!=N;i+)av+=ai;printf(av=%fn,av);解答:(1) 源代码: #include#define N 10void main()int i,aN;float av=0;for(i=0;iN;i+)scanf(%d,&ai); printf(n);for(i=0;iN;i+)printf(%3d,ai);if(i+1)%3=0)printf(n);for(i=0;i!=N;i+)av+=ai;printf(n);av=av/N;printf(n);printf(av=%fn,av);(2)运行结果: (3) 运行结果分析:原程序中有若干处错误,分别为av这个变量应该定义为float型,scanf语句中输入数组的时候,在它前面应该加上地址符&。第一个if语句if(i%3=0),应该改成if(i+1)%3=0),因为要实现一行三个地输出,实际i=0对应的才是数组中的第一个元素。再者,在程序的适当位置加上输出换行语句可使得程序1执行页面更美观。 调试的过程大体可分为三大块,第一块为从第7行到第9行,功能为输入10个值。第二 块为从第10到第15行,功能为一行三个地输出那10个值。第三块为最后一个for语句, 功能为将那10个值进行累加。 2. 下面程序是输入5个数据,然后求它们的和并输出结果。#include void main( )int i, a5, sum = 0; scanf(%d,%d,%d,%d,%d, a ); for (i = 0; i = 4; i +) sum += ai; printf(sum = %d n, sum);该程序中有哪些错误?如何修改?写出正确运行后的结果。解答:(1) 源代码:#includevoid main()int i,a5,sum=0;for(i=0;i=4;i+)scanf(%d,&ai);for(i=0;i=4;i+)sum+=ai;printf(sum=%dn,sum);(2) 运行结果: (3) 运行结果分析:原程序中的scanf语句是错的,应该采用for语句循环输入,还要把a换成ai,并在前面加上地址符&。验证程序的时候输入了这样五个值:54 24 33 12 8。然后运行程序,发现输出结果和预期一致。3. 有一个3行4列的距阵,现要求编程求出其中最大的那个元素的值,以及它所在的行号与列号。下面程序的初始说明和输出语句如下所示,请补充完成该程序。#include void main( )int i, j, row, colum, max;static int a34 = 1,2,3,4, 9,8,7,6, -10,10,-5,2; printf( Max = %d, Row = %d, Colum = %d n, max, row, colum);解答:(1) 源代码:#includevoid main()int i,j,row,colum,max;static int a34 = 1,2,3,4, 9,8,7,6, -10,10,-5,2; max=a00;for(i=0;i3;i+)for(j=0;j4;j+)if(maxaij)max=aij;row=i+1; colum=j+1;printf(Max=%d,Row=%d,Colum=%dn,max,row,colum);(2) 运行结果: (3) 运行结果分析:应该对原本不完整的程序作这样的补充,加上两个for循环语句,以实现找出数组中最大的元素。并用row和column分别储存行标和列标,但要注意+1。4. 数组中已存互不相同的10个整数,从键盘输入一个整数,输出与该值相同的数组元素下标。解答:(1) 源代码: #includevoid main() int i,x,a10=1,2,3,4,5,6,7,8,9,10; scanf(%d,&x); for(i=0;i10;i+) printf(%4d,ai); printf(n); for(i=0;i10;i+) if(x=ai) break; if(i10) printf(该元素的下标为%dn,i); else printf(该数组中没有 %dn,x);(2) 运行结果: (3) 运行结果分析:数组中已存互不相同的10个整数:1,2,3,4,5,6,7,8,9,10。验证程序的时候分别输入了7和19,并且正确地输出了下标或输出结果。如上面两张图所示。5. 编写程序,任意输入10个整数的数列,先将整数按照从大到小的顺序进行排序,然后输入一个整数插入到数列中,使数列保持从大到小的顺序。解答:(1) 源代码:#includevoid main()int a11,i,j,x,temp;printf(请输入10个整数:n);for(i=0;i10;i+)scanf(%d,&ai);for(j=0;j9;j+)for(i=0;i9-j;i+)if(aiai+1)/排序,交换temp=ai+1;ai+1=ai;ai=temp;for(i=0;i10;i+)printf(%d ,ai);printf(n);printf(请再输入一个整数:);scanf(%d,&x);for(i=0,j=0;i=x&x=ai+1)j=i;break;elsecontinue;for(i=0;ij+1;i+)printf(%d ,ai);/输出插入点前的数字temp=aj+1; aj+1=x;printf(%d ,aj+1);/输出插入点的数字aj+1=temp;for(i=0;i9-j;i+)/移位交换a10-i=a9-i;for(i=0;i9-j;i+)printf(%d ,ai+j+2);/输出插入点后的数字printf(n);(2)运行结果: (3)运行结果分析:运行程序时输入了这样10个整数:6 11 9 15 68 23 2 32 50 28。经过程序中排序部分的作用,将10个整数按从大到小的顺序排序为:68 50 32 28 23 15 11 9 6 2。和预期是一致的,再输入一个数,以26为例,26位于28和23之间,于是按照程序变插入到28和23之间,最后输出68 50 32 28 26 23 15 11 9 6 26. 输入十个互不相同的整数并存在数组中,找出最大元素,并删除。解答:(1) 源代码:#includevoid main()int a10,i,m,t,n;printf(输入十个互不相同的整数:n);for(i=0;i10;i+)scanf(%d,&ai);n=a0;printf(删除其中最大的数之后:n);for(i=1;i10;i+)if(nai)n=ai;m=i;t=m;for(i=m;i9;i+)ai=ai+1;a9=t;for(i=0;i9;i+)printf(%d ,ai);printf(n);(2)运行结果: (3) 运行结果分析:在运行程序的时候,输入了如图所示的十个不同的整数,经过程序的执行,删除其中最大的数97,再将剩下的9个数输出来。7. 以下程序的功能是:从键盘上输入若干个学生的成绩,统计计算出平均成绩,并输出低于平均分的学生成绩,用输入负数结束输入。请填空:#include void main( ) float x1000, sum=0.0, ave, a; int n=0, i; printf (Enter mark : n) ; scanf(%f, &a); while (a=0.0 & n1000) sum+= ; xn= ; n+; scanf(%f, &a); ave= ; printf (Output : n); printf (ave = %fn, ave); for (i=0; in; i+) if ( ) printf(%fn, xi);解答:(1) 源代码:#includevoid main()float x1000,sum=0.0,ave,a;int n=0,i;printf(Enter mark : n) ;scanf(%f,&a); while(a=0.0&n1000) sum+=a; xn=a;n+; scanf(%f, &a); ave=sum/n;printf (Output : n);printf (ave = %fn, ave); for(i=0;in;i+) if (xiave) printf(%fn,xi);(2)运行结果: (3) 运行结果分析:运行程序的时候输入了如上图所示的10个分数,根据while语句中的内容,故可以把-1作为输入结束的标志。接下来再作相应的运算,结果均与事实相符。8. 综合编程题:打印如下杨辉三角形1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 解答:(1) 源代码:#includevoid main()int a66,i,j;for(i=0;i6;i+)for(j=0;j=i;j+)if(i0&ij)aij=ai-1j-1+ai-1j;printf(下面的是杨辉三角形n);for(i=0;i6;i+)for(j=0;j=i;j+)printf(%4d,aij);printf(n); (2)运行结果: (3) 运行结果分析:运用二维数组的定义和for循环来实现输出杨辉三角形。9. 调试下列程序,使之具有如下功能:任意输入两个字符串(如:“abc 123”和“china”),并存放在a,b两个数组中。然后把较短的字符串放在a数组,较长的字符串放在b数组。并输出。#include #include void main() char a10,b10; int c,d,k,ch; scanf(%s,&a); scanf(%s,&b); printf(a=%s,b=%sn,a,b); c=strlen(a); d=strlen(b); if(cd) for(k=0;kd;k+) ch=ak;ak=bk;bk=ch; printf(a=%sn,a); printf(b=%sn,b); 解答:(1) 源代码: #include #include void main() char a10,b10; int c,d,k,ch; scanf(%s,&a); scanf(%s,&b); printf(a=%s,b=%sn,a,b); c=strlen(a); d=strlen(b); if(cd) for(k=0;kc;k+) ch=ak; ak=bk; bk=ch; bk=0; printf(a=%sn,a); printf(b=%sn,b);(2)运行结果: (3) 运行结果分析:原程序中,应该把for语句中的kd改为kc,再就是在输出最终结果之前可令bk=0,以避免输出结果中出现乱码的情况。运行程序的时候,输入a为一个较长的字符串,b较短,然后二者会进行交换,输出结果如上图所示。10. 阅读下面的程序,然后回答后面的问题:#include #include void main( ) char s180, s240; int i = 0, j = 0; printf( n Please input string1:); scanf(%s, s1); printf( n Please input string2:); scanf(%s, s2); while (s1i!= 0 )i+; while (s2j!= 0 )s1i+=s2j +; s1i= 0; printf(n New string: %s, s1);编辑、运行该程序,然后分别输入Country 和side。请问:程序执行的结果是什么?输出:Countryside该程序的功能是什么?将第二个字符串连接到第一个字符串的后面从而组成一个新的字符串解答:(1) 源代码:#include #include void main( ) char s180, s240; int i = 0, j = 0; printf( n Please input string1:); scanf(%s, s1); printf( n Please input string2:); scanf(%s, s2); while (s1i!= 0 )i+; while (s2j!= 0 )s1i+=s2j +; s1i= 0; printf(n New string: %s, s1); printf(n);(2)运行结果: (3) 运行结果分析:运行程序的时候先输入Country,再输side,经过程序的运行,实现了将side连接到Country的后面形成新的单词Countryside,即实现了将第二个字符串连接到第一个字符串的后面从而组成一个新的字符串的功能。11. 填空完成下面程序,使其功能是对从键盘上输入的两个字符串进行比较,然后输出两个字符串中第一个不相同字符的ASCII码之差。例如:输入的两个字符串分别为abcdefg和abceef,则输出为-1。程序如下: #include void main ( ) char str1100,str2100; int i,s; printf(n Input string 1:n);gets(str1); printf(“n Input string 2:n”);gets(str2); i= (1) ; while(str1i=str2i)&(str1i!= (2) ) i+; s= (3) ; printf(%dn,s); 解答:(1) 源代码:#include void main() char str1100,str2100; int i,s; printf(n Input string 1:n);gets(str1); printf(n Input string 2:n);gets(str2); i=0; while(str1i=str2i)&(str1i!=0) i+; s=str1i-str2i; printf(%dn,s);(2)运行结果: (3) 运行结果分析:运行程序时先输入hey boys,再输入hey girls,两个字符串中第一个不相同字符分别为b和g,ASCII码值相差-5,与事实相符。12. 填空完成下面程序,使其的功能是统计从终端输入字符中每个大写字母的个数。用#号作为输入结束标志。程序如下: #include #include void main ( ) int num26,i; char c; for (i=0;i26;i+) numi=0; while ( (1) != #) /* 统计从终端输入的大写字母个数*/ if (isupper(c) numc-65 (2) ; for (i=0;i26;i+) /* 输出大写字母和该字母的个数*/ if (numi)printf(%c:%dn,i (3) ,numi); 解答:(1) 源代码:#include#includevoid main() int num26,i; char c; for(i=0;i26;i+) numi=0; while(c=getchar()!=#) if(isupper(c) numc-65+=1; for(i=0;i26;i+) if(numi)printf(%c:%dn,i+65,numi);(2)运行结果: (3) 运行结果分析:运行程序的时候输入的字符串为CYUYANCNA,经过程序的运行,统计出的个字母的数量与事实是相符的。13. 编写程序,输入若干个字符串,求出每个字符串的长度,并打印最长一个字符串的内容。以“stop”作为输入的最后一个字符串。解答:(1) 源代码: #include #include void main()char a2020;int i=0,t=0,b,c;printf(请输入字符串吧!n);while(1)scanf(%s,ai);b=strlen(ai);printf(%3d,b);if(tb)t=b;c=i; if(ai0=s)& (ai1=t)& (ai2=o)& (ai3=p)& (ai4=0)break;i+;printf(n);printf(最长的是%sn,ac); (2)运行结果: (3) 运行结果分析:我输入了一个英语句子,程序统计出来了各个单词的字母数,并且指出了最长的单词tomorrow,与事实是一致的。14.编写程序,输入字符串s1和s2以及插入位置f,在字符串s1中的指定位置f处插入字符串s2。如:输入BEIJING、123和位置3,则输出:BEI123JING123。解答:(1) 源代码:#include#includevoid main()char s120,s220,t120,t220;int i,j,n,f;printf(请输入:n);scanf(%s%s%d,s1,s2,&f);n=strlen(s1);for(i=0;if;i+)t1i=s1i;t1i=0;strcat(t1,s2);for(j=0;j=n-f;j+)t2j=s1i;i+;t2j=0;strcat(t1,t2);strcat(t1,s2);printf(%sn,t1);(2)运行结果: 三、结论(写本次实验的收获)本次实验主要涉及数组与for循环语句的使用,从中可以体会到对for语句的灵活运用非常高。而且要注意数组的输入输出问题,以及字符串数组及相关的函数的使用。
展开阅读全文