第五次實驗(陣列實驗)
第五次試驗報告
實驗專案:陣列實驗
姓名:楊偉巨集實驗時間:2021年6月9日
一、實驗目的與要求
1、掌握一維陣列和多維陣列的定義和陣列元素的引用方法。
2、瞭解一維陣列和多維陣列的初始化方法。
3、學習一維陣列和多維陣列的基本演算法。
4、掌握字元陣列的定義、初始化方法及其元素的引用方法。
5、掌握C語言提供的對字串進行處理的基本庫函式
二、實驗內容
1、實驗7.3.1.1:寫一個函式,對用隨機函式產生的10個整數按從小到大的順序排列(用氣泡排序法實現)。
實驗程式碼:
#include <stdio.h> #include <stdlib.h> #include <time.h> void sort(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; printf("%d",a[i]); printf(" "); } sort(a,10); printf("\n排序後的結果: \n"); for(i=0;i<10;i++) { printf("%d",a[i]); printf(" "); } }
執行結果:
問題描述:當被調函式的形參中有陣列定義,則在呼叫函式的時候,其實參要用陣列的地址.例如形參為s[],則在主函式中呼叫函式裡應該用陣列a[]的地址a。
注意:srand time(NULL)是隨機數種子,rand()%100的意思是產生的都是一百以內的數。
氣泡排序法:比較相鄰的元素,如果第一個比第二個大,就交換他們兩個,對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。 針對所有的元素重複以上的步驟,除了最後一個。持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較.
2、實驗7.3.1.2:寫一個函式,對用隨機函式產生的10個整數按從小到大的順序排列(升序,用選擇排序實現)
實驗程式碼:
#include <stdio.h> #include <stdlib.h> #include <time.h> void sort2(int s[], int n) { int i,j,k; int temp; for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<=n-1;j++) { if(s[k]>s[j]) { 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; printf("%d",a[i]); printf(" "); } sort2(a,10); printf("\n排序後的結果: \n"); for(i=0;i<10;i++) { printf("%d",a[i]); printf(" "); } }
執行結果:
問題描述:陣列下標替換也是需要設定一個沒有初始值的變數;是在實驗一的基礎做了些改變。
注意:選擇排序法:選擇排序演算法的基本思路是為每一個位置選擇當前最小的元素。選擇排序的基本思想是,基於直接選擇排序和堆排序這兩種基本的簡單排序方法。首先從第1個位置開始對全部元素進行選擇,選出全部元素中最小的給該位置,再對第2個位置進行選擇,在剩餘元素中選擇最小的給該位置即可;以此類推,重複進行“最小元素”的選擇,直至完成第(n-1)個位置的元素選擇,則第n個位置就只剩唯一的最大元素,此時不需再進行選擇。使用這種排序時,要注意其中一個不同於冒泡法的細節。舉例說明:序列58539.我們知道第一遍選擇第1個元素“5”會和元素“3”交換,那麼原序列中的兩個相同元素“5”之間的前後相對順序就發生了改變。因此,我們說選擇排序不是穩定的排序演算法,它在計算過程中會破壞穩定性。
3、實驗7.3.2.1:輸出指定行數的楊輝三角。
實驗程式碼:
#include"stdio.h"
void 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("%d\t",a[i][j]);
printf("\n");
}
}
執行結果:
問題描述:需注意陣列下標在迴圈中的變化。
4、實驗7.3.2.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 y,int m,int d)
{
int i,j,s=0;
if(y%4==0&&y%100!=0||y%400==0)
i=1;
else
i=0;
for(j=1;j<m;j++)
s=s+day_tab[i][j];
s=s+d;
return s;
}
main()
{
int y,m,d;
printf("Please Input the year,month and day:\n");
scanf("%d%d%d",&y,&m,&d);
printf("It is this year %d day.",day_year(y,m,d));
}
執行結果:
問題描述:陣列函式要在主函式前定義,在呼叫的時候也要注意陣列函式的呼叫是都會出錯,注意呼叫函式的返回值。
5、實驗7.3.3:編寫程式,從鍵盤輸入一個字串,判斷其是否是迴文數
實驗程式碼
#include <stdio.h>
#include <string.h>
#define N 40
void main()
{
char str[N],ch='Y';
int i;
int len;
printf("請輸入一個字串:\n");
scanf("%s",&str);
len=strlen(str);//呼叫預設函式
for(i=0;i<=len/2;i++)
{
if(str[i]==str[len-1-i])
break;
else
ch='N';
}
if(ch=='Y')
printf("%s是一個迴文數\n",str);
else
printf("%s不是一個迴文數\n",str);
}
執行結果:
問題描述:注意"if(str[i]!=str[len-1-i])"程式碼的意義:進行比較第一個與最後一個字串是否想等,第二個與倒數第二個字串是否相等,依次類推。
三、實驗小結
1、在實驗中進一步鞏固所學知識,並且可以學到一些課本上沒有的知識,積累經驗;
2、加深自己對陣列的理解和應用,並且能夠結合流程圖寫出完整程式碼;
3、打程式碼時失誤較多,速度有些欠缺。