C语言程序设计 课件全套 朱琨 机械 第1-9章 C语言语法基础 - 嵌入式技术基础实践方法_第1页
C语言程序设计 课件全套 朱琨 机械 第1-9章 C语言语法基础 - 嵌入式技术基础实践方法_第2页
C语言程序设计 课件全套 朱琨 机械 第1-9章 C语言语法基础 - 嵌入式技术基础实践方法_第3页
C语言程序设计 课件全套 朱琨 机械 第1-9章 C语言语法基础 - 嵌入式技术基础实践方法_第4页
C语言程序设计 课件全套 朱琨 机械 第1-9章 C语言语法基础 - 嵌入式技术基础实践方法_第5页
已阅读5页,还剩294页未读 继续免费阅读

下载本文档

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

文档简介

教学内容: 第1章:C语言语法基础第2章:C程序设计基础第3章:利用数组处理同类型的批量数据第4章:利用函数实现模块化程序设计第5章:灵活使用指针第6章:结构体、共用体、枚举类型及其应用第7章:常用的三种线性数据结构第8章:利用文件进行数据管理第9章:嵌入式技术基础实践方法C语言程序设计第1章C语言语法基础【学习内容】1.1C语言程序的特点1.2数据的基本类型及其表现形式

1.3运算符及表达式【学习目标】1.了解通用计算机和嵌入式计算机的区别;2.熟悉C语言程序的特点;

3.熟练使用VC++2010开发环境;

4.掌握C语言基本的数据类型(整型、字符型、实型),常量和变量;

5.掌握“算术、强制类型转换、赋值、关系、逻辑、位、逗号”7种运算符及其表达式。1.1C语言程序的特点

产生于20世纪70年代的C语言是国际上广泛流行的计算机高级编程语言,其优点:①语法灵活、运算符丰富;②模块化和结构化设计,程序可读性好;③可直接对硬件进行操作,能实现汇编语言的大部分功能;④生成的目标代码质量高,程序执行效率高;⑤程序可移植性好(与汇编语言相比),可用于各种型号的计算机和各种操作系统。

C语言既是通用计算机软件设计的基础语言,也是当前嵌入式软件设计的主流语言。通过本书的学习,可以奠定C语言的编程基础,同时也可以掌握嵌入式软件设计方法。1.1C语言程序的特点1、通用计算机与嵌入式计算机

微型计算机具有很大的通用性,所以又称通用计算机。测控领域的计算机系统是嵌入到应用系统中,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、成本、体积、可靠性、功耗严格要求的专用计算机系统,即嵌入式计算机系统,简称嵌入式系统(EmbeddedSystem)。通俗地说,除了通用计算机(如台式计算机和笔记本计算机)外,所有包含CPU的系统都是嵌入式系统,其中以微控制器(MicroControllerUnit,MCU,国内也称为单片机)为核心的嵌入式系统应用最广泛。MCU的硬件集成度越来越高,使得嵌入式硬件设计难度不断降低,因此嵌入式软件设计在整个嵌入式系统开发中所占的分量越来越大。社会对嵌入式软件设计人才的需求量也越来越大,其就业薪酬高。嵌入式软件设计的主流语言是C语言。C语言程序设计一般要经过4个基本步骤(VC++2010开发环境的使用方法和步骤请扫描教材中的二维码详细学习):

(1)编辑源程序(.c文件或

.h文件);

(2)对源程序进行编译,生成二进制目标文件(.obj文件);

(3)连接若干个源文件和库函数对应的多个目标程序,生成可执行文件(.exe文件);(4)运行程序。2、VC++2010开发环境的使用方法和步骤1.1C语言程序的特点【例1.1】将两个整数求和,并将这两个整数及求和结果输出在PC屏幕上。3、初识简单的C程序1.1C语言程序的特点#include<stdio.h>

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

//(2)主函数{ inta,b,s;

//(3)数据声明:定义3个整型变量a=123;b=456;

//(4)分别对变量a和b进行赋值s=a+b;

