status
date
type
summary
tags
category
slug
password
icon
程序设计与C语言一、计算机与程序、程序设计语言二、C语言的出现和发展过程三、简单的C语言四、运行C程序五、算法的概念六、程序的三种基本结构数据的存储与运算一、数据在计算机中是怎样存储的二、位、字节和地址三、整型数据的运算与分析四、实型数据的运算与分析五、字符型数据的运算六、符号常量七、算术运算符和算术表达式八、C运算符和C表达式顺序程序设计一、C语句综述二、赋值表达式和赋值语句选择结构程序设计一、条件判断二、用if语句实现选择结构三、利用switch语句实现多分支选择结构循环结构程序设计一、程序中需要用循环结构二、用while语句和do…while语句实现循环三、几种循环的比较利用数组处理批量数据一、为什么要用数组二、定义一维数组三、二维数组的定义和引用四、字符数组用函数实现模块化程序设计一、函数是什么二、函数的定义和调用指针一、什么是指针
程序设计与C语言
一、计算机与程序、程序设计语言
- 一个特定的指令序列,用来完成一定的功能。
- 机器指令:计算机能直接识别和接受的二进制代码。
- 机器语言:机器指令的集合(机器语言是由0和1组成的指令)
二、C语言的出现和发展过程
- 最初的C语言只是为了编写UNIX操作系统提供一种工作语言而设计的;1978年以后,C语言先后移植到大、中、小、微型计算机上,称为世界上应用最广泛的程序设计高级语言;
- 计算机不能直接识别高级语言程序,需要通过编译程序的软件把用高级语言写的源程序转换为机器指令的目标程序,然后让计算机执行机器指令程序,最后得到结果。
三、简单的C语言
- 要求在屏幕上输出一行信息:This is a C program
- C程序是由函数构成的,C源程序必须包含一个main函数,可以包含若干个其他函数,函数是C程序的基本单位,被调函数可以是库函数,也可以是用户编制设计的函数,程序全部工作都由各个函数分别完成,C语言容易实现程序的模块化。
- 一个函数由两个部分组成:
- C程序是由函数构成的,一个函数由两个部分组成,程序总是从main函数开始执行,C程序书写格式自由,每个语句和数据声明的最后必须有分号,C语言本身没有输入输出语句,可以对程序中的任何一行或数行做注释//函数结束的标志。
四、运行C程序
- 上机输入和编辑源程序(.c文件)
- 对源程序进行编译(.obj文件)
- 进行连接处理(.exe文件)
- 运行可执行程序,得到运行结果
五、算法的概念
- 一个程序包含以下两个方面的内容:
- 对数据的描述。在程序中要指定数据的类型和数据的组织形式,即数据结构
- 对操作的描述。即操作步骤,也就是算法
- 著名计算机科学家沃思(Nikiklaus Wirth)提出一个公式:
六、程序的三种基本结构
- 顺序结构:各操作步骤是顺序执行的
- 选择结构:又称判断结构或分支结
- 循环结构:又称重复结构
数据的存储与运算
一、数据在计算机中是怎样存储的
- 数据在计算机都以二进制形式存储的
- 计算机内部的信息都是用二进制表示;
- 计算机存储存储器是用半导体集成电路构成的;有两种稳定的工作状态:“导”与“截止”,即电脉冲的“有“与”无“;分别用“1”和“0”表示
- 十进制数据与二进制数据之间的转换:
二、位、字节和地址
- 位(bit),又称“比特”。每一个二极管元件称为一个“二进制位”,是存储信息的最小单位。它的值是”1“或”0“;
- 字节(byte),又称“拜特”。一般将8个“二进制位”组织成一组,称为“字节”。这是人们常用的存储单位;
- 地址:计算机的存储器包含许多存储单元,操作系统把所有存储单元以字节为单位编号。
- 不同类型数据的存储方式
- 整数的存储形式:一个十进制整数,先转换为二进制形式,负数按补码形式存放;
- 实数的存储形式:一律采用指数形式存储。123.456标准化指数形式为
- 字符的存储方式:对于字符,按ASCII代码存放。A的ASCII代码是65(1000001)
三、整型数据的运算与分析
- 定义变量的一般形式是:类型名 变量名;
例如:int h, f, x, y;
变量都必须在使用前定义,指定其类型
- 赋值:h=37; f=88;
- 常量和变量
常量是指程序运行过程中其值不能改变的量;
变量是指程序运行过程中其值可以改变的量;
- 变量名的取名规则
变量名第一个字符必须是字母或下划线,其后字符必须是字母、数字或下划线,大小写字母代表不同的字符,一般,程序中的变量名用小写字母表示,变量名的长度不是无限的,变量名尽量简单易记、见名知意,在同一函数中,不同变量不能取相同名。
- 变量必须“先定义,后使用”;
类型是抽象的,变量是具体的;
类型不占存储单元,不能用来存储数据,而变量占存储单元,可以用来存储数据;
- 整型变量的种类
基本整型,类型名为 int
长整型,类型名为 long int
短整型,类型名为 short int
四、实型数据的运算与分析
- 实数在计算机语言中常称为浮点数
- 十进制小数形式,如:0.123,123.23,0.0
- 指数形式,如:123e3 或 123E3
- 实型变量的分类
- 单精度实例变量(float型)
- 双精度实例变量(double型)
- 长双精度实例变量(long double型)
- 实例数据的舍入误差
- 实例变量是由有限的存储单元组成的,能提供的有效数字总是有限的,在有效位以外的数字将被舍去会产生一些误差。
五、字符型数据的运算
- 字符常量
字符常量是用单撇号括起来的一个字符,英文字母可以作为字符常量,键盘上的字符都可以作为字符常量,小写字母和大写字母是不同的字符常量
- 转移字符
- 转义字符必须以反斜杠“\”开头
- “\”后只能有一个字符(或代表字符的8进制或16进制数)
- 字符变量的定义形式
char 字符变量列表;
字符数据与整型数据在一定条件下通用 char c = ‘a’; 与 char c = 97; 等价
字符串常量是一对双撇号括起来的字符序列
‘a’是字符常量
“a”是字符串常量
都是合法的字符串
六、符号常量
- #define不是C语句,行末没有分号
- #define是一个“预编译命令”
- 符号常量一般用大写,以示与变量区别
- 好处:
- 含义清楚
- 在需要改变一个常量时刻做到“一改全改”
- 用符号常量能保护所代表的数据不被破坏
七、算术运算符和算术表达式
- 基本的算术运算符:
+:加法运算符
-:减法运算符
*:乘法运算符
/:除法运算符
%:求余运算符(要求两侧均为整数。如19%4,结果为3)
- 自增、自减运算符
作用是使用量的值增1或减1
- 算术表达式:用算术运算符和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子,称为C算术表达式
八、C运算符和C表达式
- C运算符:
算术运算符 :+ - * / %
关系运算符 :> < == ≥ ≤ ≠
逻辑运算符 :! && ||
位运算符 :<< >> ~ | ^ &
赋值运算符 :=及其扩展值运算符
条件运算符 :? :
逗号运算符 :,
指针运算符 :* &
求字节数运算符 :sizeof
强制类型转换运算符 :(类型)
成员运算符 :. →
下标运算符 :[ ]
其他 :如函数调用运算符()
- C表达式
- 算术表达式。如 2+6, 7*3.5+sin(0.5)
- 关系表达式。如 x>0, y<z+6
- 逻辑表达式。如 x>0 && y>0 (表示x>0与y>0同时成立,&&是逻辑运算符,代表“与”)
- 赋值表达式。如 a=5.6
- 逗号表达式。如 a=3, y=4, z=8 用逗号连接若干个表达式,顺序执行这些表达式,整个逗号表达式的值是最后一个表达式的值(今为8)
顺序程序设计
一、C语句综述
- C语句分为以下5类:
- 控制语句:if、switch、for、while、do…while、continue、break、return、goto等
- 函数调用语句
- 表达式语句
- 空语句
- 复合语句
二、赋值表达式和赋值语句
- 赋值表达式
- 赋值运算符
- 赋值表达式
- 对赋值表达式求解的过程
“=”是赋值运算符,作用是将一个数据赋给一个变量;也可以将一个表达式的值赋给一个变量;
在赋值符“=”之前加上其他运算符,可以构成复合的运算符。
a+=3 等价于 a=a+3
一般形式为:变量 赋值运算符 表达式
求赋值运算符右侧的“表达式”的值
赋给赋值运算符左侧的变量
- 赋值过程中的类型转换
- 两侧类型一致时,直接赋值
- 两侧类型不一致,但都是数值型或字符型,自动将右侧的类型转换为左侧类型后赋值
- 定义变量时要防止数据溢出
- 赋值语句
- 赋值语句是由赋值表达式加上一个分号构成
- 赋值表达式的末尾没有分号,而赋值语句有分号
- 一个表达式可以包含赋值表达式,但决不能包含赋值语句
- 数据输入输出的概念
- C语言本身不提供输入输出语句
- 输入和输出操作是由C函数库中的函数来实现的。printf、scanf、putchar、getchar、puts、gets不是关键字
- 在使用系统库函数时,要在程序中使用预编译命令“include”
- 从计算机向显示器输出一个字符,putchar函数的一般形式为:putchar(c)
- 向计算机输入一个字符,getchar函数的一般形式为:getchar()
- 简单的格式输入和输出
两个函数是格式输入scanf函数,输出printf函数
- printf函数的一般格式
printf(格式控制,输出表列)
d格式符。按十进制整型数据的实际长度输出
i格式符。作用与d格式符相同
c格式符。用来输出一个字符
s格式符。用来输出一个字符串
f格式符。用来输出实数,以小数形式输出
e格式符。指定以指数形式输出实数
- scanf函数的一般形式:scanf(格式控制,地址表列)
- 顺序结构程序设计举例
- 解题思路:假设给定的三个边符合构成三角形的条件
- 找到求三角形面积的公式:其中s=(a+b+c)/2
输出三角形的三边长,求三角形的面积
选择结构程序设计
一、条件判断
- 条件判断的含义
条件判断的结果是一个逻辑值:”是“或”否“
在计算机语言中用“真”和“假”来表示“是”或“否”
用选择结构检查所指定的条件是否满足,并根据判断的结果决定执行哪种操作。
当x为正时,输出x的值,否则输出-x
- 关系运算符和关系表达式
- 关系运算符及其优先次序
- 关系表达式
C语言提供6种关系运算符:
优先级相同(高):①<(小于)②>(大于)③≤(小于或等于)④≥(大于或等于)
优先级相同(低):①==(等于)②≠(不等于)
关系、算术、赋值运算符的优先级:赋值运算符<关系运算符<算术运算符
c>a+b 等效于 c>(a+b)
a>b==c 等效于 (a>b)==c
a==b<c 等效于 a==(b<c)
a=b>c 等效于 a=(b>c)
用关系运算符将两个数值或数值表达式连接起来的式子
关系表达式的值是一个逻辑值,即“真”或“假”
在C的逻辑运算中,以“1”代表“真”,以“0”代表“假”
当a=3, b=2, c=1时
a>b的值为“真”,表达式值为1
(a>b)==c的值为“真”。表达式值为1
b+c>a的值为“假”,表达式值为0
- 逻辑运算符和逻辑表达式
- 逻辑运算符及其优先次序
- 逻辑运算的真值表
- 逻辑运算符的优先次序
- 与其他运算符的优先次序
- 逻辑表达式
- 逻辑运算真值表
3种逻辑运算符:&&(逻辑与) ||(逻辑或) !(逻辑非)
&&和||是双目(元)运算符
!是一目(元)运算符
a | b | !a | !b | a&&b | a||b |
真 | 真 | 假 | 假 | 真 | 真 |
真 | 假 | 假 | 真 | 假 | 真 |
假 | 真 | 真 | 假 | 假 | 真 |
假 | 假 | 真 | 真 | 假 | 假 |
! → && → || (!为三者中最高)
赋值运算符 < && 和 || < 关系运算符 < 算术运算符 < !
定义:用逻辑运算符将关系表达式或其他逻辑量连接起来的式子
逻辑表达式的值应该是逻辑量“真”或“假”
编译系统在表示逻辑运算结果时,以数值1代表“真”,以0代表“假”
但在判断一个量是否为“真”时,以0代表“假”,以非0代表“真”
注:将一个非零的数值认作为“真”
a | b | !a | !b | a&&b | a||b |
非0 | 非0 | 0 | 0 | 1 | 1 |
非0 | 0 | 0 | 1 | 0 | 1 |
假 | 非0 | 1 | 0 | 0 | 1 |
假 | 0 | 1 | 1 | 0 | 0 |
二、用if语句实现选择结构
- if语句的一般形式
- if(表达式)语句:if(x>y) printf(”%d”, x);
- if(表达式) 语句1 else 语句2
if(x>y) printf(”%d”, x);
else printf(”%d”, y);
- if语句的使用说明
- if(表达式) 语句
- if(表达式) 语句1 else 语句2
- 使用嵌套的if语句实现多层判断
三、利用switch语句实现多分支选择结构
- switch语句的一般形式
循环结构程序设计
一、程序中需要用循环结构
- 循环结构又称为重复结构
- 循环结构和顺序结构、选择结构是结构化程序设计的三种基本结构,它们是各种复杂程序的基本构造单元
- 要构造一个有效的循环,应当指定两个条件:
- 需要重复执行的操作,这称为循环体
- 循环结束的条件,即在什么情况下停止重复的操作
二、用while语句和do…while语句实现循环
- 用while语句实现循环
while语句的一般形式:while(表达式) 语句
white循环的特点是:先判断条件表达式,后执行循环语句
- 用do…while语句实现循环
do——while语句的特点:先天条件地执行循环体,然后判断循环是否成立
- 用for语句实现循环
- for语句不仅可以用于循环次数已经确定的情况,还可以用于循环次数不确定而只给出循环结束条件的情况,for语句完全可以替代while语句
- for语句的一般形式:for(表达式1;表达式2;表达式3)
- 循环的嵌套
一个循环体内又包含另一个完整的循环结构,称为循环的嵌套,内嵌的循环中还可以嵌套循环,这就是多层循环,3种循环(while循环、do…while循环和for循环)可以互相嵌套
- 提前结束循环
- 用break语句提前退出循环
- 用continue语句提前结束本次循环
break语句的一般形式为:…… break;
注:只能用于循环语句和switch语句之中,而不能单独使用
continue语句的一般形式:…… continue;
其作用为结束本次循环,即跳过循环体中下面尚未执行的语句,接着进行下一次是否执行循环的判断。
continue语句和break语句的区别
continue语句只结束本次循环,而不是终止整个循环的执行;
break语句结束整个循环过程,不再判断执行循环的条件是否成立
三、几种循环的比较
- 一般情况下,3种循环可以互相替代
- 在while和do——while循环中,循环体应包含使循环趋于结束的语句
- 用while和do——while循环时,循环变量初始化的操作应在while和do——while语句之前完成。而for语句可以在表达式1中实现循环变量的初始化。
- while和do…while循环的比较
凡是能用while循环处理的情况,都能用do…while循环处理
do…while循环结构可以转换成while循环结构
利用数组处理批量数据
一、为什么要用数组
- 数组是一组有序数据的集合。数组中各数据的排列是有一定规律的,下标代表数据在数组中的序号
- 用一个数组名和下标唯一缺点数组中的元素
- 数组中的每一个元素都属于同一个数据类型
二、定义一维数组
- 一维数组是最简单的数组
数组元素只有一个下标——一维数组
数组元素2个下标——二维数组
(1)定义一维数组的方式为:
类型名 数组名[常量表达式];
(2)数组名的命名规则和变量名相同,常量表达式给出元素的个数
下标从0开始,如 int a[10]; a[0]~a[9]
(3)必须先定义数组,才能引出数组中的元素,只能逐个引用数组元素而不能一次引用整个数组中的全部元素。
- 引出一维数组的元素
引用数组元素的表示形式为:数组名[下标];
- 一维数组的初始化
对数组元素的赋值既可以通过赋值语句来实现,也可以在定义数组同时给予初值,这就称为数组的初始化。
(1)定义数组时对全部数组元素赋初值:int a[10]={0,1,2,3,4,5,6,7,8,9};
(2)可以只给一部分元素赋值:int a[10]={0,1,2,3,4};相当于 int a[10]={0,1,2,3,4,0,0,0,0,0};
(3)int a[5]={1,2,3,4,5};可写为 int []={1,2,3,4,5};
三、二维数组的定义和引用
- 定义二维数组
float a[3][4], b[5][10]; 定义
a为3×4(3行4列)的数组
b为5×10(5行10列)的数组
(1)二维数组定义的一般形式为:类型符 数组名[常量表达式][常量表达式];
(2)逻辑存储
a[0][0] | a[0][1] | a[0][2] | a[0][3] |
a[1][0] | a[1][1] | a[1][2] | a[1][3] |
a[2][0] | a[2][1] | a[2][2] | a[2][3] |
- 引用二维数组的元素
二维数组元素的表示形式为:数组名[下标][下标]
- 二维数组的初始化
int a[3][4]={{1},{5},{9}}; 等价于 int a[3][4]={{1,0,0,0},{5,0,0,0},{9,0,0,0}};
int a[3][4]={{1},{5,6}}; 相对于 int a[3][4]={{1},{5,6},{0}};
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; 相对于 int[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
四、字符数组
- 定义字符数组及对其初始化
用来存放字符数据的数组是字符数组
字符数组中的一个元素存放一个字符
定义字符数组的方法与定义数值型数组的方法类似
char c[10]; c[0]=’i’; c[1]=’ ‘; c[2]=’a’; c[3]=’m’; c[4]=’ ‘; c[5]=’h’; c[6]='a’; c[7]=’p’; c[8]=’p’; c[9]='y’; c[0]c[1]c[2]c[3]c[4]c[5]c[6]c[7]c[8]c[9]
- 字符串和字符串结束标志 在C语言中,是将字符串作为字符数组来处理的 关心的是字符串的有效长度而不是字符数组的长度 为了测定字符串的实际长度,C语言规定了字符串结束标志’\0’ ’\0’代表ASCII码为0的字符 从ASCII码表可以查到,ASCII码为0的字符不是一个可以显示的字符,而是一个“空操作符”,即它什么也不做 用它作为字符串的结束标志不会产生附加的操作或增加有效字符,只起一个供辨别的标志 char c[]={”i am happy”}; 相对于 char c[]=”i am happy”; 相对于 char c[11]={”i am happy”};
- 字符数组的输入输出 字符数组的输入输出可以有两种方法: (1)逐个字符输入输出(%c) (2)整个字符串一次输入输出(%s)
- 字符串处理函数 在程序中往往需要对字符串作某些操作处理,两个字符串连接、两个字符串进行比较 在C函数库中提供了一些字符串处理函数,使用很方便
函数形式 | 功能 |
gets(字符数组) | 从终端输入一个字符串到字符数组 |
puts(字符数组) | 将一个字符串(以’\0\结束的字符序列)输出到终端 |
strcat(字符数组1,字符数组2) | 连接两个字符数组中的字符串把字符串2接到字符串1的后面 |
strcpy(字符数组1,字符串2) | 将字符串2复制到字符数组1中去 |
strcmp(字符串1,字符串2) | 比较串1和串2。若串1=串2,则函数值为0;若串1>串2,则函数值为一个正整数;若串1<串2,则函数值为一个负整数 |
strlen(字符数组) | 测试字符串长度 |
strlwr(字符串) | 将字符串中大写字母换成小写字母 |
strupr(字符串) | 将字符串中小写字母换成大写字母 |
用函数实现模块化程序设计
一、函数是什么
- 函数就是功能(Function)
(1)每一个函数用来实现一个特定的功能
(2)函数的名字应反映其代表的功能
- 一个C程序可由一个主函数和若干个其他函数构成。由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或多个函数调用任意多次。
- 从使用的角度看,函数有两种 (1)库函数,它是由系统提供的,用户不必自己定义而直接使用它们。应该说明,不同的C语言编译系统提供的库函数的数量和功能会有一些不同,当然许多基本的函数是共同的。 (2)自己定义的函数。是以解决问题专门需要的函数
- 从函数的形式看,函数分两类 (1)无参函数。函数没有参数,一般用来执行固定的一组操作。无含参数可以带回或不带回函数值,但一般以不带回函数值的居多。 (2)有参函数。在调用函数时,要给出实参。主调函数在调用被调用函数时,通过参数向被调用函数传递数据,一般情况下,执行被调用函数时会得到一个函数值,供主调函数使用。
二、函数的定义和调用
- 函数定义 (1)如果程序中要调用库函数,只需用#include指令把有关的头文件包含到本文件夹模块中即可。 (2)如果想使用库函数中没有的函数,需要程序设计者在程序中自己定义。
- 怎样定义无参函数 函数名后面圆括号中空的,没有参数 定义无参函数的一般形式为:
- 怎样定义有参函数 定义有参函数的一般形式为:
- 函数的调用 (1)调用无参函数的形式:函数名() 如:print_star() (2)调用有参函数的形式:函数名(实参表列) 如:max(a, b)
- 对被调用函数的声明和函数原型 在一个函数中调用另一个函数需要具备如下条件: (1)被调用函数必须是已经定义的函数(是库函数或自己定义的函数) (2)如果使用库函数,应该在本文件开头加相应的#include指令 (3)如果使用自己定义的函数,而该函数的位置在调用它的函数后面,应该进行函数声明。
- 函数原型的一般形式有两种 如:int max(int x, int y); int max(int, int); 原型说明可以放在文件的开头,这时本文件中所有函数都可以使用此函数。
- 函数的嵌套调用和递归调用 函数的嵌套调用:调用一个函数的过程中,又可以调用另一个函数 函数的递归调用:在调用一个函数的过程中又出现直接或间接地调用函数本身,称为函数的递归调用。 用递归方法解题的条件: (1)所求解的问题能转化为用同一个方法解决的子问题。 (2)子问题的规模比原问题的规模小。 (3)必须要有递归结束条件,停止递归,否则形成无穷递归,系统无法实现。
指针
一、什么是指针
- 在C语言中,将地址形象化地称为“指针”。意思是通过它能找到以它为地址的内存单元。
- 直接访问:int a, b; a=3
- 间接访问:int a; 定义特殊变量 a_pointer a_pointer=&a; 通过a_pointer取值
- 为了表示将数值送到变量中,可以有两种表达方法;