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

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语句

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

程序输入一个正整数n,代表学生的成绩,根据分数输出分数挡位

n = 0,FOOLISH

0<n<60,FAIL

60<=n<75,MEDIUM

75<=n<=100,GOOD

c 复制代码
#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语句

c 复制代码
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。

c 复制代码
#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()输出结果

c 复制代码
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小于数组中各个月份对应的数。

c 复制代码
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()函数

c 复制代码
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。另外我们还可以优化一下的是,我们可以把对月份的判断放在首位,一旦月份不合法直接结束程序,不需要先对数组进行操作。

c 复制代码
#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");
	}
}
相关推荐
薯条不要番茄酱40 分钟前
数据结构-5.二叉树
java·开发语言·数据结构
YAy172 小时前
CC3学习记录
java·开发语言·学习·网络安全·安全威胁分析
代码小鑫2 小时前
A035-基于Spring Boot的企业内管信息化系统
java·开发语言·spring boot·后端·spring
cleverpeople2 小时前
11.15作业
c语言·开发语言·算法
_.Switch2 小时前
Django SQL 查询优化方案:性能与可读性分析
开发语言·数据库·python·sql·django·sqlite·自动化
Seeklike2 小时前
11.14 机器学习-朴素贝叶斯+决策树算法
算法·决策树·机器学习
徐浪老师4 小时前
深入解析贪心算法及其应用实例
算法·贪心算法
软行4 小时前
LeetCode 单调栈 下一个更大元素 I
c语言·数据结构·算法·leetcode
钰爱&5 小时前
【操作系统】Linux之线程同步二(头歌作业)
linux·运维·算法
Ws_5 小时前
leetcode LCR 068 搜索插入位置
数据结构·python·算法·leetcode