int x=1, y=0, a=0, b=0; switch (x) //第一个switch { case 1: switch (y) //第二个switch { case 0: a++; break; //终止的是第
二个switch case 1: b++; break; } b = 100; break; //终止的是第一个
switch case 2: a++; b++; break; } printf (\%d\\n\a,b); //26
行
最终输出结果是:1 100
continue(用的很少)
用于跳过本次循环余下的语句,转去判断是否需要下次循环
for (1; 2; 3) { A; B; continue;//如果执行该语句,则执行完该语句后,会执 行语句3,C和D都不会执行
C; D; }
while (表达式) { A; B; continue;//如果执行该语句,则执行完该语句后,会执 行表达式,C和D都不执行。
C; D; }
数组
1. 为什么需要数组
为了解决大量同类型数据的存储和使用问题。
为了模拟现实世界
数组的分类
一维数组
怎么定义一维数组
为n个变量连续分配存储空间 所有的变量数据类型必须相同 所有变量所占的字节大小必须相等
例子:
int a[5];
一维数组名不代表数组中所有的元素, 一维数组名代表数组第一个元素的地址
有关一维数组的操作
初始化
完全初始化
int a[5] = {1,2,3,4,5};
不完全初始化,未被初始化的元素自动为零int a[5] = {1,2,3};
不初始化,所有元素是垃圾值
int a[5]; 清零
int a[5] = {0}; 错误写法:
int a[5];
a[5] = {1,2,3,4,5}; //错误 只有在定义数组的同时才可以整体赋值, 其他情况下整体赋值都是错误的
int a[5] = {1,2,3,4,5};
a[5] = 100; //error因为没有a[5]这个元素,最大只有a[4]
int a[5] = {1,2,3,4,5}; int b[5];
如果把a数组中的值全部复制给b数组
错误写法:
b = a; // error 正确的写法
for (i=0; i<5; ++i)
b[i] = a[i];
赋值 排序
求最大/小值 倒置 查找 插入 删除
二维数组
Int a[3][4];
2.
总共是12元素看,可以当做3行四列看待,这12个元素的名字依次是:
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] a[i][j] 表示第i+1行第j+1列的元素
int a[m][n]; 该二维数组右下角位置的元素只能是a[m-1][n-1] 初始化
int a[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12}; int a[3][4] = {
{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}
}; 操作
输出二维数组的内容:
int a[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; int i, j; //输出数组内容
for (i=0; i<3; ++i)
{ for (j=0; j<4; ++j) printf(\ \a[i][j]);//-号表示左对齐,5表示占5 个光标的位置
printf(\ }
对二维数组排序 求每一行的最大值 判断矩阵是否对称 矩阵的相乘
多维数组
是否存在多维数组
不存在
因为内存是线性唯一的
n维数组可以当做每一个元素是n-1维数组的一维数组
比如:
int a[3][4];
该数组是含有3个元素的一维数组
只不过每一个元素都能再分成4个小元素
int a[3][4][5]
该数组是含有3个元素的一维数组
只不过每一个元素都是4行5列的二维数组
函数【C语言的第二个重点】 :
为什么需要函数
避免了重复性操作 有利于程序的模块化
什么叫做函数
逻辑上:能够完成特定功能的独立的代码单元 物理上:能够接受数据【当然也可以不接受数据】
能够对接收数据进行处理
能够将数据处理的结果返回【当然也可以不返回任何值 前面定义成void】
总结: 函数是个工具,它是为了解决大量类似问题而设计的 函数可以当做一个黑匣子
如何定义函数
函数的返回值 函数的名字(函数的形参列表) {
函数的执行体 }
1. 函数定义的本质是详细描述函数之所以能够实现某个特定功能的具体方法
2. return表达式;的含义:
1> 终止被调函数,向主调函数返回表达式的值 2> 如果表达式为空,则只终止函数,不向主调函数返回任何值 3> break是用来终止循环和switch的,return是用来终止函数的
例子:
void f() { return; //return只用来终止函数,不向被调函数返回任何值
}
int f() { return 10; //第一:终止函数,第二:向主调函数返回10
}
3. 函数返回值的类型也称为函数的类型,因为如果 函数名前的返回值的类型 和函数执行体中的return表达式;中表达式的类型不同的话,则最终函数 返回值的类型 以函数名前的返回值类型为准
例子:
int f() { return 10.5; //因为函数的返回值类型是int 所以最终f返回的是 10而不是10.5
}
函数的分类
有参函数 和 无参函数
有返回值函数 和 无返回值函数 库函数 和 用户自定义函数 值传递函数 和 地址传递函数
普通函数 和 主函数(main函数)
一个程序必须有且只能有一个主函数
主函数可以调用普通函数 普通函数不能调用主函数 普通函数可以相互调用
主函数是程序的入口,也是程序的出口
注意的问题
函数调用和函数定义的顺序
如果函数调用写在了函数定义的前面,则必须加函数前置声明
函数前置声明:
1. 告诉编译器即将可能出现的若干个字母代表的是一个函数
2. 告诉编译器即将可能出现的若干个字母所代表的函数的形参和返 回值的具体情况
3. 函数声明是一个语句,末尾必须加分号
4. 对库函数的声明是通过 # include <库函数所在的文件的名字.h> 来实现 形参和实参
个数相同 位置一一对应 数据类型必须相互兼容
如何在软件开发中合理的设计函数来解决实际问题 一个函数的功能尽量独立,单一 多学习, 多模仿牛人的代码
函数是C语言的基本单位,类是Java,C#,C++的基本单位
常用的系统函数
double sqrt (double x);
求x的平方根 int abs (int x)
求x的绝对值
double fabs (double x)
求x的绝对值
专题:
递归(可以参见数递结构视频)
变量的作用域和存储方式:
按作用域分:
全局变量
在所有函数外部定义的变量叫全局变量
全局变量使用范围: 从定义位置开始到整个程序结束
局部变量
在一个函数内部定义的变量或者函数的形参 都统称为局部变量
void f (int i)
{