//(5)将求和结果赋给变量sprintf("ThisismyfirstCprogram.\n");//(6)原样输出一串字符printf("a=%d,b=%d,sum=%d\n",a,b,s);//(7)以十进制形式输出三个变量的值return0;

//(8)如程序正常结束,返回函数值0}可省略不写格式输出函数printf的用法1.1C语言程序的特点3、初识简单的C程序【例1.2】使用函数将两个整数求和,并将这两个整数及求和结果输出在PC屏幕上。#include<stdio.h>

//(1)预处理命令:包含输入输出头文件intadd(intx,inty);

//(2)函数声明intmain(void)

//(3)主函数{inta,b,s;

//(4)数据声明:定义3个整型变量a=123;b=456;

//(5)分别对变量a和b进行赋值s=add(a,b);

//(6)调用add函数(两个实际参数a、b)printf("ThisismysecondCprogram.\n");//(7)原样输出一串字符printf("a=%d,b=%d,sum=%d\n",a,b,s);//(8)以十进制形式输出三个变量的值}intadd(intx,inty)

//(10)定义add函数(两个形式参数x、y){

intz;

//(11)定义变量

z=x+y;

//(12)将求和结果赋给变量zreturn(z);

//(13)向主调函数求和结果}s=add(a,b);

(main函数)intadd(intx,inty)(add函数){

intz; z=x+y;

return(z);

}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.5中详细介绍。1.2.1常量和变量1、常量1.2数据的基本类型及其表现形式

用户定义的标识符不能与系统提供的关键字(参见附录B)同名。另外,标识符区分大小写,如Sum和sum是两个不同的标识符。说明:标识符是用来标识变量名、符号常量名、函数名、数组名、类型名、宏名、文件名的有效字符序列。C语言的标识符只能由字母、数字、下画线3种字符组成,且第一个字符必须是字母或下画线。

1.2.1常量和变量2、变量1.2数据的基本类型及其表现形式

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

(3)十六进制整数:以0x开头的数。如0x123表示十六进制数123。在C语言中,整型常量(整型常数)有3种表示形式:(1)十进制整数:如123、-456、7。(2)八进制整数:以0开头的数。如0123表示八进制数123。归纳起来,有10种整型变量,在VC++系统中对应的数值范围如下:(1)整型变量的分类1.2.2整型数据2、整型变量1.2数据的基本类型及其表现形式

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

(2)整型变量在内存中的存储形式(以单字节整型数据为例)(3)定义整型变量的方法1.2.2整型数据2、整型变量1.2数据的基本类型及其表现形式

1)定义一个变量的格式:类型标识符变量名;

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

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

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

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

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

shortint

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

i=10;//给变量i赋值练习:【例1.3】整型变量的定义、赋值和输出。1.2.3字符型数据1、字符常量1.2数据的基本类型及其表现形式

练习:【例1.4】输出转义字符。

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

C语言还有一种以

\开头的字符序列,称为转义字符。

请参考附录A,熟悉字符0~9、大写字母A~Z、小写字母a~z对应的ASCII码值。1.2.3字符型数据2、字符变量1.2数据的基本类型及其表现形式

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

例如:charc1,c2;//定义字符变量c1、c2c1='a';c2='b';//给变量c1赋值'a',变量c2赋值'b'3、字符型数据在内存中的存储形式及使用方法

一个字符变量在内存中占一个字节。字符型数据在内存中存储的是该字符对应的ASCII码。

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

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

charc1,c2,c3,c4;

//定义字符变量c1='a';c2='A';//给字符变量赋字符常量

c3=97;c4=65;//给字符变量赋整数(ASCII码值)printf("%c,%c,%c,%c\n",c1,c2,c3,c4);//以字符形式输出字符变量的值printf("%d,%d,%d,%d\n",c1,c2,c3,c4);//以十进制形式输出字符变量的值printf("%x,%x,%x,%x\n",c1,c2,c3,c4);//以十六进制形式输出字符变量的值}1.2.3字符型数据1.2数据的基本类型及其表现形式

【例1.5】字符变量的定义、赋值和输出。#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.2数据的基本类型及其表现形式

【例1.6】输出给定小写字母对应的大写字母。4、字符串常量

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

字符串常量是由一对双撇号括起来的字符序列。例如:"CHINA","Cprogram","a","$12.5"字符常量和字符串常量的区别:因此字符串常量"CHINA"在内存中占用6个字节。【思考】字符常量'a'和字符串常量"a"有何区别?练习:【例1.7】输出字符串常量及其占用内存的字节数。1.2.4实型数据1.2数据的基本类型及其表现形式

1、实型常量

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

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

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

一个实数可以有多种指数表示形式。在程序中以指数形式输出一个实数时,会以规范化的指数形式输出。

例如123.456的规范化指数形式是1.23456e2。2、实型变量

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

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

floatx;//定义实型变量xx=12.3;//将实型常数12.3赋给变量xprintf("%f\n",x);//以小数形式输出变量x的数值printf("%e\n",x);//以指数形式输出变量x的数值}【例1.8】实型变量的定义、赋值和输出。练习:【例1.9】利用sizeof运算符测试系统中数据类型的长度。1.2.5变量的初始化1.2数据的基本类型及其表现形式

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

inta=3;

//定义整型变量a,并赋初值3floatb=1.23;//定义实型变量b,并赋初值1.23charc='a';

//定义字符变量c,并赋初值'a'

当一次定义同类型的多个变量时,可以给全部变量或部分变量赋初值。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三个整型变量,并赋相同的初值3练习:【例1.10】变量的初始化和输出。1.2.6常变量1.2数据的基本类型及其表现形式

练习:【例1.11】常变量的初始化与输出。

在定义变量并对变量初始化时,如果加上关键字const,则变量的值在程序运行期间不再改变,这种变量称为常变量(constantvariable),也称为只读变量。例如:constinta=5;

//用const声明整型变量a为常变量,其值始终是51.3运算符及表达式

1.3.1算术运算符及其表达式1.3.2强制类型转换运算符及其表达式1.3.3赋值运算符及其表达式1.3.4关系运算符及其表达式1.3.5逻辑运算符及其表达式1.3.6位运算符及其表达式1.3.7

逗号运算符及其表达式1.3.1算术运算符及其表达式1、基本的算术运算符1.3运算符及表达式

(2)-

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

(1)+

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

(4)/

除法运算符,如5/2、5.0/2

(3)*乘法运算符,如2*3

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

说明:

【例1.12】将三位十进制整数的百位数、十位数和个位数分离。#include<stdio.h>intmain(void){inta=123;

intb,c,d;//3个变量分别存放个位数、十位数和百位数

b=a%10;//获得个位数

a=a/10;//右移1位,变量a的值更新为12

c=a%10;//获得十位数

a=a/10;//右移1位,变量a的值更新为1

d=a%10;//获得百位数

printf("123的百位数=%d\n",d);//输出百位数

printf("123的十位数=%d\n",c);//输出十位数

printf("123的个位数=%d\n",b);//输出个位数}1.3.1算术运算符及其表达式1、基本的算术运算符1.3运算符及表达式

练习:【例1.13】将一个正整数倒序输出。【例1.14】不同类型数据之间的混合运算。自增运算符++:使变量的值自增1,相当于i=i+1。自减运算符--:使变量的值自减1,相当于i=i-1。有以下4种形式的表达式:

i++

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

++i

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

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

i--

表达式先用i的值,然后对i的值减1(先用后减)1.3.1算术运算符及其表达式2、自增、自减运算符1.3运算符及表达式

可见,由自增(自减)运算符构成不同形式的表达式时,对变量而言,自增1(自减1)都具有相同的效果,但对表达式而言却有着不同的值。1.3.1算术运算符及其表达式2、自增、自减运算符【例1.15】自增、自减运算符的应用。1.3运算符及表达式

说明:

(1)自增、自减运算符只能用于变量,不能用于常量或表达式。如5++或(a+b)++都是不合法的。(2)自增、自减运算符常用在循环语句中,使循环变量自动加1、减1,这将在后续单元中学习。#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);}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。附录C给出了C语言运算符的优先级和结合性,供查询参考。1.3.2强制类型转换运算符及其表达式1.3运算符及表达式

强制类型转换表达式的一般形式:(类型标识符)(表达式)例如:

(int)i

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

将x转换成整型后,再与y相加(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);}【例1.16】将实型数据强制转换为整型。练习:【例1.17】将整型数据强制转换为实型。1、简单赋值运算符“=”及其表达式1.3.3赋值运算符及其表达式1.3运算符及表达式

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

表达式

赋值表达式中的“表达式”,又可以是一个赋值表达式。赋值运算符是按照“自右向左”的结合顺序。

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

赋值表达式“

a=5”的值是5。执行运算后,变量a的值也是5。【思考】分析下面各赋值表达式中变量a的值。a=5+(c=7)a=b=c=33a=(b=6)/(c=2)a=(b=2)+(c=5)1273

因此

a=b=5与

a=(b=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(将“a*”移到“=”右侧)③a=a*

(b+2)

(在“=”左侧补上变量名a,并对b+2外加括号)练习:【例1.18】复合赋值运算符的使用。3、类型转换

如果赋值运算符“=”两侧的数据类型不一致,但同为数值型数据,在赋值时,系统会自动进行类型转换。下面介绍3种常见的情况。1.3.3赋值运算符及其表达式(1)将整型数据赋给整型变量1.3运算符及表达式

【例1.19】将无符号整型数据赋给有符号整型变量。正数变成了负数

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

unsignedchara=255;

signedcharb;b=a;printf("a=%d\n",a);printf("b=%d\n",b);}3、类型转换1.3.3赋值运算符及其表达式

如果赋值运算符“=”两侧的数据类型不一致,但同为数值型数据,在赋值时,系统会自动进行类型转换。下面介绍3种常见的情况。(1)将整型数据赋给整型变量1.3运算符及表达式

【例1.20】将有符号整型数据赋给无符号整型变量。负数变成了正数

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

signed

chara=-1;

unsignedcharb;b=a;printf("a=%d\n",a);printf("b=%d\n",b);}3、类型转换1.3.3赋值运算符及其表达式

如果赋值运算符“=”两侧的数据类型不一致,但同为数值型数据,在赋值时,系统会自动进行类型转换。下面介绍3种常见的情况。(1)将整型数据赋给整型变量1.3运算符及表达式

【例1.21】将短字节整型数据赋给长字节整型变量。无误#include<stdio.h>intmain(void){

unsignedchar

a=255;

unsignedint

b;b=a;printf("a=%d\n",a);printf("b=%d\n",b);}3、类型转换1.3.3赋值运算符及其表达式

如果赋值运算符“=”两侧的数据类型不一致,但同为数值型数据,在赋值时,系统会自动进行类型转换。下面介绍3种常见的情况。(1)将整型数据赋给整型变量【例1.22】将长字节整型数据赋给短字节整型变量。1.3运算符及表达式

有误!如何解决?#include<stdio.h>intmain(void){

unsignedchar

a=255,b=1;

unsignedchar

c;c=a+b;printf("a=%d\n",a);printf("b=%d\n",b);printf("c=%d\n",c);}3、类型转换1.3.3赋值运算符及其表达式

如果赋值运算符“=”两侧的数据类型不一致,但同为数值型数据,在赋值时,系统会自动进行类型转换。下面介绍3种常见的情况。(2)将实型数据赋给整型变量【例1.23】将实型数据赋给整型变量。1.3运算符及表达式

只取了整数部分#include<stdio.h>intmain(void){

floata=1234.567F;

intb;b=a;printf("a=%f\n",a);printf("b=%d\n",b);}3、类型转换1.3.3赋值运算符及其表达式1.3运算符及表达式

数值不变,但变成了实数

如果赋值运算符“=”两侧的数据类型不一致,但同为数值型数据,在赋值时,系统会自动进行类型转换。下面介绍3种常见的情况。(3)将整型数据赋给实型变量【例1.24】将整型数据赋给实型变量。

通过上述例题可以看出,在赋值运算中,需要根据数据的类型和数值的范围为变量指定合适的类型,必要时还需要借助强制类型转换运算符,以防出错。

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

inta=1234;

floatb;b=a;printf("a=%d\n",a);printf("b=%f\n",b);}1.3.4关系运算符及其表达式1、关系运算符及其优先级次序

优先级相同(高)优先级相同(低)③>大于①<小于②<=小于或等于⑥!=不等于④>=大于或等于⑤==等于

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

a=(b>c)例如:

c>a+b等价于

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

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

(a>b)==c1.3运算符及表达式

2、关系表达式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,则:真假假假1000练习:【例1.25】考察关系表达式的值。1.3.5逻辑运算符及其表达式1、逻辑运算符及其优先级次序

1.3运算符及表达式

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

逻辑运算的真值表aba&&ba||b!a真真真假假真假假真真假真假真假假真!a==b||c<d等价于a>b&&c>d等价于a+b>c&&x+y<d等价于几种运算符的优先级次序如右图所示:!(非)

高算术运算符关系运算符&&和||赋值运算符低(a+b)(>c)(x+y)(<d)&&(a>b)(c>d)&&(!a)(==b)||(c<d)2、逻辑表达式的值

1.3.5逻辑运算符及其表达式1.3运算符及表达式

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逻辑运算符及其表达式1.3运算符及表达式

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

(1)80≤i<89

(2)i<0或i≥100

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

i>=100i!=0练习:【例1.26】考察逻辑表达式的值。1.3.6位运算符及其表达式1.3运算符及表达式

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

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

在嵌入式软件设计中,经常用到位运算符:对二进制位进行运算。例如,0x23与0x45按位与:00100011(0x23)

&)01000101(0x45)0&0=0,0&1=0,1&0=0,1&1=11、“按位与”运算符(&)00000001(0x01)1.3.6位运算符及其表达式1.3运算符及表达式

特殊用途:“与0清零、与1保留”——可对数据的某些位清零,某些位保留不变。例如,将0x23的高4位清零,低4位保留不变。00100011(0x23)

&)00001111(0x0f)0000

0011

(0x03)2、“按位或”运算符(|)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=1例如,将0x23的高4位置1,低4位保留不变。00100011(0x23)

|)11110000(0xf0)01011101(0x67)1111

0011

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

^)01000101(0x45)

特殊用途:“异或1取反(0变1,1变0),异或0保留”——可对数据的某些位取反,某些位保留不变。例如,将0x23的高4位取反,低4位保留不变。00100011(0x23)

^)11110000(0xf0)3、“按位异或”运算符(^)01011100(0x66)1101

0011

(0xd3)两者相异为1,相同为0。0^0=0,0^1=1,1^0=1,1^1=0

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

4、“按位取反”运算符(~)对一个二进制数按位取反:0变1,1变0。

例如,0x55按位取反:01010101(0x55)~)↓

10010110(0xaa)1.3.6位运算符及其表达式1.3运算符及表达式

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

用来将一个数的各二进制位全部左移若干位。例如:

a<<3,表示将a的二进制数左移3位,高位溢出后丢弃,低位补0。1.3.6位运算符及其表达式1.3运算符及表达式

6、“右移”运算符(>>)

用来将一个数的各二进制位全部右移若干位。例如:

a>>3,表示将a的二进制数右移3位,低位溢出后丢弃,对于无符号数,高位补0。1.3.6位运算符及其表达式1.3运算符及表达式

1.3.6位运算符及其表达式【例1.27】位运算符使用。1.3运算符及表达式

可以看出,3个变量a、b、c的值在参与位运算的过程中并未发生改变。

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

unsignedchara,b,c,r1,r2,r3,r4,r5,r6;a=0x23;b=0x45;

c=0x55;r1=a&b;r2=a|b;r3=a^b;r4=~c;r5=a<<3;r6=a>>3;

//以十六进制形式输出变量的值printf("a=0x%x,b=0x%x,c=0x%x\n",a,b,c);printf("a&b=0x%x\n",r1);printf("a|b=0x%x\n",r2);printf("a^b=0x%x\n",r3);printf("~c=0x%x\n",r4);printf("a<<3=0x%x\n",r5);printf("a>>3=0x%x\n",r6);}【例1.29】利用位运算符实现对8位寄存器R和对16位寄存器R'的位操作

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

