控制语句
程序是以主函数为入口,顺序执行的
if
基本结构: if(表达式) { 代码块; } 语句; 作用:如果表达式里面的内容成立,则执行代码块的内容;若不成立,则跳过代码块的内容,顺序执行下面的语句块 如果if里面代码块只有一句,则可以省略{}不写
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
if( a > b)
{
printf("a > b\n");
}
printf("-----------\n");
return 0;
}
结果:
3 2
a > b
-----------
2 3
-----------
如果想判断两个数的大小关系,则一个if就不够用了,此时需要用到if-else结构
if-else
if(表达式) { 代码块1; } else { 代码块2; } 原理: 如果if后面的表达式成立,则执行代码块1,跳过代码块2 如果if后面的表达式不成立,则跳过代码块1,执行代码块2
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
if( a > b)
{
printf("a > b\n");
}
else
{
printf("a <= b\n");
}
return 0;
}
结果:
2 3
a <= b
2 2
a <= b
2 1
a > b
if-else if-else
if(表达式1) { 代码块1 } else if(表达式2) { 代码块2 } .... else { 代码块n } 原理: 如果if里面的表达式1成立,则执行代码块1,跳过其余部分 如果if里面的表达式1不成立,则去寻找else if里面哪一个表达式是成立的,若else if里面某个表达式成立,则执行其对应的代码块,其余代码块不执行 如果if里面的表达式1不成立,且else if中也没有成立的表达式,则执行else里面的代码块,其它的代码块不执行
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
if( a > b)
{
printf("a > b\n");
}
else if( a == b)
{
printf("a = b\n");
}
else
{
printf("a < b\n");
}
return 0;
}
结果:
2 3
a < b
2 2
a = b
2 1
a > b
练习:
从键盘上输入三个整形数,打印其中的最大值
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 0;
int b = 0;
int c = 0;
scanf("%d%d%d", &a, &b, &c);
if( a >= b && a >= c)
{
printf("max:%d\n", a);
}
else if( b >=a && b >= c)
{
printf("max:%d\n", b);
}
else
{
printf("max:%d\n", c);
}
return 0;
}
if控制的嵌套
if(表达式) { if(表达式) { } }
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 0;
int b = 0;
scanf("%d%d", &a, &b);
if( a < b)
{
if( a < 2)
{
putchar('!');
putchar('\n');
}
}
return 0;
}
练习:
输入一个年份,判断它是不是闰年(能被400整除 或者 能被4整除但不能被100整除)
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 0;
scanf("%d", &a);
/*
if( 0 == a % 400)
{
printf("%d为闰年\n", a);
}
else if( 0 == a % 4)
{
if( 0 != a % 100)
{
printf("%d为闰年\n", a);
}
else
{
printf("%d为平年\n", a);
}
}
else
{
printf("%d为平年\n", a);
}
*/
if( (0 == a % 400) || ((0 == a % 4) && (0 != a % 100)))
{
printf("%d为闰年\n", a);
}
else
{
printf("%d为平年\n", a);
}
return 0;
}
输入一个字符,
如果是一个1-9的数字,则输出它的十六进制;
如果是一个小写字母,它如果是前13个则转换为大写字母,其它的不变(a A; z z);
如果是一个大写字母,它如果是后13个则转换为小写字母,其它的不变;如果是其它字符,则输出error!;
#include <stdio.h>
int main(int argc, char *argv[])
{
char a = getchar();
if( a >= '1' && a <= '9')
{
printf("%#X\n", a);
}
else if( a >= 'a' && a <= 'z')
{
if( a >= 'a' && a <= 'm')
{
printf("%c\n", a-32);
}
else
{
printf("%c\n", a);
}
}
else if( a >= 'A' && a <= 'Z')
{
if( a >= 'N' && a <= 'Z')
{
printf("%c\n", a+32);
}
else
{
printf("%c\n", a);
}
}
else
{
printf("error!\n");
}
return 0;
}
switch
基本结构: switch(变量/表达式) { case 常量1:要执行的语句;break; case 常量2:要执行的语句; break; ...... default:要执行的语句; } 变量和case后面的常量相比较,如果相等,则执行后面的语句,然后通过break跳出该结构
计算器:
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 0;
int b = 0;
char c = 0;
scanf("%d%c%d", &a, &c, &b);
switch(c)
{
case '+':printf("%d + %d = %d\n", a, b, a+b);break;
case '-':printf("%d - %d = %d\n", a, b, a-b);break;
case '*':printf("%d ✖ %d = %d\n", a, b, a*b);break;
case '/':if( 0 == b)
{
printf("error!除数不能为0\n");
}
else
{
printf("%d ➗ %d = %d\n", a, b, a/b);
}
break;
case '%':printf("%d %% %d = %d\n", a, b, a%b);break;
default:printf("error!\n");
}
return 0;
}
练习:
输入一个0-100的成绩,判断其成绩等级
90-100 A
80-89 B
70-79 C
60-69 D
0-59 E
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 0;
scanf("%d", &a);
switch(a/10)
{
case 10:if( a == 100)
{
printf("A\n");
}
else
{
printf("error\n");
}
break;
case 9: printf("A\n");break;
case 8: printf("B\n");break;
case 7: printf("C\n");break;
case 6: printf("D\n");break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:printf("E\n");break;
default:printf("error\n");
}
return 0;
}
while
while(表达式) { 代码块; } 作用:如果表达式满足,则执行代码块;执行完毕之后,返回表达式继续判断;直到表达式不满足,则退出循环 while(-1) { } 这是一个死循环 当表达式不满足或者表达式为0时,不执行循环;在c语言中,非0为真,即while(-1)也是一个死循环 ctrl + c 结束程序 while常用于知道循环结束的条件时使用
水仙花数
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 100;
int b = 0;
int c = 0;
int d = 0;
while( a <= 999)
{
b = a / 100;
c = a % 100 / 10;
d = a % 10;
if( b*b*b + c*c*c + d*d*d == a)
{
printf("%5d", a);
}
a++;
}
putchar('\n');
return 0;
}
数字炸弹
#include <stdio.h>
int main(int argc, char *argv[])
{
srand((unsigned)time(NULL));
int a = rand()%101;
while(1)
{
int num = 0;
scanf("%d", &num);
if( num > a)
{
printf("big\n");
}
else if( num < a)
{
printf("small\n");
}
else
{
printf("boom!\n");
break;
}
}
return 0;
}
rand()
随机数函数,生成随机数种子,使用前加上
srand((unsigned)time(NULL));
使随机数会随时间变化
do while
基本结构: do{ 代码块 }while(表达式);
练习:从键盘输入一个数,求这个数的阶乘
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 0;
int b = 1;
scanf("%d", &a);
do{
b = b * a;
a--;
}while(a != 0);
printf("b:%d\n", b);
return 0;
}
for
基本结构: for(表达式1;表达式2;表达式3) { 代码块 } 进入for循环,先执行表达式1,然后判断表达式2是否满足,若满足,则执行代码块,然后执行表达式3; 再去判断表达式2,若满足则执行代码块,然后执行表达式3,循环往复,直到表达式2不满足 for循环常常用于确定循环次数的循环
#include <stdio.h>
int main(int argc, char *argv[])
{
int i = 0;
for( i = 0; i < 10; i++)
{
printf("i:%-3d", i);
}
putchar('\n');
return 0;
}
for(;;):死循环
for循环的嵌套
include <stdio.h>
int main(int argc, char *argv[])
{
int i = 0;
int j = 0;
for( i = 0; i < 10; i++)
{
for( j = 0; j < 10; j++)
{
for( int k = 0; k < 10 ; k++)
putchar('a');
}
}
return 0;
}
外层共循环10次; 中层共循环10*10次; 内层共循环10*10*10;
break:
用于循环语句中,跳出循环
continue:
跳过本次循环,继续执行下一次循环
goto:
跳转指令(不建议使用,打破了顺序结构)
int main(int argc, char *argv[]) { goto flag; printf("***\n"); flag: printf("---\n"); return 0; } 结果: ---
return:
退出函数,并设置函数的返回值(函数部分细讲)