1. 程式人生 > 其它 >第五次實驗(陣列實驗)

第五次實驗(陣列實驗)

第五次試驗報告

實驗專案陣列實驗
姓名:楊偉巨集實驗時間: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、打程式碼時失誤較多,速度有些欠缺。