【零基础C语言】第三节 控制结构
【零基础C语言】第一节 C语言概述+【数制进制码制】-CSDN博客
【零基础C语言】第二节 数据类型、运算符、表达式-CSDN博客
目录
1.三大基本结构的共同特点
2.多分支选择结构
一、顺序结构
1.1 输入输出
(1)标准/格式化输入
(2)标准/格式化输出
(3)字符的输入/输出
1.2 算法
(1)一个程序应包括内容
(2)计算机科学家沃思:
(3)完整的程序设计
(4)计算机算法两大类别
☆☆☆代码练习题☆☆☆
二、选择结构
2.1 关系表达式
2.2 逻辑表达式
2.3 条件表达式
☆☆☆代码练习题☆☆☆
字母大小写的判断和转换
2.4 if语句
2.5 switch语句
三、循环结构
3.1 while() 语句(“当……”)
3.2 do…while() 语句
3.3 for() 语句(常用)
3.4 continue 和 break
(1)continue 语句
(2) break 语句
☆☆☆代码练习题☆☆☆
①判断是否为素数/质数
②求两数的最大公约数
Bohra 和 Jacopini 提出了以下三种基本结构作为表示一个良好算法的基本单元:顺序结构、选择结构、循环结构。
算法的四种表示方式:自然语言,伪代码、流程图、N-S图


1.三大基本结构的共同特点
- 只有一个入口和一个出口
- 结构内的每一部分都有机会被执行到
- 结构内不存在“死循环”(无终止的循环)
- 由三种基本结构顺序组成的算法结构,可以解决任何复杂的问题。
- 由基本结构所构成的算法属于“结构化”的算法,它不存在无规律的转向,只在本基本结构内才允许存在分支和向前或向后的跳转。
- 只要具有上述四个特点的都可以作为基本结构。
- 可以自己定义基本结构,并由这些基本结构组成结构化程序。
2.多分支选择结构

一、顺序结构
1.1 输入输出

