金字塔与菱形

1.金字塔

#include<stdio.h>
void main(){
	int a;
	printf("请输入金子塔层数:");
	scanf("%d",&a);
//1.最外层的for循环针对金字塔的层数,i即层数、a为金字塔最低层
	for(int i=1;i<=a;i++){
//2.循环体内部第一套for循环针对' '(空格)的输出。
//	2*a-1为金字塔最低一层的'*'个数,2*i-1为第i层'*'个数,其差的1/2为图形每行左边的空格数。
		for(int k=1;k<=((2*a-1)-(2*i-1))/2;k++){
				printf(" ");
			}
//3.第二套用来输出前'*',2*i-1为第i行的'*'个数
		for(int j=1;j<=2*i-1;j++){
				printf("*");
		}
		printf("\n");
	}
	
}

2.菱形

#include<stdio.h>
#include<math.h>
void main(){
	int a,b;
	printf("请输入菱形层数(奇数):");
	scanf("%d",&b);
	a = (b+1)/2;
	if(b%2==1){
		//使用嵌套循环,内部使用三套循环(不是三层),根据金字塔演化得出。
		//1.最外层的for循环针对菱形的层数,i即层数、a为菱形中间那一层
		for(int i=1;i<=(2*a-1);i++){
			//2.循环体内部第一套for循环针对' '(空格)的输出,abs()函数为取绝对值函数
			//	2*a-1为金字塔最低一层的'*'个数,2*i-1为第i层'*'个数,其差的1/2为图形每行左边的空格数。
			for(int k=1;k<=abs((2*a-1)-(2*i-1))/2;k++){
					printf(" ");
				}
			//循环体内部第二套和第三套均是用来输出'*',用if语句来选择前部分和后部分
			if(i<=a){
				//3.第二套用来输出前 a 行'*',2*i-1为第i行的'*'个数
				for(int j=1;j<=2*i-1;j++){
					printf("*");
				}
			}
			else
				//4.循环体内部第三套用来输出b-a行的'*',2*a-i以a行为轴,与上方对称的行号相同,所以2*(2*a-i)-1为第i行'*'个数。
				for(int m=1;m<=2*(2*a-i)-1;m++){
						printf("*");
				}
			printf("\n");
		}
	}
	else
		printf("输入错误,请输入奇数!");
}

金字塔进阶版(区别在空格的输出)

#include<stdio.h>
void main(){
	int a,i,j,k;
	printf("请输入金子塔层数:");
	scanf("%d",&a);
//1.最外层的for循环针对金字塔的层数,i即层数、a为金字塔最低层
	for(i=1;i<=a;i++){
//2.循环体内部第一套for循环针对' '(空格)的输出。
//	金字塔进阶版与旧版主要区别就是空格的输出,以a-i取代了((2*a-1)-(2*i-1))/2
//	旧版太过繁琐(不但要学会找规矩,而且要找最简的方式)	
		for(k=1;k<=a-i;k++){
			printf(" ");
		}
//3.第二套用来输出前'*',2*i-1为第i行的'*'个数
		for(j=1;j<=2*i-1;j++){
			printf("*");
		}
		printf("\n");
	}
	
}

假设金字塔是四层
在这里插入图片描述

每层的’*'个数每层靠左边的空格数
13
32
51
70
规律每层靠左边的空格数=总层数-层数

菱形也是同理

这里要注意一个问题,在C89下必须先定义变量才能使用,其规定,在任何语句执行之前,在块的开头声明所有局部变量,这里由于某些原因没有出错,但是将其复制新建文件编译就会出错。解决方法:先定义i、j、k、m等变量,for 循环中赋值即可。

新建文件复制以上代码重新编译就会出现如此错误:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值