湖北理工學院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語句的靈活運用非常高。而且要注意數組的輸入輸出問題,以及字符串數組及相關的函數的使用。