繁体   English   中英

C:将矩形切成正方形的算法

[英]C: Algorithm to cut rectangle into squares

我尝试从Codewars进行此问题设置,并通过编译器运行我的代码。 这表明存在细分错误,但我不知道我要去哪里。 问题集如下:

下图给出了如何将给定的“真实”矩形切割成正方形的想法(“真实”矩形表示两个尺寸不同)。

[点击这里查看图片]

您可以将此图转换为算法吗?

您将获得两个维度-正整数长度(名为lng的参数)和正整数宽度(名为wdth的参数)。 您将返回一个数组。

我的代码如下:

typedef struct Data Data;
struct Data {
     int *array;
     int sz;
};

Data* sqInRect(int lng, int wdth) {
  Data* ptr = (Data*) malloc(sizeof(Data));
  // if square length == square width
  if(lng == wdth){
    ptr->array = NULL;
    ptr->sz = 0;
    return 1;
  }
  //initialise variables
  int rmdLength,rmdWidth,rmdSmallSquares,rmdLengthTimes,rmdWidthTimes,SIZE,temp=0;

  //assign length to temporary rmd variable
  rmdLength = lng;
  //calc how many squares of side *wdth* inside rect
  while((lng-wdth)>wdth){
    rmdLength -= wdth;
    rmdLengthTimes++;
  }
  rmdLength -= wdth;
  rmdLengthTimes++;
  //assign width to temporary rmdWidth variable
  rmdWidth = wdth;
  //calc how many squares of side *rmdWidth* inside rect (remaining area)
  while(rmdWidth>rmdLength){
    rmdWidth -= rmdLength;
    rmdWidthTimes++;
  }
  rmdWidth -= rmdLength;
  rmdWidthTimes++;
  //calculate final number of remaining squares
  rmdSmallSquares = rmdLength/rmdWidth;
  //calculate SIZE
  SIZE = rmdLengthTimes + rmdWidthTimes + rmdSmallSquares;
  //declaration of array
  int arr[SIZE];
  //for loop to put square values in array
  temp = rmdLengthTimes + rmdWidthTimes;
  for(int i=0;i<rmdLengthTimes;i++){
    arr[i] = wdth;
  }
  for(int j=rmdLengthTimes;j<temp;j++){
    arr[j] = rmdLength;
  }
  for(int k=temp;k<SIZE;k++){
    arr[k]= rmdWidth;
  }
  //get Data* ptr to store array AND size of that array
  ptr->array = arr;
  ptr->sz = SIZE;
  return ptr;
}

如果有人可以跟我澄清我出了问题的地方,我将不胜感激。 我一直在这个问题上停留太久了。 谢谢。

您正在访问arr数组。

arr[i] = wdth;

因为您尚未初始化以下变量;

  int rmdLength,rmdWidth,rmdSmallSquares,rmdLengthTimes,rmdWidthTimes,SIZE,temp=0;

并将它们用作数组的index将导致未定义的行为。

  SIZE = rmdLengthTimes + rmdWidthTimes + rmdSmallSquares;

  for(int k=temp;k<SIZE;k++){
    arr[k]= rmdWidth;
  }

初始化如下。

  int rmdLength=0,rmdWidth=0,rmdSmallSquares=0,rmdLengthTimes=0,rmdWidthTimes=0,SIZE=0,temp=0;

您在下面的行中有许多未初始化的变量:

  int rmdLength,rmdWidth,rmdSmallSquares,rmdLengthTimes,rmdWidthTimes,SIZE,temp=0;

注意:上一行不会将所有变量初始化为0 它只会将temp初始化为0

要将所有变量初始化为0 ,必须先声明它们,然后像​​这样初始化它们:

int rmdLength, rmdWidth, rmdSmallSquares, rmdLengthTimes, rmdWidthTimes, SIZE, temp;  
rmdLength = rmdWidth = rmdSmallSquares = rmdLengthTimes = rmdWidthTimes = SIZE = temp = 0;

使用未初始化的变量会导致未定义的行为:
从未初始化变量在线cpp参考中

未初始化变量中的值可以是任何值–不可预测,并且每次运行程序时都可能不同。 读取未初始化变量的值是未定义的行为 -这始终是一个坏主意。 必须先使用一个值对其进行初始化,然后才能使用它。

另外,在下面的代码中,您将使用未初始化的变量rmdLengthTimes作为对数组进行迭代的检查:

 for(int i=0;i<rmdLengthTimes;i++){
    arr[i] = wdth;
  }

这将导致访问超出范围的内存地址,这也是一个未定义的行为:

维基

在某些情况下,某些编程语言(最著名的是C和C ++)的行为是不确定的 在这些语言的标准中,某些操作的语义被描述为未定义。 这些情况通常表示代码中的明确错误, 例如,在其bounds之外索引数组

因此,在使用它们之前正确初始化所有变量将解决您的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM