| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3385 人关注过本帖
标题:求助!!!谭浩强的c语言教材上一道魔方阵的习题!!(答案错!)
只看楼主 加入收藏
阎魔瞳
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-12-2
收藏
 问题点数:0 回复次数:13 
求助!!!谭浩强的c语言教材上一道魔方阵的习题!!(答案错!)
谭浩强的C程序设计第3版习题7.7答案错,得不到正确结果。
以下是我自己所编的程序,但结果也不对,我也查不出错误,请大家帮忙指正。
题目:输出魔方阵,所谓魔方阵是指这样的方阵,它的每一行、每一列和对角线之和均相等。例如,三阶魔方阵为
8 1 6
3 5 7
4 9 2
要求输出由1~n*n之间的自然数构成的魔方阵(n为奇数)
分析:
魔方阵中各数的排列规律如下:
1、将1放在第一行中间一列;
2、从2开始直到n*n止各数依次按下列规则存放:每一个数存放的行比前一个数的行数减一,列数加一(例如上面的三阶魔方阵,5在4的上一行
后一列);
3、如果上一行的行数为1,则下一个数的行数为n(指最下一行)。例如,1在第1行,则2应放在最下一行,列数同样加1;
4、当上一个数的列数为n时,下一个数的列数应为1,行数减1。例如,2在第3行最后一列,则3应放在第2行第1列;
5、如果按照上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。例如,按上面的规定,4应该放
在第1行第二列,但该位置已被1占据,所以4就放在3的下面。由于6是第1行第3列(即最后一列),故7放在6下面。
按此方法可以得到任何阶的魔方阵。
我写的程序:
#include<stdio.h>
void main()
{
int l,m,k,j=1,n,temp1,temp2,flag1=0,flag2=0,i=1,a[16][16];
scanf("%d",&n);
j=n/2+1;
for(l=1;l<=n;l++)
for(m=1;m<=n;m++)
a[l][m]=0;
a[1][j]=1;
for(k=2;k<=n*n;k++)
{
if(i==1){temp1=i;i=n+1;flag1=1;}
if(j==n){temp2=j;j=0;flag2=2;}
if(a[i-1][j+1]==0)
{
a[i-1][j+1]=k;
i=i-1;j=j+1;
}
else
{
if(flag1==0&&flag2==0)
{
if(i==n)i=0;a[i+1][j]=k;i=i+1;
}
if(flag1==1&&flag2==2)
{
a[temp+1][temp2]=k;
i=temp+1;j=temp2;
}
if(flag1==1&&flag2==0)
{
a[temp1+1][j]=k;
i=temp1+1;flag1=0;
}
if(flag1==0&&flag2==2)
{
if(i==n)i=0;
a[i+1][temp2]=k;j=temp2;flag2=0;
}
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%d\t",a[i][j]);
printf("\n")
}
}

程序到此结束,但执行不出正确结果。尽管我写的程序繁琐,但我仍想知道为什么结果不对呢?

[[italic] 本帖最后由 阎魔瞳 于 2007-12-2 01:17 编辑 [/italic]]
搜索更多相关主题的帖子: 谭浩强 魔方 c语言 习题 教材 
2007-12-02 00:51
zbqf109
Rank: 1
等 级:新手上路
帖 子:289
专家分:0
注 册:2006-12-31
收藏
得分:0 
有意思
明天看这个

不过现在学习C语言,最好不要看老谭的书
2007-12-02 01:37
zbqf109
Rank: 1
等 级:新手上路
帖 子:289
专家分:0
注 册:2006-12-31
收藏
得分:0 
啊,好累。你写的程序(还是老谭写的?)我就不看了,单看算法,随便凑出一个来,
3×3的矩阵没有问题,其它的就不知道了。
我看了一下,这个算法好像是生成奇数阶矩阵的算法,偶数阶矩阵是另外的算法。
程序代码:
 
#include <stdio.h>
#include <stdlib.h>
#define MAX_NUM 5
int main()
{
    int rows = 0, center = 0, iArray[MAX_NUM][MAX_NUM];
    int RowSet = 0, LineSet = 0, newRowSet = 0, newLineSet = 0;
    int i = 0, j = 0;
    int okNum = 0;
    
    // set the items of array "iArray" to be 0
    for ( i = 0; i < MAX_NUM; i++ )
        for ( j = 0; j < MAX_NUM; j++ )
            iArray[i][j] = 0;
    
    // get the rows number
    while ( 1 )
    {
        printf("输入行数:\n");
        scanf("%d", &rows);
        if ( rows <= MAX_NUM )
        {
                rows -= 1;
                break;
        }
        else {
             printf("行数必须在 0 和 %d 之间, 请重新", MAX_NUM);
        }
    }    
    
    // set number '1'
    center = rows / 2;
    iArray[0][center] = 1;
    
    // initialize the okNum, RowSet and LineSet
    okNum = 1;
    RowSet = 0;
    LineSet = center;
    
    // set each item in "iArray"
    while ( okNum < (rows + 1) * (rows + 1) )
    {
          if ( RowSet == 0 && LineSet == rows )
          {
               RowSet += 1;
          }
          else {
                    newRowSet = (RowSet == 0) ? rows : RowSet - 1;
                    newLineSet = (LineSet == rows) ? 0 : LineSet + 1;          
          
                   if ( iArray[newRowSet][newLineSet] != 0 )
                   // there is already a number here!
                   {
                            RowSet = (RowSet == rows) ? 0 : RowSet + 1;
                            //RowSet += 1;
                   }
                   else{
                            RowSet = newRowSet;
                            LineSet = newLineSet;
                   }
          }
          
          iArray[RowSet][LineSet] = ++okNum;
    }
    
    // print the "iArray"
    for ( i = 0; i <= rows; i++ )
    {
        for ( j = 0; j <= rows; j++ )
            printf("%5d", iArray[i][j]);
        printf("\n");
    }
        
    system("pause");
    return 0;
} 


[[italic] 本帖最后由 zbqf109 于 2007-12-2 09:38 编辑 [/italic]]
2007-12-02 02:25
阎魔瞳
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-12-2
收藏
得分:0 
谢谢啊,麻烦你了
不过我们现在才上到第七章数组,函数啥的还没上,看你写的这个有点云里雾里,但还是努力看看吧。
上面的程序是我自己写的,一看就是初学者的呢
谭浩强的答案倒是简单,但它是乱写的???!晕死

中科大铁杆fans
2007-12-02 10:28
阎魔瞳
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-12-2
收藏
得分:0 
哇噻!好强!但是我有几个问题不懂,还想请教一下:
1、system("pause");
     return 0;
这句是作什么用的?我运行时把它删去结果也是正确的,为什么要加这句话?system 和 return我还没学,麻烦说清楚一点。
2、为什么main函数要定义为整型?我们一般写的都是void。
3、这样的程序算很简单吗?我花了大半天才写了个错的程序出来,只有部分算法思路还对.....还有现在发现谭叔的书真的....变量都用abcdef....晕死,自己写的都看不懂了。

[[italic] 本帖最后由 阎魔瞳 于 2007-12-2 11:50 编辑 [/italic]]

中科大铁杆fans
2007-12-02 11:42
阎魔瞳
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-12-2
收藏
得分:0 
对对,我发现你对各种语句应用很灵活,像我逮着个for和if就不知道用别的了。
这能怪老谭吗?唉.....

中科大铁杆fans
2007-12-02 11:44
zbqf109
Rank: 1
等 级:新手上路
帖 子:289
专家分:0
注 册:2006-12-31
收藏
得分:0 
system("pause");
是希望在程序退出之前看到结果
return 0;
是配合int main(),返回0表示main函数顺利执行完成,可参考exit函数

去掉这两行当然不会错

如果学习C语言,两个建议:
1、抛弃老谭的教程;
2、抛弃TC。
2007-12-02 11:48
阎魔瞳
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2007-12-2
收藏
得分:0 
哎?那应该用什么书、什么工具呢?是我们老师叫用这个的,而且很多人都用turbo啊

中科大铁杆fans
2007-12-02 11:54
zbqf109
Rank: 1
等 级:新手上路
帖 子:289
专家分:0
注 册:2006-12-31
收藏
得分:0 
看老外的教材
看不懂原版,看翻译版也比老谭的要好
老谭的书和TC都是古董了,根本不支持现在的标准
2007-12-02 12:33
编程比卡超
Rank: 1
等 级:新手上路
帖 子:86
专家分:0
注 册:2007-7-27
收藏
得分:0 
书的话可以看下视频,或者其他的一些书,有很多书都是很好的!
编译器还是VC的好,打起来又有手感,又顺畅,不像TC,那种DOC系统就感觉像龟一样的慢,虽然不是真的慢!

2007-12-03 13:39
快速回复:求助!!!谭浩强的c语言教材上一道魔方阵的习题!!(答案错!)
数据加载中...
 
   



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

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