【问题标题】:How to shift the rows in a 4x5 matrix left by 2 elements如何将 4x5 矩阵中的行左移 2 个元素
【发布时间】:2012-11-28 00:45:39
【问题描述】:

给定一个数组 p[5],编写一个函数将其循环左移两个位置。因此,如果 p[0] = 15, p[1]= 30, p[2] = 28, p[3]= 19 和 p[4] = 61 那么在移位 p[0] = 28 之后,p[ 1] = 19, p[2] = 61, p[3] = 15 和 p[4] = 30。为 (4 x 5 ) 矩阵调用此函数并将其行左移 2。

下面是我到目前为止的代码,但它不起作用。问题在于,由于辅助函数需要一个参数int *,它不会在主函数中使用数组,因此它做的不对。虽然它编译得很好。

#include<stdio.h>

void moveLeft2(int p[5])
{
    int temp1 = p[0];
    int temp2 = p[1];

    for(int i = 0; i <  5 - 2; i++)
    {
        p[i] = p[i + 2];
    }

    p[3] = temp1;
    p[4] = temp2;
}

int main()
{
    int p[4][5] = {
        {15,30,28,19,61},
        {1,2,3,4,5},
        {6,7,8,9,20},
        {11,12,13,14,15}};
    int i;

    moveLeft2(p);
    return 0;
}

有人可以帮忙吗?

【问题讨论】:

  • 它有什么问题?编译错误?数组中有什么?定义问题。
  • 您具有移动/旋转一行的功能。循环遍历行并自行移动每个行。
  • 问题在于,由于辅助函数接受了一个参数 int *,所以它没有在主函数中接受数组,因此它做的不对。不过它编译得很好。

标签: c arrays matrix


【解决方案1】:
void moveLeft2(int p[5])

那个声明实际上是一个谎言。这是什么意思

void moveLeft2(int *p)

即传递给moveLeft2 的参数应该是指向int 的指针。该实现假定指针指向的内存块大到足以容纳五个ints,这不是由类型强制执行的,因此是不安全的,但这里重要的一点是函数参数必须具有int* 类型。

如果你有

int row[5] = {1,2,3,4,5};
moveLeft2(row);

即使在最高警告级别,编译器也不会发出警告。这是因为数组在传递给函数时会转换为指向其第一个元素的指针(以及在大多数其他上下文中;数组转换为指向其第一个元素的指针作为sizeof 的参数、_Alignof&amp; [地址] 运算符)。所以传递的参数正是需要的类型。

声明

int p[4][5] = {...};

p 声明为一个由4 个数组组成的数组,每个数组有5 个ints。 p[0] 是这些int[5] 中的第一个,所以

moveLeft2(p[0]);

是一个类型正确的函数调用(数组p[0] 被转换为指向其第一个元素的指针,即&amp;p[0][0])。数组p[0]是一个由五个int组成的数组,所以满足moveLeft2实现中的假设,调用不仅类型正确,而且语义正确。

这同样适用于数组(数组)p 的其他行,因此

for(i = 0; i < 4; ++i) {
    moveLeft2(p[i]);
}

移动所有四行,一个接一个。

【讨论】:

    【解决方案2】:

    替换:

    • void moveLeft2(int p[5])void moveLeft2(int *p)
    • moveLeft2(p);moveLeft2(p[i]);
    • moveLeft2(p[i]);之前添加for (i = 0; i &lt; 4; i ++)

    代码:

    #include<stdio.h>
    
    void moveLeft2(int *p)
    {
        int temp1 = p[0];
        int temp2 = p[1];
        int i;
    
    
    
        for(i = 0; i <  5 - 2; i++)
        {
            p[i] = p[i + 2];
        }
    
        p[3] = temp1;
        p[4] = temp2;
    }
    
    int main()
    {
        int p[4][5] = {
            {15,30,28,19,61},
            {1,2,3,4,5},
            {6,7,8,9,20},
            {11,12,13,14,15}};
        int i;
    
        for (i = 0; i < 4; i ++)
            moveLeft2(p[i]);
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多