智能小车C语言程序控制 课件 第七章 制作跑马灯_第1页
智能小车C语言程序控制 课件 第七章 制作跑马灯_第2页
智能小车C语言程序控制 课件 第七章 制作跑马灯_第3页
智能小车C语言程序控制 课件 第七章 制作跑马灯_第4页
智能小车C语言程序控制 课件 第七章 制作跑马灯_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

智能小车C语言程序控制秦磊

梁爽

主编第7章

制作跑马灯

在设计程序时,经常会遇到某一段代码需要被多次执行的情况。利用循环语句,就可以反复执行一段具有固定规律的程序,减少代码的编写量。本章将介绍循环语句的基础知识,并完成相关案例。7.1for循环for循环的功能是:通过合理设置初始值、循环条件和步进,准确地指定循环次数,确保循环体被足量执行。一般情况下,for循环的初始值、循环条件和步进都是集中编写的,以便阅读和计算其循环的次数。for(设置初始值;循环条件;步进){

循环体;}7.1for循环

for循环的入口是设置初始值语句,然后开始循环条件、循环体和步进语句的循环执行;循环条件通常是一个逻辑表达式,如果该表达式为真,则执行循环体和步进语句,为假则退出循环,执行for循环之后的程序;步进语句的主要作用是影响循环条件,确保在若干次循环之后能够退出循环;循环体是需要重复执行的程序。如果设置初始值之后,循环条件为假,则循环体和步进语句一次都不会执行,直接退出for循环。例使用for循环输出数字1~5,每个数字占一行。#include<stdio.h>intmain(){ for(inti=1;i<=5;i++) { printf("%d\n",i); } return0;}12345例使用for循环计算1+2+3+…+100的结果。#include<stdio.h>intmain(){ intsum=0; for(inti=1;i<=100;i++) { sum+=i; } printf("%d\n",sum); return0;}5050(1)在for循环中,设置初始值、循环条件和步进语句三段代码之间用“;”隔开。(2)循环体中如果有多行语句,要用“{}”括起来,每一行都以“;”结尾;如果只有一行语句,可以省略“{}”,但是仍然要以“;”结尾。在while循环和do-while循环中也有这样的要求。(3)for循环还有一种写法是“for(;;){循环体;}”,也就是没有设置初始值、循环条件和步进语句三段代码,但保留两个“;”,这会构成无限循环,如果循环体中没有break语句确保强制退出,会导致死循环,也就是计算机不停地计算,既无法得到希望的答案,又会拖累计算机整体的运行速度。(4)一般情况下,如果变量i在for循环以外没有使用需求,则将其定义在for循环中,当for循环执行结束后,系统会自动释放变量i所占用的系统资源,还可以防止与其他位置出现的变量i产生冲突;同理,凡是在for循环中临时使用的变量,都应该定义在for循环中。小贴士7.2while循环while循环的语法接近自然语言,简单易读,常用于循环条件比较复杂或者循环次数难以确定的循环程序。在while循环中只要循环条件为真,就一直循环执行循环体。while(循环条件){

循环体;}例使用while循环找出等比数列“1,2,4,8,…”中大于100的最小数字。#include<stdio.h>intmain(){ inti=1; while(i<=100) { i*=2; } printf("%d\n",i); return0;}128(1)while语句后没有“;”。(2)while循环的结构虽然简单,但是依然要在程序中设计好初始值、循环条件和步进语句,以确保while循环能够正常开始和结束。特别要注意避免死循环,很多初学者在编写循环体时,都会忘记编写类似步进的语句,导致循环条件始终为真。但是,在单片机编程中,经常会使用while(1)无限循环,以控制程序持续运行,因为单片机一般在通电后要一直工作,直到断电。for(;;)虽然也是无限循环,但很少在单片机中使用。小贴士7.3do-while循环do-while循环与while循环有些相似,都是当循环条件为真时执行循环体,主要的区别在于do-while循环是先执行循环体后判断循环条件,当循环条件为真时,再次执行循环体,直到循环条件为假,这样能够确保循环体至少被执行一次;而while循环则是先判断循环条件后执行循环体,循环体有可能一次都不被执行。do{

循环体;}while(循环条件);例有一组数字,第一个数字和第二个数字都是1,从第三个数字开始,每个数字是前两个数字之和,即1,1,2,3,5,8,…,求第10个数字是多少?#include<stdio.h>intmain(){ inta1=1; inta2=1; inta3; intn=3; do { a3=a1+a2; a1=a2; a2=a3; n++; } while(n<=10); printf("%d\n",a3); return0;}557.4循环嵌套在循环语句内,可以嵌套条件语句和循环语句,从而实现更加多样的程序流程。在编写嵌套程序时,要确保格式规范,以便阅读和排除错误,特别要注意不能多写或少写大括号。#include<stdio.h>intmain(){ intsum=0; for(inti=1;i<=100;i++) { if(i%2!=0) { sum+=i; } } printf("%d\n",sum); return0;}例计算100以内所有奇数的和。例使用“*”排列出一个边长为6的三角形。#include<stdio.h>intmain(){ for(inti=1;i<=6;i++) { for(intj=1;j<=i;j++) { printf("*"); } printf("\n"); } return0;}*********************例使用“*”和空格排列出一个边长为6的倒三角形。#include<stdio.h>intmain(){ for(inti=1;i<=6;i++) { for(intj=1;j<=6;j++) { if(j>=i)printf("*"); elseprintf(""); } printf("\n"); } return0;}*********************7.5break语句有时,循环语句执行到中间的某个阶段,就完成了计算任务,不需要继续执行,或者受到外部事件控制,强制结束循环计算。这个时候可以使用break语句结束当前的循环,执行循环语句后面的程序。#include<stdio.h>intmain(){ intx; printf("请输入一个大于2的整数:"); scanf("%d",&x); charflag=1; for(inti=2;i<x;i++) { if(x%i==0) { flag=0; break; } } if(flag) { printf("%d是素数。\n",x); } else { printf("%d不是素数。\n",x); } return0;}例判断输入的数字是不是素数。例判断输入的数字是不是素数。#include<stdio.h>intmain(){

