CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

麻烦各位大哥大姐看看小弟得第一次

楼主huangshengcsdn(黄盛)2004-09-03 00:21:44 在 C/C++ / C语言 提问

下面是小弟我第一次完整写的程序(皇后问题),编译说我的二维数组定义错误!!给位帮我看看行吗?  
   
  ***************************************************************************  
  #include<stdio.h>  
   
   
  main()  
  {  
      int   N;  
      int   i,j,m,n,h;  
   
      //输入棋盘的边数  
      printf("input   the   length   of   the   board:");  
      scanf("%D",&N);  
      h=N*N;  
   
      int   p[N][N];  
       
      //初始化棋盘界面,全部设为2  
      for(i=0;i<=N;i++)  
            {for(j=0;j<=N;j++)  
                p[i][j]=2;  
            }  
      //玩家输入第一个皇后的位置  
      printf("input   the   row   in   which   you   want   to   put   the   first   queen:");  
      i=getchar();  
      if(i>=N||i<0)  
          printf("the   unavailible   row");  
           
      printf("input   the   volum   in   which   you   want   to   put   the   first   queen:");  
      j=getchar();  
      if(j>=N||j<0)  
          printf("the   unavailible   volum");  
   
      p[i][j]=0;//用0代表皇后  
   
      //用下面的循环填其他的皇后  
    loop:while(h!=0)  
            {  
                  //找出与皇后同行同列同斜线的格子填上一  
                  for(m=0;m<=N;m++)  
                        {for(n=0;n<=N;n++)  
                                {if(m==i||n==j||m-i==m-j)  
                                    p[m][n]=1;  
                                }  
                        }  
               
                   
                  for(m=0;m<=N;m++)  
                        {for(n=0;n<=N;n++)  
                                {if(m!=i&&n!=j&&m-i!=m-j&&p[m][n]=2)  
                                      {  
                                            p[m][n]=0;//在剩下的格子里找出第一个值为2的格子,并赋值为0(又一个皇后)  
                                            i=m;  
                                            j=n;  
                                            goto   loop;  
                                      }  
                                }  
                        }  
   
   
                  for(m=0;m<=N;m++)  
                        {for(n=0;n<=N;n++)  
                                {if(p[m][n]!=2)  
                                    h--;  
                                }  
                        }  
   
            }  
   
      //打印输出结果  
    for(m=0;m<=N;m++)              
            {for(n=0;n<=N;n++)  
                    printf("%d   ",p[m][n]);  
              printf("\n   ");  
   
            }  
           
  }  
  ************************************************ 问题点数:100、回复次数:12Top

1 楼ma100()回复于 2004-09-03 00:42:43 得分 10

int   p[N][N];N不能动态定义,C语言的书将的很详细了Top

2 楼zhangfjj(小张)回复于 2004-09-03 00:47:37 得分 10

如果仅是二维数组动态定义有问题,其他算法没有问题,坛子里有许多关于使用malloc()来动态申请内存定义动态数组的贴子  
  http://community.csdn.net/Expert/topic/3045/3045196.xml?temp=.4560511Top

3 楼zhangfjj(小张)回复于 2004-09-03 00:50:02 得分 0

兄弟,不要随便说什么我的第一次,好吓人哟!  
   
  @_@Top

4 楼ma100()回复于 2004-09-03 01:00:42 得分 20

 
  参照   小张的帖子,给出申请和释放程序  
  ////////////////////int   p[N][N];  
  //动态二维数组,如果用指针的话,先生成一个一维的指针数组,长度为二维数组的行数,  
  //再动态的生成若干个(等于行数)一维数组(长度为列数),使得指针数组的每个元素指向这些//数组就行了。  
  //申请  
  int   **p;  
   
  p=(int   **)malloc(sizeof(int   *)*N);  
  if(p==NULL)  
  {  
  printf("rows   error!\n");  
  return   0;  
  }  
   
  for(i=0;i<N;i++)  
  {  
  p[i]=(int   *)malloc(sizeof(int)*N);  
  if(p[i]==NULL)  
  {  
  printf("cols   errors!\n");  
  return   0;  
  }  
  }  
   
   
  //释放:for(i=0;i<N;i++)  
        free(p[i]);  
  free(p);  
   
   
   
  //---------语法错误:  
  //初始化棋盘界面,全部设为2  
  for(i=0;i<N;i++)//是   <N     不是<=N  
  {  
  for(j=0;j<N;j++)  
  p[i][j]=2;  
  }  
   
   
  if(m!=i&&n!=j&&m-i!=m-j&&p[m][n]==2)   是==2  
   
  另外强烈建议去掉gotoTop

5 楼sysmanager(坦桔)回复于 2004-09-03 08:28:30 得分 0

我看了你的的第一次.有分给吗?Top

6 楼liushuweixing(AA22)回复于 2004-09-03 08:50:33 得分 10

int   N;就是错的,静态数组,应该#define   N   4动态应该mallocTop

7 楼yjh1982(血精灵)回复于 2004-09-03 08:55:59 得分 0

这种第一次?失望....Top

8 楼improgrammer(无忌)回复于 2004-09-03 09:02:13 得分 30

建议:  
  1   既然第一次,不要考虑太多的“灵活性”,棋盘作成固定8*8的,先把后面的算法搞对再说。搞软件有个从简原则,很重要的。  
   
  2   建议所有运行时的交互式输入改用命令行参数。我建议初学者不要听从教科书的误导,一开始就面临一大堆传统交互式输入函数。小程序、命令行工具型程序用参数更好。  
   
  3   输入值检查存在漏洞:既然已经发现是非法值,应该退出,return   -1   或   exit(-1)   都可以。  
   
  4   如果算法本身没错的话,这里的goto   用法还是可以接受的。但把loop:写到循环体最后一句更整齐(运行效果是一样的)。  
   
  5   把循环体写成一个独立函数,以h为参数(N为全局常数),就可以很舒服地取消goto了。再把整个while()循环和前面的初始化语句写成一个独立函数,就更清晰了。可以舒服地编写测试程序。  
  Top

9 楼improgrammer(无忌)回复于 2004-09-03 09:04:25 得分 10

把IO部分和算法部分分开,也是写程序的一个原则。清晰地分解、隔离。Top

10 楼jade_c(珏)回复于 2004-09-03 09:06:05 得分 10

支持ma100()  
  建议去掉gotoTop

11 楼Lonelywolf1899(プログラマ)回复于 2004-09-03 09:09:03 得分 0

int   N;就是错的,静态数组,应该#define   N   4动态应该malloc  
  -------------------------------------------------------  
  严重同意此观点!Top

12 楼huangshengcsdn(黄盛)回复于 2004-09-03 11:38:02 得分 0

其实还是有很多不明白,不过我慢慢消化啦!!!谢谢各位Top

相关问题

  • 才学C#就要麻烦各位大哥大姐了
  • 麻烦各位大哥大姐,什么地方能mwEdit 0.92a 这个DELPHI组件??
  • 各位大哥、大姐!!!
  • 麻烦各位大哥大姐帮我看看我该如何是好?我给你们磕头了
  • 各位大哥大姐救救我吧。。。。
  • 各位大哥 大姐 救救我吧!
  • 各位大哥大姐救命啊!!!
  • 各位大哥大姐帮帮忙。
  • 各位大姐大哥100分相报
  • 各位大哥大姐,帮个忙!!

关键词

得分解答快速导航

  • 帖主:huangshengcsdn
  • ma100
  • zhangfjj
  • ma100
  • liushuweixing
  • improgrammer
  • improgrammer
  • jade_c

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo