C语言程序设计——程序流程控制方法(一)

2024-01-07 18:02:19

C语言关系运算符

---
==等于a==b
!=不等于a!=b
<、>小于和大于a>b 、a<b
<=、>=小于等于、大于等于a>=b 、a<=b
!!(0)、!(NULL)

在C99之后,C语言开始支持布尔类型,头文件是stdbool.h。在文中我所演示的所有代码均是C99版。
在C语言上上述关系运算符中,如果上述关系成立,就为返回值为1,不成立九为,返回值为0。在写代码的时候需要着重注意一下等于的运算符是两个等号,一个等号叫做赋值,这个在编码时候注意。

逻辑归一化 !!(x)
在C语言中空字符,0,空数组,NULL代表假,布尔值均为0,其它则为真,比如100、-2,{4,5,6}等,它就是真,但是以布尔值来讲是只有0和1的,所以为了在布尔运算上统一我们需要把这些,真真假假的数据归一化。就需要使用!!操作,把当前数据的布尔值调整为0或1

分支结构

if语句

if(表达式){
	代码段;
}
else if(表达式){
	代码段;
}
else{
	代码段;
}

程序输入一个正整数n,代表学生的成绩,根据分数输出分数挡位
n = 0,FOOLISH
0<n<60,FAIL
60<=n<75,MEDIUM
75<=n<=100,GOOD

#include<stdio.h>

int main(){
	int n;
	while(~scanf("%d", &n)){
		if(!n){
			printf("FOOLISH\n");
		}
		else if(n < 60){
			printf("FAIL\n");
		}
		else if(n < 75){
			printf("MEDIUM\n"); 
		}
		else if(n <= 100){
			printf("GOOD\n");
		}

	}
}

switch语句

switch (a){
	case 1:代码块1;
	case 2: 代码块2;
	case 3: 代码块3;
	default:代码块4;
}

请使用switch结构完成如下任务,程序读入一个整数n:
如果n = 1,则输出one
如果n = 2,则输出two
如果n = 3,则输出three
否则输入error

在这里插入图片描述
可以看到输出结果不是我们预期的目的,在这里需要说明一下,case为条件入口,程序进入case对应的代码段,一次执行后续的代码,知道遇到break,或者switch末尾。所以在本题中,要注意在case后加上break。

#include<stdio.h>

int main(){
	
	int n;
	while(~scanf("%d", &n)){
		switch(n){
			case 1: printf("one\n");break;
			case 2: printf("two\n");break;
			case 3: printf("three\n");break;
			default: printf("error\n");
		}
	}
}

在使用switch语句中,要保证参数n能唯一映射,整型或者字符型的数据。所以在使用时switch的使用场景没有if的使用场景更多。

判断日期的合法性

题目要求:输入一个日期,判断这个日期是否存在
1,3,5,7,8,10,12月有21天
4,6,9,11月有30天
闰年的2月是29天
非整百年,能被4整除的为闰年,在整百年中能被400整除的是闰年。
如果日期合法,输出YES,不合法,则输出NO

思路:首先根据题目来讲我们需要三个变量来接受年月日的输入,然后12个月的日期我们需要一个数组来存储各个月的日期,来减少工作量,然后需要一个判断的合法的函数来接收年月日,判断是否合法,根据返回值,再用printf()输出结果

int main(){
	
	int year, month, day;
	int date[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
	
	while(~scanf("%d %d %d", &year, &month, &day)){	
		printf("%s\n",judge_date(year, month, day, date)? "YES" : "NO");
	}
}

主函数完成后,我们来完成judge_date()函数。首先我们要先判断当前年份是否为闰年,这里我们判断闰年也是一个独立的功能,我们再需要另一个函数judge_year()实现,如果是闰年,则返回1,如果不是则返回0。那么在数组中我们只需要把28与judge_year()的返回值相加即可。然后考虑年月日的逻辑,年是可以为任意整数的,因为有公元前和公元后,所以year没有需要注意的地方,月份的后只可以是1~12,日就是要大于0小于数组中各个月份对应的数。

int judge_date(int year, int month, int day, int *date){
	int temp = 0;
	temp = judge_year(year);
	date[2] = date[2]+temp;
	if(month > 12 || month < 1) return 0;
	if(day > date[month] || day < 1 ) return 0;
	return 1;
}

下面按照题目介绍完成judge_year()函数

int judge_year(int year){
	if ((year % 4 == 0 && year % 100 != 0 ) ||year % 400 == 0) return 1;
	return 0;
}

在这个函数完成之后就完成了题目要求,但是这里会有一个小bug,因为我们使用的是循环读入,在judge_date()函数中,我们可以看到如果是闰年后,28+1成了29,但是一次循环后,数组中的数据并没用还原,所以我们需要再把二月的数据初始为28。另外我们还可以优化一下的是,我们可以把对月份的判断放在首位,一旦月份不合法直接结束程序,不需要先对数组进行操作。

#include<stdio.h> 

int judge_year(int year){
	if ((year % 4 == 0 && year % 100 != 0 ) ||year % 400 == 0) return 1;
	return 0;
}

int judge_date(int year, int month, int day, int *date){
	if(month > 12 || month < 1) return 0;
	
	date[2] = date[2] + judge_year(year);
	if(day > date[month] || day < 1 ) return 0;
	date[2] = 28;
	return 1;
}

int main(){
	
	int year, month, day;
	int date[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
	
	while(~scanf("%d %d %d", &year, &month, &day)){	
		printf("%s\n",judge_date(year, month, day, date)? "YES" : "NO");
	}
}

在这里插入图片描述

文章来源:https://blog.csdn.net/weixin_46640900/article/details/135438311
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。