《汽车计算机基础 第2版》全套课件 1- 绪论、C语言程序设计入门 -12- 利用CAN实现多机通信_第1页
《汽车计算机基础 第2版》全套课件 1- 绪论、C语言程序设计入门 -12- 利用CAN实现多机通信_第2页
《汽车计算机基础 第2版》全套课件 1- 绪论、C语言程序设计入门 -12- 利用CAN实现多机通信_第3页
《汽车计算机基础 第2版》全套课件 1- 绪论、C语言程序设计入门 -12- 利用CAN实现多机通信_第4页
《汽车计算机基础 第2版》全套课件 1- 绪论、C语言程序设计入门 -12- 利用CAN实现多机通信_第5页
已阅读5页,还剩245页未读 继续免费阅读

下载本文档

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

文档简介

本书结合汽车技术发展和汽车类专业特点,按照“由简到难、循序渐进”的原则,共设置了“绪论”“汽车程序设计基础”“汽车嵌入式技术基础”三部分内容。通过本书的学习,可以从整体上加深理解汽车电子控制系统的组成和工作原理,对后续的汽车电子控制技术类课程和智能网联汽车技术类课程学习奠定良好的汽车计算机基础。

本书特色:任务驱动,理实一体,学以致用。内容组织由简到难、循序渐进,灵活采用对比法、类比法、启发法、实验法等多种教学方法,有效降低教学难度和学习难度。

本书可作为高职院校汽车类专业的汽车计算机基础教材,也可供从事相关技术的工程人员参考。绪论

目前,汽车技术正朝着电动化、智能化、网联化、共享化、低碳化的“五化”方向发展,为汽车工业的发展带来了巨大的挑战和机遇。其中,推动汽车“五化”发展的关键技术是电子控制技术和计算机技术。目前,电子控制技术和计算机技术已广泛用于汽车的各个系统。

目前,汽车已是集机械、电工电子、控制、计算机、人工智能等多学科先进技术于一体的智能交通工具。因此作为汽车专业技术人员,除了需要具备一定的汽车机械基础和汽车电工电子基础,还需要掌握一定的汽车计算机基础知识和技能。

智能网联汽车是指搭载先进的车载传感器、控制器、执行器等装置,并融合现代通信与网络技术,实现车与X(人、车、路、云端等)智能信息交换、共享,具备复杂环境感知、智能决策、协同控制等功能,可实现“安全、高效、舒适、节能”行驶,并最终可实现替代人来操作的新一代汽车。绪论

20世纪70年代微处理器的出现,使计算机技术得到了快速的发展。以微处理器为核心的微型计算机在运算速度、存储容量等方面不断得到提升,并通过联网实现了硬件资源和软件资源的共享。微型计算机具有良好的通用性,所以又称通用计算机。测控领域的计算机系统是嵌入到应用系统中,以计算机技术为基础,软、硬件可裁剪,满足应用系统对功能、成本、体积、可靠性、功耗等严格要求的专用计算机系统,即嵌入式计算机系统,简称嵌入式系统(EmbeddedSystem)。通俗地说,除了通用计算机(如台式计算机和笔记本计算机)外,所有包含CPU的系统都是嵌入式系统。通用计算机和嵌入式计算机,是计算机技术在发展过程中形成的两大分支。绪论

汽车电子控制系统是典型的嵌入式计算机系统。一个完整的汽车电子控制系统主要由传感器、电子控制单元(ElectronicControlUnit,ECU)、执行器和网络接口

4部分组成,其中ECU又称为“汽车电脑”,其核心是微控制器(单片机)。绪论

本课程主要学习“汽车程序设计基础”和“汽车嵌入式技术基础”两部分内容。

通过本课程的学习,大家可以提高计算机技术在汽车领域中的应用能力,从整体上加深理解汽车电子控制系统的组成和工作原理,为后续的汽车电子控制技术类课程和智能网联汽车技术类课程学习奠定良好的计算机基础。第1单元:C语言程序设计入门第2单元:利用三种结构程序解决实际问题第3单元:利用数组处理同类型的批量数据第4单元:利用函数实现模块化程序设计第5单元:灵活使用指针处理问题第6单元:利用结构体类型解决实际问题汽车程序设计基础

第1单元C语言程序设计入门【单元导读】

产生于20世纪70年代的C语言是国际上广泛流行的计算机高级编程语言。

C语言既是通用计算机软件设计的基础语言,也是当前嵌入式软件设计的主流语言。读者通过本书的学习,可以奠定C语言的编程基础,同时也可以掌握汽车嵌入式软件设计方法。

单元学习目标:

(1)通过上机练习,掌握VC++2010软件开发C程序的方法和步骤。

(2)熟悉C语言程序的特点。

(3)掌握C语言的基本数据类型及其表现形式。

(4)掌握C语言的基本运算符及其表达式的应用方法。

(5)能够利用基本的数据类型和运算符解决简单的问题。C语言程序设计一般要经过4个基本步骤(VC++2010开发环境的使用方法和步骤请参照教材和微课视频):(1)编辑源程序(.c文件或

.h文件);(2)对源程序进行编译,生成二进制目标文件(.obj文件);(3)连接若干个源文件和库文件对应的多个目标文件,生成可执行文件(.exe文件);(4)运行程序。1.1.1VC++2010开发环境的使用方法和步骤任务1.1使用VC++2010软件开发简单的C程序1.1.2初识简单的C程序【例1.1】在PC屏幕上显示一串字符。/*程序功能:在PC屏幕上显示一串字符*/#include

