1 | 2 | |
---|---|---|
課程名稱 | c語言程序設計2 | |
做業要求 | https://edu.cnblogs.com/campus/zswxy/software-engineering-class2-2018/homework/2774 | |
個人課程目標 | 我但願經過c語言的學習,實現編寫主析取範式和主合取範式的程序 | |
這個做業在哪一個方面幫助我實現目標 | 理解選擇排序和冒泡排序,懂得了排序的多種方法。對於找一個特定的點能夠用循環結構實現 | |
參考文獻 | 課本c語言程序設計 http://www.javashuo.com/article/p-wfvodyqs-ep.html http://www.javashuo.com/article/p-wfvodyqs-ep.html |
基礎做業1 7-2 選擇法排序 (20 分) 本題要求將給定的n個整數從大到小排序後輸出。html
輸入格式: 輸入第一行給出一個不超過10的正整數n。第二行給出n個整數,其間以空格分隔。數組
輸出格式: 在一行中輸出從大到小有序的數列,相鄰數字間有一個空格,行末不得有多餘空格。函數
輸入樣例:學習
4 5 1 7 6
輸出樣例:spa
7 6 5 1
#include<stdio.h> int main (void) { int i,max,k,n,temp; int a[10]; scanf("%d", &n); for(i=0; i<n; i++) scanf("%d", &a[i]); for(k=0; k<n-1; k++){ max=k; for(i=k+1; i<n; i++) if(a[i]>=a[max]) max=i; temp=a[max]; a[max]=a[k]; a[k]=temp; } for(i=0; i<n; i++){ printf("%d",a[i]); if(i!=n-1) printf(" "); } return 0; }
第一步:定義變量;第二步:將輸入數依次賦給數組a。第三步:用一個變量存放最大值,再尋找最大值所在的下標。第四步,消除行末的空格,輸出排序後的數。設計
本週老師幫咱們詳細講解了選擇排序法,書上有從小到大選擇排序的例題,本題正好相反。問題:C++上運行正確,pta上卻格式所有錯誤。行末多輸出一個空格。解決方案,第一步先把空格去掉,結果部分正確,第二步,在輸出a[i]的語句後加一個if語句判斷是否是最後一個數,不是就輸出,是就不輸出。運行正確,問題解決。 3d
7-1 找鞍點 (20 分) 一個矩陣元素的「鞍點」是指該位置上的元素值在該行上最大、在該列上最小。調試
本題要求編寫程序,求一個給定的n階方陣的鞍點。code
輸入格式: 輸入第一行給出一個正整數n(1≤n≤6)。隨後n行,每行給出n個整數,其間以空格分隔。htm
輸出格式: 輸出在一行中按照「行下標 列下標」(下標從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, i,j,min, k=0,x=0, y=0,flag=0; int a[6][6]; scanf("%d", &n); for(i=0; i<n; i++){ for(j=0; j<n; j++){ scanf("%d", &a[i][j]); /*遍歷數組*/ } } for(i=0; i<n; i++){ for(j=1; j<n; j++){ if(a[x][y]<=a[i][j]){ /*給x和y賦值代替行和列*/ x=i; y=j; } } for(min=0; min<n; min++){ /*構建一個新矩陣進行比較使行最大*/ if(a[x][y]<=a[min][y]){ k++;/*知足條件用來計數*/ } } if(k==n){ /*知足行最大列最小*/ printf("%d %d",x,y); flag=1; } k=0; x=i+1;/*當i=0加上只有一個數的狀況,也是鞍點*/ y=0; } if(flag!=1){ 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 <stdio.h> int main(void) { int n, i, j, temp; int a[10]; scanf("%d", &n); for(i = 0;i < n;i++) { scanf("%d", &a[i]); } for(i = 0;i < n;i++) { for(j = 0;j < n - i - 1;j++) { if(a[j] <= a[j+1]) { temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } } for(i = 0;i < n;i++) { printf("%d", a[i]); if(i != n-1) printf(" "); } return 0; }
經過前一個數與後一個數比較大小,若是後面一個大的話自動交換位置,用if語句加for循環便可解決,注意最後輸出時應加入一個if語句消除空格;
冒泡排序老師沒教,爲本週的挑戰做業,我以爲比選擇排序更加容易理解。在360上搜了冒泡排序的用法後,遇到了一點小問題,輸入數組元素時粗心沒把數組取地址,致使段錯誤; 加上取地址符後問題解決。
###學習進度 |||||||||||||| |:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--| |周/日期|這周所花的時間|代碼行|學到的知識點簡介|目前比較迷惑的問題| |3/17-3/21|3天|240|用一維數組進行多種方法的排序,二維數組的遍歷及主副對角線的區分|找鞍點一題爲何比較數組之間的值pta通不過,找位置卻能夠|
###學習感悟 本週除了學習二維數組外,作了pta上的題,找鞍點花費了我好久的時間。複習了之前的函數,循環結果,對於自定義函數有了一個更深的理解,回顧了一些數據類型和表達式,整型、實型、字符型數據的輸入與輸出,先從基礎開始。對於二分法排序的掌握遠遠不夠,會一點但弄不出完整的代碼。預習了數組後面的判斷迴文,統計字符串中數字字符的個數。進制的轉換也是一大難點,該好好努力了。