判断/判断与循环
第一部分
做判断(if条件语句):写一段计算时间差的程序。一定要用if条件语句应该如何让写?
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int hour1 = 0, minute1= 0, hour2 = 0, minute2 = 0;
printf("请输入两个时间\n");
scanf("%d %d", &hour1, &minute1);
scanf("%d %d", &hour2, &minute2);
int in = hour2 - hour1;
int im = minute2 - minute1;
if (im <= 0){
im = minute2 + 60 - minute1;
in--;
}
printf("相差%d小时%d分钟\n", in, im);
return 0;
}
这段代码使用了if条件语句,使用规则如下
if (条件判断表达式){
程序语句区块; //如果条件判断语句为真,则执行程序语句区块。
}
第二部分
条件判断中的关系运算符:==(相等),!=(不相等),>(大于),>=(大于等于),<(小于),<=(小于等于)。重点:比较运算的结果不是0就是1,只有这两种情况。
这里还有一个需要注意的点就是大于等于的符号正确的是先大于再等于">=",很容易错写成"=>"
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
printf("%d\n", 5 == 3);//关系运算符,如果为真就输出1,为假就输出0.
printf("%d\n", 5 >= 3);//因为5>=3为真,所以第二行打印的结果为1。
printf("%d\n", 5 <= 3);//因为5<=3为假,所以第三行打印的结果为0.
return 0;
}
所有关系运算符的优先级,比算术运算的低,比赋值运算的高。在关系运算符中判断==和!=的优先级要比其他的关系运算符第一点。而连续的关系运算符是从左向右运算的。
如:4+3==6+5,这个关系运算符是先算算术运算,然后在进行关系运算。
如:7>6>4,这个关系运算符是这样算的,自左向右,7>6为真就等于1,1>4为假就为0。
如:a==b==6,同样也是自左向右运算,先判断a==b是否为真,如果为真,就拿1==6运算,如果为假就拿0==做比较。
对于>=,<=这两个关系运算符,要记住<=这是一个运算符,所以这整个运算符是不能分开的。如a<=b,这个运算的过程就是,a <= b,这是三个量,两个算子,一个运算符,其实这就是一个比较判断的过程。如果是a<=b>=c,这个就牵涉到优先级,因为<=与>=是同级,所以就自左向右运算,假如a<=b为真,就是为1,然后判断1>=c,如果为真就为1,如果为假就是0。
举个例子:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int x = 0;
int n = 0;
printf("请输入一个不超过5位的数字\n");
scanf("%d", &x);
printf("您输入的数字是%d\n", x);
if (10000>x>999){
n = 4;
}
else if (1000>x>99){
n = 3;
}
else if (100>x>9){
n = 2;
}
else n = 1;
printf("该数字是一个%d位数\n", n);
return 0;
}
上述代码中,程序运行起来其实是不正确的。假如输入一个四位数8976, 在第一个条件判断语句中if (10000>x>999) { n = 4; },因为关系运算符的运算是自左向右的,先判断10000>8976为真,判断结果就是1,1>999为假,判断结果就是0,所以if()中判断结果就是假的。所以就跳过。这种判断和我们期望的结果是不一样的。
要实现以上的判断要求我们可以这样写这段代码:使用或且非的逻辑关系一个一个的做判断。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int x = 0;
int n = 0;
printf("请输入一个不超过5位的数字\n");
scanf("%d", &x);
printf("您输入的数字是%d\n", x);
if (x>999&&x<10000){
n = 4;
}
else if (x>99&&x<1000){
n = 3;
}
else if (x>9&&x<100){
n = 2;
}
else n = 1;
printf("该数字是一个%d位数\n", n);
return 0;
}
第三部分
判断流程图:无论程序多么大多么复杂,我们都可以理解为这样一个模型,程序首先会读一些输入,然后做一些计算,最后做一些输出。当然计算可能复杂,输入输出之间可能会有某些关系。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
//初始化
int price = 0;
int bill = 0;
//读取金额和票面
printf("请输入您的消费金额:\n");
scanf("%d", &price);
printf("请输入您的票面:\n");
scanf("%d", &bill);
//计算找零
if (bill < price){
printf("您还差%d元钱\n", price - bill);
}
else
printf("应该找您%d元钱\n", bill - price);
return 0;
}
if...else...语句逻辑的运行流程图,if与else两者运行其一。
//是单行注释。/* */是多行注释。通过注释可以把程序分成段落,这样可读性更高一点。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
const int MINOR = 35;
int age = 0;
printf("请输入你的年龄\n");
scanf("%d", &age);
printf("你的年龄是%d岁\n", age);//我们先把输入的结果显示给用户
/*这是我们在人机交互的过程中常用的一种手段
这也是在程序中验证刚才读取到数据是否这个正确的一种手段。*/
if (age <= MINOR){
printf("年轻是美好的,");
}
printf("年龄决定了你的精神世界,好好珍惜吧!\n");
return 0;
}
循环/判断与循环
第一部分 while循环
引入:在写程序的时候,你一定要明白一件事,你写的不是关系,你写的是步骤,计算机会按照你写的程序一步一步的去做。
如下一段程序就是不正确的示例:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int x = 0;
int n = 0;
printf("请输入一个不超过5位的数字\n");
scanf("%d", &x);
printf("您输入的数字是%d\n", x);
if (999 < x) n = 4;
if (99 < x) n = 3;
if (9 < x) n = 2;
if (0 < x) n = 1;
printf("该数字是一个%d位数\n", n);
return 0;
}
这段程序当输入一个三位数345,第一个if条件不满足,满足第二个if条件语句,但是这个时候程序并不会向我们想的那样输出n=3,而是还会接着向下执行,第三个if条件语句成立,n=2,第四个if条件语句也会满足,n=1,所以最后的打印结果就是“该数字是一个1位数”,显然这是错误的。写程序不能想当然。要明白程序是一个步骤一个步骤的。
正确的程序如下:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int x = 0;
int n = 0;
printf("请输入一个不超过5位的数字\n");
scanf("%d", &x);
printf("您输入的数字是%d\n", x);
if (999 < x) {
n = 4;
}
else if (99 < x) {
n = 3;
}
else if (9 < x) {
n = 2;
}
else n = 1;
printf("该数字是一个%d位数\n", n);
return 0;
}
在判断位数的时候4位数就要写4个if语句,如果7位数,8位数就要写更多,所以这样是很不方便的,这个时候我们就用到了循环。
循环的运用:
针对上面的问题我们可以用如下代码实现。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int x;
int n = 0;
printf("请输入一个数字\n");//输入的数字最大位数为10为。
scanf("%d", &x);
printf("您输入的数字是%d\n", x);
n++;
x = x / 10;
while (x > 0){
n++;
x = x / 10;
}
printf("该数字是一个%d位数\n", n);
return 0;
}
while循环:while循环语句的标准形式
while(判断条件语句){
循环体;
控制循环语句;
}
while循环的执行流程如下图:
while循环语句调试的技巧:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int x;
int n = 0;
printf("请输入一个数字\n");//输入的数字最大位数为10为。
scanf("%d", &x);
printf("您输入的数字是%d\n", x);
/*n++;
x = x / 10;*/
while (x > 0){
n++;
x = x / 10;
printf("n=%d x=%d\n", n, x);//这行代码的意思是,程序运行到这里的时候,我们打印出数据来给我们看。
} //这也是调试的一种方法。
printf("该数字是一个%d位数\n", n);
return 0;
}
其中while大括号循环体中有一行printf()语句,这是while循环的一种调试技巧,可以把每一个循环打印出来看。这个就是套路。
上面这段程序的缺点是,整数可以处理,但是0处理不了。因为当x=0时,进入不了while循环,打印的结果就是0是一个0位数,这显然是错的。如果想要包括0,可以改为以下代码。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int x;
int n = 0;
printf("请输入一个数字\n");//输入的数字最大位数为10位。
scanf("%d", &x);
printf("您输入的数字是%d\n", x);
n++;
x = x / 10;
while (x > 0){
n++;
x = x / 10;
}
printf("该数字是一个%d位数\n", n);
return 0;
}
do while循环语句:do while循环的标准语句:
do
{
程序语句块;
}
while(条件判断表达式);
示例:do while循环是先做一边然后在进行判断是否循环。重点:do while中的;分号要注意。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int x;
int n = 0;
printf("请输入一个数字\n");//输入的数字最大位数为10位。
scanf("%d", &x);
printf("您输入的数字是%d\n", x);
do {
n++;
x = x / 10; //无论如何do{}中的内容都会被做一遍。
}while (x > 0); //while()中判断的语句是否循环执行的。
printf("该数字是一个%d位数\n", n);
return 0;
}
while循环和do while循环的区别,程序中while循环可能一编都不做,而程序中do while循环是一定要做一遍的。流程框图如下:(左边为do while循环,右边为while循环)
第二部分 for循环
引例:阶乘4!=4*3*2*1,这个用程序该怎么实现呢,可以先使用while循环来写程序
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int n = 0;
int i = 1;
int fact = 1;
printf("请输入一个需要阶乘运算的数字\n");
scanf("%d", &n);
while (i<=n ){
fact = i*fact;
i++;
}
printf("%d!=%d\n",n, fact);
return 0;
}
而for循环中可以用另一种方式表示这里的while循环,先说一下for循环的标准语句格式。
for(控制变量的起始值;循环执行条件的判断表达式;控制变量增减值)
{
程序语句;
}
for(i=1;i<=n;i++)
{
fact=fact*i;
}
用for循环语句来代替while循环语句
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int n = 0;
int i = 1;
int fact = 1;
printf("请输入一个需要阶乘运算的数字\n");
scanf("%d", &n);
for (i = 1; i <= n; i++)
{
fact *= i;
}
printf("%d!=%d\n",n, fact);
return 0;
}
for循环语句中,for可以翻译为“对于”,那么for (i = 1; i <= n; i++)这个就可以翻译为:对于一开始的i=1,当i<=n时,重复做循环体,每一轮循环在做完循环体后,使得i++。
小套路:在做求和时,我们一般让变量的初始值为0。在做求积时,我们一般让变量的初始值为1。
for(;i<=n;)for循环中三个位置是可以有空的。
第三部分 :三种循环的选用
如果有固定次数用for循环。如阶乘
如果程序必须执行一次用do while循环。
如果循环的次数不固定就用while循环。