一。
计算机系统,软件,系统软件,程序设计语言与语言设计程序,面向对象程序设计语言:C++。
§1.2 C语言的特点(P2)
1.语言简洁、紧凑、灵活。(32个关键字,9个控制语句)
2.运算符丰富(34种表达式)
3.数据结构丰富
4.具有结构化的控制语句
5.目标代码质量高,程序执行效率高
6.可移植性好
7.兼有低级语言和高级语言的特点
8.语法限制不太严格,程序设计自由度大§1.3 简单的C语言介绍
C程序的结构特点和书写格式
2. 一个函数由两部分组成
函数的说明部分函数体
函数体:{
[说明部分]
执行部分
}
3. 一个C程序总是从main函数开始执行
4. 语句以分号;结束
5. 书写格式自由
6. 用/*…*/做注释
int max(int x,int y) /*子函数*/
{
int z;
if (x>y) z=x;
else z=y;
return(z);
}
void main() /*主函数*/
{
int a,b,c;
scanf(“%d%d”,&a,&b);
c=max(a,b);
printf(“max= %d\n”,c);
}
§1.4 C程序的上机步骤
1.编辑
生成C源程序文件,扩展名为.C 2.编译
生成目标文件,扩展名为.OBJ
3.连接
将目标文件和库函数及其他目标程序连接起,生成可执行文件,文件扩展名为.EXE 4.运行
运行程序,得到结果
§2.1 算法概念
3.算法的特性(P.18):有穷性、确定性、有效性等
一、结构化程序的三种基本结构:顺序、选择、循环
§3.1 C 语言的基本元素
一、符号集(字符集)
C语言使用的基本符号共有如下五种:(1)大写字母:A~Z
(2)小写字母:a~z
(5)标点符号和运算符
(3)阿拉伯数字:0~9
(4)下划线:_
, 逗号( 左圆括号> 右尖括号% 百分号
. 圆点) 右圆括号! 感叹号& and(与)
; 分号[ 左方括号| 竖号^ xor(异或)
: 冒号] 右方括号/ 斜杠* 乖号? 问号{ 左大括号\ 反斜杠- 减号… 单引号} 右大括号~ 波析号= 等于号“ 双引号< 左尖括号# 井号+ 加号二、标识符用来标记常量、变量、函数及文件名字的字符序列
标识符的构成规则:
?以字母(大小写皆可)或下划线开头
?随后可跟若干个(包括0个)字母、数字、下划线
?标识符的长度各个系统不同,最好不要超过8个字符
如:x y3 _imax ELSE X A_to_B (合法)
7x int #No bad one re-input (不合法)
注意:区分大小写。如:sum、Sum是二个标识符
三、关键字它是C语言中具有特定含义、专门用作语言特定成分的一类标识符
§3.2 C 的数据类型
数据类型
基本类型整型int
实型(浮点型)单精度float
双精度double
字符型char
构造类型
指针类型
空类型
§3.3 常量和变量
一、常量和符号常量
1、常量:在程序运行过程中,其值不能被改变的量
常量区分为不同类型(表示形式)
如:12、3.2、…a?
2、符号常量:
用一个标识符代表的一个常量
定义方法:
#define 标识符常量
例3-1
#define PRICE 30
void main()
{
int num,total;
num=10;
total=num*PRICE;
printf(“total=%d”,total);
}
二、变量
1、变量:其值是可以改变的量,它用标识符(变量名)来表示,在内存中占据一定的存储单元。
2、变量的定义方法
类型符标识符
3、注意事项:
①见名知意
②先定义后使用
③习惯上,符号常量名用大写,
变量名用小写,以示区别
3-1
#define PRICE 30
void main()
{
int num,total;
num=10;
total=num*PRICE;
printf(“total=%d”,total);
}
§3.4 整型数据
一、整型常量
①十进制常数
如:123、-34、0
②八进制常数
由0~7数字组成;最高位必须用0作引导符
如:0123 (123)
③十六进制常数
由0~9、a~f(A~F)组成;最高位必须用0x(0X)作引导符
如:0x123 (123)
注意:复习二、八、十、十六进制的转换。
30 036 0x1E
二、整型变量
1、整型数据在内存中的存放形式
数据在内存中以二进制的补码表示:1、整型数据在内存中的存放形式
数据在内存中以二进制的补码表示:整型变量根据其数值的范围,可以将变量定义为三类:
基本整型(int)2 短整型(short int)2 长整型(long int)4
为了充分利用变量的表数数是范围,又可以将变量定义为:
有符号数(signed)(可省略)无符号数(unsigned)
2、整型变量的分类
有符号型
基本型:以int 说明,占用2字节。如:int i,sum;
短整型:以short int 或short说明,占用2字节。如:short s,sum;
长整型:以long int 或long说明,占用4字节。如:long l,sum;
无符号型(存放没有符号的整数)
无符号整型:以unsigned int或unsigned说明,占用2字节。
如:unsigned ui,sum;
无符号短整型:以unsigned short说明,占用2字节。
如:unsigned short us,sum; 无符号长整型:以unsigned long说明,占用4字节。
如:unsigned long ul,sum;
3. 整型变量的定义
例如:
int a,b;
long num,i,j;
unsigned short c,d;
§3.4 实型数据
一、实型常量
实数又称浮点数。有两种表示形式
1、十进制数形式如:0.345、.345、345.0、345.、0.0、0..、.0
2、指数形式如:3.45e
3、3.45E3 表示3.45 ×10
注意:e前后必须有数字,e后必须为整型数
.3e3 3e3 3.e3 3e e3 e0.3
3、类型:缺省为double;
后缀f或F,为float型;后l或L,为long double 型
二、实型变量(取值范围与值的精度与机器有关)
单精度(float型):占4个字节,7位有效数字
(3.4e-38~3.4e+38)
双精度(double型):占8个字节,15~16位有效数字
Long double型:占10个字节,15~16位有效数字
(3.4e-4932~1.1e+4932)
如:float x, y; double a, b, c;
三、实型数据的舍入误差
虽然实型数据的表示形式有两种,但在内存中均是以指数形式存放
若数据超过有效位,则被舍去,故可能产生误差。
例3-3
#include
void main()
{
float a,b;
a=123456.789e5;
b=a+20;
printf(“a=%f,b=%f\n”,a,b);
}
§3.4 字符数据
一、字符常量
1、用单引号括起来的一个字符
如:…a?、…A?、…b?、…*?、…$?
2、转义字符:特殊的字符常量,它们都以…\?开头。(代表一个字符)
输出格式控制
\n 换行符\0 空值
\t 横向跳格\v 纵向跳格
\b 退格\a 报警
\r 回车\f 走纸换页
输出字符
\\ 输出反斜杠\… 输出单引号
\ddd 1~3位八进制数表示的字符(ASCII
码)
如:…\101?代表字符…A?
\xhh 1~2位十六进制数表示的字符(ASCII码)
如:…\x41? 代表字符…A?
二、字符变量
字符变量用来存放字符,且只能存放一个字符。
定义方法:
char c1, c2;
unsigned char c3,c4;
字符型变量的赋值方法
c1=…a?; c2=…\101?;
c3=0xff; c4=…\377?;
三、字符数据的存储
1、将一个字符常量存放到一个字符变量中,是将该字符的相应的ASCII代码存放到存储单元中。
例3-4:字符的存储与输出
#include
void main()
{
char c1,c2;
c1=…a?;c2=…b?;
printf(“%c %c\n”,c1,c2);
c1=97;c2=98;
printf(%c %c\n”,c1,c2);
}
2、字符数据与整型数据可以相互赋值
3、字符数据可以以字符形式输出,
也可以用整型形式输出
例3-5
void main()
{
int i;
char c;
i=…a?;
c=97;
printf(“%c ,%d\n”,c,c);
printf(“%c ,%d\n”,i,i);
}
a , 97
a , 97
四、字符串常量1、字符串常量:用一对双引号括起来的字
符序列
如:“Hello”, “1999”, “a”2、字符串结束
标记…\0?。
每一个字符串常量结尾都有一个字符\0(一
般情况是由系统自动加上)。
如:“CHINA”在内存中为:
…a?为一个字符,“a”为两个字符
“a” a \0
在定义变量的同时设置初值,亦称初始化
如:iut a=3;
float f=3.56;
char c=…a?;
int i,j,k=5;
int x=1,y=1,z=1;
§3.8 不同类型数据间的混合运算
整型、实型(包括单、双精度)、字符型数
据间可以混合运算
例如:10+…a?+12.3-3.14* …x?是合法的
运算时,不同类型的数据要先转换成同一类型,然后进行运算
Int ——unsigned——long ——double
§3.9 算术运算符和算术表达式
一、C 运算符
1 算术运算符+,-,*,/,%
8 指针运算符*,&
2 关系运算符>,<,==,>=,<=,!=
9 求字节数运算符sizeof
3 逻辑运算符!,&&,||
10 强制类型转换运算符(类型)
4 位运算符<<,>>,~,|,^,&
11 分量运算符. , ->
5 赋值运算符=
12 下标运算符[ ]
6 条件运算符? :
13 其它
7 逗号运算符
二、算术运算符和算术表达式
,
1、基本的算术运算符
/ (除法运算符) 如:5/3
\0
A
N
I
H
C
(x+y)/(a+b)
两个整数相除,其值为整数。如:5/3值为1
除数、被除数有一个为负值时,结果“向零取整”
除数、被除数有一个为实数时,结果为double型
% (模运算符,或称求余运算符): %两侧均为整型数据
如:7%4的值为3
-7%4, 7%-4, -7%-4的值为多少?-3,3,-3 符号由被除数决定
2、算术表达式和运算符的优先级与结合型1)用算术运算符和括号将运算对象(也叫操作数)连接
起来的、符合C语言语法规范的式子,称为算术表达式
运算对象包括常量、变量、函数等
2)运算符的优先级和结合性
优先级:先*、/、% 后+、-
结合型:左结合性。即表达式从左向右进行计算
3、强制类型转换
可以利用强制类型转换运算符将一个表达式转换成所需类型
形式:(类型名)表达式
如:(double)a
(int)(x+y)
注意:与(int)x+y不同
(float)(8%5)
注意:x的类型没有改变
例3-7:强制类型转换
#include “stdio.h”
void main()
{
float x;
int i;
x=3.6;
i=(int)x;
print(“x=%f,i=%d”,x,i);
} x=3.6,i=3
三、自增、自减运算符
++i, --i
在使用i之前,先使i的值加1或减1 i ++, i--
在使用i之后,先使i的值加1或减1
注意:
(1)自增、自减运算符只能用于变量,而不能用于常量或表达式。如:5++、--(a+b)不合法
(2)++和--的优先级别高于算术运算符,结合方向是“自右向左”
如:-i++ 相当于–(i++)
§3.10 赋值运算符和赋值表达式
一、赋值运算符“=”
用法:变量=表达式
作用:将表达式的值赋给变量(常量、变量是表达式的特例)
如:a=5;
ave=(a+b)/10;
二、赋值结果与类型转换
1、实型数据(包括单、双精度)
赋给整型变量时,舍弃实数的
小数部分
2、整型数据赋给单、双精度变量时,
数值不变,但以浮点数形式存储
到变量中
例3-9
#include “stdio.h”
void main()
{
int i;
float f;
i = 5.34;
f = 23;
printf(“%d %f\n”,i,f)
}
3、长度相同的有符号与无符号整型数间,原样赋值(但数值有时会有变化)。
4、char、int、long等类型的转换
1)“短”数据赋给“长”变量
符号扩展:若最高位为1(负数),则变量高字节位补1;
反之,补0.
例3-11
#include
void main()
{
char c;
int i;
c=43;i=c;
printf(“i=%d\n”,i);
c=…\376?;i=c;
printf(“i=%d\n”,i);
}
i= 43
i=-2
4、char、int、long等类型的转换
1)“短”数据赋给“长”变量
2) “长”数据赋给“短”变量
只将数据的低字节位原封不动送到变量中(数据有可能有差错)
例3-12
#include
void main()
{
int i;
long L=6324232L;
i=L;
printf(“i=%d, L=%ld\n”,i,L);
}
三、复合的赋值运算符
在赋值符“=”之前加上其它运算符,构成复合赋值运算符
+=,-=,*=,-=,%=,<<=,>>=,&=,^=,|=
四、赋值表达式
由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”
形式:变量= 表达式
如:a=5、a=(b=5)(右结合)
计算过程: ①计算赋值运算符右侧“表达式”的值
②将计算结果赋值给左侧的变量
③赋值表达式的值就是被赋值的变量
例:a=b=c=5
a=5+(c=6)
a=(b=4)+(c+6)
例:a=b=c=5
a=5+(c=6)
a=(b=4)+(c+6)
思考:a=a+(a-(a*a))?
§3. 11 逗号运算符和逗号表达式
形式:表达式1,表达式2,…,表达式i 作用:用于连接表达式
计算过程:
①求解表达式1
②再求解表达式2,…,表达式
③整个逗号表达式的值是表达式i的值
§4.1 C语句概述
一、语句
用来对数据进行加工(完成操作任务)。是构成程序的基本单位
通常一个C程序由若干个函数(系统、用户)组成
每一个函数由若干条语句组成。每条语句总是以“;”结束
二、C 语句的分类
可分为三大类:简单语句、复合语句、空语句
(二) 复合语句:将语句括在一对{ }中
如:while(i<100)
{
sum+=i;
i++;
}
说明:①复合语句的{ }之后不能有…;?
②复合语句中可以是简单语句、复合语句、空语句
(三) 空语句:; /*仅有一个;*/
空语句什么也不做。有时用作被转向点,或为循环语句提供空体
如:for(i=0;i<=10;i++);
空语句
§4.2 赋值语句
即赋值表达式后加一;构成
要区分赋值表达式与赋值语句
如:if((a=b)>0) 表达式t=a;语句
§4.2 字符数据的输入输出
一、字符输出函数putchar
形式:putchar(C)
作用:向显示器上输出一个字符
(将C的值输出到显示器上)
C可以是字符型和整形的常量、变量、表达式
例4-2:输出控制字符、转义字符
#include “stdio.h”
void main()
{
putchar(…\101?);putchar(…\n?);
putchar(…\\?);
}
例4-1:
#include “stdio.h”
void main()
{
char c1,c2;
c1=…b?;c2=98;
putchar(c1);putchar(c2);
putchar(…b?);putchar(98);
}
CH7 数组
★数组的基本概念
★一维数组的定义和引用
三、数组概念
这些数据具有的共同的特征:
①都是由若干个分量组成
②数据的诸分量都是同一类型(可取任何数据类型)
③这些分量按一定顺序排列的
●数组:按序排列的具有相同类型的变量的集合
●用一符号名(数组名)来表示这一组数●用数组名后跟下标来唯一地确定数组中的元素
●数组的首地址、数组元素的类型和个数(数组长度)
§7.2 一维数组
一、定义一维数组
类型名数组名1[exp], 数组名2[exp], …
其中:exp为常量表达式
如:int a[10],b[5];
char c[8];
float x[20],y[4*M+1],w[5]; &&(M是符号常量) 1. 数组名命名规则和简单变量名相同
2. 数组名后只能用方括起来的常量表达式(常量和符号常量)。此用法不对:a(10),x[n]
3. 常量表达式的值确定数组元素的个数(数组尺寸)
4. 起始下标从0开始,最大下标值为数组元素个数减一;
二、一维数组的存储
用连续的内存单元存放各个元素
保存数组所需内存量与数组元素的基本类型和数组大小有关
总字节数=sizeof(基本类型)*数组元素个数如上例:总字节数=2*5=10
第i个元素的地址=第1无素的地址+i*sizeof(基本类型)
如上例:第4个元素(下标为3)的地址=1000+3*2
如:int a[5];其内存存储为:
三、一维数组的引用
数组必须先定义后引用
C语言规定只能逐个引用数组元素,而不能一次引用整个数组
引用一维数组元素的一般形式:
数组名[下标]下标从0开始
数组元素的下标常用循环变量来控制
下标可以是整型常量
或整型表达式
例如:a[0]=a[5]+a[7]-a[2*3]
例7-1 读程序
#include
void main()
{ int i,a[10];
for(i=0;i<=9;i++)
a[i]=i;
for(i=9;i>=0;i--)
printf(“%d”,a[i]);
printf(“\n”);
}
四、一维数组的初始化
1.在定义数组时对数组元素赋以初值
如:static int a[4]={1,2,3,4};
或int a[4]={1,2,3,4};
结果:a[0]=1,a[1]=2
a[2]=3,a[3]=4
注:标准C只有静态存储(static)数组和外部存储(extern)数组才能初始化,但TurtoC和Microsoft C的编译系统中,自动数组与外部存储数组均可以进行初始化
2. 给一部分元素赋初值
如:static int b[4]={1,2};
结果为: b[1]=1,b[1]=2,b[2]=0,…,b[9]=0;
注:对static数组不赋初值,系统会对所有数组元素自动赋以0值
3.若对全部数组元素赋初值时,可以
不指定数组长度。
如:int c[]={1,2,3,4,5};
自动定义c数组长度为5
注意:若被定义数组长度与提供初值的个数不相同,
则数组长度不能省略。
如:int a[10]={1,2,3,4};
例7-3:用数组来求Fibonacci数组问题F1=1
F2=1
Fn=Fn-2+Fn-1
(n≥2)
#include “stdio.h”
void main()
{ int i;
long int f1,f2;
f1=1;f2=1;
printf(“%16ld%16ld”,f1,f2);
for(i=2;i<=10;i++)
{ f1=f1+f2; f2=f2+f1;
printf(“%16ld%16ld”,f1,f2);
if(i%2==0) printf(“\n”);
}
}
#include “stdio.h”
void main()
{ int i;
static int f[20]={1,1};
for(i=2;i<20;i++)
f[i]=f[i-2]+f[i-1];
for(i=2;i<20;i++)
{
if(i%4==0) printf(“\n”);
p rintf(“%6d”,f[i]);
}
}
例7-4:统计全班某门功课期末考试的平均分数和最高分数
(设全班人数为30)
用数组实现:
#include N 30
#include “stdio.h”
void main()
{ int i,sum=0,high=0,score[N];
float average;
printf(“Input everyone?s score.\n”);
for(i=0;i scanf(“%d”,&score[i]); for(high=score[0],i=0;i { sum+=score[i]; if(score[i]>high) high=score[i]; } average=(float)sum/N; printf(“average=%f\n”,average); printf(“highest=%d\n”,high); } f[i]=f[i-2]+f[i-1] i=2~20