C语言基础 3. If&Switch
文章目录
3.1. 做判断
-
if语句:
- if (条件成立) { // 条件成立,则执行{}中的程序
…
}
- if (条件成立) { // 条件成立,则执行{}中的程序
-
if语句计算两个时间的差值:
#include <stdio.h>
int main()
{
int hour1, minute1;
int hour2, minute2;
int endhour = 0;
int endminute = 0;
printf("请输入四个分别代表时间的数字, 用来计算两个时间的差值(例如: 2 10 1 40 代表2:10和1:40): ");
scanf("%d %d", &hour1, &minute1);
scanf("%d %d", &hour2, &minute2);
if(minute1 >= minute2){
endhour = hour1 - hour2;
endminute = minute1 - minute2;
}
if (minute1 < minute2){
endhour = hour1 - 1 - hour2;
endminute = minute1 + 60 - minute2;
}
printf("两个时间的差值为: %d时%d分", endhour, endminute);
return 0;
}
- 优化后的代码:
#include <stdio.h>
int main()
{
int hour1, minute1;
int hour2, minute2;
printf("请输入四个分别代表时间的数字, 用来计算两个时间的差值(例如: 2 10 1 40 代表2:10和1:40): ");
scanf("%d %d", &hour1, &minute1);
scanf("%d %d", &hour2, &minute2);
int endhour = hour1 - hour2;
int endminute = minute1 - minute2;
if (endminute < 0){ // 如果endminute<0, 那么执行{}中的程序
endminute = minute1 + 60 - minute2;
endhour--;
}
printf("两个时间的差值为: %d时%d分", endhour, endminute);
return 0;
}
3.2. 判断的条件
- 关系运算:
- 计算两个值之间的关系
运算符 意义
== 相等
!= 不相等
> 大于
< 小于
>= 大于等于
<= 小于等于
- 关系运算的结果:
-
成立为1, 否则为0
- 比如:
printf("%d\n", 5 == 3); // 0 printf("%d\n", 5 > 3); // 1 printf("%d\n", 5 <= 3); // 0
- 比如:
-
- 关系运算的优先级:
- 都比算术运算的优先级低, 但是比赋值运算的高
- 比如:
printf("%d\n", 7 >= 3 + 4); // 1 int r = a > 0; // a>0先, 赋值后
- 比如:
- 判断是否相等的==和!=的优先级比其他的低, 而连续的关系运算是从左向右进行的
- 比如:
printf("%d\n", 5 > 3 == 6 > 4); // 1 printf("%d\n", 6 > 5 > 4); // 0
- 比如:
- 都比算术运算的优先级低, 但是比赋值运算的高
3.3. 找零计算器
-
找零计算器:
- 输入购买的金额, 输入支付的票面.
- 计算器则会根据用户的输入做出相应的动作: 计算并打印找零, 或告知用户余额不足以购买.
-
注释:
-
插入在程序代码中, 用来向读者提供解释信息, 他们对于程序的功能没有任何的影响.
-
// 单行注释
-
/*
多行注释
*/
-
-
找零计算器代码:
#include <stdio.h>
int main()
{
int jine = 0;
int piaomian = 0; // 初始化
printf("请输入金额和票面: ");
scanf("%d %d", &jine, &piaomian); // 输入金额和票面
int zhaoling = piaomian - jine; // 计算找零
if (zhaoling >= 0) {
printf("找零: %d元\n", zhaoling); // 判断票面是否足够, 并输出结果
}
return 0;
}
3.4. 否则的话
-
else:
- 找零时, 票面不够怎么办?
- 则会用到else.
- 找零时, 票面不够怎么办?
-
找零代码:
#include <stdio.h>
int main()
{
int jine = 0;
int piaomian = 0; // 初始化
printf("请输入金额和票面: ");
scanf("%d %d", &jine, &piaomian); // 输入金额和票面
int zhaoling = piaomian - jine; // 计算找零
if (zhaoling >= 0) {
printf("找零: %d元\n", zhaoling); // 判断票面是否足够, 并输出结果
}
else {
printf("你支付的票面不足以购买, 请再支付%d元!\n", -zhaoling); // 不够则提示
}
return 0;
}
- 比较数的大小:
#include <stdio.h>
int main()
{
int num1 = 0;
int num2 = 0;
printf("请输入两个数, 用来比较它们的大小: ");
scanf("%d %d", &num1, &num2);
if (num1 > num2) {
printf("%d > %d", num1, num2);
}
else {
printf("%d < %d", num1, num2); // 如果当num1 == num2呢? 这个程序还是有点问题的
}
return 0;
}
- 优化后的代码:
#include <stdio.h>
int main()
{
int num1 = 0;
int num2 = 0;
printf("请输入两个数, 用来比较它们的大小: ");
scanf("%d %d", &num1, &num2);
int max = 0;
if (num1 > num2) {
max = num1;
}
else {
max = num2;
}
printf("较大的数是: %d", max);
return 0;
}
3.5. If语句再探
-
if后面无{}:
- if (total > amount)
- total += amount + 10;
- // if语句的{}不是必须的, 无{}时, if的下一行(以;为结束标志) 则是if语句的一部分, else也同样如此.
- total += amount + 10;
- if (total > amount)
-
判断成绩是否合格:
#include <stdio.h>
int main()
{
const int PASS = 60;
int result = 0;
printf("请输入成绩: ");
scanf("%d", &result);
printf("你输入的成绩是: %d\n", result);
if (result >= PASS)
printf("你的成绩合格");
else
printf("你的成绩不合格");
return 0;
}
3.6. 嵌套
-
找三个数中的最大值:
- 要求出入三个整数, 输出其中最大的.
-
嵌套:
if (num1 < num2) { if (num2 < num3) { max = num3; } else { max = num2; } }
-
else的匹配:
- else总是要和最近的那个if匹配.
if (code == READY) if (count < 20) printf("一切正常\n"); else printf("继续等待\n"); // 此时的else是跟第二个if(离else最近的)匹配的 if (code == READY) { if (count < 20) printf("一切正常\n"); }else printf("继续等待\n"); // 这时的else是跟第一个if进行匹配的, 因为加上了大括号. if (code == READY) if (count < 20) printf("一切正常\n"); else printf("继续等待\n"); // 此时的else是跟第二个if进行匹配的, 因为缩进格式不能暗示else的匹配.
- else总是要和最近的那个if匹配.
-
建议:
- 在if或else后面总是用{}, 即使是只有一条语句的时候.
-
找三个数中的最大值的代码:
#include <stdio.h>
int main()
{
int num1 = 0;
int num2 = 0;
int num3 = 0;
printf("请输入三个数, 要求输出它们中的最大值: ");
scanf("%d %d %d", &num1, &num2, &num3); // 1 2 3
int max = 0;
if (num1 < num2) {
if (num2 < num3) {
max = num3;
}
else {
max = num2;
}
}
else {
if (num1 < num3) {
max = num3;
}
else {
max = num1;
}
}
printf("最大值: %d\n", max);
return 0;
}
- 测试else与if匹配的代码:
#include <stdio.h>
int main()
{
const int READY = 24;
int code = 0;
int count = 0;
scanf("%d %d", &code, &count);
if (code == READY) {
if (count < 20)
printf("一切正常\n");
}else
printf("继续等待\n");
return 0;
}
3.7. 级联
-
级联 if-else:
- if(){}
- else if (){} … // else if 可以有多个
- else{}
-
分段函数:
- f(x) = -1, x < 0;
- = 0, x = 0;
- = 2x, x > 0;
- f(x) = -1, x < 0;
-
分段函数代码:
#include <stdio.h>
int main()
{
int x = 0;
int f = 0;
printf("请输入一个整数x: ");
scanf("%d", &x);
if (x < 0) {
f = -1;
}
else if(x == 0) {
f = 0;
}
else {
f = 2 * x; // 级联if-else
}
printf("f = %d\n", f);
return 0;
}
3.8. Switch语句
-
switch-case:
switch (type) { // switch会根据(type)这个变量或者表达式来选择跟哪个case来匹配, 如果type==3, 则匹配case3, 执行case后面的语句, 这样比if来的高效, 因为他没有去匹配1和2, 直接匹配的3. case 1: printf("你好"); break; // break: 执行完之后结束这个程序 case 2: printf("早上好"); break; . . . default: printf("啊, 什么啊!"); // default: 上面的case都没有进行匹配的情况下, 则默认匹配到default }
-
格式:
- switch (控制表达式){ // 控制表达式只能是整数型的结果
case 常量: // 常量可以是常数, 也可以是常数计算的表达式
语句;
…
case 常量:
语句;
…
default:
语句;
…
}
- switch (控制表达式){ // 控制表达式只能是整数型的结果
-
break:
- 其实switch-case语句中, 它们是一个整体, 所有的case都是一个连续执行的序列, 只不过是当中出现了break, case只是从哪里开始执行的一个位置.
- 计算机会根据控制表达式的值, 跳到所对应的case当中, 去执行后面的语句, 如果后面没有break, 就会顺序执行到下面的case, 直到遇到break, 或者switch结束.
-
03-4. 成绩转换(15)
-
本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:
大于等于90分为A;
小于90且大于等于80为B;
小于80且大于等于70为C;
小于70且大于等于60为D;
小于60为E。 -
输入格式:
输入在一行中给出1个整数的百分制成绩。 -
输出格式:
在一行中输出对应的五分制成绩。 -
输入样例:
90 -
输出样例:
A
-
-
switch-case语句的演示的代码:
#include <stdio.h>
int main()
{
int type = 0;
printf("请输出一个整数: ");
scanf("%d", &type);
switch (type) {
case 1:
case 2:
printf("早上好");
break;
case 3:
printf("晚上好");
break;
case 4:
printf("再见");
break;
default:
printf("啊, 什么啊!");
break;
}
return 0;
}
- 成绩转换的代码:
#include <stdio.h>
int main()
{
int result = 0;
scanf("%d", &result);
if (result >= 90) {
printf("a");
}
else if (result >= 80) {
printf("b");
}
else if (result >= 70) {
printf("c");
}
else if (result >= 60) {
printf("d");
}
else {
printf("e");
}
return 0;
}
- 优化后的代码:
#include <stdio.h>
int main()
{
int result = 0;
scanf("%d", &result);
switch (result / 10) {
case 10:
case 9:
printf("A");
break;
case 8:
printf("B");
break;
case 7:
printf("C");
break;
case 6:
printf("D");
break;
default:
printf("E"); // 这段代码不符合单一出口原则, 因为这里还没学过字符串数据的处理方式
break;
}
return 0;
}
- 使用switch语句完成分段函数的代码:
#include <stdio.h>
int main()
{
int x = 0;
int f = 0;
printf("请输入一个整数: ");
scanf("%d", &x);
switch (x >= 0) {
case 0: // x == -2
f = -1;
break;
case 1:
switch (x == 0) {
case 0: // x == 1
f = 2 * x;
break;
case 1: // x == 0
f = 0;
break;
}
}
printf("f = %d", f);
return 0;
}
3.9. PAT
- 03-0. 超速判断(10)
-
模拟交通警察的雷达测速仪。输入汽车速度,如果速度超出60 mph,则显示“Speeding”,否则显示“OK”。
-
输入格式:
输入在一行中给出1个不超过500的非负整数,即雷达测到的车速。 -
输出格式:
在一行中输出测速仪显示结果, 格式为:“Speed: V - S”,其中V是车速,S或者是Speeding或者是OK. -
输入样例1:
40 -
输出样例1:
Speed: 40 - OK -
输入样例2:
75 -
输出样例2:
Speed: 75 - Speeding
-
#include <stdio.h>
int main()
{
int speed = 0;
scanf("%d", &speed);
if (speed <= 60) {
printf("Speed: %d - OK", speed);
}
else {
printf("Speed: %d - Speeding", speed);
}
return 0;
}
- 03-1. 三天打鱼两天晒网(15)
-
中国有句俗语叫“三天打鱼两天晒网”。假设某人从某天起,开始“三天打鱼两天晒网”,问这个人在以后的第N天中是“打鱼”还是“晒网”?
-
输入格式:
输入在一行中给出1个不超过1000的正整数N。 -
输出格式:
在一行中输出此人在第N天中是“Fishing”(即“打鱼”)还是“Drying”(即“晒网”),并且输出“in day N”。 -
输入样例1:
103 -
输出样例1:
Fishing in day 103 -
输入样例2:
34 -
输出样例2:
Drying in day 34
-
#include <stdio.h>
int main()
{
int N = 0;
scanf("%d", &N); // 1 2 3, 4 5, 6 7 8, 9 10,
switch (N % 5) {
case 1:
case 2:
case 3:
printf("Fishing in Day %d", N);
break;
case 4:
case 0:
printf("Drying in Day %d", N);
break;
}
return 0;
}
- 03-2. 用天平找小球(10)
-
三个球A、B、C,大小形状相同且其中有一个球与其他球重量不同。要求找出这个不一样的球。
-
输入格式:
输入在一行中给出3个正整数,顺序对应球A、B、C的重量。 -
输出格式:
在一行中输出唯一的那个不一样的球。 -
输入样例:
1 1 2 -
输出样例:
C
-
#include <stdio.h>
int main()
{
int a, b, c;
scanf("%d %d %d", &a, &b, &c);
if (a == b) {
printf("C");
}
else if (a == c) {
printf("B");
}
else {
printf("A");
}
return 0;
}
- 03-3. 12-24小时制(15)
-
编写一个程序,要求用户输入24小时制的时间,然后显示12小时制的时间。
-
输入格式:
输入在一行中给出带有中间的“:”符号(半角的冒号)的24小时制的时间,如12:34表示12点34分。当小时或分钟数小于10时,均没有前导的零,如5:6表示5点零6分。提示:在scanf的格式字符串中加入“:”,让scanf来处理这个冒号。 -
输出格式:
在一行中输出这个时间对应的12小时制的时间,数字部分格式与输入的相同,然后跟上空格, 再跟上表示上午的字符串“AM”或表示下午的字符串“PM”。如“5:6 PM”表示下午5点零6分.注意,在英文的习惯中,中午12点被认为是下午,所以24小时制的12:00就是12小时制的12:0 PM;而0点被认为是第二天的时间,所以是0:0 AM。 -
输入样例:
21:11 -
输出样例:
9:11 PM
-
#include <stdio.h>
int main()
{
int hour = 0;
int minute = 0;
char apm;
scanf("%d:%d", &hour, &minute);
if (hour >= 12) {
apm = 'P';
hour -= 12;
}
else {
apm = 'A';
}
printf("%d:%d %cM", hour, minute, apm);
return 0;
}
- 03-4. 成绩转换(15)
-
本题要求编写程序将一个百分制成绩转换为五分制成绩。转换规则:
大于等于90分为A;
小于90且大于等于80为B;
小于80且大于等于70为C;
小于70且大于等于60为D;
小于60为E。 -
输入格式:
输入在一行中给出1个整数的百分制成绩。 -
输出格式:
在一行中输出对应的五分制成绩。 -
输入样例:
90 -
输出样例:
A
-
#include <stdio.h>
int main()
{
int result = 0;
char grade;
scanf("%d", &result);
switch (result / 10) {
case 9:
case 10:
grade = 'A';
break;
case 8:
grade = 'B';
break;
case 7:
grade = 'C';
break;
case 6:
grade = 'D';
break;
default:
grade = 'E';
break;
}
printf("%c", grade);
return 0;
}