问莽
2021-05-22 18:34
采纳率: 100%
浏览 19

C语言数位转移输出错误

#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);
                
        }
}

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

2条回答 默认 最新

  • benbenli 2021-05-22 19:28
    已采纳

    我运行了你的代码,输入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 

    另外注意代码缩进,提高可读性。

    已采纳该答案
    评论
    解决 1 无用
    打赏 举报
  • benbenli 2021-05-22 19:33

    moveToLeft\的餐宿 m 是负数,容易误解。这些函数的数组大小和一定步数,除了函数move的步数,都应该用参数类型unsigned int,避免发生误解。

    评论
    解决 1 无用
    打赏 举报

相关推荐 更多相似问题