<stdio.h>

//(1)预处理命令:包含输入输出头文件intmain(void)

//(2)主函数{

printf("这是我写的第1个C程序\n");

//(3)调用printf函数,原样输出一串字符return0;

//(4)如程序正常结束,返回函数值0}可省略不写【同步练习1-1】分行输出社会主义核心价值观。任务1.1使用VC++2010软件开发简单的C程序任务1.2掌握数据的基本类型及其表现形式

数据又有常量与变量两种表现形式,例如整型数据有整型常量和整型变量。1.2.1常量和变量1、常量任务1.2掌握数据的基本类型及其表现形式

在程序执行过程中,其值不发生改变的量称为常量。根据书写方式,常量可分为直接常量和符号常量。(1)直接常量:如4、23;1.23;'a'、'b';''CHINA''等(2)符号常量:用#define指令,指定一个标识符代表一个常量。

例如,#definePI3.1415926//定义符号常量PI(代表常量3.1415926)

关于#define指令的使用方法,将在任务2.4中详细介绍。1.2.1常量和变量1、常量任务1.2掌握数据的基本类型及其表现形式

用户定义的标识符不能与系统提供的关键字(参见附录A)同名。如int、void等都不能作为用户标识符。另外,标识符区分大小写,如Sum和sum是两个不同的标识符。说明:

标识符是用来标识变量名、符号常量名、函数名、数组名、类型名、宏名、文件名的有效字符序列。C语言的标识符只能由字母、数字、下画线3种字符组成,且第一个字符必须是字母或下画线。

在程序执行过程中,其值可以改变的量称为变量。变量必须“先定义,后使用”。定义变量后,编译系统为每个变量名分配对应的内存地址,即一个变量名对应一个存储单元。1.2.1常量和变量2、变量任务1.2掌握数据的基本类型及其表现形式

1.2.2整型数据1、整型常量任务1.2掌握数据的基本类型及其表现形式

(3)十六进制整数:以0x开头的数。如0x123表示十六进制数123,对应十进制291。在C语言中,整型常量(整型常数)有3种表示形式:(1)十进制整数:如123、-456、7。(2)八进制整数:以0开头的数。如0123表示八进制数123,对应十进制83。1.2.2整型数据2、整型变量任务1.2掌握数据的基本类型及其表现形式

归纳起来,有10种整型变量,在VC++系统中对应的数值范围如下:(1)整型变量的分类数值范围是怎样计算出来的?(2)整型变量在内存中的存储形式(以单字节整型数据为例)1.2.2整型数据2、整型变量任务1.2掌握数据的基本类型及其表现形式

1.2.2整型数据2、整型变量任务1.2掌握数据的基本类型及其表现形式

(3)定义整型变量的方法1)定义一个变量的格式:类型标识符变量名;

例如:inti;//定义有符号基本整型变量i

unsignedintj;//定义无符号基本整型变量j2)同时定义多个同类型变量的格式:类型标识符

变量名1,变量名2,变量名3,…;

例如:inti,j,k;//同时定义三个基本整型变量i、j、k

定义变量后,系统将根据变量的类型给变量分配对应大小的内存空间,用于存储该变量。例如:

shortint

i;//定义短整型变量i

i=10;//给变量i赋值1.2.2整型数据2、整型变量任务1.2掌握数据的基本类型及其表现形式

【例1.2】整型变量的定义、赋值和输出。#include<stdio.h>//(1)预处理命令:包含输入输出头文件intmain(void)

//(2)主函数{

inti;

//(3)定义变量

i=1234;

//(4)给变量赋值

printf("这是我写的第2个C程序\n");

//(5)原样输出一串字符

printf("i=%d\n",i);//(6)输出变量的值}格式输出函数printf的用法调用形式:printf(格式控制字符串,输出列表)作用:向显示器输出若干个任意类型的数据。②原样输出的字符,在显示中起提示作用。(2)输出列表:是需要输出的一些数据,可以是常量、变量或表达式。

多个数据之间要用逗号隔开。

括号内包含两部分:(1)格式控制字符串:由双撇号括起来的一个字符串,它包含两种信息。

①由%开头的格式符,用于指定数据的输出格式。

%d:以十进制形式输出带符号整数;

%%:输出%%x:以十六进制形式输出无符号整数;

%c:输出单个字符;

%s:输出字符串;%f:以小数形式输出实数(默认输出6位小数);%e:以指数形式输出实数;%u:以十进制形式输出无符号整数;

使用printf函数时,要求格式控制字符串中必须含有与输出项一一对应的格式符,并且类型要匹配。printf函数也可以没有输出项。printf("这是我写的第2个C程序\n");

//原样输出一串字符,并换行printf("i=%d\n",i);//原样输出i=,然后以%d形式输出变量i的值,并换行【同步练习1-2】判断题第1~7题、选择题第1~4题。1.2.3字符型数据1、字符常量任务1.2掌握数据的基本类型及其表现形式

用一对单撇号括起来的一个字符,称为字符常量,例如:'A','6','+'等。

C语言还有一种以

\开头的字符序列,称为转义字符(将\后面的字符转换为另外的含义)。最常用的转义字符:

'\n'表示换行,将当前位置移到下一行开头;

'\t'表示横向跳到下一Tab位置;

'\r'表示回车,将当前位置移到本行开头(不换行)

字符变量用来存放字符,并且只能存放1个字符。其类型标识符是char。

例如:charc1,c2;//定义字符变量c1、c2c1='a';c2='b';//给变量c1赋值'a',变量c2赋值'b'2、字符变量1.2.3

字符型数据任务1.2掌握数据的基本类型及其表现形式

3、字符型数据在内存中的存储形式及使用方法

一个字符变量在内存中占一个字节。字符型数据在内存中存储的是该字符对应的ASCII码(常用字符的ASCII码值见教材脚注)。

字符型数据的存储形式与单字节整型数据相同。因此,字符型可以当作单字节整型。

#include<stdio.h>intmain(void){

charc1;

//定义字符变量

c1=97;

//给变量c1赋整数(将ASCII码值97赋给变量c1)

printf("%c\n",c1);//以字符形式输出变量c1的值(ASCII码值对应的字符)

printf("%d\n",c1);//以整数形式输出变量c1的值(字符对应的ASCII码)}1.2.3字符型数据【例1.3】向字符变量赋整数。任务1.2掌握数据的基本类型及其表现形式

#include<stdio.h>intmain(void){

charc1,c2;//定义字符变量

c1='a';c2='b';

//给字符变量赋字符常量

c1=c1-32;c2=c2-32;

//将字符变量对应的ASCII码值更新

printf("%c,%c\n",c1,c2);

//以字符形式输出变量c1和c2的值

}1.2.3字符型数据【例1.4】输出给定小写字母对应的大写字母。任务1.2掌握数据的基本类型及其表现形式

字符串常量是由一对双撇号括起来的字符序列。例如:"CHINA"

,"Cprogram"

,"a","$12.5"

字符常量和字符串常量的区别:因此字符串常量"CHINA"在内存中占用6个字节。4、字符串常量

1.2.3字符型数据任务1.2掌握数据的基本类型及其表现形式

【同步练习1-2】判断题第8题、选择题第5~8题。1.2.4实型数据1、实型常量

(2)指数形式。如1.23e3或1.23E3都代表1.23×103。要注意字母e(或E)之前必须要有数字,且e后面的指数必须为整数,如e2、4e2.5、.e3、e都不是合法的指数形式。

实型常量也称实数,在C语言中,实数有两种表示形式:

(1)十进制小数形式。它由数字和小数点组成(注意,必须要有小数点)。如:0.123、123.、123.0、0.0。2、实型变量

根据数据的数值范围和精度,实型变量的类型主要有单精度(float)型和双精度(double)型。需要注意:实型数据在计算机内存中的存储精度有限,不可能得到完全精确的数值。任务1.2掌握数据的基本类型及其表现形式

#include<stdio.h>intmain(void){

floatx;//定义实型变量xx=12.3;//将实型常数12.3赋给变量xprintf("%f\n",x);//以小数形式输出变量x的数值printf("%e\n",x);//以指数形式输出变量x的数值}1.2.4实型数据【例1.5】实型变量的定义、赋值和输出。任务1.2掌握数据的基本类型及其表现形式

【同步练习1-2】判断题第9~12题、选择题第9~10题。1.2.5变量的初始化任务1.2掌握数据的基本类型及其表现形式

C语言允许在定义变量的同时,对变量赋初值,即变量的初始化。例如:

inta=3;

//定义整型变量a,并赋初值3

当一次定义同类型的多个变量时,可以给全部变量或部分变量赋初值。inta,b,c=5;

//定义a、b、c三个整型变量,只给c赋初值5注意,对3个变量赋相同的初值3时,不能写成:inta=b=c=3;inta=1,b=2,c=3;

//定义a、b、c三个整型变量,并赋不同的初值inta=3,b=3,c=3;

//定义a、b、c三个整型变量,并赋相同的初值3charc='a';

//定义字符变量c,并赋初值'a'floatb=1.23;//定义实型变量b,并赋初值1.231.3.1算术运算符及其表达式1.3.2强制类型转换运算符及其表达式1.3.3赋值运算符及其表达式1.3.4关系运算符及其表达式1.3.5逻辑运算符及其表达式1.3.6位运算符及其表达式任务1.3

利用基本的运算符解决简单问题

附录B列出了C语言的各种运算符。1.3.1算术运算符及其表达式1、基本的算术运算符(2)-

减法运算符,或负值运算符,如7-2、-4

(1)+

加法运算符,或正值运算符,如2+3、+5

(4)/

除法运算符,如5/2(结果为2)、5.0/2(结果为2.5)(3)*乘法运算符,如2*3

(5)%模运算符,或称求余运算符,%两侧均应为整型数据,如5%2的值为1

说明:

任务1.3

利用基本的运算符解决简单问题

【例1.6】将两位十进制整数的十位数和个位数分离。1.3.1算术运算符及其表达式1、基本的算术运算符任务1.3

利用基本的运算符解决简单问题

#include<stdio.h>intmain(void){

