#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*/
自动生成矩形,三角形,金字塔