一:比较if switch 以及注意事项
int main()
{
int num = 0;
scanf("%d",& num);
switch (num % 3)
{
case 1:
printf("余数是1");
break;
case 2:
printf("余数是2");
break;
case 0:
printf("余数是3");
break;
}
return 0;
}
#include<stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
if (num % 3 == 0)
{
printf("余数是0");
}
else if (num % 3 == 1)
{
printf("余数是1");
}
else
{
printf("余数是2");
}
return 0;
}
switch表达式
运行逻辑:switch(expression)
{
case value1:
case value2:
default:statement
}
注意:不能用float为num赋值
同时case后也要是整形不能是1.0
应该是整形常量表达式
即
switch 后的 expression 必须是整型表达式
case 后的值,必须是整形常量表达式
但switch后可以是字符,因为字符的本质是它的ask码值
switch语句使用的场景不能强行把if转换为switch
switch()后的表达式能够明确的计算出某个值的时候后才有case
if后的()的表达式则可以明确的给出范围如>多少等。
另外:break在switch中才是真正的实现了分支的效果。
二:重复性问题应该如何解决,以及超出case如何解决
#include<stdio.h>
int main()
{
int day = 0;
printf("请输入一个值:");
scanf("%d", &day);
switch (day)
{
case 1:
case 2:
case 3:
printf("有课");
break;
case 4:
printf("没课");
break;
}
return 0;
}
三: 分支中包含多条语句即{}的意义
#include<stdio.h>
int main()
{
int age = 0;
scanf("%d", &age);
if (age >= 18)
printf("已成年\n");
printf("可以谈恋爱了");
return 0;
}
发现无论输入多少均打印第二条语句可以谈恋爱了。
这是因为if只能控制一条语句,printf(“可以谈恋爱了”)是独立存在的不管if语句的条件的真假,都会被执⾏。那如果我们要if语句同时控制2条语句,怎么办呢?那就要使⽤ {} 将代码括起来,else后也可以跟上⼤括号。如下:
#include<stdio.h>
int main()
{
int age = 0;
printf("请输入您的年龄:");
scanf("%d", &age);
if (age >= 18)
{
printf("已成年\n");
printf("可以谈恋爱了");
}
else//else后使用{}包含多条语句,这个快叫程序块也叫复合语块
{
printf("未成年");
printf("好好学习");
}
return 0;
}
四:循环的分类
while循环
if与while的比较:
if(表达式)
语句
while(表达式)
语句
十分相似但执行逻辑不同
比如
#include<stdio.h>
int main()
{
if (1)
{
printf("666");
}
return 0;
}//由于1为真,则输出,结果只是666
#include<stdio.h>
int main()
{
while (1)
{
printf("666");
}
return 0;
}
为死循环满屏666
while循环逻辑如下
while(判断表达式)
{
语句
}
while训练
将数字串逆向打印出来:
#include<stdio.h>
int main()
{
int num = 0;
printf("请输入一个数字:");
scanf("%d", &num);
while (num)
{
printf("%d", num % 10);
num = num / 10;
}
return 0;
}
for循环
for循环的语法形式如下:
for(表达式1;表达式2;表达式3)
(语句)
**表达式一:**循环的初始化
**表达式二:**循环结束的判断条件
**表达式三:**循环的调整
以下为for循环的执行流程
利用for循环计算1-100中3的倍数相加(两种不同的方式)
int main()
{
int i = 0;
int num = 0;
for (i = 1; i<=100; i++)
{
if(i%3==0)
{
num += i;//num=num+i;
}
}
printf("%d", num);
return 0;
}
int main()
{
int i= 0;
int num = 0;
for (i = 3; i <= 100; i += 3)
{
num = i + num;//num+=i;
}
printf("%d", num);
return 0;
}
第一种方式循环100次,判断100次
第二种方式循环34次,判断34次
do-while循环
循环逻辑:
do(语句)
while表达式
for和while都是先判断然后再执行语句,而do-while循环则是先执行然后再判断。
则在do-while循环中至少要执行一次
练习:
//输入一个正整数判断为几位数
int main()
{
int num = 0;
int i = 0;
printf("请输入一个数字");
scanf("%d", &num);
do
{
num=num / 10;
i++;
} while (num);
printf("您输入的数字是%d位数", i);
return 0;
}
问题:并不完全正确如输入999999999999这个12位数时显示为9位数
输入1984651894619849这样的长数字时输出的为1位数
五:循环的嵌套和优化
打印100-200之间的素数
int main()
{
int num = 0;
int count=0;
for (num = 100; num <= 200; num++)
{
int i = 0;
int z = 1;
for (i = 2; i < num; i++)
{
if (num%i==0)
{
z = 0;
break;
}
}
if (z == 1)
{
printf("%d\n", num);
count++
}
}
printf("一共%d个",count);
}
优化:
#include<stdio.h>
#include<math.h>
int main()
{
int num = 0;
int count=0;
//优化1:偶数一定不是素数,则没必要进入循环
for (num = 101; num <= 200; num+=2)
{
int i = 0;
int z = 1;
//优化2:i=a*b,ab中至少有一个数字<=根号i
/*sqrt()指的是取根号,需要库函数<math.h>*/
for (i = 2; i <= sqrt(num); i++)
{
if (num%i==0)
{
z = 0;
break;
}
}
if (z == 1)
{
printf("%d\n", num);
count++
}
}
printf("一共%d个",count);
}