C语言项目化教程(基于智能制造软件)教案 项目7 汽车数据间接显示(指针)_第1页
C语言项目化教程(基于智能制造软件)教案 项目7 汽车数据间接显示(指针)_第2页
C语言项目化教程(基于智能制造软件)教案 项目7 汽车数据间接显示(指针)_第3页
C语言项目化教程(基于智能制造软件)教案 项目7 汽车数据间接显示(指针)_第4页
C语言项目化教程(基于智能制造软件)教案 项目7 汽车数据间接显示(指针)_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

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

文档简介

PAGE课题任务7.1统计某车企一年的汽车销售量(指针和变量)课型讲练授课班级授课时数2教学目标1.指针与指针变量的基本概念2.指针变量的定义与应用3.数组指针变量的说明和应用教学重点数组指针变量的说明和应用教学难点指针变量的理解学情分析指针是C语言中广泛使用的一种数据类型。运用指针编程是C语言最主要的风格之一。利用指针变量可以表示各种数据结构;能很方便地使用数组和字符串;并能象汇编语言一样处理内存地址,从而编出精练而高效的程序。但是指针又是学习的一个难点,学生在学习时分不清地址与变量的表示。教学效果教后记项目7汽车数据间接显示(指针)学习目标知识目标理解指针就是地址。理解直接访问和间接访问。熟悉“&”取地址运算符和“*”间接寻址运算符。能力目标掌握指针变量的定义、引用、初始化、做函数参数及相应的运算。能利用指针对一维数组进行操作。能通过字符串指针对字符串进行操作。情景设置对于一个完整的新能源数据监控系统,需要随时监控车辆各个数据的状态,当出现电池等数据到期时,要及时更换或修理电池。任务7.1统计某车企一年的汽车销售量(指针和变量)7.1.1任务目标某车企上半年的汽车销售量为56辆,下半年的汽车销售量为78辆,使用指针统计一年的汽车销售量(变量名:上半年汽车销售量,下半年汽车销售量)。程序运行结果如图7-1所示。图7-1程序运行结果7.1.2知识储备每个班级都有教室,高一三班的教室在A楼311室,如果将一叠材料送过去,则可以将材料送到高一三班教室,或将材料送到A楼311教室。这两种说法都对,第一种说法是直接告诉地址,第二种说法是直接说出教室名称。1.直接访问和间接访问在C语言中,给变量赋值也有以下两种方法。第一种,直接访问赋值:直接按照变量名进行访问,如直接用变量名赋值,系统会准确地将值存入该变量的内存单元中,而用户不必清楚该变量具体的内存地址。第二种,间接访问赋值:将该变量地址存放在另一个特殊变量(指针变量)中,通过这个指针变量,将值存入指定的内存单元。前者属于直接存取,后者属于间接存取。2.指针和地址指针:用户可以将指针看作内存中的一个地址。在一般情况下,指针需要指向另一个变量的地址。示例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,电池已使用年限Durable_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的运行结果如图7-2所示。典型案例2:从键盘上输入某新能源客车的载客人数,输入目前已经有的人数,输出还有多少人可以乘坐该客车(变量名:总载客人数Headcount,目前已有的人数Somepeople,剩余人数Remainpeople)。代码如下:#include"stdio.h"voidmain(){intHeadcount,Somepeople,Remainpeople,*H,*S,*R;H=&Headcount;S=&Somepeople;printf("从键盘上输入某新能源客车的载客人数\n");scanf("%d",H);printf("输入目前已有的人数\n");scanf("%d",S);R=&Remainpeople;*R=*H-*S;printf("还有%d人可以乘坐该客车",*R);}典型案例2的运行结果如图7-3所示。 图7-2典型案例1的运行结果 图7-3典型案例2的运行结果7.1.4任务分析与实践#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巩固练习一、选择题1.下面程序的运行结果是()。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;设0≤i<5,对a数组元素不正确的引用是()。A.*(&a[i]) B.a[p-a] C.*(*(a+i)) D.p[i]3.假设有定义int*p1,*p2;,则错误的表达式是()。A.p1+p2 B.p1-p2 C.p1<p2 D.p1=p24.以下程序段运行后,表达式*(p+4)的值为()。chara[]="china";char*p;p=a;A.'n' B.'a' C.存放'n'的地址 D.存放'a'的地址5.以下程序段运行后,表达式*(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.指针变量是把内存中另一个数据的________作为其值的变量。2.能够直接赋值给指针变量的整数是________。3.程序中已有定义intk;,定义一个指向变量k的指针变量p的语句是________;通过指针变量,将数值6赋值给k的语句是________;定义一个可以指向指针变量p的变量pp的语句是________;通过赋值语句将pp指向指针变量p的语句是________。课题任务7.2输出1~12月的汽车销售量(指针和数组)课型讲练授课班级授课时数2教学目标1.掌握通过指针访问数组2.指针指向数组的几种方式教学重点指针指向数组时几种方式的转换教学难点指针指向数组的理解学情分析前面已经讲过了指针指向一个变量,数组也学习过,基本的转换学生是可以理解的,但是指针与数组联系后很多同学不是能理解指针,几种关系放在一起更容易乱。教学效果教后记任务7.2输出1~12月的汽车销售量(指针和数组)7.2.1任务目标已知某品牌4S店1~12月的汽车销售量分别为10、12、15、14、16、8、7、14、16、17、11、12,输出1~12月的汽车销售量(变量名:销售量数组、销售量指针、单位为辆)。程序运行结果如图7-4所示。图7-4程序运行结果7.2.2知识储备一个变量有地址,一个数组包含若干个元素,每个数组元素都在内存中占有存储单元,它们也都有自己对应的地址。数组元素的指针就是数组元素的地址。1.数组与指针一维数组中指针的初始化有以下两种方法。方法一:inta[10],*p=NULL

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

