數組實驗報告


數組實驗報告

一、題目分析

題目一

7-1 數組元素循環右移問題(20 分)

一個數組A中存有N>0)個整數,在不允許使用另外數組的前提下,將每個整數循環向右移M≥0)個位置,即將A中的數據由(A​0​​A​1​​⋯AN−1​​)變換為(ANM​​⋯AN−1​​A​0​​A​1​​⋯ANM−1​​)(最后M個數循環移至最前面的M個位置)。如果需要考慮程序移動數據的次數盡量少,要如何設計移動的方法?

輸入格式:

每個輸入包含一個測試用例,第1行輸入N1≤N≤100)和M≥0);第2行輸入N個整數,之間用空格分隔。

輸出格式:

在一行中輸出循環右移M位以后的整數序列,之間用空格分隔,序列結尾不能有多余空格。

  1. 本題pta提交列表

 

  1. 流程圖

 

 

 

 

 

 

最終程序如下:

#include <stdio.h>  

#include <stdlib.h>   

int main(){  

    int A[10];  

    int M, N;  

    scanf("%d%d", &N, &M);  

    for (int i = 1; i <= N; i++){  

        scanf("%d",&A[i]);  

    }  

    for (int k = 0; k < M; k++){  

        int temp = A[N];  

        for (int j = N; j > 1; j--){  

            A[j] = A[j - 1];  

        }  

        A[1] = temp;  

    }   

    for (int i = 1; i <= N; i++){  

        printf("%d",A[i]);

if(i!=N)

printf(" ");

        }  

}

  1. 本題調試結果

 

  1. 題目討論

在這題的編程中,我花費了較多時間。。。剛開始思路可能不太對。剛開始的思路是把數組元素下表做一些變換。即構造一個元素j,進行下列操作

 for(i=0;i<n;i++)

  {

    j=(i+m)%n;

    a[j]=a[i];

  }

我覺得我的思路沒什么大問題,就是結果不盡人意。

所以我換了另一種較為繁瑣的思路。即逐步移動。每次用一個for 循環將N個數移動一次,再用一個for循環移動M次,即

for (int k = 0; k < M; k++){  

        int temp = A[N];  

        for (int j = N; j > 1; j--){  

            A[j] = A[j - 1];  

        }  

        A[1] = temp;  

}   

 

有一個小疑問:就是我的第一種思路為啥執行出來結果不對。。。。有時間再進行進一步

思考

 

 

 

 

題目二

7-2 求最大值及其下標(20 分)

本題要求編寫程序,找出給定的n個數中的最大值及其對應的最小下標(下標從0開始)。

輸入格式:

輸入在第一行中給出一個正整數n1<n≤10)。第二行輸入n個整數,用空格分開。

輸出格式:

在一行中輸出最大值及最大值的最小下標,中間用一個空格分開。

1.本題提交列表

 

 

  1. 設計思路(流程圖)

 

 

最終程序如下:#include<stdio.h>

int main()

{

  int a[101];

  int i,n,m,max;

  scanf("%d",&n);

  for(i=0;i<n;i++)

  scanf("%d",&a[i]);

  max=a[0];m=0;

  for(i=0;i<n;i++)

{

  if(a[i]>max)

  {

    max=a[i];

    m=i;

  }

}

  printf("%d %d",max,m);

}

3.本題調試結果:

 

  1. 題目討論

本題較為簡單,注意細節就好了,沒什么需要特別注意的地方……

 

題目三

7-3 將數組中的數逆序存放(20 分)

本題要求編寫程序,將給定的n個整數存入數組中,將數組中的這n個數逆序存放,再按順序輸出數組中的元素。

輸入格式:

輸入在第一行中給出一個正整數n1≤n≤10)。第二行輸入n個整數,用空格分開。

輸出格式:

在一行中輸出這n個整數的處理結果,相鄰數字中間用一個空格分開,行末不得有多余空格。

  1. 本題pta 提交列表

 

  1. 流程圖

 

 

 

 

 

 

 

 

 

最終程序如下:

int main()

{

    int i, n, swap, array[10];

    scanf("%d", &n);

    for (i = 0; i < n; i++)

        scanf("%d", &array[i]);

    for (i = 0; i < n/2; i++)

    {

        swap = array[i];

        array[i] = array[n-1-i];

        array[n-1-i] = swap;

    }

    for (i = 0; i < n-1; i++)

        printf("%d ", array[i]);

    printf("%d\n", array[n-1]);

    return 0;

}

  1. 本題調試結果

 

二、同學代碼互評

  本來應該找別的同學一起來互評

但是我在題目三的運算中使用了兩種方法,就針對這兩種方法進行評論吧!

自己在思考中對本題的另一種解法

#include<stdio.h>

int main()

{

  int a[101],b[101];

  int i,n,m,j,max;

  scanf("%d",&n);

  for(i=0;i<n;i++)

  scanf("%d",&a[i]);

  for(j=0;j<n;j++)

{ m=n-1-j;

  b[j]=a[m];

}for(j=0;j<n;j++)

 {

   printf("%d ",b[j]);

   if(j!=(n-1))

   printf("%n");

}

}

 

 

思路即定義另外一個數組B,對數組B進行賦值操作。該方法也很好理解。唯一的缺點程序比較不嚴謹,在pta提交過程中提交顯示多出錯誤,但在c++中 是可以執行 並且結構正確的程序。可能是我對語句的使用不夠熟練,對C的編程還不夠嚴謹。。。

三、總結

 

我學到了什么?

 

在數組這一章以及這一章的訓練中。

 

記憶最深的就是我之前犯過的一個錯誤,int n;int a[n];覺得已經定義一個變量n了,就可以定義長度為n的數組,實際上不存在這種操作!會牢記的

 

還有就是數組的一些基本知識,下標從0開始等等。整體來說,使用數組能簡化很多問題。熟練掌握數組在編程中也能方便許多。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM