把谭浩强的《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程序设计》后,作者通过编写程序练习技能,设计了一个显示星号图案的功能,图案位于屏幕中央,可按用户输入的“c”、“d”键动态缩放,并在“s”键下将星号转换为数字。程序目前存在两个问题:星号缩放时会跳过层数,以及数字转换未完成。计划解决这些问题并完善数字图案的功能。
2877

被折叠的 条评论
为什么被折叠?



