湖北理工学院14本科C语言实验报告实验四 数组.doc
实验四 数 组实验课程名C语言程序设计专业班级 14电气工程2班 学号 201440210237 姓名 熊帆 实验时间 5.12-5.26 实验地点 K4-208 指导教师 祁文青 一、实验目的和要求1. 掌握一维数组和二维数组的定义、赋值和输入输出的方法;2. 掌握字符数组和字符串函数的使用;3. 掌握与数组有关的算法(特别是排序算法)。二、实验内容1. 调试下列程序,使之具有如下功能输入10个整数,按每行3个数输出这些整数,最后输出10个整数的平均值。写出调试过程。include stdio.hdefine N 10void main int i,aN,av;fori0;iN;i scanfd,ai;fori0;iN;i printfd,ai; ifi30 printfn;fori0;iN;iavai;printfavfn,av;解答(1) 源代码 includestdio.hdefine N 10void mainint i,aN;float av0;fori0;iN;iscanfd, printfn;fori0;iN;iprintf3d,ai;ifi130printfn;fori0;iN;iavai;printfn;avav/N;printfn;printfavfn,av;(2)运行结果 (3) 运行结果分析原程序中有若干处错误,分别为av这个变量应该定义为float型,scanf语句中输入数组的时候,在它前面应该加上地址符 scanfd,d,d,d,d, a ; for i 0; i 4; i sum ai; printfsum d n, sum;该程序中有哪些错误如何修改写出正确运行后的结果。解答(1) 源代码includestdio.hvoid mainint i,a5,sum0;fori0;i4;iscanfd,fori0;i4;isumai;printfsumdn,sum;(2) 运行结果 (3) 运行结果分析原程序中的scanf语句是错的,应该采用for语句循环输入,还要把a换成ai,并在前面加上地址符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) 源代码includestdio.hvoid mainint i,j,row,colum,max;static int a34 1,2,3,4, 9,8,7,6, -10,10,-5,2; maxa00;fori0;i3;iforj0;j4;jifmaxaijmaxaij;rowi1; columj1;printfMaxd,Rowd,Columdn,max,row,colum;(2) 运行结果 (3) 运行结果分析应该对原本不完整的程序作这样的补充,加上两个for循环语句,以实现找出数组中最大的元素。并用row和column分别储存行标和列标,但要注意1。4. 数组中已存互不相同的10个整数,从键盘输入一个整数,输出与该值相同的数组元素下标。解答(1) 源代码 includestdio.hvoid main int i,x,a101,2,3,4,5,6,7,8,9,10; scanfd, fori0;i10;i printf4d,ai; printfn; fori0;i10;i ifxai break; ifi10 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) 源代码includestdio.hvoid mainint a11,i,j,x,temp;printf请输入10个整数n;fori0;i10;iscanfd,forj0;j9;jfori0;i9-j;iifaiai1排序,交换tempai1;ai1ai;aitemp;fori0;i10;iprintfd ,ai;printfn;printf请再输入一个整数;scanfd,fori0,j0;i10;iifaixxai1ji;break;elsecontinue;fori0;ij1;iprintfd ,ai;输出插入点前的数字tempaj1; aj1x;printfd ,aj1;输出插入点的数字aj1temp;fori0;i9-j;i移位交换a10-ia9-i;fori0;i9-j;iprintfd ,aij2;输出插入点后的数字printfn;(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) 源代码includestdio.hvoid mainint a10,i,m,t,n;printf输入十个互不相同的整数n;fori0;i10;iscanfd,na0;printf删除其中最大的数之后n;fori1;i10;iifnainai;mi;tm;forim;i9;iaiai1;a9t;fori0;i9;iprintfd ,ai;printfn;(2)运行结果 (3) 运行结果分析在运行程序的时候,输入了如图所示的十个不同的整数,经过程序的执行,删除其中最大的数97,再将剩下的9个数输出来。7. 以下程序的功能是从键盘上输入若干个学生的成绩,统计计算出平均成绩,并输出低于平均分的学生成绩,用输入负数结束输入。请填空include stdio.hvoid main float x1000, sum0.0, ave, a; int n0, i; printf Enter mark n ; scanff, while a0.0 n1000 sum ; xn ; n; scanff, ave ; printf Output n; printf ave fn, ave; for i0; in; i if printffn, xi;解答(1) 源代码includestdio.hvoid mainfloat x1000,sum0.0,ave,a;int n0,i;printfEnter mark n ;scanff, whilea0.0n1000 suma; xna;n; scanff, avesum/n;printf Output n;printf ave fn, ave; fori0;in;i if xiave printffn,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) 源代码includestdio.hvoid mainint a66,i,j;fori0;i6;iforj0;ji;jifi1aij1;elseifjij0aij1;ifj0ijaijai-1j-1ai-1j;printf下面的是杨辉三角形n;fori0;i6;iforj0;ji;jprintf4d,aij;printfn; (2)运行结果 (3) 运行结果分析运用二维数组的定义和for循环来实现输出杨辉三角形。9. 调试下列程序,使之具有如下功能任意输入两个字符串如“abc 123”和“china”,并存放在a,b两个数组中。然后把较短的字符串放在a数组,较长的字符串放在b数组。并输出。include stdio.hinclude string.h void main char a10,b10; int c,d,k,ch; scanfs, scanfs, printfas,bsn,a,b; cstrlena; dstrlenb; ifcd fork0;kd;k chak;akbk;bkch; printfasn,a; printfbsn,b; 解答(1) 源代码 include stdio.hinclude string.h void main char a10,b10; int c,d,k,ch; scanfs, scanfs, printfas,bsn,a,b; cstrlena; dstrlenb; ifcd fork0;kc;k chak; akbk; bkch; bk0; printfasn,a; printfbsn,b;(2)运行结果 (3) 运行结果分析原程序中,应该把for语句中的kd改为kc,再就是在输出最终结果之前可令bk0,以避免输出结果中出现乱码的情况。运行程序的时候,输入a为一个较长的字符串,b较短,然后二者会进行交换,输出结果如上图所示。10. 阅读下面的程序,然后回答后面的问题include stdio.hinclude string.h void main char s180, s240; int i 0, j 0; printf n Please string1; scanfs, s1; printf n Please string2; scanfs, s2; while s1i 0 i; while s2j 0 s1is2j ; s1i 0; printfn New string s, s1;编辑、运行该程序,然后分别输入Country 和side。请问程序执行的结果是什么输出Countryside该程序的功能是什么将第二个字符串连接到第一个字符串的后面从而组成一个新的字符串解答(1) 源代码include stdio.hinclude string.h void main char s180, s240; int i 0, j 0; printf n Please string1; scanfs, s1; printf n Please string2; scanfs, s2; while s1i 0 i; while s2j 0 s1is2j ; s1i 0; printfn New string s, s1; printfn;(2)运行结果 (3) 运行结果分析运行程序的时候先输入Country,再输side,经过程序的运行,实现了将side连接到Country的后面形成新的单词Countryside,即实现了将第二个字符串连接到第一个字符串的后面从而组成一个新的字符串的功能。11. 填空完成下面程序,使其功能是对从键盘上输入的两个字符串进行比较,然后输出两个字符串中第一个不相同字符的ASCII码之差。例如输入的两个字符串分别为abcdefg和abceef,则输出为-1。程序如下 include stdio.h void main char str1100,str2100; int i,s; printfn string 1n;getsstr1; printf“n string 2n”;getsstr2; i 1 ; whilestr1istr2istr1i 2 i; s 3 ; printfdn,s; 解答(1) 源代码includestdio.h void main char str1100,str2100; int i,s; printfn string 1n;getsstr1; printfn string 2n;getsstr2; i0; whilestr1istr2istr1i0 i; sstr1i-str2i; printfdn,s;(2)运行结果 (3) 运行结果分析运行程序时先输入hey boys,再输入hey girls,两个字符串中第一个不相同字符分别为b和g,ASCII码值相差-5,与事实相符。12. 填空完成下面程序,使其的功能是统计从终端输入字符中每个大写字母的个数。用号作为输入结束标志。程序如下 include stdio.h include ctype.h void main int num26,i; char c; for i0;i26;i numi0; while (1) /* 统计从终端输入的大写字母个数*/ if isupperc numc-65 (2) ; for i0;i26;i /* 输出大写字母和该字母的个数*/ if numiprintfcdn,i (3) ,numi; 解答(1) 源代码includestdio.hincludectype.hvoid main int num26,i; char c; fori0;i26;i numi0; whilecgetchar ifisupperc numc-651; fori0;i26;i ifnumiprintfcdn,i65,numi;(2)运行结果 (3) 运行结果分析运行程序的时候输入的字符串为CYUYANCNA,经过程序的运行,统计出的个字母的数量与事实是相符的。13. 编写程序,输入若干个字符串,求出每个字符串的长度,并打印最长一个字符串的内容。以“stop”作为输入的最后一个字符串。解答(1) 源代码 includestdio.h includestring.h void mainchar a2020;int i0,t0,b,c;printf请输入字符串吧n;while1scanfs,ai;bstrlenai;printf3d,b;iftbtb;ci; ifai0s ai1t ai2o ai3p ai40break;i;printfn;printf最长的是sn,ac; (2)运行结果 (3) 运行结果分析我输入了一个英语句子,程序统计出来了各个单词的字母数,并且指出了最长的单词tomorrow,与事实是一致的。14.编写程序,输入字符串s1和s2以及插入位置f,在字符串s1中的指定位置f处插入字符串s2。如输入BEIJING、123和位置3,则输出BEI123JING123。解答(1) 源代码includestdio.hincludestring.hvoid mainchar s120,s220,t120,t220;int i,j,n,f;printf请输入n;scanfssd,s1,s2,nstrlens1;fori0;if;it1is1i;t1i0;strcatt1,s2;forj0;jn-f;jt2js1i;i;t2j0;strcatt1,t2;strcatt1,s2;printfsn,t1;(2)运行结果 三、结论(写本次实验的收获)本次实验主要涉及数组与for循环语句的使用,从中可以体会到对for语句的灵活运用非常高。而且要注意数组的输入输出问题,以及字符串数组及相关的函数的使用。