思想:程序的核心是算法 算法的核心是流程控制
程序 = 算法 + 数据结构
流程控制---郝斌老师永远的神!!!!
顺序 选择 循环是解决一切问题的流程控制
学完这些之后 对于其他的语言都是一样的
流程控制 ---C语言执行的顺序
所谓流程控制就是对于任何困难的问题
都是有一个个问题简单问题组成的
至于这些小小的问题都可以用简单的流程控制
语句来解决!
解决问题的步骤就是----数据结构中的算法
郝斌曰:在我看来一个程序 分3步 流程--每个语句的功能--取数
流程控制分类
一、顺序
按部就班由上往下执行。。。
二、选择:if和switch
定义:某些语句可能执行,也可能不执行
有选择执行某些语句
分类:if和switch
if:
1.if最简单的用法
if (表达式)
语句;
功能:为真就执行,为假不执行
# include <stdio.h>
int main(void)
{
if (1) // 逻辑值
printf("开心\n"); // 执行
if (0 == 1) // 逻辑值
printf("zyy"); //不执行
if (3 > 2)
printf("开心\n"); // 执行
printf("zyy\n"); //不执行
if (3 > 2)
{
printf("开心\n"); // 执行
printf("zyy\n"); //执行
} //一个大括号也相当一条语句
return 0;
}
/*
开心
开心
zyy
开心
zyy
*/
2. if的范围问题
if(表达式)
语句A;
语句B;
解释:只能执行一个语句,想执行多个语句可以采用{}
里面可以包含多个语句;
3. if...else...的用法:要么为真,要么为假反正都要执行一条语句
简而言之 “非真既假”
语法格式:
if (表达式)
语句1;
else
语句2
注意:else后面不加小括号!!!
# include <stdio.h>
/*
if...else...用法
*/
int main()
{
int i, j; //定义两个变量
printf("请输入两个数\n");// 用于提示用户输入
scanf("%d %d",&i,&j); //用于接收用户输入
if(i > j) //只能控制一条语句
printf("i大于j\n");
else //只能控制一条语句
printf("i小于j\n");
return 0;
}
4.if...else if...else...的用法:可用于多条判断语句
当且仅当else前面都不成立才会执行else后面的语句
语法格式:
if (表达式1)
语句1;
else if (表达式2)
语句2;
else if (表达式3)
语句3;
...
else
语句4;
注意: else后面不加小括号!!!其余都加小括号
- 理解:就是当if else-if判断都不成立时才会执行else语句,
- 无论else-if判断有多少个只要存在一个else if成立其余就不用执行了
- 在这个语句中只出现一次if和一次else判断,而else-if可以出现多次
- 且不能以else-if判断开头还有else开头
# include <stdio.h>
# include <math.h> //使用sqrt(delta)函数
/*
2023年6月10日17:31:25
一元二次方程求解
*/
int main(void)
{
//把三个系数保存到计算机中
int a = 1; //=不表示相等,表示赋值
int b = 2;
int c = 1;
float delta; //delta存放的 b*b - 4*a*c
float x1; //存放一元二次方程的其中一个解
float x2; //存放一元二次方程的其中一个解
delta = b*b -4*a*c; //定义变量delta接收达尔塔值
if (delta > 0) //
{
x1 = (-b + sqrt(delta)) / (2*a);
x2 = (-b - sqrt(delta)) / (2*a);
printf("该一元二次方程有两个解, x1 = %f, x2 = %f\n",x1,x2);
}
else if (delta == 0)
{
x1 = (-b) / (2*a);
x2 = x1; //右边赋值给左边
printf("该一元二次方程有两个一样的解: x1 = %f, x2 = %f\n", x1, x2);
}
else
{
printf("无解\n");
}
return 0;
}
# include <stdio.h>
/*
2023年6月11日22:00:03
多层for循环 循环输出9*9乘法表
*/
int main()
{
//定义变量
int i;
int j;
//算法
for (i=1; i<10; i++)
{
for (j=1; j<10; j++)
printf("%d*%d = %2d\t",i, j,i*j);
printf("\n");
}
//输出
return 0;
}
# include <stdio.h>
/*
if常见错误
*/
int main(void)
{
if (3 > 2) //只会执行第一个语句,因为有一个为真其余就不用执行了
printf("aaa\n");
else if (4 > 5)
printf("bbb\n");
else if (4 > 5)
printf("ccc\n");
else (6 > 5);//
printf("qqq\n");
return 0;
}
5.C语言对真假的处理
非0即真
零就是假
1代表真
0代表假
不为零的数就是1
6.if举例--求分数等级--两个数的互换
# include <stdio.h>
/*
两个数的互换
*/
int main(void)
{
int i = 3;
int j = 5;
int temp ; //中间变量
temp = i; //先把i的值放入t中
i = j; //再把j的值放到i中
j = temp; //最后再把t的值放到中
printf("i = %d, j = %d, temp = %d\n",i,j,temp);
return 0;
}
7.if的常见问题解析
# include <stdio.h>
# include <windows.h>
/*
if应用举例
*/
int main(void)
{
float score; //score分数
while (1)
{
printf("请输入你的分数0-100: ");
printf("");
scanf("%f",&score);
if ((score < 0) || (score > 100))
{
printf("输入范围0-100重新输入\n\n");
continue;
}
else
break;
}
while (1)
{
if (score < 60)
{
printf("不及格\n");
break;
}
else if ((score >= 60) && (score <= 70))
{
printf("及格\n");
break;
}
else if ((score > 70) && (score < 90))
{
printf("良好\n");
break;
}
else
{
printf("优秀\n");
break;
}
}
getchar();
return 0;
}
switch://switch一旦成立,只要没遇到break,就会从上往下一直执行到底
还有case如没有成立话就直接执行default
格式:
switch(整形表达式)
{
case 常量1:
语句1;
case 常量2:
语句2;
....
default:
语句n;
}
注意
# include <stdio.h>
/*
2023年6月12日17:55:00
switch --选择
*/
int main(void)
{
int val;
char ch;
do
{
printf("请输入你想进入的楼层:");
scanf("%d",&val);
switch (val)
{
case 1:
printf("一层即将开门\n");break;
case 2:
printf("二层即将开门\n");break;
case 3:
printf("三层即将开门\n");break;
default:
printf("输入错误!\n");break;
}
printf("是否继续开门(Y/N): ");
scanf(" %c",&ch);
}while (ch=='y' || 'Y'==ch);
return 0;
}
三、循环:for和while和do-while
定义:
某些代码会被重复执行
分类
重点 是for逻辑最清晰
for(初始值-1; 循环条件-2; 自增变量-3 )
循环语句-4;
假设 for(1; 2; 3)
4;
//从右边开始 第一个语句(初始值)只执行一次,语句二用于控制循环的条件,语句三给变量增值主要用于达到预定设置的循环条件用于结束循环
需要注意的是:执行顺序很重要
在循环条件满足时:
执行顺序
第一次 1--2--4--3
第二次 2--4--3
第三次 2--4--3
....
第n次 2不满足循环 结束循环
for循环默认只能控制一个语句 :什么是语句?
一个分号代表一个语句
一个大括号{}相当于一个语句
整个控制属于一个语句如for循环 while循环...
# include <stdio.h>
/*
循环求1-100之内的和
for(初始值-1; 循环条件-2; 自增变量-3 )
循环语句-4;
//从右边开始 第一个语句(初始值)只执行一次,语句二用于控制循环的条件,
语句三给变量增值主要用于达到预定设置的循环条件用于结束循环
需要注意的是:执行顺序很重要
在循环条件满足时:
执行顺序
第一次 1--2--4--3
第二次 2--4--3
第三次 2--4--3
....
第n次 2不满足循环 结束循环
*/
int main(void)
{
int i;
int sum = 0; // 初始化sum,sum不初始化就存放的是一个垃圾值
int count = 1; //执行次数
for(i=1; i<=100; i++) //
{
sum = sum +i;
printf("第%d执行\n sum = %d\n", count, sum);
count++;
}
return 0;
}
# include <stdio.h>
/*
2023年6月11日10:31:19
目的:学习
功能:求任意数字开始到结束能被3整数的数的和
*/
int main(void)
{ //定义变量
int i, j;
int sum = 0;
int count = 0;
//用户提示
printf("请输入起始值和终点值的整数: "); //提示用户输入
scanf("%d %d", &i, &j); //接收用户输入
//算法实现
for (i; i<=j; i++) //循环输出3到12值
{
if (i%3 == 0) //i如果能被3整除
{
sum = sum +i;
count++;
printf("第%d累加的和是: %d\n", count, sum);//打印出被3整除的数和
}
}
//最终结果
printf("----------------------\n");
printf("最终累加总和是 : %d\n", sum);
return 0;
}
# include <stdio.h>
/*
循环举例一
求1 + 1/2 +1/3 + 1/4 +...+1/n
*/
int main(void)
{
//定义变量
int i, j;
float sum = 0;
//用户提示
printf("请输入起点和终点 ");
scanf("%d %d",&i, &j);
//实现算法
for (i; i<=j; i++)
{
sum = sum + 1/(float)i; //强制类型转化
}
//打印结果
printf("sum = %f\n",sum);
return 0;
}
三目运算符 : A?B:C
等价于 if -else语句
A为真执行B
否则执行C
例如:(1>2)?2:3 1>2为假执行3
自增自减 :最终的目的都是让i加1或减1,只不过是先使用加1或减1的值,还是后使用的加1或减1的值顺序 符号在前先使用,符号在后后使用,但是i的值最终都是要加1或减1
++i --i 符号在前:先加1或减1先使用 例如:i=2 ++i的值就为3 最终i的值也为3
i++ i-- 符号在后:先加1或减1后使用 ,此时一定要记住i++ i--还是原先的值 但是i的值一定会变
例如:i = 3 i++的值还是3,但是i的值会加1
逗号表达式 :d = (A, B, C, D, ... N);从左往右执行到最后 最后一个表达式为该语句的值;
例如:d = (1,3,5,6) d的值就为6
while
1.执行顺序
格式:
while(表达式) //里面也是个逻辑值,真就执行,假就不执行
语句1;
# include <stdio.h>
/*
while循环举例1-100的和
*/
int main(void)
{
int i = 1 ;
int j ;
int sum = 0;
int count = 1;
while (i < 101) //只有条件一个表达式
{
sum = sum + i;
i++;
}
printf("sum = %d\n",sum);
return 0;
}
2.与for的相互比较
for和while可以相互转换一样的
for (1; 2; 3)
4;
等价于
1;
while (2)
{
4;
3;
}
for的逻辑性比while更清晰 建议多使用for
3.举例
回文数:倒着写和正着写都一样 123321
#include <stdio.h>
#define true 1 //宏定义不需要加分号,只要用用将所有的true都当做1使用 便于全局设计
#define false 0
/*
2023年6月12日13:12:34
用while循环写一个回文数
*/
//将算法变成一个函数 用的时候直接调用,调用规则直接用--- 函数名(变量)
int hws(int val)//自定义一个函数 返回值是一个int 必须要有返回值
{
int sum = 0; //定义一个初始值为0的变量m ,用于存放val的倒数
int m; //存放val的原始值
//算法实现
m = val; //将用户输入的值保存一份放到m中,对m进行取反操作
while(m)
{ //取反
sum = sum*10 + m%10;
m /= 10;
}
//输出
if(sum == val) //推断倒序后的结果k 和原来输入的数字n 是否相等,相等返回true
return true;
else
return false;
}
int main(void)
{
//定义变量
static int num ;
static int ret ;
//提示用户
printf("请输入一个数:\n");
scanf("%d",&num);
//算法
ret = hws(num); //调用函数实现的将num取反 然后赋返回值赋于ret变量中
//输出
if(1 == ret) //
printf("是回文数\n");
else
printf("不是回文数\n");
return 0 ;
}
常见算法 :记住就行了 m是个有限值 且只对10为底的倍数有效
m/10, m/100, m/1000 ... m/n ... 0 口诀:舍右保左 舍去几个 数取决于右边多少个0
例如:m = 123 那么 m/10 = 12, m/100 = 1, m/1000 = 0
m%10, m%100 ... m%n ... m 口诀 :保右舍左 保留几个数也 是取决于几个0
例如: m = 123 那么 m%10 = 3, m%100 = 23, m%1000 = 123
4.什么时候使用while,什么时候使用for :用的多了感觉就来了
do...while
定义:无论怎么语句一定会执行一次
格式
do
{
语句;
} while(表达式); //一定要有一个分号
作用:主要用于人机交互
do-while和while、for的区别
do-while语句 不等价于while和for
原因很简单 do-while 无论表达式条件成不成立一定会先执行一次,
而while和for有可能一次也不执行,只有for和while一定可以相互转换
do-while 应用举例 “一元二次方程求解”
# include <stdio.h>
# include <math.h> //使用数学公式,引用数学头文件
/*
2023年6月12日14:43:26
“do-while”实现一元二次方程求解
*/
int main (void)
{
//定义变量
double x1, x2 ; //用于保存方程的解
int a, b, c; //一元二次方程的系数
double detal; //存放判根数值
char ch;
do
{
//用户提示
printf("请输入方程的系数\n");
scanf("%d%d%d",&a,&b,&c);
//算法实现
detal = b*b - 4*a*c;
printf("detal = %f\n",detal);
if (detal > 0) //有两个不相等的实数根
{
x1 = (-b + sqrt(detal)) / (2*a);
x2 = (-b - sqrt(detal)) / (2*a);
printf("detal大于0有两个不同的实数根\nx1 = %f,x2 = %f\n",x1 ,x2);
}
else if (detal == 0) //有两个相同的实数根
{
x1 = (-b) / (2*a);
x2 = x1;
printf("detal等于0有两个相同的实数根\nx1 = %f,x2 = %f\n",x1 ,x2);
}
else
printf("detal小于0\t无解!\n" );
printf("你想继续么(Y/N):");
scanf(" %c", &ch); //%c前面必须有一个空格
} while ('y'==ch || 'Y'==ch);
return 0;
}
break和continue
一般而言, 程序进入循环后, 在下一次循环测试之前会执行完循环体中
的所有语句。 continue 和break语句可以根据循环体中的测试结果来忽略一部
分循环内容, 甚至结束循环。
continue://只会在当前循环内结束本次循环
3种循环都可以使用continue语句。 执行到该语句时, 会跳过本次迭代的
剩余部分, 并开始下一轮迭代。 如果continue语句在嵌套循环内, 则只会影
响包含该语句的内层循环。
for(1; 2; 3)
{
A;
B;
continue;//continue执行了会直接执行3,跳过C和D
C;
D;
}
例如:对用户的非法输入进行处理
while((ch=getchar()) != '\n')
continue;
# include <stdio.h>
/*
continue语句;
结束本次循环下面的语句,不会跳出循环
*/
int main(void)
{
int i;
for (i=0; i<3; i++)
{
printf("哈哈!\n");
printf("嘻嘻!\n");
continue; //不会执行下面,会继续执行循环
printf("啦啦!\n");
}
return 0;
}
break://终止本次循环的所有迭代
程序执行到循环中的break语句时, 会终止包含它的循环, 并继续执行
下 一阶段。
1.break如果用于循环用来终止语句
2.break如果用于switch,则用来终止switch
3.break不能直接用于if,除非if属于循环内部的一个子句
强制类型转换格式 :
(要转换的数据类型)i i是被转换数据
例如 :(float)i :含义就是将i的值转换成float类型
除数计算时: 分子/分母
分子 > 分母 时 取整输出
例如:3/2 = 1 舍去小数部分
分子 < 分母 时 输出0 取整输出
例如 1/2 = 0 舍去小数
取余计算: 分子%分母
分子 > 分母 时
计算方法
分子/分母 如果分子是分母的倍数 输出为0
例如 6%3 = 0
否则输出除过之后的余数
例如 4%3 = 1
分子 < 分母 时
直接输出分子 例如 8%9 = 8