分支和循环语句
本章内容
分支语句
if语句
1.什么是语句?
C语言是一门程序设计语言
由分号隔开的句子,称为语句。
printf("Hello world\n");
; //空语句
3.14;
2.单个if
#include <stdio.h>
int main()
{
int i=1;
if(i>0) //()里面的表达式成立,执行printf语句
printf("hello\n");
return 0;
}
if控制的表达式,0表示假,语句不执行,非0表示真,执行
3.if-else
#include <stdio.h>
int main()
{
int i=1;
if(i<0)
printf("haha\n");
else
printf("hehe\n");
return 0;
}
if-else语句,如果if的表达式不成立,则执行else后面的语句
4.多分支if-else
#include <stdio.h>
int main()
{
int i = 0;
scanf("%d",&i);
if (i < 0)
printf("负数\n");
else if (i == 0)
printf("0\n");
else
printf("正数\n");
return 0;
}
4.悬空else
#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匹配
#include <stdio.h>
int main()
{
int a=0;
int b=2;
if(a==1)
{
if(b==2)
{
printf("haha\n");
}
}
else
{
printf("hehe\n");
}
return 0;
}
5.在函数中省略else
#include <stdio.h>
int test(int x)
{
if (x >= 0)
return 0;
return -1;
}
/*int test(int x)
{
if(x>=0)
return 0;
else
return -1;
}
*/
int main()
{
int i = 1;
int ret = test(i);
printf("%d\n", ret);
return 0;
}
//程序返回0;
练习1-判断一个数是否为奇数
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
if (n % 2 == 0)
printf("您输入的是偶数\n");
else
printf("您输入的是奇数\n");
return 0;
}
练习2-输出1-100的奇数
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 100; i++)
{
if (i % 2 == 1)
printf("%d ", i);
}
return 0;
}
switch语句
常用于多分支
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
switch (n)
{
case 1:
printf("星期1\n");
case 2:
printf("星期2\n");
case 3:
printf("星期3\n");
case 4:
printf("星期4\n");
case 5:
printf("星期5\n");
case 6:
printf("星期6\n");
case 7:
printf("星期7\n");
default:
printf("请输入1-7的数字\n");
break;
}
return 0;
}
//switch接受n的值,当n的值在1-7之间,任意输入一个数,后面的语句都会执行
//例如3,那么输出的结果为星期3到星期7加上default控制的语句,这是因为每条case语句都没有break
case后面的数字如果跟n相等,则执行case后面的语句
default用来接受,没有case符合n的值,则由default接受这些不在case范围内的数字
#include
int main()
{
int n=0;
scanf("%d",&n);
switch(n)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
default:
printf("输入错误\n");
}
return 0;
}
在这个程序中,输入1-5的数字都会得到工作日,输入6-7的数字得到休息日,其他的数字,则输出错误,注意switch控制的表达式为整型表达式,case控制的是整型常量表达式
在最后一个 case 语句的后面加上一条 break语句。 (之所以这么写是可以避免出现在以前的最后一个 case 语句后面忘了添加 break语句)。
当 switch表达式的值并不匹配所有case标签的值时,这个default子句后面的语句就会执行。
所以,每个switch语句中只能出现一条default子句,但它可以出现在任何地方
练习
#include <stdio.h>
int main()
{
int n = 1;
int m = 2;
switch (n)
{
case 1:
m++;
case 2:
n++;
case 3:
switch (n)
{
//switch可以套用
case 1:
n++;
case 2:
m++;
n++;
break;
}
case 4:
m++;
break;
default:
break;
}
printf("%d %d\n", m, n);
return 0;
}
n=1,先进入case 1,m++,因为没有break,继续执行case2,n++
此时n=2,m=3,第二个switch,执行case 2,n++,m++,break跳出switch
到case 4,m++,break
最终结果为m=5,n=3;
循环语句
while
#include <stdio.h>
int main()
{
int i=0;
while(i<10)
{
printf("haha\n");
i++;
}
return 0;
}
屏幕上会打印出10个haha,这是因为只要while后面的表达式不为0,则一直执行,代码块里的语句,当i=10时,条件不满足,退出循环
while中的break
#include <stdio.h>
int main()
{
int i=1;
while(i<=10)
{
printf("%d ",i);
if(i==5)
{
break;
}
i++;
}
return 0;
}
//屏幕输出1 2 3 4 5,当i=5时,执行break,跳出整个循环
while中的continue
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
if (i == 5)
{
continue;
}
i++;
}
return 0;
}
//程序死循环打印5,因为当i=5时,执行continue语句,后面的代码不执行,跳到while判断条件语句,5《10永为真,一直执行printf
continue:终止本次循环,后面的代码不执行,直接跳到while语句的判断部分,进行下一次循环的入口判断
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
if (i = 5)
{
continue;
}
i++;
}
return 0;
}
//死循环打印5,因为在if里面对i重新赋值了,让i一直等于5
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
continue;
printf("%d ", i);
i++;
}
return 0;
}
//程序输出结果为1 2 3 4 闪光标,可以看出程序时从上到下执行的
#include <stdio.h>
int main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
{
printf("%d ", i);
continue;
}
i++;
}
return 0;
}
//死循环打印5,如果把printf和continue换位置,输出为一直闪光标。死循环
getchar、putchar函数
#include <stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
{
putchar(ch);
}
return 0;
}
//getchar函数是从键盘上接收字符,putchar是打印字符,getchar返回int类型,所以用int接受
//EOF end of file 文件结束标志,-1
#include <stdio.h>
int main()
{
int ch = 0;
while ((ch = getchar()) != EOF)
{
if (ch >= '0' && ch <= '9')
printf("%c\n", ch);
}
return 0;
}
//从键盘上接受数字并打印,不是数字不打印
for循环
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
//程序输出1 2 3 4 5 6 7 8 9 10
for(表达式1;表达式2;表达式3)
表达式1为对i赋值
表达式2为判断条件,条件成立进入,循环
表达式3为调整部分,对循环条件的调整
for中的break
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
break;
printf("%d ", i);
}
return 0;
}
//程序输出1 2 3 4 ,当i=5时,执行break,跳出循环
for中的continue
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i == 5)
continue;
printf("%d ", i);
}
return 0;
}
//跳过5,输出1 2 3 4 6 7 8 9 10
//因为i++在上面,当i=5时,不打印,回到上面继续判断
不能在for循环里面改变控制变量
#include <stdio.h>
int main()
{
int i = 0;
for (i = 1; i <= 10; i++)
{
if (i = 5)
printf("haha\n");
printf("hehe\n");
}
return 0;
}
//死循环打印haha
//i的值被改变
练习
#include <stdio.h>
int main()
{
for (;;)
printf("haha\n");
return 0;
}
//没有条件判断不行,会一直打印haha
//表达式1和表达式3可以省略
#include <stdio.h>
int main()
{
int x, y;
for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
{
printf("hehe\n");
}
return 0;
}
//打印两个hehe,条件要同时成立
#include <stdio.h>
int main()
{
int i = 0;
int k = 0;
for (i = 0, k = 0; k = 0; i++, k++)
k++;
printf("%d\n", k);
return 0;
}
//for循环不执行,表达式2,判断条件为假
do…while
#include <stdio.h>
int main()
{
int i = 10;
do
{
printf("%d\n", i);
} while (i < 10);
return 0;
}
//程序输出结果为10
do…while语句特点,先不管判断条件成不成立,先执行,后判断
至少执行一次
break
#include <stdio.h>
int main()
{
int i = 1;
do {
if (i == 5)
break;
printf("%d\n", i);
i++;
} while (i < 10);
return 0;
}
//程序输出1 2 3 4
continue
#include <stdio.h>
int main()
{
int i = 1;
do {
if (i == 5)
continue;
printf("%d\n", i);
i++;
} while (i < 10);
return 0;
}
//1 2 3 4 闪光标
goto语句
goto语句最常用的就是终止程序在某些深度嵌套的结构的处理过
程,例如一次跳出两层或多层循环。
break只能跳出一层循环
#include <stdio.h>
#include <string.h>
#include <windows.h>
int main()
{
char input[10] = { 0 };
system("shutdown -s -t 60");
again:
printf("电脑将在1分钟内关机,如果输入:我是猪,就取消关机!\n请输入:>");
scanf("%s", input);
if (strcmp(input, "我是猪") == 0)
{
system("shutdown -a");
}
else
{
goto again;
}
return 0;
//again:执行到goto时,goto指向again,在从again向下执行