天天看點

c++程式設計——實驗7

實驗7

1. 對兩個無序的數組(其中數組a長度為n,數組b長度m),采用選擇法(或起泡法)分别将這兩個數組轉為有序(元素值從小到大有序)。要求:a和b數組長度及其元素均由鍵盤擷取。

2. 将以上任務1建構的兩個有序的數組a和b,進行有序合并,即将這兩個數組進行合并的過程中其資料始終保持有序。(提示:資料結構:三個一維數組a,b,c将a[ia]和b[ib]比較,誰小就把誰放入c[ic](c數組用于存放合并後的資料),誰放入了c[ic]中誰的下标就加1,同時ic(c中目前存放資料的下标)加1,如下圖所示。)

c++程式設計——實驗7

 3. 計算以上任務2中c數組元素的平均值,并删除c中所有低于平均值的那些元素。

#include <iostream>
using namespace std;
int main()
{
	//int a[100],b[100];
	//a[100] = {0};提示,不能這樣初始化,應該采用下面的方式
	//b[100] = {0};
	int a[100] = {0},b[100] = {0};
	
	int n1,n2,t;
	cout << "請輸入數組a的個數:";
	cin >> n1;
	cout << "請依次輸入" << n1 << "個整數:"<< endl;
	for( int i = 0; i < n1; i++ )
	{
		cin >> a[i];
	}
	cout << "對數組a進行排序……" << endl;
	/********************************選擇法排序*****************************
	思路:	a[i]與後面的元素a[j](即a[i+1],a[i+2],……,a[n1-1])進行比較,如果
			a[i]大于a[j],則交換。須n1-1次循環,每次循環須判斷n1-i-1次。第0次
			循環後,a[0]為數組a的最小值,第1次循環後,a[1]僅小于a[0],大于其
			它元素。第n1-1次循環後,a[n1-1]為最大值。最終完成從小到大的排序。 
	************************************************************************/
	//方式1:
	for( int i = 0; i < n1-1; i++ )		//須n1-1次循環
		for( int j = i+1; j < n1; j++)	//每次循環須判斷n1-i-1次
		{
			if( a[i] > a[j] )			//a[i]大于a[j],則交換
			{
				t = a[i];
				a[i] = a[j];
				a[j] = t;
			}
		}
	//方式2:
	//for(int i = 0; i < n1-1; i++)		//須n1-1次循環
	//{
	//	int min = i;
	//	for(int j = i+1; j < n1; ++j)	//每次循環須判斷n1-i-1次
	//	{
	//		if( a[min] > a[j])			//a[min]大于a[j],則a[j]為最小值
	//			min = j;
	//	}
	//	t = a[min];
	//	a[min] = a[i];
	//	a[i] = t;
	//}
	/*******************************冒泡法排序******************************
	思路:	相鄰的兩個元素進行比較,如果前者大于後者,則交換,這樣較大的元素
			就會向後移動,較小的元素向前移動。第0次循環,須兩兩比較m-1次,結果
			a[m-1]為數組a的最大值。第1次循環,須兩兩比較m-2次,結果a[m-2]僅小
			于a[m-1],大于其它元素。第i次循環,須兩兩比較m-1-i次。第m-1次循環後,
			a[0]為最小值。最終完成從小到大的排序。              
	************************************************************************/
	//冒泡法:
	//for( int i = 0; i < n1-1; i++ )		//須n1-1次循環
	//	for( int j = 0; j < n1-i-1; j++)		//每次循環須判斷n1-i-1次
	//	{
	//		if( a[j] > a[j+1] )				//a[j]大于a[j+1],則交換
	//		{
	//			t = a[j];
	//			a[j] = a[j+1];
	//			a[j+1] = t;
	//		}
	//	}
	//測試用
	//for( int i = 0; i < n1; i++ )
	//{
	//	cout << a[i] << ' ';
	//}
	//cout << endl;

	/******************************************************/
	cout << "請輸入數組b的個數:";
	cin >> n2;
	cout << "請依次輸入" << n2 << "個整數:"<< endl;
	for( int i = 0; i < n2; i++ )
	{
		cin >> b[i];
	}
	cout << "對數組b進行排序……" << endl;
	for( int i = 0; i < n2; i++ )
		for( int j = i+1; j < n2; j++)
		{
			if( b[i] >b[j] )
			{
				t = b[i];
				b[i] = b[j];
				b[j] = t;
			}
		}

	/******************第二題**************/

	int c[100];
	int i = 0, j = 0, k = 0;
	int n3 = 0;//記錄數組c的個數
	while( i < n1 && j < n2 )
	{
		if( a[i] < b[j] )
		{
			c[k++] = a[i++];
		}
		else if( a[i] == b[j] )
		{
			c[k++] = a[i++];
			c[k++] = b[j++];
		}
		else
		{
			c[k++] = b[j++];
		}
	}
	while( n1 > i && n2 == j )
	{
		c[k++] = a[i++];
	}
	while( n2 > j && n1 == i )
	{
		c[k++] = b[j++];
	}
	n3 = k;
	cout << "對數組a和數組b進行組合,得數組c為:" << endl;
	//檢查結果
	for( k = 0; k < n3; k++ )
		cout << c[k] << ' ';
	cout << endl;
	/******************第三題**************/

	 int sum = 0;//sum記錄數組c所有元素的和,及平均值
	 int n4 = 0;//n4記錄新數組c的個數
	 for( k = 0; k < n3; k++ )
		sum += c[k];//求和
	sum /= n3;//求均值
	cout << "數組c平均數:" << sum << endl;
	cout << "對數組c進行篩選……" << endl;
	for( k = 0; k < n3; k++ )
	{
		if( c[k] >= sum )
		{
			n4 = n3 - k;
			break;
		}			
	}

	for( int m=0; k < n3; k++,m++)
	{
		c[m] = c[k];
	}
	cout << "數組c篩選後為:" << endl;
	for( int k = 0; k < n4; k++)
	{
		cout << c[k] << ' ';
	}
	cout << endl;
	return 0;
}