免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2557 | 回复: 1

[C] [讨论]二维数组元素调整问题 [复制链接]

论坛徽章:
0
发表于 2008-01-27 10:14 |显示全部楼层
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 编辑 ]

论坛徽章:
0
发表于 2008-01-27 21:22 |显示全部楼层
1. 首先,你的程序中存在一个严重错误:else if与最近的if匹配,所以你的程序中需要加一些{}对把内嵌if包起来
2. 你的程序中先改变的数组元素会影响后面改变的元素,而你的要求中并没有对此进行明确,对数组的不同遍历顺序会得到不同的结果。是不是应该用新的数组存储结果?(这样结果只与初始状态有关,而与数组遍历顺序无关)否则,由于数组在遍历过程中更新,先前做的判断在更新过程中可能无效,那么这个过程就复杂了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP