版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三章:C程序入门单片机C程序设计(CProgrammingforMCU)2本章目标了解算法及控制结构掌握使用选择结构及程序设计掌握使用循环结构及程序设计3程序设计程序设计过程就是解决问题的过程。程序设计通常包括如下五个步骤:问题分析编码算法设计程序设计步骤测试调试有问题无问题分析问题:功能:需要弄清楚软件要完成的功能;输入:如果问题有输入,分析输入是什么及输入数据的类型;
处理:对输入数据做什么处理;
输出:如果有输出,输出什么数据及输出数据的格式;对于复杂问题,可将问题分解为若干子问题,然后再进行上面的分析。算法设计:设计解决问题的具体方案(步骤)。编码:将算法用高级语言实现。测试:运行编译连接后得到的执行程序,以验证程序是否按要求解决了问题,并没有产生副作用。即程序是否做了该做的事,同时没有做不该做的事。调试:如果程序经测试发现问题,则通过调试手段找到产生错误的代码并修复它。4结构化程序设计(structuredprogramming)将复杂问题分解为简单问题的程序设计方法称为结构化程序设计,其特点为:自顶向下(top-down);逐步细化(stepwiserefinement);模块化(modular);5算法任何计算问题的解决都是按指定的顺序执行一系列动作的结果。解决问题的动作及动作之间的顺序称为算法(algorithm)。6问题2.1问题:“判断某学生成绩是否及格”7问题2.1:问题分析输入:学生成绩;类型:整型;处理:学生成绩值与60进行比较,大于或等于60,则及格,否则不及格;输出:字符串“Pass”或“Fail”;变量:需要一个整型变量用于存放输入的学生成绩。8问题2.1:算法设计解决问题2.1的步骤可描述为(算法):读入学生成绩值如果该成绩值大于或等于60
输出信息“Pass”否则输出信息“Fail”9算法表示算法即可以用自然语言表述(如前),也可用用半结构化语言或结构化图形表示,如:read学生成绩值if成绩值>=60print“Pass”elseprint“Fail”读学生成绩值成绩值>=60输出”Fail”输出”Pass”真假10控制结构计算机语言提供三种方式来控制算法的执行:顺序(Sequence)、选择(Selection)和循环(Loop)。语句1语句2语句n顺序条件语句1语句2选择真假条件语句真假循环11语句C语言语句分成简单语句和构造语句两类。简单语句1)表达式语句赋值表达式语句,如:*x++=y*=z+3;其它表达式语句,如:++x;--y;函数调用语句等。2)转移语句goto标号;break; 间断语句continue; 继续语句return;return(表达式);3)空语句 ;12语句(续)构造语句1)复合语句(分程序){[<局部数据说明>]<语句>*}注意:}后没有分号(;),这与单个语句不同。2)选择(条件)语句if语句,if_else语句3)循环语句for语句while语句do_while语句4)开关语句switch语句(包括case语句)13选择结构:if语句if(表达式)
语句
if(表达式)
语句1else
语句2表达式语句FT表达式语句1FT语句214选择结构:if语句if(表达式1)语句1
elseif(表达式2)
语句2elseif(表达式3)
语句3……elseif(表达式m)
语句melse语句m+115选择结构:if语句(续)注意:在if嵌套中,省略else会产生二义性。如:if(n>0)if(a>b)z=a;elsez=b;即else与前面最接近的不带else的if相对应。若要使上面的else与第一个if相匹配,可使用{}。如:if(n>0){if(a>b)z=a;}elsez=b;16问题2.1:代码实现与测试根据其算法描述,我们很容易将问题“判断学生成绩是否及格”的解决转换为相应的程序。例2-1/*判断学生成绩是否及格*/#include<stdio.h>main(){intscore;scanf(“%d”,&score);if(score>=60)printf(“Pass\n”);elseprintf(“Fail\n”);}程序程序设计的常用方法为首先给出问题的算法描述,然后将其编程序实现。read学生成绩值if成绩值
>=60print“及格”elseprint“不及格”算法if选择(条件)语句如何判断程序解决了相应问题?可用下面输入数据来测试(检验):75(输出应为“Pass”)30(输出应为“Fail”)60(输出应为“Pass”)--特殊数据17问题2.2问题:“判断某学生成绩对应的五级评分成绩”问题分析:输入:学生成绩;类型:整型;处理:学生成绩值分别与90,80,70,60进行比较,以判断其为优、良、中、及格和不及格中哪一等级;输出:A(优)、B(良)、C(中)、D(及格)、F(不及格);变量:需要一个整型变量用于存放输入的学生成绩。18问题2.2:算法设计解决该问题的算法如下:得到学生成绩值如果该成绩值大于或等于90
输出信息“优”否则如果该成绩值大于或等于80
输出信息“良”否则如果该成绩值大于或等于70
输出信息“中”否则如果该成绩值大于或等于60
输出信息“及格”否则输出信息“不及格”学生成绩值优>=90良中及格不及格>=80>=70>=60<60多路选择19问题2.2:代码实现与测试得到学生成绩值如果该成绩值大于或等于90
输出信息“优”否则如果该成绩值大于或等于80
输出信息“良”否则如果该成绩值大于或等于70
输出信息“中”否则如果该成绩值大于或等于60
输出信息“及格”否则输出信息“不及格”算法例2-2/*判断学生成绩对应的五级评分*/#include<stdio.h>main(){intscore;scanf(“%d”,&score);if(score>=90)printf(“A\n”);elseif(score>=80)printf(“B\n”);elseif(score>=70)printf(“C\n”);elseif(score>=60)printf(“D\n”);elseprintf(“F\n”);}嵌套if结构测试数据为:95908580757065605520多路选择:if_elseif例2-2a/*判断学生成绩对应的五级评分*/#include<stdio.h>main(){intscore;scanf(“%d”,&score);if(score>=90)printf(“A\n”);elseif(score>=80)printf(“B\n”);elseif(score>=70)printf(“C\n”);elseif(score>=60)printf(“D\n”);elseprintf(“F\n”);}一种更好的风格!21多路选择:if_elseif(续)注意:不当的判断顺序可能造成程序错误的执行结果,如:#include<stdio.h>main(){intscore;scanf(“%d”,&score);
if(score>=60)printf(“D\n”);elseif(score>=80)printf(“B\n”);elseif(score>=70)printf(“C\n”);elseif(score>=90)printf(“A\n”);elseprintf(“F\n”);}下面程序实现与例2-2a程序完成一样的功能,但效率要低。/*判断学生成绩对应的五级评分*/#include<stdio.h>main(){intscore;scanf(“%d”,&score);if(score>=90&&score<=100)printf(“A\n”);if(score>=80&&score<90)printf(“B\n”);if(score>=70&&score<80)printf(“C\n”);if(score>=60&&score<70)printf(“D\n”);if(score<60)printf(“F\n”);}22多路选择:switch语句基本形式:switch(表达式){case常量表达式1:语句1或空;case常量表达式2:语句2或空;…case常量表达式n:语句n或空;default:语句n+1或空;}语义动作为:先计算表达式的值;该值与每一个case后的常量进行比较;若匹配,则控制就转向该常量后的语句;若不匹配,若有default,则转向default后的语句,否则什么也不做;S1S2SnSn+1EC1C2…Cndefault23多路选择:switch语句(续)注意:常量表达式必须是整型(if_elseif可能根据任意条件来进行多路选择);在同一个switch中不应出现两个具有同样的情况常量;default语句如果有,只允许出现一次,default可出现在switch中的任何位置,通常放在最后;case和default本身不改变控制流,中断离开switch要用break;case后的语句可以是单个语句,也可以是复合语句(但不带开头和结尾的花括号);多个case可共用一条执行语句。因此,switch语句特别适合于依据一组常量值来进行判断的多路选择。24多路选择:switch语句(续)例如:打印学生成绩#include<stdio.h>main(){charscore;score=getchar();switch(score){case‘F’:printf(“nopass\n”);break;case‘D’:printf(“pass\n”);break;case‘C’:printf(“better\n”);break;case‘B’:printf(“right\n”);break;case‘A’:printf(“allright\n”);break;default:printf(“inputerror!\n”);break;}}case‘C’:printf(“better\n”);将出现什么问题?如果输入为‘C’,则输出为:betterright25多路选择:switch语句(续)问题2.2的另一种解决方式。例2-2b/*判断学生成绩对应的五级评分*/#include<stdio.h>main(){intscore;scanf(“%d”,&score);if(score>=0&&score<=100)switch(score/10){case10:case9:printf(“A\n”);break;case8:printf(“B\n”);break;case7:printf(“C\n”);break;case6:printf(“D\n”);break;default:printf(“F\n”);break;}elseprintf(“inputerror!\n”);}26问题2.3问题:“某班有30名学生,输入每个学生成绩并判断其是否及格”。问题分析:输入:学生成绩;类型:整型;处理:学生成绩值与60进行比较,大于或等于60,则输出及格(”Pass”),否则输出不及格(”Fail”);输出:字符串“Pass”或“Fail”;依次对每个学生重复上面步骤,重复次数为30次。变量:需要一个整型变量用于存放输入的学生成绩,一个整型变量用于记录重复次数。27问题2.3:算法设计算法:1.设置变量n为12.读入一学生成绩值到变量score中3.判断score值,如果大于或等于60,则输出“Pass”,否则输出”Fail”;4.变量n加15.重复步骤2至4,直到n等于3028问题2.3:算法设计(续)设置变量n为1n<=30读入一学生成绩值到变量score中判断score值,输出“Pass”或“Fail”变量n加1真假结束算法流程图29问题2.3:代码实现程序:例2-3/*判断某班学生成绩是否及格*/#include<stdio.h>main(){intn,score;n=1;while(n<=30){scanf(“%d”,&score);printf(“%d:“,n);if(score>=60)printf(“Pass\n”);elseprintf(“Fail\n”);n++;}}算法:1.设置变量n为12.读入一学生成绩值到变量score中3.如果score>=60
输出”Pass”
否则输出“Fail”4.变量n加15.重复步骤2至4,直到n等于30while循环语句测试数据考虑:依次输入30个成绩值,这些值中应包括100,60,0等特殊值。30循环结构:while语句
while(表达式)语句“先判后循环”例如:k=1;
while(k<=100){s=s+k;k++;}循环前,循环变量必须赋初值;循环体中,必须有改变循环变量的语句(结束循环);循环体可以为空。例如:while((c=getchar())!=‘A’);表达式语句FT计算表达式语句结束31循环结构:while语句(续)例:从键盘读入字符并输出#include<stdio.h>#defineEOF-1main(){intc;while((c=getchar())!=EOF)putchar(c);}算法分析:读入一个字符while不是输入结束符输出字符;读入下一个字符;1)程序如何结束?
Ctr+z2)为何程序运行:
hello<enter>hello32循环结构:while语句(续)例:/*输入某班30名学生成绩,求总分及平均分*/#include<stdio.h>main(){inti,score,sum,ave;sum=0;i=1;while(i<=30)
{ scanf("%d",&score); sum=sum+score;
i++;
}ave=sum/(i-1);printf("sum=%d\nave=%d\n",sum,ave);}33循环结构:do_while语句do语句while(表达式);
作用类似于while,但do_while是否终止,其判定条件是在循环体之后,即它总是先执行一次循环体,再判断表达式的值是否为真。表达式语句FT计算表达式语句结束34循环结构:do_while语句(续)while循环是在顶上测试循环终止条件;do_while是在每次通过循环体之后,在底部进行测试,所以循环体至少要进行一次。例如:do{s=s+k;k++;}while(k<=100);35循环结构:do_while语句(续)*例:/*输入某班30名学生成绩,求总分及平均分*/#include<stdio.h>main(){inti,score,sum,ave;sum=0;i=1;do{ scanf("%d",&score); sum=sum+score; i++;}while(i<=30);ave=sum/(i-1);printf("sum=%d\nave=%d\n",sum,ave);}一般来说,不管do_while中是单个语句还是复合语句,都用一对{}将其括起来,以使不致把while部分误认为是while循环的开始。36循环结构:do_while语句(续)*例:/*输入某班任意名学生成绩,求总分及平均分*/#include<stdio.h>main(){inti,score,sum,ave;sum=0;scanf("%d",&i);while(i<=30)
{ scanf("%d",&score); sum=sum+score; i++;
}ave=sum/(i-1);printf("sum=%d\nave=%d\n",sum,ave);}#include<stdio.h>main(){inti,score,sum,ave;sum=0;scanf("%d",&i);do{ scanf("%d",&score); sum=sum+score; i++; }while(i<=30);ave=sum/(i-1);printf("sum=%d\nave=%d\n",sum,ave);}这两个程序有什么区别?37循环结构:for语句for(表达式1;表达式2;表达式3)语句
其等价于:表达式1;while(表达式2){语句;表达式3;}表达式2语句FT计算表达式2语句结束计算表达式1计算表达式338循环结构:for语句(续)例2-3a/*判断某班学生成绩是否及格*/#include<stdio.h>main(){intn,score;
for(n=0;n<30;n++){scanf(“%d”,&score);if(score>=60)printf(“Pass\n”);elseprintf(“Fail\n”);}}
39循环结构:for语句(续)for特别适合于循环次数固定或有固定步长的循环,如下面是一个循环十次的循环:for(i=0;i<10;i++)…当然也可以用于其它方面。40循环结构:for语句(续)例2-3a/*输入某班30名学生成绩,求总分及平均分*/#include<stdio.h>main(){inti,score,sum,ave;sum=0;for(i=1;i<=30;i++)
{scanf("%d",&score); sum=sum+score;
}ave=sum/(i-1);printf("sum=%d\nave=%d\n",sum,ave);}41循环结构:for语句(续)注意:从语法上讲,表达式中任一个都允许省略,但分号不能省。如:for(;(c=getchar())!=EOF;)语句;for(;;)语句;当表达式2不出现时,则认为条件为真,循环永远下去(无穷循环),退出它只能用break或return语句。因此,while(A)B;等价于for(;A;)B;42循环结构三种循环主要的用途:
for通常用于固定步长的循环
while通常用于循环条件在头部判断的循环
do_while通常用于至少循环一次的循环43问题2.4问题:“某班有30名学生,输入每个学生成绩并判断其成绩是否及格,在判断学生成绩过程中,如果输入的学生成绩不合法(如大于100或为负数)则给出错误提示,并终止程序运行”。问题分析:与问题2.3不同的是在处理学生成绩时,首先要判断所读入的成绩值是否非法,如果非法,则给出错误信息并退出处理;否则继续处理。算法:1.设置变量n为02.whilen小于302.1读入一学生成绩值到变量score中2.2如果变量score值大于100或小于0:a.输出错误信息b.退出循环2.3判断score值,输出“Pass”或“Fail”2.4变量n加13.结束如何中途退出循环?break语句44break和continue语句(goto语句)例2-4/*判断某班学生成绩是否及格*/#include<stdio.h>main(){intn,score;for(n=0;n<30;n++){scanf(“%d”,&score);
if(score>100||sorce<0){printf(“Inputerror!\n”);break;}if(score>=60)printf(“Pass\n”);elseprintf(“Fail\n”);}}
退出循环45break和continue语句(goto语句)(续)break:迫使程序从包含它的最内层循环体或开关语句中跳出(循环只能跳出一层)。conti
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026事业单位工勤技能-广东-广东家禽饲养员二级(技师)历年参考题库含答案详解
- 2026事业单位工勤技能-山西-山西水工闸门运行工一级(高级技师)历年参考题库含答案详解
- 2026事业单位工勤技能-安徽-安徽收银员三级(高级工)历年参考题库含答案详解
- 2026事业单位工勤技能-吉林-吉林工程测量员二级(技师)历年参考题库含答案详解
- 2026事业单位工勤技能-内蒙古-内蒙古地质勘查员一级(高级技师)历年参考题库含答案详解
- 2026事业单位工勤技能-上海-上海堤灌维护工五级(初级工)历年参考题库含答案详解
- 2026年铁路实务模拟试题及答案详解
- 2026年中国车载通讯市场发展策略及投资潜力可行性预测报告
- 2026年食品配料项目可行性研究报告
- 2026年江西省事业单位考试公共基础知识练习题(含答案)
- 承包果园套袋合同范本
- DB1307∕T394-2022 母驴人工授精技术规程
- 水利工程质量管理体系有哪些
- 医院供氧系统安全管理
- 矿山安全生产标准化管理制度
- 理解当代中国 大学英语综合教程1(拓展版) B1U1课件 Unit1 Youth on the rise
- 压路机司机三级安全教育试题
- 护理专利发明创新与应用
- 术后肺部感染的预防及护理
- 《护理规范解读》课件
- 学校1530安全教育记录
评论
0/150
提交评论