inta=23,b,

c;

//定义a、b、c三个变量

b

=

a%10;

//求变量a的十位数

c

=

a/10;

//求变量a的个位数(/10相当于右移1位)printf("a=%d\n",

a);

//输出变量a的值printf("十位=%d\n",

c);

//输出变量a对应的十位数printf("个位=%d\n",

b);

//输出变量a对应的个位数

}1.3.1算术运算符及其表达式2、自增、自减运算符任务1.3

利用基本的运算符解决简单问题

自增运算符++:使变量的值自增1,相当于i=i+1。自减运算符--:使变量的值自减1,相当于i=i-1。

i++

表达式先用i的值,然后对i的值加1

(先用后加)

++i

先对i的值加1,然后表达式用i加1的值(先加后用)--i

先对i的值减1,然后表达式用i减1的值(先减后用)

i--

表达式先用i的值,然后对i的值减1

(先用后减)有以下4种形式的表达式:任务1.3

利用基本的运算符解决简单问题

可见,由自增(自减)运算符构成不同形式的表达式时,对变量而言,自增1(自减1)都具有相同的效果,但对表达式而言却有着不同的值。1.3.1算术运算符及其表达式2、自增、自减运算符【例1.7】自增、自减运算符的应用。#include<stdio.h>intmain(void){

int

i=3,j=3,k=3,x=3;

printf("%d\t",i++);printf("i=%d\n",i);

printf("%d\t",++j);printf("j=%d\n",j);

printf("%d\t",k--);printf("k=%d\n",k);

printf("%d\t",--x);printf("x=%d\n",x);}说明:

(1)自增、自减运算符只能用于变量,不能用于常量或表达式。如5++或(a+b)++都是不合法的。(2)自增、自减运算符常用在循环语句中,使循环变量自动加1、减1,这将在后续单元中学习。3、算术表达式和运算符的优先级与结合性1.3.1算术运算符及其表达式任务1.3

利用基本的运算符解决简单问题

算术表达式:用算术运算符和括号将运算对象(常量、变量或表达式)连接起来的、符合C语法规则的式子。例如:a+b*c-5/2+'a'。C语言规定了运算符的优先级。在表达式求值时,先按运算符的优先级高低次序执行,例如:x-y*z相当于x-(y*z)。

算术运算符的结合方向为“自左向右(左结合性)”,即先左后右。因此a+b-c相当于

(a+b)-c。附录B

给出了C语言运算符的优先级和结合性,在分析表达式时查询参考。

如果在一个运算对象两侧的运算符的优先级相同,则按照规定的“结合方向(结合性)”处理。

问题:a+b-c,b先与a相加,还是先与c相减?1.3.2强制类型转换运算符及其表达式强制类型转换表达式的一般形式:(类型标识符)(表达式)任务1.3

利用基本的运算符解决简单问题

例如:

(int)i

将i转换为整型(int)x+y

将x转换成整型后,再与y相加(“(int)”的优先级高于“+”)

(float)(x+y)

将x+y的结果转换为float型#include<stdio.h>intmain(void){

inti;//定义整型变量i

floatx=2.4F;//定义实型变量x,并赋初值

i=

(int)x;//将实型变量x强制转换为int型

printf("x=%f,i=%d\n",x,i);

//输出变量

x

i的值}【例1.8】将实型数据强制转换为整型。1.3.2强制类型转换运算符及其表达式强制类型转换表达式的一般形式:(类型标识符)(表达式)任务1.3

利用基本的运算符解决简单问题

【思考与总结】数值类型转换有几种方式?

1)系统自动进行的类型转换。如2+3.5,系统自动将整数2转换为实型。

2)强制类型转换。若i为float型,则i%3不合法,必须用(int)i%3。1、简单赋值运算符“=”及其表达式1.3.3赋值运算符及其表达式任务1.3

利用基本的运算符解决简单问题

简单赋值表达式的形式:变量=

表达式

赋值运算符的优先级仅高于逗号运算符,而低于其他运算符。因此赋值表达式a=3*5等价于a=(3*5),i=a+b等价于i=(a+b)。

一个表达式应该有一个值,例如赋值表达式“

a=5”的值是5。执行运算后,变量a的值也是5。2、复合的赋值运算符及其表达式1.3.3赋值运算符及其表达式任务1.3

利用基本的运算符解决简单问题

在简单赋值运算符“=”之前加上其他运算符,可构成复合的赋值运算符。a*=3等价于a=a*3a-=3等价于a=a-3a*=b+2等价于a=a*(b+2)a+=3等价于a=a+3a/=3等价于a=a/3a%=3等价于a=a%3①a*=b+2

②a*=

(b+2)

(

)

(对表达式

b+2

外加括号,因为“+”的优先级高于“*=”)③

=

(在“=”左侧补上变量名a)

(将“a*”移到“=”右侧)

aa*(b+2)

2、复合的赋值运算符及其表达式1.3.3赋值运算符及其表达式任务1.3

利用基本的运算符解决简单问题

【同步练习1-3】选择题第1~7题。

注意:在赋值运算中,需要根据数据的类型和数值的范围为变量指定合适的类型,必要时还需要借助强制类型转换运算符,以防出错。

1.3.4关系运算符及其表达式任务1.3

