《C语言程序设计》讲义
第一章 C语言概述
[教学目的] 介绍课程的性质、作用。通过本章的学习,使学生了解C语言的特点及C简单程序的构成,掌握C程序的编辑、编译、连接和运行的过程。
[教学内容] C语言特点,简单程序举例及上机步骤
重点:C程序基本结构及运行调试步骤
[教学方法] 多媒体
一、 C语言出现的背景
从计算机应用基础中学过计算机语言及语言处理系统,我们学习高级语言--C语言。
计算机:计算机是解决问题的电子工具、是由人来指挥的,人们为了用计算机来解决实际问题,一般总是要编制程序。
程序:是指以某种程序设计语言为工具编制出来的动作序列,它表达了人们解决问题的思路,用于指挥计算机进行一系列操作,从而实现预定的功能。
程序设计语言:是用户用来编写程序的语言,是人与计算机之间交换信息的桥梁、工具。是计算机软件系统的重要组成部分,而相应的各种语言处理程序属于系统软件。例如C语言。
二、 C语言的特点
1、语言简洁、紧凑,使用方便、灵活;
2、运算符丰富
3、数据类型多(整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类等)
4、具有结构化的控制语句
5、语法不太严格,自由度大
6、既是高级语言,又具有低级语言的功能
7、生成目标代码质量高,程序执行效率
8、可移植性好
三、C语言程序构成(采用程序实例加以说明,并提倡良好的程序设计书写风格)
例1
/* 例1 The first C Program*/
#include “stdio.h”
void main()
{
printf(“This is a C program.\n”) ;
}
例2
#include “stdio.h”
void main()
{
int a, b, sum;
a = 123;
b = 456;
sum = a + b;
printf(“sum = %d\n”, sum);
}
例3
int max(int x, int y)
{
int z;
if (x>y)
z=x;
else
z=y;
return(z);
}
main( )
{
int a,b,c;
scanf(“%d%d”,&a,&b);
c=max(a,b);
printf(“ max=%d”,c);
}
说明:
1、C语言是由函数构成的,至少有一个main()函数;
2、每个函数由函数首部和函数体组成;函数体由说明语句、执行语句组成;
函数首部:
返回值类型 函数名([形参列表])
函数体:
函数首部下用一对{}括起来的部分。函数体一般包括声明部分、执行部分两部分。
{
声明部分: 在这部分定义本函数所使用的变量。
执行部分: 由若干条语句组成命令序列(可以在其中调用其它函数)。
}
3、每个C程序从main()函数开始执行,并在main()中结束;
4、每个语句和数据定义的最后必须加分号;
5、C程序无输入、输出语句:输入功能由输入(scanf()等)函数完成;输出功能由输出(printf())函数完成;
6、可加注释 /*……*/
四、上机步骤
程序:为了使计算机能按照人们的意志工作,就要根据问题的要求,编写相应的程序。程序是一组计算机可以识别和执行的指令,每一条指令使计算机执行特定的操作。
源程序:程序可以用高级语言或汇编语言编写,用高级语言或汇编语言编写的程序称为源程序。C程序源程序的扩展名为“.c” 。C源程序的C源代码是必须存放到计算机内的存储器中的。
目标程序:源程序经过“编译程序”翻译所得到的二进制代码称为目标程序。目标程序的扩展名为“.obj” 。
可执行程序:目标程序与库函数连接,形成的完整的可在操作系统下独立执行的程序称为可执行程序。可执行程序的扩展名为“.exe”(在dos/windows环境下)。
1、源程序文件的建立和编辑
-
- 编写源程序,形成 .C文件
- 需用编辑工具:tc.exe、记事本
2、编译
-
- 编译源程序,形成目标程序 . Obj文件
- 需用编译工具 :tcc.exe
3、连接
-
- 连接OBJ文件和调用的库函数,形成运行程序 .exe 文件
- 需用连接工具 :tlink.exe
4、运行 .exe 文件。执行程序,查看结果
五、 课堂小结
1、 C语言的构成要素,main函数在程序中的作用
2、 上机操作的过程
六、 本章小结
1、本章内容相对来说比较简单,学生能够领会并掌握起来,主要是C语言的特点,对C程序中的函数的认识。
2、还有一个基本内容是程序的执行过程,通过演示学生让领会,通过下次上机实践加深学生的印象。
第二章 数据类型、运算符与表达式
[教学目的] 了解C语言丰富的数据类型;常量、变量的概念。掌握变量定义原则和符号常量定义方法;常用基本数据类型(整型、实型、字符型)数据的常量表示、机内存储、变量分类以及掌握正确选择数据类型。了解数值型数据混合运算及类型转换规律;了解C语言的丰富运算符,丰富的运算符可以构成灵活的表达式;掌握算术、赋值、逗号运算符及它们构成的表达式;掌握运算符的优先级、结合性规律;函数分类及标准函数使用。
[教学内容] 常量与变量、 整型数据、 实型数据 、字符型数据 、 变量赋初值、各类数值型数据间的混合运算 、算术运算符与算术表达式 、 赋值运算符和赋值表达式 、 逗号运算符与逗号表达式、标准函数使用
重点难点:掌握常用基本数据类型(整型、实型、字符型)数据的常量表示、机内存储、变量分类以及掌握正确选择数据类型。算术、赋值、自增/减运算符及它们构成的表达式、运算符的优先级、结合性规律;自增、自减运算
[教学方法] 多媒体
一 、C语言基本语法成分
1、C语言字符集。(字符集)
(1) 字母:A-Z,a-z
(2) 数字:0-9
(3) 空白符:空格,制表符(跳格),换行符(空行)的总称。
(4) 特殊字符:+ - * / < > ( ) [ ] { } _ = ! # % . , ; : ‘ “ | & ? $ ^ \ ~
2、标识符(名字)定义规则及注意事项。
(1) 标识符(名字):有效字符序列。
-
- 标准C语言标识符定义规则:标识符只能由字母、数字和下划线三种字符组成。并且第一个字符必须为字母或下划线。
- 大小写敏感。如:sum SUM Sum suM是不同的。
- 不能与“关键词”同名。
(2) C语言的标识符可以分为以下三类
-
- 预定义标识符: 在C语言中也都有特定的含义,但允许用户另作它用,但这将使这些标识符失去系统规定的原意。 如:main,printf 等 。
- 用户标识符: 用户根据需要定义,一般用来给变量、函数、数组或文件等命名。除要遵循标识符的命名规则外,还应注意做到“见名知义”,即选择的用户标识符应具有相关含义,以增加程序的可读性。
例如以下非法:
- 3s 以数字开头。 ② s*T 出现非法字符*。
③ -3x 以减号开头。 ④ bowy-1 出现非法字符-(减号)。
-
- 关键词(保留字):C语言规定的具有固定名字和特定含义的标识符。C语言的关键字分为以下几类:
-
- 类型说明符:用于定义、说明变量、函数或其它数据结构的类型,如int。
- 语句定义符:用于表示一个语句的功能。如if就是条件语句的语句定义符。
- 预处理命令字:用于表示一个预处理命令。如include。
注意:
关键词必须用小写字母。
用户定义的标识符不能与关键字相同。如不允许使用关键字为变量、数组、函数等操作对象命名。如果用户标识符与关键字相同,程序在编译时将给出出错信息,如果与预定义标识符相同,系统并不报错,只是该预定义标识符将失去原定含义,代之以用户确认的含义,可能会引发一些运行时的错误。
4、运算符
代表对各种数据类型实际数据对象的运算。运算符将常量、变量、函数连接起来组成表达式,表示各种运算。运算符可以由一个或多个字符组成。
5、分隔符
逗号,空格,制表符。起分隔、间隔作用。例如,逗号主要用在类型说明和函数参数表中,分隔各个变量。空格多用于语句各单词之间,起分隔作用。在关键字、标识符之间必须要有一个或多个空格符分隔。
6、注释符
格式:/* ... */或 //。编译时编译系统忽略注释。
作用:注释、调试程序。例如:在调试程序时,对暂不使用的语句也可用注释符括起来,待调试结束后再去掉注释符。
7、C语言的主要语法单位
(1)表达式: 运算符与运算对象组合就形成了表达试。如,2 + 3 * 4
(2)变量定义: 变量也有数据类型,所以在定义变量时要说明相应变量的类型。如: int i;
(3)语句: 语句是程序最基本的执行单位,程序的功能就是通过对一系列语句的执行来实现的。
(4)函数定义与调用。
二 基本数据类型(整型、字符型、实型、枚举型)
一个程序应包括数据结构和算法。数据结构是在程序中要指定数据的类型和数据的组织形式。算法是如何对数据结构进行处理达到编程者的目的的系列步骤或方法。 C语言的数据结构是以数据类型形式出现的。不同的数据类型决定数据的取值范围、处理方式和存储表示方式。 C的数据类型如下:
构造类型 |
整型int 字符型 char 实型(浮点型) 枚举类型enum |
基本类型 |
空类型void |
指针类型 * |
单精度型 float 双精度型 double 双精度型 double |
数据类型 |
数组类型 结构体类型struct 共用体类型 union |
根据实际情况,选择合理的数据类型。这是我们掌握各种数据类型的目的和要求。
学习中主要防止数据溢出现象发生。注意预先分析、估算运算结果的可能范围,采用取值范围更大的类型。
(一)常量与变量
1、 常量:在程序运行过程中,其值不能被改变的量。
两种形式:一般常量和符号常量
- 直接常量(字面常量):
整型常量:如12、0、-3等
实型常量:如4.5、-1.234等
字符常量:如‘a’、‘1’等,用单引号表示;
字符串常量:如“a”、“abc”、“1”,用双引号表示。
- 符号常量:
符号常量即是用一个标识符来代替一个常量;符号常借助于预处理命令#define来实现;
定义形式:
#define 标识符 字符串
如:#define PI 3.1415926535
例:计算圆的周长和面积 。(c5.c)
#define PI 3.14
#define R 10
void main()
{
float area,l;
l= 2 * PI * R;
area=R*R*PI;
printf(“周长=%f\n",l);
printf(“面积=%f\n",area);
}
说明:
① 习惯上,符号常量用大写字母表示;
② 定义符号常量时,不能以“;”结束;
③ 一个#define占一行,且要从第一列开始书写;
④ 一个源程序文件中可含有若干个define命令,不同的define命令中指定的“标识符”不能相同;
2、变量:在程序运行过程中,其值会发生变化。
- 每个变量必须有一个名字,变量名是标识符。
- 标识符是用来标识数据对象,是一个数据对象的名字。
- 命名规则:以字母或下划线开始,后跟字符、数字或下划线。
例:x1,_average,lotus_1_2_3,#abc,1fs,M.D.Jhon
- 变量名不能是关键字(即保留字,是C编译程序中保留使用的标识符。 如:auto、break、char、do、else、if、int等)
- 变量必须先定义再使用
例如:
float x; 定义单精度浮点型变量
double area, length; 定义双精度浮点型变量
long z,k; 定义整型变量
char ch1,ch2=‘2’; 定义字符变量
- 变量名(用标识符表示)、变量在内存中占据的存储单元、变量值三者关系。(实质)
- 变量名代表内存中的一个存储单元,存放该变量的值。
- 该存储单元的大小由变量的数据类型决定。
- 变量值是指存放在变量名所指的存储单元中的数据。
变量名在程序运行过程中不会改变,变量的值可以改变。本质上是通过变量名找到与变量相对应的存储单元,从而引用存储于其中的值,当然这是计算机系统根据程序意图所作的具体操作。
(二)整型数据
1、整型常量的表示方法
(1) 十进制 如:123,-456,0
(2) 八进制数 如:0123,-011 (以0开头的数)
(3) 十六进制数 如:0x123,-0x12,0xABC (以0x开头的)
2、整型变量
(1) 整型数据在内存中以二进制形式存放,每一个整型变量在内存中占2个字节。
例:定义整型变量i=10 和j= -10的存放形式。
(2)整型变量的分类:基本型int、短整型short、长整型long、无符号型unsigned
(3) 整型变量的定义
对变量的定义,一般放在函数体开头部分的声明部分(也可放在函数中某一分程序内)
例:#include <stdio.h>
main( )
{ int a, b, c, d;
unsigned u;
a=12; b=-24; u=10;
c=a+u; d=b+u;
printf(“a+u=%d, b+u=%d\n”,c,d);
}
(4) 整型数据的溢出
一个int 型变量的最大允许值为32767,如果再加1,其结果不是32768,而是-32768。即“溢出”。
(三)实型数据
1、实型常量的表示方法
(1) 十进制浮点数 如:0.123,.456,0.0,123.,123.0
整数部分和小数部分都可省,但不能同时省
(2) 指数形式 如:123e3,123E3代表123×103
指数部分为整常数; 尾数部分可以是整常数,也可以是实常数;尾数部分和指数部分均不可省。E10, 100.e15.2, .e5均为不合法的浮点数。
2、实型变量
(1)实型数据在内存中的存放形式
一个实型数据一般在内存中占4个字节(32位)。实型数据是按照指数形式存储的。
(2)实型变量的分类:单精度float、双精度double、长双精度long double
(四)字符型数据
1、字符常量
(1) 括在一对单引号中的一个字符(单引号仅作界限符),如:‘a’ 、‘X’
(2)一个字符常量占1个字节,存放的是字符的ASCII码值。
(3) 转义字符:以‘ \ ’开头,后跟一个约定的字符或所要表示字符的十六进制(或者八进制)的编码;
字符形式 |
功 能 |
\n |
回车换行,光标移动到下一行首 |
\t |
横向跳格(8位为一格,光标跳到下一格的起始位置,如第9、第17位等) |
\v |
竖向跳格 |
\b |
退格,光标往左移动一格 |
\r |
回车不换行,光标移动到本行首 |
\f |
走纸换页 |
\\ |
表示反斜杠字符\ |
\’ |
表示单撇号字符’ |
\” |
表示双引号字符” |
\ddd |
1到3位八进制所代表的字符(取值范围0~377) |
\xhh |
1到2位十六进制所代表的字符(取值范围0~ff) |
\0 |
代表字符串结束字符 |
2、字符变量: 字符变量用来存放字符常量,只能放一个字符。
定义格式:
[存储类型] char 变量名表;
例如:char c1,c2;
c1=‘a’ ;
c2=‘1’ ;
一个字符变量在内存中占一个字节。
例 大小写字母的转换(ASCII码表:小写字母比对应的大写字母的ASCII码大32,本例还可以看出允许字符数据与整数直接进行算术运算,运算时字符数据用ASCII码值参与运算)(c9.c)
void main()
{
char c1,c2,c3;
c1='a';
c2='b';
c1=c1-32;
c2=c2-32;
c3=125;
printf("\n%c %c %c\n",c1,c2,c3);
printf("%d %d %d\n",c1,c2,c3);
getch();
}
A B }
65 66 125
说明:
(1)字符数据以ASCII码存储的形式与整数的存储形式类似,这使得字符型数据和整型数据之间可以通用(当作整型量)。
(2)可以将整型量赋值给字符变量(0~255),也可以将字符量赋值给整型变量。
(3)可以对字符数据进行算术运算,相当于对它们的ASCII码进行算术运算。
(4)一个字符数据既可以以字符形式输出(ASCII码对应的字符),也可以以整数形式输出(直接输出ASCII码)。
(五)字符串常量
1、 括在一对双引号中的0个或多个字符组成的序列;双引号仅作界限符;如:“C language programming”、“a\\n”、“#123”、“ ”等为字符串常量;
2、字符串常量的实际存储:在存储完字符串中的有效字符后还应存储字符串结束标志‘\0’。
3、区分字符常量与字符串常量
- C语言没有专门的字符串变量,如果想将一个字符串存放在变量中,可以使用字符数组。即用一个字符数组来存放一个字符串,数组中每一个元素存放一个字符。 <string.h>里定义了一系列专门的字符串处理函数。(第六章)
- 引用符号不同:字符常量由单引号括起来,字符串常量由双引号括起来。
- 容量不同:字符常量只能是单个字符,字符串常量则可以含一个或多个字符。
- 赋给变量不同:可把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。在C语言中没有相应的字符串变量。要存放一个字符串常量可以使用字符数组。
- 占用内存空间大小不同:字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字节数加1。增加的一个字节中存放字符"\0"(ASCII码为0)。这是字符串结束的标志。例如,字符常量'b'和字符串常量"b"虽然都只有一个字符,但占用的内存空间不同。
(六) 变量赋初值
在定义变量时对变量进行赋值称为变量的初始化;
格式:类型说明符 变量1=值1,变量2=值2,……;
如: int a=3, b=4, c=5;
float x=3.4, y=0.75;
char ch1=‘K’, ch2=‘P’;
(七)各数值型数据的混合运算
整型(包括int,short,long)和实型(包括float,double)数据可以混合运算,另外字符型数据和整型数据可以通用,因此,整型、实型、字符型数据之间可以混合运算。
例如:
表达式10+’a’+1.5-8765.1234*’b’是合法的。
在进行运算时,不同类型的数据先转换成同一类型,然后进行计算,转换的方法有两种:自动转换(隐式转换);强制转换。
- 自动动转换(隐式转换)
自动转换发生在不同类型数据进行混合运算时,由编译系统自动完成。
什么情况下发生:
- 运算转换-----不同类型数据混合运算时
- 赋值转换-----把一个值赋给与其类型不同的变量时
- 输出转换-----输出时转换成指定的输出格式
- 函数调用转换----实参与形参类型不一致时转换
char, short |
double |
long |
float |
unsigned |
int |
高精度 |
低精度 |
-
- 强制转换是通过类型转换运算来实现。
一般形式:
(类型说明符)表达式
功能:把表达式的结果强制转换为类型说明符所表示的类型。
例如:
(int)a 将a的结果强制转换为整型量。
(int)(x+y) 将x+y的结果强制转换为整型量。
(float)a+b 将a的内容强制转换为浮点数,再与b相加。
注意:
(float) 22/5 与 (float) (22/5) 不同
错误的类型转换:
(int) b=a+5
b= int (3*a)
三、运算符、表达式
(一)基本概念
运算符:
运算符描述对数据执行何种操作。C语言中的运算处理功能都是由运算符来实现的。
- 优先级:指各种运算符号的运算优先顺序。
- 结合性:指运算符号和运算对象的结合方向。 分为:从左向右(左结合)和从右向左(右结合)
重点:运算规则(运算符的优先级和结合性)。
表达式:
使用运算符和( )将运算对象(常量、变量、函数等)连接起来,构成表达式。它描述了一个具体的求值运算过程。
- 计算表达式的值
-按照运算符的运算规则求值
-求值时注意运算符的优先级和结合性
- 表达式值的类型
-自动转换
-强制转换
重点:表达式书写要求、类型转换规则、表达式值及类型。
(二)算术运算符与算术表达式
1、基本的算术运算符: + – * / %
优先级: * / % 高于 + –
结合性:左结合性
% (模运算符或求余运算符,%要求两侧均为整型数据。如7%4=3, 4%6=4 ,-12 % 5=-2,21%7=0)。
2、算术表达式:用算术运算符和括号将运算对象(操作数)连接起来的、符合C语法规则的式子称为算术表达式。
例如:
a * b / c - 1.5 + ’a’
(a+b)/(a-b)
注意:
(1)C语言算术表达式的乘号(*)不能省略。例如:数学式b2-4ac,相应的C表达式应该写成:b*b-4*a*c。
(2)C语言表达式中只能出现字符集允许的字符。例如,数学πr2相应的C表达式应该写成:PI*r*r。(其中PI是已经定义的符号常量)
(3) C语言算术表达式不允许有分子分母的形式。例如,(a+b)/(c+d)。
(4)C语言算术表达式只使用圆括号( )改变运算的优先顺序(不要指望用{ }[ ])。可以使用多层圆括号,此时左右括号必须配对,运算时从内层括号开始,由内向外依次计算表达式的值。
3、强制类型转换运算符:(类型名)(表达式)
4、自增、自减运算符:+ + – –
作用是使变量的值增一或减一。
如: ++i, i++, --j, j–
说明:
(1)++i,--i, j++, j--
++i,--i (前置运算) :先自增(减),再参与运算;
j++, j--(后置运算):先参与运算, 再自增(减)。
例如:
i=3时, 分析 j=++i; j=i++; 的区别。
(2)自增、减运算符只用于变量,而不能用于常量或表达式。
例如:
6++, (a+b)++,(-i)++都不合法。
(3)++,--的结合方向是“自右向左”(与一般算术运算符不同)。
例如:
-i++ -(i++) 合法。
【例2-5】编写一C程序,分解出6378的每一个位数。
参考源代码:
/* 例2-5,2-5.c */
#include<stdio.h>
void main()
{
int x1, x2, x3, x4, m = 6378; /* 定义整型变量 */
x1 = m / 1 % 10; /* 求个位数 */
x2 = m / 10 % 10; /* 求十位数 */
x3 = m / 100 % 10; /* 求百位数 */
x4 = m / 1000 % 10; /* 求千位数 */
printf("%d,%d,%d,%d\n", x4, x3, x2, x1); /* 输出结果 */
}
(三)、赋值运算符与赋值表达式
- 简单的赋值运算符:= 除逗号表达式外,优先级最低
〈变量〉〈赋值运算符〉〈表达式〉
赋值表达式的求解过程:
-
- 先计算赋值运算符右侧的“表达式”的值
- 将赋值运算符右侧“表达式”的值赋值给左侧的变量。
赋值的含义:将赋值运算符右边的表达式的值存放到左边变量名标识的存储单元中。
例如:
x = 10 + y;
执行赋值运算(操作),将10+y的值赋给变量x,同时整个表达式的值就是刚才所赋的值。
说明:
(1)赋值运算符左边必须是变量,右边可以是常量、变量、函数调用或常量、变量、函数调用组成的表达式。
例如:
x=10
y=x+10
y=func()
都是合法的赋值表达式。
(2)赋值符号“=”不同于数学的等号,它没有相等的含义。(“==”相等)
例如:
C语言中x=x+1是合法的(数学上不合法),它的含义是取出变量x的值加1,再存放到变量x中。
例如:
对于表达式:x = y = z = 5,根据赋值运算符结合性可知,上式可等效为:x= (y = ( z = 5 ))
(3)赋值运算时,当赋值运算符两边数据类型不同时,将由系统自动进行类型转换。
转换原则: 先将赋值号右边表达式类型转换为左边变量的类型,然后赋值。
- <实型变量> = <整型表达式>
-小数部分自动补0
- <整型变量> = <实型表达式>
- 自动舍去实型表达式的小数部分(注意不进行四舍五入)
- <字符变量> = <整型表达式>
- <整型变量> = <长整型表达式>
- 自动截取表达式值的低字节赋值,舍去高字节
- <整型变量> = <字符数据>
- <长整型变量> = <整型表达式>
- 自动给高字节补0 或补1
- 复合赋值运算符: += *= %=等
- 嵌套的赋值表达式
(四)逗号运算符与逗号表达式
1、逗号运算符: , 所有运算符中优先级最低
2、逗号表达式:
表达式1,表达式2,……,表达式n
求解过程:先求表达式1,再求表达式2,依次求下去,直到求出表达式n,整个逗号表达式的值就是表达式n的值
例如:逗号表达式3+5,6+8的值为14。
3、逗号表达式主要作用:
将若干表达式“串联”起来,表示一个顺序的操作(计算),在许多情况下,使用逗号表达式的目的只是想分别得到各个表达式的值,而并非一定需要得到和使用整个逗号表达式的值。
例如:for(s=0,i=1;i<10;i++)
(五)位运算和位运算符
所谓位运算就是指进行这些二进制位的运算。
1、按位与&:是一个双目运算符,参加运算的两数据,按二进位进行与运算。
每位遵循原则:0&0=0,0&1=0,1&0=0,1&1=1
如:3&6=2
00000011
& 00000110
00000010
如果参与&运算的是负数,则以补码形式表示二进制数,再按位进行运算。
按位与运算的用途:
(1)清零:原来的数中为1的位,新数中相应的位为0
(2)取一个数中的某些指定位或要想将一个数中某些位保留下来,就与一个数进行&运算,此数在这些位取1。
2、按位或|:是一个双目运算符,参加运算的两数据,按二进位进行或运算。每位遵循原则:0|0=0,0|1=1,1|0=1,1|1=1
如:3|6=7
00000011
| 00000110
00000111
按位或运算的用途:
使一个数中某些位变为1,只要将该数与一个数进行|运算,此数在这些位取1。
3、按位异或^: 是一个双目运算符,参加运算的两数据,按二进位进行异或运算。每位遵循原则:0∧0=0,0∧1=1,1∧0=1,1∧1=0
如:3∧6=5
00000011
∧ 00000110
00000101
按位异或运算的用途:
(1)将特定的位翻转,只要该数与一个数进行∧运算,此数在这些位取1;
(2)与0相∧,保留原值;
(3)交换两个数的值,不用临时变量;设有a,b两个数值,则经过如下运算,可使a,b的值交换。
a=a∧b;
b=b∧a;
a=a∧b;
4、按位取反~: 是一个单目运算符,用来对一个二进制数按每位取反。
每位遵循原则:~0=1, ~1=0
按位取反运算符的用途:使程序的可移植性好。
~运算符的优先级比算术运算符、关系运算符、逻辑运算符和其它位运算符的都高。
5、左移运算符<<: 是一个双目运算符,用来对一个数的二进位全部左移若干位。高位左移后溢出,舍弃不起作用。
按位左移运算的用途:
在被溢出舍弃的高位中不包含1时,左移n位相当于该数乘2n。
6、右移运算符>>: 是一个双目运算符,用来对一个数的二进位全部右移若干位。低位右移后溢出,舍弃不起作用,对无符号数,高位补0。
按位右移运算的用途:右移n位相当于该数除以2n。
在右移时,需要注意符号位问题。
-
- 对无符号数,右移时左边高位移入0。
- 对有符号数,如原来符号位为0,则左边也移入0。如符号位原来为1,左边移入0还是1,要取决于所用计算机系统。此时移入0的称为“逻辑右移”,即简单右移。移入1的称为“算术右移”。
说明:
- 与位运算相关的复合赋值运算符有:&=、|=、>>=、<<=、∧=
- 掌握位运算符和算术运算符、关系运算符、逻辑运算符的优先级。
- 注意位运算符和逻辑运算符的区别。
- 不同长度的数据进行位运算时两个数据右对齐。
四、函数
函数:完成特定功能的程序段。
1、分类:
- 标准函数(库函数):由系统设计好的,存放在系统函数库中,可以由用户直接调用的程序。
- 自定义函数:由用户根据系统提供的函数定义规则实现特定功能的程序模块。(第八章)
2、标准函数使用要求:
(1)使用#include “xxx.h”,把要调用的函数的库文件包含进来,放在程序最前面。
例如:要调用数学sqrt(x)函数,则加 #include “math.h”头文件。
(2) 使用原则:从函数功能、格式、返回值及类型、注意事项四个方面学习。
3、 函数调用形式:函数名([参数表])
例如:putchar('a')
sqrt(x)
4、学会查阅库函数,正确使用。
5、标准函数应用举例---随机函数rand()
(1)包含头文件 :
#include <stdlib.h>
#include <time.h>
(2)原型说明:
int rand(void)
rand()函数返回0到RAND_MAX之间的伪随机数。RAND_MAX常量被定义在stdlib.h头文件中。其值等于32767,或者更大。
void srand (unsigned int n)
srand(n)函数使用自变量n作为种子,用来初始化随机数产生器。一般用法: srand( (unsigned)time( NULL ) );
(其中:time()是时间函数,返回1970年以来的秒时间。原型在<time.h> 中。请查阅相关书籍)
(3)求一定范围内的随机数。
- 随机整数。要取[a,b)之间的随机整数(包括a,但不包括b),使用:
( rand() % (b - a) ) + a
如果要得到 [a,b]之间的随机整数: (rand() % (b – a+1) ) + a
- 伪随机实数。要取得0~1之间的实数,可以用: rand() / (double)(RAND_MAX)
还有其他方法。。。。 rand() / ((32767.0/100) ) 实数:0~100.0
(4)random()函数也可以产生伪随机数。见下例。
例 随机产生一个4位自然数,输出它的逆数。如设某数1965,则其逆数为5691。
随机产生任意整数区间[a,b]内的一个整数,要用到随机函数random()和种子函数randomize(),相关头文件是“stdlib.h”。函数random(n)负责产生区间[0,n)间的整数,randomize()负责产生数的随机性。至于分解数字,可用运算符“%”和“/”实现。
不难推导,产生[a,b]区间整数的公式为random(b-a+1)+a。对本例,4位自然数区间是[1000,9999],故产生其间任意整数的表达式为:random(9000)+1000。
本例需要6个整型变量:原始数x,逆数y,千位、百位、十位、个位上的数字qw、bw、sw、gw。(当然,这些变量的名字是可以任意取的。)
/*例3-20,3-20.c*/
#include “stdlib.h”
#include “time.h”
void main()
{
int x, y, qw, bw, sw, gw;
randomize(); /* 置随机函数种子 */
x = random(9000) + 1000;
gw = x % 10; /* 依次分解各位数字 */
sw = x / 10 % 10;
bw = x / 100 % 10;
qw = x / 1000 % 10;
y = gw * 1000 + sw * 100 + bw * 10 + qw; /* 组合成逆数 */
printf(“\nx=%d, y=%d”,x,y);
}
【融会贯通】有50位运动员(编号1001~1050),都非常出色,现要从中选出4位参加田径接力赛。为公平起见,请编写程序,让计算机输出其中幸运的4位运动员的编号。
五 C语句概述
C程序的总体层次结构:程序、模块,函数,语句。
语句:是向计算机发出的用来完成一定操作任务的指令。
C语言语句分类:
- 控制语句(9种)
- 表达式语句(典型的赋值,函数调用、空语句)
- 复合语句(相当一条语句,哪里有语句,哪里就可以用复合语句)
六 课堂小结
1、++、--运算是学习中的难点,目前不要求有太深的理解,要求把引用规则掌握下来,会简单的应用。
2、各种运算符的优先级是一个重点,参阅课本附表,加深记忆,熟练掌握优先级及结合性。
3、表达式值的求解,能熟练求出任意表达式的值,特别是对于%和自反运算符、逗号运算符。
七 本章后记及上机总结
1、本章内容比较琐碎,学生掌握起来有一定的难度,所以注意让学生做好预习与复习的工作,并通过上机对内容进行深一步的认识。
2、本章是对C语言数据类型的基本知识,包括整型、实型、字符型。首先要求学生对此有一个基本认识,然后通过编程对数据进行定义以使理论与实践结合起来。在这一部分中学生出现问题比较多的是在编程过程中对数据的范围考虑不是很周全,应强调一下。
3、本章涉及的另一个重点是C语言的运算符号,主要是算术运算符,此外还有自增、自减运算符、自反运算符、逗号运算符、赋值运算符等,其中自增和自减难度大一点,同过实例进行验证或通过调试程序使学生掌握它们运算的规律&#