作業一:選擇排序
一.試題:本題要求將給定的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;
}
四.總結,本題的難度不是太大,因為已經學習過了選擇排序法,所以弄明白了其原理難度並不大
