| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1563 人关注过本帖
标题:一个c程序难题程序期待高手优化(程序我已写好)
只看楼主 加入收藏
liqingyulipeng
Rank: 1
等 级:新手上路
帖 子:63
专家分:3
注 册:2008-10-11
结帖率:77.78%
收藏
 问题点数:0 回复次数:14 
一个c程序难题程序期待高手优化(程序我已写好)
望高手在看完小弟的程序后能优化,使程序更精炼!!
题目:打印一个 N*N的方阵,N为每边字符的个数(3<N<20),要求最外层为“X”,第二层为“Y”,从第三层起每次依次打印数字0,1,2,3……
例如:当N=5时
X X X X X
X Y Y Y X
X Y 0 Y X
X Y Y Y X
X X X X X

程序:
#include <stdio.h>
#include <memory.h>

#define N 5//本程序构造并打印的方阵的边长为5
void small_partition(char a[N][N]);
void Print_Array(char a[N][N]);
void Copy(char a[N][N]);
/****************************************
*函数:int main(int argc,char *argv[])
*功能:构造方阵并打印
*****************************************/
int main(int argc,char *argv[])
{
    char a[N][N];//N*N方阵
    memset(a,0,N*N);
    small_partition(a);
    Copy(a);
    Print_Array(a);
    return 0;

}
/****************************************
*函数:void small_partition(char a[N][N])
*功能:构造方阵的八分之一
*说明:构造出的八分之一位于左上角
*****************************************/
void small_partition(char a[N][N])
{
    int i = 0;//行
    int j = 0;//列

    if(N%2 == 0)//偶数
    {
        for(j=0; j<N/2; j++)
        {
            a[0][j] = 'X';
        }
        for(j=1; j<N/2; j++)
        {
            a[1][j] = 'Y';
        }
        if(N>4)
        {
            char number = '0';
            for(i=2; i<N/2; i++)
            {
                for(j=i; j<N/2; j++)
                {
                    a[i][j] = number;
                }
                number++;
            }
        }
    }
    else//奇数
    {
        for(j=0; j<N/2+1; j++)
        {
            a[0][j] = 'X';
        }
        for(j=1; j<N/2+1; j++)
        {
            a[1][j] = 'Y';
        }
        if(N>4)
        {
            char number = '0';
            for(i=2; i<N/2+1; i++)
            {
                for(j=i; j<N/2+1; j++)
                {
                    a[i][j] = number;
                }
                number++;
            }
        }
    }
}
/************************************************************
*函数:void Copy(char a[N][N])
*功能:根据已经构造出的八分之一,用复制的方法填满整个方阵。
        因为方阵是一个完全对称的图形。
*说明:填满整个方阵分为三步:
        第一步:根据已构造出的八分之一,填满左上角(四分之一)
        第二步:根据已有的四分之一,填满方阵的上半部分(二分之一)
        第三步:根据已有的二分之一,填满整个方阵
*************************************************************/
void Copy(char a[N][N])
{
    int i = 0;
    int j = 0;
    
    if(N%2 == 0)//偶数
    {
        for(i=1; i<N/2; i++)
        for(j=0; j<=i; j++)
        {
            a[i][j] = a[j][i];
        }
        for(i=0; i<N; i++)
        for(j=N/2; j<N; j++)
        {
            a[i][j] = a[i][N-1-j];
        }
        for(i=N/2; i<N; i++)
        for(j=0; j<N; j++)
        {
            a[i][j] = a[N-1-i][j];
        }
    }
    else //奇数
    {
        for(i=1; i<N/2+1; i++)
        for(j=0; j<=i; j++)
        {
            a[i][j] = a[j][i];
        }
        for(i=0; i<N; i++)
        for(j=N/2; j<N; j++)
        {
            a[i][j] = a[i][N-1-j];
        }
        for(i=N/2; i<N; i++)
        for(j=0; j<N; j++)
        {
            a[i][j] = a[N-1-i][j];
        }
    }
}
/****************************************
*函数:void Print_Array(char a[N][N])
*功能:打印方阵
*****************************************/
void Print_Array(char a[N][N])
{
    int i=0;
    int j=0;

    for(i=0; i<N; i++)
    {
        for(j=0; j<N; j++)
        {
            printf("%c ",a[i][j]);
        }
        printf("\n");
    }
}
搜索更多相关主题的帖子: 难题 期待 
2008-11-24 16:01
zqy110007
Rank: 3Rank: 3
来 自:外太空
等 级:论坛游民
威 望:6
帖 子:1493
专家分:82
注 册:2008-11-19
收藏
得分:0 
X和Y都是什么?直接输出?

