C語言程序設計實驗報告六
姓 名:陳慶楚
實驗地點:家
實驗時間:2020年5月19日
實驗項目:7.3.1練習1 冒泡排序法的運用
7.3.1練習2 選擇排序法的運用
7.3.2練習1 輸出指定行數的楊輝三角
7.3.2練習1 輸出指定行數的楊輝三角(等腰)
7.3.2練習2 輸入年月日計算第幾天
7.3.3 判斷輸入的數是不是回文數
一、實驗目的與要求
7.3.1練習1 寫一個函數,對用隨機函數產生的10個整數按從小到大的順序排序(升序,冒泡排序實現)
1.定義一個一維整型數組,其大小為10,即它能存放10個數據;
2.使用循環語句,利用隨機函數產生10個整數存放在數組中;
3.編寫排序函數sort1();
4.使用循環語句,將排好序的10個數依次輸出;
5.將數組定義為全局數組或局部數組;
6.在主函數中,用隨機函數生成10個元素放入數組中;
7.將sort1()函數部分放入主函數中。
7.3.1.練習2 寫一個函數,對用隨機函數產生的10個整數按從小到大的順序排序(升序,用選擇排序實現)
1.定義一個一維整型數組,其大小為10,即它能存放10個數據;
2. 使用循環語句,利用隨機函數產生10個整數存放在數組中;
3.編寫排序函數sort1();
4.使用循環語句,將排好序的10個數依次輸出;
5.將數組定義為全局數組或局部數組;
6.在主函數中,用隨機函數生成10個元素放入數組中;
7.將sort1()函數部分放入主函數中。
7.3.2練習1 輸出指定行數的楊輝三角形
1.怎樣定義和使用二維數組;
2.怎樣用循環進行二維數組中值的計算;
3.使用循環依次輸出二維數組中的元素(注意換行);
4.用if語句根據條件判斷某個字符是否是大寫字母。
7.3.2練習2 給定某年某月某日,將其轉換成這一年的第幾天並輸出
- 使用scanf()函數輸入年、月、日;
2.使用一個二維數組存放閏年和非閏年的每個月的天數;
3.使用邏輯表達式判斷某年是否是閏年;
4.使用變量day對前幾個月的天數進行累加;
5.在強化練習中,學生將練習不使用二維數組存放每個月的天數;
6.使用if語句對年、月、日的正確性進行驗證;
7.將存放每個月的天數的二維數組說明為局部數組。
7.3.3 編寫程序,判斷某一字符是不是“回文數”,回文數是從左至右或從從右至左讀起來都是一樣的字符
1.用scanf()函數,從鍵盤輸入一個字符串存入字符數組中
2.求出該字符串的長度
3.用for循環依次比較,循環的終值為長度的一半
4.設置一個標志符ch,初值為‘Y’,若某字符對不相等,將其設置為‘N’
5.根據ch是‘Y’還是‘N’,輸出該字符串是否是回文數
6.強化練習中不使用strlen()求出字符串的長度
7.將求回文數的部分獨立出來,編成一個函數
二、實驗內容
(1)7.3.1 練習1 冒泡排序法的運用
1、問題的簡單描述:編寫程序,利用隨機函數產生10個隨機數,按升序排列輸出。(冒泡排序)
2、實驗代碼:
#include<stdio.h> #include<stdlib.h> #include<time.h> void sort1(int s[],int n) { int i,j; int temp; for (i=0;i<=n-1;i++) { for (j=9;j>=i+1;j--) { if (s[j]<s[j-1]) { temp=s[j]; s[j]=s[j-1]; s[j-1]=temp; } } } } main() { int i,a[10]; srand(time(NULL)); printf("隨機產生10個整數:\n"); for (i=0;i<10;i++) a[i]=rand()%100; for (i=0;i<10;i++) { printf("%d ",a[i]); } printf("\n"); sort1(a,10); printf("排序后的結果;\n"); for (i=0;i<10;i++) { printf("%d ",a[i]); } }
3、問題:①不太理解冒泡排序法怎么運用 ②隨機數的取法忘記了
4、分析:①兩兩比較②%100以確保取的數在100以內
5、最終運行效果:
(2)7.3.1 練習2 選擇排序法的運用
1、問題的簡單描述:寫一個函數,對用隨機函數產生的10個整數按從小到大的順序排序(升序,用選擇排序實現)
2、實驗代碼:
#include<stdio.h> #include<stdlib.h> #include<time.h> sort2(int s[],int n) { int i,j,k,temp; for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<=n-1;j++) { if (s[j]<s[k]) k=j; } if(k!=i) { temp=s[k]; s[k]=s[i]; s[i]=temp; } } } main() { int i,a[10]; srand(time(NULL)); printf("隨機產生10個整數:\n"); for(i=0;i<10;i++) a[i]=rand()%100; for(i=0;i<10;i++) printf("%d ",a[i]); printf("\n"); sort2(a,10); printf("排序后的結果:\n"); for(i=0;i<10;i++) printf("%d ",a[i]); }
3、問題:對選擇排序法不清楚
4、分析:選擇排序法就是 第一次從下標為0的開始下標為0的這個數與后面的n-1個進行比較,找出最小或者最大的放在下標為0的這個位置,第二次從下標為1的開始比較,查詢剩下的最大或者最小值,放在 下標為1的位置,以此類推,直到結束。
5、最終運行效果:
(3)7.3.2 練習1 輸出指定行數的楊輝三角
1、問題的簡單描述:輸出指定行數的楊輝三角形輸出指定行數的楊輝三角形
2、實驗代碼:
#include<stdio.h> int main() { int a[50][50],i,j,n; printf("請輸入楊輝三角行數:\n"); scanf("%d",&n); for(i=1;i<=n;i++) { a[i][i]=1; a[i][1]=1; } for(i=3;i<=n;i++) { for(j=2;j<=i-1;j++) { a[i][j]=a[i-1][j-1]+a[i-1][j]; } } for(i=1;i<=n;i++) { for(j=1;j<=i;j++) { printf("%-4d",a[i][j]); } printf("\n"); } }
3、問題:如何左對齊
4、分析:%-d
5、最終運行效果:
(4)7.3.2 練習1 輸入指定行數的楊輝三角
1、問題的簡單描述:輸出指定行數的楊輝三角形(等腰三角形)
2、實驗代碼:
#include<stdio.h> main() { int a[50][50],i,j,n; printf("請輸入楊輝三角形的行數:") ; scanf("%d",&n); for(i=1;i<=n;i++) { a[i][i]=1; a[i][1]=1; } for(i=3;i<=n;i++) { for(j=2;j<=i-1;j++) a[i][j]=a[i-1][j-1]+a[i-1][j]; } for(i=1;i<=n;i++) { for(j=1;j<=n-i;j++) printf(" "); for(j=1;j<=i;j++) printf("%-6d",a[i][j]); printf("\n"); } }
3、問題:不太好進行數字對齊
4、分析:控制好數據之間的間隔。
5、最終運行效果:
(5)7.3.2 練習2 輸入年月日計算第幾天
1、問題的簡單描述:編寫程序,從鍵盤分別輸入年,月,日。計算出該天是這年中的第幾天。
2、實驗代碼:
#include<stdio.h> int day_tab[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31}, {0,31,29,31,30,31,30,31,31,30,31,30,31}}; int day_year(int year,int mouth,int day) { int i,j,s=0; if(year%4==0&&year%100!=0||year%400==0) i=1; else i=0; for (j=1;j<mouth;j++) s=s+day_tab[i][j]; return(s+day); } main() { int y,m,d,S; printf("Please input year,mouth and day:\n"); scanf("%d%d%d",&y,&m,&d); printf("是這年的第%d天\n",day_year(y,m,d)); }
3、問題分析:return(s+day)這一步之前放在for語句的{},導致計算結果出錯,糾結了好久。
4、最終運行效果:
(6)7.3.3 判斷函數是不是回文數
1、問題的簡單描述:編寫程序,從鍵盤輸入一個字符串,判斷其是否為回文數。
2、實驗代碼:
#include<stdio.h> #include<string.h> #define N 40 main() { char str[N],ch='Y'; int i; int len; printf("Please input a string;\n"); scanf("%s",str); len=strlen(str); for(i=0;i<len/2;i++) if(str[i]!=str[len-1-i]) { ch='N'; break; } if(ch=='Y') printf("%s是一個回文數\n",str); else printf("%s不是一個回文數\n",str); }
3、問題分析:數字回文數的程序比較好理解,字符串的有點把我給搞暈了,許多東西好陌生,只知道跟着流程圖走,沒有搞明白。
4、最終運行效果:
四、實驗小結總之
這次的代碼敲了比較久,一是對數組這一章的很多概念不是很清楚,又接觸到許多陌生的東西,有些束手無策的感覺,又加上很多細節自己沒有把握到,總在糾結着,耗費了大量時間。總之,C語言這門課程路漫漫其修遠兮,同志依舊需上下而求索之,我們來日方長。