1.3.7逗号运算符及其表达式1.3运算符及表达式

逗号表达式的一般形式:表达式1,表达式2

逗号运算符的结合性是“从左至右”。求解过程:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。

例如,逗号表达式“2+3,3+5”的值是8。

【思考】

表达式“a=2*3,a*5”的值是多少?

30C语言中,在所有运算符中,逗号运算符的优先级最低。

逗号表达式的扩展形式:表达式1,

表达式2,表达式3,

…,表达式n整个逗号表达式的值等于表达式n的值。练习:【例1.30】考察逗号表达式的值。教学内容: 第1章:C语言语法基础第2章:C程序设计基础第3章:利用数组处理同类型的批量数据第4章:利用函数实现模块化程序设计第5章:灵活使用指针第6章:结构体、共用体、枚举类型及其应用第7章:常用的三种线性数据结构第8章:利用文件进行数据管理第9章:嵌入式技术基础实践方法C语言程序设计第2章C程序设计基础【学习内容】2.1预备知识

2.2顺序结构程序设计

2.3选择结构程序设计

2.4循环结构程序设计

2.5预处理命令2.6三种结构程序设计的综合应用【学习目标】1.熟悉算法及其表示方法;

2.熟悉C语句及其分类;

3.掌握数据输入输出函数的应用方法;

4.掌握顺序、选择、循环3种结构程序设计方法;

5.掌握预处理命令的应用方法。

本章首先介绍程序设计的预备知识,然后详细介绍顺序结构、选择结构和循环结构这3种基本结构的程序设计方法,最后给出预处理命令的应用方法。

计算机程序

=数据结构

+算法

+程序代码2.1预备知识2.1.1算法及流程图表示1、算法的概念

为解决问题而采用的方法和步骤称为算法。对于同一个问题可以有不同的算法,应尽量选择占用内存小、执行速度快的算法。2、算法的5个特征

(1)有穷性:一个算法应包含有限的操作步骤,且每个步骤都能在有限时间内完成。

(2)确定性:算法中的每一个步骤都应该是确定的,而不应模糊和具有二义性。

(3)可行性:算法的每一个步骤都是切实可行的。

(4)有输入:一个算法可有零个或多个输入。

(5)有输出:一个算法必须有一个或多个输出。3、算法的流程图表示

常用的算法表示方法:自然语言描述法、流程图法、计算机语言描述法。在此,只介绍最常用的流程图法。2.1.1算法及流程图表示2.1预备知识2.1.2程序的三种基本结构1、顺序结构

按照程序语句书写的顺序一步一步依次执行。

2.1预备知识

根据条件判断的结果,从多种路径中选择其中的一种路径执行。

2、选择结构

将一组操作重复执行多次。有“当型”和“直到型”两种循环结构。

2.1.2程序的三种基本结构3、循环结构2.1预备知识当型循环结构

先判断后执行直到型循环结构

先执行后判断1、声明语句:对变量、函数、类型(如结构体等类型)等进行声明例如:

变量声明语句:inta,b,s;

变量声明语句:inti=3,j=3,k=3,x=3;函数声明语句:intadd(intx,inty);在C语言中,分号是语句的结束标志。C语句分为6类。2.1.3C语句分类2、表达式语句例如:

a=3(赋值表达式)

a=3;

(赋值语句)i++(自增1表达式)i++;

(自增1语句)2.1预备知识3、函数调用语句:函数调用表达式加分号例如:

printf("ThisisamyfirstProgram.\n");

add(a,b);

2.1.3C语句分类4、控制语句:控制程序的流程(1)条件语句:if语句、switch语句(3)转向语句:break语句、continue语句、return语句、goto语句(2)循环语句:while语句、do…while语句、for语句2.1预备知识

把多条语句用花括号括起来组成的一个语句,称为复合语句。例如:5、复合语句2.1.3C语句分类2.1预备知识

例如:下面的for循环体是空语句,在嵌入式软件设计中常用作软件延时。

