顺序结构、选择结构、循环结构 这三种结构靠分支与循环来实现
if语句
if(表达式)
表达式为0:假 表达式非零(0以外的任何数字,不一定非得是1):真
if 语句只控制一条语句,多条语句用大括号括起来
else 可以与另⼀个 if 语句连⽤:if else,构成多重判断
悬空 else 的问题:如果有多个 if 和 else , else 总是跟最接近的 if 匹配;如果我们希望else确实和第⼀个if匹配,可以加大括号
关系操作符
关系表达式中使用的运算符就是关系运算符
关系表达式通常返回 0 或 1 ,表⽰真假。
注意事项:
1、相等运算符 == 与 赋值运算符 = 是两个不⼀样的运算符,不要混淆。
2、另⼀个需要避免的错误是:多个关系运算符不宜连⽤。应该用&&连接多个条件
条件操作符
条件操作符也叫三目操作符(接受三个操作数)
逻辑操作符
! :逻辑取反运算符(改变单个表达式的真假)。
&& :与运算符,就是并且的意思,双目运算符(全则为真,否则为假,是0的追随者)。
|| :或运算符,就是或者的意思,双目运算符(一真则为真,否则为假,是非零的追随者)。
判断闰年
int main()
{
int year = 0;
scanf("%d", &year);
if(year%4==0 && year%100!=0)
printf("是闰年\n");
else if(year%400==0)
printf("是闰年\n");
return 0;
}
int main()
{
int year = 0;
scanf("%d",&year);
if(year%4==0 && year%100!=0);
printf("是闰年\n");
else if(year%400==0);
printf("是闰年\n");
return 0;
}
短路
如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”
switch语句
switch括号里的表达式不同的值,执⾏相应的 case 分⽀。如果找不到对应的值,
就执⾏ default 分⽀。
1、switch() 的必须是整型表达式
2、case 后的值,必须是整形常量表达式 3、case 和后边的数字之间必须有空格
4、 每⼀个 case 语句中的代码执⾏完成后,需要加上 break ,才能跳出这个switch语句。(没有 break 语句,代码会继续玩下执⾏,有可能执⾏其他 case语句中的代码,直到遇到 break 语句或者 switch 语句结束) 5、 case 语句和 default 语句是没有顺序要求的
while循环
对一个正整数逆序输出
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
while(n)//这里条件写成了n,当n为0时就结束了
{
printf("%d ", n%10);//对10取余输出最低位
n /= 10;//对10取除数撇掉最低位
}
return 0;
}
for循环
for(表达式1; 表达式2; 表达式3)
表达式1⽤于循环变量的初始化?
表达式2⽤于循环结束条件的判断
表达式3⽤于循环变量的调整
表达式1初始化部分只被执⾏1次,剩下的就是表达式2、循环语句、表达式3在循
环
do-while循环
先来它一边,然后就和while一样了
特点:do while循环至少执行一次
运用:判断整数的位数
#int include<stdio.h>
int main()
{
int n=0;
scanf("%d",&n);
int cnt=0;
do{
cnt++;
}while(n);
printf("%d",cnt);
return 0;
}
break和continue语句
break永久终止
continue跳出本次循环
循环嵌套
打印素数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int i = 0;
for (i = 100; i < 200; i++)
{
int j = 0;
int flag = 1;//先把标志记为“是素数”
for (j = 2; j < i; j++)//从2到它本身,找找看有没有数能整除它
{
if (i % j == 0)
{
flag = 0;//如果有,就更换标志为“不是素数”
break;
}
}if (flag == 1)//对i的每次遍历中,如果标志显示它是素数就打印出来
printf("%d ", i);
}
return 0;
}
goto语句
goto 语句和跳转标号, goto 语句可以实现在同⼀个函数内跳转到设置好的标号处
适合应用在多层循环的代码中,快速跳出好多层循环
for(...)
{
for(...)
{
for(...)
{
if(该跳出循环了)
goto(跳出去标志)
}
}
}
跳出去标志
实例
猜数游戏:
一、生成随机数
rand()返回一个伪随机数,他的头文件是#include<stdlib.h>,他的参数类型是unsigned int
rand() 函数的生成 的种子默认为1,要生成不同随机数,应该更换种子,又需要一个随机的种子,以运行时间为种子的方式可以很好解决这个矛盾问题
time函数返回值ime_t本质上是32或64位的整数类型
time函数的参数timer如果是⾮NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存
中带回去。;如果timer是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳
time函数的时候需要包含头⽂件:time.h
生成a~b的随机数:a+rand()%(b-a+1)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void game()
{
int r = rand() % 100 + 1;
int guess = 0;
int count = 5;//倒数猜数字的次数
while(count)
{
printf("\n你还有%d次机会\n", count);
printf("请输入数字:");
scanf("%d", &guess);
if (guess < r)
{
printf("猜小了\n");
}
else if (guess > r)
{
printf("猜大了\n");
}
else
{
printf("恭喜,猜对了");
break;
}
count--;
}
if (count == 0)
{
printf("失败了,正确答案是%d\n", r);
}
}
void menu()
{
printf("***************************\n");
printf("**********1\play***********\n");
printf("**********2\exit***********\n");
printf("***************************\n");
printf("***************************\n");
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
return 0;
}