郝斌C语言 流程控制
文章目录
- 流程控制 【学习C语言的第一个重点】
- 1、什么是流程控制
- 2、流程控制的分类
- 顺序
- 选择 图灵证明了程序都可以用三种流程实现
- 定义
- 分类
- if
- 1. if最简单的用法
- 2. if的范围问题
- 3. if..else...的用法
- 4. if..else if ...else ..的用法
- 5. C语言对真假的处理
- 6. if举例--求分数的等级
- 7. if的常见问题解析
- switch
- 循环
- 定义:
- 分类
- for ☆
- while
- do...while
- break和continue
- 另:如何看懂并掌握一个程序
- 强制类型转换
- 浮点数的存储所带来的问题
- 进制
- 运算符补充
流程控制 【学习C语言的第一个重点】
1、什么是流程控制
程序代码执行的顺序
2、流程控制的分类
顺序
选择 图灵证明了程序都可以用三种流程实现
定义
某些代码可能执行,有可能不执行,有选择的执行某些代码
分类
if
1. if最简单的用法
格式:
if(表达式)
语句
功能:
如果表达式为真,执行语句
如果表达式为假,语句不执行
// if最简单的用法_1
include<stdio.h>
int main(void)
{if (3 > 2) printf("AAA\n");return 0;
}// if最简单用法_2
include<stdio.h>
int main(void)
{if (3 > 2) printf("AAA\n"); // 会输出if (0)printf("BBBB\n"); // 不出输出if (0 == 0)printf("CCCC\n"); // 会输出 return 0;
}
2. if的范围问题
1.
if (表达式)
语句A;
语句B;
解释:if默认只能控制语句A的执行或不执行
if无法控制语句B的执行或不执行
或者讲:语句B一定会执行
2.
if (表达式)
{
语句A;
语句B;
}
此时if可以控制语句A和语句B
由此可见:if默认只能控制一个语句的执行或不执行
如果想控制多个语句的执行或不执行
就必须把这些语句用{}括起来
// if的范围问题_1
include<stdio.h>
int main(void)
{if (3 > 2) printf("AAA\n"); // A、B均输出printf("BBB\n");if (1 > 2) printf("AAA\n"); // A不输出,B输出printf("BBB\n");return 0;
/*在Vc++6.0中的输出结果是: ---------------------------BBBB---------------------------总结: if默认的只能控制一个语句的执行或不执行
*/
}// if的范围问题_2
include<stdio.h>
int main(void)
{if (1 > 2) {printf("AAA\n"); // A不输出,B输出printf("BBB\n");} printf("CCC\n");return 0;/*在Vc++6.0中的输出结果是: ---------------------------CCC---------------------------*/
}
3. if…else…的用法
// if..else...的用法_1
include<stdio.h>
int main(void)
{int i, j;scanf("%d %d", &i, &j);if (i > j)printf("i大于j\n");else printf("i小于j\n") return 0;
}// if..else...的用法_2
include<stdio.h>
int main(void)
{if (3 > 2)printf("AAAA\n");elseprintf("BBBB\n");printf("CCCC\n"); return 0;
/*在Vc++6.0中的输出结果是: ---------------------------AAAACCCC---------------------------*/
}
4. if…else if …else …的用法
格式:
if (1)
A;
else if (2)
B;
else if (3)
C;
else
D;
// if..else if ...else ..的用法
/*2020/03/22 22:39 一定要明白该程序为何会出错
*/
include<stdio.h>
int main(void)
{double delta = -1;if (delta > 0)printf("有两个解!\n");printf("哈哈!\n");else if (delta == 0)printf("有一个唯一解\n"); else printf("无解!\n"); return 0;
}
5. C语言对真假的处理
非零是真
零就是假
真用1表示
假用0表示
6. if举例–求分数的等级
// 互换两个数字 解决办法:使用临时变量
include<stdio.h>
int main(void)
{int i = 3;int j = 4;int t; // 定义临时变量// 8和9行代码无法完成i和j的互换
// i = j; //8行 i = 5; j = 5;
// j = i; //9行 i = 5; j = 5;//正确的互换i和j的方法t = i;i = j;j = t;printf("i = %d, j = %d\n", i, j);return 0;
}// 求三个数字中的最大值
#include<stdio.h>
int main(void)
{int a, b, c; // 等价于: int a; int b; int c;int t;printf("请输入三个整数(中间以空格分隔):");scanf("%d %d %d", &a, &b, &c);// 编写代码完成a是最大值 b是中间值 c是最小值if (a < b){t = a;a = b;b = t;}if (a < c){t = a;a = c;c = t;}if (b < c){t = b;b = c;c = t;}printf("%d %d %d\n", a, b, c);return 0;/*
在Vc++6.0中的输出结果是:
-----------------------
请输入三个整数(中间以空格分隔):1 2 3
3 2 1
-----------------------
*/
}
//冒泡排序: 第一个和第二个比较,第一个和第三个比较,以此向后比较
// 然后第二个和第三个比较,以此类推
7. if的常见问题解析
空语句的问题
if (3 > 2);
等价于
if (3 > 2)
; // 这是一个空语句if (表达式1)
A;
else
B;
是正确的
if (表达式1);
A;
else
B;
是错误的
if (表达式1)
A;
else if (表达式2)
B;
else if (表达式3)
C;
else
D;
即便表达式1和2都满足,也只会执行A语句if (表达式1)
A;
else if (表达式2)
B;
else if (表达式3)
C;
else (表达式4);
D;
这样写语法不会出错,但逻辑上是错误的
// if的常见错误解析_1
include<stdio.h>
int main(void)
{if (3 > 2)printf("AAAA\n");prinf("BBBB\n");return 0;
}// if常见错误解析_2
include<stdio.h>
int main(void)
{if (3 > 2); // 5行 如果这里加分号,则会导致第六行编译出错printf("哈哈!\n");else printf("嘿嘿!\n"); return 0;
}
switch
电梯程序 ☆
1,2,3,default 是程序的入口 从入口进入之后 它会把之后的程序都执行一遍都执行一遍
循环
定义:
某些代码会被重复执行
分类
for ☆
1.格式
for (1; 2; 3)
语句A
2.执行的流程【重点】
单个for循环的使用
多个for循环的嵌套使用
for(1;2;3)
for(4;5;6)
A;
B;
3.范围问题
4.举例:1+2+3+……+100
1+1/2+1/3+……+1/100
/*
1+1/2+1/3+……+1/100
*/
#include<stdio.h>
int main(void)
{int i;float sum = 0.0;for(i=1;i<=100;i++) {sum = sum + 1/(float)i; //强制类型转换}printf("sum = %f\n" ,sum);return 0;
}
/*
在VS2010中的输出结果是:
-----------------------
sum = 5.187378
-----------------------
*/
// 为什么需要循环的例子_1/*1+2+3+4+...+100的和
*/
include<stdio.h>
int main(void)
{int i;int sum = 0;
/* for (i = 1; i <= 100; ++i)sum = sum + i;*/ while (i < 101){sum = sum + i;++i;}printf("sum = %d\n", sum);return 0;
}
// for循环举例_1
/*求1~100之间的奇数和
*/
include<stdio.h>
int main(void)
{int i;int sum = 0;for (i=1; i<100; i+=2) // i+=2; 等价于 i = i + 2;{sum = sum + i;}printf("sum = %d\n",sum);return 0;
}
// for和if的嵌套使用
/*求1~100之间能被3整除的数字之和
*/#include<stdio.h>
int main(void)
{int i;int sum = 0;for (i=3; i<=100; ++i) //在这里如果改为(i=3;i<=100;i+3) // 我觉得会在一定程度上提升性能 added by 2020/4/21{if (i%3 == 0) //如果i能被3整除sum = sum + i;}printf("sum = %d\n",sum);return 0;
}
while
执行顺序
格式:
while(表达式)
语句;与for的相互比较
for和while可以相互转换 但for的逻辑性更强,更不容易出错
for(1; 2; 3)
A;
等价于
1;
while(2)
{
A;
3;
}举例
从键盘输入一个数字,如果该数字是回文数,
则返回yes,否则返回no
回文数: 正着写和倒着写都一样
比如: 121 12321 都是回文数
/* 判断回文数
*/
#include<stdio.h>
int main(void)
{int val; // 存放判断的数据int m;int sum = 0;printf("请输入您需要判断的数字:");scanf("%d", &val);m = val;while(m){sum = sum * 10 + m%10;m /= 10;}if (sum == val)printf("Yes!\n");elseprintf("NO!\n"); return 0;
}
/*斐波拉契序列1 2 3 5 8 13 21 34
*/
#include<stdio.h>
int main(void)
{int n;int f1, f2, f3;f1 = 1;f2 = 2;printf("请输入您需要求的项的序列:");scanf("%d", &n);if (1 == n){f3 = 1;}else if (2 == n){f3 = 2;}else{for (i=3; i<=n; ++i){f3 = f1 + f2;f1 = f2;f2 = f3;}printf("%d", f3);}return 0;
}
- 什么时候使用while,什么时候使用for
没法说,用多了自然而然就知道了
do…while
格式:
do
{
……
}while(表达式);
do…while并不等价于for,当然也不等价于while
主要用于人机交互
/*一元二次方程
*/
#include<stdio.h>
int main(void)
{double a, b, c;double delta;double x1, x2;char ch;printf("请输入一元二次方程的三个系数:\n");printf("a = ");scanf("%lf", &a);printf("b = ");scanf("%lf", &b);printf("c = ");scanf("%lf", &c);detla = b*b - 4*a*c;do{ if(delta > 0){x1 = (-b + sqrt(delta))/ (2*a);x2 = (-b - sqrt(delta))/ (2*a);printf("有两个解,x1 = %lf, x2 = %lf\n",x1, x2);}else if(0 == delta){x1 = x2 = (-b) / (2*a);printf("有唯一解,x1 = x2 = %lf\n",x1, x2);}else{printf("无实数解");}printf("您想继续么(Y/N):");scanf("%c",&ch);} while('y' == ch || 'Y' == ch); return 0;
}
break和continue
break
break如果用于循环是用来终止循环
break如果用于switch,则是用于终止switch
break不能直接用于if,除非if属于循环内存的一个子句
//break用于单个for循环
//break用于多个for循环
continue
用于跳过本次循环余下的语句,转去判断是否需要执行下次循环
模板:
include<stdio.h>
int main(void)
{return 0;
}
另:如何看懂并掌握一个程序
小算法的程序:
判断一个数字是否是素数
素数(质数)除了1和它本身的数 另:1不是质数
判断一个数字是否是回文数
回文数(正着写和倒着写一样)
编程实现求一个十进制数字的二进制形式
求一个数字的每位是奇数的数字取出来组合形成的新数字
eg:1112345667 显示:111357
求一个数字倒过来的数字
如何看懂一个程序,分三步:
1. 流程
2. 每个语句的功能
3. 试数
如何学习一些小算法的程序:
尝试自己去编程解决它,大部分人都无法自己解决
如果解决不了,就看答案
关键是把答案看懂,这个要花很大的精力,也是我们学习的重点
看懂之后尝试自己去修改程序,并且知道修改之后程序的不同输出结果的含义
照着答案去敲
调试错误
不看答案,自己独立把答案敲出来
如果程序实在无法彻底理解,就把它背会
强制类型转换
格式:
(数据类型)(表达式)
功能:
把表达式的值强制转化为前面所执行的数据类型
例子:
(int)(4.5+2.2) 最终值是 6
(float)(5) 最终值是 5.000000
浮点数的存储所带来的问题
float和double都不能保证可以精确的存储一个小数
举例:
有一个浮点型变量x,如何判断x的值是否是零
if(|x-0.000001| <= 0.000001)
是
else
不是
为什么循环中更新的变量不能定义成浮点型
浮点型非准确存储
/*
时间: 2020/04/24 20:54
内容:本程序错误,因为循环中更新的变量不能定义成浮点型
*/
#include<stdio.h>
int main(void)
{float i;float sum = 0.0;for(i=1.0;i<=100;i++) {sum = sum + 1/i;}printf("sum = %d\n" ,sum);return 0;
}
进制
什么叫n进制
逢n进一把r进制转成十进制
十进制转成r进制
不同进制所代表的的数值之间的关系
十进制的 3981 转化化成 十六进制是 F8D
十进制的3981和十六进制的F8D所代表的本质上是同一个数字
运算符补充
- 自增自减
分类:
前自增 – ++i
后自增 – i++
前自增和后自增的异同:
相同:
最终都使i的值加1
不同:
前自增整体表达式的值是i加1后的值
后自增整体表达式的值是i加1前的值
为什么会出现自增:
代码更精炼
自增的速度更快 i++直接存在寄存器中
学习自增要明白的几个问题:
我们编程时应该尽量屏蔽掉前自增和后自增的差别
自增表达式最好不要作为一个更大的表达式的一部分来使用
或者说
i++ 和 ++i 单独成一个语句,不要把它作为一个完整复合语句的一部分来使用
如:
int m = i++ ++i + i + i++; //这样写不但是不规范的代码,而且是不可移植的代码
三目运算符
A ?B : C
等价于
if(A)
B;
else
C;
逗号表达式
格式:
(A,B,C,D)
功能:
从左到右执行
最终表达式的值是最后一项的值
郝斌C语言 流程控制相关推荐
- R语言入门4---R语言流程控制
流程控制语句在任何语言中都是非常重要的,通过流程控制语句编程者能够根据业务逻辑在程序中设计合理的循环.分支,实现程序各种各样强大的功能.一般实现任一算法的控制结构都可以分为顺序结构.分支结构.循环 ...
- c语言循环次数控制,3 C语言 流程控制 循环 跳转
3 C语言 流程控制 循环 跳转 选择: if switch 循环 while,do while ,for ,嵌套 跳转 break goto continue 第3章流程控制 学习目标 u掌握选 ...
- 郝斌c语言大纲百度云,C语言学习大纲 郝斌(讲解)
教你如何快速掌握C语言,郝斌讲解,幽默而且加深了解.... 语言概述: 1.为什么学习C语言 1). C的起源和发展 2).C的特点 优点 代码量小 速度快 功能强大 缺点 危险性高 开发周期长 可移 ...
- 易语言流程控制程序暂停开始继续
易语言并没有直接对流程控制的命令,我们可以采用逻辑变量,时钟的时钟周期是否为0来进行流程的 控制. 一.使用变量控制程序的暂停和继续 .版本 2.程序集 窗口程序集_启动窗口 .程序集变量 是否暂停, ...
- <郝斌C语言自学教程>
文章目录 P1 我对自学的一些看法 P2 我为什么要出视频 P3 本讲内容概述 p4 HelloWorld程序举例 p5 C语言的起源与发展 p6 C的特点 p7 C的应用领域 p8 C的重要性 p9 ...
- 2.郝斌C语言课程大纲
共分23讲 C语言简介 1讲 第一讲 ...
- 511遇见易语言流程控制返回和结束和销毁
返回()是易语言中常用的命令,但对返回值的类型控制我们有时候并不是很清楚,教程用了四个例子讲解了返回,二结束和销毁更是容易混淆的两个命令,视频分别做了演示. 511遇见易语言教程 一.官方源码 返回 ...
- 江哥带你玩转C语言 | 07 - C语言流程控制
流程控制基本概念 默认情况下程序运行后,系统会按书写顺序从上至下依次执行程序中的每一行代码.但是这并不能满足我们所有的开发需求, 为了方便我们控制程序的运行流程,C语言提供3种流程控制结构,不同的流程 ...
- 511遇见易语言流程控制计次循环首
计次循环首子易语言循环命令中是使用非常频繁的一个命令,视频教程罗列了多个历程说明示范了该命令的使用技巧. 511遇见易语言教程 一.官方文档 调用格式: 〈无返回值〉 计次循环首 (整数型 循环次数, ...
- 511遇见易语言流程控制(循环判断首和判断循环首)
循环判断首和判断循环首无论从字眼上和使用上都比较容易混淆,所以把这两个命令放在一起讲解,通过举例来学习的它们的区别和联系,以及使用技巧. 511遇见易语言教程 一.官方源码 判断循环首 (逻辑型 条件 ...
最新文章
- R构建指数回归模型(Exponential Regression)
- CentOS7安装Nginx及其相关
- Python基础知识4: while循环基本使用
- UVa1368 - DNA Consensus String
- 状压DP【洛谷P1896】 [SCOI2005]互不侵犯
- C语言 · 字符串输入输出函数
- Spring IOC的三种主要注入方式?
- 服务器内存 知乎_巨炮快评! 篇六:16核32线程384GB内存!双路Intel至强数据服务器拆解...
- 分体式水晶头_超6类双屏蔽网线水晶头制作简易教程
- 超全面UI基础设计规范
- [LOJ#6198]谢特[后缀数组+trie+并查集]
- 哪个学校计算机考研945,2018年郑州大学945软件工程专业基础综合考研复习资料...
- Kafka消费者订阅方式
- php 图片印章_在线生成实用又方便 (图片印章)
- 【jQuery】- form 表单 reset()方法不生效解决
- android手机系统对比,国产手机系统哪家强?几大主流手机系统盘点对比
- 云服务器面临的问题_无服务器安全面临的多方面威胁以及我们应如何应对
- 对IBL的specular部分的思考
- 【数据分析】python基础必修3—条件语句/运算符/真假值/循环/算法练习
- 如何删除 顽固文件/文件夹