C语言三种循环语句_第1页
C语言三种循环语句_第2页
C语言三种循环语句_第3页
C语言三种循环语句_第4页
C语言三种循环语句_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

三种基本的循环语句三种基本的循环语句 for 语句 语句 while 语句和语句和 do while 语语 句 句 一 循环语句一 循环语句 一一 for 循环循环 它的一般形式为它的一般形式为 for 语句语句 初始化总是一个赋值语句 它用来给循环控制变量赋初值 初始化总是一个赋值语句 它用来给循环控制变量赋初值 条件表达式是一个关系表达式 它决定什么时候退出循环 条件表达式是一个关系表达式 它决定什么时候退出循环 增量定义循环控制变量每循环一次后按什么方式变化 这增量定义循环控制变量每循环一次后按什么方式变化 这 三个部分之间用三个部分之间用 分开 分开 例如例如 for i 1 i10 时 结束循环 时 结束循环 注意注意 1 for 循环中语句可以为语句体循环中语句可以为语句体 但要用但要用 和和 将参加循环的将参加循环的 语句括起来 语句括起来 2 for 循环中的初始化 条件表达式和增量都是选择项 循环中的初始化 条件表达式和增量都是选择项 即可以缺省 但即可以缺省 但 不能缺省 省略了初始化 表示不对循环不能缺省 省略了初始化 表示不对循环 控制变量赋初值 省略了条件表达式 则不做其它处理时控制变量赋初值 省略了条件表达式 则不做其它处理时 便成为死循环 省略了增量 则不对循环控制变量进行操便成为死循环 省略了增量 则不对循环控制变量进行操 作 这时可在语句体中加入修改循环控制变量的语句 作 这时可在语句体中加入修改循环控制变量的语句 3 for 循环可以有多层嵌套 循环可以有多层嵌套 例如 例如 for 语句语句 for i 1 i 2 语句语句 for j 5 语句语句 这些这些 for 循环语句都是正确的 循环语句都是正确的 main int i j printf i j n for i 0 i 2 i for j 0 j 3 j printf d d n i j 输出结果为输出结果为 i j 0 0 0 1 0 2 1 0 1 1 1 2 用用 for 循环求循环求 1 2 100 的和 的和 main int sn 0 i for i 1 i 100 i sn i 1 2 100 printf d n sn 从程序可以看出 使用循环语句可以大大简化代码 从程序可以看出 使用循环语句可以大大简化代码 二二 while 循环循环 它的一般形式为它的一般形式为 while 条件条件 语句语句 while 循环表示当条件为真时 便执行语句 直到条件为假循环表示当条件为真时 便执行语句 直到条件为假 才结束循环 并继续执行循环程序外的后续语句 才结束循环 并继续执行循环程序外的后续语句 例如 例如 include stdio h main char c c 0 初始化初始化 c while c n 回车结束循环回车结束循环 c getche 带回显的从键盘接收字符带回显的从键盘接收字符 上例中 上例中 while 循环是以检查循环是以检查 c 是否为回车符开始 因其事是否为回车符开始 因其事 先被初始化为空 所以条件为真 进入循环等待键盘输入先被初始化为空 所以条件为真 进入循环等待键盘输入 字符 一旦输入回车 则字符 一旦输入回车 则 c n 条件为假 循环便告结束 条件为假 循环便告结束 与与 for 循环一样 循环一样 while 循环总是在循环的头部检验条件 循环总是在循环的头部检验条件 这就意味着循环可能什么也不执行就退出 这就意味着循环可能什么也不执行就退出 注意注意 1 在在 while 循环体内也允许空语句 循环体内也允许空语句 例如例如 while c getche n 这个循环直到键入回车为止 这个循环直到键入回车为止 2 可以有多层循环嵌套 可以有多层循环嵌套 3 语句可以是语句体语句可以是语句体 此时必须用此时必须用 和和 括起来 括起来 用用 while 循环求循环求 1 2 100 的和 的和 main int sn 0 i 0 while i 100 sn i 求求 1 2 100 printf d n sn 三三 do while 循环循环 它的一般格式为它的一般格式为 do 语句块语句块 while 条件条件 这个循环与这个循环与 while 循环的不同在于循环的不同在于 它先执行循环中的语句它先执行循环中的语句 然后再判断条件是否为真 如果为真则继续循环 如果为然后再判断条件是否为真 如果为真则继续循环 如果为 假 则终止循环 因此 假 则终止循环 因此 do while 循环至少要执行一次循循环至少要执行一次循 环语句 环语句 同样当有许多语句参加循环时 要用同样当有许多语句参加循环时 要用 和和 把它们括起来 把它们括起来 用用 do while 循环求循环求 1 2 100 的和 的和 main int sn 0 i 1 do sn i 求求 1 2 100 while i 100 printf d n sn 从上面三个程序看出 使用从上面三个程序看出 使用 for while 和和 do while 求解求解 同样的问题 基本思路都差不多 只是在第一次计算时 同样的问题 基本思路都差不多 只是在第一次计算时 注意初值 注意初值 二 循环控制二 循环控制 一一 break 语句语句 break 语句通常用在循环语句和开关语句中 当语句通常用在循环语句和开关语句中 当 break 用用 于开关语句于开关语句 switch 中时 可使程序跳出中时 可使程序跳出 switch 而执行而执行 switch 以后的语句 如果没有以后的语句 如果没有 break 语句 则将成为一个语句 则将成为一个 死循环而无法退出 死循环而无法退出 break 在在 switch 中的用法已在前面介中的用法已在前面介 绍开关语句时的例子中碰到 这里不再举例 绍开关语句时的例子中碰到 这里不再举例 当当 break 语句用于语句用于 do while for while 循环语句中时 循环语句中时 可使程序终止循环而执行循环后面的语句 通常可使程序终止循环而执行循环后面的语句 通常 break 语语 句总是与句总是与 if 语句联在一起 即满足条件时便跳出循环 语句联在一起 即满足条件时便跳出循环 例如 例如 main int sn 0 i for i 1 i 100 i if i 51 break 如果如果 i 等于等于 51 则跳出循环 则跳出循环 sn i 1 2 50 printf d n sn 可以看出 最终的结果是可以看出 最终的结果是 1 2 50 因为在 因为在 i 等于等于 51 的时候 就跳出循环了 自己写写怎样在的时候 就跳出循环了 自己写写怎样在 while 和和 do while 循环中增加循环中增加 break 语句 语句 注意注意 1 break 语句对语句对 if else 的条件语句不起作用 的条件语句不起作用 2 在多层循环中 一个在多层循环中 一个 break 语句只向外跳一层 语句只向外跳一层 例如 例如 main int i j printf i j n for i 0 i 2 i for j 0 j 3 j if j 2 break printf d d n i j 输出结果为输出结果为 i j 0 0 0 1 1 0 1 1 当当 i 0 j 2 时 执行时 执行 break 语句 跳出到外层的循环 语句 跳出到外层的循环 i 变为变为 1 二二 continue 语句语句 continue 语句的作用是跳过循环本中剩余的语句而强行执语句的作用是跳过循环本中剩余的语句而强行执 行下一次循环 行下一次循环 continue 语句只用在语句只用在 for while do while 等循环体中等循环体中 常与常与 if 条件语句一起使用 用来加速循环 条件语句一起使用 用来加速循环 例如 例如 main int sn 0 i for i 1 i 100 i if i 51 continue 如果如果 i 等于等于 51 则结束本次循环 则结束本次循环 sn i 1 2 50 52 100 printf d n sn 从程序中可以看出 从程序中可以看出 continue 语句只是当前的值没有执行 语句只是当前的值没有执行 也就是说当前的值跳过去了 接着执行下次循环 也就是说当前的值跳过去了 接着执行下次循环 main int i j printf i j n for i 0 i 2 i for j 0 j 3 j if j 1 continue printf d d n i j 输出结果为输出结果为 i j 0 0 0 2 1 0 1 2 三三 goto 语句语句 goto 语句是一种无条件转移语句 与语句是一种无条件转移语句 与 BASIC 中的中的 goto 语语 句相似 句相似 goto 语句的使用格式为语句的使用格式为 goto 标号标号 其中标号是其中标号是 Turbo C 2 0 中一个有效的标识符 这个标识符中一个有效的标识符 这个标识符 加上一个加上一个 一起出现在函数内某处 执行一起出现在函数内某处 执行 goto 语句后 程序语句后 程序 将跳转到该标号处并执行其后的语句 标号既然是一个标将跳转到该标号处并执行其后的语句 标号既然是一个标 识符 也就要满足标识符的命名规则 另外标号必须与识符 也就要满足标识符的命名规则 另外标号必须与 goto 语句同处于一个函数中 但可以不在一个循环层中 语句同处于一个函数中 但可以不在一个循环层中 通常通常 goto 语句与语句与 if 条件语句连用 当满足某一条件时 程条件语句连用 当满足某一条件时 程 序跳到标号处运行 序跳到标号处运行 goto 语句通常不用 主要因为它将使语句通常不用 主要因为它将使 程序层次不清 且不易读 但在多层嵌套退出时 用程序层次不清 且不易读 但在多层嵌套退出时 用 goto 语句则比较合理 语句则比较合理 main int sn 0 i for i 1 i 100 i if i 51 goto loop 如果如果 i 等于等于 51 则跳出循环 则跳出循环 sn i 1 2 50 loop printf d n sn 可以看出 这儿的可以看出 这儿的 goto 语句和语句和 break 作用很类似 作用很类似 这儿的这儿的 loop printf d n sn 也可以写成也可以写成 loop printf d n sn main int sn 0 i for i 1 i 100 i if i 51 goto loop 如果如果 i 等于等于 51 则跳出本次循环 则跳出本次循环 sn i 1 2 50 52 100 loop printf d n sn 可以看出这儿的可以看出这儿的 loop 语句和语句和 continue 的作用类似 的作用类似 但是某些情况下又必须使用但是某些情况下又必须使用 goto 语句 否则会让程序大大语句 否则会让程序大大 臃肿 如 臃肿 如 main int i j k printf i j k n for i 0 i 2 i for j 0 j 3 j for k 0 k 3 k if k 2 goto loop printf d d d n i j k loop 输出结果为输出结果为 i j k 0 0 0 0 0 1 如果不使用如果不使用 goto 语句 而使用语句 而使用 break continue 语句 应语句 应 该这样该这样 main int i j k printf i j n for i 0 i 2 i for j 0 j 3 j for k 0 k0 i if num1 i 0 printf 最大公约数为最大公约数为 d n i 2 求求 1 2 n n 10 main int n i long temp 1 sn 0 从从 9 以后以后 所得的值就超过了所得的值就超过了 int 范围范围 scanf d for i 1 i n i temp i sn temp 如果没有这一步 求的就是如果没有这一步 求的就是 n printf ld n sn 那么想想 如果求那么想想 如果求 1 3 5 n 应该怎么办 应该怎么办 3 判断一个整数是不是素数判断一个整数是不是素数 素数就是只能被本身和素数就是只能被本身和 1 整除整除 的数的数 include math h main int num i flag 0 scanf d for i 2 i flag 0 标志变量复位标志变量复位 if num i 0 flag 1 break if flag 0 printf 是素数是素数 n else printf 不是素数不是素数 n 可以说 在所有的可以说 在所有的 C 语言书上 都有判断素数的例题 它语言书上 都有判断素数的例题 它 的编程思想是 的编程思想是 把一个变量作为标志变量 用来标志是不把一个变量作为标志变量 用来标志是不 是素数 循环体是从是素数 循环体是从 2 到到 sqrt num 因为如果一个数不 因为如果一个数不 是素数的话 一定能分解成是素数的话 一定能分解成 num num1 num2 它们中的 它们中的 最小值一定小于最小值一定小于 sqrt num 所以循环的时候只要到 所以循环的时候只要到 sqrt num 就可以了 同时要注意变量复位的问题 就可以了 同时要注意变量复位的问题 二 递归二 递归 递归 是函数实现的一个很重要的环节 很多程序中都或递归 是函数实现的一个很重要的环节 很多程序中都或 多或少的使用了递归函数 递归的意思就是函数自己调用多或少的使用了递归函数 递归的意思就是函数自己调用 自己本身 或者在自己函数调用的下级函数中调用自己 自己本身 或者在自己函数调用的下级函数中调用自己 递归之所以能实现 是因为函数的每个执行过程都在栈中递归之所以能实现 是因为函数的每个执行过程都在栈中 有自己的形参和局部变量的拷贝 这些拷贝和函数的其他有自己的形参和局部变量的拷贝 这些拷贝和函数的其他 执行过程毫不相干 这种机制是当代大多数程序设计语言执行过程毫不相干 这种机制是当代大多数程序设计语言 实现子程序结构的基础 是使得递归成为可能 假定某个实现子程序结构的基础 是使得递归成为可能 假定某个 调用函数调用了一个被调用函数 再假定被调用函数又反调用函数调用了一个被调用函数 再假定被调用函数又反 过来调用了调用函数 这第二个调用就被称为调用函数的过来调用了调用函数 这第二个调用就被称为调用函数的 递归 因为它发生在调用函数的当前执行过程运行完毕之递归 因为它发生在调用函数的当前执行过程运行完毕之 前 而且 因为这个原先的调用函数 现在的被调用函数前 而且 因为这个原先的调用函数 现在的被调用函数 在栈中较低的位置有它独立的一组参数和自变量 原先的在栈中较低的位置有它独立的一组参数和自变量 原先的 参数和变量将不受影响 所以递归能正常工作 程序遍历参数和变量将不受影响 所以递归能正常工作 程序遍历 执行这些函数的过程就被称为递归下降 执行这些函数的过程就被称为递归下降 程序员需保证递归函数不会随意改变静态变量和全局变量程序员需保证递归函数不会随意改变静态变量和全局变量 的值 以避免在递归下降过程中的上层函数出错 程序员的值 以避免在递归下降过程中的上层函数出错 程序员 还必须确保有一个终止条件来结束递归下降过程 并且返还必须确保有一个终止条件来结束递归下降过程 并且返 回到顶层 回到顶层 例如这样的程序就是递归 例如这样的程序就是递归 void a int main int num 5 a num void a int num if num 0 return printf d num a num 在函数在函数 a 里面又调用了自己 也就是自己调用本身 这样里面又调用了自己 也就是自己调用本身 这样 就是递归 那么有些人可能要想 这不是死循环吗 所以就是递归 那么有些人可能要想 这不是死循环吗 所以 在递归函数中 一定要有在递归函数中 一定要有 return 语句 没有语句 没有 return 语句语句 的递归函数是死循环 的递归函数是死循环 我们分析上面的例子 先调用我们分析上面的例子 先调用 a 5 然后输出 然后输出 5 再在函 再在函 数中调用本身数中调用本身 a 4 接着回到函数起点 输出 接着回到函数起点 输出 4 一 一 直到调用直到调用 a 0 这时发现已经满足 这时发现已经满足 if 条件 不在调用而是条件 不在调用而是 返回了 所以这个递归一共进行了返回了 所以这个递归一共进行了 5 次 如果没有这个次 如果没有这个 return 肯定是死循环的 肯定是死循环的 虽然递归不难理解 但是很多在在使用递归函数的时候 虽然递归不难理解 但是很多在在使用递归函数的时候 问题多多 这里面一般有两个原因 一是如何往下递归 问题多多 这里面一般有两个原因 一是如何往下递归 也就是不知道怎么取一个变量递归下去 二是不知道怎么也就是不知道怎么取一个变量递归下去 二是不知道怎么 终止递归 经常弄个死循环出来 终止递归 经常弄个死循环出来 下面看几个例子 下面看几个例子 1 求求 1 2 100 的和的和 先分析一下 第一递归变量的问题 从题目上看应该取先分析一下 第一递归变量的问题 从题目上看应该取 1 2 100 这些变量的值作为递归的条件 第二就是如何这些变量的值作为递归的条件 第二就是如何 终止的问题 从题目上看应该是当数为终止的问题 从题目上看应该是当数为 100 的时候就不能的时候就不能 往下加了 那么我们试着写一下程序 往下加了 那么我们试着写一下程序 int add int main int num 1 sn sn add num printf d n sn getch int add int num static int sn sn num if num 100 return sn add num 分析一下程序 前调用分析一下程序 前调用 add 1 然后在子函数中把这个 然后在子函数中把这个 1 加到加到 sn 上面 接着调用上面 接着调用 add 2 再把 再把 sn 加加 2 上来 这样上来 这样 一直到一直到 100 到了 到了 100 的时候 先加上来 然后发现满足的时候 先加上来 然后发现满足 了了 if 条件 这时返回条件 这时返回 sn 的值 也就是的值 也就是 1 2 100 的值的值 了 了 这里有一个问题一定要注意 就是这里有一个问题一定要注意 就是 static int sn 有些人就不明白 为什么要使用有些人就不明白 为什么要使用 static 类型修饰符 为什类型修饰符 为什 么不使用么不使用 int sn 0 如果使用 如果使用 int sn 0 这样的语句 在每这样的语句 在每 次调用函数次调用函数 add 的时候 的时候 sn 的值都是赋值为的值都是赋值为 0 也就是第也就是第 一步虽然加了一步虽然加了 1 上来 可是第二次调用的时候 上来 可是第二次调用的时候 sn 又回到又回到 了了 0 我们前面说了 我们前面说了 static 能保证本次初始化的值是上次能保证本次初始化的值是上次 执行后的值 这样也就保证了前面想加的结果不会丢失 执行后的值 这样也就保证了前面想加的结果不会丢失 如果你修改为如果你修改为 int sn 0 最后结果一定是最后的 最后结果一定是最后的 100 这个这个 值而不是值而不是 5050 2 求数列求数列 s n s n 1 s n 2 的第的第 n 项 其中项 其中 s 1 s 2 1 可以看出 终止条件一定是可以看出 终止条件一定是 s 1 s 2 1 递归下降的参数 递归下降的参数 一定是一定是 n int a int main int n s scanf d s a n printf d n s getch int a int n if n 3 return 1 return a n 1 a n 2 这个题目主要说明的是 在函数中 不一定只有一个这个题目主要说明的是 在函数中 不一定只有一个 return 语句 可以有很多 但是每次对归的时候只有一个语句 可以有很多 但是每次对归的时候只有一个 起作用 题目不难理解 这儿不分析了 起作用 题目不难理解 这儿不分析了 说了这些递归 其实它和函数的调用没有大的区别 主要说了这些递归 其实它和函数的调用没有大的区别 主要 就是一个终止条件要选好 递归函数很多时候都能用循环就是一个终止条件要选好 递归函数很多时候都能用循环 来处理 来处理 main int n 20 array 20 int i for i 0 i N I if i 2 array i 1 else array i array i 1 array i 2 printf d n array 19 getch 上面的程序就是实现一模一样的功能的 但是它有一个缺上面的程序就是实现一模一样的功能的 但是它有一个缺 陷 就是陷 就是 n 的值不是通过键盘输入来得到 如果想通过键的值不是通过键盘输入来得到 如果想通过键 盘来得到盘来得到 n 可以这样 可以这样 main int n i int s1 1 s2 1 temp scanf d for i 3 i 自左向右自左向右 如果表达式的值为非如果表达式的值为非 0 则执行语句 则执行语句 1 否则跳过语句继续 否则跳过语句继续 执行下面的语句 执行下面的语句 如果语句如果语句 1 有多于一条语句要执行时有多于一条语句要执行时 必须使用必须使用 和和 把这把这 些语句包括在其中些语句包括在其中 此时条件语句形式为此时条件语句形式为 if 表达式表达式 语句体语句体 1 例如 例如 if x 0 y x if a b c z 二 二 if else 语句语句 除了可以指定在条件为真时执行某些语句外 还可以在条除了可以指定在条件为真时执行某些语句外 还可以在条 件为假时执行另外一段代码 在件为假时执行另外一段代码 在 C 语句中利用语句中利用 else 语句来语句来 达到这个目的 达到这个目的 if 表达式表达式 语句语句 1 else 语句语句 2 同样 当语句同样 当语句 1 或语句或语句 2 是多于一个语句时 需要用是多于一个语句时 需要用 把把 语句括起来 语句括起来 例如 例如 if x 0 y x else y x 三 三 if else if else 结构 结构 if 表达式表达式 1 语句语句 1 else if 表达式表达式 2 语句语句 2 else if 表达式表达式 3 语句语句 3 else 语句语句 n 这种结构是从上到下逐个对条件进行判断这种结构是从上到下逐个对条件进行判断 一旦发现条件满一旦发现条件满 点足就执行与它有关的语句点足就执行与它有关的语句 并跳过其它剩余阶梯并跳过其它剩余阶梯 若没有若没有 一个条件满足一个条件满足 则执行最后一个则执行最后一个 else 语句语句 n 最后这个 最后这个 else 常起着缺省条件的作用 同样常起着缺省条件的作用 同样 如果每一个条件中有多于一如果每一个条件中有多于一 条语句要执行时条语句要执行时 必须使用必须使用 和和 把这些语句包括在其中 把这些语句包括在其中 条件语句可以嵌套条件语句可以嵌套 这种情况经常碰到这种情况经常碰到 但条件嵌套语句容易但条件嵌套语句容易 出错出错 其原因主要是不知道哪个其原因主要是不知道哪个 if 对应哪个对应哪个 else 例如例如 if x 20 x 10 if yx printf Good else printf Bad 对于上述情况对于上述情况 Turbo C2 0 规定规定 else 语句与最近的一个语句与最近的一个 if 语句匹配语句匹配 上例中的上例中的 else 与与 if yx 相匹配 为相匹配 为 了使了使 else 与与 if x 20 x20 x 10 if yx printf Good else printf Bad 下面举几个例子 下面举几个例子 1 输入一个数输入一个数 如果大于如果大于 0 输出 输出 plus 如果是负数 输出如果是负数 输出 negative 如果正好是如果正好是 0 则输出 则输出 zero main float num scanf f if num 0 printf plus n else if num 0 y x else y x printf f n y 程序比较简单 这儿就不分析了 程序比较简单 这儿就不分析了 其实其实 Trubo C 2 0 把一些常用的功能都写好了 我们只需要把一些常用的功能都写好了 我们只需要 使用就可 例如求绝对值的功能在使用就可 例如求绝对值的功能在 C 的库里面就有 看下的库里面就有 看下 面的 面的 include math h main float x y scanf f y fabs x 求求 x 的绝对值 然后赋值给的绝对值 然后赋值给 y printf f n y 这个程序和上面的程序完成的功能是一模一样的 都是求这个程序和上面的程序完成的功能是一模一样的 都是求 绝对值 可以看出 用下面这个方法比上面就要好一些 绝对值 可以看出 用下面这个方法比上面就要好一些 由于由于 fabs 是一个函数 系统自带的 所以在使用它的时是一个函数 系统自带的 所以在使用它的时 候 我们必须把它所在的库文件候 我们必须把它所在的库文件 math h 包含都程序中 即包含都程序中 即 程序最前面一行 类似的还有求开方程序最前面一行 类似的还有求开方 sqrt 求指数幂 求指数幂 exp 等等 这些与数学方面有关的函数都在等等 这些与数学方面有关的函数都在 math h 里面 里面 具体哪些有哪些没有 在什么库里面 可以查看一些手册 具体哪些有哪些没有 在什么库里面 可以查看一些手册 3 输入输入 x 输出 输出 y x 和和 y 满足关系 满足关系 x 5 y x 5 x 1 y 2 x 5 1 x 4 y 3 x 2 程序如下 程序如下 main float x y scanf f if x 5 y x else if 5 x else if 1 x else y 3 x 2 printf f n y 这里要说明两点 这里要说明两点 1 5 x1 x if y z printf f t f n y z else printf f t f n z y else if y x if x z printf f t f n x z else printf f t f n z x else printf f t z if x y printf f t f n x y else printf f t f n y x 说明 这是一个典型的说明 这是一个典型的 if 语句嵌套结构 如果不使用括号 语句嵌套结构 如果不使用括号 那么那么 if 和和 else 的对应关系就乱了 的对应关系就乱了 四 四 switch case 语句语句 在编写程序时在编写程序时 经常会碰到按不同情况分转的多路问题经常会碰到按不同情况分转的多路问题 这这 时可用嵌套时可用嵌套 if else if 语句来实现语句来实现 但但 if else if 语句使用不语句使用不 方便方便 并且容易出错 对这种情况并且容易出错 对这种情况 Turbo C2 0 提供了一个提供了一个 开关语句 开关语句格式为开关语句 开关语句格式为 switch 变量变量 case 常量常量 1 语句语句 1 或空或空 case 常量常量 2 语句语句 2 或空或空 case 常量常量 n 语句语句 n 或空或空 default 语句语句 n 1 或空或空 执行执行 switch 开关语句时开关语句时 将变量逐个与将变量逐个与 case 后的常量进行后的常量进行 比较比较 若与其中一个相等若与其中一个相等 则执行该常量下的语句则执行该常量下的语句 若不与任何若不与任何 一个常量相等一个常量相等 则执行则执行 default 后面的语句 后面的语句 注意注意 1 switch 中变量可以是数值 也可以是字符 但必须是整中变量可以是数值 也可以是字符 但必须是整 数数 2 可以省略一些可以省略一些 case 和和 default 3 每个每个 case 或或 default 后的语句可以是语句体后的语句可以是语句体 但不需要使但不需要使 用用 和和 括起来 括起来 例如 例如 main int x y scanf d witch x case 1 y x 1 break 退出开关语句退出开关语句 遇到遇到 break 才退出才退出 case 4 y 2 x 1 break default y x break printf d n y 从上面的例子可以看出 用开关语句编的程序一定可以用从上面的例子可以看出 用开关语句编的程序一定可以用 if 语句做 那么在什么情况下需要用语句做 那么在什么情况下需要用 switch 语句呢 语句呢 一般在一般在 出现比较整的情况下或者能转化成比较整数的情况下使用 出现比较整的情况下或者能转化成比较整数的情况下使用 看下面的例子 看下面的例子 例子例子 一个学生的成绩分成五等 超过 一个学生的成绩分成五等 超过 90 分的为分的为 A 80 89 的为的为 B 70 79 为为 C 60 69 为为 D 60 分以下为分以下为 E 现在输入一个学生的成绩 输出他的等级 现在输入一个学生的成绩 输出他的等级 1 用用 if 语句语句 main float num char grade scanf d if num 90 grade A else if num 80 else grade E printf c grade 2 用用 switch 语句语句 main int num char grade scanf d num 10 switch num case 10 case 9 grade A break case 8 grade B break case 7 grade C break case 6 grade D break default grade E break printf c grade 说明一点 并不是每个说明一点 并不是每个 case 里面有都语句 有时侯里面是里面有都语句 有时侯里面是 空的 就好象这一题 空的 就好象这一题 switch 语句执行的顺序是从第一语句执行的顺序是从第一 case 判断 如果正确就往下执行 直到判断 如果正确就往下执行 直到 break 如果不正 如果不正 确 就执行下一个确 就执行下一个 case 所以在这里 当成绩是 所以在这里 当成绩是 100 分时 分时 执行执行 case 10 然后往下执行 然后往下执行 grade A break 退出 退出 想想看 这里为什么要用想想看 这里为什么要用 num 10 假设当程序中有浮点数时怎么办呢 假设当程序中有浮点数时怎么办呢 前面我们说的都是无参数无返回值的函数 实际程序中 前面我们说的都是无参数无返回值的函数 实际程序中 我们经常使用到带参数有返回值的函数 我们经常使用到带参数有返回值的函数 一 函数参数传递一 函数参数传递 1 形式参数和实际参数形式参数和实际参数 函数的调用值把一些表达式作为参数传递给函数 函数定函数的调用值把一些表达式作为参数传递给函数 函数定 义中的参数是形式参数 函数的调用者提供给函数的参数义中的参数是形式参数 函数的调用者提供给函数的参数 叫实际参数 在函数调用之前 实际参数的值将被拷贝到叫实际参数 在函数调用之前 实际参数的值将被拷贝到 这些形式参数中 这些形式参数中 2 参数传递参数传递 先看一个例子 先看一个例子 void a int 注意函数声明的形式注意函数声明的形式 main int num scanf d a num 注意调用形式注意调用形式 void a int num back 注意定义形式注意定义形式 printf d n num back 在主函数中 先定义一个变量 然后输入一个值 在在主函数中 先定义一个变量 然后输入一个值 在 a 这这 个函数中输出 当程序运行个函数中输出 当程序运行 a num 这一步时 把这一步时 把 num 的的 值赋值给值赋值给 num back 在运行程序过程中 把实际参数的值 在运行程序过程中 把实际参数的值 传给形式参数 这就是函数参数的传递 传给形式参数 这就是函数参数的传递 形参和实参可能不只一个 如果多于一个时 函数声明 形参和实参可能不只一个 如果多于一个时 函数声明 调用 定义的形式都要一一对应 不仅个数要对应 参数调用 定义的形式都要一一对应 不仅个数要对应 参数 的数据类型也要对应 的数据类型也要对应 void a int float main int num1 float num2 scanf d scanf f a num1 num2 void a int num1 back float num2 back printf d f n num1 back num2 back 上面的例子中 函数有两个参数 一个是整型 一个是浮上面的例子中 函数有两个参数 一个是整型 一个是浮 点型 那么在声明 调用 定义的时候 不仅个数要一样 点型 那么在声明 调用 定义的时候 不仅个数要一样 类型也要对应 如果不对应 有可能使的编译错误 即使类型也要对应 如果不对应 有可能使的编译错误 即使 没错误 也有可能让数据传递过程中出现错误 没错误 也有可能让数据传递过程中出现错误 再看一个例子 再看一个例子 void a int main int num scanf d a num void a int num printf d n num 看上面的例子 形式参数和实际参数的标识符都是看上面的例子 形式参数和实际参数的标识符都是 num 程序把实际参数程序把实际参数 num 的值传递给形式参数的值传递给形式参数 num 有些人可 有些人可 能就不明白了 既然两个都是能就不明白了 既然两个都是 num 为什么还要传递呢 为什么还要传递呢 干脆这样不就行了吗 干脆这样不就行了吗 void a main int num scanf d a void a printf d n num 其实不然 这就要涉及到标识符作用域的问题 作用域的其实不然 这就要涉及到标识符作用域的问题 作用域的 意思就是说 哪些变量在哪些范围内有效 一个标识符在意思就是说 哪些变量在哪些范围内有效 一个标识符在 一个语句块中声明 那么这个标识符仅在当前和更低的语一个语句块中声明 那么这个标识符仅在当前和更低的语 句块中可见 在函数外部的其实地方不可见 其他地方同句块中可见 在函数外部的其实地方不可见 其他地方同 名的标识符不受影响 后面我们会系统讲解作用域的问题 名的标识符不受影响 后面我们会系统讲解作用域的问题 在这儿你就要知道两个同名的变量在不同的函数中是互不在这儿你就要知道两个同名的变量在不同的函数中是互不 干扰的 干扰的 前面将的都是变量与变量之间的值传递 其实函数也可以前面将的都是变量与变量之间的值传递 其实函数也可以 传递数组之间的值 看下面的例子 传递数组之间的值 看下面的例子 void a int main int array 5 i for i 0 i 5 i scanf d a array void a int array int i for i 0 i 5 i printf d t array i printf n 这就是数组之间的值传递 注意他们的声明和定义形式 这就是数组之间的值传递 注意他们的声明和定义形式 和变量参数传递有什么区别 和变量参数传递有什么区别 有了后面的有了后面的 就表明传递的是就表明传递的是 一个数组 一个数组 其中在定义的时候 也可以写成其中在定义的时候 也可以写成 void a int array 5 想想 如果我们写成了想想 如果我们写成了 int array 4 会有什么情会有什么情 况发生 况发生 目前我们只学了数组和变量 以后还会知道指针 结构 目前我们只学了数组和变量 以后还会知道指针 结构 到那是 函数也可以传递它们之间的值 到那是 函数也可以传递它们之间的值 二 函数值的返回二 函数值的返回 其实我们也可以把函数当作一个变量来看 既然是变量 其实我们也可以把函数当作一个变量来看 既然是变量 那一定也可以有类型 还举最前面的例子 现在要求在那一定也可以有类型 还举最前面的例子 现在要求在 main 函数里输入一个整数作为正方形的边长 在子函数函数里输入一个整数作为正方形的边长 在子函数 里求正方形的面积 然后再在主函数里输出这个面积 里求正方形的面积 然后再在主函数里输出这个面积 我们前面的程序都是在子函数里输出的 现在要求在主函我们前面的程序都是在子函数里输出的 现在要求在主函 数里输出 这就需要把算好的值返回回来 先看例子 数里输出 这就需要把算好的值返回回来 先看例子 int a int 声明函数声明函数 main int num area scanf d area a num 调用时的形式调用时的形式 printf d area int a int num int area back area back num num return area back 返回一个值返回一个值 和前面的程序有几点不同 和前面的程序有几点不同 1 声明函数类型时 不是声明函数类型时 不是 void 而是 而是 int 这是由于最后 这是由于最后 要求的面积是整型的 所以声明函数的返回值类型是整型 要求的面积是整型的 所以声明函数的返回值类型是整型 2 return 语句语句 它的意思就是返回一个值 在它的意思就是返回一个值 在 C 语言中 语言中 return 一定是在函数的最后一行 一定是在函数的最后一行 3 调用函数的时候调用函数的时候 由于函数有一个返回值 所以必须要用由于函数有一个返回值 所以必须要用 变量接受这个返回值变量接受这个返回值 不是绝对的不是绝对的 如果我们不用一个变量 如果我们不用一个变量 接受这个值 函数还照样返回 但是返回的这个值没有使接受这个值 函数还照样返回 但是返回的这个值没有使 用 用 上面的例子运行过程是这样的 先把实参的值传递给形参 上面的例子运行过程是这样的 先把实参的值传递给形参 然后在子函数里计算面积得到然后在子函数里计算面积得到 area back 然后返回这个面 然后返回这个面 积到主函数 也就是把积到主函数 也就是把 area back 赋值给赋值给 area 最后输出 最后输出 前面说了 返回值有时不一定非要用一个变量来接受 我前面说了 返回值有时不一定非要用一个变量来接受 我 们可以把上面的程序简化为 们可以把上面的程序简化为 int a int main int num scanf d printf d a num 函数调用放在这儿函数调用放在这儿 int a int num int area back area back num num return area back 这样函数返回的值就可以直接放到输出缓冲区直接输出了 这样函数返回的值就可以直接放到输出缓冲区直接输出了 还可以再简化为 还可以再简化为 int a int main int num scanf d printf d a num int a int num return num num 直接在这儿返回直接在这儿返回 对于函数而言 一个函数只能返回一个值 如果想返回一对于函数而言 一个函数只能返回一个值 如果想返回一 组数值 就要使用数组或者结构或者指针 其实对于这些 组数值 就要使用数组或者结构或者指针 其实对于这些 还是返回一个值 只是这个值是一个地址而已 但是对于还是返回一个值 只是这个值是一个地址而已 但是对于 数组的返回有和变量不同 因为数组和地址是联系在一起数组的返回有和变量不同 因为数组和地址是联系在一起 的 看一个例子 的 看一个例子 void a int main int array 5 1 2 3 4 5 i a array for i 0 i 5 i printf d array i void a int array int i for i 0 i 5 i array i 看看这个程序 好象函数没有返回值 但是函数的功能的看看这个程序 好象函数没有返回值 但是函数的功能的 确实现了 在主函数当中输出的值的确都各加了确实现了 在主函数当中输出的值的确都各加了 1 上来 上来 这就是因为数组和变量不同的缘故 在后面讲指针的时候这就是因为数组和变量不同的缘故 在后面讲指针的时候 再详细说明 再详细说明 下面看一个实际例子 加深对函数的理解 下面看一个实际例子 加深对函数的理解 用函数实现 判断一个整数是不是素数 在主函数里输入用函数实现 判断一个整数是不是素数 在主函数里输入 输出 子函数里判断 输出 子函数里判断 include math h int judge int main int num result scanf d result judge num if result 1 printf yes n else printf no n judge int num int i flag 1 for i 2 i sqrt num i if num i 0 flag 0 break return flag 可以看出 函数的功能就是为了让程序看起来有条理 一可以看出 函数的功能就是为了让程序看起来有条理 一 个函数实现一个特定的功能 如果我们还和以前那样 把个函数实现一个特定的功能 如果我们还和以前那样 把 所有代码都放在所有代码都放在 main 函数 好象程序就显的臃肿了 而函数 好象程序就显的臃肿了 而 且函数有一个显著的好处就是很方便的使用 这里面的且函数有一个显著的好处就是很方便的使用 这里面的 judge 函数判断一个数是不是素数 如果我们以后还有判函数判断一个数是不是素数 如果我们以后还有判 断某个数是不是素数 就可以直接使用这个函数了 我们断某个数是不是素数 就可以直接使用这个函数了 我们 这样 把下面的代码 这样 把下面的代码 judge int num int i flag 1 for i 2 i sqrt num i if num i 0 flag 0 break return flag 保存为保存为 judge h 文件 放到文件 放到 include 目录里面 目录里面 以后就可以直接使用这个函数了 就好象直接使用以后就可以直接使用这个函数了 就好象直接使用 abs sqrt 这些函数一样方便 这些函数一样方便 include math h 必须要有它必须要有它 include judge h main int num result scanf d result judge num if result 1 printf yes n else p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论