我正在实现一个C程序,使用函数填充一个方形矩阵的螺旋形式。以下是我已经做过的事:
#include <stdio.h>
#include <conio.h>
const N = 5;
int top = 0;
int bottom = N - 1;
int right = 0;
int left = N -1;
int main(){
int z = 1 /*N = 5*/;
int Array[100][100];
while (z <= (N*N))
{
FillRowForward(Array, z);
FillColumnDownward(Array, z);
FillRowBackward(Array, z);
FillColumnUpward(Array, z);
}
printf("Two dimensional array elements: \n");
for (int i = 0; i < N; i++)
{
// printf("\t");
for (int j = 0; j < N; j++)
{
printf("%d \t", Array[i][j]);
}
printf("\n");
}
return 0;
}
/*Definition of functions*/
int FillRowForward(int A[][N], /*int top, int left, int right,*/ int Z)
{
for (int i = right; i <= left; i++)
{
A[top][i] = Z++;
}
}
int FillColumnDownward(int A[][N], /*int top, int bottom, int right,*/ int Z)
{
for (int j = top + 1; j <= bottom; j++)
{
A[j][bottom] = Z++;
}
}
int FillRowBackward(int A[][N], /*int bottom, int left, int right,*/ int Z)
{
for (int i = left - 1; i >= top; i--)
{
A[bottom][i] = Z++;
}
}
int FillColumnUpward(int A[][N], /*int top, int bottom, int right,*/ int Z)
{
for (int j = bottom - 1; j >= top + 1; j--)
{
A[j][left] = Z++;
}
}
第一个函数应该填充第一行(FillRowForward),,下一个函数应该向下填充第一列,以此类推,直到所有矩阵都被填充。但当我运行时,它只显示一个黑色和空白的屏幕。没有输出。这件事需要帮忙!
发布于 2022-01-05 00:51:30
在您开始考虑实际程序正在做什么之前,需要修复此代码中的许多基本问题。我怀疑您正在使用Turbo或类似的一些过时的垃圾,因为这段代码不会在现代标准C中编译。
const N = 5;
不使用隐式int,这应该是const int N = 5;
int bottom = N - 1;
不是一个整数常量表达式,所以这会导致问题。绝对没有理由在文件范围内声明所有这些变量,但是如果您声明了,则需要更改为#define N 5
.int Array[100][100];
)。这样做可能会导致堆栈溢出,这是非常困难和烦人的跟踪。i <= left;
是可疑的。不要像i < left
.left
初始化为N,然后编写循环条件,您可能希望通过指针传递z
,这样调用者就可以知道它是modified.int [][5]
不能以int [100][100]
作为参数,当这些数组“衰变”为指向其第一个元素的指针时,它会导致不兼容的指针类型。通过使用指向VLA的指针并传递数组大小:void function (size_t x, size_t y, int array[x][y])
.来修复这个问题
一旦解决了所有这些基本的C问题,就可以关注实际的算法了。如果您仍然无法使其工作后,修复上述所有,请张贴一个单独的问题与修改后的代码。
发布于 2022-01-03 06:24:17
目前尚不清楚应以何种方式填充该矩阵。我想Z应该一直在增加。如果是这样的话,那么您应该传递/接受z的指针。或者,由于您已经有了一些全局变量,z可能是全局的。
发布于 2022-01-04 09:59:01
主要原因是在主函数int 100中创建的数组类型与单个函数int的参数类型不匹配。但是,您的代码中还有更多的问题。
我建议在C中不要使用本机2D数组,这很麻烦。您可以非常容易地使用一维数组,只需将坐标从x,y转换到i,反之亦然。
下面是重写为1D方法的代码:
#include <stdio.h>
int Get(int a[], int n, int y, int x)
{
return a[y * n + x];
}
void Set(int a[], int n, int y, int x, int z)
{
a[y * n + x] = z;
}
int FillRowForward(int a[], int n, int turn, int z)
{
for (int x = turn; x < n - turn - 1; x++)
Set(a, n, turn, x, z++);
return z;
}
int FillColumnDownward(int a[], int n, int turn, int z)
{
int max = n - turn - 1;
for (int y = turn; y < max; y++)
Set(a, n, y, max, z++);
return z;
}
int FillRowBackward(int a[], int n, int turn, int z)
{
int max = n - turn - 1;
for (int x = max; x > turn; x--)
Set(a, n, max, x, z++);
return z;
}
int FillColumnUpward(int a[], int n, int turn, int z)
{
for (int y = n - turn - 1; y > turn; y--)
Set(a, n, y, turn, z++);
return z;
}
int Spiral(int a[], int n, int z)
{
for (int turn = 0; turn < n / 2; turn++)
{
z = FillRowForward(a, n, turn, z);
z = FillColumnDownward(a, n, turn, z);
z = FillRowBackward(a, n, turn, z);
z = FillColumnUpward(a, n, turn, z);
}
if (n % 2 == 1)
Set(a, n, n / 2, n / 2, z++);
return z;
}
void Print(int a[], int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
printf("%10d", Get(a, n, i, j));
}
printf("\n");
}
}
int main()
{
int N = 5;
int Array[N * N];
Spiral(Array, N, 0);
printf("Two dimensional array elements: \n");
Print(Array, N);
return 0;
}
https://stackoverflow.com/questions/70566957
复制