;p=&a[0]

;当进行如上条件时,可以有如下的等价替换。数组地址p+i、&a[i]、a+i三者相互等价。例如:scanf("%d",&a[i]);scanf("%d",p+i);scanf("%d",a+i);三种输入效果一样的,运用指针能够提高计算机的执行效率。数组元素*(p+i)、a[i]、*(a+i)三者相互等价。例如:printf("%d",a[i]);printf("%d",*(p+i));printf("%d",*(a+i));三种输出结果相同,运用指针能够提高计算机程序的执行效率。2.指针运算前文已经说明了指针就是地址,对地址进行赋值会是什么意思呢?通过前文介绍也可以看出来p+1就是a[1]的地址,同时p+1可以写成p++,因此指针有以下两个特点。p+1:指向同一个数组中的下一个元素。p-1:指向同一个数组中的上一个元素。3.引入数组元素运用指针引入数组元素,要考虑以下3个技巧。(1)先执行p++,再计算*p。通过分析,p++执行的是下一个元素的地址,因此*p就是下一个元素的值。(2)*p++。由于++和*同优先级,结合方向自右而左,因此*p++等价于*(p++)。(3)*(p++)与*(++p)是否相同。上述两者不相同。*(p++)为先选*p的值,其值再加1。*(p++)为p先指向下一个元素的地址,再求下一个元素的值。7.2.3典型案例典型案例1:运用指针方式从键盘上输入某客车集团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的运行结果如图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运行结果如图7-6所示。 图7-5典型案例1的运行结果 图7-6典型案例2运行截图7.2.4任务分析与实践#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巩固练习一、选择题1.已知有以下定义,且0≤i<10,对数组元素的错误引用是()。inta[10]={1,2,3,4,5,6,7,8,9,10},*p,i;p=a;A.*(a+i) B.a[p-a] C.p+i D.*(&a[i])2.已知有如下定义,以下说法中正确的是()。char*a[2]={"abcd","ABCD"};A.数组a的元素值分别为"abcd"和"ABCD"B.a是指针变量,它指向含有两个数组元素的字符型数组C.数组a的两个元素分别存放的是含有4个字符的一维数组的首地址D.数组a的两个元素中各自存放了字符'a'、'A'的地址3.已知有以下定义:inta[10]={1,2,3,4,5,6,7,8,9,10},*p=a;数值为6的表达式是()。A.*p+6 B.*(p+6) C.*p+=5 D.p+54.假设P1和P2是指向同一个int类型一维数组的指针变量,k为int类型变量,则不能正确执行的语句是()。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;数值为9的表达式是()。A.*p+9 B.*(p+8) C.*p+=9 D.p+86.下面程序的功能是输出数组中的最大值,由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语句中的判断表达式应该是()。A.p>s B.*p>*s C.a[p]>a[s] D.p-a>p-s7.已知有以下定义:inta[10]={1,2,3,4,5,6,7,8,9,10},*p=a;不能表示a数组元素的表达式是()。A.*p B.a[10] C.*a D.a[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.下面程序的输出结果是()。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.下面程序的输出结果是()。voidmain(){inta[5]={2,4,6,8,10},*p,**k;p=a;k=&p;printf("%d",*(p++));printf("%d\n",**k);}课题任务7.3某车企多项数据显示(将指针作为函数参数)课型讲练授课班级授课时数2教学目标1.字符串指针变量的说明和应用2.函数的指针与函数指针变量的应用3.指针数组与主函数main()的形参教学重点1.函数的指针与函数指针变量的应用2.指针数组与主函数main()的形参教学难点指针数组与主函数main()的形参学情分析指针和字符串连接在一起是一个难点,前面应该都讲过了指针和字符串分别这两个知识点。将两者结合起来学习,体会不同之处。对于子函数用指针作为行参也是第一次接触,会有一定难度。教学效果教后记任务7.3某车企多项数据显示(将指针作为函数参数)7.3.1任务目标已知某品牌4S店1~12月的汽车销售量分别为10,12,15,14,16,8,7,14,16,17,11,12,输出1~12月的汽车销售量。7.3.2知识储备1.数组名可以用作函数的实参和形参。例如:#include<stdio.h>sort(intarray[]){…}voidmain(){intscore[10];…sort(score);…}当使用数组名作参数时,如果形参数组中各元素的值发生变化,则实参数组元素的值也随之变化。因为实参数组与形参数组共占同一段内存单元。2.动态存储方式与静态存储方式静态存储方式:程序运行期间分配固定的存储空间。动态存储方式:程序运行期间根据需要进行动态分配存储空间的方式。3.局部变量与全局变量程序中变量的使用范围不同:作用域(scope)就是变量的有效范围。变量的作用域取决于变量的访问性。(1)局部变量。函数内部的变量称为“局部变量”(localvariable),其作用域仅限于函数内部,离开该函数后就是无效的,再使用系统就会报错。主函数中定义的变量也只能在主函数中使用,不能在其他函数中使用。允许在不同的函数中使用相同的变量名,它们代表不同变量,分配不同的存储单元,互不相干,不会发生混淆。形参变量:在函数体内定义的变量都是局部变量。实参给形参传值的过程也就是给局部变量赋值的过程。(2)全局变量在所有函数外部定义的变量称为“全局变量”(globalvariable),它的作用域默认是整个程序,也就是所有的源文件,包括.c文件和.h文件。它的作用域是从声明时刻开始到程序结束。全局变量定义必须在所有函数之外。全局变量可加强函数模块之间的数据联系,但是函数又依赖这些变量,降低函数的独立性。在同一个源文件中,允许全局变量和局部变量同名,在局部变量作用域内,同名的全局变量不起作用。示例1,全局变量与局部变量的应用。#include"stdio.h"intsum1=0; //全局变量voidaddNumbers(intnum1,intnum2){intsum=0; //局部变量sum=sum+num1+num2;sum1=sum1+num1+num2;printf("\n两数之和子函数sum=的值是%d\n",sum);printf("\n两数之和子函数sum1=的值是%d\n",sum1);}voidmain(){intsum=0; //局部变量intnum1,num2; //局部变量printf("\n请输入两个数;");scanf("%d%d",&num1,&num2);addNumbers(num1,num2);addNumbers(num1,num2);printf("\n两数之和主函数sum=的值是%d\n",sum);}示例1的运行结果如图7-7所示。图7-7示例1的运行结果通过上述示例发现,定义了全局变量的sum1的值第二次值为20,局部变量的图7-7示例1的运行结果7.3.3典型案例典型案例1:从键盘上输入某客车集团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的运行结果如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的运行结果如图7-9所示。 图7-8典型案例1的运行结果 图7-9典型案例2的运行结果7.3.4任务分析与实践#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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论