每个人都是蛤蟆,只是井的大小不同罢了.
沙石下的泉水,挖得越深,泉水越清.
2008-11-24 17:11
woshiyun
Rank: 1
等 级:新手上路
威 望:2
帖 子:348
专家分:0
注 册:2008-6-16
收藏
得分:0 
#include <string.h>
#include <stdio.h>
#define N 21
#define UPDATE_RES() memset(res+loop,(int)(*(flag+loop)), N-loop*2), myprintf(res)
void myprintf(char* res)
{
    for(int i=0;i<N;i++) printf("%c ",*(res+i));
    printf("\n");
}
void main()
{
    char *flag="XY0123456789", res[N]={0}, loop;
    memset(res, 'X', N);
    for(loop=0;loop<N/2;loop++) UPDATE_RES();
    for(loop=(N&1)?N/2:N/2-1;loop+1;loop--) UPDATE_RES();
}
2008-11-24 17:24
jiangkuanl
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2008-10-29
收藏
得分:0 
调试有问题额...
2008-11-24 18:41
jiangkuanl
Rank: 1
等 级:新手上路
帖 子:13
专家分:0
注 册:2008-10-29
收藏
得分:0 
#include <string.h>
#include <stdio.h>
#define N 21
#define UPDATE_RES() memset(res+loop,(int)(*(flag+loop)), N-loop*2), myprintf(res)
void myprintf(char*res,...)
{
    int i;
    for(i=0;i<N;i++)
    { printf("%c ",*(res+i));
    printf("\n");
    }
}
void main()
{
    char *flag="XY0123456789", res[N]={0}, loop;
    memset(res, 'X', N);
    for(loop=0;loop<N/2;loop++) UPDATE_RES();
    for(loop=(N&1)?N/2:N/2-1;loop+1;loop--) UPDATE_RES();
    getch();
}
输出不对额..
2008-11-24 18:42
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1696
专家分:4295
注 册:2007-12-27
收藏
得分:0 
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char c[]="XY0123456789";
    int i,j;
    int n;
    printf("Input N (0<N<25):\n");
    scanf("%d",&n);
    if(n<1||n>24)
    {
        printf("Error input.\n");
        exit(-1);
    }
    --n;
    for(i=-n;i<=n;i+=2)
    {
        for(j=-n;j<=n;j+=2)
            printf(" %c",c[(n-(abs(i)>abs(j)?abs(i):abs(j)))/2]);
        printf("\n");
    }
    return 0;
}

[[it] 本帖最后由 forever74 于 2008-11-24 19:12 编辑 [/it]]

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2008-11-24 19:10
woshiyun
Rank: 1
等 级:新手上路
威 望:2
帖 子:348
专家分:0
注 册:2008-6-16
收藏
得分:0 
以下是引用jiangkuanl在2008-11-24 18:41的发言:

调试有问题额...

X X X X X X X X X X X X X X X X X X X X X
X Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y X
X Y 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Y X
X Y 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 Y X
X Y 0 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 0 Y X
X Y 0 1 2 3 3 3 3 3 3 3 3 3 3 3 2 1 0 Y X
X Y 0 1 2 3 4 4 4 4 4 4 4 4 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 5 5 5 5 5 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 6 6 6 6 6 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 6 7 7 7 6 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 6 7 8 7 6 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 6 7 7 7 6 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 6 6 6 6 6 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 5 5 5 5 5 5 5 4 3 2 1 0 Y X
X Y 0 1 2 3 4 4 4 4 4 4 4 4 4 3 2 1 0 Y X
X Y 0 1 2 3 3 3 3 3 3 3 3 3 3 3 2 1 0 Y X
X Y 0 1 2 2 2 2 2 2 2 2 2 2 2 2 2 1 0 Y X
X Y 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 Y X
X Y 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Y X
X Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y Y X
X X X X X X X X X X X X X X X X X X X X X

哪里不对?
2008-11-24 19:32
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1696
专家分:4295
注 册:2007-12-27
收藏
得分:0 
LS:关键是你的代码对开发环境依赖得厉害,别人用别的开发环境就可能通不过编译

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2008-11-24 21:11
woshiyun
Rank: 1
等 级:新手上路
威 望:2
帖 子:348
专家分:0
注 册:2008-6-16
收藏
得分:0 
以下是引用forever74在2008-11-24 21:11的发言:

LS:关键是你的代码对开发环境依赖得厉害,别人用别的开发环境就可能通不过编译

请教一下,为什么?
哪些语句换了开发环境不能编译?
2008-11-24 21:25
lrtlyydxr01
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2008-11-23
收藏
得分:0 
算法我觉得能不能改改啊!
void small-partition(char a[n][n] )
{
    int i,j;
    if(i==0)
   {  for(j=i;j<=n;j++)
    {a[i][j]=x;
     a[j][i]=x;
     }
   }
  if(i==1)
  {  for(j=i;j<=n;j++)
     { a[i][j]=y;
       a[j][i]=y;
      }
   }
  if(i>1)
  { int number=0;
     for(i=1;i<(n%2)+1;i++)
     for(j=i;j<=n-i;j++)
     { a[i][j]=number;
       a[j][i]=number;
       number++;
      }
   }
}
void copy()
{ for(i=0;i<=n;i++)
  for(j=n-1-i;j<=n;j++)
  a[i][j]=a[j][i];
}
具体我也没搞清楚,楼主看着再改改吧,敬侯指正!
2008-11-24 21:28
快速回复:一个c程序难题程序期待高手优化(程序我已写好)
数据加载中...
 
   



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

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