intx; charflag=1;

printf("请输入一个大于2的整数:");

scanf("%d",&x); if(x<2) {

printf("请输入一个大于2的整数。\n"); } else { for(int

i=2;i<x;i++) { if(x%i==0) { flag=0; break; } } if(flag)printf("%d是素数。\n",x); elseprintf("%d不是素数。\n",x); } return0;}例判断输入的数字是不是素数。#include<stdio.h>intmain(){ //输入数据

intx;

printf("请输入一个大于2的整数:");

scanf("%d",&x); //检查数据

if(x<2) {

printf("请输入一个大于2的整数。\n"); return0; } //处理数据

charflag=1; for(int

i=2;i<x;i++) { if(x%i==0) { flag=0; break; } } //输出数据

if(flag)printf("%d是素数。\n",x); elseprintf("%d不是素数。\n",x); return0;}一般情况下,设计的程序应当包含以下四个步骤:输入数据、检查数据、处理数据和输出数据。只有经过检查符合要求的数据才能够被处理,从而确保程序正常运行。这四个步骤如果能够形成顺序结构,程序的可读性就更高。通过灵活编写各类相关语句,不仅可以提高程序的运行效率,增强程序的安全性、稳定性,还可以灵活的扩展程序的应用领域,甚至程序反而变得更加精简易读,这是编程精益求精的要求,也是所有程序员应具备的素质。小贴士7.6continue语句有时,循环体执行到一半,就发现可以结束本次循环,开始下一次循环。这时就要使用continue语句。voidsetup(){Serial.begin(9600);Stringx="";for(inti=1;i<=100;i++){if(i%7==0)continue;if(String(i).indexOf("7")>=0)continue;//String(i)将i所存储的数字转换成字符串

x+=String(i)+",";}Serial.println(x);}例在Arduino平台上,输出1~100范围内所有与“7”无关的数字。(1)本例利用了Arduino内置的String对象及相关方法。String(变量)可以将任意一种变量内保存的数据转换为字符串,以便参与字符串相关的运算。通过strings.indexOf(key)方法可以方便地检索关键字key在字符串strings中出现的位置,如果在第一个字符位置出现,则返回0;如果在第二个字符位置出现,则返回1,依此类推。如果没有检索到,则返回-1。(2)本例使用面向对象的编程方法,代码更加简洁,大幅提升了程序开发效率,这是目前主流的编程形式。小贴士7.7跑马灯的制作跑马灯是指一组灯按一定的顺序轮流交替点亮。跑马灯简便易用、颜色丰富,在日常生活中有广泛的应用。本案例要求利用Arduino开发板制作跑马灯,使发光二极管依次点亮再依次熄灭,如此循环往复。主要硬件有Arduino开发板1块、发光二极管4个、1kΩ电阻4个、面包板1块,跑马灯接线图如图2-7-4所示。例跑马灯代码const

intled1=2;const

intled2=3;const

intled3=4;const

intled4=5;voidsetup(){

pinMode(led1,OUTPUT);

pinMode(led2,OUTPUT);

pinMode(led3,OUTPUT);

pinMode(led4,OUTPUT);while(1){

digitalWrite(led1,HIGH);delay(500);

digitalWrite(led2,HIGH);delay(500);

digitalWrite(led3,HIGH);delay(500);

digitalWrite(led4,HIGH);delay(500);

digitalWrite(led1,LOW);delay(500);

digitalWrite(led2,LOW);delay(500);

digitalWrite(led3,LOW);delay(500);

digitalWrite(led4,LOW);delay(500);}}例跑马灯代码boolflag=0;voidsetup(){for(int

i=2;i<=5;i++){

pinMode(i,OUTPUT);

digitalWrite(i,flag);}}voidloop(){flag=!flag;for(int

i=2;i<=5;i++){

digitalWrite(i,flag);delay(500);}}7.8模拟按键响应事件编程实现以下功能:每按一次按键,在串口监视助手软件中输出的数字加1。需要的硬件有Arduino开发板1块、按键1个、1kΩ电阻1个和面包板1块。例按键响应代码constintbtn=2;intx=0;voidsetup(){pinMode(btn,INPUT);Serial.begin(9600);}voidloop(){if(digitalRead(btn)) //当按下按键时触发

{while(digitalRead(btn));//等待按键抬起,循环体为空

x++;Serial.println(x);}}(1)使用“pinMode(通道,INPUT);”语句,可以将指定数字端口设置为输入模式,用以读取输入的电平状态。(2)使用“digitalRead(通道)”语句读取端口上的电压,当电压大于或等于3V时返回HIGH(1),小于或等于2V时返回LOW(0)。(3)本案例通过一个下拉电阻将2号数字端口固定在低电平,当按下按键后,连接到5V,读取到高电平。小贴士系统运行后,在某些情况下,虽然只按了一次按键,但是会发现串口监视助手软件中输出了多个数字,这是因为在按键按下和抬起的瞬间,信号发生了抖动,多次触发响应程序。按键在长期使用后,质量会变差,出现接触不良的情况,更容易出现抖动现象;很多单片机电路也没有集成消抖电路,所以一般情况下,编写按键响应程序时都要添加消抖代码,等待一段时间,等抖动消失后,再运行核心语句。拓展例按键消抖代码constintbtn=2;intx=0;voidsetup(){pinMode(btn,INPUT);Serial.be

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论