课程安排
总课时72,其中理论36学时,实验36学时
课程基本要求
1. 了解基本算法
2. 了解C语言的数据类型、运算符与表达式
的使用方法。
3. 熟练三种基本设计语句编程。
4. 熟练使用数组编程。
5. 熟练函数的定义和设计。
6. 了解指针的运算与使用。
教学方法及要求
1. 课堂教学
采用大屏幕投影仪授课,操作示范。
要求:认真听课、作笔记、遵守课堂纪律。
2. 实验课
培养实际操作能力、自学能力。
要求:遵守机房规则。独立完成各个实验(期未要
进行上机考试)。
3. 课后练习
每章交一次作业、上机前预习、争取多上机
4. 成绩评定
根据理论考试、上机操作和平时成绩评定。
.机位安排及机房清洁卫生
1. 换鞋上机,对号入座
要求:按学号顺序,固定机位。学习委员填写机
位表3份,交任课教师、实验室各一份。
注意: 不要穿太昂贵的鞋上机。
2. 为防止病毒,严禁自带磁盘上机
要求:磁盘集中保管,专人负责(上机发磁盘,
下课收磁盘)。
3. 保持机房清洁
要求:每天下午搞一次清洁,每周大搞一次。
.目录
1.C语言概述
2.数据类型、运算符与表达式
3.顺序设计
4.选择结构设计
5.循环结构设计
6.数组的定义和引用
7.函数的定义和调用
8.预处理命令
9.指针的使用
10.结构体与共同体
11.位运算
12.文件的操作
第一章 C语言概述
1.1C语言出现的历史背景
汇编语言编写的程序太依赖硬件,程序的可
读性和移植性都差,C语言既有高级语言
的特点又有低级语言特点.
C语言是在B语言中发展起来的.
1960 ALGOL语言
1970 B语言,开发出UNIX系统(贝尔实验室)
1972 C语言
1975C语言开始被人们所接受,并开始流
行.
C语言有各种不同版本:
TURBO C, BORLAND C, QUICK C,
MICROSOFT C.
1.2 C语言的特点
1、语言简洁,使用方便。32个关键字、9
种控制语句,书写形式自由。
2、运算符丰富。有34种运算符,包括算术、
逻辑、逗号运算、移位运算等等。
3、数据结构丰富。有整型、实型、字符型、
数组类型,指针类型、结构类型、共同
体类型等等。
4、具有结构化的控制语句,函数模块化。
5、允许直接访问物理地址,进行位操作,
可直接对硬件进行操作。
1.2 C语言的特点
6、生成目标代码质量高,执行效
率高,可以直接生成EXE文件。
7、可移植性好。
8、C语言比其它语言相对来说难
掌握。
1.3 简单的C程序介绍
例1:
main( )
{
printf ( “This is a C program.\n”);
}
输出结果为:
This is a C program.
1.3 简单的C程序介绍
例2:
main( )
{
int a,b,sum;
a=123;b=456;
sum=a+b;
printf ( “sum is %d\n”,sum);
}
输出结果为:
sum is 579
1.3 简单的C程序介绍
例3:
main( )
{
int a,b,c;
scanf(“%d,%d”,&a,&b);
c=max(a,b);
printf ( “max is %d\n”,max);
sum=a+b;
printf ( “sum is %d\n”,sum);
}
1.3 简单的C程序介绍
继例3:
int max(int x,int y )
{
int z;
if(x>y) z=x;
else z=y;
return(z);
}
输出结果为: max is xxx
sum is xxx
1.3 简单的C程序介绍
1 、C程序是由函数构成,至少有一个
main函数和若干个其它函数。
2、一个函数由两部分组成:
(1)函数的首部:在函数的第一行。
int max(int x,int y )
(2)函数体:包含两部分(声明部分
和执行部分)
3、C程序总是从main函数开始执行的。
1.3 简单的C程序介绍
4 、一行可以有多个语句,一个语句
也可以写在不同行上。
5、但每个语句后一定要有分号;
数据定义后也要有分号;
6、C语言没有专门的输入输出语句。
由scanf和printf两个函数提供。
7、用/*…….*/来作注释,不执行。
1.4 C程序的上机环境
我们用的是turbo C。
第三章 数据类型、运算符与表达式
• 基本数据类型与特点
• 各种数据类型表示范围
• 常量的表示方法
• 变量说明语句
• 运算符与基本运算规则
• 各种表达式的使用
•基本输入输出函数使用方法
本 章 要 点
§3-1 数据与数据类型(续)
C语言的数据类型
基本类型
字符型 char
整型 int
浮点型 单精度 float
双精度 double
指针类型
构造类型
数组
结构 struct
联合 union
枚举 enum 空类型
第三章
第七章
第十一章
指针类型
§3-2 常量与变量
数据数据
程序加工处理的对象及其结果
数据类型数据类型
数据在计算机内部的存储形式(占用的内存单元
数量、编码方式、取值范围等)
常量常量
在程序运行过程中不允许改变的量可用一个标识
符来代表一个常量。
变量变量
在程序运行过程中允许改变的量
一、基本概念
例题:
#define PRICE 30
Main( )
{ int num,total;
num=10; total=num* PRICE;
Printf( “total=%d”,total);
}
§3-2 常数与常数定义
常量定义形式
#define 标识符 常量
用定义的一个标识符来代表一个常量,
称为符号常量
# 宏命令专用定义符号
define 命令
标识符 宏替换名(一般采用大写字符)
二、常数定义与符号常量
常量定义实常量定义实
例例
注意:符号常量与变量不同,它的值在程
序运行过程中不能改变,也不能重新赋值。
§2-2 常数与常数定义
整型常量(3种形式)
10进制
8进制
16进制
实型常量(2种形式)
十进制
指数
字符常量
字符串常量
一、常数
:0 ~9
整型常量实整型常量实
例例
:0 ~7 以数字0开头
:0 ~9,A~F/a~f,以0x或0X开头
:符号、整数、小数点和小数
:用e或E和表示指数部分
实型常量实实型常量实
例例
字符常量字符常量
字符串常量字符串常量
§2-2 常数与常数定义-常量定义实例
常量定义实例
#define ONE 1
#define PAI 3.1415926
#define TV ”television”
#define MAX 10
#define TWO ONE+ONE
使用方法
a=8+2;
printf(”%s”,”television”);
s=3.14159*r*r;
int array[10];
返返
回回
a=b+a=b+TWOTWO;;
printf(”%s”,printf(”%s”,TVTV););
s=s=PAIPAI*r*r;*r*r;
int array[int array[MAXMAX];];
注:符号常量名一般用大写,变量用小写。
符号常量在程序的执行部分不能再赋值。
3.2.2 变量
值在程序执行过程中可随时改变的量称为
变量。一个变量在内存中占据一定的存
储单元,在该单元中存放变量的值。变
量名实际上是一个符号地址。
A 变量名
变量值
存储单元
13
变量的说明格式:
[类型修饰符] 类型说明符 变量列表;
例如:int i;
char ch, str;
long k=1, m=0x12345678;
double x, y=1;
变量说明意味着确定了:该变量
占用内存单元的数量,
数据在内存的表示方式,
数据的取值范围。
标识符(变量名)的说明
(1)标识符只能由字母、数字和下划线组成,
且第一个字符是字母或下划线。
例:sum,_total,a123-e,Basic,
m.e.12, er#we,1asd,a>b
(2)大写字母和小写字母被认为是两个不同
的字符。
(3)一般只认前面的8个字符。
变量的说明
(1)变量要先定义再使用
例:int student;
stuent=10;
(2)每个变量有一确定的类型
例:int student;
student=15;student=34.56;
(3)每个变量所进行的运算必须合法。
Float a,b,c;
a=10.4;b=3.6;c=a%b;
3.3 整型数据
3.3.1整型常量的不同表示方法:
10进制: 100 -8 0 +123
8进制: 010 024 0100
16进制: 0x38 0x10 0X10 0XFF 0xa
整型常量的类型:
1.在整型表示范围之内,根据值大小默认类型
2.在常量后面加l或L,则认为它是long int型
例如:都是long int型常量
10进制:-123L 0L 432l
8进制: 010L 024L 0100L
16进制: 0x38L 0x1000L 0XFFl x0a0000l
3.3.2整型变量
1、在内存中的存放形式。
以二进制的补码形式,占两个字节,左边一位表示
符号,“0”为正,“1”为负。
补码的表示:正数的补码与原码相同。
负数的补码是将该数的绝对
值的二进制形式,按位取反
后再加1。
如-10 的表示方法
10的原码:0000000000001010
取反 1111111111110101
再加1 1111111111110110 (-10的补码)
2.整型数据的分类
类型 比特数 取值范围
Int 16 -32768 ~+32767
Unsigned int 16 0~65535
Short 16 -32768 ~+32767
Unsigned
short
16 0~65535
Long 32 -2147483648~2147483647
Unsigned
long
32 0~4294967295
3、整型变量的定义
例: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\”,c,d);
}
4、整型数据的溢出
§2-1 数据与数据类型-int
int型数的表示范围:二进制 16bit (2Byte)
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 0 0 0 0 0 0 0 0 0 0 0 0 0 1 10 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
=1=3intint型整数的最型整数的最大值值
int型表示数的范围:- 32768 ~ 32767
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
注意:使用中要防止数据溢出注意:使用中要防止数据溢出
=-1intint型整数的最型整数的最小值值
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
=215-1=32767
=-215=-32768
§2-1 数据与数据类型-int
main( )main( )
{ int i;{ int i;
i= 1; i= 1;
i=i*2; printf(”\n i=i*2; printf(”\n
i=%d”,i);i=%d”,i);
i=i*3; printf(”\n i=i*3; printf(”\n
i=%d”,i);i=%d”,i);
i=i*4; printf(”\n i=i*4; printf(”\n
i=%d”,i);i=%d”,i);
i=i*5; printf(”\n i=i*5; printf(”\n
i=%d”,i);i=%d”,i);
i=i*6; printf(”\n i=i*6; printf(”\n
i=%d”,i);i=%d”,i);
i=i*7; printf(”\n i=i*7; printf(”\n
i=%d”,i);i=%d”,i);
i=i*8; printf(”\n i=i*8; printf(”\n
i=%d”,i);i=%d”,i);
i=i*9; printf(”\n i=i*9; printf(”\n
i=%d”,i);i=%d”,i);
i=i*10; printf(”\n i=i*10; printf(”\n
i=%d”,i);i=%d”,i);
}}
期望结果期望结果
i=2i=2
i=6i=6
i=24i=24
i=120i=120
i=720i=720
i=5040i=5040
i=40320i=40320
i=362880i=362880
i=3628800i=3628800
实际运行结果
i=2
i=6
i=24
i=120
i=720
i=5040
i=-25216
i=-30336
i=24320
产生
数据
溢出
上溢
下溢
返返
回回
例:main( )
{int a,b,;
a=32767;
b=a+1;
printf(“%d,%d\”,a,b);
}
结果为:32767,-32768
3.3.3、整型常量的类型
1、整数的范围如果在-32768~+32767,
可以是int型或 long int型。
2、整数的范围如果在-
2147483648~+2147483647,则是
long int型。
3、int 型与short int型是等同的。
4、unsigned型是无符号的,注意范围。
5、在一个整常量后加字母l或L,则认为
是long int型。
3.4 实型数据
3.4.1实型常量的表示方法
两种表示形式:十进制小数形式
指数形式:123e-4,e后面
的数必须为整数。
3.4.2实型变量
1、存放形式:占4位,按指数形式存储,
分成小数和指数部分来存放。
2.实型变量的分类
类型 比特数 有效数字 数值范围
float 32 6~7 10-37~1038
Double 64 15~16 10-307~10308
Long
double
128 18~19 10-4931~104932
3。实型数据的舍入误差
由于实型变量的有效位有限,有效位外的
数字将被舍去,所以会产生一些误差。
例:main( )
{ float a,b;
a=123456.789e5;
b=a+20;
printf(“%f”,b);
}
§ 3.5 字符型数据
字符型常量:用字符型常量:用单引号单引号括起来的括起来的单个单个字符字符
实例:实例:’’AA’’ ’’gg’ ’’ ’##’ ’’ ’00’ ’’ ’22’’
’ ’++’ ’’ ’,,’ ’’ ’;;’ ’’ ’((’ ’’ ’))’’
字符定界符:字符定界符:单引号单引号 ’’
还有一种特殊形式的字符常量还有一种特殊形式的字符常量,,以以“\”“\”开头的字符序列开头的字符序列..
见表见表3.3.3.3.
返返
回回
如何表示不可显示字符? 回车/退格/TAB?
如何表示定界符? ’’’ 产生歧异
转义符\:将\后面的字符转换为其它含义
表3.3 转义字符及其含义
字符形式 含义 ASCII码
\n 换行,将当前位置移到下一行开头 10
\t 水平制表(跳到下一个tab位置) 9
\b 退格,将当前位置移到前一列 8
\r 回车,将当前位置移到本行开头 13
\f 换页,将当前位置移到下页开头 12
\\ 反斜杠字符“\” 92
\‘ 单引号字符 39
\“ 双引号字符 34
\ddd 1到3位8进制数所代表的字符
\xhh 1到2位16进制数所代表的字符
3.5.2 字符变量
每个字符变量只能放一个字符.
字符变量在内存中是以二进制的形式来
存放的,与整形数据可以通用.一个字符
数据既可以用字符形式来输出,也可以用
整形形式来输出.C语言允许字符与整数
直接进行算术运算.
例子1:
main( )
{ char c1,c2;
c1=97;c2=98;
printf(“%c %c\n”,c1,c2);
printf(“%d %d\n”,c1,c2);
}
例子2:
main( )
{ char c1,c2;
c1=‘a’;c2=‘b’;
c1=c1-32;
c2=c2-32;
printf(“%c %c\n”,c1,c2);
printf(“%d %d\n”,c1,c2);
}
3.5.4 字符串常量
字符常量是由单引号括起来的,字符串常
量是由双引号括起来的.如“china”.
如‘a’和“a”是两个不同的概念.
C语言规定:每个字符串是以‘\0’为结
束标志的.所以“a”其实在内存中是占
两个字节的位置,而‘a’在内存中是占
一个字节的位置.
Char c
C=“a” (X)
§2-2 常数与常数定义-字符串常数
实例:”This is C string.”
”a”
” ” (1个空格)
”” (不含空格)
串定界符:双引号 ”
字符串长度:字符串中包含的字符数量。
返返
回回
串长=17
串长=1
串长=1
串长=0
"\t\"Name\\Address\n" 串长=15
空串
实例:
"\"C is very easy.\"" 串长=17
注意: 字符串"a" 与 字符’a’ 的区别
"He said\"ok.\"\n" 串长=13
3.6 变量赋初值
对变量,可以在定义时给定初值
如int a=3,b,c;
float f=3.14;
char c=‘a’;
但不能 int a=b=c=3;
int a=3,b=3,c=3;
a=b=c=3;
3.7 各类数值型数据间的混合运算
高double float
long
unsigned
低 int char,short
3.8 算术运算符和算术表达式
3.8.1 C运算符简介
1、算术运算符 +、—、*、/、%
2、关系运算符 >、 =、
12、下标运算符 [ ]
13、其它运算符
3.8.2 算术运算符和算术表达式
1、基本的算术运算符
2、算术表达式和运算符的优先级与结合性
先乘除后加减,同一级的结合方向“自左而
右”
§ 运算符和算术表达式
一、算术运算符
运算符(双目运算符/单目运算符)
+ 加法运算 12 正值运算 14
- 减法运算 12 负值运算 14
* 乘法运算 13
/ 除法运算 13
% 求余运算 13
优先级:* / % 同级(高),+ - 同级(低)
结合性:相同优先级运算符进行运算时的次序
自左向右(标记为 → )
§ 运算符-算术运算实例
1.参加运算的对象都是int型,结果截取为int型
10/3 11/3
10.0/3 11/311/3..
1/2 1./2
10/5*3 10/(5*3)
2.求余运算的对象必须是整型
9%3 1%3
10%3 10%-3
-10%3 -10%-3
=3 =3
=3.3333 =3.66667
=0 =0.5
=6 =0
=0 =1
=1 =1
=-1 =-1
3、强制类型转换运算符
格式:(类型名)(表达式)
如 float x,y;
x=5.67;y=78.6;
(int)x+y 的结果为83.6 x=5.67
(int)x 5
(int)(x+y) 84
§4 自增、自减运算符
运算符((单单目目 ←← ))
++ 自增自增 1414
– – 自减自减 1414
++和– –为单目运算,只能作用于变量
只能对int、char、long和指针变量进行运算
功能:
++x x=x+1 (前缀:使用X之前,先改
– –x x=x–1 变X的值)
x++ x=x+1 (后缀:使用X之后,再改
x– – x=x–1 变X的值)
自增(自减)有前缀和后缀之分。
前缀形式: 先自增(自减)再引用
后缀形式: 先引用再自增(自减)
前缀与后缀的区别:
y=++x; x=x+1; y=x;
x先加1再赋值
y=x++; y=x; x=x+1;
x先赋值再加1
如 I=3;
j=++I-4; (j=0,l=4) j=I++; (j=3,l=4)
说明:
1、自增或自减,只能用于变量,不能用
于常量和表达式。
2、++或- -的结合方向是“自右至左”
j=(-I)++ 相当于j=-(I++)(j=-3,I=4)
不要使用这种表达式:
I+++I+++I++
§2-4 运算符-自增自减运算实例
实例
(1) ++i; i++;
因为在表达式中没有其它运算,结果一样。
(2) x=1; y=++x;
结果: x=2,y=2 y=++x; x=x+1; y=x;
在做赋值运算之前,x先加1,然后将x赋给y
(3) x=1; y=x++;
结果: x=2,y=1 y=x++; y=x; x=x+1;
先将 x 赋值给 y ,然后 x 再加1
x=3, z=3
x=3, y=6, z=3*6=18
x=3, y=6, z=2*6=12
x=3, y=6, z=3*5=15
x=3, y=6, z=2*5=10
x=4, z=4*4=16
注意,以下操作是错误的:
x = ++(i+j)+1;
j = ++ (5+x);
y = ++x * ++x;
§自增自减运算实例
实例
已知:int x = 2, y = 5, z;
z = ++x;
z = ++x * ++y;
z = x++ * ++y;
z = ++x * y++;
z = x++ * y++;
z = ++x * ++x;
逻辑虽然正确
,但实际编程
中容易产生误
解,应当避免
§自增自减运算实例
实例实例
已知:已知:int i=1, j=2, k;int i=1, j=2, k;
k=i+++j;k=i+++j;
C C语言处理运算符(标识符)时,遵循语言处理运算符(标识符)时,遵循自左向右自左向右组合组合
的原则,两个的原则,两个‘‘++’’号是一个运算符,故处理成号是一个运算符,故处理成
((i++i++)+j)+j。。
k = i+k = i+++++++++jj; ;
不能编译通过。原因是编译器将不能编译通过。原因是编译器将前两个前两个‘‘++’’处理成处理成
自增,接下来又将两个自增,接下来又将两个‘‘++’’号处理为自增,故不合语号处理为自增,故不合语
法。法。
编程者可用空格或括号来表示正确的含义:编程者可用空格或括号来表示正确的含义:
k=ik=i++++ + + ++++j;j;
注意:一般不要用这样的语句。注意:一般不要用这样的语句。
3.9 赋值运算符和赋值表达式
1、赋值运算符:=
2、类型转换
如果=两边类型不同,将右边的表达式结果转
为左边的类型。
如 int I; float f; double d;
I=3.45 ; (I的结果为3)
f=23; (f的结果为23.00000)
d=123.4536777;f=d; (f的结果为123.4537,
取七位有效数值)
d=123.456789e100;
f=d; (f的结果发生溢出的错误)
(1)、将int\short\long型数据赋给char型
时,只将低8位传送。
Int I=289; (100100001)
Char c;
C=I (低8位的结果为33 ,对应为!字符)
(2)、将unsigned int 型数据赋给 int 型
变量时,注意符号。
unsigned int a=65535;
Int b;
b=a; (b的结果为-1)
3、复合的赋值运算符
在赋值运算符“=”之前加上其它运算符,
可以构成复合的运算符。
如:a+=3 ( a=a+3 )
x*=y+8 ( x=x*(y+8) )
x%=3 ( x=x%3 )
4、赋值表达式
注意:赋值表达式是右结合律的。
如:a=b=5 a=(b=5)
a=b=4+c=6 a=(b=4)+(c=6)
a=12;
a+=a-=a*a; ( a-=a*a a=a-a*a a=-132
a+=-132 a=a+(-132) a=-
264)
赋值操作不仅可出现在赋值语句中,也可以以
表达式形式出现在其他语句中(如输出或 循
环语句)。
b=3;
printf(“a=%d”,a=b);
结果为 a=3
3.10逗号运算符和逗号表达式
格式为: 表达式1,表达式2
(先求表达式1,再求表达式2,结果取表达式
2的值)
注意:逗号运算符的运算级别最低,低于赋值
运算符。
如:
a=3;
a=3*5,a*4 (a的结果不等于12,而是逗号表
达式的结果为60)
X=(a=3,6*a) x的结果为18
X=a=3,6*a x的结果为3,整个表达式的结
果为18
逗号表达式的扩展为:
表达式1,表达式2,…….表达式n
§2-8 综合举例
1、运算符有优先级,在C语言中关于运算符
优先级的正确叙述是 。
A) 逻辑运算符高于算术运算符,算术运算
符高于关系运算符
B) 算术运算符高于关系运算符,关系运算
符高于逻辑运算符
C) 算术运算符高于逻辑运算符,逻辑运算
符高于关系运算符
D) 关系运算符高于逻辑运算符,逻辑运算
符高于算术运算符
答案:B
§2-8 综合举例
2、在以下关于C语言的不严格的叙述中,错误的是
A)大写字母和小写字母的意义相同
B)有些不同类型的变量可以在一个表达式中运算
C)在赋值表达式中等号(=)左边的变量和右边的值可
以是不同类型
D)同一个运算符号在不同的场合可以有不同的含义
答案:A
3、C语言中的简单数据类型包括 。
A)整型、实型、逻辑型
B)整型、实型、字符型
C)整型、字符型、逻辑型
D)整型、实型、逻辑型、字符型
答案:B
§2-8 综合举例
4、在C语言中,错误的int类型的常数是 。
A) 32768 B) 0 C) 037 D) 0xAF
答案:A
5、下列常数中不能作为C的常量的是 。
A) 0xA5 B) 2.5e-2 C) 3e2 D) 0582
答案:D
6、在C语言中,十进制的47可等价地写为 。
A) 2f B) 02f C) 57 D) 057
答案:D
7、 已 知 : int a=4,b=5,c;则 执 行 表 达 式
“c=a=a>b”后变量a的值为 。
A) 0 B) 1 C) 4 D) 5
答案:A
§2-8 综合举例
8、下列可以正确表示字符型常数的是
A) "a" B) ’\t’ C) "\n" D) 297
答案:B
9、以下错误的转义字符是
A) ’\\’ B) ’\’’ C) ’\81’
D) ’\0’
答案:C
10、已知:float x=1,y;则:y=++x*++x的结果是
A) y=9 B) y=6 C) y=1 D) 表达式是错误的
答案:D
11、已知:char ch=’A’;则下列表达式的值是
ch = (ch>=’A’&&ch