for(i=10000;i>0;i--) {

;

//空语句

}6、空语句:只有一个分号,什么也不执行2.2顺序结构程序设计1、数据输入输出的在C语言中的实现2.2.1数据输入输出函数

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

(2)C语言本身不提供输入输出语句,而在C标准函数库中提供了一些输入输出函数,例如printf函数和scanf函数,分别用于数据的输出和输入。

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

#include"stdio.h"2.2顺序结构程序设计2、字符输出函数——putchar()

一般形式:putchar(c)

●向显示器输出字符变量c对应的字符。2.2.1数据输入输出函数【例2.1】输出一个字符

。#include

<stdio.h>

//包含输入输出库函数头文件intmain(void){chara,b,c,d;

a='N';b='U';c='A';d='A';

putchar(a);putchar(b);putchar(c);putchar(d);putchar('\n');

//在屏幕上显示字符}2.2顺序结构程序设计3、字符输入函数——getchar()

通常将键盘上输入的字符赋给一个字符变量,构成赋值语句。如:

charc; c=getchar();2.2.1数据输入输出函数

注意:getchar函数只能接收一个字符,输入数字也按字符处理。输入多个字符时,计算机只接收第一个字符。【例2.2】从键盘输入一个字符,并在显示屏显示

。#include<stdio.h>

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

charc;printf("请输入一个字符:");//原样输出一串字符,增加人机互动性

c=getchar();

//从键盘输入一个字符

putchar(c);

//在屏幕上显示输入的字符putchar('\n');

//换行

}putchar(getchar());//在屏幕上显示输入的字符

2.2顺序结构程序设计4、格式输出函数——printf()●向显示器输出若干个任意类型的数据。2.2.1数据输入输出函数一般形式:printf(格式控制字符串,输出列表)例如: printf("%d,%c\n",i,c)

②原样输出的字符,在显示中起提示作用。(2)输出列表:是需要输出的一些数据,可以是常量、变量或表达式。

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

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

①由%开头的格式符,用于指定数据的输出格式。例如,%d:以十进制形式输出带符号整数;%c:输出单个字符;%x:以十六进制形式输出无符号整数;%s:输出字符串;%f:以小数形式输出实数;%e:以指数形式输出实数。

使用printf函数时,要求格式控制字符串中必须含有与输出项一一对应的格式符,并且类型要匹配。printf函数也可以没有输出项。2.2顺序结构程序设计4、格式输出函数——printf()2.2.1数据输入输出函数#include<stdio.h>//包含输入输出库函数头文件intmain(void){inta=5,b=-1;floatc=1.2;

chard='a';printf("a=%d,b=%d,c=%f,d='%c'\n",a,b,c,d);//依次按指定的格式将多个数据输出

printf("字母a的ASCII码:%d\n",d);//以十进制格式输出字母a的ASCII码printf("字母a的ASCII码:%x\n",d);//以16进制格式输出字母a的ASCII码printf("输出字符串:%s\n","CHINA");//输出字符串"CHINA"printf("今年的增长率=");//原样输出一串字符printf("50%%\n");//输出50%}【例2.3】printf函数使用:格式化输出数据。练习:【例2.4】printf函数的使用:指定输出宽度、小数位数和左端对齐。2.2顺序结构程序设计5、格式输入函数——scanf()2.2.1数据输入输出函数

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

作用:按用户指定的格式从键盘把数据输入到指定的变量地址中。

地址列表:由若干个地址组成的列表。变量的地址:地址运算符“&”后跟变量名。多个地址之间要用逗号隔开。

格式控制字符串的作用与printf函数类似。例如,%d:以十进制形式输入带符号整数;%c:输入单个字符;%x:以十六进制形式输入无符号整数;%s:输入字符串;%f(%lf):以实数形式输入单精度(双精度)实数。2.2顺序结构程序设计5、格式输入函数——scanf()2.2.1数据输入输出函数【例2.5】用scanf函数输入多个数值数据。#include<stdio.h>//包含输入输出库函数头文件intmain(void){inti,j;

floatk;

doublex;