利用基本的运算符解决简单问题

1、关系运算符及其优先级次序

优先级相同(高)优先级相同(低)③>

大于①<

小于②<=

小于或等于⑥!=

不等于④>=

大于或等于⑤==

等于

关系运算符的优先级低于算术运算符,高于赋值运算符。a=b>c等价于

a=(b>c)例如:

c>a+b等价于

c>(a+b)a==b<c等价于

a==(b<c)a>b==c等价于

(a>b)==c2、关系表达式1.3.4关系运算符及其表达式任务1.3

利用基本的运算符解决简单问题

用关系运算符将两个表达式连接起来的式子,称为关系表达式。a+b>c+d(a=3)>(b=5)'a'<'b'a==3例如:a>ba!=3

关系表达式的值是一个逻辑值:“真”或“假”。例如关系表达式“5==3”的值为“假”,“5>=0”的值为“真”。

关系运算结果,以“1”代表“真”,以“0”代表“假”。关系表达式逻辑值(真、假)关系表达式的值(1、0)a>ba>b+ca!=b+ca>b>c【课堂练习】若a=3,b=2,c=1,则:真假假假10001.3.5逻辑运算符及其表达式任务1.3

利用基本的运算符解决简单问题

假1、逻辑运算符

③!逻辑非①&&逻辑与②||逻辑或

逻辑运算的真值表aba&&ba||b!a真真真假假真假假真真假真假真假假真1.3.5逻辑运算符及其表达式任务1.3

利用基本的运算符解决简单问题

2、逻辑表达式的值

C语言规定,参与逻辑运算的操作数以非0代表“真”,以0代表“假”。逻辑表达式的值,即逻辑运算结果,以数值1代表“真”,以0代表“假”。例如:(1)若a=3,则!a的值:(4)'a'&&'b'的值:(2)若a=3,b=4,则a&&b的值:(3)3&&0||-4的值:0111在逻辑表达式的求解过程中,有时并非所有的运算都被执行。

例如:

(1)a&&b:只有当a为真(非0)时,才需要判断b的值。只要a为假,就不必判断b的值,此时整个表达式已确定为假。(2)a||b:只要a为真(非0),就不必判断b的值。只有a为假,才判断b的值。【课堂练习】

1.3.5逻辑运算符及其表达式

分别写出下列数学表达式对应的C语言表达式:

(1)80≤i<89

(2)i<0或i>100

(3)i≠0i>=80&&i<89i<0||

i>=100i!=0任务1.3

利用基本的运算符解决简单问题

说明:

a>b&&c>d

等价于

(a>b)

&&

(c>d)

a+b>c

&&

x+y<d

等价于

(a+b

>c)&&

(x+y<d)

在书写含有多种运算符的复杂表达式时,如果不确定运算符的优先级,则可以采用加括号的方式提高代码的可读性。1.3.6位运算符及其表达式任务1.3

利用基本的运算符解决简单问题

位运算符含

义&按位与|按位或^按位异或~按位取反<<左移>>右移说明:1)位运算符中除“~”以外,均为二目运算符,即要求两侧各有一个运算量。

2)运算量只能是整型或字符型数据,不能是实型数据。

在嵌入式软件设计中,经常用到位运算符:对二进制位进行运算。1.3.6位运算符及其表达式任务1.3

利用基本的运算符解决简单问题

例如,0x23与0x45按位与:00100011(0x23)

&)01000101(0x45)

特殊用途:“与0清零、与1保留”——可对数据的某些位清零,某些位保留不变。0&0=0,0&1=0,1&0=0,1&1=100000001(0x01)1、“按位与”运算符(&)

例如,将0x23的高4位清零,低4位保留不变。00100011

(0x23)

&)00001111(0x0F)0000

0011

(0x03)1.3.6位运算符及其表达式任务1.3

利用基本的运算符解决简单问题

例如,0x23与0x45按位或:00100011(0x23)

|)01000101(0x45)

特殊用途:“或1置1、或0保留”——可对数据的某些位置1,某些位保留不变。0|0=0,0|1=1,1|0=1,1|1=101011101(0x67)2、“按位或”运算符(|)例如,将0x23的高4位置1,低4位保留不变。00100011

(0x23)

|)

11110000(0xF0)1111

0011

(0xF3)1.3.6位运算符及其表达式任务1.3

利用基本的运算符解决简单问题

例如,0x23与0x45按位异或:00100011(0x23)

^)01000101(0x45)

特殊用途:“异或1取反(0变1,1变0),异或0保留”——可对数据的某些位取反,某些位保留不变。3、“按位异或”运算符(^)01011100(0x66)两者相异为1,相同为0。0^0=0,0^1=1,1^0=1,1^1=0

例如,将0x23的高4位取反,低4位保留不变。00100011

(0x23)

^)11110000(0xF0)1101

0011

(0xD3)1.3.6位运算符及其表达式任务1.3

利用基本的运算符解决简单问题

4、“按位取反”运算符(~)例如,0x55按位取反:01010101(0x55)~)↓

10010110(0xaa)对一个二进制数按位取反:0变1,1变0。

1.3.6位运算符及其表达式任务1.3

利用基本的运算符解决简单问题

5、“左移”运算符(<<)

例如:

