数组实验报告

一、题目分析

题目一

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行输入N(1≤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开始)。

输入格式:

输入在第一行中给出一个正整数n(1<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个数逆序存放,再按顺序输出数组中的元素。

输入格式:

输入在第一行中给出一个正整数n(1≤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开始等等。整体来说,使用数组能简化很多问题。熟练掌握数组在编程中也能方便许多。

posted on 2018-01-25 22:26  韩先生ooo  阅读(757)  评论(0编辑  收藏  举报