數組實驗報告
一、題目分析
題目一
7-1 數組元素循環右移問題(20 分)
一個數組A中存有N(>0)個整數,在不允許使用另外數組的前提下,將每個整數循環向右移M(≥0)個位置,即將A中的數據由(A0A1⋯AN−1)變換為(AN−M⋯AN−1A0A1⋯AN−M−1)(最后M個數循環移至最前面的M個位置)。如果需要考慮程序移動數據的次數盡量少,要如何設計移動的方法?
輸入格式:
每個輸入包含一個測試用例,第1行輸入N(1≤N≤100)和M(≥0);第2行輸入N個整數,之間用空格分隔。
輸出格式:
在一行中輸出循環右移M位以后的整數序列,之間用空格分隔,序列結尾不能有多余空格。
- 本題pta提交列表
- 流程圖
最終程序如下:
#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(" ");
}
}
- 本題調試結果
- 題目討論
在這題的編程中,我花費了較多時間。。。剛開始思路可能不太對。剛開始的思路是把數組元素下表做一些變換。即構造一個元素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開始)。
輸入格式:
輸入在第一行中給出一個正整數n(1<n≤10)。第二行輸入n個整數,用空格分開。
輸出格式:
在一行中輸出最大值及最大值的最小下標,中間用一個空格分開。
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.本題調試結果:
- 題目討論
本題較為簡單,注意細節就好了,沒什么需要特別注意的地方……
題目三
7-3 將數組中的數逆序存放(20 分)
本題要求編寫程序,將給定的n個整數存入數組中,將數組中的這n個數逆序存放,再按順序輸出數組中的元素。
輸入格式:
輸入在第一行中給出一個正整數n(1≤n≤10)。第二行輸入n個整數,用空格分開。
輸出格式:
在一行中輸出這n個整數的處理結果,相鄰數字中間用一個空格分開,行末不得有多余空格。
- 本題pta 提交列表
- 流程圖
最終程序如下:
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;
}
- 本題調試結果
二、同學代碼互評
本來應該找別的同學一起來互評
但是我在題目三的運算中使用了兩種方法,就針對這兩種方法進行評論吧!
自己在思考中對本題的另一種解法
#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開始等等。整體來說,使用數組能簡化很多問題。熟練掌握數組在編程中也能方便許多。