1.break语句
// break 语句放在循环中,表示结束循环
// 也就是说,直接跳到循环以后,执行后面的代码
int i = 0;
while (1) {
break; //循环体什么也不做,直接跳出
i++;
break; //i+1 跳出
printf("%d\n", i);
break; //循环体整个执行一次 跳出
}
break使用案例
// 写一段代码,要求用户输入一个数字,但是数字的范围必须是0到10(取不到)之间
// 如果输入不在此范围,或输入有误,请重新输入
int inputNum;
while (1) {
printf("请输入一个数字\n");
scanf("%d", &inputNum);
if(inputNum >= 0 && inputNum < 10) break;
}
2.continue语句
// continue;// 代码从这里进入下一次循环
// 例如当前为第0次循环,那么就跳至第1次循环
// 其后的循环体中的代码忽略
long int i = 0;
while (1) {
i++;
continue; // i = 1 时跳出,执行下一次循环
printf("%d\n", i);
continue; //无意义,无作用
}
使用案例:找出100内不能被3整除的数
int i = 1, temp;
while (i <= 100) {
temp = i;
i++;
if(temp % 3 == 0) continue;
printf("%d\n", temp);
3.函数
C 语言中已经提供的函数的分类
1)字符型函数
2)转换函数
3)目录路径函数
4)诊断函数
5)图形函数
6)输入输出函数
7)接口函数
8)字符串函数
9)内存管理函数
10)数学函数
11)日期与时间函数
12)进程控制函数
等
- 函数的使用分成三个部分:声明、定义、调用 函数是代码的打包,可以将有特定功能的代码写在函数里,使用时直
- 接调用函数即可
char c;
int num = 0, inputNum;
int flag = 0; // 标记,0代码没有输入q,1代表输入q
int sum;
// 用户输入,判断为q,如是数字进行累加
int inputAndAdd() {
// 逻辑
scanf("%c", &c);
if(c != '\n') {
if(c >= '0' && c <= '9') {
inputNum = c - '0';
num = num * 10 + inputNum;
} else if(c == 'q') {
flag = 1;
}
}
while (!(c == '\n' || c == 'q')) {
scanf("%c", &c);
if(c != '\n') {
if(c >= '0' && c <= '9') {
inputNum = c - '0';
num = num * 10 + inputNum;
} else if(c == 'q') {
flag = 1;
}
}
}
if(flag == 0) {
sum += num;
}
num = 0;
return 0;
}
int main(int argc, const char * argv[]) {
do {
inputAndAdd();
} while (flag == 0);
printf("所求和为%d\n", sum);
return 0;
}
函数按照参数与返回值的分类:
1,无参无返回值函数
2,有参无返回值函数
3,无参有返回值函数
4,有参有返回值函数写一个函数,实际上就是写这个函数的执行过程,会处理的逻辑
1),无参无返回值函数
// 此类函数的使用最简单,一般就是一个固定的功能个
// 基本语法:
/*
void 函数名() {
函数体
}
*/
// 注意:
// 1)函数不允许在函数内定义
// 2)函数也是有名字的,这个也是标识符,命名规则与变量一致
// 3)不允许有同名的函数(C 语言中没有函数重载的概念)
// 4)此类函数一般表示一个固定的语法,或固定的执行逻辑,一般就是一段代码的打包
void print_logo() {
printf("********************************\n");
printf("* I love C programming *\n");
printf("********************************\n");
}
// 输入数字,打印数字的平方
int num;
do {
printf("请输入数字:");
scanf("%d", &num);
// 打印平方
printf("%d 的平方 是 %d\n", num, num * num);
// 如果需要调用函数,直接使用语法 函数名()
// 主调函数:主动调用函数的函数
// 被调函数:被调用的函数
print_logo();
} while (1);
2).无参数有返回值的函数
无参有返回值函数,表示在函数调用的过程中,不需要传入参数
函数执行结束后会得到一个执行的结果
基本语法:
返回的数据类型 函数名() {
函数体
return 需要返回的值;
}
如果函数或得到一个整数,那么可以写: int getNum() ...
如果函数是要求平均值,即得到一个小数,那么可以写:
double getAvg() ...
float getAVG() ...
char getChar() ...
return 值;
表示的是函数的返回结果
如果函数中是 return 1, 那么表明函数执行完就得到结果 1
如果函数写的时 return 'a', 那么就表明函数执行完,得到结果 'a'
函数调用:
函数名();
如何获得函数的返回值呢?
将函数的调用看做成"函数调用表达式"
如何获得表达式的值? num = 1 + 2; printf("%d\n", 1 + 2);
num = getNum(); 也支持直接使用: printf("%d\n", getNum());
案例:
// 写一个函数,要求用户输入数字,如果输入数字不在指定范围,即重新输入
int getNum10() {
int num;
do {
printf("请输入数字:");
scanf("%d", &num);
if(num >= 10 || num < 0) printf("输入有误,");
} while(num >= 10 || num < 0);
return num;
}
// 获得运算符的函数:+ - * /
int getOperator() {
int c;
do {
printf("请输入运算符(+0,-1,*2,/3):");
scanf("%d", &c);
// 要求的输入的是 0 1 2 3
if(!(c == 0 || c == 1 || c == 2 || c == 3)) printf("输入有误,%d", c);
} while (!(c == 0 || c == 1 || c == 2 || c == 3));
return c;
}
int main(int argc, const char *argv[]) {
int num1, num2, res = 0;
int oper;
// 提示用户输入
num1 = getNum10();
oper = getOperator();
num2 = getNum10();
// 进行计算
switch (oper) {
case 0/* + */:res = num1 + num2;break;
case 1/* - */:res = num1 - num2;break;
case 2/* * */:res = num1 * num2;break;
case 3/* / */:res = num1 / num2;break;
}
// 打印结果:
printf("%d %d %d = %d\n", num1, oper, num2, res);
3).有参数无返回值的函数
有参数无返回值的函数表示在调用的过程中,需要给定参数
函数执行结束不会生成数据返回
定义的语法:
void 函数名(形式参数列表) {
函数体
}
形式参数列表决定了函数可以接受什么数据类型的值,以及需要接收多少个值
例:求两个数的平均值
avg(1, 3)
如上函数在调用的时候需要接收两个数据(数值),并且数据是整数类型
因此形式参数列表可以写成:
int num1, int num2
函数的定义:
void avg(int num1, int num2) {
...
}
函数: test(123, 'a', 123.456f)
void test(int num, char ch, float num2) {...}
参数的名字:num, ch, num2 等可以随意取(复合标示符规范)
参数一般是传入函数中进行处理,处理传入数据直接可以使用形式参数变量
void avg(int num1, int num2) {
// int num1, num2;
printf("%d\n", (num1 + num2) / 2);
}
案例:
void print_max(int num1, int num2) {
if(num1 > num2) {
printf("第一个数较大\n");
} else {
printf("第二个数较大\n");
}
}
int main(int argc, const char * argv[]) {
print_max(1, 2);
return 0;
}
// 根据传入的数字打印星星矩阵
// *********
// *********
// *********
// *********
void printStar(int rows, int columns) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
printf("* ");
}
printf("\n");
}
}
4).有参数有返回值的函数
函数有参数,表示在调用的时候需要传递参数
函数有返回值,表示函数在执行结束时,会生成一个值以供返回
语法:
返回值类型 函数名(形式参数列表) {
函数体
return 值;
}
- 当两个函数功能相似时,可以用一个函数调用另一个函数来实现部分功能
// int getNumRange(-100, 50) 可以输入指定范围的数字
// int getNumFrm0(100) 可以输入0到100的数字`
int getNumRange(int min, int max) {
int num;
do {
printf("请输入数字:");
scanf("%d", &num);
if(!(num >= min && num < max))
// printf("输入数字不在指定反问,");
printf("输入数字%d不在[%d, %d),", num, min, max);
} while (!(num >= min && num < max));
return num;
}
//第二个函数可以看成第一个函数min=0时的特例
int getNumFrm0(int max) {
return getNumRange(0, max);
}
5).函数调用的补充说明
1>函数的return语句
在有返回值的函数中 return 是用与函数值的返回
在无返回值的函数中 return 是结束函数的标志
return 的返回值格式: return 0; return (0); return 语句的位置
return放在循环体内表示函数结束
break放在循环体内表示循环结束
2>函数声明
就是在代码开始的时候,或函数开始的使用,声明函数,以告知编译器该函数的参数与返回值和名字,以便在函数定义出现前可以调用函数
如何声明: 一般直接将函数的花括号去掉(即函数的头部),将其加上分号放到代码的前面即可 函数声明的位置 1)放在文件开始的前面 2)放在主调函数的开始的位置 一个较为特别的写法 函数声明语法的另一写法 1)直接将函数头部加上分号写在前面 2)将函数头部取出,删除所有形式参数的变量名,加分号
3>实际参数与形式参数
void func(int num) {…}
称参数变量 num 为形式参数(形参)func(123); 这里的 123 就是实际参数(实参)
4>函数调用中实参与形参的传递过程
函数在调用被调函数的时候,会及时的创建一段内存(栈),用于存储该函数需要的数据与变量
主调函数调用被调函数的同时,会将参数变量所指的内存中的数据复制一份,传递给被调函数
被调函数的变量与主调函数中的变量没有任何关系,只是内存里面存储的数值刚好相等
参数传递以后,在被调函数中,修改参数的数据,与主调函数没有关系,是值传递
4.递归
递归调用就是函数直接调用自己,或间接调用自己
递归会不断的进行自我调用,因此需要考虑一个临界条件,让其不在继续递归下线
函数() {
...
if(要递归么) {
函数();
}else {
做点别的
}
...
}
递归就是自己调用自己(不考虑间接),即为递推结构
等差数列:后一项与前一项的差是一个固定的数
0 1 2 ...
1 3 5 7 9 11 ...
第100项的值?
func(100)
第n项与第n-1项的关系
func(n) == func(n - 1) + 2
int func(int num) {
if(num == 0) return 1;
return func(num - 1) + 2;
}
要实现递归算法:
1)找到地推关系
2)找到临界条件
// 等差数列的递归函数
int func(int num) {
if(num == 0) return 1;
return func(num - 1) + 2;
}
int main(int argc, const char * argv[]) {
for(int i= 0; i < 101; i++) {
printf("%d\n", func(i));
}
return 0;
}
//计算Fibonacci数列第n项
// 1 1 2 3 5 8 13 ...
// 递推与临界
// func(n) == func(n-1) + func(n-2);
int func(int n) {
if(n == 1 || n == 0) return 1;
return func(n-1) + func(n-2);
}
//计算n!
// 1! 1
// 2! 2 = 2 * 1
// 3! 6 = 3 * 2 * 1
// 4! 24
// 5! 120
int f(int n) {
if(n == 1) return 1;
return f(n - 1) * n;
}