C语言时结构化的程序设计语言,这里的结构是:顺序结构,选择结构(if语句,switch语句),循环结构(while循环,for循环,do-while循环)。
if (表达式)
{
语句;
}
表达式为真,则执行语句,表达式为假,则不执行语句
在C语言中0表示假,非0表示真。
执行流程图:
判断一个数是奇数还是偶数
#include
int main() {
int num = 0;
scanf("%d", &num);
if (num % 2 != 0) {
printf("%d是奇数", num);
}
else {
printf("%d是偶数", num);
}
return 0;
}
if和else之间都只能执行一条语句,所以只有在大括号中才能执行多条语句。
在if-else语句中,else可以与另一个if语句相结合,这样可以实现多重判断。
输入年龄,判断是少年(0-15),青年(15-25),中年(25-55),老年(55以上)
int main() {
int old = 0;
printf("输入年龄:>");
scanf("%d", &old);
if (old <= 15) {
printf("\n少年\n");
}
else if (old > 15 && old <= 25) {
printf("\n青年\n");
}
else if (old > 25 && old <= 55) {
printf("\n中年\n");
}
else {
printf("\n老年\n");
}
return 0;
}
这里的if和else之间就构成了嵌套的if语句,以实现多重循环
如果有多条if和else语句,规则是:else总是和最接近的if匹配
这里执行代码,当a=0时,if(a==1)不成立进入else语句,打印haha。可是当运行代码时啥都不打印,这因为else与最近的if语句相匹配,所以当判断if( a ==1)不成立就没有执行了。所以,当上述代码写为如下代码,就好理解了。
int main() {
int a = 0;
int b = 1;
if (a == 1) {
if (b == 1)
printf("hehe\n");
else
printf("haha\n");
}
return 0;//
}
switch语句是区别于if语句的实现选择结构的语法
switch(expression)
{
case value1:
语句;
break;
case value2:
语句;
break;
default:
语句;
break;
}
输入任意一个整数值,计算%3之后的余数
if语句实现
int main() {
int num = 0;
printf("请输入一个整数:>");
scanf("%d", &num);
if (num % 3 == 0) {
printf("\n%d被3整除\n", num);
}
else if (num % 3 == 1) {
printf("\n%d除以3余1\n",num);
}
else {
printf("\n%d除以3余2\n",num);
}
return 0;
}
switch语句实现
int main() {
int num = 0;
printf("请输入一个整数:>");
scanf("%d", &num);
switch (num%3) {
case 1:
printf("\n%d除以3余1\n", num);
break;
case 2:
printf("\n%d除以3余2\n", num);
break;
default:
printf("\n%d被3整除\n", num);
break;
}
return 0;
}
上述两段代码实现的作用是一样的,我们需要注意的点是:
如果去掉上述代码中的break语句会出现什么结果呢?
int main() {
int num = 0;
printf("请输入一个整数:>");
scanf("%d", &num);
switch (num%3) {
case 1:
printf("\n%d除以3余1\n", num);
//break;
case 2:
printf("\n%d除以3余2\n", num);
//break;
default:
printf("\n%d被3整除\n", num);
//break;
}
return 0;
}
可以看出,如果去掉break语句就会让代码一直执行下去,直到遇到break才能跳出switch语句。
只有switch中有break语句才能真正实现分支效果,当然,也不是每个case语句都要有break语句,比如下面代码:
输入1-7之间的数字,判断是工作日还是休息日
int main() {
int day = 0;
printf("输入1-7之间的数字,判断是工作日还是休息日:>");
scanf("%d", &day);
switch (day) {
case 1:
case 2:
case 3:
case 4:
case 5:
printf("\n工作日\n");
break;
case 6:
case 7:
printf("\n休息日\n");
}
return 0;
}
当我们使用switch语句时可能遇到输入的值与所有case后面的值不匹配的情况,这时就需要使用default语句,它的作用是在输入的值与所有case后面的值不匹配的时候执行default后面的语句。
在switch语句中case语句和default语句没有顺序的要求。
C语言提供了3种循环语句,while语句就是其中的一种
while语句的语法结构和if语句的语法结构非常相似
while(表达式){
语句;
}
先进行判断表达式,如果表达式的值为0,则循环直接结束,如果表达式的值不为0,则执行循环语句,语句执行完再继续判断,是否进行下一次判断。
执行流程图:
在屏幕上打印1-10的值
int main() {
int i = 1;
while (i <= 10) {
printf("%d ", i);
i++;
}
return 0;//打印:1 2 3 4 5 6 7 8 9 10
}
for循环时所有循环之中使用最多的,语法形式如下:
for(表达式1;表达式2;表达式3)
语句;
在屏幕上打印1-10的值
int main() {
for (int i = 1; i <= 10; i++) {
printf("%d ", i);
}
return 0;
}
可以看出while循环和for循环大体上是相同的,都具有3个相同的条件,而for循环比while循环更有优越的地方是:for循环的条件比while更加集中。
在3种循环中,do-while循环使用率最小,语法形式如下:
do{
语句;
}while(判断条件);
while和for循环都是先判断,再循环,而do-while循环是先循环,后判断。
当while语句的判断条件为真时,再次执行循环语句,为假时,终止循环。
注意:while();后面有一个分号。
执行流程图:
在屏幕上打印1-10的值
int main() {
int i = 1;
do {
printf("%d ", i);
i++;
} while (i <= 10);
return 0;
}
do-while循环必须被执行一次,所以该语句适合必须执行一次循环的场景
比如:
输入一个正整数,判断这个数是几位数
int main() {
int num1= 0;
int count = 0;
printf("请输入一个数:>");
scanf("%d", &num1);
int num2 = num1;
do {
num1 /= 10;
count++;
} while (num1 != 0);
printf("%d是%d位数",num2,count);
return 0;
}
这个代码充分体现了do-while循环处理特殊问题的优越性,当然这个问题其他循环也可以做,但是相较于do-while循环更为复杂,比如用for循环处理这个问题:
int main() {
int num = 0;
scanf("%d", &num);
int count = 0;
if (num == 0) {
printf("1位数");
}
else {
for (int i = 1; num; i++) {
num /= 10;
count++;
}
printf("%d位数", count);
}
return 0;
}
所以这个问题可以用许多方法解决,这两个代码的区别在于do-while循环可以自动判断0也是一位数,而其他循环需要将0作为特殊值处理。
在循环过程中,有些情况要提前终止循环或者跳过本次循环,所以留有break语句和continue语句。
输入一个数字,打印1到该数字,如果打印到5,则终止循环
int main() {
int num = 0;
scanf("%d", &num);
int i = 1;
while (i <= num) {
if (i == 5) {//当i=5时,跳出循环,输入num>5,则只输出1 2 3 4
break;
}
printf("%d ", i);
i++;
}
return 0;
}
将break换成continue会怎么样呢
可以看出程序进入死循环,这是因为continue会跳过后面的语句,而i的值又得不到更新,所以要将调整语句放在continue前面。
还是一样的问题:输入一个数字,打印1到该数字,如果打印到5,则终止循环
int main() {
int num = 0;
scanf("%d", &num);
int i = 1;
for (i; i <= num; i++) {
if (i == 5) {
break;
}
printf("%d ", i);
}
return 0;
}
将break换成continue会怎么样呢
int main() {
int num = 0;
scanf("%d", &num);
int i = 1;
for (i; i <= num; i++) {
if (i == 5) {
continue;
// break;
}
printf("%d ", i);
}
return 0;
}
可以看出continue的作用是跳过打印5,而while循环的continue语句和for循环的continue语句不同点在于:for循环的调整语句在continue的前面。
do-while循环的break和continue和while循环的break和continue几乎一模一样。
在有些问题当中不知需要一个循环,可能需要多个循环嵌套使用。
比如:
找出1~100之间的素数并打印
int main() {
for (int i = 1; i <=100; i++) {//打印出1-100的数
int tmpe = 1;//假设这个数是素数
for (int j = 2; j <i; j++) {//用2-(i-1)之间的数来依次对它取余
if (i % j == 0) {
tmpe = 0;//如果这个数可以被取余,说明它不是素数
break;//跳出这个循环,那么就不要再用后面的数来对它取余了
}
}
if (tmpe == 1) {//如果执行上面的筛选后还是素数,那么打印它
printf("%d ", i);
}
}
return 0;
}
可以优化代码:
#include
int main() {
for (int i = 1; i <=100; i+=2) {//打印出1-100的数
int tmpe = 1;//假设这个数是素数
for (int j = 2; j <=sqrt(i); j++) {//用2-(i-1)之间的数来依次对它取余
if (i % j == 0) {
tmpe = 0;//如果这个数可以被取余,说明它不是素数
break;//跳出这个循环,那么就不要再用后面的数来对它取余了
}
}
if (tmpe == 1) {//如果执行上面的筛选后还是素数,那么打印它
printf("%d ", i);
}
}
return 0;
}
for (int i = 1; i <=100; i+=2)
这条语句可以理解为一个素数只能是奇数,因为偶数都是2的倍数
第二处优化:
for (int j = 2; j <=sqrt(i); j++)
这条语句可以理解为一个数都可以分解为a * b的模式,比如说6=2*3,a和b当中至少有一个数是小于它本身的,所以,可以对该数求平方根,让他的平方根作为筛选条件。
关于选择与循环这个知识点,还可以写一个猜数字小游戏,当中涉及到rand随机数的知识,可以看看。这儿