c语言是一门结构化程序语言,分成三种结构:顺序结构、选择(分支)结构(if、switch)、循环结构(for 、while、do while)。
一.关系操作符
- > 大于运算符
- < 小于运算符
- >= 大于等于运算符
- <= 小于等于运算符
- == 相等运算符
- != 不相等运算符
注意:多个运算符不宜连用。
二.逻辑操作符
- && : 与运算符,并且的意思(如果两侧表达式为真,则为真,如果有一方为假或者全为假,则为假)
- || :或运算符,或者的意思(两侧有一方为真则为真,两方全为假则是假)
- ! :逻辑取反运算符,a为真,!a为假。
短路的情况
&& 与运算,左边操作数结果为0时,右边不在执行。
|| 或运算,左操作为真时,则不需要进行右边。
二 .if语句
1.语法
if(表达式)
{
执行语句;
}
如果表达式为真,则语句执行,如果为假,则语句不执行。0是假,非0(2、-1等等)为真。
if(a>0)
{
a=1;
}
这个代码的意思是:如果a>0,则将1赋值给a。
2.else
如果有了,但是我们还可能有其他的情况。如上述所言,假如a<0n或者a==0呢?这就需要else(其他)出场了。else与if组成 if.......else....语句,语法如下:
if(表达式1
语句1
else//没有(表达式2)
语句2
例如:当a>=0时,a是正数,当a<0时,a是负数。
int main()
{
int a = 0;
scanf("%d", &a);
if (a >= 0)
{
printf("a是正数");
printf("a的范围是大于等于0");
}
else
{
printf("a是负数");
}
return 0;
}
3.if与else后面智能控制一条语句,如果要同时控制多条语句,要使用{}将语句包裹起来。
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
if (a >= 0)
{
printf("a是正数");
printf("a的范围是大于等于0");
}
else
{
printf("a是负数");
}
return 0;
}
4.嵌套if
如果需要很多条件,比如:输入一个整数,如果是正数,再判断是不是偶数,如果不是则输出奇数。
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d",&num);
if (num > 0)
{
if (num % 2 == 0)
{
printf("偶数\n");
}
else
{
printf("奇数\n");
}
}
else
{
printf("非正数\n");
}
return 0;
}
5.悬空else
悬空else---如果很多if和else,那么else只和与它最近的if匹配。
只要加上大括号,代码的逻辑会变得清晰。
如果一个if有很多的else,如果一直是else(){},代码的逻辑不是很清晰。
可以将else和if结合,需要以else结尾。
if(表达式)
{
语句1
}
else if(表达式2)
{
语句2
}
else if(表达式3)
{
语句3
}
else if(表达式4)
{
语句4
}
........
else
{
语句
}
三.switch语句
1.语法
switch (表达式) {
case 结果1:
语句;
case 结果2:
语句;
default :
语句;
}
- switch后的表达式必须时整形表达式
- case后的值,必须是整型常量表达式
- case与后面的数子之间有空格
- 每一个case的语句执行完成后,需要加上break,才能跳出这个switch
2.break
#include <stdio.h>
int main()
{
int a = 0;
scanf("%d", &a);
switch (a % 2)
{
case 0:
printf("偶数");
break;
case 1:
printf("奇数");
break;
default:
printf("奇数");
}
return 0;
}
break不是每个case语句都有。
例如: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("休息日");
break;
}
return 0;
}
3.default
在switch语句中,可能switch后的表达式的值无法匹配case的结果,但是不得不做处理,在switch中加入default中。
例如:在上述的代码中,如果输入8,则显示输入错误。
#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("休息日");
break;
defult:
printf("输入错误");
}
return 0;
}
注:在switch中,case与default没有顺序要求,但是一般情况是将default放在最后面。
四.循环
1.while循环
语法:
while(表达式)
语句;//如果有更多的语句,可以加上大括号。
2.for循环
语法:
for(表达式1;表达式2;表达式3)
语句//如果有很多语句有用大括号。
3.do-while循环
语法:
do
语句
while(表达式);
4.三者的区别
我们将在一个代码中实现这个比较
//在屏幕上打印1~10的数字
//while循环
#include <stdio.h>
int main()
{
int i = 1;//循环变量
while (i <= 10)//判断i的值是否小于等于10
{
printf("%d ", i);
i++;//i++相当于i=i+1,每次循环都让i加1
}
return 0;
}
for循环
//for语句先是执行表达式1去初始化变量,然后进行判断,在执行表达式3的调整,
// 随后再进行判断,然后再调整,一直循环这些,等到遇到break进行结束语句。
int main()
{
for (int i = 1; i <= 10; i++)
{
printf("%d ", i);
}
return 0;
}
//do while循环
//在do while的语句中,会先执行调整里面的东西,再去判断。
int main()
{
int i = 0;
do
{
i++;
printf("%d ", i);
} while (i <10);
return 0;
}
- 循环:创建初始变量,找到判断循环的条件,最后再去执行。在这里,创建初始变量的时候,while循环,do while循环与for循环的不一样的地方。前两者循环变量要在循环体外面,而for循环可以将循环变量创建在表达式1中。
- do-while循环语句至少会先执行一次,所以使用do while语句时,要提前将代码首次循环想好。
5.break与continue
break
break中文是打破的意思,在C语言中用于永久的终止循环,break执行后会直接跳出循环,
用while循环看看break的效果(三者break无区别):
//在屏幕上打印1~10的数字,但是5和后面的数字不再打印
while循环
int main()
{
int i = 1;
while (i <= 10)
{
printf("%d ", i);
i++;
if (i == 5)
{
break;
}
}
return 0;
}
continue
continue是继续的意思,它的作用适用于跳过本次循环。但是在for与while中有所区别
用一个代码去看看把
#include <stdio.h>
nt main()
{
int i = 1;
while (i <= 10)
{
if (i == 5)
{
continue;
}
printf("%d ", i);
i++;
}
return 0;
}
//结果是:1 2 3 4 |这个是光标,一直在这循环
int main()
{
for (int i = 1; i <= 10; i++)
{
printf("%d ", i);
if (i == 5)
{
continue;
}
}
return 0;
}
//结果:1 2 3 4 5 6 7 8 9 10
- for循环,在执行遇contiue时,会跳过后面的语句,会回到表达式3中也就是调整部分
- while循环中,遇到contiue时,也会跳过后面的语句,但是会跳到判断那里。
6.goto语句
goto语句可以实现跳转到设置好的符号处(跳转标号)
int main()
{
for (int i = 1; i <= 10; i++)
{
printf("%d ", i);
if (i == 5)
goto next;//注意“:”符号
}
next:
printf("good\n");
return 0;
}
五.随机数
1.rand函数
- 头文件:stdlib.hstdlib.h
rand函数可以生成随机数,但不是真随机,它返回的是一个 伪随机数,其中一个原因是因为它有一个范围:0~RAND_MAX,不同编译器上的RAND_MAX不同,但基本是32767。
#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
如果再生成一次,会发现结果和第一次一样, 这就是伪随机的第二个原因,rand生成随机数是有基准的,如果基准不一样,每次生成的随机数就会不一样。rand函数时根据一个叫”种子“的基准值进行运算生成随机数。
2.srand函数
srand函数会初始化这些生成器,它返回的类型是无符号整型。
3.time函数
如果要生成真随机数,就要使种子在每次执行rand函数时发生变化,这样每次生成的随机数就会变化,time是变化的,在C语言中用time代替种子的变化。time函数的返回值类型是time_t类型,在time函数的参数中如果是非NULL,就会将返回值的插值放在time参数指定的地方。
参数如果是NULL,就会返回时间这个差值(时间戳)
#include <stdio.h>
#include <stdlib.h>
int main()
{
srand((unsigned int)time(NULL));//强制类型转换
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
printf("%d\n", rand());
return 0;
}
这样就会随机生成一些数字。但是如果我们想要生成有范围的怎么办?方法如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
srand((unsigned int)time(NULL));//强制类型转换
printf("%d\n", rand()%100);//0~99
printf("%d\n", rand())%100+1;//0~100
printf("%d\n", rand()%200-100+1);//100~200
return 0;
}
如果想要生a~b的随机数:a + rand%b-a+1.
-------一些使用循环的练习-------
1.判断一个正整数是几位数
#include <stdio.h>
int main()
{
int num = 0;
int cnt = 0;
scanf("%d", &num);
do
{
cnt++;
num /= 10;
} while (num > 0);
printf("%d", cnt);
return 0;
}
推荐使用do while循环,在遇到数字0时,会先执行cnt++,这样会输出1。
2.逆序输出整数
#include <stdio.h>
int main()
{
int num = 0;
scanf("%d", &num);
while (num > 0)
{
int d = num % 10;
num /= 10;
printf("%d ", d);
}
return 0;
}
3.素数的判断
- 素数指因数只有只有本身和1。
- 判断a是否是素数,在2~a-1的范围中,若无a的因数,则a为素数。
- 推荐for循环
#include <stdio.h>
int main(){
int a = 100;
int i = 2;
for (a = 100; a <= 200; a++){
int flag = 1;
for (i = 2; i <= a - 1; i++)
{
if (a % i == 0)
{
flag = 0;
break;
}
}
if (flag==1)
printf("%d ", a);
}
return 0;
}
4.猜数字游戏
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void game()
{
int guess = 0;
int cnt = 5;
int r = rand() % 100 + 1;
while (1)
{
printf("您还有%d次机会\n", cnt);
printf("请猜数字\n");
scanf("%d" ,&guess);
if (guess > r)
printf("猜大了\n");
else if (guess < r)
printf("猜小了\n");
else {
printf("恭喜你猜对了\n");
break;
}
cnt--;
if (cnt == 0) {
printf("您失败了,正确的值是%d\n",r);
break;
}
}
}
void menu()
{
printf("-------------------\n");
printf("-------------------\n");
printf("--- 1:game ---\n");
printf("--- 2:exit ---\n");
printf("-------------------\n");
printf("-------------------\n");
printf("请开始选择>");
}
int main()
{
int num = 0;
do
{
menu();
scanf("%d", &num);
switch (num)
{
case 1:
game();
case 0:
printf("游戏结束\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (num);
return 0;
}