今天我们先来讲解一道C语言的经典例题,也是从零开始系列中的一道课后练习题。

请用控制台程序绘制如下图案。

循环经典例题

分析情况

这个题目是要求打印30行"*",每行打印的个数不同。通过这个信息,我们应该立刻反映出运用循环来完成。那么我们想想,在循环部分我们都学到了什么。

关于循环,我首先会想到一些例题:

例题1

打印30个"*",每个"*"占一行。

int i;for (i = 0; i < 30; i++)
{    printf("*\n");
}

例题2

打印一行"*",个数为30

int i;for (i = 0; i < 30; i++)
{    printf("*");
}

这两个题目的代码只差一个\n,结果却完全不同。掌握了这两个例题,我们自然能够完成下面这个例题了。

例题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的要求改一改,要求如下

例题4

打印30行“*”。第一行打印1个“*”,第二行打印3个“*”,第三行打印5个“*”,... ,第三十行打印59个“*”。

在前面的程序中,我们用变量i控制行的循环,变量j控制列的循环。i的范围0~29,j的范围0~29。那么在例题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 30int 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个空格

于是,我们得到了最终的实现程序。

答案

#include <stdio.h>#define LINE 30int 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;
}

运行一下这段代码,你会看到打印结果就是最前面的那张图。

课后练习

自己编写代码,打印出下面这张图。

菱形 更多的题型请点击这里

C语言代码训练(一)的更多相关文章

  1. 机器学习十大算法总览(含Python3.X和R语言代码)

    引言 一监督学习 二无监督学习 三强化学习 四通用机器学习算法列表 线性回归Linear Regression 逻辑回归Logistic Regression 决策树Decision Tree 支持向 ...

  2. Latex中插入C语言代码

    Latex是一个文本排版的语言,能排版出各种我们想要的效果.而且用代码排版的优点是易于修改板式,因此在文本内容的排版时,Latex应用十分广泛. 当我们需要在Latex中插入代码时,就需要用到 \us ...

  3. loadrnner添加C语言代码的几种方式

    今天有人在群里问,想直接把自己的C语言代码让lr调用,该怎么搞. 这东西说来简单,只是对Loadrunner这工具不熟悉可能才会有这种问题吧.个人理解,一般有三种方法吧,废话不多,直接干货. 1.直接 ...

  4. HTML之一语言代码

    HTML的lang属性可用于网页或部分网页的语言.这对搜索引擎和浏览器是有帮助的. 同时也可以是指HTTP Header中的Accept-Language/Content-Language. ISO ...

  5. 让你的Windows不断重启的C语言代码

    原文:让你的Windows不断重启的C语言代码 没有写Linux的原因是因为搞不定Linux下的权限问题,而Windows下基本上使用电脑的用户都是管理员,所以钻个空了,不多说下面是代码#includ ...

  6. 国家语言,语言代码,locale id对应表

    国家语言,语言代码,locale id对应表.比如 en_US对应的id为1033, 中文的locale=zh_CN,id=2052. Locale Languagecode LCIDstring L ...

  7. 如何提高单片机C语言代码效率

    代码效率包括两个方面内容:代码的大小和代码执行速度.如果代码精简和执行速度快,我们就说这个代码效率高.一般情况下,代码精简了速度也相应提上来了.单片机的ROM和RAM的空间都很有限,当您编程时遇到单片 ...

  8. 使用highlight.js高亮静态页面的语言代码

    显示静态的代码其实html的pre标签基本可以满足需求了,至少不会将换行的文本显示成一堆字符串. 不过能使静态的文本能高亮显示,倒更炫酷一点.其实很简单的,引入highlight.js包,可以使用cd ...

  9. HTML5 脚本 语言代码 URL 符号实体 ASCII码 颜色

    1.HTML<noscript> 标签 <noscript> 标签提供无法使用脚本时的替代内容,比方在浏览器禁用脚本时,或浏览器不支持客户端脚本时. <noscript& ...

随机推荐

  1. 一位菜鸟的java 最基础笔记

    java的特性 简单性(Simple). 结构体系中立(Architecture Neutral). 面向对象(Object Oriented). 易于移植(Portable). 分布式(Distri ...

  2. angularJS ng-change错误的解决方案

    导入文件:<script src="../../js/angular/angular-file-upload/angular-file-upload.js"></ ...

  3. C#之out修饰符、ref修饰符、params修饰符的简单介绍

    一.out修饰符 1.调用一个带有输出参数的方法也需要使用out 修饰符,但是作为输出变量传递的本地变量在将他们作为输出变量传递前不需要赋值(因为调用后会改变或丢失),编译器允           许 ...

  4. JDBC加载数据库驱动的方式

    JDBC作为数据库访问的规范接口,其中只是定义一些接口.具体的实现是由各个数据库厂商来完成. 一.重要的接口: 1.public interface Driver 每个驱动程序类必须实现的接口.Jav ...

  5. git 知识点汇总

    git commit git commit 命令执行后, git 主要执行了三个操作: 为每一个文件生成一个快照 每一个文件其实是真的数据, 所以 git 会把整个文件内容转成二进制, 然后经过压缩直 ...

  6. ISO文件:AMD64和i386的区别

     下载kali系统时,出现两个选项:ADM64和i386,那么这两者的区别是什么?  i386=Intel 80386.其实i386通常被用来作为对Intel(英特尔)32位微处理器的统称. AMD6 ...

  7. 调用phprpc的时候出现Fatal error: Cannot redeclare gzdecode()

    出现这个问题的原因是:php在5.4版本后,已经自包含了gzdecode()函数,开发者自己定义的gzdecode()函数会与其冲突. 在 ....\phpRPC\compat.php文件的第72行( ...

  8. Swift连接字符串和字符

    字符串和字符的值可以通过加法运算符 (+) 相加在一起并创建一个新的字符串值: let string1 = "hello" let string2 = " there&q ...

  9. CSS3学习系列之背景相关样式(一)

    新增属性: background-clip:指定背景的显示范围 background-origin:指定绘制背景图像时的起点 background-size:指定背景中图像的尺寸 background ...

  10. alt和title的区别与用法

    alt和title的是我们工作中经常用到这两个属性,但是一直没有总结他们的区别.现在就对他们两个的用法做一下总结.相同点:他们都会飘出一个小浮层,显示文本内容.不同点:1.alt只能是元素的属性,而t ...