(1)标准/格式化输入
scanf("格式控制字符串",变量地址);
格式符 | 数据类型 | 说明 |
---|---|---|
%d %i | 十进制整数 | 带符号(正数不输出符号) |
%c | 一个字符 | 单个字符 |
%s | 字符串 | 以 null 结尾的字符数组 |
%u | 十进制整数 | 无符号 |
%o | 八进制整数 | 无符号,不输出前导符0 |
%x %X | 十六进制整数 | 小写字母 大写字母 |
%f | 单精度浮点数 | 浮点数(固定小数点格式) |
%lf | 双精度浮点数 | 输出双精度浮点数 (与 %f 类似) |
%e %E | 单精度浮点数 | 以科学计数法输出浮点数(小写e或大写E) |
%g %G | 单精度浮点数 | 自动选择 %e 或 %f 中输出宽度较短的一种格式,不输出无意义的0 |
scanf("a=%d,b=%c,c=%c",&a,&b,&c);
int 、 float 数据输入可用空格、换行、 Tab 键作分隔。对于字符数据来说,空格、转移字符、换行均为有效字符。
(2)标准/格式化输出
printf("格式控制",输出列表);
附加格式说明符 | 描述 |
---|---|
%m | 数据输出的最小宽度。如果变量长度小于这个宽度,会在左侧填充空格 |
%-m | 数据向左对齐,即字符向左靠齐,右侧填充空格 |
%n | 对于浮点数,输出 n 位小数(实数)(如 %.2f 表示保留两位小数),截取 n 个字符 |
%.*s | 输出字符串时,截取前 n 个字符(如 %.5s 输出前 5 个字符) |
注: %o 、 %x 不能输出负数
visual6.0 C++ 编译器中 int 数据分配四个字节。
(3)字符的输入/输出
- 字符输入 getchar(); /*只能用键盘输入一个字符*/
- 字符输出 putchar(ch);
#include<stdio.h>
void main(){int c;c = getchar();while(c != EOF) //EOF是一个字符常量 ,值为-1putchar(c); //得到的字符通过putchar()输出到屏幕上c = getchar(); //读入下一个字符
}
1.2 算法
(1)一个程序应包括内容
- 对数据的描述:数据结构(data structure)
- 对操作的描述:算法(algorithm)
(2)计算机科学家沃思:
数据结构 + 算法 = 程序
(3)完整的程序设计
数据结构+算法+程序设计方法+语言工具
(4)计算机算法两大类别
- 数值运算算法:求数值解,例如求方程的根、求函数的定积分等。
- 非数值运算:包括的面十分广泛,最常见的是用于事务管理领域,例如图书检索、 人事管理、行车调度管理等。
☆☆☆代码练习题☆☆☆
#include <stdio.h>
# define PI 3.14;
int main(){float r,C,S,V;int h;scanf("r=%f,h=%d",&r,&h);C = 2 * r * PI;S = r * r * PI;V = S * h;//输出保留两位有效数字printf("圆周长:C=%.2f \n圆面积:S=%.2f \n圆柱体积:V=%.2f",C,S,V);return 0;
}
#include <stdio.h>
#include "math.h"
int main(){int a,b,c;scanf("%d,%d,%d",&a,&b,&c);int check = b * b - 4 * a * c; double x1,x2;if(check > 0){x1 = (-b + sqrt(check)) / (2 * a);x2 = (-b - sqrt(check)) / (2 * a);printf("x1=%.2f\n", x1);printf("x2=%.2f", x2);} else{printf("输入不合法,方程无意义");}return 0;
}
二、选择结构
2.1 关系表达式
自左向右 ;0为假,非0为真
2.2 逻辑表达式
2.3 条件表达式
☆☆☆代码练习题☆☆☆
字母大小写的判断和转换
#include <stdio.h>int main() {char c;scanf("%c", &c);//条件表达式 三目c = (c >= 'A' && c <= 'Z') ? (c + 32) : c;printf("%c", c);}
2.4 if语句
2.5 switch语句
三、循环结构
3.1 while() 语句(“当……”)
- 特点:先判断,后执行循环体
/*** 求1-100的和*/
# include <stdio.h>
int main(){int i = 1,sum = 0;//循环结构while (i <= 100){//循环体超过一个语句,用{}括起来sum = sum + i;i++; //防止死循环:再循环体重应有使得循环趋向于结束的语句}printf("%d",sum);
}
3.2 do…while() 语句
- 特点:先执行一次循环体,后判断
3.3 for() 语句(常用)
C 语言中的 for 语句使用最为灵活,不仅可以用于循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况,它完全可以代替 while 语句
3.4 continue 和 break
- continue 语句只结束本次循环,而不是终止整个循环的执行。
- break 语句则是结束整个循环过程,不再判断执行循环的条件是否成立。
(1)continue 语句
结束本次循环,跳过循环体中下面尚未执行的语句,进行下一次是否执行循环的判定
(2) break 语句
- 跳出循环体,执行循环下面的语句
- 只能用在循环语句和switch语句中
☆☆☆代码练习题☆☆☆
①判断是否为素数/质数
/*** 思路:让n除以 (1,n)开区间中 的所有整数,看会不会出现整除情况*/
# include <stdio.h>int main() {int n, i;printf("请输入一个大于3的整数:");scanf("%d", &n);for (i = 2; i < n; i++) { //排除1和本身(1,n)if (n % i == 0) //判断(1,n)中间有没有数能被n整除break; //出现一次整除,就可以判断,退出循环}if (i == n)printf("%d是素数", n);else printf("%d是合数", n);}
/*** 优化:减少循环次数,除数最小是2,只用看左边一半,右边一般不可能被整除* 1 (2 3 | 4 5)6* 6 / 3 = 2* 6 /2 = 3** 1(2 3 | 4 5 6)7*/
# include <stdio.h>int main() {int n, i;printf("请输入一个大于3的整数:");scanf("%d", &n);for (i = 2; i <= n/2; i++) {if (n % i == 0)break;}if (i == n/2+1 )printf("%d是素数", n);else printf("%d是合数", n);}
/*** 继续优化:开平方根,根号n* 7* 2<根号7<3* int k = 2*/
# include <stdio.h>
#include "math.h"int main() {int n, i;printf("请输入一个大于3的整数:");scanf("%d", &n);int k = sqrt(n);for (i = 2; i <= k; i++) {if (n % i == 0)break;}if (i == k + 1)printf("%d是素数", n);else printf("%d是合数", n);}
②求两数的最大公约数
/**
* 求两数的最大公约数* 找出所有的公约数(被x整除,同时能被y整除)* 再得到最大的公约数*
*/
int main(){int x,y,max;printf("请输入两个整数:");scanf("%d %d",&x,&y);for(int i = 1; i<=x && i<=y;i++){if(x % i == 0 && y%i == 0){max = i; //i本身就是从小变大,最后赋值的就是最大的}}printf("最大公约数为:%d",max);
}