c语言鹏哥学习笔记(分支与循环)
目录
语句
分支与循环
结构化
分支语句(选择结构)
if语句语法结构
----if else只能管下面的一条语句(大括号最好带上)
----&& 错误写法 2<=10<>
----悬空else else默认和距离最近的if匹配
if书法格式对比
----判断一个数是否是奇数
----输出1~100的奇数
switch语句
循环结构 循环语句
while循环
----getchar() putchar()
----getchar()运用 拿走\n
--------清理缓冲区中的字符
--------只打印数字
for循环
----省略初始化
----两个循环变量
do while语句
练习题
1.计算n的阶乘
2.计算1!+2!+........10!
----错误
3.在一个有序数组中查找某个数字n 二分法
4.打印逐渐显现的文字
----Sleep 函数 system("cls")清空屏幕
5.模拟用户登录 两个字符串比较strcmp
6.猜数字
----随机数 ----------------
----强制类型转换
三个整数从大到小输出*
两个数的最大公约数
----辗转相除法
打印1000到2000的闰年
打印素数100~200
----sqrt()计算根
goto语句
只要运行起来,电脑就会在1分钟内关机,如果输入:我是猪,就取消关机
----可发行
语句
c语言 中用;隔开的就是一条语句
分支与循环
0是假 其他都是真
结构化
c语言是结构化的程序设计语言
顺序结构
选择结构
循环结构
分支语句(选择结构)
if语句语法结构
单分支
if(表达式) //表达式中非0就是真
语句;
------------------------------------------------
if(表达式)
语句;
else (表达式)
语句;
多分支
if(表达式)
语句;
else if(表达式)
语句;
else (表达式)
语句;
----if else只能管下面的一条语句(大括号最好带上)
int main()
{int age = 20;if (age > 18)printf("成年\n");elseprintf("未成年\n");printf("不能结婚\n");return 0;
}
----&& 错误写法 2<age<=10
先2<age是真 所以把2<age赋值为1
int main()
{int age=50;if (age < 10){printf("童年");}else if (age >= 10 && age <= 5)//&&表示并 大于等于10并且 小于等于5{printf("青年");}else{printf("壮年");}return 0;
}
----悬空else else默认和距离最近的if匹配
int main()
{int a = 0;int b = 1;if (a > 9)if (b > 2)printf("哈哈");elseprintf("呵呵");return 0;
}
结果是都不打印
if书法格式对比
一样的(return以后代码就停止了)推荐第二种写法
if (5==num)这种书写风格好 (防止写成num=5 少一个=不会提示)
----判断一个数是否是奇数
int main()
{printf("请输入一个数-->");int a = 0;scanf("%d", &a);if (a % 2==0){printf("是个偶数");}else{printf("是个奇数");}return 0;
}
scanf里除了%之外不要写别的
----输出1~100的奇数
int main()
{int a = 1;while (a <= 100){if (a % 2 == 1){printf("%d ", a);a++;}else{a++;}}
}
switch语句
适合多分支
语法
switch(整形表达式)
{
语句项
}
语句项 case 整形常量表达式(字符也可,对应Asall码值)
语句;
int main()
{int sel = 0;scanf("%d", &sel);switch (sel){case 1:printf("星期1");case 2:printf("星期2");case 3:printf("星期3");case 4:printf("星期4");break;}return 0;
}
整形表达式结果是几就从几进,遇到break停止 没有break的话 def也执行
defalut:case后的都没有,则输出defalut的 (defalut无问题顺序)
switch可以嵌套使用
int main()//1~5工作日 6,7休息日
{int a = 0;scanf("%d", &a);switch (a){case 1:case 2:case 3:case 4:case 5:printf("工作日");break;case 6:case 7:printf("休息日");break;}return 0;}
循环结构 循环语句
while
for
do while
while循环
while(表达式)
循环语句;
break跳出当前循环,continue跳出本次循环,进入下次循环
int main()
{int a = 0;while (a < 500){if (a == 5) {a++;continue;//跳出本次循环,进入下一次循环}else if (a == 100){break;//跳出当前循环}printf(" %d", a);a++;}return 0;
}
----getchar() putchar()
从键盘输入一个字符 ,读取正确返回的是ASALL码值,读取错误返回EOF
EOF end of file文件结束标志 本质上是-1
int main()
{int a = getchar();//从键盘输入一个字符putchar(a);//输出一个字符return 0;
}
putchar()输出一个字符
int main()
{int a = 0;while ((a = getchar()) != EOF){printf("%c", a);}return 0;
}
会自动换行,因为每次输入时都会回车,相当于字符/n
----getchar()运用 拿走\n
int main()
{char passwd[20] = { 0 };printf("请输入密码->");scanf("%s",passwd);//passwd前面不用加&取地址符号,因为passwd数组名本来就是数组第一个元素的地址printf("请确认密码->Y/N");int a = getchar();if (a == 'Y'){printf("确认成功");}else{printf("确认失败");}return 0;
}
scanf 数组名不用取地址 数组名本来就是首个元素的地址
不拿转义字符,不拿空格后的
从缓冲区拿数据
(键盘:快递员 缓冲区:驿站 输入函数:你)
再写一个getchar()拿走\n
int main()
{char passwd[20] = { 0 };printf("请输入密码->");scanf("%s",passwd);//passwd前面不用加&取地址符号,因为passwd数组名本来就是数组第一个元素的地址printf("请确认密码->Y/N");getchar();//再写一个int a = getchar();if (a == 'Y'){printf("确认成功");}else{printf("确认失败");}return 0;
}
但是输入 123 456(有空格仍会失败)
--------清理缓冲区中的字符
清理缓冲区剩下来的字符
int tmp = 0;while ((tmp = getchar()) != '\n'){; //用来清理缓冲区字符}
--------只打印数字
int main()
{int a = 0;while ((a = getchar()) != EOF){if (a < '0' || a>'9')//看对应的ASCALL码值{continue;}putchar(a);}return 0;
}
for循环
(初始化部分只执行一次)
初始化 判断 调整
for(表达式1;表达式2;表达式3)
循环语句;
int main()
{int a;for (a = 1; a <= 10; a++){printf("%d", a);}return 0;
}
break
continue(跳到调整部分)
三个部分可以不写(最好写,判断部分省略恒为真)
建议
最好别在for循环修改循环变量
----省略初始化
int main()
{int a = 0;int b = 0;for (; a < 3; a++){for (; b < 3; b++){printf("hehe\n");}}return 0;
}//最后打印了三次
第一次循环b加到3,下一次循环b不重新初始化到0
----两个循环变量
int main()
{int a, b;for (a = 0, b = 0; b < 4; b++, a++){printf("%d", b);}return 0;
}
这是赋值!
do while语句
先执行后判断,至少执行一次
do
循环语句;
while(表达式)
int main()
{int a = 1;do{printf("%d", a);a++;} while (a <= 5);return 0;
}
continue跳到判断
练习题
1.计算n的阶乘
int main()
{int n;int j;int sum=1;printf("请输入n,计算n!->");scanf("%d", &n);for (j = 1; j <= n; j++){sum = sum * j;}printf("%d", sum);return 0;
}
2.计算1!+2!+........10!
int main()
{int i;int n;int sum=1;int he=0;scanf("%d", &n);for (i = 1; i <= n; i++){sum = sum * i;he = he + sum;}printf("%d", he);return 0;
}
----错误
ret不能复原
时间复杂度高,效率低
3.在一个有序数组中查找某个数字n 二分法
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int k = 0;scanf("%d",&k);//要查找的数int left = 0;int sz = sizeof(arr) / sizeof(arr[0]);int right = sz - 1;int mid;//中间指针while (left<=right){mid = (left + right) / 2;if (arr[mid]<k){left = mid + 1;//要加1,因为k大于arr[mid],所以也排除掉他}else if (arr[mid]>k){right = right - 1;//同上,不过要减去}else if (arr[mid] = k){printf("找到了,索引是[%d]", mid);break;}}if (left>right){printf("没有这个数");}return 0;
}
4.打印逐渐显现的文字
例如:
#####
w###!
we#t!
west!
int main()
{char arr[] = "helloworld";char arr2[] = "##########";int left = 0;int sz = sizeof(arr) / sizeof(arr[0]);int right = sz - 1;while (left <= right){arr2[left] = arr[left];arr2[right] = arr[right];printf("%s\n", arr2);left++;right--;}return 0;
}
----Sleep 函数 system("cls")清空屏幕
#include <Windows.h>
Sleep(数字)休息几毫秒
S要大写
Sleep(1000);system("cls");
5.模拟用户登录 两个字符串比较strcmp
两个字符串比较不能使用等号(字符串名字就是首字母地址,比较这个没意义)
strcmp(字符串1,字符串2)返回值为0证明相等
要引入头文件
#include <string.h>
int main()
{char passwd[20] = { 0 };//密码int i = 0;for (i = 0; i <3; i++){printf("请输入密码->");scanf("%s", passwd);//密码if (strcmp(passwd,"123456")==0){printf("密码正确");break;}else{printf("输入错误\n");}}if (i==3){printf("三次机会已经用光");}return 0;
}
6.猜数字
----随机数
#include <stdlib.h>
rand()返回一个随机数 0-32767 生成的随机数顺序固定
srand设置随机数 strand(中间输入输入数字后rand()生成固定的随机数)种子 中放一个随机值
时间戳随机 放时间戳(相较于计算机起始时间的差 秒数)
time(NULL)返回一个时间戳
不想输入参数
#include <time.h>
#include <stdlib.h>
void num()
{srand((unsigned int)time(NULL));int com_guess = rand() % 100 + 1;//题目要求0到99的数字 %100取余 余数一定小于100 0~99 加一就是0~100printf("%d",com_guess);int you_guess = 0;while (1){scanf("%d", &you_guess);if (you_guess > com_guess){printf("猜大了");}else if (you_guess < com_guess){printf("猜小了");}else if (you_guess == com_guess){system("cls");printf("猜对了\n");break;}}
}int main()
{int sel = 0;do{printf("* * * * * * * * * * * * * * * *\n");printf(" * * * * * 1.开始游戏 * * * * *\n");printf(" * * * * * 2.退出游戏 * * * * *\n");printf("* * * * * * * * * * * * * * * *\n");printf("是否开始游戏->");scanf("%d", &sel);switch (sel){case 1:num();break;case 2:printf("退出");break;default:system("cls");printf("只能输入1或2,请重新输入\n");break;}} while (sel!=2);return 0;}
----强制类型转换
(int) a
三个整数从大到小输出*
输入 5 6 3
输出 6 5 3
int main()
{int a = 0;int b = 0;int c = 0;scanf("%d %d %d", &a, &b, &c);if (a<b){int tmp = 0;tmp = a;a = b;b = tmp;}if (a < c){int tmp1 = 0;tmp1 = a;a = c;c = tmp1;}if (b < c){int tmp2 = 0;tmp2 = b;b = c;c = tmp2;}printf("%d %d %d", a, b, c);return 0;
}
注意这几个if是并列关系
两个数的最大公约数
int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);int min = 0;if (a>b){min = b;}else{min = a;}while (1){if (a % min == 0 && b%min==0 )// ||是或 &&才是且{printf("最小公约数%d",min );break;}min--;}return 0;
}
----辗转相除法
24 18
24%18=6(取余)
18%6=0(直到余数为0,除数就是最大公因数)
int main()
{int m = 0;int n = 0;int t = 0;scanf("%d %d", &m, &n);while (m % n != 0){t = m % n;m = n;n = t;}printf("最大公因数是%d", n);return 0;
}
打印1000到2000的闰年
能被4整除 不能被100整除
能被400整除 是闰年
int main()
{int year = 0;for (year = 1000; year <= 2000; year++){if (year%4==0&&year%100!=0){printf("%d是闰年\n", year);}if (year % 400 == 0){printf("%d是闰年\n", year);}}return 0;
}
打印素数100~200
质数=素数 只能被1和其本身整除的数
int main()
{int a = 0;for (a = 100; a <= 200; a++){int i = 0;for (i = 2; i < a; i++){if (a % i == 0){break;}}if (i == a){printf("%d是素数\n", a);}}return 0;
}
----sqrt()计算根
#include <math.h>
如果 a=m*n
那么m和n之间一定有一个<= a开根号
即: 在2~根号m之间,没有a的因数 就说明a没有2~a-1的因数
所以只用计算2~根号m之间的(优化代码)
#include <math.h>
int main()
{int a = 0;for (a = 100; a <= 200; a++){int i = 0;int flag = 1;for (i = 2; i <= sqrt(a); i++){if (a % i == 0){flag = 0;break;}}if (flag==1){printf("%d是素数\n", a);}}return 0;
}
goto语句
理论上没有goto语句也可以写出代码
相当于传送
int main()
{
aaa:printf("11111\n");printf("22222\n");goto aaa;//传送到aaa哪里}
只要运行起来,电脑就会在1分钟内关机,如果输入:我是猪,就取消关机
跳出多重循环方便
goto只能在一个函数范围内,不能跨函数
dos(cmd)
shutdown -s -t 60 60秒后关机
shutdown -a 取消关机
#include <string.h>
#include <stdlib.h>int main()
{char arr[20] = { 0 };printf("输入我是猪,否则电脑100秒关机->");system("shutdown -s -t 100");
flag: scanf("%s", arr);if (strcmp("我是猪", arr) == 0){system("shutdown -a");}else{printf("请重新输入->");goto flag;}return 0;
}
----可发行
debug改为release
多了个release
里面的是可发行版本(可发到别人的电脑上执行)
c语言鹏哥学习笔记(分支与循环)相关推荐
- C语言鹏哥学习笔记(初识)
目录 初识 创建 文件 第一个程序 ----printf % ----sizeof() 单位 数据类型 浮点型float 变量.常量 变量的定义 局部变量.全局变量 ----scanf()输入函数 - ...
- 《Go语言圣经》学习笔记 第九章 基于共享变量的并发
<Go语言圣经>学习笔记 第九章 基于共享变量的并发 目录 竞争条件 sync.Mutex互斥锁 syn.RWMutex读写锁 内存同步 syn.Once初始化 竞争条件检测 示例:并发的 ...
- 《Go语言圣经》学习笔记 第七章 接口
<Go语言圣经>学习笔记 第七章 接口 目录 接口是合约 接口类型 实现接口的条件 flag.Value接口 接口值 sort.Interface接口 http.Handle接口 erro ...
- 语言 提取列名_学习健明老师发布的R语言练习题的学习笔记(二)
学习者:骆栢维 题目来源:生信基石之R语言 中级10 个题目:http://www.bio-info-trainee.com/3750.html 备注:本文为笔者学习健明老师GitHub答案代码的学习 ...
- 《Go语言圣经》学习笔记 第十一章 测试
<Go语言圣经>学习笔记 第十一章 测试 目录 go test 测试函数 测试覆盖率 基准测试 剖析 示例函数 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. Go语 ...
- 《Go语言圣经》学习笔记 第十章 包和工具
<Go语言圣经>学习笔记 第十章 包和工具 目录 包简介 导入路径 包声明 导入声明 包的匿名导入 包和命名 工具 注:学习<Go语言圣经>笔记,PDF点击下载,建议看书. G ...
- 《Go语言圣经》学习笔记 第八章 Groroutines和Channels
<Go语言圣经>学习笔记 第八章 Groroutines和Channels 目录 Goroutines 实例:并发的Clock服务 实例:并发的Echo服务 Channels 并发的循环 ...
- 《Go语言圣经》学习笔记 第六章 方法
<Go语言圣经>学习笔记 第六章 方法 目录 方法声明 基于指针对象的方法 通过嵌入结构体来扩展类型 方法值和方法表达式 示例:Bit数组 封装 注:学习<Go语言圣经>笔记, ...
- 《Go语言圣经》学习笔记 第五章函数
<Go语言圣经>学习笔记 第五章 函数 目录 函数声明 递归 多返回值 匿名函数 可变参数 Deferred函数 Panic异常 Recover捕获异常 注:学习<Go语言圣经> ...
最新文章
- 清华「暗黑破坏神」夺超算世界冠军,暨南大学首次参赛就跻身前三 | ISC21
- python3 词法拆分
- Java基础day16
- 思科拓扑结构探测及VLAN设计
- Java中不一致的操作会扩大规则
- ARM MOV和 LDR指令关系
- 深度学习 autoencoder_笔记:李淼博士-基于模仿学习的机器人抓取与操控
- 4G换5G关口,智能手机如何抢回“失去的一个月”
- xp访问服务器显示没有权限,xp无法访问2008R2共享
- 防窥屏的膜能真的防止别人偷看吗,其原理是什么?
- java none怎么用tomcat_在docker中部署tomcat并且部署java应用程序的步骤详解
- python怎么读取excel-Python|读、写Excel文件(三种模块三种方式)
- 1.1 Storm集群安装部署步骤
- 程序员必备的八大排序算法
- 安装tensorflow踩的那些坑
- 分糖果系列一(DP+暴力)
- 如何清除DNS污染?
- 【Practical】蒙特卡罗法及其应用
- OpenStack 裸金属
- 容灾技术及建设经验介绍
热门文章
- 酱牛肉的制作方法:三种
- MUD游戏设计(游戏设计丛书)
- 【AMBA学习】用VIP如何发送紧密连续的AMBA transaction
- PAT——乙级 1018锤子剪刀布
- java微信公众平台接口封装源码_微信公众号对接第三方平台(全网发布 java)源码 含 jar...
- 拓视角丨拓宽市场边界,数字化智能化转型构建产业新格局
- 小米Note2解BL锁教程申请BootLoader解锁教程
- blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource
- 想做好一个程序猿 先建好身 瘦人同样可以练出肌肉
- 做网络营销的心态与步骤