第一章 软件开发概述
1 程序语言的发展
机器语言(语言)——汇编语言(机器语言的一种助记符)——高级语言(面向客户)。
2 进行程序设计的4个步骤:
A 分析问题,建立数学模型;
B 确定数据结构和算法;
C 编制程序;
D 调试程序。
3 算法
A 什么是算法?
解决问题确定的方法和有限的步骤称为算法。
B 算法的基本特征:
a 有穷性;
b 确定性;
c 有效性;
d 有零个或多个输入;
e 有一个或多个输出。
4 编码的实现
源代码——编译器 ——目标代码——链接程序——可执行程序——运行
源代码:被转化成二进制指令存储到二进制文件中。
编译器:高级语言——二进制语言。
链接:用多个库来链接目标程序。
库:预先编译好的函数结合。
函数:方法。
5 程序中常出现的语法错误:
A 语法错误
B 逻辑错误
C 开发错误
D运行时错误
第二章 编程语言的概述
一 编程语言的基本组成
1. 字符集
数字字符、拉丁字母、运算符、特殊符号和不可显示字符。
2. 标识符
C语言规定,标识符有C语言字符集中的字母,数字或下划线组成。
它的第一个字符必须是字母或下划线。C语言还规定,标示符中同一个字母的大写小写被看做是不同的字符,
这样,a和A,AB和Ab是互不相同的标示符。
下面是一些合法的标识符:
call_name
test39
_string1
下面是不合法的标识符:
call,,,name (非字母数字下划线组成的字符序列)
39test (非字母或下划线开头的字符序列)
-string (菲字母或下划线开头的序列)
3. 关键字
4. 语句:
选择语句:if、switch
流程控制语句及循环语句:for、while、do_while
表达式语句
复合语句
空语句。
5. 标准函数库
Stdio.h 标准输入输出库 math.h 数学库 string.h 字符串库
#include <头文件> 引入内部函数
#include <头文件> 引入外部函数
二,C程序的基本结构
快速简介:
#include <stdio.h> 包含一个文件
Int main (void) 函数名
// 注释
{ 函数体的开始
Int num ; 声明语句
Num = 1; 赋值语句
Printf (“ ”); 一个函数调用语句
Printf(“ \n”); 又一个函数调用语句
Printf(“%d ”); 输出 赋值语句 值的位置和形式
Return 0; 返回语句
} 结束
C语言的上机执行过程
1. 编辑C源程序
2. 编译C远程序
3. 程序连接
4. 运行程序
第三章 数据储存与输入输出
一 数据可以分为两大类:
整型和浮点型
上面两大类又包含了多种数据类型:
数据类型 关键字 占用字节数 取值范围
字符型 char 1 -2^7—2^7-1
无符号字符型 unsigned char 1 0—2^8-1
短整型 short 2 -2^15—2^15-1
无符号短整型 unsigned short 2 0—2^16-1
整型 int 4 -2^31—2^31-1
无符号整型 unsigned int 4 0—2^32-1
长整型 long 4 同int
无符号长整型 unsigned long 4 同unsigned int
单精度型 float 4 -10^-37—10^38
双精度型 double 8 -10^-307—10^308
长双精度型 long double 12 -10^-4931—10^4931
注:
char的长度为一个字节。
short的长度不会超过long。
int的长度不会超过lkong。
unsigned的长度等于int。
float的长度不会超过double。
二 数据在编程语言中的表现形式
1 字面量:
A 整型常量:
整型常量也称整数,表示现实世界中没有小数点的数字。
B 实型常量:
亦被称为实型数或浮点数,表示现实世界中带有小数点的数字
C 字符型常量:
对现实世界中的字符,编程语言中字符常量表示。
C语言中字符常量是括在一对单引号内的一个字符,列如:
’A‘,’b‘,’*‘
还有常用的转义标示符序列的字符常量(即用转义标示符"\"表示)
\n 换行
\t 水平跳格
\b 退格
\r 回车
\f 走纸换页
\\ 反斜线字符
\' 单引号字符
'''' 双引号字符
\ddd 1至3位八进制数表示的字符
\xdd 1至2位十六进制数表示的字符
D 字符串常量
2 符号常量:其形式为: #define 标示符 常量
注:
用define定义符号常量的结尾不能加分号,它不是一个语句。习惯上人们把符号常量名用大写字母表示。
三 使用变量储存数据
1 变量名:
a 变量名必须是以字母字符开头;也可以是下划线开头,但是不推荐这样做;
b 在变量名中的任意地方都可以使用任何字母 、数字或下划线;
c 变量名长度不限;
d 变量名不允许出现空格或非字母字符,比如+或-;
e 变量名不能是C语言的关键字;
f 变量名对大小写敏感。
2 .声明变量:其格式为:
数据类型声明符 变量名;
注:可以在同一行中声明多个同一类型的变量,只需将变量名用逗号隔开即可。
3.初始化变量(赋值)应注意不要把变量初始化为其他数据类型取值之外的值。
五 、数据的输入与输出
1.格式化输出函数printf:其调用的一般形式:printf(“格式控制字符串”,输出列表)
2.格式字符串的一般形式:[标志] [输出最小宽度] [.精度] [长度] 类型
3.格式化输入函数scanf:其调用的一般形式:scanf(“格式控制字符串”,地址列表)
注:地址列表中必须有取址符号“ & ”。
4、使用printf和scanf函数时,要在最前面加上#include“stdio.h”
5、printf可以只有一个参数,也可以有两个参数。
6、printf(“ 第一部分 ”,第二部分 );把第二部分的变量、表达式、常量以第一部分的形式展现出来!
7、
格式说明 表示内容
%d int
%ld long int
%f float
%c char
%s 字符串
举例说明:
printf(“%2d”,123 ); 第二部分有三位,大于指定的两位,原样输出123
printf(“%5d”,123 ); 第二部分有三位,小于指定的五位,左边补两个空格 123
printf(“%10f”,1.25 ); 小数要求补足6位的,没有六位的补0,。结果为 1.250000
printf(“%5.3f”,125 ); 小数三位,整个五位,结果为1.250(小数点算一位)
printf(“%3.1f”,1.25 );小数一位,整个三位,结果为1.3(要进行四舍五入)
七
8、scanf(“a=%d,b=%d”,&a,&b)
一定要记住是以第一部分的格式在终端输入数据。
在黑色屏幕上面输入的为 a=12,b=34才可以把12和34正确给a和b 。
9、特别注意指针在scanf的考察
例如: int x=2;int *p=&x;
scanf(“%d”,p);
补充:
1)scanf函数:
注意该函数的第二个部分是&a 这样的地址,不是a;
scanf(“%d%d%*d%d”,&a,&b,&c); 跳过输入的第三个数据。
2)如何实现两个变量x ,y中数值的互换
不可以把 x=y ,y=x; 要用中间变量 t=x;x=y;y=t。
第四章 运算符 表达式 语句
一 表达式
1 简单表达式:只包含单独的一个操作数;一个简单变量,字面常量或符号常量。
2 复杂表达式:由多个更简单的表达式组成。
二 运算符
1 算术运算符 即“+”,“-”,“*”,“/”,“%”。
2 赋值运算符 使用赋值运算符“=”给变量赋值。
3 增量和减量运算符
A前缀形式:其语法为:++变量;--变量;表示变量在使用前自动加1或减1.
B后缀形式:其语法为i:变量++;变量--;表示变量子使用后自动加1或减1.
4 关系运算符 即“==”,“!=”,“<”,“>”,“<=”,“>=”.
5 逻辑运算符 即“&&”,“||”,“!”.
6条件运算符 其形式为:表达式1?表达式2:表达式3
在条件运运算符中,表达式1是关系表达式,而表达式2和表达式3可以是任意表达式,例:
a>b?printf("%d",a):printf("%d",b)
这条语句表示如果a>b,则输出a的值,否则输出b的值
7 数据类型强制转换符 其中类型级别从高到低的级别为 longdouble double float unsigned long long
unsigned int int
8 特殊运算符 如:sizeof
三 语句
1 流程控制语句:其分为了选择类、循环类、控制类
2 表达式语句:表达式后跟一个分号构成表达式语句
3 复合语句:用大括号括起的一条或多条语句
4 空语句:由一个分号构成
5 赋值语句:使用时应注意“=”的左侧一定代表内存中某储存单元,通常变量,a+b=12;是错误的
第五章 选择结构的程序设计
1.简单的if语句:
if(表达式) {
语句1
}
功能:计算表达式的值,若为真,则执行语句1,否则将跳过语句1执行if语句的下一条语句。
2.if - else语句:
if(表达式){
//语句1
}
else{
//语句2
}
功能:计算表达式的值,若表达式的值为“真',执行语句1,并跳过语句2,继续执行if-else语句的下一条语句;
若表达式为”假“,跳过语句1,执行语句2,然后继续执行if-else语句的下一条语句。
3.嵌套形式1:if(表达式1)
if(表达式2) 语句1
else 语句2
else 语句3
嵌套形式2:if(表达式1){
if(表达式2) 语句1 }
else 语句2
嵌套形式3:if(表达式1)
语句1
else if(表达式2)
语句2
else
语句3
4.switch语句
switch (表达式){
case常量表达式1:语句1
case常量表达式2:语句2
......
case常量表达式n:语句n
default:语句n+1
}
功能:首先计算表达式的值,然后依次与常量表达式i(i=1,2,3....n),若表达式的值与常量表达式j相等,
则从常量表达式j处开始执行,直到switch语句结束。若所有的常量表达式i(i=1,2,3.....n),均不等于表达式,
则从default处开始执行。
5 break语句
break;
功能:终止它所在的switch语句或循环语句的执行。
说明:break语句出现在switch语句或循环语句中。
6.嵌套 switch 语句。
三 无条件转向语句
1.C语言中的goto语句可以转向同一函数内任意指定位置执行,称为无条件转向语句。
2.goto语句的语法形式如下:
goto 语句标号;
......
语句标号:
功能:goto语句无条件转向语句标号所标识的语句执行。它将改变顺序执行方式
说明:语句标号用标识符后跟冒号表示。如:
......
goto k ;
......
k :
goto语句与相应的语句标号必须处在同一个函数中,不允许跨两个函数。
第六章 循环结构的结构设计
一 循环的基本概念
1.当型循环
2.直到型循环
二 用while 语句设计循环结构程序
用while语句可以设计当型循环结构程序。while语句的语法形式为:
while (表达式)
循环体语句
功能:首先计算表达式的值,若为“真”,则执行循环体语句,执行完毕后,在计算表达式的值,若仍为“真”,
则重复执行循环体语句。直到表达式的值为“假”时,结束while语句的执行,继续执行while语句后面的语句。
说明:1、表达式是控制循环的条件,它可以是任何类型的表达式;
2、循环体语句语法上定义为一条语句,若循环体含有多条语句,则必须用花括号把它们括起来,成为复合语句;
3、while 语句的特点是:先判断,后执行。若表达式一开始就为“假”,则循环一次也不执行。
三 用do_while 语句设计循环结构程序
do_while 语句可以设计“直到型”循环结构程序。do_while 语句的语法形式为:
do {
循环体语句
}while (表达式);
功能:先执行循环体语句,然后检测循环控制条件表达式的值,若为“真”,则重复执行循环体语句,否则退出循环。
说明:1、do_while 语句的表达式是任意表达式,是控制循环的条件;
2、do_while 语句的特点是先执行后判断,因此,循环体至少执行一次;
3、do_while 语句实现的循环与6.1节叙述的“直到”型循环有所不同,它重复执行循环体,直到表达式为“假”才退出循环。
四 、用 for 语句设计循环结构程序
for 语句是C语言中最灵活功能最强的循环语句。for 语句的语法形式如下:
for (表达式1;表达式2;表达式3)
循环体语句
功能:首先计算表达式1的值;然后检测表达式2的值,若其值为“真”,则执行循环体语句。执行完毕后,
在计算表达式3。然后,再检测表达式2的值是否为“真”,若为“真”,继续执行循环体语句,......若为“假”,则终止循环。
说明:表达式1通常是为循环变量赋初值的表达式;表达式2 是控制循环的表达式;表达式3 通常是改变循环变量值的表达式。
五 、break 语句和 continue 语句
1、break 语句:
break可以出现在循环语句中,break语句的语法形式为:
break ;
功能:终止它所在的switch语句或循环语句的执行。
说明:break 语句只能出现在switch语句或循环语句的循环体中。
(百位数:n/100;十位数:n/10%10;个位数:n%10)
2、continue 语句
语法形式:
continue;
功能:结束本次循环(不是终止整个循环),即跳过循环中continue语句后面的语句,开始下一次循环。
六 、几种循环语句的比较
1. for 语句和 while 语句先判断循环控制条件,后执行循环体;而 do_while 语句 是先执行循环体,
后进行循环控制条件的判断。for 语句和while语句可能一次也不执行循环体;而do_while 语句至少执行一次循环体。
for和do_while 循环属于“当型”循环;而do_while 循环属于“直到型”循环。
2.do_while 语句和while语句多用于循环次数不定的情况。对于循环次数确定的情况,使用for语句更方便。
七 、编写循环体时应注意以下几点:
1、确定循环体内包含一个语句使用循环体最终结束;
2、确定循环体正确的循环次数;
3、如果想执行循环体N次,那么就让初始化计数器counter为0,使用测试条件counter < N;
或者让初始化计数器counter为 1 ,使用测试条件counter <=N。
第七章 数组和字符串
一、数组的基本概念
所谓数组,就是按照一定顺序排列,具有某种相同性质的同种类型的集合。
这些变量具有相同的名字和数据类型,在内存中顺序排列,并通过下标相互区分,
所以也叫下标变量。数组中的各数据项称为数组元素,用数组名和下标表示。
例:
int a[8] 表示定义了一个由8个元素组成的整型数组。
二 、一维数组
1.一维数组的定义:定义一维数组的形式为:
数据类型 数组名 [整型常量表达式];
例:
int a[5],b[12]
该语句表示:定义了一个整型数组a和b,七数组元素类型都是int。
a数组有5个数组元素,b数组有12个数组元素。
a数组的数组元素是a[0],a[1],a[2],a[3],a[4]共5个数组,所以a元素的下标大于0,且小于5。
2.一维数组的引用:引用数组,实际上是引用它的数组元素。引用数组元素的形式为:
数组名 [下标表达式]
例:
int a[5]
如果,i=1,j=2,k=4,则a[k],a[j-1],a[j+i]都是对a数组元素的合法引用。
注意:定义时整型常量表达式与引用时的数组元素的下标表达式是完全不同的概念。
系统不检查数组元素下标是否越界,只能由编程者自己掌握。下标越界会破坏其它变量的值,
因此编程时一定要保证数组元素下标不越界。
3.一维数组的初始化:变量可以初始化,一维数组也可以在定义的同时为各数组元素赋初值。
一维数组初始化的形式为:
数据类型 数组名 [整型常量表达式]={初值1,初值2,......};
三 、二维数组
1.二维数组的定义:
数据类型 数组名 [整型常量表达式] [整型常量表达式] ,......
例:
int a[5][3]
该语句表示:
定义了整型二维数组a,其数组元素的类型是int。
a数组有2行3列,共2*3=6个数组元素。
a数组行下有0,1,列下有0,1,2。a数组的数组元素是;
a[0][0],a[0][1],a[0][2]
a[1][0],a[1][1],a[1][2]
2.二维数组的引用:
数组 [行下标表达式] [列下标表达式]
3.二维数组的初始化:
数据类型 数组名 [整型常量表达式] [整型常量表达式] = {初始化数据};
四 、字符数组与字符串
每个字符占用一个字节,此数组中必须包含一个‘\0’字符,代表字符串的结尾。
第八章 复杂数据类型
一 结构体
1.结构体类型的声明:
struct 结构名 {
数据类型1 成员名1 ;
数据类型2 成员名2 ;
......
数据类型n 成员名n;
};//分号是必须的
2.声明结构体类型的变量
struct 结构名 结构变量1,结构变量2,......结构变量n;
3.访问结构体变量的成员:结构变量名 . 成员名
二、共用体
共用体由若干个数据类型组合而成。和结构体型不同的是,共用体数据中所有成员都占用相同的内存单元,设置这种数据类型的主要目的就是节省内存空间。
union 共用体名
{
数据类型1 成员名1;
数据类型2 成员名2;
…
数据类型n 成员名n;
}共用体变量名;
例如
union data
{
int i;
char ch;
float f;
}a,b,c;
也可以将类型声明与变量定义分开:
union
{
int i;
char ch;
float f;
}a,b,c;
当然,也可以直接定义共用体变量:
union data
{
int i;
char ch;
float f;
}a,b,c;
注意:
(1)同一内段可以用来存放几种不同类型的成员,但每一瞬时只有一个成员起作用。
(2)共用体变量中前一次起作用的成员在存入新的成员后原有的成员失去意义。
(3)共用体变量和它的所有成员的地址都是同一地址。
(4)不同对共用体变量赋值,也不能在定义共用体变量时对其初始化。
三、枚举
1)枚举型定义的一般语法形式为:
enum 枚举名 {
标识符[=整形常数],
标识符[=整形常数],
...
标识符[=整形常数],}
例如,如下代码声明了一个举枚类型weekday:
enum weekday{mon, tue,wed, thu,fri,sat,sum};
随后,我们就可以用这个举枚类型来定义变量,如:
enum weekday workday,weekend;
C语言也允许在声明枚举类型同时定义枚举变量,如:
enum weekday{mon, tue,wed, thu,fri,sat,sum} workday,weekend;
这样变量workday,weekend就具有weekday举枚类型,其取值只能是mon, tue,wed, thu,fri,sat,sum
这几个值。
(2)赋初值
在给枚举常量赋初值时,如果给其中任何一个枚举常量赋初值,则后面的枚举常量将按自然数的规则依次赋初值,例如:
enum weekday{ sun,mon,tue,wed=6,thu,fri,sat };
上面的例子只给枚举常量wed赋了初值,在这种情况下,每个枚举常量的初值分别如下:
sun的值为0,mon的值为1,tue的值为2,wed的值为6,thu的值为7,fri值为8,sat值为9。
注意:
1 枚举中每个成员(标识符)结束符是“,”,不是“;”,最后一个成员可省略“,”。
2 初始化时可以赋负数,以后的枚举元素一次加1.
3 枚举变量只能取枚举说明结构中的某个枚举元素。
四 指针
1 指针的概念
所谓的指针,也称为指针变量,其内容储存了另一个变量的内存地址。
2 声明指针类型的变量
在C语言声明一个指针类型变量,也就是定义了一个指针的语法如下:
指向的变量的类型名 *指针变量名;
这里,指针变量的类型是“指向的变量的类型名 * ”,而不是“指向的变量的类型名”。例如
int *p
这里,变量p的类型为int*,而不是int、指针变量p可以储存任何int类型的变量的地址。
3 指针的使用
我们可以使用间接运算符*,来访问被一个指针指向的变量的值。假设我们声明了如下变量:
int number = 15;
int *pointer=&number;
int result = 0;
因为指针变量pointer包含了变量number的地址,所以可以按照如下方式,在一个求和的表达式中使用它:
result = *pointer + 5;
表达式*pointer等于pointer包含的地址中存储的值,而存储在number中的值为15,所以result的值最后为20.
说明:
间接运算符*可以让我们访问被一个指针指向的变量的值。
取址运算符&可以让我们获得一个变量的内存地址。
第九章 模块化程序设计方法与函数
1 函数的定义
函数的定义就是写出函数的全部内容来,即完成函数功能的程序块,它的一般格式为:
函数类型 函数名称(形式参数表){
说明语句序列
可执行语句序列
}
其中前两行构成函数的头,后面的用一对花括号括起来的部分构成函数。
2 函数的参数
从函数的形式上看,函数分为两类:无参形式,有参形式
无参函数的一般形式:
类型标识符 函数名(){
声明部分
语句
}
有参函数的一般形式:
类型标识符 函数名(形式参数表列){
声明部分
语句
}
有参函数比无参函数多了一个内容,即形式参数表列,在形参表中给出的参数成为形式参数,
他们可以是各种类型的变量,各参数之间用逗号隔开。
3 函数的返回值
从函数的值来看,函数分为两类:
无返回值的函数:即Void函数,吴函数值的函数,一般用来执行指定的一组,类似于其他高级语言中的过程。
有返回值的函数:调用函数后,可以通过函数名带回函数值供主调函数使用。
函数的返回值由return语句返回。一般格式为:
return 表达式;