<C语言程序实例>C语言实现菱形输出
前言
这一问题无论是在C语言还是别的编程语言的入门学习中都会遇到,还是比较常见的,要学一下的。
一、菱形
我们先要看一下我们要输出的菱形是什么样子的。这里举一个例子简单说明一下:
大家首先要知道一点的是,我们要输出的菱形,星号的总行数一定是奇数。
偶数的话,输出的样子根本就不是标准菱形的样子。
其次就是,我们在编写程序时,是将这个菱形拆分为上下两个部分进行输出的,即上层的正三角和下层的倒三角。并且我看到有些人会讨论中间最长的星号行,应该属于上层,还是下层,但其实这都不影响。
我们就拿如图的菱形进行举例,我们可以发现,每一层星号距离左边的空格的个数都等于:5-行号(即5-1;5-2;…);而星号的个数则为:2*行号-1;这样我们就发现了输出的规律。下层在实用此规律的基础上,只不过是上层的逆输出。这是我的一种简单的思维方式。
还有一种思维方式,可以向大家介绍:
设菱形的总行数为line,总列数为column,当前行为i,当前列为j。上半部分与下半部分的规律不一样,应该分开讨论。
我们着眼于星号,思考什么条件下输出星号,总结出如下的规律。
1) 对于上半部分(包括中间一行),当前行与当前列满足如下关系输出星号:
j>=(column+1)/2-(i-1) (column+1)/2-(i-1)为第i行最左边的星号
j<=(column+1)/2+(i-1) (column+1)/2+(i-1)为第i行最右边的星号
2) 对于下半部分,当前行与当前列满足如下关系输出星号:
j>=(column+1)/2-(line-i) (column+1)/2-(line-i)为第i行最左边的星号
j<=(column+1)/2+(line-i) (column+1)/2+(line-i)为第i行最右边的星号
不满足上述条件,则输出空格。
二、代码实现
1.简单化实现方法
代码如下(不适用于长多行的菱形输出):
/* 这里输出的就是我们上面图中的菱形,上层为5,下层为4*/
#include "stdio.h"
void main()
{int i,j;for(i=1;i<=5;i++)//这里的5是指上层行数,根据具体题目要求可进行改变{for(j=1;j<=5-i;j++){printf(" ");}for(j=1;j<=2*i-1;j++){printf("*");} printf("\n");}/*****************************************************************/for(i=4;i>=1;i--)//这里的4是指下层行数,根据具体题目要求可进行改变{for(j=1;j<=5-i;j++){printf(" ");}for(j=1;j<=2*i-1;j++){printf("*");}printf("\n");}
}
2.通用性实现方法
代码如下,可根据所要的行数进行打印:
#include <stdio.h>
#include <stdlib.h>int main(){int line; // 菱形总行数int column; // 菱形总列数int i; // 当前行int j; // 当前列printf("请输入菱形的行数(奇数):");scanf("%d", &line);if(line%2==0){ // 判断是否是奇数printf("必须输入奇数!\n");exit(1);}column = line; // 总行数和总列数相同for(i=1; i<=line; i++){ // 遍历所有行if(i<(line+1)/2+1){ // 上半部分(包括中间一行)for(j=1; j<=column; j++){ // 遍历上半部分的所有列if( (column+1)/2-(i-1)<=j && j<=(column+1)/2+(i-1) ){printf("*");}else{printf(" ");}}}else{ // 下半部分for(j=1; j<=column; j++){ // 遍历下半部分的所有列if( (column+1)/2-(line-i)<=j && j<=(column+1)/2+(line-i) ){printf("*");}else{printf(" ");}}}printf("\n");}return 0;
}