printf("请输入两个整数和两个实数:\n");//提示输入4个数据

scanf("%d%d%f%lf",&i,&j,&k,&x);//输入4个数据分别赋给4个变量

printf("%d,%d,%f,%f\n",i,j,k,x);//将4个变量的数值输出}

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

②用换行符作分隔③用Tab符作分隔2.2顺序结构程序设计5、格式输入函数——scanf()2.2.1数据输入输出函数

当输入数据的类型与scanf函数中的格式符指定的类型不一致时,系统认为该数据结束。【例2.6】scanf函数输入多个不同类型的数据

。#include<stdio.h>intmain(void){ inti;charj; floatk;printf("请输入1个整数、1个字符和1个实数:\n");

//提示输入3个数据

scanf("%d%c%f",&i,&j,&k);//输入3个数据分别赋给变量i、j、k

printf("%d,%c,%f\n",i,j,k);//将变量i、j、k的数据输出

}2.2顺序结构程序设计5、格式输入函数——scanf()2.2.1数据输入输出函数#include<stdio.h>intmain(void){chari,j,k;

printf("请输入3个字符:\n");//提示输入3个数据

scanf("%c%c%c",&i,&j,&k);//输入3个数据分别赋给变量i、j、k

printf("%c,%c,%c\n",i,j,k);//将变量i、j、k的数据输出}用scanf函数输入字符时,系统将输入的空格、换行符作为有效字符。【例2.7】scanf函数输入多个字符。2.2顺序结构程序设计2.2.2顺序结构程序设计应用【例2.9】将输入的两个整数交换,然后再输出这两个整数。ABABABAB

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

需要借助一个临时变量实现两数的交换。//==================================//程序功能:输入两个整数,交换后再输出。//设计日期:2020-03-25//==================================#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.2顺序结构程序设计【例2.10】从键盘输入一个双精度型实数,然后根据需要保留的小数点后的位数进行四舍五入处理,最后输出该实数处理后的数值。#include<stdio.h>#include<math.h>

//包含数学函数库头文件intmain(void){

//(1)定义变量

doublei,j;intn;

//(2)输入相关的数据

printf("请输入一个实数:");

scanf("%lf",&i);

printf("请输入保留小数点后的位数:");

scanf("%d",&n);

//(3)进行四舍五入运算

j=i*pow(10,n);j=j+0.5;

j=(int)j;

j=j/pow(10,n);

//(4)输出处理后的实数值

printf("%f\n",j);}2.2.2顺序结构程序设计应用2.3选择结构程序设计

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

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

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

scanf("%d",&i);

if(i>=0)printf("该数为非负数.\n");}2.3.1if语句及应用【例2.11】用if语句判断输入数据的正负。2.3选择结构程序设计#include<stdio.h>intmain(void){ inti;

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

scanf("%d",&i);

if(i>=0)printf("该数为非负数.\n");

elseprintf("该数为负数.\n");}1、if语句的3种形式

2.3.1if语句及应用if(表达式)语句1else语句2(2)if…else基本形式【例2.12】用if…else语句判断输入数据的正负。练习:【例2.13】判断输入的数据是否为0。【例2.14】判断输入的两个数据是否有0。2.3选择结构程序设计1、if语句的3种形式

2.3.1if语句及应用(3)if…else嵌套形式——用于解决多分支问题说明:注意if与else的配对关系。else总是与它上面最近的未配对的if配对。2.3选择结构程序设计

虚线左侧的嵌套结构,还可写成虚线右侧的更加紧凑的形式。1、if语句的3种形式

2.3.1if语句及应用(3)if…else嵌套形式——用于解决多分支问题2.3选择结构程序设计1、if语句的3种形式

2.3.1if语句及应用(3)if…else嵌套形式——用于解决多分支问题【例2.15】根据符号函数,编程实现输入一个x值,输出y值。#include<stdio.h>intmain(void){intx,y;

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

scanf("%d",&x);

printf("x=%d,y=%d\n",x,y);}if(x<0)y=-1;elseif(x==0)y=0;elsey=1;i

温馨提示

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

评论

0/150

提交评论