C语言是一门结构化的程序设计语言
顺序结构:正常的代码结构
选择结构:if,switch
循环结构:for,while,do...while
一.选择结构
1.if语句
1.1if
if(表达式) //表达式为真则执行,为假则不执行,也就是判断条件
语句;
1.2else
if(表达式)
语句1;
else
语句2;
当表达式为假则执行else后的语句。
例一
输入某科分数大于等于60分,是输出“Pass”,否则,输出“Fail”
#include <stdio.h>
int main(){
int a = 0;
scanf("%d",&a);
if(a >= 60 && a <= 100) //&&为与条件操作符
printf("Pass\n");
else
printf("Fail\n");
return 0;
}
1.3分支控制多条语句
通常if与else后只能控制一条语句,若想控制多条应该加上{}
if(表达式)
{
控制语句1;
控制语句2;
}
else
{
控制语句1;
控制语句2;
}
1.4嵌套if
if...else可以与另一个if...else连用,构成多重判断。
例题:判断一个数字的正负,若是整数判断其奇偶性
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
int num = 0;
scanf("%d", &num);
if (num <= 0)
{
printf("是负数和零哟");
}
else
{
if (num % 2 == 1)
printf("奇数");
else
printf("偶数");
}
return 0;
}
一般简写成
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main() {
int num = 0;
scanf("%d", &num);
if (num <= 0)
printf("是负数和零哟");
else if (num % 2 == 1)
printf("奇数");
else
printf("偶数");
return 0;
}
1.5悬空else问题
else和就近的if匹配。
引子:由于嵌套多层if else可读性降低,后期维护不方便,可以用switch条件语句
2.switch条件语句
switch(表达式) //整形表达式哦~
{
case 整形常量1:
控制语句;
break; //break负责跳出这个switch语句
case 整形常量2:
控制语句;
break;
.....依次往下
default:
控制语句;
break;
}
如果多个case条件后面的语句是相同的可以只保留最后一条控制语句和break即可
【注:1.switch分支语句的表达式只能是整形表达式,字符类型的ascii码也算整形;
2.而case后只能跟整型常量】
例如:
case 1:
case 2:
控制语句;
break;
【注:break表示跳出语句,如果忘写break,将执行下一个控制语句,直到运行完在此之后的所有语句】
例题:
int func(int a) { int b; switch (a) { case 1: b = 30; case 2: b = 20; case 3: b = 16; default: b = 0; } return b; }
最终b=多少?
揭晓答案 b=0
default的位置可以在{ }内任意位置,但建议放到最后避免影响运行结果
二.操作符
1.算数操作符和赋值操作符
1.1算数操作符
+-*/加减乘除%取余
++自增--自减
a++先使用后加1
++a先加1后使用
a--先使用后减1
--a先减1后使用
注:1.%取余操作符两边必须是整数,结果的正负之和操作符左面的数有关
2./操作数都为整数类型,结果也为整形 解决方案:将其中一个修改成浮点数即可
1.2赋值操作符
=,+=,-=,*=,/=,%=
a+=b即a=a+b
2.关系操作符
关系运算符用于对两个数值进行比较,结果是一个逻辑值真或假。
换而言之,关系操作符就是用来比较大小的。
< ,>,<=,>=
==:相等,不要与‘=’赋值搞混
!=:不等于
3.条件操作符
表达式1?表达式2:表达式3;
判断表达式1为真还是为假,为真执行表达式2得出最后结果,为假则计算表达式3得出最后结果
条件运算符可以进行嵌套,结合方向自右向左
int a = 5,b=2;
a>b?a:c>d?e:d为a>b?a:(c>d?c:d)
4.逻辑操作符
或 ||:两个条件只要满足其中一条即为真
例如(我要一个桃子或一个西瓜就会很开心,条件:我要一个桃子||一个西瓜,结果:就会很开心)
与 &&:要满足操作符两边的条件1与条件2
(例如:100>=a>=1用计算机语言写成a>=1&&100>=a)
非 !:!a,若表达式a为真,!a为假,反之亦然
表达式中的所有运算符参与运算是有优先级的。
三.循环结构
1.while循环
while(循环条件)
{
执行语句
}
1.while()后加;意为执行空语句,而{}内的语句并不执行。
循环结果为真(非0)则接着执行循环体,若为0则终止循环体内的程序。
例题输入一个整数,逆序打印这个数的每一位
#include<stdio.h>
int main(){
int a = 0;
scanf("%d", &a);
while(a) {
printf("%d", a % 10);//打印出个位数字
a /= 10;//去除个位数字
}
return 0;
}
2.do...while...
do{
执行语句;
}
while(表达式);
do...while...和while的区别:前者先执行后判断,后者先判断条件再执行循环
do while 语句中循环体是至少执行⼀次
例题,输入一个正整数,计算这个整数是几位数?
#include<stdio.h>
int main(){
int num = 0,n = 0;
scanf("%d", &num);
do{
num /= 10;
n++;//每减少一位n加一
}
while(num);//当num == 0,为假时终止循环
printf("%d",n);
}
3.for循环
for(表达式1;表达式2;表达式3) //表达式1一般用来赋值,表达式2用来判断
语句;
表达式1用于循环变量的初始化
表达式2用于循环结束条件的判断
表达式3用于循环变量的调整
for循环由于句式比较集中更便于维修,while循环比较分散,形式更为优
先执行表达式1,再进行表达式2的判断,符合条件则进入循环体,接着执行表达式3,在不符合条件时退出。
4.循环嵌套
找出100~200之间的素数,并打印在屏幕上。
解题思路:
1.先写出100~200的数字循环
2.如果2~i-1之间的数可以被其中的数整除则不是素数,试除用一次循环,判断用一次分支
先写一下我第一次写的错误代码以及循环结果
#include<stdio.h>
int main() {
int num = 0;
for(i = 100; i <= 200; i++){
int n = 0;
for(n = 2; n <= 199; n++) {
if(num % n != 0)//
printf("%d ", num);
else
break;
}
}
return 0;
}
对于本次错误的刨析:
if循环在for循环里面,所以当一个数满足条件不会跳出循环,故当一个数为质数每次循环都会打印一遍
正解
#include<stdio.h>
int main() {
int num = 0;
for (num = 100; num <= 200;num++) {
int n = 0;
int j = 0;//用来判断i是否为素数
for (n = 2; n <= 100; n++)
{
if (num % n == 0)
j = 1;
else
break;
}
if (j == 0)
printf("%d ", num);
}
return 0;
}
四.break和continue语句
在循环执行的过程中,如果某些状况发生的时候,需要提前终止循环
1.break的作用是用于永久的终止循环,只要break被执行,直接就会跳出循环,继续往后执行。
(只跳出一层循环)
2.continue的作用是跳过本次循环continue后边的代码,在 for循环和while 循环中有所差异的