目录
C语言是结构化的程序设计语言,支持三种结构:顺序结构、选择结构、循环结构。
我们可以使用 if 、switch实现分支结构,使用 for、while、do while实现循环结构
if 语句
语法形式:
if(表达式)
语句
表达式成立为真(非0)、则语句执行。表达式不成立为假(0),则语句不执行。
#include <stdio.h>
//输入一个整数,判断是否为奇数
int main()
{
int num = 0;
//输入
scanf("%d", &num);
//判断
if (num % 2 == 1)//== 是判断相等 = 是赋值
printf("%d 是奇数\n", num);
return 0;
}
else
如果任意一个整数,要判断是奇数还是偶数怎么表示呢?就需要用 if else 语句
语法形式
If (表达式)
语句1
else
语句2
eg:输入一个整数,判断是否为奇数,如果是奇数打印奇数、否则打印偶数。
#include <stdio.h>
int main()
{
int num = 0;
scanf_s("%d", &num);
if (num % 2 == 1)
printf("%d 是奇数\n",num);
else
printf("%d 是偶数",num);
return 0;
}
输入一个年龄,>=18岁就输出:成年,否则就输出未成年
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
printf("成年\n");
else
printf("未成年\n");
return 0;
}
if 语句只能控制一条语句,那如果我们要if同时控制两条语句怎么办呢?那我们就使用{}把它括起来
嵌套 if
在if else 语句中,else可以与另一个if 语句连用,构成多重判断。
eg:要求输入一个整数,判断输入的整数是0、还是正数或者负数。
//一种表示
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num == 0)
printf("输入的数字是0\n");
else if (num > 0)//这里的if相当于嵌套在else语句中,形成了嵌套结构
printf("输入的函数是正数\n");
else
printf("输入的函数为负数\n");
return 0;
}
//另一种表示
int main()
{
int n = 0;
scanf("%d", &n);
if (n >= 0) //> ==0
{
if (n == 0)
printf("输入的值是0\n");
else
printf("输入的值是正数\n");
}
else
{
printf("输入的值是负数\n");
}
return 0;
}
练习:输入一个人的年龄,如果年龄<18岁,打印"少年",如果年龄在18岁至44岁打印"青年",如果年龄在45岁至59岁打印"中老年",如果年龄在60岁至89岁打印"老年",如果90岁及以上打印"老寿星"
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
//判断
if (age < 18)
printf("少年\n");
else //>=18
{
if (age <= 44)
printf("青年\n");
else //>44
{
if (age <= 59)
printf("中老年\n");
else //>=60
{
if (age <= 89)
printf("老年\n");
else
printf("老寿星\n");
}
}
}
return 0;
}
或者也可以用更简洁的写法
#include <stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
//判断
if (age < 18)
printf("少年\n");
else if (age <= 44) //18~44
printf("青年\n");
else if (age <= 59)//45~59
printf("中老年\n");
else if (age <= 89)//60~89
printf("老年\n");
else //>=90
printf("老寿星\n");
return 0;
}
悬空else问题
如果有多个if 和else,可以记住这样一条规则,else总是跟最接近的if匹配。
# include <stdio.h>int main (){int a = 0 ;int b = 2 ;if (a == 1 )if (b == 2 )printf ( "hehe\n" );elseprintf ( "haha\n" );return 0 ;}
关系操作符
> | 大于运算符 |
< | 小于运算符 |
>= | 大于等于运算符 |
<= | 小于等于运算符 |
== | 相等运算符 |
! = | 不相等运算符 |
关系表达式通常返回0或1,表示真假,关系表达式常用语if 或 while结构。
注:相等运算符== 与 赋值运算符 = 是两个不一样的运算符,不要混淆。
多个关系运算符不宜连用。(i<j<k),这种写法不对,i<j 返回 0或 1,最终是0 或 1与k 作比较,如果要判断变量j的值是否在 i 和 k 之间,应该写成应该写成(i<j&&j<k)
eg:输入一个年龄在18-36岁之间,输出为青年。
条件操作符
条件操作符也叫三目操作符,需要接受三个操作数。形式为:
exp1 ?exp2 :exp3
如果exp1为真,exp2计算,计算结果是整个表达式的结果·;
如果exp1为假,exp3计算,计算结果是整个表达式的结果。
int main()
{
int a = 0;
int b = 0;
scanf("%d", &a);
if (a > 5)
b = 3;
else
b = -3;
printf("%d\n", b);
return 0;
}
改造后
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
scanf("%d", &a);
b = a>5 ? 3:-3;
printf("%d\n", b);
return 0;
}
练习:使用条件表达式实现找两个数中较大值
int main()
{
int a = 0;
int b = 0;
//输入
scanf("%d%d", &a, &b);
int m = 0;
//if (a > b)
// m = a;
//else
// m = b;
m = (a > b ? a : b);
printf("%d\n", m);
return 0;
}
逻辑操作符:&&,||,!
! :逻辑取反运算符(改变单个表达式的真假)。&& :与运算符,就是并且的意思(两侧的表达式都为真,则为真,否则为假)。|| :或运算符,就是或者的意思(两侧至少有一个表达式为真,则为真,否则为假)。
短路:
switch语句
switch (expression){case value1: statementcase value2: statementdefault : statement}
#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;
#include <stdio.h>
int main()
{
int day = 0;
//输入
scanf("%d", &day);
switch (day)
{
case 1:
printf("星期1\n");
break;
case 2:
printf("星期2\n");
break;
case 3:
printf("星期3\n");
break;
case 4:
printf("星期4\n");
break;
case 5:
printf("星期5\n");
break;
case 6:
printf("星期6\n");
break;
case 7:
printf("星期天\n");
break;
}
return 0;
}
如果输入变化,变为:输入:1~5,输出:工作日 输入6~7,输出:休息日
#include <stdio.h>
int main()
{
int day = 0;
//输入
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("工作日\n");
break;
case 6:
case 7:
printf("休息日\n");
break;
default:
printf("输入错误\n");
break;
}
return 0;
}
while循环
if与while对比
if ( 表达式 )语句 ;while ( 表达式 )语句 ; // 如果循环体想包含更多的语句,可以加上大括号
// 代码 1# include <stdio.h>int main (){if ( 1 )printf ( "hehe\n" ); //if 后边条件满足,打印⼀次 hehereturn 0 ;}
// 代码 2# include <stdio.h>int main (){while ( 1 )printf ( "hehe\n" ); //while 后边的条件满足,死循环的打印 hehereturn 0 ;}
这就是他们的区别,while语句是可以实现循环效果的。
while语句执行流程
while循环练习
int main()
{
int n = 0;
scanf("%d", &n);//123
while (n)
{
printf("%d ", n % 10);//获取一个数的最低位
n = n / 10;//去掉一个数的最低位
}
return 0;
}
题目解析:
1. 要想得到n的最低位,可以使用n%10的运算,得到的余数就是最低位,如:1234%10得到4 ;
2.要想去掉n的最低位,找出倒数第二位,则使用 n=n/10 操作就可以去掉最低位的,如:n=1234/10得到123,123相较于1234就去掉了最低位,123%10就得到倒数第二位3。
for循环
for ( 表达式 1 ; 表达式 2 ; 表达式 3 )语句; // 如果循环体想 包含更多的语句,可以加上大括号
for循环的执行流程
while循环与for循环的对比
for 和 while 在实现循环的过程中都有初始化、判断、调整这三个部分,但是for循环的三个部分非常集中,便于代码的维护,而如果代码较多的时候,while循环的三个部分就比较分散,所以从形式上for循环更优些。
练习:计算1~100之间的3的倍数的数字之和
#include <stdio.h>
int main()
{
int i = 0;
int sum = 0;
for (i = 1; i <= 100; i++)
{
if (i % 3 == 0)
sum += i;
}
printf("%d\n", sum);
return 0;
}
//⼩⼩的优化
//如果能直接产⽣3的倍数的数字就省去了多余的循环和判断
int main()
{
int i = 0;
int sum = 0;
for (i = 3; i <= 100; i += 3)
{
sum += i;
}
printf("%d\n", sum);
return 0;
}
do while循环
在循环语句中 do while 语句的使用最少,它的语法如下:
do
语句;
while(表达式)
while 和for这两种循环都是先判断,条件如果满足就进入循环,执行循环语句,如果不满足就跳出循环;而do while 循环则是先直接进入循环体,执行循环语句,然后再执行while后的判断表达式,表达式为真,就会进行下一次,表达式为假,则不再继续循环。
do while循环的执行流程
在do while 循环中先执行图上的语句,执行完语句,再去执行判断表达式,判断表达式的结果是不等于0,则继续循环,执行循环语句,判断表达式的结果==0,则循环结束。所以在do while 语句中循环体是至少执行一次的,这是do while 循环比较特殊的地方。
do while 循环的例子
在屏幕上打印1~10的值
输入一个正整数,计算这个整数是几位数?
例如:
输入:1 2 3 4 输出:4
输入:12 输出:2
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
int cnt = 0;
do
{
cnt++;
n = n / 10;
} while (n);
printf("%d\n", cnt);
return 0;
}
break 和 continue语句
C语言提供了break 和continue关键字应用到循环中
break的作用是用于永久的终止循环,只要breeak被执行,直接就会跳出循环,继续往后执行。
continue的作用是跳过本次循环,continue后面的代码在for循环和while循环中有所差异。
while循环中的break和continue
break举例
打印了1 2 3 4后,当i等于5的时候,循环在break的地方终止,不在打印、不在循环。所以break的作用就是永久的终止循环,只要break被执行,break外的第一层循环就终止了。
continue举例
continue是继续的意思,在循环中的作用是跳过本次循环中continue后边的代码,继续进行下一次循环的判断。
for 循环中break和continue
break举例
这里的break的作用和在while循环里的作用是一样的,都是为了终止循环的。
continue举例
do while 循环的break和continue的作用几乎和while一模一样。
循环的嵌套
while ,do while, for,这三种循环往往嵌套在一起才能更好的解决问题。
练习:打印100~200之间的素数
注:素数又称质数,只能被1和它本身整除。
题目解析:
要从100到200之间找出素数,首先得有100~200之间的数,这里可以使用循环解决问题。
若要判断i是否为素数,需拿 2~i-1之间的字试除 i,需要产生2~i-1之间的数字,也可用循环解决。
如果2~i-1之间有数字能整除i,则不是素数,如果都不能整除,则是素数。
//100~200之间的素数
#include <stdio.h>
int main()
{
int i = 0;
//循环产生100~200之间的数字
for (i = 100; i <= 200; i++)
{//判断i是否为素数
//循环产生2~i-1之间的数字
int j = 0;
int flag = 1;//假设i是素数
for (j = 2; j < i; j++)
{
if (i % j == 0)
{
flag = 0;
break;
}
}
if (flag == 1)
printf("%d\n", i);
}
return 0;
}
goto语句
C语言提供了一种非常特别的语法,就是goto语句和跳转标号,goto语句可以实现在同一个函数内跳转到设置好的标号处。
eg:
goto语句使用不当可能会导致在函数内部随意乱跳转,会扰乱程序的执行流程,所以建议尽量不去使用。但在多层循环的代码中,如果想快速跳出,使用goto就非常方便。