c语言输出菱形图案

作者&投稿:郯安 (若有异议请与网页底部的电邮联系)
用C语言打印 *菱形 图案~

/*下面的程序是菱形打印的【终结者】,
改变下设置,就基本可以满足所有菱形打印的题目。
程序主体 for 语句只有9行,简单而强大
*/
#include
#include
#include

// 这个小函数用来输出 repeatTimes 个字符 c
void printChar(char c,int repeatTimes)
{
int i;
for(i=0;i<repeatTimes;i++)
printf("%c",c);
}
/*
特别的函数,获取当前要打印的下一个菱形图案
height : 菱形的高
shapeVariantStep : 变化的步数
baseShape : 菱形的基本图案
row : 当前打印的菱形图案的行坐标。
col : 当前打印的菱形图案的列坐标。
*/
char _buffer_[2]={0};
char* getShape(int height,int shapeVariantStep,char baseShape[],int row,int col)
{

int first = baseShape[0],last = first +(height-1)/2*shapeVariantStep;
if(shapeVariantStep==0 || strlen(baseShape)!=1)
return baseShape;
else
{
if(first>='0'&&first<='9'&&last<='9' ||
first>='a'&&first<='z'&&last<='z' ||
first>='A'&&first<='Z'&&last<='Z'
)
{
_buffer_[0] = first + ((height-2*abs(row)-1)/2 - abs(col))*shapeVariantStep;
_buffer_[1] = '\0';
return _buffer_;
}
else
{
return baseShape;
}
}
}