a<<3,表示将a的二进制数左移3位,高位溢出后丢弃,低位补0。

用来将一个数的各二进制位全部左移若干位。D0D3D2D1D40001.3.6位运算符及其表达式任务1.3

利用基本的运算符解决简单问题

6、“右移”运算符(>>)【同步练习1-3】选择题第9~10题。

例如:

a>>3,表示将a的二进制数右移3位,低位溢出后丢弃,对于无符号数,高位补0。

用来将一个数的各二进制位全部右移若干位。D3D6D5D4D7000【例1.9】利用位运算符实现对8位寄存器R和对16位寄存器R'的二进制位操作

。1.3.6位运算符及其表达式任务1.3

利用基本的运算符解决简单问题

本书结合汽车技术发展和汽车类专业特点,按照“由简到难、循序渐进”的原则,共设置了“绪论”“汽车程序设计基础”“汽车嵌入式技术基础”三部分内容。通过本书的学习,可以从整体上加深理解汽车电子控制系统的组成和工作原理,对后续的汽车电子控制技术类课程和智能网联汽车技术类课程学习奠定良好的汽车计算机基础。

本书特色:任务驱动,理实一体,学以致用。内容组织由简到难、循序渐进,灵活采用对比法、类比法、启发法、实验法等多种教学方法,有效降低教学难度和学习难度。

本书可作为高职院校汽车类专业的汽车计算机基础教材,也可供从事相关技术的工程人员参考。第1单元:C语言程序设计入门第2单元:利用三种结构程序解决实际问题第3单元:利用数组处理同类型的批量数据第4单元:利用函数实现模块化程序设计第5单元:灵活使用指针处理问题第6单元:利用结构体类型解决实际问题汽车程序设计基础

第2单元利用三种结构程序解决实际问题【单元导读】

在现实生活中,经常遇到顺序执行、选择执行和循环执行的问题,这些问题可通过C语言程序来解决。

单元学习目标:(1)掌握顺序结构程序设计方法。(2)掌握选择结构程序设计方法。(3)掌握循环结构程序设计方法。(4)掌握预处理命令的应用方法。(5)能够利用三种结构程序解决实际问题。2.1.1数据输入输出函数任务2.1利用顺序结构程序解决实际问题1、数据输入输出的概念及在C语言中的实现

(1)从计算机内存向输出设备传送数据称为输出,从输入设备向计算机内存传送数据称为输入。

(2)C语言本身不提供输入输出语句,而用户可以通过调用C标准函数库中的输入输出函数,实现数据的输入和输出。

(3)使用标准输入输出库函数时,要用预处理命令#include将其对应的头文件“stdio.h”包含到源文件中:

#include<stdio.h>或

#include"stdio.h"2.1.1数据输入输出函数任务2.1利用顺序结构程序解决实际问题2、格式输出函数——printf函数

●向显示器输出若干个任意类型的数据。一般形式:printf(格式控制字符串,输出列表)在1.2.2节中曾学过:按照格式控制字符串中以%开头的格式符指定的格式,将输出列表中对应的数据输出。也可以没有输出列表项。printf("这是我写的第2个C程序\n");

//原样输出一串字符,并换行printf("i=%d\n",i);//原样输出i=,然后以%d形式输出变量i的值,并换行printf("%d,%c\n",

i,c);//分别以%d形式和%c形式输出变量i和变量c的值,并换行2.1.1数据输入输出函数任务2.1利用顺序结构程序解决实际问题#include<stdio.h>

//包含输入输出库函数头文件intmain(void){ inta=5;floatb=1.2;charc='a';printf("a=%d,b=%f\n",a,b);//依次按指定的格式将多个数据输出printf("%c\n",c);//输出字母aprintf("%d\n",c);//输出字母a的ASCII码值printf("%s\n","CHINA");//输出字符串CHINAprintf("50%%\n");//输出50%}【例2.1】printf函数使用:格式化输出数据。2.1.1数据输入输出函数任务2.1利用顺序结构程序解决实际问题3、格式输入函数——scanf函数

调用形式:scanf(格式控制字符串,地址列表)

(2)地址列表:由若干个地址组成的列表。

变量的地址:地址运算符“&”后跟变量名。

多个地址之间要用逗号隔开。

(1)格式控制字符串的作用与printf函数类似。

●按用户指定的格式从键盘把数据输入到指定的变量地址中。%d:输入有符号的十进制整数%f:以小数形式输入单精度实数2.1.1数据输入输出函数任务2.1利用顺序结构程序解决实际问题#include<stdio.h>

//包含输入输出库函数头文件intmain(void){

inti;

floatj;printf("请输入一个整数和一个实数:\n");//提示输入两个数据scanf("%d%f",&i,&j);//输入两个数据分别赋给两个变量printf("%d,%f\n",i,j);//将两个变量的数值输出}

说明:用scanf函数一次输入多个数值时,在两个数据之间可用空格或换行符或Tab符作分隔。【例2.2】用scanf函数输入多个数值数据。①用空格作分隔

②用换行符作分隔3、格式输入函数——scanf函数③用Tab符作分隔2.1.2顺序结构程序设计应用任务2.1利用顺序结构程序解决实际问题【例2.3】将输入的两个整数交换,然后再输出这两个整数。ABABABAB

