C語言項目化教程(基于智能制造軟件)教案 項目7 汽車數(shù)據(jù)間接顯示(指針)_第1頁
C語言項目化教程(基于智能制造軟件)教案 項目7 汽車數(shù)據(jù)間接顯示(指針)_第2頁
C語言項目化教程(基于智能制造軟件)教案 項目7 汽車數(shù)據(jù)間接顯示(指針)_第3頁
C語言項目化教程(基于智能制造軟件)教案 項目7 汽車數(shù)據(jù)間接顯示(指針)_第4頁
C語言項目化教程(基于智能制造軟件)教案 項目7 汽車數(shù)據(jù)間接顯示(指針)_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

PAGE課題任務(wù)7.1統(tǒng)計某車企一年的汽車銷售量(指針和變量)課型講練授課班級授課時數(shù)2教學(xué)目標(biāo)1.指針與指針變量的基本概念2.指針變量的定義與應(yīng)用3.數(shù)組指針變量的說明和應(yīng)用教學(xué)重點數(shù)組指針變量的說明和應(yīng)用教學(xué)難點指針變量的理解學(xué)情分析指針是C語言中廣泛使用的一種數(shù)據(jù)類型。運用指針編程是C語言最主要的風(fēng)格之一。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu);能很方便地使用數(shù)組和字符串;并能象匯編語言一樣處理內(nèi)存地址,從而編出精練而高效的程序。但是指針又是學(xué)習(xí)的一個難點,學(xué)生在學(xué)習(xí)時分不清地址與變量的表示。教學(xué)效果教后記項目7汽車數(shù)據(jù)間接顯示(指針)學(xué)習(xí)目標(biāo)知識目標(biāo)理解指針就是地址。理解直接訪問和間接訪問。熟悉“&”取地址運算符和“*”間接尋址運算符。能力目標(biāo)掌握指針變量的定義、引用、初始化、做函數(shù)參數(shù)及相應(yīng)的運算。能利用指針對一維數(shù)組進(jìn)行操作。能通過字符串指針對字符串進(jìn)行操作。情景設(shè)置對于一個完整的新能源數(shù)據(jù)監(jiān)控系統(tǒng),需要隨時監(jiān)控車輛各個數(shù)據(jù)的狀態(tài),當(dāng)出現(xiàn)電池等數(shù)據(jù)到期時,要及時更換或修理電池。任務(wù)7.1統(tǒng)計某車企一年的汽車銷售量(指針和變量)7.1.1任務(wù)目標(biāo)某車企上半年的汽車銷售量為56輛,下半年的汽車銷售量為78輛,使用指針統(tǒng)計一年的汽車銷售量(變量名:上半年汽車銷售量,下半年汽車銷售量)。程序運行結(jié)果如圖7-1所示。圖7-1程序運行結(jié)果7.1.2知識儲備每個班級都有教室,高一三班的教室在A樓311室,如果將一疊材料送過去,則可以將材料送到高一三班教室,或?qū)⒉牧纤偷紸樓311教室。這兩種說法都對,第一種說法是直接告訴地址,第二種說法是直接說出教室名稱。1.直接訪問和間接訪問在C語言中,給變量賦值也有以下兩種方法。第一種,直接訪問賦值:直接按照變量名進(jìn)行訪問,如直接用變量名賦值,系統(tǒng)會準(zhǔn)確地將值存入該變量的內(nèi)存單元中,而用戶不必清楚該變量具體的內(nèi)存地址。第二種,間接訪問賦值:將該變量地址存放在另一個特殊變量(指針變量)中,通過這個指針變量,將值存入指定的內(nèi)存單元。前者屬于直接存取,后者屬于間接存取。2.指針和地址指針:用戶可以將指針看作內(nèi)存中的一個地址。在一般情況下,指針需要指向另一個變量的地址。示例1:下面程序主要介紹通過指針變量訪問普通變量的方法。#include"stdio.h"voidmain(){intx=0;int*p; //定義指針變量p=&x; //將變量x的地址賦給指針變量*p*p=100; //等價于x=100*/*p=*p+50; //等價于x=x+50*/printf("x=%d",x);}歸納分析如下。(1)指針變量也必須先定義后使用,指針變量的一般定義形式為:類型名*指針變量名:(2)變量的地址按如下形式表示:&變量名;指針與&變量名;等價于*指針變量名與變量;7.1.3典型案例典型案例1:某新能源汽車的電池的使用年限是8年,從鍵盤上輸入電池已使用的年限,輸出電池的剩余年限(變量名:電池的使用年限Battery_life,電池已使用年限D(zhuǎn)urable_years,電池的剩余年限Remain_years)。代碼如下:#include"stdio.h"voidmain(){intDurable_years,Battery_life=8,Remain_years,*D,*B,*R;printf("已知某新能源汽車的電池的使用年限是%d年\n",Battery_life);printf("從鍵盤上輸入電池已使用的年限:\n");scanf("%d",&Durable_years);D=&Durable_years;B=&Battery_life;R=&Remain_years;*R=*B-*D;printf("已知某新能源汽車的電池的使用年限是%d年,電池已使用的年限為%d年,電池的剩余年限為%d年",*B,*D,*R);}}典型案例1的運行結(jié)果如圖7-2所示。典型案例2:從鍵盤上輸入某新能源客車的載客人數(shù),輸入目前已經(jīng)有的人數(shù),輸出還有多少人可以乘坐該客車(變量名:總載客人數(shù)Headcount,目前已有的人數(shù)Somepeople,剩余人數(shù)Remainpeople)。代碼如下:#include"stdio.h"voidmain(){intHeadcount,Somepeople,Remainpeople,*H,*S,*R;H=&Headcount;S=&Somepeople;printf("從鍵盤上輸入某新能源客車的載客人數(shù)\n");scanf("%d",H);printf("輸入目前已有的人數(shù)\n");scanf("%d",S);R=&Remainpeople;*R=*H-*S;printf("還有%d人可以乘坐該客車",*R);}典型案例2的運行結(jié)果如圖7-3所示。 圖7-2典型案例1的運行結(jié)果 圖7-3典型案例2的運行結(jié)果7.1.4任務(wù)分析與實踐#include"stdio.h"voidmain(){intun=78,on=56,sale,*p,*q,*t;printf("已知某車企上半年的汽車銷售量為%d輛,下半年的汽車銷售量為%d輛\n",on,un);p=&un;q=&on;t=&sale;*t=*p+*q;printf("總銷售量為%d輛",*t);}7.1.5鞏固練習(xí)一、選擇題1.下面程序的運行結(jié)果是()。voidast(intx,inty,int*cp,int*dp){*cp=x+y;*dp=x-y;}main(){inta=4,b=3,c,d;ast(a,b,&c,&d);printf("%d,%d\n",c,d);}A.7,1 B.1,7 C.7,-1 D.c、d未賦值,編譯出錯2.有以下語句:inta[5]={0,1,2,3,4,5},i;int*p=a;設(shè)0≤i<5,對a數(shù)組元素不正確的引用是()。A.*(&a[i]) B.a(chǎn)[p-a] C.*(*(a+i)) D.p[i]3.假設(shè)有定義int*p1,*p2;,則錯誤的表達(dá)式是()。A.p1+p2 B.p1-p2 C.p1<p2 D.p1=p24.以下程序段運行后,表達(dá)式*(p+4)的值為()。chara[]="china";char*p;p=a;A.'n' B.'a' C.存放'n'的地址 D.存放'a'的地址5.以下程序段運行后,表達(dá)式*(p++)的值為()。chara[5]="work";char*p=a;A.'w' B.存放'w'的地址 C.'o' D.存放'o'的地址6.已知有定義int*p,k=4;p=&k;,以下均代表地址的是()。A.k,p B.&k,&p C.&k,p D.k,*p7.下面語句錯誤的是()。A.int*p;*p=20;B.char*s="abcdef";printf("%s\n",s);C.char*str="abcdef";str++;D.char*str;str="abcdef";二、填空題1.指針變量是把內(nèi)存中另一個數(shù)據(jù)的________作為其值的變量。2.能夠直接賦值給指針變量的整數(shù)是________。3.程序中已有定義intk;,定義一個指向變量k的指針變量p的語句是________;通過指針變量,將數(shù)值6賦值給k的語句是________;定義一個可以指向指針變量p的變量pp的語句是________;通過賦值語句將pp指向指針變量p的語句是________。課題任務(wù)7.2輸出1~12月的汽車銷售量(指針和數(shù)組)課型講練授課班級授課時數(shù)2教學(xué)目標(biāo)1.掌握通過指針訪問數(shù)組2.指針指向數(shù)組的幾種方式教學(xué)重點指針指向數(shù)組時幾種方式的轉(zhuǎn)換教學(xué)難點指針指向數(shù)組的理解學(xué)情分析前面已經(jīng)講過了指針指向一個變量,數(shù)組也學(xué)習(xí)過,基本的轉(zhuǎn)換學(xué)生是可以理解的,但是指針與數(shù)組聯(lián)系后很多同學(xué)不是能理解指針,幾種關(guān)系放在一起更容易亂。教學(xué)效果教后記任務(wù)7.2輸出1~12月的汽車銷售量(指針和數(shù)組)7.2.1任務(wù)目標(biāo)已知某品牌4S店1~12月的汽車銷售量分別為10、12、15、14、16、8、7、14、16、17、11、12,輸出1~12月的汽車銷售量(變量名:銷售量數(shù)組、銷售量指針、單位為輛)。程序運行結(jié)果如圖7-4所示。圖7-4程序運行結(jié)果7.2.2知識儲備一個變量有地址,一個數(shù)組包含若干個元素,每個數(shù)組元素都在內(nèi)存中占有存儲單元,它們也都有自己對應(yīng)的地址。數(shù)組元素的指針就是數(shù)組元素的地址。1.?dāng)?shù)組與指針一維數(shù)組中指針的初始化有以下兩種方法。方法一:inta[10],*p=NULL

;p=a;方法二:inta[10],*p=NULL

;p=&a[0]

;當(dāng)進(jìn)行如上條件時,可以有如下的等價替換。數(shù)組地址p+i、&a[i]、a+i三者相互等價。例如:scanf("%d",&a[i]);scanf("%d",p+i);scanf("%d",a+i);三種輸入效果一樣的,運用指針能夠提高計算機(jī)的執(zhí)行效率。數(shù)組元素*(p+i)、a[i]、*(a+i)三者相互等價。例如:printf("%d",a[i]);printf("%d",*(p+i));printf("%d",*(a+i));三種輸出結(jié)果相同,運用指針能夠提高計算機(jī)程序的執(zhí)行效率。2.指針運算前文已經(jīng)說明了指針就是地址,對地址進(jìn)行賦值會是什么意思呢?通過前文介紹也可以看出來p+1就是a[1]的地址,同時p+1可以寫成p++,因此指針有以下兩個特點。p+1:指向同一個數(shù)組中的下一個元素。p-1:指向同一個數(shù)組中的上一個元素。3.引入數(shù)組元素運用指針引入數(shù)組元素,要考慮以下3個技巧。(1)先執(zhí)行p++,再計算*p。通過分析,p++執(zhí)行的是下一個元素的地址,因此*p就是下一個元素的值。(2)*p++。由于++和*同優(yōu)先級,結(jié)合方向自右而左,因此*p++等價于*(p++)。(3)*(p++)與*(++p)是否相同。上述兩者不相同。*(p++)為先選*p的值,其值再加1。*(p++)為p先指向下一個元素的地址,再求下一個元素的值。7.2.3典型案例典型案例1:運用指針方式從鍵盤上輸入某客車集團(tuán)5個員工的工資,并將其輸出。代碼如下:#include"stdio.h"voidmain(){inti,employee[5],*p;printf("請輸入五個員工的工資\n");for(i=0;i<5;i++)scanf("%d",&employee[i]);for(p=employee;p<employee+5;p++)printf("員工的工資為%d\n",*p);}典型案例1的運行結(jié)果如圖7-5所示。典型案例2:從鍵盤上輸入一個員工1~12月的工資,求和并輸出。代碼如下:#include"stdio.h"voidmain(){inti,month[12],*p,salary=0;for(i=0;i<12;i++){printf("請輸入%d月的工資",i+1);scanf("%d",&month[i]);}for(p=month;p<month+12;p++){salary=*p+salary;}printf("員工的總工資為%d\n",salary);}典型案例2運行結(jié)果如圖7-6所示。 圖7-5典型案例1的運行結(jié)果 圖7-6典型案例2運行截圖7.2.4任務(wù)分析與實踐#include"stdio.h"voidmain(){intSale[12]={10,12,15,14,16,8,7,14,16,17,11,12},*p;printf("請輸出1~12月的汽車銷售量:");for(p=Sale;p<(Sale+12);p++){printf("%d",*p);}}7.2.5鞏固練習(xí)一、選擇題1.已知有以下定義,且0≤i<10,對數(shù)組元素的錯誤引用是()。inta[10]={1,2,3,4,5,6,7,8,9,10},*p,i;p=a;A.*(a+i) B.a(chǎn)[p-a] C.p+i D.*(&a[i])2.已知有如下定義,以下說法中正確的是()。char*a[2]={"abcd","ABCD"};A.?dāng)?shù)組a的元素值分別為"abcd"和"ABCD"B.a(chǎn)是指針變量,它指向含有兩個數(shù)組元素的字符型數(shù)組C.?dāng)?shù)組a的兩個元素分別存放的是含有4個字符的一維數(shù)組的首地址D.?dāng)?shù)組a的兩個元素中各自存放了字符'a'、'A'的地址3.已知有以下定義:inta[10]={1,2,3,4,5,6,7,8,9,10},*p=a;數(shù)值為6的表達(dá)式是()。A.*p+6 B.*(p+6) C.*p+=5 D.p+54.假設(shè)P1和P2是指向同一個int類型一維數(shù)組的指針變量,k為int類型變量,則不能正確執(zhí)行的語句是()。A.k=*P1+*P2; B.p2=k; C.P1=P2; D.k=*P1*(*P2);5.已知有如下定義:inta[10]={1,2,3,4,5,6,7,8,9,10},*p=a;數(shù)值為9的表達(dá)式是()。A.*p+9 B.*(p+8) C.*p+=9 D.p+86.下面程序的功能是輸出數(shù)組中的最大值,由s指針指向該元素。voidmain(){inta[10]={6,7,2,9,1,10,5,8,4,3,},*p,*s;for(p=a,s=a;p-a<10;p++)if()s=p;printf("Themax:%d",*s):}if語句中的判斷表達(dá)式應(yīng)該是()。A.p>s B.*p>*s C.a(chǎn)[p]>a[s] D.p-a>p-s7.已知有以下定義:inta[10]={1,2,3,4,5,6,7,8,9,10},*p=a;不能表示a數(shù)組元素的表達(dá)式是()。A.*p B.a(chǎn)[10] C.*a D.a(chǎn)[p-a]8.已知有以下定義:inta[]={1,2,3,4,5,6,7,8,9,10},*p=a;值為3的表式是()。A.p+=2,*(p++) B.p+=2,*++pC.p+=3,*p++ D.p+=2,++*p9.下面程序的輸出結(jié)果是()。voidmain(){inta[]={2,4,6,8,10};inty=1,x,*p;p=&a[1];for(x=0;x<3;x++)y+=*(p+x);printf("y=%d\n",y);}10.下面程序的輸出結(jié)果是()。voidmain(){inta[5]={2,4,6,8,10},*p,**k;p=a;k=&p;printf("%d",*(p++));printf("%d\n",**k);}課題任務(wù)7.3某車企多項數(shù)據(jù)顯示(將指針作為函數(shù)參數(shù))課型講練授課班級授課時數(shù)2教學(xué)目標(biāo)1.字符串指針變量的說明和應(yīng)用2.函數(shù)的指針與函數(shù)指針變量的應(yīng)用3.指針數(shù)組與主函數(shù)main()的形參教學(xué)重點1.函數(shù)的指針與函數(shù)指針變量的應(yīng)用2.指針數(shù)組與主函數(shù)main()的形參教學(xué)難點指針數(shù)組與主函數(shù)main()的形參學(xué)情分析指針和字符串連接在一起是一個難點,前面應(yīng)該都講過了指針和字符串分別這兩個知識點。將兩者結(jié)合起來學(xué)習(xí),體會不同之處。對于子函數(shù)用指針作為行參也是第一次接觸,會有一定難度。教學(xué)效果教后記任務(wù)7.3某車企多項數(shù)據(jù)顯示(將指針作為函數(shù)參數(shù))7.3.1任務(wù)目標(biāo)已知某品牌4S店1~12月的汽車銷售量分別為10,12,15,14,16,8,7,14,16,17,11,12,輸出1~12月的汽車銷售量。7.3.2知識儲備1.?dāng)?shù)組名可以用作函數(shù)的實參和形參。例如:#include<stdio.h>sort(intarray[]){…}voidmain(){intscore[10];…sort(score);…}當(dāng)使用數(shù)組名作參數(shù)時,如果形參數(shù)組中各元素的值發(fā)生變化,則實參數(shù)組元素的值也隨之變化。因為實參數(shù)組與形參數(shù)組共占同一段內(nèi)存單元。2.動態(tài)存儲方式與靜態(tài)存儲方式靜態(tài)存儲方式:程序運行期間分配固定的存儲空間。動態(tài)存儲方式:程序運行期間根據(jù)需要進(jìn)行動態(tài)分配存儲空間的方式。3.局部變量與全局變量程序中變量的使用范圍不同:作用域(scope)就是變量的有效范圍。變量的作用域取決于變量的訪問性。(1)局部變量。函數(shù)內(nèi)部的變量稱為“局部變量”(localvariable),其作用域僅限于函數(shù)內(nèi)部,離開該函數(shù)后就是無效的,再使用系統(tǒng)就會報錯。主函數(shù)中定義的變量也只能在主函數(shù)中使用,不能在其他函數(shù)中使用。允許在不同的函數(shù)中使用相同的變量名,它們代表不同變量,分配不同的存儲單元,互不相干,不會發(fā)生混淆。形參變量:在函數(shù)體內(nèi)定義的變量都是局部變量。實參給形參傳值的過程也就是給局部變量賦值的過程。(2)全局變量在所有函數(shù)外部定義的變量稱為“全局變量”(globalvariable),它的作用域默認(rèn)是整個程序,也就是所有的源文件,包括.c文件和.h文件。它的作用域是從聲明時刻開始到程序結(jié)束。全局變量定義必須在所有函數(shù)之外。全局變量可加強(qiáng)函數(shù)模塊之間的數(shù)據(jù)聯(lián)系,但是函數(shù)又依賴這些變量,降低函數(shù)的獨立性。在同一個源文件中,允許全局變量和局部變量同名,在局部變量作用域內(nèi),同名的全局變量不起作用。示例1,全局變量與局部變量的應(yīng)用。#include"stdio.h"intsum1=0; //全局變量voidaddNumbers(intnum1,intnum2){intsum=0; //局部變量sum=sum+num1+num2;sum1=sum1+num1+num2;printf("\n兩數(shù)之和子函數(shù)sum=的值是%d\n",sum);printf("\n兩數(shù)之和子函數(shù)sum1=的值是%d\n",sum1);}voidmain(){intsum=0; //局部變量intnum1,num2; //局部變量printf("\n請輸入兩個數(shù);");scanf("%d%d",&num1,&num2);addNumbers(num1,num2);addNumbers(num1,num2);printf("\n兩數(shù)之和主函數(shù)sum=的值是%d\n",sum);}示例1的運行結(jié)果如圖7-7所示。圖7-7示例1的運行結(jié)果通過上述示例發(fā)現(xiàn),定義了全局變量的sum1的值第二次值為20,局部變量的圖7-7示例1的運行結(jié)果7.3.3典型案例典型案例1:從鍵盤上輸入某客車集團(tuán)5個員工的工資,并將其輸出。代碼如下:#include"stdio.h"voidscanfEmployees(intEmployees[],intn){int*p,i;for(p=Employees,i=1;p<(Employees+n);p++,i++){printf("請輸入第%d個人的工資:",i);scanf("%d",p);}}voidprint(intEmployees[],intn){int*p;printf("\n%d個員工的工資分別為:",n);for(p=Employees;p<(Employees+n);p++){printf("%d",*p);}}voidmain(){intEmployees[5],i=1;scanfEmployees(Employees,5);print(Employees,5);}典型案例1的運行結(jié)果如7-8所示。典型案例2:從鍵盤上輸入一個員工1~12月的工資,求和并輸出。代碼如下:#include"stdio.h"voidscan(intSale[],intn);voidprin(intSale[],intn);voidsum(intSale[],intn);int*p,i;voidmain(){intSale[12];scan(Sale,12);sum(Sale,12);prin(Sale,12);}voidscan(intSale[],intn){for(p=Sale,i=1;p<(Sale+n);p++,i++){printf("請輸入%d月的工資:",i);scanf("%d",p);}}voidsum(intSale[],intn){intsum=0;for(p=Sale;p<(Sale+n);p++){sum=sum+*p;}printf("12個月的工資總和為:%d\n",sum);}voidprin(intSale[],intn){printf("\n12個月的工資分別為:");for(p=Sale;p<(Sale+n);p++){printf("%d",*p);}}典型案例2的運行結(jié)果如圖7-9所示。 圖7-8典型案例1的運行結(jié)果 圖7-9典型案例2的運行結(jié)果7.3.4任務(wù)分析與實踐#include"stdio.h"voidprint12(intsale[],intn){int*s;printf("1~12月的汽車銷售量為:");for(s=sale;s<(sale+n);s++){printf("%d",*s);}}voidmain(){intsale[12]={10,12,15,14,16,8,7,14,16,17,11,12},*s;prin

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論