int main(int argc, char *argv[])
{
// 菱形的图案
char shape[]="*";
// 菱形图案间的空白图案
char space=' ';
// 每个图案之间的最小间隔(以一个字符为单位,不足用空白图案填充)
int interval=5;
// 菱形的高(要求是奇数)
int height=7;
// 菱形是否空心(只有边上的图案)。是:1,否 0
int isHollow=0;
/* 特别的参数:设定菱形的图案是变化。
只有指定 shape 为 :
"0","1",...,"9",
或者 "a","b",...,"z",
或者 "A","B",...,"Z" 其中之一,
并且要保证从指定图形开始,后面至少还有连续的:
(height-1)/2*shapevariantStep
个可选的图形,菱形的图形才会是可变的。

*/
int shapeVariantStep = 0;

int i,j,k,n;
interval = interval < strlen(shape)?strlen(shape):interval;
for(i=-(height-1)/2;i<=(height-1)/2;i++)
{
// 用来输出每行前的空白
printChar(space,abs(i)*interval);
// 这个 for(j) 语句用来输出每行的菱形图案
for(j=-(height-2*abs(i)-1)/2;j<=(height-2*abs(i)-1)/2;j++)
{
// 如果是非空心,输出所有图案;否则只输出两端的图案。
if(!isHollow || (isHollow && (j==0 || j==height-2*abs(i)-1)))
{
n=printf("%s",getShape(height,shapeVariantStep,shape,i,j));
// 补齐为到宽度为 interval
printChar(space,interval-n);
}
// 对于空心的菱形,在本应该输出图案的地方,输出空白。
else
{
printChar(space,interval);
}
}
// 这个 for(j) 语句用来输出每行后的空白
printChar(space,abs(i)*interval);
printf("
");
}
return 0;
}
/*
运行结果:
shape[]="*";
space[]=" ";
interval=5;
height=7;
isHollow=0;
shapevariantStep = 0
*
* * *
* * * * *
* * * * * * *
* * * * *
* * *
*

shape[]="**";
space[]=" ";
interval=5;
height=7;
isHollow=0;
shapevariantStep = 0
**
** ** **
** ** ** ** **
** ** ** ** ** ** **
** ** ** ** **
** ** **
**

shape[]="*";
space[]=" ";
interval=5;
height=7;
isHollow=0;
shapevariantStep = 0
...............*...................
..........*....*....*..............
.....*....*....*....*....*.........
*....*....*....*....*....*....*....
.....*....*....*....*....*.........
..........*....*....*..............
...............*...................

shape[]="*";
space[]=" ";
interval=0;
height=7;
isHollow=0;
shapevariantStep = 0
*
***
*****
*******
*****
***
*

shape[]="*";
space[]=" ";
interval=5;
height=11;
isHollow=0;
shapevariantStep = 0
*
* * *
* * * * *
* * * * * * *
* * * * * * * * *
* * * * * * * * * * *
* * * * * * * * *
* * * * * * *
* * * * *
* * *
*
shape[]="*";
space[]=" ";
interval=5;
height=7;
isHollow=1;
shapevariantStep = 0
*
* *
* *
* *
* *
* *
*

shape[]="A";
space[]=" ";
interval=5;
height=17;
isHollow=0;
shapevariantStep = 1
A
A B A
A B C B A
A B C D C B A
A B C D E D C B A
A B C D E F E D C B A
A B C D E F G F E D C B A
A B C D E F G H G F E D C B A
A B C D E F G H I H G F E D C B A
A B C D E F G H G F E D C B A
A B C D E F G F E D C B A
A B C D E F E D C B A
A B C D E D C B A
A B C D C B A
A B C B A
A B A
A
shape[]="a";
space[]=" ";
interval=5;
height=17;
isHollow=0;
shapevariantStep = 1
a
a b a
a b c b a
a b c d c b a
a b c d e d c b a
a b c d e f e d c b a
a b c d e f g f e d c b a
a b c d e f g h g f e d c b a
a b c d e f g h i h g f e d c b a
a b c d e f g h g f e d c b a
a b c d e f g f e d c b a
a b c d e f e d c b a
a b c d e d c b a
a b c d c b a
a b c b a
a b a
a

shape[]="1";
space[]=" ";
interval=5;
height=9;
isHollow=0;
shapevariantStep = 2
1
1 3 1
1 3 5 3 1
1 3 5 7 5 3 1
1 3 5 7 9 7 5 3 1
1 3 5 7 5 3 1
1 3 5 3 1
1 3 1
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行最右边的星号
不满足上述条件,则输出空格。
于是写出如下的代码:纯文本复制
#include #include int main(){int line; // 菱形总行数int column; // 菱形总列数int i; // 当前行int j; // 当前列printf("请输入菱形的行数(奇数):");scanf("%d", &line);if(line%2==0){ // 判断是否是奇数printf("必须输入奇数!
");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("
");}return 0;}
运行结果:请输入菱形的行数(奇数):11*************************************************************

下面对代码进行解释:

首先定义两个宏用MIDDLE值得第一个*在40列出输出,而STAR则代表多个“*”或“0”的字符,11行输入n值,则输出的行数为和中间最宽的那一行均为2*n-1,第一个for循环用于输出上三角,第二个则输出下三角。相对应的输出sp-1个空白符的时候,同时输出2*i-1个“*”或“0”字符,这个有我们自己定,这里有必要解释一下,关于17行语言的代码:

printf("%*c  %.*s
",  sp - 1, '  ',  2*i-1,  STAR);

首先说一下关于%*中的*号,在这里叫做赋值抑制符。他的作用是:标准说法:星号(赋值抑制符)对赢的输入项按要求被扫视输入,但结果不存贮,带星号的说明不对应输入数据存贮地址,用它来跳出一个输入数据项(这是向对于scanf输入来说的),

在这里,对于printf来说,以11行代码为例,%*c字符“*”表示输出域由对应的输出项来确定,上述“*”对应的输出项是sp-1(假设sp-1等于4),那么%*c就相当于%4c,那么他就以%4c的格式输出'  ' (空格)。 同样的对应%.*s也相类似,但这里注意了为%.*s而非%*s

(里面有点'.'),如果你误写成后者,这样会得不到正确的结果哦!那么%.*s 和%*s到底有什么区别呢?%*s用法类似于%*c,

c输出元值为其ASCII码的字符,而s则代表输出的一个字符串,

(1)用格式符“%c”输入或输出一个字符,即逐个字符输入输出。

(2)用“%s”,则将整个字符串一次输入或输出。

举例:如果S = ABCDEF

那么对于printf("%3s,  %4.2s,  %-7.4s,  %.5s", s, s, s, s);则输出

 ABCDEF,  AB,ABCD   ,ABCDE

如果懂了这个,相信大家也就知道%.*s怎么用了吧!

这里值得一提的是,对于宏STAR的定义里面的字符数必须做够多,否则当我们把n输入很多后,可能自得不到我们预期的结果,即输出的可能就不会是菱形了,这个大家可以验证一下,那么这是为什么了,因为%.*s的输出总要依赖于STAR,当前要求输入很大时,而STAR有不够提供,那么当然会出现问题了,利用STAR的字符数多少,我们还可以相应的变换输出的图案,可以实现多种不同的图形哦,有兴趣不妨试一下。



#include <stdio.h>
void f(int m,int n)
{
int i,t;
for(i=0;i<m;i++)
printf("*");
putchar('\n');
if(m<n)f(m+1,n);
for(i=0;i<m-1;i++)
printf("*");
putchar('\n');

}
void main()
{
f(1,10);
}


c语言输出菱形
java语言输出菱形:public static void main(String [] args){ int row=11; \/\/设置打印的行数,11也就是菱形对角线的长。 for (int i=0;i<row;i++){ for( int j=0; j< row ; j++){ \/\/左上,右上,左下,右下四个角打印空格 \/\/可以一个判断语句写出,四个判断分...

用C语言输出一个字母组成的菱形
include <stdio.h>#include <math.h>#define N (4)int main(void){ int i,j; for(i=-N;i<N+1;++i) { for(j=-N;j<N+1;++j) { putchar(abs(j)<=N-abs(i)?'A'+N-abs(j):' '); } putchar('\\n'); } return 0;} ...

C语言输出如下图形菱形 * *** *** *** *** *** *
for(i=-3;i<3;i++)这个循环只有6次,你要打印7行要for(i=-3;i<=3;i++)这样啊 还有,你进入循环就把i给改了,第一次i=-3,循环一次结束后,i变成了3,i<3不成立,就退出循环了啊 我帮你改了下 include<stdio.h> include<math.h> main(){ int i,j,k;for(i=-3;i<=3;i+...

c语言输出菱形
include<stdio.h> void main(){ int i,j,k;for(i=1;i<=3;i++){ for(j=1;j<=3-i;j++)printf(" ");for(k=1;k<=2*i-1;k++)printf("*");printf("\\n");} } 以上是按题目所说的只输出了3行 如果需要输出菱形 需加入反向程序 综合程序如下:include<stdio.h> void main()...

用php语言编程:输出一个由“*”符号组成的菱形图形(必须使用for循环语句...
我的是C#编的,语言不重要,关键是掌握方法,我晚自习想了两节课后自己想到了原创的算法(虽然回家调试没得到菱形,但很快就修改成功了)using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace 字符图案输出{ class Program { static void Main(string[] args) { bool b = true...

如何用c语言编写程序,打印一个空心菱形,用循环写
include <stdio.h> int main(void){ int i,j,k; \/\/上半空心菱形 for(i=1;i<=10;i++){ \/\/控制行数 10行 for(k=10;k>i;k--){ \/\/第一行 9空格1* i=2 8空格 2* printf(" "); } \/\/当i=1时 由第25行代码输出* if(i == 1){} else{ ...

C 语言 学习 输出菱形
试试看我修改的代码就行了,我试过了,可以的 include<stdio.h> void main (){ char diamond[][5]={ {' ',' ','*'},{' ','*',' ','*'},{'*',' ',' ',' ','*'},{' ','*',' ','*'}, {' ',' ','*'} };int i,j;for(i=0;i<5;i++){ for(j=0;j...

怎么用C语言输出一个菱形
上面画一个三角,下面画一个反三角。就是菱形了 这里的高度指的是三角行的高度 include "stdio.h"void main(){ int h;printf("输入高度-》 ");scanf("%d",&h);for(int i=1;i<=h;i++){ for(int a=1;a<=(h-i);a++){ printf(" ");} for(int b=1;b<=(i*2-1);b++)...

用C语言编写程序,实现输入一个m,打印出一个菱形;如输入3,打印出(m为...
include <stdio.h> include <math.h> main(){ int line; \/*菱形的行数*\/ int length; \/*菱形的边长*\/ printf("input Length of a side: ");scanf("%d",&length);for(line=1;line<length*2;line++){ putout(abs(length-line),length-line>=0?line:length*2-line);} } putout(...

C语言输出数字菱形
include <stdio.h>#include <math.h>int main(){int n,i,j; scanf("%d",&n); printf("%*d\\n",n,n); for(i=2-n;i<n-1;i++) {if(i)printf("%*c",abs(i),' '); for(j=n;j>1+abs(i);j--) printf("%d",j); for(;j<=n;j++) printf("%d",j); ...

朝阳县13536115387: 如何用c语言编程题输出菱形图形? -
周瑞气血: #include "stdio.h" void PrintDiamend(int n) { int i,j,k; if(n==0) n=1; for(i=1;i<=n;i++) { for(j=i;j

朝阳县13536115387: c语言输出菱形图案:在屏幕上显示下列菱形图案. A A A -
周瑞气血: 1 2 3printf(" A"); printf("A A"); printf(" A");

朝阳县13536115387: C语言程序设计,做一个菱形图案 -
周瑞气血: #include <stdio.h> #include <math.h>void PrintStar(int n) {int i, j;int h = n/2 + 1;for(i = 1; i <= n; ++i){for(j = 1; j <= abs(h-i); ++j)putchar(' ');for(j = 1; j <= -abs(2*(i-h))+n; ++j)putchar('*');putchar('\n');} }int main() {int n;printf("请输出菱形...

朝阳县13536115387: C语言基础题,输出一个菱形图! -
周瑞气血: #include <stdio.h> int main() { char diamond[][5]={{' ',' ','*'},{' ','*',' ','*'},{'*',' ',' ',' ','*'},{' ','*',' ','*'},{' ',' ','*'}};//char diamond[5][5] int i,j; for(i=0;i<5;i++)//5次循环 { for(j=0;j<5;j++)//5次循环 printf("%c",diamond[i][j]);//因为是二重循环,此语句执行25次,j增加5次i增加1次 printf("\n");//菱形一共5行,每输出一行换行一次 } return 0; }

朝阳县13536115387: 怎么用C语言输出一个菱形 -
周瑞气血: 上面画一个三角,下面画一个反三角.就是菱形了这里的高度指的是三角行的高度 #include "stdio.h"void main() {int h;printf("输入高度-》 ");scanf("%d",&h);for(int i=1;i<=h;i++){for(int a=1;a<=(h-i);a++){printf(" ");}for(int ...

朝阳县13536115387: c语言怎么输出菱形? -
周瑞气血: #includevoid main() { int i,j,k; for(i=1;i<=4;i++) { for(j=1;j<=4-i;j++) printf(" "); for(k=1;k<=i;k++) { if(k==1) printf("*"); else printf(" *"); } printf("\n"); } for(i=1;i<=3;i++) { for(j=1;j<=i;j++) printf(" "); for(k=1;k<=4-i;k++) { if(k==1) printf("*"); else ...

朝阳县13536115387: C语言求输出一个菱形?
周瑞气血: #include "stdio.h" #include "math.h" main() { int n,i,j; int temp=1; //添加的新变量 k: puts("enter n:\n"); scanf("%d",&n); if(n%2==0) { puts("default data!"); goto k; } for(i=1;i<=n;i++) { for(j=1;j<=fabs((n+1)/2-i);j++) printf(" "); if(i<=(n+1)/...

朝阳县13536115387: c语言打出菱形 -
周瑞气血: 在图形中画十字分成4份,以其中的一部分考虑 #include <stdio.h> #define M 4 /*可以自定义菱形的大小*/ int main(int argc, char** argv) { int i,j,k; for(i=0;i<=M;i++)/*上半部分的行数*/ { for(j=0;j<=M-1-i;j++)/*打印空格的个数,我是以0开始的*/ ...

朝阳县13536115387: *菱形怎样用c语言编程输出?
周瑞气血: void four()//菱形 { int x; printf("\t\t\t**\t菱形\t**\n"); printf("\t\t\t请您输入需要的尺寸:"); scanf("%d",&x); for(int i=1;i<=x;i++) { for(int j=1;j<=x-i;j++) printf(" "); for(j=1;j<=2*i-1;j++) printf("*"); printf("\n"); } for(i=1;i<=x-1;i++) { for(int j=1;j<...

朝阳县13536115387: 用C语言打出菱形 -
周瑞气血: #include <stdio.h> int main() { int i,j,k,m; m = 5; for(i=0,k=1;i<m/2;i++,k+=2) { for(j=i; j <m/2; j++) printf(" "); for(j=1;j<k+1;j++) printf("*"); printf("\n"); } if(m%2==0) k-=2; for(i=m/2;i<m;i++,k-=2) { for(j=m/2-2; j <i - 2;j++) printf(" "); for(j=1;j<k+1;j++) printf("*"); printf("\n"); } }

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网