目录
前言: c语言是一门结构化语言 其中的结构指的就是 顺序结构 选择结构 逻辑结构
1. if 语句
形式如下
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int a=0, b=1;
if (a)
{
;
}
else if (b)
{
;
}
else
{
;
}
return 0;
}
其中 a b为判断条件 { }内为执行语句
通过以上相关知识点 我们可以试着写出 用if判断是奇数还是偶数
使用if判断是奇数还是偶数的代码如下
用if 判断 是正数还是负数
在if else语句中有一点需要注意 那就是else是遵循就近原则 既会与最近的if 形成组合 如下
由于if(a==1)并不满足 因此不执行if(b==2)
若需要上面的if 与 else匹配 需要 { } 如下
2. 操作符--关系操作符 条件操作符 逻辑操作符
2.1 关系操作符
如果需要表达 0<a<10 在c语言中需要使用&&符号 &&表示并且 而||为或者
2.2 条件操作符
三目操作符
找两个数其中的较大值时
把xy其中较大值赋给a 需要用到 ? 与 :
?前为真 则输出x ?前为假 则输出y 可以用来替换简单的if语句
2.3 逻辑操作符
&&:并且 ||:或者
&& 表示需要同时满足才成立 此时返回值为1
当其中有一个为假时 返回0
|| 表示满足其一既可 返回值为1
当其中两个都为假时才返回0
!:取反
如图 if语句中 条件为真时执行 而加入! 表示取反 此时a为假时执行
练习 判断是否为闰年
短路
1. 基本概念
逻辑短路是编程语言(如C、C++、Java、Python等)中逻辑运算符(
&&
和||
)的一种优化行为:
&&
(与):若左侧为假,直接跳过右侧计算(整体必为假)。||
(或):若左侧为真,直接跳过右侧计算(整体必为真)。2. 为什么需要短路?
- 效率提升:避免不必要的计算。
- 安全性:防止潜在错误(如空指针访问)。
小结 :
逻辑运算符的特点是从左往右进行计算 因此才会出现这种情况
例如 :
a&&b 假如a为假 那就不需要对b进行运算了
a||b 假如a为真 那就不需要对b进行运算了
3. switch语句
基本格式如下
switch()
{
case 0:
{ }
case 1:
{ }
default:
{ }
}
例如
让我们试着运行以下 按正常情况应该输出余数是2才对
而结果是case 2之后的语句全部都运行了 这是因为当满足case2他不会跳出switch语句
此时我们需要使用break关键字来跳出switch 如下
这样就运行成功了
注意项 :
1 case之后跟数字必须有空格 并且使用 :
2 switch(num) 其中num必须为整型 可以是int char 因为char本质上也是整型 但不可以是浮点数
3 每一个case语句后面必须跟一个break; 这样才能跳出switch语句
4 break的使用取决于是否需要跳出switch语句
5 default是所以case都不匹配时 执行default选项的语句
6 default 的位置不固定 可以放在case之前 但后面需要跟上break; 才能跳出switch
下面让我们来试着写出打印今天是星期几的代码
假如输入1 则打印今天是星期一 其他同理
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int input;
scanf("%d", &input);
switch (input)
{
case 1:
printf("今天是星期一\n");
break;
case 2:
printf("今天是星期二\n");
break;
case 3:
printf("今天是星期三\n");
break;
case 4:
printf("今天是星期四\n");
break;
case 5:
printf("今天是星期五\n");
break;
case 6:
printf("今天是星期六\n");
break;
case 7:
printf("今天是星期天\n");
break;
default:
printf("输入错误\n");
}
现在我们修改一下 1~5打印工作日 6~7打印周末
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int input;
scanf("%d", &input);
switch (input)
{
case 1:
case 2:
case 3:
case 4:
case 5:
printf("今天是工作日\n");
break;
case 6:
case 7:
printf("今天是周末\n");
break;
default:
printf("输入错误\n");
}
相信你也想出来了 当1~5打印相同时 我们可以删去多余打印部分与多余break
这样case1~5就会输出最后case5打印的今天是工作日 6~7同理
4. while 与 do while 循环
while循环 格式如下
int main()
{
while (1) //1是判断条件
{
//执行语句
}
return 0;
}
do while循环 格式如下
int main()
{
do
{
//执行语句
} while (1);//1是判断条件
return 0;
}
do while 与 while 循环的区别在于 do while 会先执行一次在判断循环条件
而while是先判断在执行 假如条件为假 则一次都不执行
continue 与 break :
而循环语句内 我们就会涉及 continue 与 break
continue ; 表示跳出此次循环 进入下一次循环
break ; 表示跳出循环体
我们可以通过以下代码来理解 continue 与 break
break示例
循环条件是 1 无限循环 但循环体内有break 当满足 if (i = 9)时 执行break; 跳出循环
continue示例
当满足条件 if (i%3==0) 时 执行 continue 跳出此次循环 不在打印i的值 因此3的倍数都不打印
而 if (i == 20)满足时 跳出循环 表示当i==20时 跳出循环体
练习 倒序输出
输入一个数字 然后倒序输出 例如 输入1234 输出4321 代码如下
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int input;
while (input!=0)
{
printf("%d", input % 10);
input = input / 10;
}
return 0;
}
键盘录入input
使用while循环 循环条件为input != 0
第一个打印的数字为input的个位数
因此第一步使用input来对10取余 这样就会得到个位
第二步 将input除以10赋给input本身 这样个位就被省略掉了 剩下的在组成一个新数字
再重复第一步 既重新进入循环 当input==0 时 跳出循环 打印完毕
练习 计算位数
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int input;
int count = 0;
scanf("%d", &input);
do
{
count++;
input = input / 10;
} while (input != 0);
printf("%d", count);
return 0;
}
运行结果如下 ;
练习 关机与循环
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int main()
{
char input[50];
printf("请输入我是大笨蛋 否则电脑将在一分钟内关机\n");
system("shutdown -s -t 60");
while (1)
{
scanf("%s", input);
if (strcmp(input, "我是大笨蛋") == 0)
{
printf("恭喜你输入正确 成功取消\n");
system("shutdown -a");
}
else
{
printf("输入错误 请重新输入\n");
}
}
}
解释如下
键盘录入input的值 与answer进行比较 使用strcmp关键字
若相等则退出循环 若不相等则打印 输入错误 请重新输入 再次进入循环
-
参数说明
-s
:表示关机(shutdown)。-t 60
:设置倒计时为 60 秒(默认单位是秒,可修改数字调整时间)。- 其他常用参数:
-r
:重启(reboot)-a
:取消关机(abort)-f
:强制关闭所有程序(force)
5. for 循环
基本格式如下
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
// for (表达式1; 表达式2; 表达式3)
{
//循环体
//表达式1 是初始化语句
//表达式2 是判断语句
//表达式3 是调整语句
}
return 0;
}
理解for循环执行顺序
表达式1->表达式2->循环体->表达式3->表达式2->循环体->表达式3---------
先初始化 在判断 然后进入循环体 在执行调整语句 在判断
若判断为假 则跳出循环 判断为真则再次进入循环
下面 使用for循环打印 1~10
注 : 初始化语句只会被执行一次
练习 打印1~100之间3的倍数并且求和
代码如下
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int output=0;
for (int i=1; i<100; i++)
{
if (i % 3 == 0)
{
output = output + i;
printf("%d ", i);
}
}
printf("\n1~100之间3的倍数之和为%d",output);
return 0;
}
运行结果如下:
解析 :
1 使用for循环 在1~100之间进行
2 循环体中 使用if语句 对3的倍数进行剔除 满足3的倍数的进行打印 并且将值进行累加赋给output
3 退出循环体后 将output的值进行打印
练习 输出100~200之间的素数
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int main() {
int i = 0;
for (i = 100; i <= 200; i++)
{
int flag = 1;//假设是素数
for (int n = 2; n <= sqrt(i); n++)
{
if (i % n == 0)
{
flag = 0;//不是素数
break;
}
}
if (flag == 1)//是素数打印
printf("%d\n", i);
}
return 0;
}
解释如下:
1.其中用到 了循环的嵌套 第一层循环是为了100~200的依次进行判断
2.第二层循环是为了让100~200的每一个数单独进行判断 从2~sqrt(i)分别进行整除
如果能整除 则flag=0;不是素数 若不能 则flag依旧=1 是素数
sqrt(i)表示对i进行开方 目的是为了提升代码运行效率
3.在第二层循环结束后 在第一层循环最后 判断flag的值 判断是否打印
运行结如下: