PTA作業:1.選擇排序法 2.找鞍點


作業一:選擇排序
一.試題:本題要求將給定的n個整數從大到小排序后輸出。
輸入格式:
輸入第一行給出一個不超過10的正整數n。第二行給出n個整數,其間以空格分隔。
輸出格式:
在一行中輸出從大到小有序的數列,相鄰數字間有一個空格,行末不得有多余空格。
輸入樣例:
4
5 1 7 6
輸出樣例:
7 6 5 1
二.分析:1.本題與教材上的示例有所不同,需要將一組結果從大到小輸出
實際上所使用的思路與原理是一樣的!
2.需要嚴重注意的是題目中行末不允許有空格,否則該題會全部報錯!
三.由於原理在上課的時候老師已經說過,所以直接附上執行代碼吧:

  #include<iostream>
  using namespace std; 
  main()
{
	int temp,i,j,n;
	int a[100];
	scanf("%d",&n);
	for(i=0;i<n;i++)
	scanf("%d",&a[i]);
	for(i=0;i<n;i++)
	{
		for(j=i+1;j<n;j++) //本處就是代表從第一個數到最后一個數,找出最大值,而后從第二個數到最后一個數,找出最大值......以此類推
		{
			if(a[j]>a[i])
			{
			temp=a[j];//本處就是
			a[j]=a[i];//將最大數
			a[i]=temp;	//與上述要求的數交換
			}
		}
    }
    for(i=0;i<n;i++){
    printf("%d",a[i]);
    if(i!=n-1)
    printf(" ");//本處即保證行末無空格
    }
}

四.運行正確截圖
五.總結:本題是一次性通過,並且難度不是很大,因此對照教材仿寫即可,但是我們需要弄清楚其原理,這樣才能算是掌握了該算法的排序!

作業二:找鞍點
一.試題:找鞍點 (20 分)
一個矩陣元素的“鞍點”是指該位置上的元素值在該行上最大、在該列上最小。
本題要求編寫程序,求一個給定的n階方陣的鞍點。
輸入格式:
輸入第一行給出一個正整數n(1≤n≤6)。隨后n行,每行給出n個整數,其間以空格分隔。
輸出格式:
輸出在一行中按照“行下標 列下標”(下標從0開始)的格式輸出鞍點的位置。如果鞍點不存在,則輸出“NONE”。題目保證給出的矩陣至多存在一個鞍點。
輸入樣例1:
4
1 7 4 1
4 8 3 6
1 6 1 2
0 7 8 9
輸出樣例1:
2 1
輸入樣例2:
2
1 7
4 1
輸出樣例2:
NONE
二.分析:本題的難度稍高,實際上其原理很簡單,就是逐行找出每行中最大的數,而后把該數與其所在的列中數進行比較,看是否為列中最小的數,若滿足這些條件就可將該數輸出
若不滿足,輸出NONE
三.由於代碼行較多,所以詳情直接附在代碼上:

 #include <iostream>
 using namespace std; 
 int main()
{
    int a[88][99];
    int n;
    scanf("%d",&n);
    int i,j;
   for(i=0; i<n; i++)
        for(j=0; j<n; j++)
        {
            scanf("%d",&a[i][j]);
        }
    int k=0,x=0,sks=1,q=0;//k為鞍點的最小值列標 
    if(n==1)
        printf("0 0");//若只是一個一階矩陣,則鞍點就是其本身 
    else
    {
        for(i=0; i<n; i++)
        {
            x=i;
            for(q=0; q<n; q++)//找行得最大值 
            {
                if(a[i][k]<=a[i][q])//數組元素之間比較,比a[i][k]大,就把列標賦給k 
                {
                    k=q;
                }
            }
            for(j=0; j<n; j++)//判斷是否為列中的最小值 
            {
                if(a[x][k]>a[j][k])//若此行最大值不是列所在的最小值,把小的行標賦給x 
                {
                    x=j;
                    break;
                }
            }
            if(i==x)//行中最大且列中最小,判斷條件行標不改變 
            {
                sks=0;
                break;
            }
        }
        if(sks==0)
            printf("%d %d",i,k);//i為鞍點行數,k為鞍點列數 
        else printf("NONE");
    }
    return 0;
}

四.運行結果正確截圖
五.流程圖:
六.總結:本題調試了很多次,最后還是借閱了一網友的資源將問題解決的,可能還是自己所考慮到的各種情況不周到,今后還是要多加思考,將思維能力鍛煉出來

作業三:冒泡法排序
一.試題7-1 冒泡法排序 (10 分)
輸入1個正整數n(1<=n<=10),然后輸入n個整數並存放在數組中,將這n個整數從大到小排序后輸出,相鄰數字間有一個空格,行末不得有多余空格。
輸入格式:
輸入第一行給出一個不超過10的正整數n。第二行給出n個整數,其間以空格分隔。
輸出格式:
在一行中輸出從大到小有序的數列,相鄰數字間有一個空格,行末不得有多余空格。
輸入樣例:
4
75 71 77 76
輸出樣例:
77 76 75 71
二.分析:本題代碼與選擇排序法的代碼相似,但是原理與選擇排序法是截然不同的,本題是一組數中的后一個數與前一個數相互比較,如果后一個數比前一個數大,則調換其位置
三.執行代碼

 #include<iostream>//請各位讀者相信,本題代碼絕不是copy而來
 using namespace std;
 main()
{
	int n,a[99];
	int i,j,middle;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	scanf("%d",&a[i]);
	for(i=1;i<n;i++){   //外層循環
	for(j=0;j<n-i;j++)//內層循環
	if(a[j]<a[j+1]){
		middle=a[j];a[j]=a[j+1];a[j+1]=middle;//后一個數與前一個數相互比較,如果后一個數比前一個數大,則調換其位置
	}
    }
	for(i=0;i<n;i++){
	printf("%d",a[i]);
	if(i!=n-1)
		printf(" ");//此處迎合PTA要求的格式
    }
	return 0;
}

四.總結,本題的難度不是太大,因為已經學習過了選擇排序法,所以弄明白了其原理難度並不大


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM