*型图案的显示与控制(学习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)可以初步变数字。
题目要求如下:
打印如下图案
*
***
*****
*******
*****
***
*
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语言后的编程尝试)(2)(完)
- 利用c语言编程在stm32上输出信号控制电压放大与滤波系统和显示功能
- linux shell编程控制结构:expr、let、for、while、until、shift、if、case、break、continue、函数、select 学习笔记
- 【C语言】【网络编程】菜鸟学习日志(三) 一个简易B/S系统——Http Server和精简的浏览器
- 【黑马程序员】iOS学习之路——C语言之流程控制
- 迷你MVVM框架 avalonjs 学习教程5、显示隐藏控制
- 【C语言学习笔记】流程控制
- C语言中的多线程编程--Unix学习总结之五
- 黑马程序员-----C语言学习之流程控制
- selenium webdriver 学习总结-Selenium 控制测试流_补充显示等待(五)
- SQL server学习(三)T-SQL编程、逻辑控制语句和安全模式
- 循环控制结构程序01 - 零基础入门学习C语言16
- 循环控制结构程序04 - 零基础入门学习C语言19
- 我的opengl编程学习(二)(混合、深度测试、雾化、多边形平移、显示列表)
- JS DOM编程艺术——显示缩略语列表—— JS学习笔记2015-7-16(第85天)
- UNIX环境编程学习笔记(7)——文件I/O之文件访问权限与进程访问控制
- c语言进程控制编程的总结
- 图像编程学习笔记1——bmp文件结构处理与显示
- C语言学习 编程经典例题(近年二级编程题真题)