来自《C语言程序设计-现代方法(第2版)》第二章的编程题1:
使用printf打印如下类似图形:
/*
==============================
*
*
*
* *
* *
*
==============================
*/
当然最简单的办法是一行一行的打印,后来想用变量来代替并要求输入需要打印的层数。
最开始想用"\b"退格打印"V"的第一边,感觉不好控制并且"\b"不一定各种系统均兼容退格的效果,写了一半放弃了
后来想,有以下特点:
不管是什么字符,每打1行,字符数-1;
每一行末尾均为字符"*"和换行符;
"V"形的第一边从层的一半开始,每加一层,第一边缩进一个空格
看来,"想"才是最重要的。
唉,当年学计算概论也做过这道题目,那时为了应付交差就按最简单的方法做了。
现在做项目也没怎么多想,想着能实现功能就行了,特别是外包的项目...
在我头顶天空一直看着我的那个人说,这种态度不好...我说好吧......
/*
========================================
Name : C语言程序设计-现代方法第二章第一题
Desc : 输出如下图形
*
*
*
* *
* *
*
========================================
*/
#include <stdio.h>
int main( void)
{
int i, j;
/*层数*/
int layer=0,
/*第一层总字符数*/
firstLayerChars,
/*中间变量,某一层的字符数*/
tmpLayerChars,
/*层数的一半,刚好是V另一边开始*/
halfLayer,
/*是否是奇数层*/
isOdd=0;
printf("Please enter the layers you want to print:(layer must gt 4)\n");
scanf( "%d", &layer);
if ( layer < 4 ) {
printf("layer must gt 4.\n" );
return 0;
}
/*计算第一层要打印的字符数*/
if ( layer%2 ==0 ) {
/*将折断的*往下移动成直线,则为要打印的字符数*/
halfLayer = layer/2;
} else {
halfLayer = (layer-1)/2;
isOdd = 1;
}
firstLayerChars = (halfLayer-1) + layer;
for ( i=0; i<layer; i++ ) {
tmpLayerChars = firstLayerChars-i;
for ( j=0; j<tmpLayerChars; j++) {
if ( j<tmpLayerChars-1 ) {
if ( i<halfLayer ) {
printf(" " );
} else {
/*V开始*/
if ( j-(i-isOdd-halfLayer) == 0 ) {
printf("*" );
} else {
printf(" " );
}
}
} else {
printf("*\n" );
}
}
}
getchar();
getchar();
return 0;
}