今天我们先来讲解一道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. 记一次利用AutoMapper优化项目中数据层到业务层的数据传递过程。

    目前项目中获取到DataSet数据后用下面这种方式复制数据. List<AgreementDoc> list = new List<AgreementDoc>(); ].Row ...

  2. 如何用python绘制各种图形

    1.环境 系统:windows10 python版本:python3.6.1 使用的库:matplotlib,numpy 2.numpy库产生随机数几种方法 import numpy as np nu ...

  3. Java内存管理思维导图

    文 by / 林本托 Tips 做一个终身学习的人. 如果想要成为一名合格的 Java 程序员,就必须要涉及和掌握一些 Java 虚拟机的内部结构和特性.最近在读<深入理解Java 虚拟机> ...

  4. sql 中三大范式详解

     1 第一范式(1NF)    在任何一个关系数据库中,第一范式(1NF)是对关系模式的基本要求,不满足第一范式(1NF)的数据库就不是关系数据库.     所谓第一范式(1NF)是指数据库表的每一列 ...

  5. 数据库并行读取和写入(Python实现)

    这篇主要记录一下如何实现对数据库的并行运算来节省代码运行时间.语言是Python,其他语言思路一样. 前言 一共23w条数据,是之前通过自然语言分析处理过的数据,附一张截图: 要实现对news主体的读 ...

  6. [转]html转码表

    为什么要用转义字符串? HTML中<,>,&等有特殊含义(<,>,用于链接签,&用于转义),不能直接使用.这些符号是不显示在我们最终看到的网页里的,那如果我们希 ...

  7. Java - byte[] 和 String互相转换

    通过用例学习Java中的byte数组和String互相转换,这种转换可能在很多情况需要,比如IO操作,生成加密hash码等等. 除非觉得必要,否则不要将它们互相转换,他们分别代表了不同的数据,专门服务 ...

  8. [0] CollectionBase与索引符DictionaryBase与迭代器

    对于简单数组来说,需要用固定的大小来初始化,才能使用: Animal[] myAnimal=new Animal[10]; myAnimal[0]=new Cow("Ken"); ...

  9. 并发编程(三):全视角解析volatile

    一.目录 1.引入话题-发散思考 2.volatile深度解析 3.解决volatile原子性问题 4.volatile应用场景 二.引入话题-发散思考 public class T1 { /*vol ...

  10. Matlab: 路径的操作

    添加相对路径 在matlab中当代码很多时常常将结果存在不同的文件夹下面,常常使用相对路径对函数进行调用,但有时会存在问题.举个栗子: 代码结构如下: /codes/A/AA/code1.m /cod ...