做業一:選擇排序 一.試題:本題要求將給定的n個整數從大到小排序後輸出。 輸入格式: 輸入第一行給出一個不超過10的正整數n。第二行給出n個整數,其間以空格分隔。 輸出格式: 在一行中輸出從大到小有序的數列,相鄰數字間有一個空格,行末不得有多餘空格。 輸入樣例: 4 5 1 7 6 輸出樣例: 7 6 5 1 二.分析:1.本題與教材上的示例有所不一樣,須要將一組結果從大到小輸出 實際上所使用的思路與原理是同樣的! 2.須要嚴重注意的是題目中行末不容許有空格,不然該題會所有報錯! 三.因爲原理在上課的時候老師已經說過,因此直接附上執行代碼吧:ios
#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; }
四.總結,本題的難度不是太大,由於已經學習過了選擇排序法,因此弄明白了其原理難度並不大spa