您的位置:首页 > 编程语言 > C语言/C++

*型图案的显示与控制(学习C语言后的编程尝试)(1)

2008-12-04 18:45 309 查看
 把谭浩强的《C程序设计》看完了以后,总是觉得还少了点什么,就决定编些程序来练练手。

题目要求如下:

 

打印如下图案  

                     *

                   ***

                 *****

               *******

                 *****

                   ***

                     *

 

TC中屏幕为25行,80列,将图形放于屏幕中间位置 。按键盘“c”键可以将图放大,直到最大。按键盘“d”可以把图缩小,直到最小。按“s”可以将图中*变为数字。数字图形要求:内层为外层数字的和,如354,则输出5;3278则输出8。最外层从1开始。

数字图形也如上可以放大或缩小。按键盘“x”退出。

 

 //显示星号‘*’
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<windows.h>
#define X 13
#define Y 41
int num_=1;
int num[25][80];
char star[25][80];

void addstar(int x,int y,int z)
{
 int l=0,n=0;
 int k,j,m;

 num[x-z][y]=1;
 num[x+z][y]=1;
 num[x][y-z]=1;
 num[x][y+z]=1;
 for(j=z;j>1;j--)
 {
  m=x+z;
  n++;
  num[m-n][y+n]=1;
  num[m-n][y-n]=1;
 }
 n++;
 for(k=z;k>1;k--)
 {
  m=x;
  l++;
  n--;
  num[m-l][y-n]=1;
  num[m-l][y+n]=1;
 } 
}
void substar(int x,int y,int z)
{
 int l=0,n=0;
 int k,j,m;
 
 num[x-z][y]=0;
 num[x+z][y]=0;
 num[x][y-z]=0;
 num[x][y+z]=0; 
 for(j=z;j>1;j--)
 {
  m=x+z;
  n++;
  num[m-n][y+n]=0;
  num[m-n][y-n]=0;
 }
 n++;
 for(k=z;k>1;k--)
 {
  m=x;
  l++;
  n--;
  num[m-l][y-n]=0;
  num[m-l][y+n]=0;
 }
}
void setstar(int x,int y,int z)//x,行位置;y,列位置;z,扩展幅度;
{
 int j;
 num[x][y]=1;
 
 for(j=z;j>0;j--)
 {
  addstar(X,Y,j);
 }
 
}
void printstar()
{
 int i,j;
 for(i=0;i<25;i++)
  for(j=0;j<80;j++)
  {
   if(num[i][j]==1)
    star[i][j]='*';
   else
    star[i][j]=' ';
  }
  for(i=0;i<25;i++)
   for(j=0;j<80;j++)
    printf("%c",star[i][j]);
}

int maxnum(int a)
{
 int max;
 int n;
 
 if(a<10)
  max=a;
 else if(a==10)
  max=1;
 else
 {
  max=a%10;
  while(a>10)
  {
   a/=10;
   n=a%10;
   if(n>max)
    max=n;
  }
 }
 return max;
}

void setnum(int m)
{
 int n=0,l=0;
 int sum;
 int j,k;
 while(m>=0)
 {
  for(j=m;j>=0;j--)
  {
   num[X+j][Y+n]=num_;
   num[X+j][Y-n]=num_;
   n++;
  }
  for(k=m;k>0;k--)
  {
   num[X-k][Y+l]=num_;
   num[X-k][Y-l]=num_;
   l++;
  }
  sum=4*m*num_;
  num_=maxnum(sum);
  m--;
  setnum(m);
 }
}
void printnum()
{
 int i,j;
 for(i=0;i<25;i++)
  for(j=0;j<80;j++)
  {
   if(num[i][j]>0)
    star[i][j]=num[i][j];
   else
    star[i][j]=' ';
  }
  for(i=0;i<25;i++)
   for(j=0;j<80;j++)
    if(star[i][j]==' ')
     printf("%c",star[i][j]);
    else
     printf("%d",star[i][j]);
}
int main()
{
 int i,j;
 int n=0,m=3,l=0;
 char c='u';
 
 for(i=0;i<25;i++)
  for(j=0;j<80;j++)
   num[i][j]=0;
  
  setstar(X,Y,3);
  printstar();
  setnum(5);
  printf("%d ",num_);
  
  while(c!='q')
  {
   c=getche();
   if(c=='w')
   {
    system("cls");
    if(m==11)
    {
                    setstar(X,Y,11);
     printstar();
     continue;
    }
    m++;
                setstar(X,Y,m);
    printstar();
    
   }
   if(c=='s')
   { 
    system("cls");
    substar(X,Y,m);
    printstar();
    if(m!=1)
     m--;
    else
     m=1;
   }
   if(c=='d')
   {
    system("cls");
    setnum(m);
    printnum();
   }
  }
  return 0;
}

 

编了一阵,写到这个样子,就碰到很多问题了。

主要是两个问题:

(1)星号缩小到最小后,放大的时候,两层星号的图案直接跳过了,直接变成三层星号的图案了了。

(2)变数字完全还不能成功。

 

下一步计划:

(1)把星号的变化完全的实现,没有bug。

(2)可以初步变数字。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c 编程 语言 system 图形 zk