别看目录简单,里面的内容可不简单噢
分支结构
1.分支中的if else语句
C语言中的分支与循环是编程中非常重要的概念,它们让我们能够控制程序的执行流程,实现复杂的功能。
首先,我相信下面的内容,理解起来还是比较容易的,因为知识点本身并不是很难,难的是怎么运用知识点来解决问题,将知识点熟练运用才是我们的目的。
我们来看看分支结构。在C语言中,分支结构主要由if语句来实现。顾名思义,if==如果。
if(a%2==0){
printf("a是偶数");
}
在上面的代码中,如果(a除以2的余数等于0)为真,那么if下面的代码printf(“a是偶数”);就会被执行。否则,这部分代码就会被跳过.(a>0)
有if怎么能没有else呢,else==否则,上代码。
if(a%2==0){
printf("a是偶数");
}else{
printf("a是奇数");
}
我想,这该不需要多做解释了吧哈哈,那么我们可以来尝试一下使用多个if else语句,我们举一个三角形判断的例子来体会if else的嵌套。
#include <stdio.h>
int main() {
int a, b, c;
printf("输入三条边:");
scanf("%d %d %d", &a, &b, &c);
if (a + b > c && a + c > b && b + c > a) {
if (a == b || a == c || b == c) {
if (a == b && b == c) {
printf("等边三角形\n");
}
else {
printf("等腰三角形\n");
}
}
else {
printf("其他三角形\n");
}//当然,我们还可以分的更细,在这里再使用一个if语句判断直角三角形,动手试试吧!
}
else {
printf("无法构成三角形\n");
}
return 0;
}
在这里,还有一个悬空else问题,是初学者很容易犯的错误,要记住,else总是与最接近的if匹配的。
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
if(b == 2)
printf("hehe\n");
else
printf("haha\n");
return 0;
}
这个代码运行结果啥都没有。。。。
上面的代码排版,让 else 和第⼀个 if 语句对齐,让我们误以为 else 是和第⼀个if匹配的,当 if语句不成立的时候,自然想到的就是执行 else 子句,打印 haha ,但实际上 else 是和第⼆个 if进行匹配的,这样后边的 if…else 语句是嵌套在第⼀个 if 语句中的,如果第⼀个 if 语句就不成立,嵌套 if 和 else 就没机会执行了,最终啥都不打印。
或者如果我们希望else确实和第⼀个if匹配,可以这样修改代码:
#include <stdio.h>
int main()
{
int a = 0;
int b = 2;
if(a == 1)
{
if(b == 2)
printf("hehe\n");
}else{
printf("haha\n");
}
return 0;
}
简言之,写代码带上大括号用处大大滴有,代码逻辑会更加清晰,可读性大大滴提高!
2.分支中的switch语句
除了 if 语句外,C语中还有 switch 语句来实现分支结构。
switch 语句是⼀种特殊形式的 if…else 结构,用于判断条件有多个结果的情况。它把多重的 else if 改成更易用、可读性更好的形式。
我们上代码来体会,输入任意⼀个整数值,计算除3之后的余数
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch(n%3)
{
case 0:
printf("整除,余数为0\n");
case 1:
printf("余数是1\n");
case 2:
printf("余数是2\n");
}
return 0;
}
case(这里有空格)后跟结果和( : ),下面跟相应的执行语句。
注意!
switch 后的 条件 必须是整型表达式
case 后的值,必须是整形常量表达式
当你运行后却发现非你所想
原因呢?switch 语句也是分支效果的,只有在 switch 语句中使用 break 才能在跳出 switch 语句,如果某⼀个 case 语句的后边没有 break 语句,代码会继续玩下执行,有可能执行其他 case语句中的代码,直到遇到 break 语句或者 switch 语句结束。我们修改一哈哈,
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
switch(n%3)
{
case 0:
printf("整除,余数为0\n");
break;
case 1:
printf("余数是1\n");
break;
case 2:
printf("余数是2\n");
break;
}
return 0;
}
那如果case后的结果都不匹配switch语句中的值怎么办呢,这时default出现了,举一个判断成绩等级的例子。
#include <stdio.h>
int main()
{
int a;
printf("成绩:");
scanf("%d",&a);
a = a / 10;
switch (a) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
printf("E");
break;
case 6:
printf("D");
break;
case 7:
printf("C");
break;
case 8:
printf("B");
break;
case 9:
case 10:
printf("A");
break;
default:
printf("请重新输入0-100的数字!\n");
}
return 0;
}
那么这时如果你输入一个负数,这个default就发挥作用了。
在 switch 语句中 case 语句和 default 语句是没有顺序要求的,只要你的顺序是满足实际需求的就可以。不过通常是把 default 子句放在最后处理。
循环结构
1.循环中的while与do while语句
while与do while语句比较简单,只要满足while后括号的条件,那么就执行下面/上面的语句,不过需要注意的是,do while语句中是先执行一次再去判断,while语句是直接判断,看是否可以执行。只要满足条件,那么就会一直循环下去,直至不满足while的条件。
我们通过一个简单的例子来看while与do while,打印1-5。
#include <stdio.h>
int main()
{
int i = 1;
while(i<=5)
{
printf("%d ", i);
i +=1;
}
return 0;
}
#include <stdio.h>
int main()
{
int i = 1;
do
{
printf("%d ",i);
i+=1;
}while(i<=5);
return 0;
}
!我们不难发现,while语句while后没有分号!do while中while后有分号!!!
那么如果我们想跳出或者跳过循环该怎么办呢,break又见面啦,还有一个新朋友continue,那么我们直奔主题:
• break 的作用是用于永久的终止循环,只要 break 被执行,直接就会跳出循环,继续往后执行。
• continue 的作用是跳过本次循环 continue 后边的代码,在 for 循环和 while 循环中是有所差异的。
#include <stdio.h>
int main()
{
int i = 1;
while(i<=5)
{
if(i == 3)
break;//当i等于3后,就执⾏break,循环就终⽌了
printf("%d ", i);
i = i+1;
}
return 0;
}
我们把break换成continue试试看
#include <stdio.h>
int main()
{
int i = 1;
while(i<=5)
{
if(i == 3)
continue;
//当i等于5后,就执⾏continue,直接跳过continue后面的代码,去循环判断的地⽅(i<=5),这⾥跳过了i = i+1,所以i⼀直为3,程序陷⼊死循环,没法结束
printf("%d ", i);
i = i+1;
}
return 0;
}
while与do while中的break和continue几乎一模一样,可以自己试试看噢。
那么for语句中又会是什么样呢,让我们接着往下看。
2.循环中的for语句
我为什么把for语句放在最后呢,我认为呢for语句算是里面比较复杂的,使用频率也是最高的。那么先让我们看看它的形式。
for(表达式1; 表达式2; 表达式3)
表达式1 用于循环变量的初始化
表达式2 用于循环结束条件的判断
表达式3 用于循环变量的调整
我们用简单的例子来理解
#include<stdio.h>
int main()
{
int i;
for (i = 0; i <= 10; i++) //这里的i++相当于i=i+1
{
printf("%d ", i);
}
return 0;
}
看起来也没有多难嘛,让我们升级一下难度,把for语句嵌套用一下
来一个实例:打印一个可以自己规定大小的倒三角形
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int n, i, j;
printf("size:");
scanf("%d", &n);
if (n <= 0) {
printf("Bye!\n");
return 0;//若输出的n小于等于零,直接打印bey!,然后结束程序
}
for (i = 1; i <= n; i++)
{
for (j = 1; j <= i - 1; j++)
{
printf(" ");//打印每一行前面的空格
}
for (j = 1; j <= 2 * (n - i) + 1; j++)//
{
printf("*");//打印每一行的*用来组成图案
}
printf("\n");//换行n次,既有n行
}
return 0;
}
这个for语句的嵌套怎么样呢,还不错吧,和上一个相比是不是有点难度呢。好好康康,我相信你会理解的。
那么接下来,就来看for语句中的continue到底和while语句中的有什么不同呢?上代码
#include <stdio.h>
int main()
{
int i = 1;
for(i=1; i<=10; i++)
{
if(i == 5)
continue;//这⾥continue跳过了后边的打印,来到了i++的调整部分
printf("%d ", i);
}
return 0;
}
的确跳过了5的打印
我们不难发现,for语句中只是跳过了i为5这一次循环,不影响后面的循环,而while语句中跳过后面的代码后,i始终为3,就会一直停在判断上面,进而陷入死循环。这就是他俩的区别,你get到了吗?
分支与循环嵌套的几个实例
这里有几个嵌套的实例,大家可以自己体会体会
1.打印中空菱形
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int n, i, j;
while (1) {//括号中的1表示这里为真
printf("size:");
scanf("%d", &n);
if (n <= 0) {
printf("Bye!\n");
break;
}
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n - i; j++)
{
printf(" ");
}
for (j = 1; j <= 2 * i - 1; j++)
{
if (j == 1 || j == 2 * i - 1)
printf("*");
else
printf(" ");
}
printf("\n");
}
for (i = 2; i <= n; i++)
{
for (j = 1; j <= i - 1; j++)
{
printf(" ");
}
for (j = 1; j <= 2 * (n - i) + 1; j++)
{
if (j == 1 || j == 2 * (n - i) + 1)
printf("*");
else
printf(" ");
}
printf("\n");
}
}
return 0;
}
2.指定年月日季节
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
printf("YYYYMM:");
int y, b;
scanf("%4d%2d", &y, &b);
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
printf("a leap\n");
else printf("not a leap\n");
if (b >= 3 && b <= 5)
printf("spring\n");
if (b >= 6 && b <= 8)
printf("summer\n");
if (b >= 9 && b <= 11)
printf("autumn\n");
if (b == 12 || b <= 2)
printf("winter\n");
if (b == 1 || b == 3 || b == 5 || b == 7 || b == 8 || b == 10 || b == 12)
printf("31\n");
if (b == 4 || b == 6 || b == 9 || b == 11)
printf("30\n");
if (b == 2)
{
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
printf("29\n");
else printf("28\n");
}
return 0;
}
3.正正负累加
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int n;
double a, sum = 0;
printf("n:");
scanf("%d", &n);
if (n <= 0) {
return 0;
}
for (int i = 1; i <= n; i++) {
if (i % 3 == 0) {
a = -1.0 / i;
}
else {
a = 1.0 / i;
}
sum += a;
}
printf("sum=%5.2lf\n", sum);
return 0;
}
对于分支与循环语句,不仅仅是上面举的那些例子,还有其他很多很多的问题都能用到它们哦。自己要多写代码来体会,熟能生巧嘛。
在这里,我小小提醒一下,用VS编译程序时,如果有scanf这个函数的话记得在第一行加上#define _CRT_SECURE_NO_WARNINGS 1 不然vs是会报错的哦。
最后来给大家附上一张前几天下午拍的夕阳哈哈哈