厦门大学-c程序设计基础(有字幕)国家级精品课

一,浮点型常量
- 小数形式,小数点不可省略
- 指数形式,e或E前后必须有数字
二.
int 是整型数据的说明符. %d
float 定义单精度浮点型变量 %f
(%f 默认输出6位小数)
double 定义双精度浮点型变量 %lf
区别:双精度能保存的数据范围更大,有效位数更多,保存数据更精确。
三.
标识符用于表示程序中的各类元素的名字
标识符以字母或下划线打头,由字母,数字字符,下划线组成。
区分大小写字符,例如sum,SUM,Sum,三者不一样。
标识符不能命名为关键字或特定字。
四. 用户键盘输入数据
scanf(“格式控制符”,变量地址);
&:取地址运算符
例 scanf(“%d”,&length)
五.
求余运算符 % 两侧数据必为整型数据
赋值运算符 = 左边只能是单个变量
条件运算符 表达式1?表达式2:表达式3
(先计算表示1若为“真”,则计算表达式2输出;若为“假”,则计算表达式3输出)
除法运算,任意两整数相除结果为整数;如果/两边有一个为浮点数结果为浮点数
求字节运算符 sizeof(e),用来返回其后的类型说明符或表达式所表示的数在内存中所占有的字节数
六. 数学函数
圆周率 编译预处理命令#define PI 3.14
sqrt(x) 求x的平方根 使用时需要声明(#include“math.h”)即告诉编译器要使用
cos(x) 求cos值
sin(x) 求sin
fabs(x)求x绝对值
exp(x)求e的x次幂
log(x)求ln(x)
七. 操作数 (运算对象)例-b*5 中b和5就是操作数
单目运算符-取负+取正
双目运算符+,-,*,/,%
八.




自增自减运算符操作数必须是变量
例:5++,(a+1)++都是错的
九.


十. printf函数及附加说明项
printf中使用\t将光标移至下一个水平制表符的位置 各水平制表符之间通常为八个字符宽度 (第一列,第九列,第十七列...)
printf(“普通字符/格式控制符”,表达式1,表达式2...);原样输出/指定格式输出
附加说明项
- %d %-0m格式字符
- m指定输出最小宽度占一列
- 实际长度超过m,按实际输出
- -m指定m列数据左对齐;0m指定m列中空位填0
浮点型格式控制符
- %f %-m.nf 符号和小数点各占一列 .n指定小数部分所占的位数,默认为六位(四舍五入)
- %-m.ne 以指数形式输出单精度或双精度类型 指数e占一列 默认六位小数位,一位整数,共十三列
- %mg 根据数据大小自动选择%f或%e
十一.
scanf的格式控制符中出现普通字符,键盘输入数据时就要输入这些普通字符
scanf如果编程时输入\n就要在运行时多输入一个数,因为\相当于一个普通字符,系统会以为你没有输入完

十二. scanf函数及附加说明项
- %lf:输入double类型的双精度数据格式控制符
- %md:截取m列数据作为输入
- %*md:跳过m列数据,不输入

十三 . 运算符优先级
逻辑!优先于算术运算符优先于关系运算符(>,>=,<,<=优先于==,!=)优先于逻辑&&优先于逻辑||优先于赋值运算符
十四. “==”与“=”的区别
“==”关系运算符,运算结果为“0”或“1”
“=”赋值运算符,将表达式的值赋值给变量
十五. 逻辑运算符
一元逻辑运算符:!(逻辑非)
二元逻辑运算符:&&(逻辑与)
二元逻辑运算符:||(逻辑或)

与


或


与:一个为假则为假;或:一个为真则为真
十六. 分支语句
- 单分支if语句
- 双分支if-else语句
- 多重双分支else-if级联 在2的基础上加(对于最后一个分支,如果需要判断条件就写成“else if(表达式n){语句n;}”;如果不需要判断条件就写成“else{语句n;}”)
- 多分支开关语句(switch语句)
十七. if(表达式)语句;
- 表达式是条件,一定要写在圆括号()里;
- 语句只能是一条语句,可以是空语句;,或者是复合语句;

十八. if-else语句
if(表达式)
语句1
else
语句2
注意:关键字else不能单独使用;
if后面必须有“表达式”,else后面不能有“表达式”,也不能有分号。
最近配对原则:else与它最近的“未配对的if”搭配。{}使if结束
补充:求个位数n%10
十位数n/10%10
百位数n/100%10
十九. switch语句语法形式

break的作用:退出switch分支;从循环体中跳出
case的作用:标号作用,每个case后面的常量表达式的值各不同;根据表达式值转向不同的case标号位置,执行相应的语句
注意:1.常量表达式与case之间至少应有一个空格2.每个case只能列举一个整型或字符型常量,否则会出现语法错误
二十. for语句语法
for(表达式1;表达式2;表达式3) 循环语句
表达式1:循环变量赋初值
表达式2:循环条件,决定循环是否继续
表达式3:更新循环变量,(增/减)
注意:三个表达式均可以省略,但作为分隔符的分号却是必须的。

二十一. 计数变量count
- count初始化为0
- 每输出一个满足要求的整数,count计数加1
二十二.
素数:除了1和它本身,不能被其它整数整除

二十三. while语句
while(表达式)
语句
注意:循环体中一定要有使循环趋于结束的语句

二十四. do-while循环
do
语句
while(表达式);
“直到型”循环:先执行循环体,后进行条件判断
注:表达式是循环继续的条件,不是循环结束的条件
二十五.

二十六. 多重循环的执行


二十七.

goto语句

break和continue本质上受限于goto
break语句只能终止本层循环,需要从多重循环的内层一下转移到最外层时,可以使用goto语句
二十八. 穷举法

累加法

二十九. 函数


括号里的形式参数可有可无,没有形式参数即称为无参函数。




函数的定义是平行的,一个函数不可以定义在另一个函数里;函数之间的关系是相互的,是调用于被调用的关系
三十. 函数的参数
形参:类似定义变量的形式呈现,定义时不占内存,调用后释放内存
实参:可以是常量,变量或表达式,要求有确切值

三十一. 函数的返回值
- return 表达式;
- return;
功能:结束被调函数,返回到主调函数,并带回一个返回值
return不是必须的,返回值为空时可以没有return语句
一个函数也可以出现多个return语句

如果函数有返回值,则必须使用带表达式的return
当return语句中表达式的值类型与函数类型不一致时,以函数类型为准
没有返回值的函数调用不能作为表达式的一部分参与运算,只能以函数调用语句形式出现
有返回值的函数调用可以参与运算,也可以作为函数调用语句出现,此时其返回值未被加以利用

三十二. 自定义函数

函数fac()可以被编译,但不能单独运行,需要被调用;
函数间是调用与被调用的关系,但任何函数都不能调用main函数。
三十三. 函数的嵌套调用

函数的递归调用
在递归函数中必须有:
1.递归结束条件
2.递归调用语句
三十四. 变量的作用域


程序运行进入这个块之前,其中的变量不存在,离开这个块,其中的变量就释放了
块外定义的变量在里面仍然有效
块内定义了和块外同名的变量,则掩盖了块外的
不能在同一个块内定义同名的变量
三十五. 全局变量

三十六. 变量的储存类型



全局变量的存储类型


三十七.函数与变量小结

小结位置
三十八.整型的分类及特点
整型的划分
- 基本整型int
- 短整型short int
- 长整型long int
默认情况下,整型变量是有符号的




%o以八进制形式读写整数
%x以十六进制形式读写整数

三十九. 数据溢出
无符号型整数运算过程中发生溢出,会将结果对2^n取模(取余)
有符号型整数运算过程中发生溢出,结果不确定的:结果出错(是未定义行为),程序报错,崩溃等。
四十. 浮点数的保存



四十一. 字符型常量
用单引号括起来的单个字符
字符常量以二进制形式编码,并保存,最常用的是ASCLL编码(小写字符比大写字符大32)
‘1’是字符型,1是整型,有没有单引号,差别很大



字符型常量只占用一个字节,字符串常量除了储存有效的ASCII码值外还要存放结束标志‘\0’

十进制满十进一,二进制满二进一
二进制转十进制:1010 1*2^3+0*2^2+1*2^1+0*2^0结果为10
十进制转二进制:(除二取余,逆序排列法)234 结果为11101010
四十二. 转义字符

数字转义字符主要用于其他方式无法表示的字符

四十三. 字符的读写
图中内容分别是等价!

1.字符输出函数putchar(c);
其中,c可以是字符型常量,字符型变量或整型变量
功能:在屏幕当前光标位置处,显示c所表示的一个字符
2.字符输入函数getchar();
功能:读入从键盘输入的一个字符,并将其返回
字符输入的注意事项
按enter键,tab键,空格键,都输入了一个字符
scanf(“ %c”,&c1);
%c前面加空格,在输入时可以跳过空白字符,包括换行符
四十四. 类型转换
两种:
- 隐式类型转换:由c编译器按照某种预定的规则进行自动转换


- 显示类型转换:由程序员在程序中用类型转换运算符设计的转换(强制类型转换)
通常用于自动类型转换不能起作用时
在程序中借助类型转换运算符,人为的强制进行类型转换
格式:(类型名)表达式
例(double)5/3
类型转换不会改变变量的类型与值

- 赋值运算的类型转换
1.变量=表达式
2.两边数据类型不一致,一律自动转换为左边变量的类型
四十五. 一维数组的定义,引用和初始化


数组长度可以是常量,或者是由常量构成的式子,即常量表达式

原则上,如果数组的长度为n则下标的范围应该界于0和n-1。但c编译系统没有对下标进行越界检查,要求用户严格遵循

注意:如图

- 如果对全部数组元素赋初值时,可以不指定数组长度,但是不能省略【】。
- 对数组进行初始化时,不允许初始化的元素个数比定义的数组长度大
- 动态存储方式只定义数组而没有初始化里面取得就是随机值
- 数组不允许整体赋值,可以分别给元素赋值
四十六. 一维数组应用


四十七. 冒泡法


四十八. 字符数组


字符串常量:用一对双引号括起的字符序列
在存储字符串时,自动在其后添加空字符‘\0’,作为字符串结束符
注意:空字符不同于空格字符
数组名等价于数组的首地址 数组用scanf时不需要&取地址符号
字符串输入输出%s
%s输入时遇到空格或回车结束,但获得的字符中不包括回车及空格本身,而是在字符串末尾添\0";输出时,遇\0"结束,且输出字符中不包含\0"

以下两个函数都来自头文件stdio.h
- gets(字符数组) 从键盘上输入1个字符串,允许输入空格
- puts(字符数组) 把字符数组中所存的字符串输出到标准输出设备中去

例子:


四十九. 字符串处理函数

以下函数来自头文件string.h
- 字符串连接函数strcat(字符数组1名,字符数组2名) 将字符数组2连接到字符数组1后面,字符数组2不变
- 字符串复制函数strcpy(字符数组1,字符串) 将“字符串”完整的复制到“字符数组1”中覆盖字符数组1中的原有内容,字符串不变
- 字符串比较函数strcmp(字符串1,字符串2)
如果字符串1>字符串2,返回值>0
如果字符串1=字符串2,返回值为0
如果字符串1<字符串2,返回值<0
- 测试字符串长度函数strlen(字符数组名) 求字符数组中字符串的实际字符个数,不包括字符串结束的标志“\0”
- 字符串中大小写转换函数
大写转小写strlwr(字符数组名)
小写转大写strupr(字符数组名)

五十. 二维数组

二维数组在内存中按行连续存放



二维数组初始化时可以省略第一维度。

