2019第四周做業

2019年春季學期第四周做業

12. 頭文件

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

(四)運行結果截圖

基礎做業2找鞍點

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上的題,找鞍點花費了我好久的時間。複習了之前的函數,循環結果,對於自定義函數有了一個更深的理解,回顧了一些數據類型和表達式,整型、實型、字符型數據的輸入與輸出,先從基礎開始。對於二分法排序的掌握遠遠不夠,會一點但弄不出完整的代碼。預習了數組後面的判斷迴文,統計字符串中數字字符的個數。進制的轉換也是一大難點,該好好努力了。

相關文章
相關標籤/搜索