两名同学互换位置,如何实现?

需要借助一个临时变量实现两数的交换。#include<stdio.h>//包含头文件intmain(void){

intx,y,t;//定义三个变量

printf("请输入两个整数(用空格隔开):");scanf("%d%d",&x,&y);//输入两个数据给x和y

t=x;x=y;y=t;//将数x和y交换

printf("将输入的两个整数交换之后:");printf("%d%d\n",x,y);//输出x和y两个数}【同步练习2-1】知识巩固与运用。任务2.2利用选择结构程序解决实际问题

选择结构程序:根据不同的条件,执行不同的语句(根据不同的条件选择不同的道路)。两种选择语句:if语句和switch语句。if语句有3种应用形式

1、if语句的基本形式if(表达式)语句#include<stdio.h>intmain(void){

inta,b,t;printf("请输入两个整数(用空格隔开):");scanf("%d%d",&a,&b);if(a<b){

t=a;a=b;b=t; }printf("由大到小:%d,%d\n",a,b);}2.2.1if语句及应用【例2.4】输入两个整数,要求按由大到小的顺序输出。任务2.2利用选择结构程序解决实际问题2.2.1if语句及应用#include<stdio.h>intmain(void){

intscore;

printf("请输入成绩:");

scanf("%d",&score);

if(score>=60)printf("恭喜,通过!\n");}【例2.5】用if语句判断考试结果。要求:当考试成绩不低于60分时,输出“恭喜,通过”。1、if语句的基本形式if(表达式)语句任务2.2利用选择结构程序解决实际问题#include<stdio.h>intmain(void){

intscore;

printf("请输入成绩:");

scanf("%d",&score);

if(score>=60)printf("恭喜,通过!\n");

elseprintf("未通过,继续努力!\n");}2.2.1if语句及应用if(表达式)语句1else语句22、if…else语句的基本形式【例2.6】用if…else语句判断考试结果。要求:当考试成绩不低于60分时,输出“恭喜,通过!”。

当考试成绩低于60分时,输出“未通过,继续努力!”2.2.1if语句及应用任务2.2利用选择结构程序解决实际问题说明:注意if与else的配对关系。else总是与它上面最近的未配对的if配对。3、if…else语句的嵌套形式——用于解决多分支问题任务2.2利用选择结构程序解决实际问题2.2.1if语句及应用

虚线左侧的嵌套结构,还可写成虚线右侧的更加紧凑的形式。3、if…else语句的嵌套形式——用于解决多分支问题任务2.2利用选择结构程序解决实际问题2.2.1if语句及应用3、if…else语句的嵌套形式——用于解决多分支问题【例2.7】根据符号函数,编程实现输入一个x值,输出y值。#include<stdio.h>intmain(void){

intx,y;

printf("请输入x的值:");

scanf("%d",&x);

if(x<0)y=-1;

else

if(x==0)y=0;

elsey=1;

printf("x=%d,y=%d\n",x,y);}【思考与实践】若改用if基本形式,如何实现?执行效率有区别吗?【例2.8】根据输入的课程成绩(整数),判断并输出对应的等级。

输入成绩与输出结果:90~100,优秀;80~89,良好;70~79,中等;60~69,及格;0~59,不及格;其他值,输入有误!2.2.1if语句及应用任务2.2利用选择结构程序解决实际问题#include

<stdio.h>intmain(void){

intscore;printf("请输入课程成绩(整数):");scanf("%d",

&score);

if(score>100

||score<0)printf("输入有误!\n");

elseif(score>=90)

printf("优秀!\n");

elseif(score>=80)

printf("良好!\n");

elseif(score>=70)

printf("中等!\n");

elseif(score>=60)printf("及格!\n");

elseprintf("不及格!\n");}【思考】若输入85,只输出“良好”,为什么不会输出“中等”和“及格”?【同步练习2-2】第2~4题。2.2.2条件运算符(三目运算符?:)和条件表达式任务2.2利用选择结构程序解决实际问题条件表达式的一般形式:

表达式1?表达式2:

表达式3

条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值运算符。因此,max=(a>b)?a:b等价于max=a>b?a:b说明:可简写为:max=(a>b)?a:b;

if(a>b)max=a;

elsemax=b;任务2.2利用选择结构程序解决实际问题#include<stdio.h>intmain(void){

int

a,b,max;

printf("请输入两个整数:");

scanf("%d%d",&a,&b);

max=a>b?a:b;

printf("max=%d\n",max);}【例2.9】利用条件运算符求两数的最大值。2.2.2条件运算符(三目运算符?:)和条件表达式【同步练习2-2】第1题。任务2.2利用选择结构程序解决实际问题2.2.3switch语句及应用

处理多分支选择问题时,可采用if…else嵌套形式,还可采用switch语句。

当switch括号内“表达式”的值与某个case后面“常量表达式”的值相等时,即执行该行对应的语句,后面的break语句可用来终止switch语句的执行。若switch括号内“表达式”的值与所有case后面的“常量表达式”均不相等时,则执行default后面的语句。switch语句的一般形式: 值的类型应为整型或字符型

不能是变量,必须是常量表达式,且必须互不相同

多个case可以共用一组执行语句。

