版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
智能小車C語(yǔ)言程序控制第7章
制作跑馬燈
在設(shè)計(jì)程序時(shí),經(jīng)常會(huì)遇到某一段代碼需要被多次執(zhí)行的情況。利用循環(huán)語(yǔ)句,就可以反復(fù)執(zhí)行一段具有固定規(guī)律的程序,減少代碼的編寫量。本章將介紹循環(huán)語(yǔ)句的基礎(chǔ)知識(shí),并完成相關(guān)案例。7.1for循環(huán)for循環(huán)的功能是:通過(guò)合理設(shè)置初始值、循環(huán)條件和步進(jìn),準(zhǔn)確地指定循環(huán)次數(shù),確保循環(huán)體被足量執(zhí)行。一般情況下,for循環(huán)的初始值、循環(huán)條件和步進(jìn)都是集中編寫的,以便閱讀和計(jì)算其循環(huán)的次數(shù)。for(設(shè)置初始值;循環(huán)條件;步進(jìn)){
循環(huán)體;}7.1for循環(huán)for循環(huán)的入口是設(shè)置初始值語(yǔ)句,然后開始循環(huán)條件、循環(huán)體和步進(jìn)語(yǔ)句的循環(huán)執(zhí)行;循環(huán)條件通常是一個(gè)邏輯表達(dá)式,如果該表達(dá)式為真,則執(zhí)行循環(huán)體和步進(jìn)語(yǔ)句,為假則退出循環(huán),執(zhí)行for循環(huán)之后的程序;步進(jìn)語(yǔ)句的主要作用是影響循環(huán)條件,確保在若干次循環(huán)之后能夠退出循環(huán);循環(huán)體是需要重復(fù)執(zhí)行的程序。如果設(shè)置初始值之后,循環(huán)條件為假,則循環(huán)體和步進(jìn)語(yǔ)句一次都不會(huì)執(zhí)行,直接退出for循環(huán)。例使用for循環(huán)輸出數(shù)字1~5,每個(gè)數(shù)字占一行。#include<stdio.h>intmain(){ for(inti=1;i<=5;i++) { printf("%d\n",i); } return0;}12345例使用for循環(huán)計(jì)算1+2+3+…+100的結(jié)果。#include<stdio.h>intmain(){ intsum=0; for(inti=1;i<=100;i++) { sum+=i; } printf("%d\n",sum); return0;}5050(1)在for循環(huán)中,設(shè)置初始值、循環(huán)條件和步進(jìn)語(yǔ)句三段代碼之間用“;”隔開。(2)循環(huán)體中如果有多行語(yǔ)句,要用“{}”括起來(lái),每一行都以“;”結(jié)尾;如果只有一行語(yǔ)句,可以省略“{}”,但是仍然要以“;”結(jié)尾。在while循環(huán)和do-while循環(huán)中也有這樣的要求。(3)for循環(huán)還有一種寫法是“for(;;){循環(huán)體;}”,也就是沒有設(shè)置初始值、循環(huán)條件和步進(jìn)語(yǔ)句三段代碼,但保留兩個(gè)“;”,這會(huì)構(gòu)成無(wú)限循環(huán),如果循環(huán)體中沒有break語(yǔ)句確保強(qiáng)制退出,會(huì)導(dǎo)致死循環(huán),也就是計(jì)算機(jī)不停地計(jì)算,既無(wú)法得到希望的答案,又會(huì)拖累計(jì)算機(jī)整體的運(yùn)行速度。(4)一般情況下,如果變量i在for循環(huán)以外沒有使用需求,則將其定義在for循環(huán)中,當(dāng)for循環(huán)執(zhí)行結(jié)束后,系統(tǒng)會(huì)自動(dòng)釋放變量i所占用的系統(tǒng)資源,還可以防止與其他位置出現(xiàn)的變量i產(chǎn)生沖突;同理,凡是在for循環(huán)中臨時(shí)使用的變量,都應(yīng)該定義在for循環(huán)中。小貼士7.2while循環(huán)while循環(huán)的語(yǔ)法接近自然語(yǔ)言,簡(jiǎn)單易讀,常用于循環(huán)條件比較復(fù)雜或者循環(huán)次數(shù)難以確定的循環(huán)程序。在while循環(huán)中只要循環(huán)條件為真,就一直循環(huán)執(zhí)行循環(huán)體。while(循環(huán)條件){
循環(huán)體;}例使用while循環(huán)找出等比數(shù)列“1,2,4,8,…”中大于100的最小數(shù)字。#include<stdio.h>intmain(){ inti=1; while(i<=100) { i*=2; } printf("%d\n",i); return0;}128(1)while語(yǔ)句后沒有“;”。(2)while循環(huán)的結(jié)構(gòu)雖然簡(jiǎn)單,但是依然要在程序中設(shè)計(jì)好初始值、循環(huán)條件和步進(jìn)語(yǔ)句,以確保while循環(huán)能夠正常開始和結(jié)束。特別要注意避免死循環(huán),很多初學(xué)者在編寫循環(huán)體時(shí),都會(huì)忘記編寫類似步進(jìn)的語(yǔ)句,導(dǎo)致循環(huán)條件始終為真。但是,在單片機(jī)編程中,經(jīng)常會(huì)使用while(1)無(wú)限循環(huán),以控制程序持續(xù)運(yùn)行,因?yàn)閱纹瑱C(jī)一般在通電后要一直工作,直到斷電。for(;;)雖然也是無(wú)限循環(huán),但很少在單片機(jī)中使用。小貼士7.3do-while循環(huán)do-while循環(huán)與while循環(huán)有些相似,都是當(dāng)循環(huán)條件為真時(shí)執(zhí)行循環(huán)體,主要的區(qū)別在于do-while循環(huán)是先執(zhí)行循環(huán)體后判斷循環(huán)條件,當(dāng)循環(huán)條件為真時(shí),再次執(zhí)行循環(huán)體,直到循環(huán)條件為假,這樣能夠確保循環(huán)體至少被執(zhí)行一次;而while循環(huán)則是先判斷循環(huán)條件后執(zhí)行循環(huán)體,循環(huán)體有可能一次都不被執(zhí)行。do{
循環(huán)體;}while(循環(huán)條件);例有一組數(shù)字,第一個(gè)數(shù)字和第二個(gè)數(shù)字都是1,從第三個(gè)數(shù)字開始,每個(gè)數(shù)字是前兩個(gè)數(shù)字之和,即1,1,2,3,5,8,…,求第10個(gè)數(shù)字是多少?#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循環(huán)嵌套在循環(huán)語(yǔ)句內(nèi),可以嵌套條件語(yǔ)句和循環(huán)語(yǔ)句,從而實(shí)現(xiàn)更加多樣的程序流程。在編寫嵌套程序時(shí),要確保格式規(guī)范,以便閱讀和排除錯(cuò)誤,特別要注意不能多寫或少寫大括號(hào)。#include<stdio.h>intmain(){ intsum=0; for(inti=1;i<=100;i++) { if(i%2!=0) { sum+=i; } } printf("%d\n",sum); return0;}例計(jì)算100以內(nèi)所有奇數(shù)的和。例使用“*”排列出一個(gè)邊長(zhǎng)為6的三角形。#include<stdio.h>intmain(){ for(inti=1;i<=6;i++) { for(intj=1;j<=i;j++) { printf("*"); } printf("\n"); } return0;}*********************例使用“*”和空格排列出一個(gè)邊長(zhǎng)為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語(yǔ)句有時(shí),循環(huán)語(yǔ)句執(zhí)行到中間的某個(gè)階段,就完成了計(jì)算任務(wù),不需要繼續(xù)執(zhí)行,或者受到外部事件控制,強(qiáng)制結(jié)束循環(huán)計(jì)算。這個(gè)時(shí)候可以使用break語(yǔ)句結(jié)束當(dāng)前的循環(huán),執(zhí)行循環(huán)語(yǔ)句后面的程序。#include<stdio.h>intmain(){ intx; printf("請(qǐng)輸入一個(gè)大于2的整數(shù):"); scanf("%d",&x); charflag=1; for(inti=2;i<x;i++) { if(x%i==0) { flag=0; break; } } if(flag) { printf("%d是素?cái)?shù)。\n",x); } else { printf("%d不是素?cái)?shù)。\n",x); } return0;}例判斷輸入的數(shù)字是不是素?cái)?shù)。例判斷輸入的數(shù)字是不是素?cái)?shù)。#include<stdio.h>intmain(){ intx; charflag=1; printf("請(qǐng)輸入一個(gè)大于2的整數(shù):"); scanf("%d",&x); if(x<2) { printf("請(qǐng)輸入一個(gè)大于2的整數(shù)。\n"); } else { for(inti=2;i<x;i++) { if(x%i==0) { flag=0; break; } } if(flag)printf("%d是素?cái)?shù)。\n",x); elseprintf("%d不是素?cái)?shù)。\n",x); } return0;}例判斷輸入的數(shù)字是不是素?cái)?shù)。#include<stdio.h>intmain(){ //輸入數(shù)據(jù)
intx; printf("請(qǐng)輸入一個(gè)大于2的整數(shù):"); scanf("%d",&x); //檢查數(shù)據(jù)
if(x<2) { printf("請(qǐng)輸入一個(gè)大于2的整數(shù)。\n"); return0; } //處理數(shù)據(jù)
charflag=1; for(inti=2;i<x;i++) { if(x%i==0) { flag=0; break; } } //輸出數(shù)據(jù)
if(flag)printf("%d是素?cái)?shù)。\n",x); elseprintf("%d不是素?cái)?shù)。\n",x); return0;}一般情況下,設(shè)計(jì)的程序應(yīng)當(dāng)包含以下四個(gè)步驟:輸入數(shù)據(jù)、檢查數(shù)據(jù)、處理數(shù)據(jù)和輸出數(shù)據(jù)。只有經(jīng)過(guò)檢查符合要求的數(shù)據(jù)才能夠被處理,從而確保程序正常運(yùn)行。這四個(gè)步驟如果能夠形成順序結(jié)構(gòu),程序的可讀性就更高。通過(guò)靈活編寫各類相關(guān)語(yǔ)句,不僅可以提高程序的運(yùn)行效率,增強(qiáng)程序的安全性、穩(wěn)定性,還可以靈活的擴(kuò)展程序的應(yīng)用領(lǐng)域,甚至程序反而變得更加精簡(jiǎn)易讀,這是編程精益求精的要求,也是所有程序員應(yīng)具備的素質(zhì)。小貼士7.6continue語(yǔ)句有時(shí),循環(huán)體執(zhí)行到一半,就發(fā)現(xiàn)可以結(jié)束本次循環(huán),開始下一次循環(huán)。這時(shí)就要使用continue語(yǔ)句。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所存儲(chǔ)的數(shù)字轉(zhuǎn)換成字符串
x+=String(i)+",";}Serial.println(x);}例在Arduino平臺(tái)上,輸出1~100范圍內(nèi)所有與“7”無(wú)關(guān)的數(shù)字。(1)本例利用了Arduino內(nèi)置的String對(duì)象及相關(guān)方法。String(變量)可以將任意一種變量?jī)?nèi)保存的數(shù)據(jù)轉(zhuǎn)換為字符串,以便參與字符串相關(guān)的運(yùn)算。通過(guò)strings.indexOf(key)方法可以方便地檢索關(guān)鍵字key在字符串strings中出現(xiàn)的位置,如果在第一個(gè)字符位置出現(xiàn),則返回0;如果在第二個(gè)字符位置出現(xiàn),則返回1,依此類推。如果沒有檢索到,則返回-1。(2)本例使用面向?qū)ο蟮木幊谭椒?,代碼更加簡(jiǎn)潔,大幅提升了程序開發(fā)效率,這是目前主流的編程形式。小貼士7.7跑馬燈的制作跑馬燈是指一組燈按一定的順序輪流交替點(diǎn)亮。跑馬燈簡(jiǎn)便易用、顏色豐富,在日常生活中有廣泛的應(yīng)用。本案例要求利用Arduino開發(fā)板制作跑馬燈,使發(fā)光二極管依次點(diǎn)亮再依次熄滅,如此循環(huán)往復(fù)。主要硬件有Arduino開發(fā)板1塊、發(fā)光二極管4個(gè)、1kΩ電阻4個(gè)、面包板1塊,跑馬燈接線圖如圖2-7-4所示。例跑馬燈代碼constintled1=2;constintled2=3;constintled3=4;constintled4=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(inti=2;i<=5;i++){pinMode(i,OUTPUT);digitalWrite(i,flag);}}voidloop(){flag=!flag;for(inti=2;i<=5;i++){digitalWrite(i,flag);delay(500);}}7.8模擬按鍵響應(yīng)事件編程實(shí)現(xiàn)以下功能:每按一次按鍵,在串口監(jiān)視助手軟件中輸出的數(shù)字加1。需要的硬件有Arduino開發(fā)板1塊、按鍵1個(gè)、1kΩ電阻1個(gè)和面包板1塊。例按鍵響應(yīng)代碼constintbtn=2;intx=0;voidsetup(){pinMode(btn,INPUT);Serial.begin(9600);}voidloop(){if(digitalRead(btn)) //當(dāng)按下按鍵時(shí)觸發(fā)
{while(digitalRead(btn));//等待按鍵抬起,循環(huán)體為空
x++;Serial.println(x);}}(1)使用“pinMode(通道,INPUT);”語(yǔ)句,可以將指定數(shù)字端口設(shè)置為輸入模式,用以讀取輸入的電平狀態(tài)。(2)使用“digitalRead(通道)”語(yǔ)句讀取端口上的電壓,當(dāng)電壓大于或等于3V時(shí)返回HIGH(1),小于或等于2V時(shí)返回LOW(0)。(3)本案例通過(guò)一個(gè)下拉電阻將2號(hào)數(shù)字端口固定在低電平,當(dāng)按下按鍵后,連接到5V,讀取到高電平。小貼士系統(tǒng)運(yùn)行后,在某些情況下,雖然只按了一次按鍵,但是會(huì)發(fā)現(xiàn)串口監(jiān)視助手軟件中輸出了多個(gè)數(shù)字,這是因?yàn)樵诎存I按下和抬起的瞬間,信號(hào)發(fā)生了抖動(dòng),多次觸發(fā)響應(yīng)程序。按鍵在長(zhǎng)期使用后,質(zhì)量會(huì)變差,出現(xiàn)接觸不良的情況,更容易出現(xiàn)抖動(dòng)現(xiàn)象;很多單片機(jī)電路也沒有集成消抖電路,所以一般情況下,編寫按鍵響應(yīng)程序時(shí)都要添加消抖代碼,等待一段時(shí)間,等抖動(dòng)消失后,再運(yùn)行核心語(yǔ)句。拓展例按鍵消抖代碼constintbtn=2;intx=0;voidsetup(){pinMode(btn,INPUT);Serial.begin(9600);}voidloop(){if(digitalRead(btn)){delay(20); //當(dāng)檢測(cè)到按鍵被按下時(shí),延時(shí)20毫秒,等待抖動(dòng)消失
if(digitalRead(btn)) //再次檢測(cè)按鍵狀態(tài)
{while(digitalRead(btn));x++;Serial.println(x);}}}7.9通過(guò)串口接收和發(fā)送大量數(shù)據(jù)有時(shí),Arduino系統(tǒng)需要通過(guò)串口接收和發(fā)送大量數(shù)據(jù),特別是與其他單片機(jī)通信的協(xié)議數(shù)據(jù)。voidsetup(){Serial.begin(9600);}voidloop(){Stringx="";while(Serial.available()) //當(dāng)串口緩沖區(qū)存在數(shù)據(jù)時(shí)觸發(fā)
{x+=char(Serial.read()); //把接收的編碼轉(zhuǎn)換為字符
delay(2); //適當(dāng)延時(shí),確保完整接收數(shù)據(jù)
}if(x.length()>0)Serial.println(x); //從串口輸出接收的數(shù)據(jù)}串口每次只能接收一個(gè)字符,由于串口接收字符的速度低于Arduino微處理器處理的速度,程序每次從緩沖區(qū)讀取到一個(gè)字符后,要適當(dāng)延時(shí),等待下一個(gè)字符接收完畢,才能再次讀取緩沖區(qū);如果沒有延時(shí),微處理器會(huì)誤以為已經(jīng)接收完畢,導(dǎo)致輸出的數(shù)據(jù)出現(xiàn)分行。在串口監(jiān)視助手軟件中輸入一段字符,單擊“發(fā)送”按鈕,會(huì)在下面的窗口中原樣打印出來(lái)。解析演示完畢,謝謝觀看!智能小車C語(yǔ)言程序控制
第八章:智能小車綜合PWM控制
脈沖寬度調(diào)制(PWM)簡(jiǎn)稱脈寬調(diào)制,是利用微處理器的數(shù)字輸出來(lái)對(duì)模擬電路進(jìn)行控制的一種非常有效的技術(shù)。簡(jiǎn)單地講就是對(duì)輸出的脈沖寬度進(jìn)行控制。PWM有3個(gè)參數(shù),分別是頻率、占空比、周期。
Arduino開發(fā)板的3號(hào)、5號(hào)、6號(hào)、9號(hào)、10號(hào)、11號(hào)引腳可以輸出PWM信號(hào),控制智能小車前進(jìn)、后退、左轉(zhuǎn)和右轉(zhuǎn)。
要實(shí)現(xiàn)智能小車的前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)等相關(guān)功能,在編程時(shí)需要用到函數(shù)。本章將介紹函數(shù)的基礎(chǔ)知識(shí)。
下面先來(lái)看一個(gè)現(xiàn)實(shí)生活中飯店點(diǎn)餐的案例。前言
物聯(lián)網(wǎng)TheInternetOfThings
要求:在一個(gè)飯店里面,顧客負(fù)責(zé)點(diǎn)菜,服務(wù)員負(fù)責(zé)把菜名報(bào)給后勤人員,后勤人員負(fù)責(zé)洗菜,洗好后把菜交給配菜師傅,配菜師傅切好菜后把菜交給廚師,廚師負(fù)責(zé)炒菜,最后由服務(wù)員把菜端給顧客?!景咐龑?dǎo)入】
分析:在上面的案例中,服務(wù)員、后勤人員、配菜師傅、廚師分別負(fù)責(zé)各自指定的任務(wù)。如果把上面的工作過(guò)程看成一段程序,那么服務(wù)員相當(dāng)于主函數(shù),整個(gè)工作過(guò)程從他開始。后勤人員、配菜師傅、廚師相當(dāng)于三個(gè)不同的函數(shù),他們執(zhí)行各自的功能,互不影響。
函數(shù)有什么作用呢?(1)在一段代碼中,有功能相同的部分需要重復(fù)使用,只是中間所引用的數(shù)據(jù)不同。那么,可以將這部分代碼寫成一個(gè)函數(shù),在需要使用的時(shí)候調(diào)用。(2)方便代碼的維護(hù)。當(dāng)需要修改某個(gè)功能時(shí),只需要修改對(duì)應(yīng)部分的代碼。將上述案例中的洗菜、配菜、做菜分別寫成函數(shù),完成一個(gè)點(diǎn)單小程序,代碼如下:【案例導(dǎo)入】:案例源代碼行業(yè)PPT模板/hangye/【案例導(dǎo)入】:案例運(yùn)行結(jié)果行業(yè)PPT模板/hangye/
拓
展(1)函數(shù)是C語(yǔ)言的模塊,可以相互調(diào)用,有較強(qiáng)的獨(dú)立性。(2)函數(shù)是完成特定功能的語(yǔ)句集合,當(dāng)需要使用此功能時(shí),只需要調(diào)用對(duì)應(yīng)的函數(shù)。8.1PARTONE函數(shù)的定義和調(diào)用8.1.1函數(shù)的定義函數(shù)的定義包含函數(shù)頭和函數(shù)體。
函數(shù)頭指定了函數(shù)的名稱、返回值的類型,以及參數(shù)的類型和名稱(有參數(shù)的情況下)。函數(shù)體中的語(yǔ)句明確了該函數(shù)的具體功能。
函數(shù)定義的一般格式如下:8.1.1函數(shù)的定義注釋:(1)返回值類型可以是void或者任何對(duì)象類型,但不能是數(shù)組類型。函數(shù)返回值類型修飾符見表2-8-1。(2)函數(shù)名稱一般根據(jù)函數(shù)需要完成的功能來(lái)設(shè)置。例如,最大值函數(shù)為max(),最小值函數(shù)為min()。(3)參數(shù)聲明:函數(shù)若有多個(gè)參數(shù),需要以逗號(hào)分隔,每個(gè)參數(shù)前面要有一個(gè)類型修飾符。如果函數(shù)沒有參數(shù)需要傳入,則這個(gè)列表為空。(4)函數(shù)體中主要是聲明和執(zhí)行語(yǔ)句。8.1.2函數(shù)的調(diào)用所謂函數(shù)調(diào)用(FunctionCall),就是使用已經(jīng)定義好的函數(shù)。函數(shù)調(diào)用的一般形式如下:functionName是函數(shù)名稱,param1,param2,param3,…是實(shí)參列表。實(shí)參可以是常數(shù)、變量、表達(dá)式等,多個(gè)實(shí)參之間用逗號(hào)分隔?!纠?-1-1】求一個(gè)圓柱體的表面積和體積行業(yè)PPT模板/hangye/【例8-1-1】求一個(gè)圓柱體的表面積和體積行業(yè)PPT模板/hangye/小貼士
本例中自定義了函數(shù)voidcolumn(doubler,doubleh)。main()函數(shù)中的column(r,h)是對(duì)該函數(shù)進(jìn)行調(diào)用。其中:void為函數(shù)返回值類型。column為自定義函數(shù)名,該函數(shù)用來(lái)計(jì)算圓柱體的體積和表面積。doubler為函數(shù)參數(shù)一,代表圓柱體底面半徑,參數(shù)類型為double型。doubleh為函數(shù)參數(shù)二,代表圓柱體的高,參數(shù)類型為double型。程序運(yùn)行結(jié)果【例8-1-2】判斷一個(gè)數(shù)是不是質(zhì)數(shù)行業(yè)PPT模板/hangye/程序運(yùn)行結(jié)果【例8-1-2】判斷一個(gè)數(shù)是不是質(zhì)數(shù)行業(yè)PPT模板/hangye/小貼士本例中自定義了函數(shù)intisPrime(inta)。其中:int表示函數(shù)返回值類型為整型。isPrime為自定義函數(shù)名,該函數(shù)用來(lái)判斷一個(gè)數(shù)是不是質(zhì)數(shù)。inta為函數(shù)參數(shù),此函數(shù)有一個(gè)整型參數(shù)a。練一練
請(qǐng)編寫程序求一個(gè)長(zhǎng)方形的面積。8.2PARTTWO庫(kù)函數(shù)和自定義函數(shù)8.1.2
庫(kù)函數(shù)
C語(yǔ)言提供了豐富的庫(kù)函數(shù),如用于打印輸出的printf()和用于輸入的scanf(),以及與字符串有關(guān)的strlwr()、strlen()、strcat()等。
在使用某一庫(kù)函數(shù)時(shí),需要在程序中嵌入(#include<>)該函數(shù)所在的頭文件。例如,printf()、scanf()、getchar()、gets()、putchar()這些函數(shù)(也稱標(biāo)準(zhǔn)I/O函數(shù))都在stdio.h頭文件中,所以使用時(shí)要在代碼開頭寫上“#include<stdio.h>”。8.2.1
庫(kù)函數(shù)--數(shù)學(xué)函數(shù)【例8-2-1】求一個(gè)數(shù)的平方根行業(yè)PPT模板/hangye/程序運(yùn)行結(jié)果行業(yè)PPT模板/hangye/小貼士
本例中使用了庫(kù)函數(shù)sqrt(floata)來(lái)計(jì)算a的平方根。練一練
請(qǐng)利用數(shù)學(xué)函數(shù)實(shí)現(xiàn)以下功能:輸入一個(gè)角的角度值,分別計(jì)算出這個(gè)角的正弦值和余弦值?!纠?-2-1】求一個(gè)數(shù)的平方根8.2.1
庫(kù)函數(shù)--字符串函數(shù)【例8-2-2】使用strspn()函數(shù)查找指定字符串出現(xiàn)的位置行業(yè)PPT模板/hangye/程序運(yùn)行結(jié)果行業(yè)PPT模板/hangye/小貼士
本例中使用了字符串函數(shù)strspn(),該函數(shù)的返回值為字符串str開頭連續(xù)包含字符串string1和string2內(nèi)字符的數(shù)目。
對(duì)于字符串“Microsoft”,在字符串“Microsoftwasfirstdevelopedfor386/486-based”開頭連續(xù)出現(xiàn)了9個(gè)相同的字符,因此返回值為9。
對(duì)于字符串“was”,在字符串“Microsoftwasfirstdevelopedfor386/486-based”開頭未連續(xù)出現(xiàn)相同的字符,因此返回值為0。練一練
請(qǐng)使用strcmp()函數(shù)對(duì)以下三個(gè)字符串進(jìn)行比較:str1="aaaa",str2="bbbb",str3="bcde"。輸出結(jié)果如圖2-8-6所示。
圖2-8-6輸出結(jié)果【例8-2-2】使用strspn()函數(shù)查找指定字符串出現(xiàn)的位置8.2.1
庫(kù)函數(shù)--時(shí)間日期函數(shù)【例8-2-3】使用時(shí)間函數(shù)輸出世界標(biāo)準(zhǔn)時(shí)間和北京時(shí)間行業(yè)PPT模板/hangye/程序運(yùn)行結(jié)果行業(yè)PPT模板/hangye/小貼士在標(biāo)準(zhǔn)C語(yǔ)言中,可通過(guò)tm結(jié)構(gòu)來(lái)獲得日期和時(shí)間,tm結(jié)構(gòu)在time.h中的定義如下:structtm{inttm_sec;
/*秒*/inttm_min;
/*分*/inttm_hour;
/*時(shí)*/inttm_mday;
/*一個(gè)月中的日期*/inttm_mon;
/*月份*/inttm_year;
/*年份*/inttm_wday;
/*星期*/inttm_yday;
/*從每年的1月1日開始的天數(shù)*/inttm_isdst;
/*夏令時(shí)標(biāo)識(shí)符*/
};通過(guò)time()函數(shù)來(lái)獲得日歷時(shí)間(CalendarTime),其原型如下:
time_ttime(time_t*timer);
8.2.2
自定義函數(shù)
自定義函數(shù)是用戶根據(jù)需要自行定義的函數(shù),用于實(shí)現(xiàn)特定的功能。自定義函數(shù)可以減少代碼量,使用時(shí)在主函數(shù)中調(diào)用即可。自定義函數(shù)在使用時(shí)不需要加頭文件。8.2.3
函數(shù)的分類函數(shù)按照是否有返回值可分為有返回值函數(shù)和無(wú)返回值函數(shù)兩種,按照是否有參數(shù)可分為有參數(shù)函數(shù)和無(wú)參數(shù)函數(shù)兩種。
綜合起來(lái),可以把函數(shù)分為四種類型,見表2-8-5?!纠?-2-4】無(wú)參數(shù)無(wú)返回值函數(shù)舉例行業(yè)PPT模板/hangye/程序運(yùn)行結(jié)果1.無(wú)參數(shù)無(wú)返回值函數(shù)行業(yè)PPT模板/hangye/
小貼士本例中,Say()函數(shù)為用戶自定義函數(shù),無(wú)參數(shù),而且返回值為void,表示無(wú)返回值。在main()函數(shù)中調(diào)用Say()函數(shù)時(shí),不需要對(duì)其參數(shù)賦值?!纠?-2-5】打印一個(gè)菱形行業(yè)PPT模板/hangye/程序運(yùn)行結(jié)果2.有參數(shù)無(wú)返回值函數(shù)行業(yè)PPT模板/hangye/
小貼士本例中,diamond()為用戶自定義函數(shù),有兩個(gè)參數(shù)h(形參)和w(形參),分別代表輸出菱形的高和寬。本例中利用嵌套的for循環(huán),輸出了一個(gè)菱形。在main()函數(shù)中,程序?qū)⒂脩糨斎氲牧庑蔚母遖(實(shí)參)和寬b(實(shí)參)的值傳遞給diamond()函數(shù),完成菱形的繪制?!纠?-2-6】無(wú)參數(shù)有返回值函數(shù)舉例行業(yè)PPT模板/hangye/程序運(yùn)行結(jié)果3.無(wú)參數(shù)有返回值函數(shù)行業(yè)PPT模板/hangye/
小貼士
本例中,ret()為用戶自定義函數(shù),無(wú)參數(shù),但有返回值,返回值類型為int;在main()函數(shù)中調(diào)用ret()函數(shù)并判斷返回值是否為1,為1則輸出“返回值為1”,否則輸出“返回值為0”?!纠?-2-7】輸出兩數(shù)中的較大數(shù)并求和行業(yè)PPT模板/hangye/程序運(yùn)行結(jié)果4.有參數(shù)有返回值函數(shù)行業(yè)PPT模板/hangye/
小貼士本例中,自定義函數(shù)max()有兩個(gè)參數(shù),sum()有三個(gè)參數(shù),分別用來(lái)計(jì)算兩個(gè)參數(shù)中的較大數(shù)和三個(gè)參數(shù)的和。在主函數(shù)中,將用戶輸入的三個(gè)整數(shù)賦給max()和sum()中的參數(shù),然后求出兩個(gè)數(shù)中的較大數(shù)和三個(gè)數(shù)之和。
行業(yè)PPT模板/hangye/
練一練1.分別編寫兩個(gè)程序,計(jì)算從100加到200的和值。(1)定義一個(gè)無(wú)參數(shù)有返回值函數(shù)sum(),計(jì)算和值。(2)定義一個(gè)有參數(shù)有返回值函數(shù)sum(intbegin,intend),計(jì)算和值。顯示結(jié)果如圖2-8-12所示。
圖2-8-12顯示結(jié)果行業(yè)PPT模板/hangye/
練一練2.編寫一個(gè)無(wú)參數(shù)無(wú)返回值函數(shù)的示例程序,要求根據(jù)輸入的數(shù),輸出相應(yīng)的乘法口訣表。例如:輸入9,則輸出9×9乘法口訣表;輸入12,則輸出12×12乘法口訣表。顯示結(jié)果如圖2-8-13所示。圖2-8-13顯示結(jié)果8.3PARTTHREE函數(shù)的參數(shù)和返回值8.3.1函數(shù)的參數(shù)
定義函數(shù)的時(shí)候,大多數(shù)函數(shù)都有參數(shù)。函數(shù)定義時(shí)用的變量叫形參,傳遞給函數(shù)形參的值或變量叫實(shí)參注意:(1)定義函數(shù)時(shí)需要指定形參的數(shù)據(jù)類型。函數(shù)未被調(diào)用時(shí),形參并不占用內(nèi)存。只有在發(fā)生函數(shù)調(diào)用時(shí),形參才被分配內(nèi)存。函數(shù)調(diào)用完成后,形參所占的內(nèi)存就被釋放。形參出現(xiàn)在函數(shù)定義中,在整個(gè)函數(shù)體內(nèi)都可以使用,在函數(shù)之外則不能使用。(2)實(shí)參可以是變量、常量或者表達(dá)式。實(shí)參出現(xiàn)在主調(diào)函數(shù)中,進(jìn)入被調(diào)函數(shù)后,實(shí)參不能使用。(3)在C語(yǔ)言中發(fā)生函數(shù)調(diào)用時(shí),主調(diào)函數(shù)把實(shí)參的值傳送給被調(diào)函數(shù)的形參,從而實(shí)現(xiàn)主調(diào)函數(shù)向被調(diào)函數(shù)的數(shù)據(jù)傳送。實(shí)參與形參的數(shù)據(jù)傳遞是“值傳遞”,即單向傳遞,只由實(shí)參傳遞給形參,而不能由形參傳遞給實(shí)參。形參與實(shí)參的數(shù)據(jù)類型一定要兼容。行業(yè)PPT模板/hangye/
【例8-3-1】完成兩個(gè)數(shù)的互換程序運(yùn)行結(jié)果行業(yè)PPT模板/hangye/
【例8-3-2】ATM自動(dòng)取款機(jī)系統(tǒng)項(xiàng)目設(shè)計(jì)(企業(yè)項(xiàng)目)ATM自動(dòng)取款機(jī)系統(tǒng)是銀行業(yè)務(wù)流程中十分重要且必備的環(huán)節(jié)之一,在銀行業(yè)務(wù)流程中起著承上啟下的作用,其重要性不言而喻。但是,目前許多銀行在具體的一此業(yè)務(wù)流程處理過(guò)程中仍然使用手工操作的方式來(lái)實(shí)施,不僅費(fèi)時(shí)、費(fèi)力,效率低下,而且無(wú)法達(dá)到理想的效果。ATM設(shè)備擁有許多常見功能,如登錄系統(tǒng)、身份驗(yàn)證、余額查詢、取款、存款和修改密碼等功能。在設(shè)計(jì)的過(guò)程中也以此為依據(jù),每一種具體功能使用一個(gè)或幾個(gè)函數(shù)來(lái)實(shí)現(xiàn)。本案例定義的EnterAccount()函數(shù)用于用戶登入賬號(hào)的功能,使用此函數(shù)完成系統(tǒng)的主要功能1:ATM設(shè)備登錄界面的顯示功能。行業(yè)PPT模板/hangye/【例8-3-2】ATM自動(dòng)取款機(jī)系統(tǒng)項(xiàng)目設(shè)計(jì)(企業(yè)項(xiàng)目)程序運(yùn)行結(jié)果行業(yè)PPT模板/hangye/小貼士函數(shù)不僅能傳值,還能傳地址。傳值就是直接用一個(gè)變量存儲(chǔ)值。傳地址就是用一個(gè)變量(指針變量)存儲(chǔ)地址。本例中,如果函數(shù)定義寫成以下兩種形式,是無(wú)法完成數(shù)值交換的。函數(shù)定義1:voidswap(inta,intb){ inttemp; temp=a; a=b; b=temp;}函數(shù)定義2:voidswap(inta,intb){ int*temp; *temp=a; a=b; b=*temp;}8.3.2函數(shù)的返回值返回值是函數(shù)的處理結(jié)果。如果需要在程序中利用某個(gè)函數(shù)的處理結(jié)果,則該函數(shù)必須設(shè)置有返回值。函數(shù)返回值一般用return語(yǔ)句設(shè)置。拓展(1)return語(yǔ)句是一個(gè)函數(shù)結(jié)束的標(biāo)志,只要執(zhí)行一次,這個(gè)函數(shù)就會(huì)結(jié)束運(yùn)行。(2)每個(gè)函數(shù)中可以有多條return語(yǔ)句。(3)return語(yǔ)句的返回值可以是任意數(shù)據(jù)類型。(4)return語(yǔ)句的返回值無(wú)個(gè)數(shù)限制,多個(gè)返回值之間用逗號(hào)分隔。8.3.2函數(shù)的返回值練一練用自定義函數(shù)編程,要求輸入一個(gè)年份數(shù)值,判斷此年份是不是閏年。具體實(shí)現(xiàn)效果如圖2-8-17所示。
圖2-8-17實(shí)現(xiàn)效果閏年的條件如下(滿足其一即可):(1)此年份數(shù)值能整除4且不能整除100。(2)此年份數(shù)值能整除400。8.4PARTFOUR函數(shù)的嵌套調(diào)用和遞歸調(diào)用8.4.1函數(shù)的嵌套調(diào)用
在定義函數(shù)時(shí),一個(gè)函數(shù)內(nèi)不能再定義另一個(gè)函數(shù),即函數(shù)不能嵌套定義,但函數(shù)可以嵌套調(diào)用,即在調(diào)用一個(gè)函數(shù)的過(guò)程中,又調(diào)用另一個(gè)函數(shù)。函數(shù)嵌套調(diào)用示意圖如圖2-8-18所示。
圖2-8-18函數(shù)嵌套調(diào)用示意圖行業(yè)PPT模板/hangye/
【例8-4-1】通過(guò)函數(shù)嵌套調(diào)用求三個(gè)數(shù)中的最大值程序運(yùn)行結(jié)果小貼士本例中共定義了兩個(gè)函數(shù),max_two()函數(shù)用來(lái)求出兩個(gè)數(shù)中的較大值,max_three()函數(shù)中嵌套調(diào)用max_two()函數(shù),用來(lái)求出三個(gè)數(shù)中的最大值。8.4.2函數(shù)的遞歸調(diào)用在調(diào)用一個(gè)函數(shù)的過(guò)程中又直接或間接地調(diào)用該函數(shù)本身,稱為函數(shù)的遞歸調(diào)用。函數(shù)遞歸調(diào)用需要注意以下幾點(diǎn):(1)在遞歸調(diào)用時(shí),函數(shù)本身既是主調(diào)函數(shù),又是被調(diào)函數(shù)。(2)在遞歸調(diào)用時(shí),遞歸函數(shù)將無(wú)休止地調(diào)用其自身,因此在函數(shù)內(nèi)必須有中止遞歸的條件語(yǔ)句,滿足某種條件之后即跳出遞歸函數(shù),不再繼續(xù)執(zhí)行。
行業(yè)PPT模板/hangye/
【例8-4-2】利用遞歸函數(shù)求出n!的值程序運(yùn)行結(jié)果小貼士本例中,函數(shù)factorial()用來(lái)求一個(gè)數(shù)的階乘,即從這個(gè)數(shù)開始一直乘到1,如5!=5×4×3×2×1。在函數(shù)定義中遞歸調(diào)用了函數(shù)factorial(n-1),使用if-elseif-else語(yǔ)句來(lái)進(jìn)行條件判斷,當(dāng)n遞減到n=1的時(shí)候,跳出遞歸函數(shù)。行業(yè)PPT模板/hangye/
練一練編寫一個(gè)嵌套調(diào)用函數(shù)的程序,要求用戶輸入一個(gè)十進(jìn)制數(shù),程序輸出對(duì)應(yīng)的二進(jìn)制數(shù),程序運(yùn)行結(jié)果如圖2-8-21所示。注意:將十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)的方法是除2求余數(shù)。圖2-8-21程序運(yùn)行結(jié)果8.5PARTFIVE常用Arduino函數(shù)8.5.1結(jié)構(gòu)函數(shù)1.voidsetup()主要功能:初始化變量、設(shè)置引腳模式、調(diào)用庫(kù)函數(shù)等。2.voidloop()主要功能:連續(xù)執(zhí)行函數(shù)內(nèi)的語(yǔ)句。
8.5.2
功能函數(shù)1.?dāng)?shù)字I/O函數(shù)(表2-8-6)
2.模擬I/O函數(shù)(表2-8-7)
8.5.2
功能函數(shù)3.時(shí)間函數(shù)(表2-8-8)
4.?dāng)?shù)學(xué)函數(shù)(表2-8-9)
8.5.2
功能函數(shù)5.串口通信函數(shù)(表2-8-10)
行業(yè)PPT模板/hangye/【例8-5-1】從串口輸入數(shù)據(jù)并打印出來(lái)程序運(yùn)行結(jié)果行業(yè)PPT模板/hangye/
小貼士本例中共使用了四個(gè)Arduino自帶的串口通信函數(shù)。(1)Serial.begin()為初始化波特率的函數(shù)。(2)Serial.println()為串口輸出函數(shù),用它代替?zhèn)鹘y(tǒng)C語(yǔ)言中的printf()函數(shù),因?yàn)锳rduino中使用“串口監(jiān)視器”來(lái)查看數(shù)據(jù)。(3)Serial.available()函數(shù)用來(lái)定義串口能承載的最大字符數(shù)。(4)Serial.read()函數(shù)用來(lái)讀取傳入串口的數(shù)據(jù)。行業(yè)PPT模板/hangye/【例8-5-2】用Arduino程序完成比較三個(gè)數(shù)的大小程序運(yùn)行結(jié)果行業(yè)PPT模板/hangye/
小貼士本例使用Arduino平臺(tái)進(jìn)行編程,與例8-4-1中定義的函數(shù)max_two()和max_three()的功能相同,但Arduino平臺(tái)中無(wú)main()函數(shù),它具有以下幾個(gè)特點(diǎn):(1)函數(shù)定義仍然在主函數(shù)體外。(2)Arduino中的setup()函數(shù)類似于基礎(chǔ)C語(yǔ)言中的main()函數(shù)。所有的功能語(yǔ)句必須寫在setup()函數(shù)中。練一練請(qǐng)將例8-4-2使用Arduino平臺(tái)重新編寫程序,并通過(guò)串口監(jiān)視器顯示數(shù)值互換的結(jié)果。8.6PARTSIX火焰報(bào)警案例1.所需硬件
火焰?zhèn)鞲衅鳎t外接收三極管)1個(gè)?;鹧?zhèn)鞲衅魅鐖D2-8-24所示。
蜂鳴器1個(gè)。蜂鳴器如圖2-8-25所示。
10k電阻1個(gè)。
面包板1塊。
面包板導(dǎo)線若干。
圖2-8-24火焰?zhèn)鞲衅鲌D2-8-25蜂鳴器
2.電路設(shè)計(jì)火焰?zhèn)鞲衅鞯亩桃_為負(fù)極,長(zhǎng)引腳為正極,將負(fù)極接到5V接口,正極與10k電阻一端相連,電阻另一端接到GND接口?;鹧?zhèn)鞲衅髡龢O通過(guò)導(dǎo)線接到Arduino開發(fā)板的5號(hào)模擬口。蜂鳴器的接法與火焰?zhèn)鞲衅黝愃?,蜂鳴器連接8號(hào)數(shù)字口。相關(guān)接線圖、原理圖和實(shí)物連接圖如圖2-8-26~圖2-8-28所示。
3.程序設(shè)計(jì)小貼士
在本案例中,火焰與傳感器之間的距離決定了讀取電壓值的大小。
用萬(wàn)用表測(cè)量電壓值發(fā)現(xiàn),當(dāng)沒有火焰靠近時(shí),模擬口讀到的電壓值在0.3V左右;當(dāng)有火焰靠近時(shí),讀到的電壓值在1.0V左右?;鹧婢嚯x越近,電壓值越大。
程序開始時(shí),先存儲(chǔ)沒有火焰時(shí)模擬口讀到的電壓值i,之后循環(huán)讀取模擬口電壓值j,并計(jì)算兩個(gè)值的差值k=j-i。
將k與0.6V做比較,當(dāng)其大于或等于0.6V時(shí),判斷有火焰,蜂鳴器鳴響報(bào)警;當(dāng)k小于0.6V時(shí),判斷沒有火焰,蜂鳴器不響。拓展
火焰?zhèn)鞲衅骼眉t外線對(duì)火焰非常敏感的特點(diǎn),使用特制的紅外線接收管來(lái)檢測(cè)火焰,然后把火焰的亮度轉(zhuǎn)化為電平信號(hào)輸入中央處理器,中央處理器根據(jù)信號(hào)的變化做出相應(yīng)的處理?;鹧?zhèn)鞲衅鞯奶攸c(diǎn)見表2-8-11。練一練
請(qǐng)使用Arduino自帶函數(shù)analogRead()、Serial.println()、pinMode()完成PWM控制LED的實(shí)驗(yàn)。通過(guò)pinMode()函數(shù)將11號(hào)數(shù)字口設(shè)置為輸出端口。通過(guò)analogRead()函數(shù)讀取傳感器的模擬值。通過(guò)Serial.println()函數(shù)輸出傳感器的變量數(shù)值。所需硬件:電位器模塊1個(gè)。紅色M3直插LED1個(gè)。1kΩ直插電阻1個(gè)。面包板1塊。面包板導(dǎo)線若干。8.7PARTSEVEN智能小車綜合PWM控制系統(tǒng)設(shè)計(jì)
本案例通過(guò)自定義前進(jìn)函數(shù)goAhead()、后退函數(shù)goBack()、左轉(zhuǎn)函數(shù)turnLeft()、右轉(zhuǎn)函數(shù)turnRight()和停止函數(shù)stop()來(lái)控制智能小車前進(jìn)、后退、轉(zhuǎn)向和停止。要求實(shí)現(xiàn)以下效果:智能小車啟動(dòng)后前進(jìn),1秒后后退,1秒后左轉(zhuǎn),1秒后右轉(zhuǎn),1秒后停止。1.所需硬件
準(zhǔn)備智能小車及相關(guān)硬件。2.電路設(shè)計(jì)
Arduino開發(fā)板的3號(hào)、5號(hào)、6號(hào)、9號(hào)、10號(hào)、11號(hào)引腳可以輸出PWM信號(hào),本案例使用3號(hào)、5號(hào)引腳。
PWM引腳為高電平時(shí)驅(qū)動(dòng)芯片導(dǎo)通。
【綜合案例】:智能小車綜合PWM控制系統(tǒng)設(shè)計(jì)3.程序設(shè)計(jì):使用Mixly軟件對(duì)上述函數(shù)進(jìn)行設(shè)計(jì)
【綜合案例】:智能小車綜合PWM控制系統(tǒng)設(shè)計(jì)4.代碼
【綜合案例】:智能小車綜合PWM控制系統(tǒng)設(shè)計(jì)實(shí)現(xiàn)效果
【綜合案例】:智能小車綜合PWM控制系統(tǒng)設(shè)計(jì)(a)智能小車前進(jìn)(b)智能小車左轉(zhuǎn)(c)智能小車右轉(zhuǎn)本案例中使用的函數(shù)見表2-8-12
【綜合案例】:智能小車綜合PWM控制系統(tǒng)設(shè)計(jì)1.器材準(zhǔn)備(1)首先識(shí)讀電路,選擇所需的電路元件,記錄其型號(hào)、規(guī)格、數(shù)量。逐個(gè)檢驗(yàn)各個(gè)元件規(guī)格和質(zhì)量是否正確合格。填寫表2-8-13。(2)把檢測(cè)好的器材整齊地放在工作臺(tái)上,準(zhǔn)備下一步安裝接線。
8.7.1任務(wù)實(shí)施及效果2.職業(yè)素養(yǎng)在任務(wù)實(shí)施過(guò)程中能夠按照操作規(guī)范進(jìn)行文明生產(chǎn),任務(wù)實(shí)施過(guò)程中的,填寫表2-8-14。
8.7.1任務(wù)實(shí)施及效果3.電路的安裝按照?qǐng)D2-8-29及圖2-8-30所示的電路原理圖和實(shí)物接線圖在接線板上布置元件并安裝接線。并填寫表2-8-15。
8.7.1任務(wù)實(shí)施及效果4.程序設(shè)計(jì)及下載按照8.7的內(nèi)容編寫智能小車綜合PWM控制的Arduino程序,并把程序通過(guò)電腦下載到ArduinoUNO主板中。并填寫表2-8-16。
8.7.1任務(wù)實(shí)施及效果5.通電調(diào)試(1)通電前檢查
在通電運(yùn)行前,應(yīng)做好通電前檢查,檢查各點(diǎn)通斷情況。若發(fā)現(xiàn)異常,則逐個(gè)檢查元件或?qū)Ь€,及時(shí)排除故障。(2)通電調(diào)試
在電路檢查正確無(wú)誤后,可進(jìn)行通電調(diào)試。通電時(shí)請(qǐng)認(rèn)真觀察出現(xiàn)的現(xiàn)象,并描述工作時(shí)的現(xiàn)象,填寫表2-8-17。
通電測(cè)試時(shí),學(xué)生應(yīng)正確操作,認(rèn)真觀察各元件、線路等的工作情況,與工作要求進(jìn)行比較是否正常。若在操作過(guò)程中出現(xiàn)故障,應(yīng)立即切斷電源,對(duì)照電路原理圖查找原因并排除故障,在調(diào)整或修復(fù)后方能再次通電,直至電路工作正常。(3)斷電拆線
實(shí)驗(yàn)完成后,應(yīng)先切斷電源,然后拆除線路。最后要整理現(xiàn)場(chǎng),將各電子元件和實(shí)驗(yàn)物品按規(guī)定位置安放整齊。
8.7.1任務(wù)實(shí)施及效果6.常見故障分析與排除在任務(wù)實(shí)施過(guò)程中,把出現(xiàn)的故障現(xiàn)象和排除方法記錄在表2-8-18中。
8.7.1任務(wù)實(shí)施及效果
經(jīng)過(guò)從此章節(jié)的學(xué)習(xí),同學(xué)們可以深刻的感受到。C語(yǔ)言中函數(shù)的引入可以極大地提高工作效率,增強(qiáng)程序的可讀性、健壯性。
在日常的學(xué)習(xí)中,我們應(yīng)該更加深入地學(xué)習(xí)函數(shù)的定義、調(diào)用、庫(kù)函數(shù)的正確使用、自定義函數(shù)以及函數(shù)參數(shù)和返回值的使用方法,為日后C語(yǔ)言編程的學(xué)習(xí)打好基礎(chǔ),達(dá)到事半功倍的效果。
8.7.2函數(shù)總結(jié)講解完畢,謝謝觀看!智能小車C語(yǔ)言程序控制
第9章數(shù)碼管靜態(tài)顯示
數(shù)碼管是一種半導(dǎo)體發(fā)光器件,其基本單元是發(fā)光二極管。數(shù)碼管按段數(shù)分為七段數(shù)碼管和八段數(shù)碼管,八段數(shù)碼管比七段數(shù)碼管多一個(gè)發(fā)光二極管(顯示時(shí)多一個(gè)小數(shù)點(diǎn))。
數(shù)碼管靜態(tài)顯示就是當(dāng)數(shù)碼管顯示某一字符時(shí),相應(yīng)的發(fā)光二極管恒定導(dǎo)通或者截止。一個(gè)八段數(shù)碼管有8個(gè)發(fā)光二極管,其顯示的字符可以采用前面介紹的點(diǎn)亮發(fā)光二極管的方式控制,即采用基本數(shù)據(jù)類型定義每個(gè)發(fā)光二極管對(duì)應(yīng)引腳的變量。利用基本數(shù)據(jù)類型可以解決一些簡(jiǎn)單的問(wèn)題。對(duì)于復(fù)雜的問(wèn)題,則需要使用數(shù)組。
數(shù)組是指按序排列的相同類型的數(shù)據(jù)元素的集合。例如,可以用數(shù)組表示一個(gè)班級(jí)里面所有學(xué)生的英語(yǔ)成績(jī)所組成的集合。數(shù)組中的元素是有排列順序的。數(shù)組元素用數(shù)組名和下標(biāo)確定,下標(biāo)是數(shù)組中各個(gè)元素的數(shù)字編號(hào)。
在C語(yǔ)言中,數(shù)組屬于構(gòu)造數(shù)據(jù)類型。按數(shù)組元素的類型,數(shù)組又可分為數(shù)值數(shù)組、字符數(shù)組、指針數(shù)組、結(jié)構(gòu)數(shù)組等。本章主要介紹數(shù)值數(shù)組和字符數(shù)組。目錄CONTENTS1一維數(shù)組2二維數(shù)組3字符數(shù)組4數(shù)碼管靜態(tài)顯示系統(tǒng)設(shè)計(jì)01PARTONE一維數(shù)組1一維數(shù)組1.1一維數(shù)組的定義一維數(shù)組:數(shù)組中每個(gè)元素只帶有一個(gè)下標(biāo)格式如下:
類型說(shuō)明符
數(shù)組名[常量表達(dá)式];類型說(shuō)明符:可以是任意一種基本數(shù)據(jù)類型或構(gòu)造數(shù)據(jù)類型數(shù)組名:用戶定義的數(shù)組標(biāo)識(shí)符常量表達(dá)式:數(shù)組元素的個(gè)數(shù),也稱數(shù)組長(zhǎng)度[]:數(shù)組運(yùn)算符例如:inta[6];floatb[3],c[4];charch[10];1一維數(shù)組1.1一維數(shù)組的定義數(shù)組的特點(diǎn):同一個(gè)數(shù)組中所有元素的數(shù)據(jù)類型都是相同的;各元素的存儲(chǔ)在內(nèi)存中按照先后順序連續(xù)存儲(chǔ)在一起;數(shù)組元素用數(shù)組的名稱和它在數(shù)組中的順序來(lái)表示。例如:a[0]代表數(shù)組a中的第一個(gè)元素a[1]代表數(shù)組a中的第二個(gè)元素1一維數(shù)組1.2一維數(shù)組元素的引用數(shù)組元素的表示:
數(shù)組名[下標(biāo)]
注意:數(shù)組元素必須先定義后引用引用時(shí)下標(biāo)從“0”開始下標(biāo)可以是整型常量或表達(dá)式,表達(dá)式內(nèi)允許變量存在下標(biāo)不能使用變量只能對(duì)數(shù)組元素進(jìn)行引用,如a[0]、a[i]、a[i+1]等,而不能引用整個(gè)數(shù)組對(duì)變量的任何操作都適用于數(shù)組元素引用數(shù)組元素時(shí)下標(biāo)不能出界1一維數(shù)組1.2一維數(shù)組元素的引用例如:輸出有10個(gè)元素的數(shù)組。/*輸出有10個(gè)元素的數(shù)組*/intmain(){inti,a[10];for(i=0;i<=9;i++)a[i]=i;for(i=0;i<=9;i++)printf("a[%d]=%d\t",i,a[i]); return0;}1一維數(shù)組1.3一維數(shù)組的初始化
數(shù)組初始化:定義數(shù)組時(shí)對(duì)各數(shù)組元素賦初值用賦值語(yǔ)句給數(shù)組元素逐個(gè)賦值輸入語(yǔ)句給數(shù)組元素逐個(gè)賦值①②③1一維數(shù)組1.3一維數(shù)組的初始化例如:inta[5]={0,1,2,3,4};等價(jià)于a[0]=0;a[1]=1;a[2]=2;a[3]=3;a[4]=4;(1)在定義數(shù)組時(shí)對(duì)數(shù)組元素賦初值例如:inta[5]={1,2,3};等價(jià)于a[0]=1;a[1]=2;a[2]=3;a[3]=0;a[4]=0;(2)只給部分元素賦值在定義數(shù)組時(shí)對(duì)數(shù)組元素賦初值,在編譯階段可使數(shù)組元素得到初值,這樣能減少運(yùn)行時(shí)間,提高程序運(yùn)行效率。1一維數(shù)組1.3一維數(shù)組的初始化例如,對(duì)數(shù)組a中所有元素賦初值0,可以寫成下面的形式:inta[5]={0,0,0,0,0};或inta[5]={0};(3)數(shù)組元素初值全部為0例如:inta[]={1,2,3,4,5,6,7,8};等價(jià)于inta[8]={1,2,3,4,5,6,7,8};編譯程序時(shí)系統(tǒng)會(huì)根據(jù)初值的個(gè)數(shù)確定數(shù)組長(zhǎng)度。(4)數(shù)組元素賦初值時(shí),可以不指定長(zhǎng)度1一維數(shù)組1.4一維數(shù)組的應(yīng)用【例9-1-3】從鍵盤輸入10個(gè)數(shù),求其中的最小值并顯示出來(lái)。
#include<stdio.h>/*從鍵盤輸入10個(gè)數(shù),求其中的最小值并顯示出來(lái)*/intmain(){inti,min,a[10];printf("pleaseinput10number:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);min=a[0];for(i=0;i<10;i++)if(min>a[i])min=a[i];printf("minvalueis%d\n",min); return0;}1一維數(shù)組1.4一維數(shù)組的應(yīng)用【例9-1-4】求出數(shù)組元素中的奇數(shù)和偶數(shù),并統(tǒng)計(jì)奇數(shù)和偶數(shù)的個(gè)數(shù)。
#include<stdio.h>/*求出數(shù)組元素中的奇數(shù)和偶數(shù),并統(tǒng)計(jì)奇數(shù)和偶數(shù)的個(gè)數(shù)*/intmain(){inta[5]={10,2,5,23,49};inti,j=0,k=0; //定義j和k為偶數(shù)個(gè)數(shù)和奇數(shù)個(gè)數(shù)for(i=0;i<5;i++) printf("a[%d]=%d\n",i,a[i]);1一維數(shù)組1.4一維數(shù)組的應(yīng)用for(i=0;i<5;i++) { if(a[i]%2==0)//在取余時(shí),結(jié)果為0則表示該數(shù)為偶數(shù)
{printf("%d為偶數(shù)\n",a[i]); j++;} else {printf("%d為奇數(shù)\n",a[i]); k++;} }printf("偶數(shù)個(gè)數(shù)為:%d個(gè),奇數(shù)個(gè)數(shù)為:%d個(gè)",j,k); return0;}作業(yè)將一個(gè)學(xué)生的5門課程成績(jī)存儲(chǔ)在一個(gè)數(shù)組中,求出這5門課程的平均成績(jī),并輸出低于平均成績(jī)的課程分?jǐn)?shù)。02PARTTWO二維數(shù)組2二維數(shù)組2.1二維數(shù)組的定義二維數(shù)組形式如下:
類型說(shuō)明符數(shù)組名[常量表達(dá)式1][常量表達(dá)式2];常量表達(dá)式1:表示第一維下標(biāo)的長(zhǎng)度常量表達(dá)式2:表示第二維下標(biāo)的長(zhǎng)度
例如:一個(gè)學(xué)習(xí)小組中有5個(gè)學(xué)生,每個(gè)學(xué)生有3門考試成績(jī),則可定義如下數(shù)組:
floata[5][3];
該數(shù)組共有5×3個(gè)元素,即:
a[0][0],a[0][1],a[0][2]
a[1][0],a[1][1],a[1][2]a[2][0],a[2][1],a[2][2]
a[3][0],a[3][1],a[3][2]
a[4][0],a[4][1],a[4][2]2二維數(shù)組2.1二維數(shù)組的定義注意:二維數(shù)組元素的下標(biāo)也是從0開始的,a[i][j]表示第i+1行、第j+1列的元素;定義數(shù)組時(shí)用到的“數(shù)組名[常量表達(dá)式1][常量表達(dá)式2]”和引用數(shù)組元素時(shí)用到的“數(shù)組名[下標(biāo)1][下標(biāo)2]”是有區(qū)別的。前者是定義一個(gè)數(shù)組,指定該數(shù)組的維數(shù)和各維的長(zhǎng)度。而后者是通過(guò)下標(biāo),指定一個(gè)具體的數(shù)組元素;二維數(shù)組在實(shí)際的硬件存儲(chǔ)器中是連續(xù)存儲(chǔ)的,即按行依次存儲(chǔ),每行中的各個(gè)元素同樣依次存儲(chǔ)。2二維數(shù)組2.1二維數(shù)組的定義例如:
inta[3][4];
定義了一個(gè)3行4列的二維數(shù)組,它在存儲(chǔ)器中存儲(chǔ)的方式如圖所示。2二維數(shù)組2.2二維數(shù)組元素的引用二維數(shù)組元素引用格式如下:
數(shù)組名[下標(biāo)1][下標(biāo)2]在引用數(shù)組元素時(shí)應(yīng)注意以下幾點(diǎn):(1)下標(biāo)是整型或字符型常量、變量或表達(dá)式;(2)數(shù)組元素可出現(xiàn)在表達(dá)式中,如a[1][2]=a[2][2]/2;(3)使用數(shù)組元素時(shí),應(yīng)注意不要超出其定義的范圍。2二維數(shù)組2.2二維數(shù)組元素的引用【例9-2-1】通過(guò)鍵盤給3行3列的二維數(shù)組賦初值并輸出數(shù)組各元素的值。#include<stdio.h>/*通過(guò)鍵盤給3行3列的二維數(shù)組賦初值并輸出數(shù)組各元素的值*/intmain(){inti,j,a[3][3];printf("請(qǐng)輸入9個(gè)數(shù):");2二維數(shù)組2.2二維數(shù)組元素的引用for(i=0;i<3;i++) for(j=0;j<3;j++) scanf("%d",&a[i][j]);for(i=0;i<3;i++) for(j=0;j<3;j++) printf("\na[%d][%d]=%d",i,j,a[i][j]); return0;}2二維數(shù)組2.3二維數(shù)組的初始化可使用以下幾種方法對(duì)二維數(shù)組進(jìn)行初始化:(1)將所有數(shù)據(jù)寫在一個(gè)大括號(hào)內(nèi),以逗號(hào)分隔,按數(shù)組元素在內(nèi)存中的排列順序?qū)ζ滟x值。例如:
inta[2][3]={0,1,2,3,4,5};賦值后各元素的值如下:012345(2)分行對(duì)數(shù)組元素賦值。例如:
inta[2][3]={{0,1,2},{4,5,6}};賦值后各元素的值如下:0124562二維數(shù)組2.3二維數(shù)組的初始化可使用以下幾種方法對(duì)二維數(shù)組進(jìn)行初始化:(3)對(duì)部分元素賦值,未賦值的元素取0值。例如:
inta[2][3]={{1},{4}};賦值后各元素的值如下:100400(4)若對(duì)全部元素賦初值,則定義時(shí)第一維長(zhǎng)度可省略,可由第二維長(zhǎng)度自動(dòng)確定第一維長(zhǎng)度。例如:
inta[][3]={0,1,2,3,4,5};相當(dāng)于inta[2][3]={0,1,2,3,4,5};2二維數(shù)組2.4二維數(shù)組的應(yīng)用【例9-2-2】表2-9-1為某公司2019年度第一季度銷售統(tǒng)計(jì)表,請(qǐng)將表中數(shù)據(jù)輸入數(shù)組,并找出哪位員工哪個(gè)月的銷售額最高。2二維數(shù)組2.4二維數(shù)組的應(yīng)用#include<stdio.h>/*在數(shù)組中找出哪位員工哪個(gè)月的銷售額最高*/intmain(){inti,j,staff=0,month=0,max;inta[][3]={10,9,12,20,18,22,12,15,16,14,10,16};max=a[0][0];for(i=0;i<=3;i++) { for(j=0;j<=2;j++) printf("%-5d",a[i][j]); printf("\n"); }2二維數(shù)組2.4二維數(shù)組的應(yīng)用for(i=0;i<=3;i++) for(j=0;j<=2;j++) if(a[i][j]>max) { max=a[i][j]; staff=i+1;month=j+1; }
printf("最大單月銷售額=%d,單月銷售額最高的員工=員工%d,所在月份為=%d月\n",max,staff,month); return0;}2二維數(shù)組2.4二維數(shù)組的應(yīng)用【例9-2-3】根據(jù)表2-9-1,分別求該公司每月銷售額、每名員工第一季度銷售額和4名員工第一季度銷售總額。#include<stdio.h>/*求每月銷售額、每名員工第一季度銷售額和4名員工第一季度銷售總額*/intmain(){printf("請(qǐng)輸入表中數(shù)據(jù):\n");inta[5][4],i,j;for(i=0;i<4;i++)for(j=0;j<3;j++)scanf("%d",&a[i][j]);for(i=0;i<3;i++) a[4][i]=0;for(j=0;j<5;j++)a[j][3]=0;2二維數(shù)組2.4二維數(shù)組的應(yīng)用for(i=0;i<4;i++)for(j=0;j<3;j++){ a[i][3]+=a[i][j];a[4][j]+=a[i][j];a[4][3]+=a[i][j];}for(i=0;i<5;i++) {for(j=0;j<4;j++) printf("%-5d\t",a[i][j]);printf("\n"); }printf("第一季度每月銷售額為:%5d,%5d,%5d\n",a[4][0],a[4][1],a[4][2]);printf("每名員工第一季度銷售額為:%5d,%5d,%5d,%5d\n",a[0][3],a[1][3],a[2][3],a[3][3]);printf("第一季度的銷售總額為:%5d\n",a[4][3]); return0;}作業(yè)試編寫一個(gè)C語(yǔ)言程序,將二維數(shù)組a中的行列元素互換,存到另一個(gè)數(shù)組b中。
03PARTTHREE字符數(shù)組3.1字符數(shù)組的定義字符數(shù)組:用來(lái)存放字符的,字符數(shù)組中的一個(gè)元素對(duì)應(yīng)一個(gè)字符。一維字符數(shù)組的定義格式: char數(shù)組名[常量表達(dá)式];
例如: chara[5];
二維字符數(shù)組的定義格式: char數(shù)組名[常量表達(dá)式1][常量表達(dá)式2];
例如: chara[2][3];3.2字符數(shù)組元素的引用二維字符數(shù)組元素的引用格式:數(shù)組名[行下標(biāo)][列下標(biāo)];一維字符數(shù)組元素的引用格式:數(shù)組名[下標(biāo)];用下標(biāo)指定要引用的數(shù)組元素3.3字符數(shù)組的初始化字符數(shù)組初始化有下面兩種方式:(1)對(duì)數(shù)組元素逐個(gè)初始化例如:
chara[10]={'I','','a','m','','h','a','p','p','y'};
字符數(shù)組a在內(nèi)存中的存儲(chǔ)形式見表2-9-2。
字符數(shù)組a在內(nèi)存中的存儲(chǔ)形式如下表:數(shù)組元素a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]元素的值I
am
happy3.3字符數(shù)組的初始化注意:如果初始化時(shí)元素的個(gè)數(shù)小于數(shù)組長(zhǎng)度,則多余元素自動(dòng)為'\0'('\0'是二進(jìn)制的0)。例如:chara[10]={'C','','p','r','o','g','r','a','m'};
a[9]=\0',即a[9]=0。
指定初值時(shí),若未指定數(shù)組長(zhǎng)度,則數(shù)組長(zhǎng)度等于初值個(gè)數(shù)。例如:
chara[]={'I','','a','m','','h','a','p','p','y'};
等價(jià)于
chara[10]={'I','','a','m','','h','a','p','p','y'};3.3字符數(shù)組的初始化(2)用字符串常量對(duì)數(shù)組進(jìn)行初始化。
例如:
chara[]={"Iamhappy"};
字符串在進(jìn)行存儲(chǔ)時(shí),系統(tǒng)會(huì)自動(dòng)在其后加上結(jié)束標(biāo)志'\0'。
另外,字符數(shù)組也允許在定義時(shí)進(jìn)行初始化。3.3字符數(shù)組的初始化【例9-3-1】輸出一個(gè)字符串“Wuhanjiayou”。#include<stdio.h>/*輸出一個(gè)字符串“Wuhanjiayou”*/intmain(){charc[12]={'W','u','h','a','n','','j','i','a','y','o','u'};inti;for(i=0;i<12;i++) printf("%c",c[i]); printf("\n"); return0;}3.3字符數(shù)組的初始化【例9-3-2】用“*”輸出一個(gè)三角形圖形。#include<stdio.h>/*用“*”輸出一個(gè)三角形圖形*/intmain(){chara[][5]={{'','','*'},{'','*','','*'},{'*','*','*','*','*'}};inti,j;for(i=0;i<3;i++){ for(j=0;j<5;j++) printf("%c",a[i][j]); printf("\n");} return0;}3.4字符串和字符串結(jié)束標(biāo)志字符串常量是用雙引號(hào)括起來(lái)的一串字符,并用'\0'(ASCII碼為0)作為字符串的結(jié)束標(biāo)志,這個(gè)標(biāo)志占1字節(jié)內(nèi)存空間,但不計(jì)入字符串的長(zhǎng)度。在C語(yǔ)言中,沒有專門的字符串變量,通常用一個(gè)字符數(shù)組來(lái)存放一個(gè)字符串。例如:
chara[]={'I','','a','m','','h','a','p','p','y'};可寫為
chara[]={"Iamhappy"};3.4字符串和字符串結(jié)束標(biāo)志在使用字符串時(shí)應(yīng)注意以下幾點(diǎn):用字符串賦值時(shí),無(wú)須指定數(shù)組長(zhǎng)度。以字符串形式對(duì)字符數(shù)組進(jìn)行初始化,系統(tǒng)會(huì)自動(dòng)在該字符串后面加結(jié)束標(biāo)志'\0'。在C語(yǔ)言中,以字符串形式賦值要比對(duì)數(shù)組中的字符逐個(gè)賦值多占1字節(jié),多占的字節(jié)用于存放字符串結(jié)束標(biāo)志'\0'。上面的例子在內(nèi)存中的實(shí)際存儲(chǔ)情況為Iamhappy'\0',字符串結(jié)束標(biāo)志'\0'是由編譯系統(tǒng)自動(dòng)加上的。由于系統(tǒng)加上了字符串結(jié)束標(biāo)志'\0',所以在用字符串賦值時(shí)不用指定字符數(shù)組的長(zhǎng)度,而由系統(tǒng)自行處理。在采用字符串方式后,字符數(shù)組的輸入和輸出將變得簡(jiǎn)單方便??梢杂胹canf()函數(shù)和printf()函數(shù)一次性輸入和輸出一個(gè)字符數(shù)組中的字符串,而不必使用循環(huán)語(yǔ)句逐個(gè)輸入和輸出字符。3.5字符數(shù)組的輸入和輸出1.逐個(gè)字符輸入和輸出;例:用格式符"%c"輸入或輸出一個(gè)字符串。#include<stdio.h>/*用格式符"%c"輸入或輸出一個(gè)字符串*/intmain(){chara[5];inti;for(i=0;i<5;i++) scanf("%c",&a[i]);for(i=0;i<5;i++) printf("%c",a[i]); return0;}2.整串輸入
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 委托服務(wù)合同文本
- 高效供暖合同協(xié)議書
- 政府采購(gòu)空調(diào)合同的法律問(wèn)題
- 投資理財(cái)合同協(xié)議如何簽訂
- 業(yè)績(jī)對(duì)賭合同范本
- 高效咨詢服務(wù)合同示范
- 二手平房買賣合同
- 分包勞務(wù)合同示范
- 簡(jiǎn)易格式個(gè)人借款合同
- 國(guó)內(nèi)采購(gòu)合同范本版在線
- 《實(shí)驗(yàn)活動(dòng)8 粗鹽中難溶性雜質(zhì)的去除》教學(xué)設(shè)計(jì)(附導(dǎo)學(xué)案)
- 學(xué)校2024-2025年度工作計(jì)劃
- (2024年)職業(yè)健康培訓(xùn)課件(PPT9)
- 公共經(jīng)濟(jì)學(xué)智慧樹知到期末考試答案2024年
- 移動(dòng)互聯(lián)網(wǎng)時(shí)代下的營(yíng)銷策略創(chuàng)新研究
- 玻璃幕墻工程質(zhì)量控制
- 生涯發(fā)展展示
- 項(xiàng)目經(jīng)理管理辦法
- 病房病人燙傷預(yù)防
- 心理健康測(cè)試題目及答案小學(xué)生版
- 神經(jīng)系統(tǒng)練習(xí)題附有答案
評(píng)論
0/150
提交評(píng)論