第二次博客作业
1:
目前我学习中存在的薄弱的知识点具体是结构体、共同体、枚举类型与指针。在近几次的PTA练习中(大概是练习8-练习10)我常常被题目卡住,想到思路但是不知道应该怎么写下代码。在结构体中具体的例子是定义结构体类型变量。
我一开始无法理解结构体类型与结构体类型变量的定义,导致对结构体成员引用出现错误。共用体和枚举类型则是因为很少运用于做题,对这两者不够熟悉,遇到需要运用共用体和枚举类型知识的题目就不知道应该怎么做。例如书本141页例8.4,我仍不能理解。我指针知识由于是新知识,仍然需要花时间去深入了解。在二维数组与指针上仍要更多精力去钻研。
2:
7-1 数组元素循环右移问题 (20 分)
一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−M−1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
① 题目大意是要移动一个数组里面的数字,改变他们的位置。
② 题目分两种情况,其中要考虑N>M/N<M。
③
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int a[100],b,c,i;
cin>>b>>c;
if(b>c)
{
for(i=0;i<b;i++)
cin>>a[i];
{if(b==1&&c==0) cout<<a[0];else
cout<<a[b-c];}
for(i=1;i<c;i++)
cout<<" "<<a[b-c+i];
for(i=0;i<b-c;i++)
{if(b==1&&c==0) cout<<endl;else cout<<" "<<a[i]; }}
else if(c>b)
{
int d;
d=c-b;
for(i=0;i<b;i++)
cin>>a[i];
cout<<a[b-d];
for(i=1;i<d;i++)
cout<<" "<<a[b-d+i];
for(i=0;i<b-d;i++)
cout<<" "<<a[i]; }
else
{
for(i=0;i<b;i++)
cout<<a[i];
}
}
④ 其中最重要的一点就是找出数字移动前后下标的关系。
N>M时,如果i+M(i为下标)大于或等于N,则数字移动到下标为i+M除以N的余数的位置上。否则数字移动到下标为i+M的位置上。
N<M时,设K为M除以N的余数,如果i+K(i为下标)大于或等于N,则数字移动到下标为i+K除以N的余数的位置上。否则数字移动到下标为i+K的位置上。
⑤ 问题最大的就是找出数字移动前后的下标之间的关系,要先用白纸设一组数组来找寻他们之间的关系会比较清晰。只要找到了两者的关系题目就很容易了,但是写成代码需要时间思考一下。