1.if语句
if(表达式) IF语句先进行表达式的判断,如果条件为真就执行其所附带的花括号里边的语句。
{
........;
} IF后边加分号会使ELSE无从匹配
else if 👈 互斥选择结构,与IF和ELSE构成条件的多重判断
{
.......;
}
else
{
......;
} 花括号不需要加分号
if,else if,else语句如果不加花括号,都将默认与下方一条语句匹配。最好把花括号写开,可以避免BUG产生。
if();
if() 👈 并列选择语句,此算法优点在于写起来简单,缺点在于计算机对每一个IF语句都要进行判断,运行效率上不如互斥选择结构和嵌套选择结构。
if()
......
if()
{
if()
else
}
else 👈 嵌套选择结构,优点:可以减少不必要的比较,而且可以参考数据的特征调整判断条件来做到优化算法,运行效率高;
{ 缺点:代码块可读性下降,如果嵌套太多会冗长
if()
else
}
if( i = 5)赋值表达式的值是变量被赋的值,IF获得的值就一直是5.不要与判断符(if (i==5))搞混了。
2.switch语句:
switch(整型表达式)
{
case value1: ......;(break);
case value2:.......;(break);
default:.......;(break);
}
VALUE的值可以是常量,也可以是整型常量表达式;可以是数字,也可以是字母,VALUE的值就是整形表达式的值。
BREAK用于结束一个分支,并且分支以下的部分全都不执行;如果不用BREAK,则可以确定程序的入口,执行的CASE后边的语句继续执行。
DEFAULT语句用于执行不符合VALUE的值的所有情况,CASE和VALUE所在位置不是固定的,DEFAULT语句也可以不写。
多个CASE如果执行同样的语句,可以多个CASE进行堆叠合并。
int main()
{
int day = 1;
switch (day)
{
case 1:
case 2:
case 3:
case 4:
case 5:printf("工作日"); break;
case 6:
case 7: printf("今日休息"); break;
}
return 0;
}
3.循环 补充
1.break和continue
break语句会终止循环,循环体中剩余部分有语句也将不会再执行。
int i = 1;
while (i<=10)
{
if ( i == 5)
break; 👈 只要BREAK执行就直接停止循环,
printf("%d",i); 👈 剩余的代码不执行,最终I==5,打印出1 2 3 4.
i++;
}
continue的作用是跳过本次循环中continue后边的代码,继续循环。
int i = 1;
while (i<=10)
{
if ( i == 5)
continue; 👈 当I = 5的时候会跳过本次循环
printf("%d",i); 👈 I= 5 的时候,这一次循环continue后边的循环就别做了
i++;
} 结果:1 2 3 4后陷入死循环
因此WHILE循环+CONTINUE如果不对循环变量进行位置正确的改变,可能会陷入死循环!
特例:for(int i = 1; i < 10;i++)
{
if ( i == 5 )
continue;
........ 👈 continue会跳过省略号部分的语句,但是FOR循环的最后会在最上方的括号内实现循环变量的调整,所以I++仍然会被操作。
(如果i++被省略,并且I++放在了CONTINUE的后边,那就死循环没办法了。。。。)
总结:BREAK适用于当某个条件满足时就彻底结束循环,并且也不再执行循环体之内的所有BREAK之后的代码;
CONTINUE适用于当某个条件满足时,对于本次循环,将循环内CONTINUE后面的代码省略,循环继续;
2.goto语句:实现语句的跳转
int main()
{
printf("hehe");
goto a;
printf("haha");
a: 👈 这是冒号,指示goto执行的代码,可以实现语句的跳转。
printf("heihei"); // 打印结果: hehe heihei
}
{
a:
printf("hehe");
goto a;
printf("haha");
goto可以实现程序的向前/向后跳转。但是向前跳转的时候会降低程序的可读性,也可能造成死循环。
但是如果在多层循环中想要立刻终止循环,除了一堆可能出BUG的break,可以尝试用goto来实现。
3.rand()函数
需要头文件: <stdlib.h> < time.h>
rand()函数生成的是伪随机数,因为没有对种子初始化,所以同一条 rand()产生的随机数是一样的。
int r = rand();
printf("%d\n", r); 执行完后关闭再打开,进行原程序,给出的数字是一样的;如果利用循环重复执行,那么给出的数字是不一样的。
因此,要产生真正的随机数,需要三把手:
-
strand函数将种子初始化:如果需要真正的随机数,就需要将种子保持变化,不同的种子,随机生成的法则也会变化,所以得到的值也会变化。
strand(1)会将基准值设为1,但仍然是一个定值,不会产生真正的随机数。
利用TIME函数产生一个时间戳, 利用时光的流逝,可以产生不同的数字,于是就产生了不同的种子。
strand接受的形参只能是无符号整数;
time 函数需要指针,给他一个NULL(空指针),就只返回时间的差值;time函数返回的是整数,但是需要强制类型转换成无符号整数。
代码:strand((unnsigned)(time(NULL)) 就可以实现持续变化的种子!
-
rand() 函数有返回值,返回的是0----32767之间的任意一个数字。
int r = rand(). 👈 将RAND获得的值存储到r里边。
rand返回的范围可能太大,可以利用取模来进行范围的缩小:
对于任意一个数字,如果%101,余数将会是0---100的某一个值。
(rand()%(b-a+1)可以产生0---b-a的某一个余数,加A就可以完成所需要的范围。
如果要生成a---b的随机数,可以参考int r = a + (rand()%(b-a+1));
-
在整个程序当中,只可以进行一次种子的初始化,否则会出现BUG。
以下是利用循环+自定义函数+RANDOM+TIME完成的小游戏:
#include <time.h>;
#include <stdio.h>
#include <stdlib.h>
void game()
{
int count = 5;
int r = (rand()%100+1); //
//
while (count != 0)
{
printf("你还有%d次机会。\n",count);
printf("请猜数字:");
int m = 0;
scanf("%d", &m);
if (r > m)
printf("小了!\n");
else if (r < m)
printf("大了!\n");
else
{
printf("答对了!\n");
break;
}
count--;
}
if (count == 0)
printf("游戏结束!数字是:%d\n", r);
printf("如果继续,请重新与我交互………………\n");
}
int main()
{
srand((unsigned)time(NULL));
int a = 2;
do
{
menu();
scanf("%d", &a);
switch (a)
{
case 1:printf("开始!\n"); game(); break;
case 0:printf("退出!\n"); break;
default:printf("你干嘛~哈哈~哎呦~\n"); break;
}
} while (a);
return 0;
}