第二次博客作业
(1) 首先我认为自己比较薄弱的地方是对传值调用和引用调用的理解上,我总是疑惑void类型即是可以没有return语句是如何使相应的值改变,并使改变后的值在返回main函数后继续把改变后的结果继续应用,之所以发现这个问题是在数组的逆序输出的题目中在调用函数相应位置的数组元素进行对调以达到逆序输出的效果时,明明是void,无return语句,意味着单向传递,但改变后的数组元素还是能回到main函数中并且进行顺利输出,这让我有些不理解,以至于在后来应用时也多少会有些吃力。再者我觉得自己对数组长度的设定以及cin输入流和cin.get()的输入方式理解的不透彻,自己总是习惯应用cin进行读入 ,但却在字符数组的应用中发现有些题目cin读入是通过不了的,在PTA在做cpp8的练习时我发现在奇奇哥的魔幻转化时,在用循环cin提取字符时总会出现段错误的提示,有可能是数组下标越界,后来经过分析我发现由于我设定的数组长度比较大,而cin在提取的时候时一串提取而不是像cin.get()一样进行逐个提取,导致超出了内存限制,访问出界。
(2) 解题报告:
7-1 数组元素循环右移问题 (20 分)
一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−M−1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
(1) 题目大意:
本题意思即为先从键盘上任意提取两个正整数N和M(M可以为0),N代表下面要从键盘上录入的整形数组长度,而M代表循环右移的位数,当M为1时假设录入的数组是1,2,3,4,5,6,即是数字6从第六位移动到第一位,当M是其它数字的时候依次类推。
(2) 解题思路:
首先对于这种循环右移的问题不同于数组逆序输出,不仅仅是位置对调的问题,我想既然数组给定循环右移的问题,无非是解决再输出时的一个排序问题,所以我决定采用根据录入的N,M来决定先后输出的数组元素顺序,并且会发现输出的元素由两部分有序的元素组成。
(3) 代码思路:
#include <iostream>
using namespace std;
int main ()
{ int i;
int n;
int m;
char ch = ' '; // 打印控制变量, 默认空格
int a[100];
cin>>m>>n;
m = m % n; // 确保 m < n
for (i=0; i<n; i++) {
cin>>a[i];
}
// 给数组赋值
// 接下来分两次, 分别控制打印顺序
// 第1次打印, 从倒数第m个数开始
for (i=n-m+1; i<=n; i++) {
cout<<a[i];
}
// // 第2次打印, 从1到倒数第m个数
for (i=1; i<=n-m; i++) {
if (i == (n - m)) {
ch = '\n';
}
cout<<a[i]<<ch;
}
return 0;}
(3)核心技术总结:
我觉得在这道题核心在于其算法思想,一般可能会觉得在这种循环右移的问题中一开始的思路会是找到关系,进行元素的位置对调,但换一个思路来讲,直接从输出的角度是由于循环的部分和另一部分是未改变顺序的,所以如何从输出元素的下标控制就显得比较重要。
(4) 存在的问题和解决方案:
首先一开始存在的问题是没有考虑到i == (n - m),改变了ch的字符,会使得其后面多余一个空格,所以没办法通过PTA平台上的编译运行,发现是多余空格的问题,后来即是在这种情况下把其改变成转行符号,即可以通过。