一、题目分析
题目一
7-1 数组元素循环右移问题(20 分)
一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A?0??A?1???A?N?1??)变换为(A?N?M???A?N?1??A?0??A?1???A?N?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开始等等。整体来说,使用数组能简化很多问题。熟练掌握数组在编程中也能方便许多。
原文地址:https://www.cnblogs.com/yfyf/p/8270789.html