每一组允许有多个语句,可以不用{}括起来。带有[]的部分为可选部分2.2.3switch语句及应用任务2.2利用选择结构程序解决实际问题【例2.10】用switch语句实现:根据输入的课程成绩(整数),判断并输出对应的等级。

输入成绩与输出结果:90~100,优秀80~89,良好70~79,中等60~69,及格0~59,不及格其他值,输入有误!#include<stdio.h>intmain(void){

intscore;

printf("请输入课程成绩(整数):");

scanf("%d",&score);

if(score>=0&&score<=100)

{

switch(score/10)

{

case10:

case9:printf("优秀!\n");

break;

case8:printf("良好!\n");

break;

case7:printf("中等!\n");

break;

case6:printf("及格!\n");

break;

default:printf("不及格!\n");

}

}

else

printf("输入有误!\n");}

实验:将某个break语句去掉,观察运行结果,体会其作用。思考:若将每一个成绩作为switch语句中的

case常量,是否可行?printf("优秀!\n");

break;score)思考:(1)能否用swtich语句解决多分支选择

结构问题的关键是什么?(2)if语句和switch语句有何区别?【同步练习2-2】第5题。任务2.3利用循环结构程序解决实际问题

在许多问题中需要用到循环控制,即重复执行同种性质的任务。例如:在测试例2.8程序时,需要多次单击运行命令;在嵌入式智能设备中,上电后,主函数反复执行一段无限循环程序。C语言中,最基本的有while语句、do…while语句、for语句。while语句的一般形式:while(循环条件表达式)循环体语句2.3.1while循环结构程序设计【例2.11】

用while循环结构程序,实现在同一行依次输出0~9。#include<stdio.h>intmain(void){inti=0;while(i<10){printf("%d",i);i++;}printf("\n");}#include<stdio.h>intmain(void){printf("1");printf("2");printf("3");...printf("8");printf("9");printf("\n");}任务2.3利用循环结构程序解决实际问题while语句的一般形式:while(循环条件表达式)循环体语句2.3.1while循环结构程序设计【例2.12】用while语句实现1+2+3+…+100的和。#include<stdio.h>intmain(void){

inti=1,sum=0;while(i<=100){ sum=sum+i;i++;}printf("sum=%d\n",sum);}【课堂练习】

(1)1+3+5+…+99(2)2+4+6+…+100任务2.3利用循环结构程序解决实际问题while语句的一般形式:while(循环条件表达式)循环体语句2.3.1while循环结构程序设计说明:

循环条件表达式一般是关系表达式或逻辑表达式,只要循环条件表达式的值为真(非0),即可继续执行循环体语句。如嵌入式系统软件的主函数一般用while(1)构成无限循环结构。请读者将例2.8程序的执行语句作为while(1)的循环体语句,运行程序并体会循环结构的作用。任务2.3利用循环结构程序解决实际问题2.3.2do…while循环结构程序设计do…while语句的一般形式:do

循环体语句while(表达式);【例2.13】用do…while语句实现1+2+3+…+100的和。#include<stdio.h>intmain(void){

inti=1,sum=0;

do

{

sum=sum+i;

i++;

}while(i<=100);

printf("sum=%d\n",sum);}do…while循环至少要执行一次循环体语句。2.3.2do…while循环结构程序设计任务2.3利用循环结构程序解决实际问题【例2.14】while和

do…while循环的比较。

经测试,当输入i<3时,两者运行结果相同;但当输入i≥3时,运行结果则不同。

#include<stdio.h>intmain(void){

inti;printf("请输入1个整数:");scanf("%d",

&i);while(i<3){i++;}printf("i=%d\n",i);}#include<stdio.h>intmain(void){

inti;printf("请输入1个整数:");scanf("%d",

&i);do{i++;}while(i<3);printf("i=%d\n",i);}2.3.3for循环结构程序设计任务2.3利用循环结构程序解决实际问题for语句的一般形式:for(表达式1;

表达式2;

表达式3)循环体语句for语句最常用、最容易理解的应用形式:

for(循环变量赋初值;

循环条件;

循环变量变化)循环体语句2.3.3for循环结构程序设计任务2.3利用循环结构程序解决实际问题【例2.15】用for语句实现1+2+3+…+100的和。#include<stdio.h>intmain(void){inti,sum=0;for(i=1;i<=100;i++)sum=sum+i;printf("%d\n",sum);}inti=1,sum=0;for(;i<=100;i++)【课堂练习】(1)1+3+5+…+99(2)2+4+6+…+100inti=1,sum=0;for(;i<=100;){sum=sum+i;i++;}inti,sum;

for(sum=0,i=1;i<=100;i++)2.3.3for循环结构程序设计任务2.3利用循环结构程序解决实际问题(2)for(;;)与while(1)等价,表示无限循环。主函数一般为无限循环结构。嵌入式软件设计中常用的两种for语句形式:(1)for循环体可以是空语句,常用于软件延时。例如:

for(i=0;i<1000;i++);

for(i=1000;i>0;i--);【同步练习2-3】第3题:输出所有的“水仙花数”。2.3.4循环嵌套任务2.3利用循环结构程序解决实际问题一个循环体内又包含另一个完整的循环结构,称为循环嵌套。

#include<stdio.h>intmain(void){

inti,j;//定义

温馨提示

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

评论

0/150

提交评论