针对在校大学生的C语言入门学习——三种结构

针对在校大学生的C语言入门学习——三种结构

  • 大学教材里一般都喜欢将程序的结构分为三种,既顺序结构,选择结构,循环结构。我们今天就来聊聊这三种结构。这三种结构总的来说是干嘛用的呢?它们决定了代码的执行顺序,或者说计算机执行你下达的指令的顺序。

顺序结构

  • 顺序结构很好理解,当我们读一篇文章的时候,我们是不是按照从上到下的顺序一行一行的读呢?我想这个世界上绝大多数的人都是这样读的。顺序结构也是这样,计算机就是从上到下一行一行的执行我们的代码。很简单吧。比如我们参考菜谱学做木须柿子这道菜,菜谱会这样写:
    “鸡蛋打散
    柿子切成块
    锅内放略多一点油,油热后再放入蛋液,让蛋液蓬起来
    将蛋液打散
    另起锅放少许油
    油热,倒入柿子翻炒
    放入葱丝、适量盐,并将柿子压出汁
    将鸡蛋倒入翻炒片刻,让鸡蛋均匀沾上汁液
    出锅装盘”
  • 这个菜谱就是顺序结构,从上到下一行一行的读,然后一步一步的做就行了。可能有同学觉得这不是很自然的事吗?还用学习吗?人类不都是这么干的吗?没错!顺序结构几乎不需要去学习,人类正常表达逻辑就是顺序结构。那现在思考一个问题——为什么顺序结构和人类的思维习惯是一致的呢?
  • 请大家记住一句话——计算机编程语言不是自然科学,它是人类创造的一门学科!说到这里大家应该有所感触吧,谁创造一个工具的时候不是尽量让自己使用的更加顺手呢!所以不仅仅是顺序结构,编程语言中所有的语法都不是“大神”拍脑袋创造出来的,每个语法都会解决实际中的特定问题,并且使用起来和我们正常的思维习惯是高度一致的。
  • 大家再想想,我们应该怎么学习编程语言呢?难道只是背背语法就行了吗?就算把全部分语法倒背如流也没有用,学习编程语言一定要结合实际。比如某菜谱中写到“加糖少许”,这是什么意思?“少许”是多少?为什么要加糖?但是如果你亲自品尝过糖的味道,相信你能很灵活的掌握“少许”这个量,甚至更加灵活的处理调料!当你每提到一个语法,脑中就能瞬间闪出它的使用场景时,恭喜你,真的掌握了!相反的,有必要去花大量时间背语法吗?我个人觉得是没有必要的,只要经常花时间去练习编程,语法自然就能记住。记不住也不要紧,可以查书啊!当你对一门语言的使用达到一定的熟练度时,你会发现学习新的编程语言会变得非常简单。原因就是你已经理解了编程,剩下的事只是去查查要学习的语言的语法就可以了。当然了,能花时间读我文章到这里的同学想必离这个境界还差点距离,这个话题到此为止。
  • 总结一句话——学习编程没有捷径,但是有很多很多的弯路,唯有多练多练多练才能尽快的学会编程。

选择结构

  • if结构

  • 选择结构也叫分支结构,条件结构。举个例子吧!同学们看过西游记吗,如来对孙悟空有句话说“你若有本事,一筋斗打出我这右手掌中,算你赢,再不用动刀兵苦争战,就请玉帝到西方居住,把天宫让你”。
    对于这句话我们编程可以表达为:
 if(孙悟空一筋斗打出如来的右手掌)
 {
    
    
		把天宫让给孙悟空
 }
  • if结构就是用来表达“如果……就……”的逻辑。上面这段代码计算机会理解为“如果孙悟空一筋斗打出如来的右手掌成功了,就把天宫让给孙悟空”。
  • if-else结构

  • 可能有细心的同学会回去翻看西游记的这一段,会发现如来的完整的话是这么说的“你若有本事,一筋斗打出我这右手掌中,算你赢,再不用动刀兵苦争战,就请玉帝到西方居住,把天宫让你;若不能打出手掌,你还下界为妖,再修几劫,却来争吵。”按照完整的这句话应该如何表达呢?我们看这句话的逻辑是不是可以理解为“如果……就……否则……”这样的逻辑结构呢。C语言用if-else结构来表达“如果……就……否则……”的逻辑。代码如下:
if(孙悟空一筋斗打出如来的右手掌)
{
    
    
	把天宫让给孙悟空
}
else
{
    
    
	让孙悟空回去当你的猴吧
}
  • 这段代码计算机会理解为“如果孙悟空一筋斗打出如来的右手掌成功了,就把天宫让给孙悟空,否则就让孙悟空回去当猴吧。”
  • else-if结构

  • 同学们买烟的时候有没有遇到过这样的情景:同学:“来包华子”。老板:“卖没了”。同学:“来包玉溪”。老板:“卖没了”。同学:“来包黄鹤楼”。老板:“卖没了”。最后买个一包口香糖……
  • 这就不是“如果……就……否则……”这样的结构能够表达的逻辑了,因为选择的条件太多了。C语言用else if结构来表达这样的逻辑。请看代码:
if(有中华烟)
{
    
    
	买中华烟
}
else  if(有玉溪烟)
{
    
    
	买玉溪烟
}
else  if(有黄鹤楼烟)
{
    
    
	买黄鹤楼烟
}
else
{
    
    
	买口香糖
}
  • 这里N个条件,但是只能执行其中一个。这段代码计算机会理解为:“如果有中华烟,就买中华烟;否则的话如果有玉溪烟,就买玉溪烟;否则的话如果有黄鹤楼烟,就买黄鹤楼烟;如果什么都没有就买口香糖”。
  • switch-case结构

  • 同学们读书的时候有没有插书签的习惯。可能有的同学说从来不看书,何来什么习惯!就算没有插书签的习惯也应该明白插书签的含义吧。书签能够快速的让我们找到我们想看的页码。
  • 比如你正在读水浒传,在其中一些你比较喜欢的剧情处插了书签。“1、武松打虎;2、鲁智深倒拔垂杨柳;3、西门庆和潘金莲”。然后当某一天你突然想读某一处剧情的时候就会直接通过书签找到准确的位置。请看代码:
switch(我想看哪里)
{
    
    
case 武松打虎:
	武松打虎的剧情
	武松打虎以后的剧情
	break;
case 鲁智深倒拔垂杨柳:
	鲁智深倒拔垂杨柳的剧情
	鲁智深倒拔垂杨柳以后的剧情
	break;
case 西门庆和潘金莲:
	西门庆和潘金莲的剧情
	西门庆和潘金莲以后的剧情
	break;
}
  • 这段代码计算机会理解为:“从你想看的那个书签(case)开始看,一直看到break为止”。比如我想看“鲁智深倒拔垂杨柳”,那就会越过“鲁智深倒拔垂杨柳”之前的所有剧情,直接从“鲁智深倒拔垂杨柳”这段开始,然后一直到“西门庆和潘金莲”之前为止,因为遇到了break,就跳出整个switch-case结构。
  • 但是如果我想从某个书签开始一直读到正本书的结束呢?很简单,只需要去掉break就可以了。虽然绝大部分情况下我们使用switch-case结构都会加上break,但却不代表break是必须的,break在switch-case结构中的作用仅仅是在你觉得必要的时候跳出switch-case结构而已。请看下面代码:
switch(我想看哪里)
{
    
    
case 武松打虎:
	武松打虎的剧情
	武松打虎以后的剧情
case 鲁智深倒拔垂杨柳:
	鲁智深倒拔垂杨柳的剧情
	鲁智深倒拔垂杨柳以后的剧情
case 西门庆和潘金莲:
	西门庆和潘金莲的剧情
	西门庆和潘金莲以后的剧情
}
  • 这段代码的含义就是无论从哪个case开始执行,都会一直执行到switch-case结构中的最后一行代码。当然也可以根据实际需要保留一部分break。
  • switch-case结构经常会进入的误区

  • 很多同学都会自然的认为每个case都是一个独立的逻辑,事实不是这样的,整个switch-case结构中所有的代码是一个整体,每个case只不过是一个执行起点,而不能作为执行终点。

循环结构

  • 大家小时候上学一定都有过被老师罚写小楷的经历吧。我的一手好字就这样生生被我的小学老师给毁了!如果你有过这样的经历,那我相信以会对循环结构深有感触。回忆一下你的老师都是怎么给你下达罚写指令的。
    A方式:“把作业给我重写三遍!”
    B方式:“把作业给我重写一遍,
    把作业给我重写一遍,
    把作业给我重写一遍”。
    如果让你当老师的话,你会使用A或B哪种方式来表达呢?我想只要你的大脑还没有被摧毁,那一定会选择A方式吧。A和B的区别就在于A是循环结构,B是顺序结构。你会发现重复的逻辑如果还用顺序结构来表达,不仅啰嗦,而且很傻。

  • C语言的循环有三种表达方式。先给大家一个结论——三种循环的区别在于分别适用于不同的逻辑表达,在循环执行效率上没有任何区别。

  • for循环

  • “把作业给我重写三遍!”这样的逻辑非常适合适用for循环来表达。请看代码:

for(i = 0;i < 3;i++)
{
    
    
	作业写一遍
}
  • 这段代码计算机会理解为:“要循环3次,每次循环写一遍作业”。
  • 关于for循环的执行过程我不想赘述,这里说一个新手写循环的时候需要注意的地方。新手尽量不要让循环变量(示例中i是循环变量)出现在循环的逻辑中(实例中{}中的代码就是循环逻辑)。为什么呢?因为循环变量的本质就是循环计数,让我们的循环能够准确执行预期的次数,变量本身已经有一个逻辑身份了。如果参与到循环的逻辑中,那么大概率循环变量会被额外赋予另一个逻辑身份,这会使得逻辑表达的复杂度增加,容易影响代码的可读性,甚至出现逻辑错误。
  • 但事实上循环变量参与到循环逻辑中是常有的事。说明这并不是什么坏事,只要能保证代码简洁逻辑表达清晰,又没有bug就好。个人建议如果对于循环逻辑还没有思考的很清晰时尽量不要让循环变量参与到循环逻辑中。等功能完成后再观察循环变量和循环逻辑的关系,在不影响逻辑表达清晰的前提下再将循环变量参与到循环逻辑中。
  • while循环

  • 还是罚写作业的问题,如果老师不说“把作业给我重写三遍”,而是说“重写,写到老师满意为止”。oh my god!但愿同学们都没有遇到过这样的bug!遇到这样的逻辑应该如何表达呢,这是要写多少遍啊?不要紧,请看下面代码:
while(老师不满意)
{
    
    
	写一遍作业
}
  • 这段代码计算机会理解为:“只要老师不满意就写一遍作业”。不需要循环变量吗?因为这个循环不是要表达需要循环多少次,而是根据条件来决定是否要循环,所以不需要循环变量。
  • do-while循环

  • 咱们男同学早晚是要娶妻生子的。假如有一天,你媳妇在做饭,你儿子在地上打滚玩耍,你躺在沙发上“打王者”。突然你媳妇推开厨房的门,伴随着一股油烟出来一声怒吼“死鬼,酱油没了,赶紧去买一瓶”。而你正是在推塔的关键时刻,与生俱来的责任感告诉你不能出卖你的队友。这时候你的余光扫到了正在地上打滚的儿子,“儿子啊,爸爸给你拿钱,出去买一瓶酱油回来好不好”。花钱的快感显然胜过地上打滚,儿子毫不犹豫的拿钱出去了。不多时,儿子回来了,但是带回来的不是酱油而是陈醋!这时候你会怎么办?打一顿?“这孩子酱油陈醋分不清,像谁啊这是”,父爱让你选择了默默忍受,一番教导后让儿子出去再买一瓶。这时你按下决心,一定要让儿子买一瓶酱油回来为止!
  • 就是这样一个逻辑,本来只需要执行一遍的逻辑,由于执行结果不能满足你的要求,所以循环了。请看下面代码:
do{
    
    
	儿子出去买酱油
}while(买回来的不是酱油);
  • 这段代码计算机理解为:“先无条件让儿子出去买酱油,如果买回来的不是酱油就再出去买。如果买回来的是酱油那么循环停止”。
  • 循环总结

  • 以上是三种循环使用的逻辑示例,前面我说过三种循环的区别是分别适用于不同的逻辑表达。那么如何选择呢?
  • for循环适合表达有次数的循环。
  • while循环适合表达无次数,需要根据条件决定的循环。
  • do-while循环是对循环逻辑执行的结果进行校验,如果不满足预期则重新执行。本质上并不期待循环。
  • 可能有同学会想,我大脑中那么多的智慧,怎么是区区三个结构就能表达的!但事实就是这样的,以目前人类的智力,任何逻辑都可以使用这三种结构来表达。当然如果只使用单一的某种结构一定会在逻辑表达上捉襟见肘,三种结构如果互相嵌套起来就能够把人类大脑中所有的逻辑都表达出来!稍有不慎还能写出六亲不认的代码来,相信有做过一些训练的同学深有感触。
  • 到目前为止同学们已经可以使用C语言表达一些基础的逻辑了。其实如果你受过足够的训练,目前的语法已经足够表达一个非常复杂的算法了。下一次我会拿几个比较基础的常见的编程逻辑循环的题和大家分享。

猜你喜欢

转载自blog.csdn.net/seamancsdn/article/details/111830553
今日推荐