字符图形自动生成(C语言)

#include<stdio.h>

#include<string.h>

#include<math.h>

void welcome();

void zfx();

void cfx();

void sjx();

void jzt();

void xjzt(int x,int y,int z);

int getScanfValue(char *x ,int y);   /*输入合法性检查函数*/



void welcome() {

int c,s;

char scanft[30];

printf("请选择你想要绘制的图形,并输入其对应的数值\n\n");

printf("[1]正方形\n[2]长方形\n[3]三角形\n[4]金字塔\n");

fflush(stdin);

while(1){

while(1){

printf("请选择要绘制的图形:");

gets(scanft);

s=strlen(scanft);

c=getScanfValue(scanft,s);

if(c!=(-10))

break;

}

if(c>0&&c<5)

break;

printf("选择错误,请重新选择!\n");

}

switch (c) {

case 1:

printf("您将绘制的是正方形\n");

zfx();

break;

case 2:

printf("您将绘制的是长方形\n");

cfx();

break;

case 3:

printf("您将绘制的是等腰直角三角形\n");

sjx();

break;

case 4:

printf("您将绘制的是金字塔\n");

jzt();

break;

default :

welcome();

}



}



void zfx()/*绘制正方形*/

{

int s;

    char scanft[30];

int ch;

int m,n;

int length,thickness;/*图形属性*/

char c[100][100];

char a = '#',b = ' ';/*字符类型*/

fflush(stdin);

    while(1){

while(1){

printf("请输入边长:");

gets(scanft);

s=strlen(scanft);

length=getScanfValue(scanft,s);

if(length!=-(10))

break;

}

while(1){

printf("请输入厚度:");

gets(scanft);

s=strlen(scanft);

thickness=getScanfValue(scanft,s);

if(thickness!=-10)

break;



}



if (thickness<=0.5 * length&&thickness>0&&length>0)/*对输入值进行判断,过滤部分非法输入*/

break;

printf("输入错误,请重新输入!\n");

}

for (m = 1; m <= length; m++) {



for (n = 1; n <= length; n++)

if (m > thickness && m <= length - thickness && n > thickness && n <= length - thickness)/*输出空格,空格处于

(边长-厚度)之间,即对正方形进行挖空处理*/

c[m][n] = b;

else

c[m][n] = a;

}

printf("开始绘制图形:   \n\n");

for (m = 1; m <= length; m++) {



for (n = 1; n <= length; n++)

printf("%c", c[m][n]);

printf("\n");



}

printf("\n--图形绘制成功!\n");

printf("请选择重新绘制或者退回主界面!:");

printf("\n[1]重新绘制\n[2]返回主界面重新选择\n");

fflush(stdin);

while(1){

while(1){

printf("请选择要继续进行的操作:");

gets(scanft);

s=strlen(scanft);

ch=getScanfValue(scanft,s);

if(ch!=(-10))

break;

}

if(ch>0&&ch<3)

break;

printf("选择错误,请重新选择!\n");

}

switch (ch) {

case 1:

printf("您将重新绘制正方形\n");

zfx();

break;

case 2:

welcome();

break;

}

}



void cfx()/*绘制长方形,代码原理同上*/

{

int ch;

int s;

char scanft[30];

int length,width,thickness;

int m,n;

char c[100][100];

char a = '#',b = ' ';

while(1){

fflush(stdin);

while(1){

printf("请输入长度:");

gets(scanft);

s=strlen(scanft);

length=getScanfValue(scanft,s);

if(length!=-(10))

break;

}

while(1){

printf("请输入宽度:");

gets(scanft);

s=strlen(scanft);

width=getScanfValue(scanft,s);

if(width!=-(10))

break;

}

while(1){

printf("请输入厚度:");

gets(scanft);

s=strlen(scanft);

thickness=getScanfValue(scanft,s);

if(thickness!=-10)

break;



}



if (length != width && thickness <= 0.5 * length && thickness <=0.5 * width&&length>0&&width>0&&thickness>0)

break;

printf("输入错误,请重新输入!\n");

}

for (m = 1; m <= width; m++) {



for (n = 1; n <= length; n++)

if (m > thickness && m <= width - thickness && n > thickness && n <= length - thickness)

c[m][n] = b;

else

c[m][n] = a;

}

printf("开始绘制图形:   \n\n");

for (m = 1; m <= width; m++) {



for (n = 1; n <= length; n++)

printf("%c", c[m][n]);

printf("\n");



}

printf("\n--图形绘制成功!\n");

printf("请选择重新绘制或者退回主界面!:");

printf("\n[1]重新绘制\n[2]返回主界面重新选择\n");

fflush(stdin);

while(1){

while(1){

printf("请选择要继续进行的操作:");

gets(scanft);

s=strlen(scanft);

ch=getScanfValue(scanft,s);

if(ch!=(-10))

break;

}

if(ch>0&&ch<3)

break;

printf("选择错误,请重新选择!\n");

}

switch (ch) {

case 1:

printf("您将重新绘制长方形\n");

cfx();

break;

case 2:

welcome();

break;

}

}

void sjx()/*绘制等腰直角三角形*/

