C语言基础 3. If&Switch

C语言基础 3. If&Switch

3.1. 做判断

  • 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也同样如此.
  • 判断成绩是否合格:

#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的匹配.
      
  • 建议:

    • 在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;
  • 分段函数代码:

#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来的高效,
    						因为他没有去匹配12, 直接匹配的3.
    case 1:
    	printf("你好");
    	break;				// break: 执行完之后结束这个程序
    case 2:
    	printf("早上好");
    	break;
    .
    .
    .
    default:
    	printf("啊, 什么啊!");	// default: 上面的case都没有进行匹配的情况下, 则默认匹配到default
    }
    
  • 格式:

    • switch (控制表达式){ // 控制表达式只能是整数型的结果
      case 常量: // 常量可以是常数, 也可以是常数计算的表达式
      语句;

      case 常量:
      语句;

      default:
      语句;

      }
  • 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值