为了配合专题C语言从零开始,今天开始一个新的专题《21天C语言代码训练营》。这个专题重点针对从零开始系列进行练习题讲解。以21天为一个周期,为大家提供编程方面的实例讲解。
最近,越来越多的初学者朋友在给我的邮件中提出这样的问题:我在文章中讲的东西他们都看懂了,但具体到自己写代码的时候却完全不知道从何入手。其实看懂知识点例程和真正学会写代码之间相差了好几条街,我一再强调,学编程没有捷径,只有老老实实地敲代码。对于文章中的例子,大家一定要达到自己能够完整的敲出来才行。当然,这里并不是要求大家死记硬背,要求的是在懂得设计思路和程序语法的基础上,经过自己的二次加工后重新实现的过程。
在这个专题中,我们以练习为主,讲解为辅,力求寻找出一种帮助大家快速提高编码能力的新玩法。也希望朋友们紧跟我的更新速度坚持每天做练习,大家共同进步。
欢迎大家每天前来打卡~
训练营规则
- 每天出一道练习题,请大家自己完成编码
- 第二天的文章中会告诉大家一种或几种经典解决方法
- 完成练习的同学,欢迎大家把代码贴在留言中
- 如果有问题,也请留言,我会找机会集中解答
希望这种手把手的方式能够帮助大家尽快掌握C语言编程。
1. 例题
今天我们先来讲解一道C语言的经典例题,也是从零开始系列中的一道课后练习题。
请用控制台程序绘制如下图案。
循环经典例题2. 分析
这个题目是要求打印30行"*",每行打印的个数不同。通过这个信息,我们应该立刻反映出运用循环来完成。那么我们想想,在循环部分我们都学到了什么。
关于循环,我首先会想到一些例题:
2.1 例题1
打印30个"*",每个"*"占一行。
int i;
for (i = 0; i < 30; i++)
{
printf("*\n");
}
2.2 例题2
打印一行"*",个数为30
int i;
for (i = 0; i < 30; i++)
{
printf("*");
}
这两个题目的代码只差一个\n,结果却完全不同。掌握了这两个例题,我们自然能够完成下面这个例题了。
2.3 例题3
打印一个由"*"组成的30行30列的矩阵。
int main()
{
int i, j;
for (i = 0; i < 30; i++)
{
for (j = 0; j < 30; j++)
{
printf("*");
}
printf("*\n");
}
return 0;
}
执行结果如下:
30*30矩阵我们再把例3的要求改一改,要求如下
2.4 例题4
打印30行“*”。第一行打印1个“*”,第二行打印3个“*”,第三行打印5个“*”,... ,第三十行打印59个“*”。
在前面的程序中,我们用变量i控制行的循环,变量j控制列的循环。i的范围029,j的范围029。那么在例题4中,i和j有什么样的关系呢?
找规律 | ||
---|---|---|
第一行 | i = 0; | j循环1次 |
第二行 | i = 1; | j循环3次 |
第三行 | i = 2; | j循环5次 |
... | ... | ... |
第三十行 | i = 29; | j循环59次 |
于是得到这样一个关系:
规律 | ||
---|---|---|
第n行 | i = n - 1; | j循环2i + 1次 |
那么如何实现循环2i + 1次呢,就是让j从0到2i + 1。
按照这个思路,可以得到下面的代码:
#include <stdio.h>
#define LINE 30
int main()
{
int i, j;
for (i = 0; i < LINE; i++)
{
for (j = 0; j < 2 * i + 1; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
执行结果如下:
例题4这里要说一个问题,其实for循环有两种常见形式:
for (i = 0; i < n; i++)
和
for (i = 1; i <= n; i++)
这种写法执行的次数相同,可以相互代替。大部分C语言程序员喜欢第一种方式,因为数组的下标访问是从0开始的,这样写更方便。目前大家可以选择自己喜欢的方法。
好了,回到例题中来。现在我们的代码距离目标输出已经很接近了,缺少的是在每行“*”之前需要输入不同数量的空格。我们分析i和空格数量,可以得到如下关系:
每行输出LINE - i个空格
于是,我们得到了最终的实现程序。
3. 答案
#include <stdio.h>
#define LINE 30
int main()
{
int i, j;
for (i = 0; i < LINE; i++)
{
for (j = 0; j < (LINE - i); j++)
{
printf(" ");
}
for (j = 0; j < 2 * i + 1; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
运行一下这段代码,你会看到打印结果就是最前面的那张图。
4. 课后练习
自己编写代码,打印出下面这张图。
菱形明天会讲解这个程序,请大家先做练习。欢迎将自己的程序贴在留言中。
我是天花板,让我们一起在软件开发中自我迭代。
如有任何问题,欢迎与我联系。
下一篇:21天C语言代码训练营(第二天)
网友评论
#define LINE 10
int main()
{
int i,j;
for(i=0;i<LINE;i++)
{
for(j=0;j<(LINE-i-1);j++)
{
printf(" ");
}
for(j=0;j<2*i+1;j++)
{
printf("*");
}
printf("\n");
}
for(i=0;i<LINE;i++)
{
for(j=0;j<i+1;j++)
{
printf(" ");
}
for(j=0;j<2*(LINE-i-1)-1;j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
int main()
{
int i,j;
for(i=0;i<60;i++)
{
if(i<30)
{
for(j=0;j<30-i;j++)
{
printf(" ");
}
for(j=0;j<2*i+1;j++)
{
printf("*");
}
printf("\n");
}
else
{
for(j=0;j<i-28;j++)
{
printf(" ");
}
for(j=0;j<-2*i+117;j++)
{
printf("*");
}
printf("\n");
}
}
return 0;
}
for(i=1;i<32;i++)
{
if(i==16)
{
for(j=0;j<2*16-1;j++)
{
printf("%c",42);
}
printf("\n");
}
else if (i<16)
{
for(j=i;j<16;j++)
{
printf("%c",32);
}
for(j=1;j<=2*i-1;j++)
{
if(j==2*i-1)
{
printf("%c\n",42);
}
else
{
printf("%c",42);
}
}
}
else if(i>16)
{
for(j=1;j<=i-16;j++)
{
printf("%c",32);
}
for(j=1;j<=2*(32-i)-1;j++)
{
if(j==2*(32-i)-1)
{
printf("%c\n",42);
}
else
{
printf("%c",42);
}
}
}
}
#define LINE 30
int main()
{
int i, j;
for (i = 0; i < LINE; i++)
{
for (j = 0; j < (LINE - i); j++)
{
printf(" ");
}
for (j = 0; j < 2 * i + 1; j++)
{
printf("*");
}
printf("\n");
}
for (i = LINE; i > 0; i--)
{
for (j = 0; j < (LINE - i); j++)
{
printf(" ");
}
for (j = 0; j < 2 * i - 1; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
printf("*\n"); 是不是多打了一列,应该是 printf("\n");
你那样打出来的是30行*30列
#include <stdio.h>
int main(int argc, const char * argv[]) {
int countRow = 30;
int tempCountRow = 1;
char star = '*';
char space = ' ';
int starRowCount = 0;
int spaceRowCount = 0;
int col = 0;
// printf("zzzz\n");
while(countRow > tempCountRow) {
// printf("zzzz\n");
starRowCount = tempCountRow + (tempCountRow - 1);
spaceRowCount = countRow-tempCountRow;
col = starRowCount + spaceRowCount;
char tmpCount[col];
if(countRow < tempCountRow){
break;
}
for(int i = 0;i < col;i++) {
if(i<spaceRowCount){
tmpCount[i] = space;
}else{
tmpCount[i] = star;
}
// printf("%d = |%c|\n",i,tmpCount[i]);
}
printf("%s\n",tmpCount);
// printf("%c",tmpCount[i]);
// }
// printf("\n");
tempCountRow++;
}
return 0;
}
int main()
{
int i, j;
for (i = 0; i < 30; i++)
{
for (j = 0; j < 30; j++)
{
printf("*");
}
printf("*\n");
}
return 0;
}
例3出来的是30行31列的矩阵,而并非是30列的,应该将“ printf("*\n")”换成“ printf("\n")”
21天C语言代码训练营(第一天)
http://www.jianshu.com/p/d8a5712a9b08
*/
#include <stdio.h>
#include <string.h>
#define TIMES 30
int main()
{
char *star = "**", stars[2 * TIMES + 1] = "*";
char *blank = "", format[] = "%00s%s%00s\n";
int i = 1;
for (; i <= TIMES; i++) {
format[1] = format[7] = (TIMES - i) / 10 + 48; /*十位*/
format[2] = format[8] = (TIMES - i) % 10 + 48; /*个位*/
printf(format, blank, stars, blank);
strcat(stars, star); /*每行增加两个*/
}
return 0;
}
int main(int argc, const char * argv[]) {
// insert code here...
int kLineCount = 30;
for (int i = 0; i < kLineCount; i++) {
for (int j = 0; j < kLineCount - i; j++) {
printf(" ");
}
for (int j = 0; j < 2 * i + 1; j++) {
printf("*");
}
printf("\n");
}
for (int i = kLineCount; i > 0; i--) {
for (int j = kLineCount; j > 0 + i; j--) {
printf(" ");
}
for (int j = 2 * i - 1; j > 0; j--) {
printf("*");
}
printf("\n");
}
return 0;
}
#define LINE 15
int main()
{
int i,j;
for(i=0;i<=LINE;i++)
{
for(j=0;j<=(LINE-i);j++)
{
printf(" ");
}
for(j=0;j<2*i+1;j++)
{
printf("*");
}
printf("\n");
}
for(i=LINE-1;i>=0;i--)
{
for(j=0;j<=(LINE-i);j++)
{
printf(" ");
}
for(j=0;j<2*i+1;j++)
{
printf("*");
}
printf("\n");
}
}