- 论坛徽章:
- 0
|
5可用积分
有一道习题的一个工序是这样的,利用伪随机数发生器造一个20×30的二维数组,先将数组分行打印到屏幕然后对其进行调整。调整的要求是如果数组中任何一个元素与其邻近元素之间的差的绝对值大于1的话就将该元素的值换成其邻近元素的平均值的整数部分并在屏幕上打印调整后的数组。所谓“邻近元素”指的是该元素上下左右的四个元素,当然处于边缘地带的元素的邻近元素也许是三个或者两个。我做了一个程序来实现,但后来发现有问题,即有的元素即使与其邻近元素的差的绝对值大于1了但该元素并没有被改变成其邻近元素的平均值,甚至调整后的数组与原数组除了第一行有了变化之外似乎其他的行根本没有变化。谢谢!我的代码如下:
注:下面代码中所有单个出现二维数组下标的“[j]”其实都本来应该是“i”和“[j]”在一起的,但复制到这里的代码框之后就变成了显示单个“[j]”了。
[code=c]
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <conio.h>
#define ROWS 20
#define COLS 30
int main(void){
int numbers[ROWS][COLS] = {0};
int i,j;
srand((unsigned) time(NULL));
printf("\nBefore fiddling: \n");
for(i = 0; i < ROWS; i++){
for(j = 0; j < COLS; j++){
numbers[j] = rand() % 10; /*产生随机数作为数组元素*/
printf("%d ",numbers[j]);
}
putchar('\n');
}
for(i = 0; i < ROWS; i++)
for(j = 0; j < COLS; j++){
if(i == 0 && j == 0)
if(abs(numbers[j] - numbers[j+1]) > 1 ||
abs(numbers[j] - numbers[i+1][j]) > 1)
numbers[j] = (int)((numbers[j+1] + numbers[i+1][j])/2.0);
else if(i == 0 && j == COLS - 1)
if(abs(numbers[j] - numbers[j-1]) > 1 ||
abs(numbers[j] - numbers[i+1][j]) > 1)
numbers[j] = (int)((numbers[j-1] + numbers[i+1][j])/2.0);
else if(i == ROWS - 1 && j == 0)
if(abs(numbers[j] - numbers[j+1]) > 1 ||
abs(numbers[j] - numbers[i-1][j]) > 1)
numbers[j] = (int)((numbers[j+1] + numbers[i-1][j])/2.0);
else if(i == ROWS -1 && j == COLS -1)
if(abs(numbers[j] - numbers[j-1]) > 1 ||
abs(numbers[j] - numbers[i-1][j]) > 1)
numbers[j] = (int)((numbers[j-1] + numbers[i-1][j])/2.0);
else if(i == 0 && j > 0 && j < COLS - 1)
if(abs(numbers[j] - numbers[j-1]) > 1 ||
abs(numbers[j] - numbers[j+1]) > 1 ||
abs(numbers[j] - numbers[i+1][j]) > 1)
numbers[j] = (int)((numbers[j-1] + numbers[j+1]
+ numbers[i+1][j])/3.0);
else if(i > 0 && i < ROWS - 1 && j == COLS - 1)
if(abs(numbers[j] - numbers[i-1][j]) > 1 ||
abs(numbers[j] - numbers[i+1][j]) > 1 ||
abs(numbers[j] - numbers[j-1]) > 1)
numbers[j] = (int)((numbers[i-1][j] + numbers[i+1][j]
+ numbers[j-1])/3.0);
else if(i == ROWS - 1 && j > 0 && j < COLS - 1)
if(abs(numbers[j] - numbers[j-1]) > 1 ||
abs(numbers[j] - numbers[j+1]) > 1 ||
abs(numbers[j] - numbers[i-1][j]) > 1)
numbers[j] = (int)((numbers[j-1] + numbers[j+1]
+ numbers[i-1][j])/3.0);
else if(i > 0 && i < ROWS - 1 && j == 0)
if(abs(numbers[j] - numbers[i+1][j]) > 1 ||
abs(numbers[j] - numbers[i-1][j]) > 1 ||
abs(numbers[j] - numbers[j+1]) > 1)
numbers[j] = (int)((numbers[i+1][j] + numbers[i-1][j]
+ numbers[j+1])/3.0);
else
if(abs(numbers[j] - numbers[j-1]) > 1 ||
abs(numbers[j] - numbers[j+1]) > 1 ||
abs(numbers[j] - numbers[i-1][j]) > 1 ||
abs(numbers[j] - numbers[i+1][j]) > 1)
numbers[j] = (int)((numbers[j-1] + numbers[j+1]
+ numbers[i-1][j] + numbers[i+1][j])/4.0);
}
printf("\nAfter fiddling: \n");
for(i = 0; i < ROWS; i++){
for(j = 0; j < COLS; j++)
printf("%d ",numbers[j]);
putchar('\n');
}
puts("\nDone!");
getch();
return 0;
}
[ 本帖最后由 mcmay 于 2008-1-27 10:34 编辑 ] |
|