#include <stdio.h>
#include <stdlib.h>
#define LENGTH 10
int main(void){
void input(int *p, int n);
void output(int *p, int n);
void move(int *p, int length, int m);
int a[LENGTH], m;
int *p = a;
input(p, LENGTH);
scanf("%d", &m);
move(p, LENGTH, m);
output(p, LENGTH);
return 0;
}
void input(int *p, int n){
int i;
for(i=0;i<n;i++)
scanf("%d ",p++);
}
void output(int *p, int n){
int i;
for(i=0;i<n;i++)
printf("%d ",*p++);
}
void moveToRight(int *p, int length, int m){
int b[m],a[m];
int i;
for(i=0;i<m;i++)
{
b[i]=*(p+i+length-m);
a[i]=b[i];
}
for(i=0;i<(length-m);i++);
*(p+i+m)=*(p+i);
for(i=0;i<m;i++)
*(p+i)=a[i];
}
void moveToLeft(int *p, int length, int m){
int b[-m];
int a[-m];
int i;
for(i=0;i<-m;i++)
{
b[i]=*(p+i);
a[i]=b[i];
}
for(i=0;i<(length+m);i++);
*(p+i)=*(p+i-m);
for(i=0;i<-m;i++)
*(p+i+length+m)=a[i];
}
move(int *p, int length, int m){
if(m > 0){
moveToRight(p, length, m);
}else if(m == 0){
;
}else{
moveToLeft(p, length, m);
}
}
【问题描述】
定义一个长度为10的一维整型数组,并编写函数分别实现如下功能:
(1)函数input:对数组的各元素实现从键盘输入赋值。
(2)函数output:将数组的所有元素向屏幕打印输出。
(3)函数moveToRight:向右循环移动数组元素
(4)函数moveToLeft:向左循环移动数组元素
(5)函数move:将数组元素向左或向右循环移动m个位置。移动规则为:
● 若m>0,调用moveToRight函数,执行向右循环移动;
● 若m=0,不做任何移动;
● 若m<0,调用moveToLeft函数,执行向左循环移动。
目前已编写完成main函数和move函数,请编程实现input函数、output函数、moveToRight函数和moveToLeft函数。
/*
@Filename: ex605.c
@Author:
@Version: 1.0
@Date: 2021-03-18
@Description: Loopy Moving of Array Element
*/
#include <stdio.h>
#include <stdlib.h>
#define LENGTH 10
/*主函数*/
int main(void){
/*声明函数*/
void input(int *p, int n);
void output(int *p, int n);
void move(int *p, int length, int m);
/*定义数据结构*/
int a[LENGTH], m;//m表示数组元素循环移动的位置个数
int *p = a;
/*调用input函数,通过键盘输入为数组a赋值*/
input(p, LENGTH);
/*从键盘输入为循环移动位置个数m赋值*/
scanf("%d", &m);
/*调用move函数,完成数组元素的循环移动*/
move(p, LENGTH, m);
/*调用output函数,输出移动后的数组元素*/
output(p, LENGTH);
return 0;
}
/*
* 函数名称:input
* 函数功能:通过键盘输入为一维数组元素赋值
* 输入格式:各输入数据之间以空格分隔
* 形式参数:p,int型指针变量,一维整型数组首地址
* 形式参数:n,int型,一维数组长度
* 返回值:无
*/
void input(int *p, int n){
// 请编程实现本函数
}
/*
* 函数名称:output
* 函数功能:向屏幕打印输出一维数组元素值
* 输出格式:各输出数据之间以空格分隔
* 形式参数:p,int型指针变量,一维整型数组首地址
* 形式参数:n,int型,一维数组长度
* 返回值:无
*/
void output(int *p, int n){
// 请编程实现本函数
}
/*
* 函数名称:moveToRight
* 函数功能:使一维数组各元素向右循环移动m个位置
* 形式参数:p,int型指针变量,一维整型数组首地址
* 形式参数:length,int型,一维数组长度
* 形式参数:m,int型,循环移动的位置数
* 返 回 值:无
*/
void moveToRight(int *p, int length, int m){
// 请编程实现本函数
}
/*
* 函数名称:moveToLeft
* 函数功能:使一维数组各元素向左循环移动m个位置
* 形式参数:p,int型指针变量,一维整型数组首地址
* 形式参数:length,int型,一维数组长度
* 形式参数:m,int型,循环移动的位置数
* 返 回 值:无
*/
void moveToLeft(int *p, int length, int m){
// 请编程实现本函数
}
/*
* 函数名称:move
* 函数功能:使一维数组元素循环向左或向右移动m个位置
* 形式参数:p,int型指针变量,一维整型数组首地址
* 形式参数:length,int型,一维数组长度
* 形式参数:m,int型,表示循环移动的方向和移动的位置个数
* 当m>0时,执行向右循环移动(水平方向从左向右循环移动)
* 当m=0时,不做任何移动
* 当m<0时,执行向左循环移动(水平方向从右向左循环移动)
* 返 回 值:无
*/
void move(int *p, int length, int m){
if(m > 0){
/*向右循环移动*/
moveToRight(p, length, m);
}else if(m == 0){
/*不移动*/
; //空语句,什么都不做
}else{
/*向左循环移动*/
moveToLeft(p, length, m);
}
}
注:不得使用全局变量。
【输入形式】
有两行输入,第1行输入为数组元素赋值,第2行输入为m赋值
【输出形式】
有一行输出,输出循环移动后的数组各元素值
【样例输入】
1 2 3 4 5 6 7 8 9 10
3
【样例输出】
8 9 10 1 2 3 4 5 6 7
【样例输入】
1 2 3 4 5 6 7 8 9 10
-3
【样例输出】
4 5 6 7 8 9 10 1 2 3
【样例说明】
无
【评分标准】
正确性
/*
@Filename: ex605.c
@Author:
@Version: 1.0
@Date: 2021-03-18
@Description: Loopy Moving of Array Element
*/
#include <stdio.h>
#include <stdlib.h>
#define LENGTH 10
/*主函数*/
int main(void){
/*声明函数*/
void input(int *p, int n);
void output(int *p, int n);
void move(int *p, int length, int m);
/*定义数据结构*/
int a[LENGTH], m;//m表示数组元素循环移动的位置个数
int *p = a;
/*调用input函数,通过键盘输入为数组a赋值*/
input(p, LENGTH);
/*从键盘输入为循环移动位置个数m赋值*/
scanf("%d", &m);
/*调用move函数,完成数组元素的循环移动*/
move(p, LENGTH, m);
/*调用output函数,输出移动后的数组元素*/
output(p, LENGTH);
return 0;
}
/*
* 函数名称:input
* 函数功能:通过键盘输入为一维数组元素赋值
* 输入格式:各输入数据之间以空格分隔
* 形式参数:p,int型指针变量,一维整型数组首地址
* 形式参数:n,int型,一维数组长度
* 返回值:无
*/
void input(int *p, int n){
// 请编程实现本函数
int i; for(i=0;i<n;i++) scanf("%d ",p++);
}
/*
* 函数名称:output
* 函数功能:向屏幕打印输出一维数组元素值
* 输出格式:各输出数据之间以空格分隔
* 形式参数:p,int型指针变量,一维整型数组首地址
* 形式参数:n,int型,一维数组长度
* 返回值:无
*/
void output(int *p, int n){
// 请编程实现本函数
int i; for(i=0;i<n;i++) printf("%d ",*p++);
}
/*
* 函数名称:moveToRight
* 函数功能:使一维数组各元素向右循环移动m个位置
* 形式参数:p,int型指针变量,一维整型数组首地址
* 形式参数:length,int型,一维数组长度
* 形式参数:m,int型,循环移动的位置数
* 返 回 值:无
*/
void moveToRight(int *p, int length, int m){
// 请编程实现本函数
int b[m],a[m]; int i; for(i=0;i<m;i++) { //1 2 3 4 5 6__2__5 6 1 2 3 4 b[i]=*(p+i+length-m); a[i]=b[i]; } for(i=0;i<(length-m);i++); *(p+i+m)=*(p+i); for(i=0;i<m;i++) *(p+i)=a[i];
}
/*
* 函数名称:moveToLeft
* 函数功能:使一维数组各元素向左循环移动m个位置
* 形式参数:p,int型指针变量,一维整型数组首地址
* 形式参数:length,int型,一维数组长度
* 形式参数:m,int型,循环移动的位置数
* 返 回 值:无
*/
void moveToLeft(int *p, int length, int m){
// 请编程实现本函数
int b[-m]; int a[-m]; int i; for(i=0;i<-m;i++) //1 2 3 4 5 6 __-2__3 4 5 6 1 2 { b[i]=*(p+i); a[i]=b[i]; } for(i=0;i<(length+m);i++); *(p+i)=*(p+i-m); for(i=0;i<-m;i++) *(p+i+length+m)=a[i];
}
/*
* 函数名称:move
* 函数功能:使一维数组元素循环向左或向右移动m个位置
* 形式参数:p,int型指针变量,一维整型数组首地址
* 形式参数:length,int型,一维数组长度
* 形式参数:m,int型,表示循环移动的方向和移动的位置个数
* 当m>0时,执行向右循环移动(水平方向从左向右循环移动)
* 当m=0时,不做任何移动
* 当m<0时,执行向左循环移动(水平方向从右向左循环移动)
* 返 回 值:无
*/
void move(int *p, int length, int m){
if(m > 0){
/*向右循环移动*/
moveToRight(p, length, m);
}else if(m == 0){
/*不移动*/
; //空语句,什么都不做
}else{
/*向左循环移动*/
moveToLeft(p, length, m);
}
}
我运行了你的代码,输入1 2 3 4 5 6 7 8 9 10,向右移 2,发现在函数moveToRight有两个问题。
1)for循环语句有多了分号
for(i=0;i<(length-m);i++);
*(p+i+m)=*(p+i);
2)循环顺序错了,导致数据覆盖了。你看下面我运行你的代码打印的中间结果就知道了。应改倒序拷贝数据。
for(i=length-m-1; i>= 0;--i)
p[i+m]=p[i];
ATTENTION: wrong MoveToRight and moveToLeft
#include <stdio.h>
#include <stdlib.h>
#define LENGTH 10
int main(void) {
void input(int *p, int n);
void output(int *p, int n);
void move(int *p, int length, int m);
int a[LENGTH], m;
int *p = a;
printf("Please enter %d integer numbers: ", LENGTH);
input(p, LENGTH);
printf("Please enter steps to move (positive steps to move right; negative steps to move left): ");
scanf("%d", &m);
move(p, LENGTH, m);
printf("After moving %d steps, the array becomes: \n", m);
output(p, LENGTH);
return 0;
}
void input(int *p, int n) {
int i;
for (i = 0; i < n; i++)
scanf("%d", p++);
}
void output(int *p, int n) {
int i;
for (i = 0; i < n; i++)
printf("%d ", *p++);
printf("\n");
}
void moveToRight(int *p, int length, int m) {
int b[m];
int i;
for (i = 0; i < m; i++) {
b[i] = *(p + i + length - m);
}
printf("array b, length %d:\n", m);
output(b, m);
for (i = 0; i < (length - m); i++)
*(p + i + m) = *(p + i);
printf("array p, after moving %d elements: \n", length - m);
output(p, length);
for (i = 0; i < m; i++)
*(p + i) = b[i];
printf("array p, after moving %d elements: \n", length - m);
output(p, length);
}
void moveToLeft(int *p, int length, int m) {
int b[-m];
int a[-m];
int i;
for (i = 0; i < -m; i++) {
b[i] = *(p + i);
a[i] = b[i];
}
for (i = 0; i < (length + m); i++)
*(p + i) = *(p + i - m);
for (i = 0; i < -m; i++)
*
(p + i + length + m) = a[i];
}
void move(int *p, int length, int m) {
if (m > 0) {
moveToRight(p, length, m);
} else if (m == 0) {
;
} else {
moveToLeft(p, length, m);
}
}
// Output:
Please enter 10 integer numbers: 1 2 3 4 5 6 7 8 9 10
Please enter steps to move (positive steps to move right; negative steps to move left): 2
array b, length 2:
9 10
array p, after moving 8 elements:
1 2 1 2 1 2 1 2 1 2
array p, after moving 8 elements:
9 10 1 2 1 2 1 2 1 2
After moving 2 steps, the array becomes:
9 10 1 2 1 2 1 2 1 2
更正了 moveToRight 函数后的代码和运行结果。moveToLeft 仍然待更正。
// Corrected moveToRight. Wrong moveToLeft
#include <stdio.h>
#include <stdlib.h>
#define LENGTH 10
int main(void) {
void input(int *p, int n);
void output(int *p, int n);
void move(int *p, int length, int m);
int a[LENGTH], m;
int *p = a;
printf("Please enter %d integer numbers: ", LENGTH);
input(p, LENGTH);
printf("Please enter steps to move (positive steps to move right; negative steps to move left): ");
scanf("%d", &m);
move(p, LENGTH, m);
printf("After moving %d steps, the array becomes: \n", m);
output(p, LENGTH);
return 0;
}
void input(int *p, int n) {
int i;
for (i = 0; i < n; i++)
scanf("%d", p++);
}
void output(int *p, int n) {
int i;
for (i = 0; i < n; i++)
printf("%d ", *p++);
printf("\n");
}
void moveToRight(int *p, int length, int m) {
int b[m];
int i;
for (i = 0; i < m; i++) {
b[i] = *(p + i + length - m);
}
printf("array b, length %d:\n", m);
output(b, m);
for(i = length-m-1; i >= 0; --i)
p[i+m]=p[i];
printf("array p, after moving %d elements: \n", length - m);
output(p, length);
for (i = 0; i < m; i++)
*(p + i) = b[i];
printf("array p, after moving %d elements: \n", length - m);
output(p, length);
}
void moveToLeft(int *p, int length, int m) {
int b[-m];
int a[-m];
int i;
for (i = 0; i < -m; i++) {
b[i] = *(p + i);
a[i] = b[i];
}
for (i = 0; i < (length + m); i++)
*(p + i) = *(p + i - m);
for (i = 0; i < -m; i++)
*
(p + i + length + m) = a[i];
}
void move(int *p, int length, int m) {
if (m > 0) {
moveToRight(p, length, m);
} else if (m == 0) {
;
} else {
moveToLeft(p, length, m);
}
}
// Output
Please enter 10 integer numbers: 1 2 3 4 5 6 7 8 9 10
Please enter steps to move (positive steps to move right; negative steps to move left): 2
array b, length 2:
9 10
array p, after moving 8 elements:
1 2 1 2 3 4 5 6 7 8
array p, after moving 8 elements:
9 10 1 2 3 4 5 6 7 8
After moving 2 steps, the array becomes:
9 10 1 2 3 4 5 6 7 8
另外注意代码缩进,提高可读性。
moveToLeft\的餐宿 m 是负数,容易误解。这些函数的数组大小和一定步数,除了函数move的步数,都应该用参数类型unsigned int,避免发生误解。