{

int ch;

int s;

char scanft[30];

int length,thickness;                 /*图形属性*/

int m,n;                    /*画图属性*/

char c[100][100];

char a = '#',b = ' ';                   /*字符类型*/

fflush(stdin);

    while(1){

while(1){

printf("请输入直角边长:");

gets(scanft);

s=strlen(scanft);

length=getScanfValue(scanft,s);

if(length!=-(10))

break;

}

while(1){

printf("请输入厚度:");

gets(scanft);

s=strlen(scanft);

thickness=getScanfValue(scanft,s);

if(thickness!=-10)

break;



}

if (thickness < 0.5 * length + 1&&length>0&&thickness>0)

break;

printf("输入错误,请重新输入!\n");



}

for (m = 1; m <= length; m++) {

for (n = 1; n <= m; n++)

if (m > 2 * thickness && m <= length - thickness /*对空格所处的行进行判断*/&& n > thickness && n <= m - thickness/*对空格所处的列进行判断*/)

c[m][n] = b;

else

c[m][n] = a;

}

printf("开始绘制图形:   \n\n");

for (m = 1; m <= length; m++) {

for (n = 1; n <= m; n++)

printf("%c", c[m][n]);

printf("\n");



}

printf("\n--图形绘制成功!\n");

printf("请选择重新绘制或者退回主界面!:");

printf("\n[1]重新绘制\n[2]返回主界面重新选择\n");

fflush(stdin);

while(1){

while(1){

printf("请选择要继续进行的操作:");

gets(scanft);

s=strlen(scanft);

ch=getScanfValue(scanft,s);

if(ch!=(-10))

break;

}

if(ch>0&&ch<3)

break;

printf("选择错误,请重新选择!\n");

}

switch (ch) {

case 1:

printf("您将重新绘制等腰直角三角形\n");

sjx();

break;

case 2:

welcome();

break;

}



}

void jzt(){ /*多层金字塔的叠加输出*/



int i;

int s;

char scanft[30];

int a,c,ch;

while(1){

while(1){

printf("请输入每层的高度:");

gets(scanft);

s=strlen(scanft);

a=getScanfValue(scanft,s);

if(a!=-(10))

break;

}

while(1){

printf("请输入所要打印的层数:");

gets(scanft);

s=strlen(scanft);

c=getScanfValue(scanft,s);

if(c!=-10)

break;



}



if (a>0&&c>0)/*对输入值进行判断,过滤部分非法输入*/

break;

printf("输入错误,请重新输入!\n");

}

printf("开始绘制图形:   \n");



for(i=1;i<=c;i++){



xjzt(a,i,c-i);/*(c-a)为层数前空格的反序输出,即每层小金字塔数量与每层前的空格数量互相作用,此消彼长*/

printf("\n");

} /*调用每层金字塔,并将高度,层数传导至xjzt();*/



printf("\n--图形绘制成功!\n");

printf("请选择重新绘制或者退回主界面!:");

printf("\n[1]重新绘制\n[2]返回主界面重新选择\n");

fflush(stdin);

while(1){

while(1){

printf("请选择要继续进行的操作:");

gets(scanft);

s=strlen(scanft);

ch=getScanfValue(scanft,s);

if(ch!=(-10))

break;

}

if(ch>0&&ch<3)

break;

printf("选择错误,请重新选择!\n");

}

switch (ch) {

case 1:

printf("您将重新绘制金字塔\n");

jzt();

break;

case 2:

welcome();

break;

}

}









void xjzt(int x,int y,int z){



    char a='/';

    char b='\\';

char c='-';

int m,n,t;

int i,j,k,p,q;

m=x,n=y,t=z;







for(i=m-1;i>=0;i--){

for(j=0;j<m*t;j++){

printf(" ");

}/*每层金字塔前输出对应的空格*/



for(k=n;k>0;k--){

for(p=(2*m-1);p>=0;p--)

{

if(p==i)

printf("%c",b);

else if(p==(2*m-1-i))

printf("%c",a);

else

printf(" ");



}

}/*输出每层对应的金字塔组成元素,按行输出,每行输出相应层数的金字塔个数对应的符号数量与位置*/

printf("\n");









}

for(q=0;q<m*t;q++){

printf(" ");

}

for(i=0;i<m*n;i++){

printf("%c%c",c,c);

}/*每层输出后,底部输出底纹,组成一个完整的金字塔*/

}



int getScanfValue(char *scanft ,int t){

int i;

int counter=0;

int num=0,scanftn;

int power;

for(i=0;i<t;i++){

if(scanft[i]>47&&scanft[i]<58){

counter=i;

}

else if(((scanft[i]>31&&scanft[i]<48))||((scanft[i]>57&&scanft[i]<65))||

((scanft[i]>90&&scanft[i]<97))||((scanft[i]>122&&scanft[i]<128))||(scanft[i]>128)||(scanft[i]<0)){

printf("输入的值中含有特殊符号字符,请重新输入!\n");

i=100;

counter=100;

}

else if((scanft[i]>64&&scanft[i]<91)||(scanft[i]>96&&scanft[i]<123)){

printf("输入的值中含有大小写字母,请重新输入!\n");

i=100;

counter=100;



}

else{

printf("输入错误,请重新输入!\n");

i=100;

counter=100;

}

}

if(counter==t-1){

power=t-1;

for(i=0;i<t;i++){



scanftn=scanft[i]-48;

num=num+scanftn*pow(10,power);

power--;

}

return num;



}

else{

return -10;

}





}



int main() {

printf("\n**************欢迎进入字符图形自动绘制系统!************************\n\n\n\n");

welcome();

return 0;

}





/*copyright@xzx*/

自动生成矩形,三角形,金字塔

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值