一、分支语句和循环语句
1)什么是语句
C语言可分为以下五类:
- 表达式语句
- 函数调用语句
- 控制语句
- 复合语句
- 空语句
而分支语句和循环语句为控制语句,控制语句用于控制程序的执行流程,以实现程序的各种结构方式,它们由特定的语句定义符组成,C语言有九种控制语句。
可分成以下三类:
- 条件判断语句也叫分支语句:if语句、switch语句;
- 循环执行语句:do while语句、while语句、for语句;
- 转向语句:break语句、goto语句、continue语句、return语句。
2)分支语句(选择结构)
2.1) if语句
if语句的语法结构为:
语法结构:
if(表达式)
语句;
if(表达式)
语句1;
else
语句2;
if(表达式1)
语句1;
else if(表达式2)
语句2;
else
语句3;
注意:如果表达式的结果为真,则语句执行。
在C语言中如何表示真假? 0表示假,非0表示真。
2.2) switch语句
switch语句的语法结构为:
switch(整型表达式) {
语句项;
}
语句项为:
case 整形常量表达式:
语句;
switch语句中的break,我们想知道今天是星期几,根据我们选择1~7的数字来显示。 break语句 的实际效果是把语句列表划分为不同的分支部分。
#include <stdio.h>
int main()
{
int day = 0;
switch(day)
{
case 1:
printf("星期一\n");
break;
case 2:
printf("星期二\n");
break;
case 3:
printf("星期三\n");
break;
case 4:
printf("星期四\n");
break;
case 5:
printf("星期五\n");
break;
case 6:
printf("星期六\n");
break;
case 7:
printf("星期天\n");
break;
}
return 0;
}
如果表达的值与所有的case标签的值都不匹配怎么办? 结果就是所有的语句都被跳过。程序并不会终止,也不会报错,因为这种情况在C中并不认为是个错误。 但是,如果你并不想忽略不匹配所有标签的表达式的值时该怎么办呢? 你可以在语句列表中增加一条default子句,写在任何一个 case 标签可以出现的位置。 当 switch 表达式的值并不匹配所有 case 标签的值时,这个 default 子句后面的语句就会执行。 所以,每个switch语句中只能出现一条default子句。 但是它可以出现在语句列表的任何位置,而且语句流会像执行一个case标签一样执行default子句。
3)循环语句
3.1)while循环
while(表达式)
循环语句;
break在while循环中的作用: 其实在循环中只要遇到break,就停止后期的所有的循环,直接终止循环。 所以:while中的break是用于永久终止循环的。
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
break;
printf("%d ", i);
i = i+1;
}
return 0;
}
结果为1 2 3 4
continue在while循环中的作用是: continue是用于终止本次循环的,也就是本次循环中continue后边的代码不会再执行, 而是直接跳转到while语句的判断部分。进行下一次循环的入口判断.
#include <stdio.h>
int main()
{
int i = 1;
while(i<=10)
{
if(i == 5)
continue;
printf("%d ", i);
i = i+1;
}
return 0;
}
结果为1 2 3 4 6 7 8 9 10
3.2)for循环
for(表达式1; 表达式2; 表达式3)
循环语句;
表达式1:为初始化部分,用于初始化循环变量的。 表达式2:为条件判断部分,用于判断循环时候终止。 表达式3:为调整部分,用于循环条件的调整。
用for循环打印0~19之间的数字
int main()
{
int i = 0;
for(i=1; i<=10; i++)
{
printf("%d ", i);
}
return 0;
}
建议:
- 不可在for 循环体内修改循环变量,防止 for 循环失去控制。
- 建议for语句的循环控制变量的取值采用“前闭后开区间”写法。
3.3)do…while()循环
do
循环语句;
while(表达式);
do语句的特点 循环至少执行一次,使用的场景有限,所以不是经常使用。
#include <stdio.h>
int main()
{
int i = 10;
do
{
printf("%d\n", i);
}while(i<10);
return 0;
}
二、函数
1)什么是函数
在计算机科学中,子程序(英语:Subroutine, procedure, function, routine, method, subprogram, callable unit),是一个大型程序中的某部分代码, 由一个或多个语句块组成。 它负责完成某项特定任务,而且相较于其他代码,具备相对的独立性。 一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库。
2)库函数
库函数(Library function)是将函数封装入库,供用户使用的一种方式。方法是把一些常用到的函数编完放到一个文件里,供不同的人进行调用。调用的时候把它所在的文件名用#include<>加到里面就可以了。一般是放到lib文件里的。
常用的九大类函数
函数类 | 包含头文件 | 具体函数 |
---|
I/O 函数。包括各种控制台I/O、缓冲型文件I/O和UNIX式非缓冲型文件I/O操作 | stdio.h | getchar,putchar,printf,scanf,fopen,fclose,fgetc,fgets,fprintf,fsacnf,fputc,fputs,fseek,fread,fwrite等。 | 字符串、内存和字符函数。包括对字符串进行各种操作和对字符进行操作的函数 | string.h、mem.h、ctype.h或string.h | 用于检查字符的函数:isalnum,isalpha,isdigit,islower,isspace等。用于字符串操作函数:strcat,strchr,strcmp,strcpy,strlen,strstr等。 | 时间、日期和与系统有关的函数。对时间、日期的操作和设置计算机系统状态等 | time.h | time返回系统的时间;asctime返回以字符串形式表示的日期和时间。 | 数学函数。包括各种常用的三角函数、双曲线函数、指数和对数函数 | math.h | sin,cos,exp(e的x次方),log,sqrt(开平方),pow(x的y次方)等 | 动态存储分配。包括"申请分配"和"释放"内存空间的函数 | alloc.h或stdlib.h | calloc,free,malloc,realloc等 | 目录管理。包括磁盘目录建立、查询、改变等操作的函数 | ---- | ---- | 过程控制。包括最基本的过程控制函数 | ---- | ---- | 字符屏幕和图形功能。包括各种绘制点、线、圆、方和填色等的函数 | ---- | ---- | 其它函数 | ---- | ---- |
3)自定义函数
自定义函数和库函数一样,有函数名,返回值类型和函数参数。
ret_type fun_name(para1, * )
{
statement;
}
ret_type 返回类型
fun_name 函数名
para1 函数参数
写一个函数可以找出两个整数中的最大值。
#include <stdio.h>
int get_max(int x, int y) {
return (x>y)?(x):(y);
}
int main()
{
int num1 = 10;
int num2 = 20;
int max = get_max(num1, num2);
printf("max = %d\n", max);
return 0;
}
4)函数参数
写一个函数可以交换两个整形变量的内容
#include <stdio.h>
void Swap1(int x, int y) {
int tmp = 0;
tmp = x;
x = y;
y = tmp; }
void Swap2(int *px, int *py) {
int tmp = 0;
tmp = *px;
*px = *py;
*py = tmp; }
int main()
{
int num1 = 1;
int num2 = 2;
Swap1(num1, num2);
printf("Swap1::num1 = %d num2 = %d\n", num1, num2);
Swap2(&num1, &num2);
printf("Swap2::num1 = %d num2 = %d\n", num1, num2);
return 0; }
4.1) 实际参数(实参):
真实传给函数的参数,叫实参。 实参可以是:常量、变量、表达式、函数等。 无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形 参。
4.2 )形式参数(形参):
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。
上面 Swap1 和 Swap2 函数中的参数 x,y,px,py 都是形式参数。在main函数中传给 Swap1 的 num1 ,num2 和传给 Swap2 函数的 &num1 , &num2 是实际参数,Swap1 函数在调用的时候, x , y 拥有自己的空间,同时拥有了和实参一模一样的内容。所以我们可以简单的认为:形参实例化之后其实相当于实参的一份临时拷贝。
5) 函数的调用
5.1)传值调用
函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。
5.2)传址调用
传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。 这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
6)函数的嵌套调用和链式访问
函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。
6.1) 嵌套调用
#include <stdio.h>
void new_line()
{
printf("hehe\n");
}
void three_line()
{
int i = 0;
for(i=0; i<3; i++)
{
new_line();
}
}
int main()
{
three_line();
return 0;
}
函数可以嵌套调用,但是不能嵌套定义。
6.2) 链式访问
把一个函数的返回值作为另外一个函数的参数。
#include <stdio.h>
int main()
{
printf("%d", printf("%d", printf("%d", 43)));
return 0; }
结果是43 2 1
7)函数的声明和定义
7.1) 函数声明
- 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数
声明决定不了。 - 函数的声明一般出现在函数的使用之前。要满足先声明后使用。
- 函数的声明一般要放在头文件中的。
7.2) 函数定义
函数的定义是指函数的具体实现,交待函数的功能实现。
8)函数递归
程序调用自身的编程技巧称为递归( recursion)。 递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的 一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解, 只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。 递归的主要思考方式在于:把大事化小
这个是关于递归的几个经典问题
|