零基础学C语言(3):判断与循环
根据比较的结果,决定做、还是不做某些动作,就要用到if语句。
if语句简言之:如果"( )"内的条件成立True,执行“{}”之间的语句,否则就跳过。
if ( 条件成立 ){
...
}
计算时间差
第二章中计算时间差,如1点40分和2点10分,如果还是采用小时和分钟分别减的方法,分钟会出现借位,分钟(im)会出现负数,这时候做一个调整,小时数-1,分钟数+60。
# include <stdio.h>
int main()
{
int hour1, minute1;
int hour2, minute2;
scanf("%d %d",&hour1,&minute1);
scanf("%d %d",&hour2,&minute2);
int ih = hour2 - hour1;
int im = minute2 - minute1;
if ( im <0 ){
im =60 + im;
ih --;
}
printf("时间差是%d小时%d分。",ih,im) ;
return 0;
}
关系运算
关系运算的结果:
当两个值的关系符合关系运算符的预期时,关系运算的结果为1(True),否则为0(False)。
# include <stdio.h>
int main()
{
printf("%d\n",5==3); # 结果是0
printf("%d\n",5>3); # 结果是1
printf("%d\n",5<=3); # 结果是0
return 0;
}
关系运算的优先级:
所有的关系运算符的优先级比算术运算的低,但是比赋值运算的高.
7 >= 3+4
结果是1int r = a>0;
判断是否相等的==
和!=
的优先级比其他的低,而连续的关系运算是从左到右进行的
5 > 3 == 6 > 4 #结果是1 == 1 即1
6 > 5 >4 #结果是1 > 4 即0
a == b == 6 #先看a和6是否相等,相等出1,不相等出0,是否与6相等,均为0
a == b > 0
找零计算器
- 找零计算器需要用户做两个操作:输入购买的金额,输入支付的票面,而找零计算器则根据用户的输入做出相应的动作:计算并打印找零,或告知用户余额不足以购买。
- 从计算机程序的角度看,这就是意味着程序需要读用户的两个输入,然后进行一些计算和判断,最后输出结果。
以两个斜杠“//”开头的语句(注释)把程序分成了三个部分:
- 初始化
- 读入金额和票面
- 加入if语句判断票面够不够,计算并打印找零
#include <stdio.h>
int main()
{
// 初始化
int price = 0;
int bill = 0;
// 读入金额和票面
printf("请输入金额:");
scanf("%d", &price);
printf("请输入票面:");
scanf("%d", &bill);
// 计算找零
if ( bill >= price ) {
printf("应该找您:%d\n", bill - price);
}
return 0;
}
延续数行的注释,要用多行注释的格式来写。多行注释由一对字符序列“/”开始,而以“/”结束。
也可以用于一行内的注释int ak=47 /*36*/,y=9;
#include <stdio.h>
int main()
{
const int MINOR = 35;
int age = 0;
printf("请输入你的年龄: ");
scanf("%d", &age);
printf("你的年龄是%d岁。\n", age);
if ( age < MINOR ) {
printf("年轻是美好的,");
}
printf("年龄决定了你的精神世界,好好珍惜吧。\n");
return 0;
}
if语句里面条件不符合时做什么,要用else语句,即否则的话。
#include <stdio.h>
int main()
{
// 初始化
int price = 0;
int bill = 0;
// 读入金额和票面
printf("请输入金额:");
scanf("%d", &price);
printf("请输入票面:");
scanf("%d", &bill);
// 计算找零
if ( bill >= price ) {
printf("应该找您:%d\n", bill - price);
} else {
printf("你的钱不够\n");
}
return 0;
}
比较数的大小
两个数中的最大值
#include <stdio.h>
int main()
{
int a,b;
printf("请输入两个整数:");
scanf("%d %d", &a, &b);
int max = 0;
if ( a > b ) {
max = a;
} else{ max = b;
}
printf("大的那个是%d\n", max);
return 0;
}
左边的方案足够傻,所有人都能看懂;右边的代码一开始就使max=b,更巧妙,但更难读懂。
三个数中的最大值
用到了嵌套的if-else语句,而且if语句里面如果"{}"内只有一句话的时候,是可以省略大括号的。
#include <stdio.h>
int main()
{
int a,b,c;
printf("请输入三个整数:");
scanf("%d %d %d", &a, &b, &c);
int max = 0;
if ( a>b ) {
if ( a>c ) {
max = a;
} else {
max = c;
}
} else {
if ( b>c ) {
max = b;
} else {
max = c;
}
}
printf("The max is %d\n", max);
return 0;
}
计算薪水
#include <stdio.h>
int main()
{
const double RATE = 8.25;
const int STANDARD = 40;
double pay = 0.0;
int hours;
printf("请输入工作的小时数: ");
scanf("%d", &hours);
printf("\n");
if (hours > STANDARD)
pay = STANDARD * RATE +
(hours-STANDARD) * (RATE * 1.5);
else
pay = hours * RATE;
printf("应付工资: %f\n", pay);
return 0;
}
判断成绩
#include <stdio.h>
int main()
{
const int PASS=60;
int score;
printf("请输入成绩: ");
scanf("%d", &score);
printf("你输入的成绩是%d.\n", score);
if ( score < PASS )
printf("很遗憾,这个成绩没有及格。");
else {
printf("祝贺你,这个成绩及格了。");
printf("再见\n");
}
return 0;
}
循环
if语句可以判断条件是否满足,满足时才做相应的动作,而循环语句可以在满足条件时,不断地重复执行一些动作。
重复执行的语句(循环语句)可以多次执行其他语句,它检查一个逻辑条件是否满足,只在满足的时候执行它的循环体。
while语句是一个循环语句,它会首先判断一个条件是否满足,如果条件满足,则执行后面紧跟着的语句或语句括号,然后再次判断条件是否满足,如果条件满足则再次执行,直到条件不满足为止。后面紧跟的语句或语句括号,就是循环体。
do-while循环和while循环很像,唯一的区别是我们在循环体执行结束的时候才来判断条件。也就是说,无论如何,循环都会执行至少一遍,然后再来判断条件。与while循环相同的是,条件满足时执行循环,条件不满足时结束循环。
数数几位数
程序要读入一个4位以下(含4位))的正整数,然后输出这个整数的位数。如:输入:352,输出:3
计算机判断的方式:判断数的范围来决定它的位数:352∈[100,999]—>3位
计算机描述的是步骤,不是关系,要一步一步地做,一步不成立再下一步,所以最好不要用多个if。
#include <stdio.h>
int main()
{
int x;
int n=1;
scanf("%d",&x);
if ( x > 999){
n=4;
}else if ( x >99 ){
n=3;
}else if ( x > 9 ){
n=2;
}else {
n=1;
}
printf("这个数是%d位数",n);
return 0;
}
12
这个数是2位数
任意范围的正整数怎么办?
先看一道三位数逆序的题.
三位数逆序的题
从左往右 352%100 --> 52,相当于把左边那位划掉。
从右往左 352/10 -->35 ,相当于把右边那位划掉。
那如果一直去掉最左边的数,不停地划,直到没数可划时…在这个过程中就可以计数了
#include <stdio.h>
int main()
{
int x;
int n=0;
scanf("%d",&x);
n++;
x /=10;
while (x>0){
n++;
x /=10;
}
printf("这个数是%d位数",n);
return 0;
}
198627987
这个数是9位数
#if语句,执行一次
if (x>0){
n++;
x /=10;
}
#while语句,当条件满足时,不断地重复循环体内的语句
while (x>0){
n++;
x /=10;
}
从语法角度来看,if和while非常相似,但while后面还有花头。while"{}“里头的内容叫循环体。”()"内的条件判断满足时,就一直做循环体。而且循环体内要有改变条件的机会(这里是x /=10),否则就会一直循环。
验证:测试程序常使用边界数据,如有效范围两端的数据、特殊的倍数等
如:个位数 ; 10 ; 0 ; 负数。
#include <stdio.h>
int main()
{
int x;
int n=0;
scanf("%d",&x);
#验证去掉中间两行代码是否还正确?
while (x>0){
n++;
x /=10;
}
printf("这个数是%d位数",n);
return 0;
}
这种情况下x=0,n=0,没法处理,按理x=0是1位数,所以最开始的写法是对的。如果是负数,取正判断即可。
数位数的算法:
1.用户输入x;
2.初始化n为0;
3.x= x/ l0,去掉个位;
4. n ++;
5.如果x>0,回到3;
6.否则n就是结果。
do-while 循环语句
在进入循环的时候不做检查,而是在执行完一轮循环体的代码之后,再来检查循环的条件是否满足,如果满足则继续下一轮循环,不满足则结束循环。
do
{
<循环体语句>
} while(<循环条件>) ;
do-while循环和while循环很像,区别是在循环体执行结束的时候才来判断条件。也就是说,无论如何,循环都会执行至少二遍,然后再来判断条件。与while循环相同的是,条件满足时执行循环,条件不满足时结束循环。
下图中左:do while; 右: while
#include <stdio.h>
int main()
{
int x;
scanf("%d",&x);
int n=0;
do
{
n++;
x /=10;
}
while (x>0);
printf("这个数是%d位数",n);
return 0;
}
这种情况0也成功判断成为1位数。
For循环
阶乘
写一个程序,让用户输入n,然后计算输出n!n! =1×2×3×4×...×n
先思考变量:显然读用户的输入需要一个int的n,然后计算的结果需要用一个变量保存,可以是int的factor,在计算中需要有一个变量不断地从1递增到n,那可以是int的i。
尝试使用while循环
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
int fact=1;
int i = 1;
while ( i <= n){
fact *= i;
i++;
}
printf("%d!=%d\n",n,fact);
return 0;
}
5
5!=120
for语句
for语句的“()”中的内容,比while语句更复杂:
for(初始条件,循环继续的条件,循环每一轮要做的事情)
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
int fact=1;
int i = 1;
for( i =1; i<=n; i++){
fact *= i;
}
printf("%d!=%d\n",n,fact);
return 0;
}
for循环像一个计数循环:设定一个计数器,初始化它,然后在计数器到达某值之前,重复执行循环体,而每执行一轮循环,计数器值以一定步进进行调整,比如加1或者减1
for ( i=0; i<5; i=i+1) {
prinif("%d", i);
}
for = 对于
for ( count=10; count>0; count-- )
就读成:“对于一开始的count=10,当count>0时,重复做循环体,每一轮循环在做完循环体内语句后,使得count–。”
小套路:
做求和的程序时,记录结果的变量应该初始化为0,而做求积的变量时,记录结果的变量应该初始化为1。
循环控制变量i只在循环里被使用了,在循环外面它没有任何用处。因此,我们可以把变量i的定义写到for语句里面去。
看似美妙,但发现报错:for循环初始化的声明只能在C99里用,要给编译器一个特殊的选项。
try:
1×1还是1,所以程序的循环不需要从1开始,那么改成从多少开始合适呢?这样修改之后,程序对所有的n都正确吗?这样的改动有价值吗?——从2开始,第一次不进入循环,可以省去一轮循环。
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
int fact=1;
int i = 1;
for( i =2; i<=n; i++){ #仅改动了i=2
fact *= i;
}
printf("%d!=%d\n",n,fact);
return 0;
}
除了可以从1乘到n来计算n!,还可以从n乘到2来计算吧?试试把循环换个方向来计算n。这时候,还需要循环控制变量i吗?
——这时候不再需要i这个变量了,让n自己减小到2就行,但仍需要i暂时存一下初始n输出结果中i!。
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
int fact=1;
int i =n ;
for (;n>1;n--){ #省略了n=n;
fact *=n;
}
printf("%d!=%d\n",i,fact);
return 0;
}
5
5!=120
for循环的循环次数
for ( i=0; i<n; i++ )
则循环的次数是n,而循环结束以后,i的值是n。循环的控制变量i,是选择从0开始还是从1开始,是判断i<n还是判断i<=n,对循环的次数,循环结束后变量的值都有影响。
#include <stdio.h>
int main()
{
int i;
for (i=1; i<=5; i++){
printf("i=%d ",i);
}
printf("\n最后i=%d\n",i);
return 0;
}
i=1 i=2 i=3 i=4 i=5
最后i=6
任何一个for循环都可以改写成一个while循环。
for (初始动作;条件;每轮的动作){
}
for中的每一个表达式都是可以省略的for(;条件;) == while (条件)
三种循环的选择
- 如果有固定次数,用for
- 如果必须执行一次,用do_while
- 其他情况用while
更多推荐
零基础学浙大翁恺C语言(3):判断与循环
发布评论