這個做業屬於的課程 | c語言程序設計2 |
---|---|
這個做業的要求在哪裏 | 2019年春季第四周做業 |
我在這個課程的目標是 | 能編寫一些簡單的軟件應用 |
這個做業在哪一個具體方面幫助我實現目標 | 這個做業很好的鍛鍊了個人思惟能力,而且學習到了新算法,豐富了個人知識 |
參考文獻 | C語言程序設計 |
#2019春第四周做業(基礎題)計算機 | |
5-1 | |
輸入一個正整數 n (1≤n≤10)和n 階方陣a的元素,若是方陣a中的全部元素都沿主對角線對稱,輸出「Yes」, 不然,輸出「No」。主對角線爲從矩陣的左上角至右下角的連線,方陣a中的全部元素都沿主對角線對稱指對全部i, k,a[i][k]和a[k][i]相等。輸入輸出示例以下: | |
輸入: | |
3 | |
1 2 3 | |
4 5 6 | |
7 8 9 | |
輸出: | |
No | |
##實驗代碼 |
#include <stdio.h> int main(void) { int found, i, k, n; int a[10][10]; scanf ("%d", &n); for (i = 0; i < n; i++) for (k = 0; k < n; k++) scanf("%d", &a[i][k]); found = 1; for (i = 0; i < n; i++){ for (k = 0; k < i; k++){ if ((3分)) { ; break; } } if (){ break; } } if (found != 0){ printf("Yes\n"); } else{ printf("No\n"); } return 0; }
##作題思路 直接在空格內比較與他對稱的數是否相等,若是不相等,則found賦值爲零,跳出內層for循環。由於還有一個外層for循環,因此若是found已經爲零,則跳出外層循環。c++
#7-2 選擇法排序 (20 分) 本題要求將給定的n個整數從大到小排序後輸出。 輸入格式: 輸入第一行給出一個不超過10的正整數n。第二行給出n個整數,其間以空格分隔。 輸出格式: 在一行中輸出從大到小有序的數列,相鄰數字間有一個空格,行末不得有多餘空格。 輸入樣例: 4 5 1 7 6 輸出樣例: 7 6 5 1 ##實驗代碼算法
#include<stdio.h> int main (void) { int n, big, i, x, sum; scanf("%d", &n); int a[n]; for(i=0; i<n; i++){ scanf("%d", &a[i]); } for(x=0; x<n-1; x++){ big=x; for(i=x+1; i<n; i++){ if(a[i]>a[big]){ big=i; } } sum=a[x]; a[x]=a[big]; a[big]=sum; printf("%d%s", a[x], " "); } printf("%d", a[x]); return 0; }
##設計思路 具體思路:用·第一個for語句來控制總循環次數,第二個for語句來判斷大小:若是後面的數比前面的數大,則把下標賦值給big,找出最大值對應的下標。 判斷大小的for語句結束後,把最大值與比較的第一個數交換位置,而後第一個for增一。使得上一次比較出來的最大值不用再計算。編程
##3)本題作對過程碰到問題及解決辦法 一遍過,書上也有。數組
##正確截圖 學習
#7-1 找鞍點 (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測試
##實驗代碼設計
#include <stdio.h> int main(void) { int n, line,column,min, min2=0,max1=0, max2=0,sum=9; scanf("%d", &n); int a[n][n]; for(line=0; line<n; line++){ for(column=0;column<n; column++){ scanf("%d", &a[line][column]); } } for(line=0; line<n; line++){ for(column=1; column<n; column++){ if(a[max1][max2]<=a[line][column]){ max1=line; max2=column; } } for(min=0; min<n; min++){ if(a[max1][max2]<=a[min][max2]){ min2++; } } if(min2==n){ printf("%d %d",max1,max2); sum=10; } min2=0; max1=line+1; max2=0; } if(sum!=10){ printf("NONE"); } return 0; }
##設計思路 具體思路:先找出一行中最大值所在位置,而後把它的下標存在max1,max2中。再比較這個數是否在列裏是最小的。在這裏定義了一個計數器min2,計算有多少個數大於等於這個行最大值,若是等於n,則符合題意,輸出,並使sum等於10(說明有符合題意的數)。 再在最後使計數器min2歸零。max1表示的行從下一行開始,max2表示的列從第一個元素開始,。 若是sum!=10.則沒有符合題意的數,輸出NONE.3d
##3)本題作對過程碰到問題及解決辦法 問題:沒有在c++上用對編譯器 解決方法:在班羣裏提出了個人問題,楊大佬問我PTA用的是哪一個編譯器,我改了編譯器後就能夠賦初始值了。
問題:第三個測試點錯誤,但我不知道爲何錯了。 解決方法:換了一個新的思路。調試
##正確截圖 code
#7-1 冒泡法排序 (10 分) 輸入1個正整數n(1<=n<=10),而後輸入n個整數並存放在數組中,將這n個整數從大到小排序後輸出,相鄰數字間有一個空格,行末不得有多餘空格。 輸入格式: 輸入第一行給出一個不超過10的正整數n。第二行給出n個整數,其間以空格分隔。 輸出格式: 在一行中輸出從大到小有序的數列,相鄰數字間有一個空格,行末不得有多餘空格。 輸入樣例: 4 75 71 77 76 輸出樣例: 77 76 75 71
##實驗代碼
#include<stdio.h> int main (void) { int n, big, i, sum=0; scanf("%d", &n); int a[n]; for(i=0; i<n; i++){ scanf("%d", &a[i]); } for(i=0; i<n; i++){ for(big=i; big<n; big++){ if(a[big]>a[i]){ sum=a[i]; a[i]=a[big]; a[big]=sum; } } if(i<n-1){ printf("%d ", a[i]); } else{ printf("%d", a[i]); } } return 0; }
##設計思路 具體思路:和選擇排序法差很少,但冒泡排序法是直接交換數的位置。 若是後一個數a[big]比前一個數a[i]大,則交換兩個數的位置,並把大的那個數存在a[i]當中,如此循環。 內層for每循環一遍,就有一個最大值被頂到循環開始的位置。而外循環就自加一,再把這個已經自加一的值做爲內層for循環的開始值。
##3)本題作對過程碰到問題及解決辦法 一遍過,由於在寒假看書的時候已經作過一遍了。 ##正確截圖
##對本身做業的評價 嗯··,其實呢感受還不夠完美,代碼就是要簡潔易懂嘛。找鞍點這個題作了好久好久,哎,作不對題不能總怪PTA不正確,是本身的問題。要虛心,好好思考。
##學習進度條 |周|這周所花的時間|代碼行|學到的知識點簡介|目前比較迷惑的問題| |-|-|-|-|-| |第四周|十多個小時|134行|選擇排序法,字符數組和字符串的使用|爲何我在PTA和上用的也是c++編譯器,可是在c++上能正確輸出,在PTA上就不正確,爲何呢。| ##學習感悟 找鞍點這個程序寫了好久,寫完以後發現其實很簡單,就是本身不細心,調試的少,因此不能準確知道數據的流向,不清楚數據的變更狀況。要細心,多調試。加油 結對編程隊友:宋志豪 。