| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1067 人关注过本帖
标题:代码中的for()函数,每轮循环是否成功赋值给point[a][b].areacount
只看楼主 加入收藏
Vephoo
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2022-2-23
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:5 
代码中的for()函数,每轮循环是否成功赋值给point[a][b].areacount
        //两个for()循环遍历point[a][b]所有的点,并计算每个点的point[a][b].areacount值
        for (int a = 0; a < 188; a++)
        {
            for (int b = 0; b < 132; b++)
            {
                //每次计算areacount值前必须先置0;
                if (point[a][b].areacount != 0)
                    point[a][b].areacount = 0;

                //寻找点point[a][b]周围符合point[k][K].color == 1的点,若符合则point[a][b].areacount的值加1
                int k = a - 1, K = b - 1;
                for (k; k <= a + 1; k++)
                {
                    for (K; K <= b + 1; K++)
                    {
                        if ( (!(k == a && K == b)==1)  &&  (k >= 0 && k <= 187 && K >= 0 && K <= 131)  &&  (point[k][K].color == 1) )
                            point[a][b].areacount += 1;
                    }
                }

            }
        }

代码中的for()函数,每轮循环是否正确赋值给point[a][b].areacount,有没有其它更优的实现方法。谢谢。
搜索更多相关主题的帖子: 赋值 for point 循环 代码 
2022-02-23 14:23
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:3 
每轮循环是否正确赋值给point[a][b].areacount
? 自己测试一下不就知道了嘛

有没有其它更优的实现方法
你这个算法,设置每个点的areacount,都需要读取周围8个点的color值。
如果改为每遇到一个color==1的点,就给其周围8个点的areacount加一的话,可以少处理一些数据(因为不是所有点的color都等于1)
2022-02-23 15:06
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:3 
                if (point[a][b].areacount != 0)
                    point[a][b].areacount = 0;
                ……

每轮循环是否正确赋值给point[a][b].areacount
难说,因为这取决于之前 point[a][b].areacount 有没有被初始化或赋值。
你的
if (point[a][b].areacount != 0)
    point[a][b].areacount = 0;
这段代码给 Google 当年的 string bug 一模一样。
读取一个未初始化或赋值的变量属于未定义行为。
2022-02-23 15:11
Vephoo
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2022-2-23
收藏
得分:0 
回复 2楼 rjsp
多谢大佬指导!刚刚取point[1][1]周围的点赋初值测试了一下,结果不对。。不知道是边界问题,还是实现的逻辑有误,我还得再看看。
if ( (!(k == a && K == b)==1)  &&  (k >= 0 && k <= 187 && K >= 0 && K <= 131)  &&  (point[k][K].color == 1) )
 point[a][b].areacount += 1
这里是根据任一点周围八个的点的point[a][b].color值,计算point[a][b].areacount的值。周围每有一个点的color值为1,则这一点的point[a][b].areacount就加1。
这一行中的三个条件中,第一个条件的位置不讲究,但是第二个条件应是第三个的先决条件,因为如果a和b是临界值的话,point[k][K]可能不存在。
那如果将第三个条件置于第二个的之前会引发什么后果吗?
另外这三个条件是嵌套关系或是并列关系会有什么不同?
2022-02-23 17:44
Vephoo
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2022-2-23
收藏
得分:0 
回复 3楼 rjsp
哈哈,忘了!  定义结构体以及这一步开始前,确实还没有给point[a][b].areacount赋初值。
不知道结构体里面直接int point[a][b].areacount = 0行不。。。
如果不行我就只会用两个for循环逐个赋值了,还有其它方法吗
2022-02-23 17:49
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9025
专家分:54030
注 册:2011-1-18
收藏
得分:4 
程序代码:
#include <stdio.h>

typedef struct {
    int color;
    int areacount;
} Point;

void foo( size_t row, size_t col, Point pts[row][col] )
{
    for( size_t r=0; r!=row; ++r )
    {
        for( size_t c=0; c!=col; ++c )
        {
            int tmp = 0;
            for( size_t v=(r==0?0:r-1); v<=(r+1==row?r:r+1); ++v )
                for( size_t h=(c==0?0:c-1); h<=(c+1==col?c:c+1); ++h )
                    tmp += (pts[v][h].color==1);
            pts[r][c].areacount = tmp - (pts[r][c].color==1);
        }
    }
}

void bar( size_t row, size_t col, Point pts[row][col] )
{
    for( size_t r=0; r!=row; ++r )
        for( size_t c=0; c!=col; ++c )
            pts[r][c].areacount = 0;

    for( size_t r=0; r!=row; ++r )
    {
        for( size_t c=0; c!=col; ++c )
        {
            if( pts[r][c].color == 1 )
            {
                for( size_t v=(r==0?0:r-1); v<=(r+1==row?r:r+1); ++v )
                    for( size_t h=(c==0?0:c-1); h<=(c+1==col?c:c+1); ++h )
                        if( v!=r || h!=c )
                            ++pts[v][h].areacount;
            }
        }
    }
}

#include <stdlib.h>

int main( void )
{
    Point pts[4][5];
    const size_t row = sizeof(pts)/sizeof(*pts);
    const size_t col = sizeof(*pts)/sizeof(**pts);
    //for( ; ; )
    {
        for( size_t r=0; r!=row; ++r )
            for( size_t c=0; c!=col; ++c )
                pts[r][c].color = rand()/(RAND_MAX+1.0) * 2;

        puts( "原矩阵 color 值:" );
        for( size_t r=0; r!=row; ++r )
            for( size_t c=0; c!=col; ++c )
                printf( "%d%c", pts[r][c].color, " \n"[c+1==col] );

        puts( "使用函数 foo 求 areacount 矩阵:" );
        foo( row, col, pts );
        for( size_t r=0; r!=row; ++r )
            for( size_t c=0; c!=col; ++c )
                printf( "%d%c", pts[r][c].areacount, " \n"[c+1==col] );

        puts( "使用函数 bar 求 areacount 矩阵:" );
        bar( row, col, pts );
        for( size_t r=0; r!=row; ++r )
            for( size_t c=0; c!=col; ++c )
                printf( "%d%c", pts[r][c].areacount, " \n"[c+1==col] );
    }
}


一种可能的输出是:
原矩阵 color 值:
1 0 1 1 1
0 0 1 0 1
0 1 0 1 1
1 1 1 0 1
使用函数 foo 求 areacount 矩阵:
0 3 2 4 2
2 4 4 7 4
3 4 5 5 3
2 3 3 4 2
使用函数 bar 求 areacount 矩阵:
0 3 2 4 2
2 4 4 7 4
3 4 5 5 3
2 3 3 4 2
2022-02-23 20:41
快速回复:代码中的for()函数,每轮循环是否成功赋值给point[a][b].areacount
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.054951 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved