GitHub 爆火!2021 年度巨作:拼多多 / 蚂蚁 / 百度面经分享

java中int类型强转char类型详解!!!!(超级详细!!真的!!!)

  返回  

day 9 7_17 数组

2021/7/20 19:19:23 浏览:
#include<stdio.h>
#include<stdlib.h>
int main(){
const int n=10;
int a[n]={};//在编译环节 把n替换为10 即(a[10])
for(int i=0;i<n;i++){
a[i]=rand()%10+1;
}
return 0;
}

数组和变量 加了 const 之后必须初始化

错误示范:
const int m;//错误 初始化必须赋值
const int a[5];//错误 初始化必须赋值

正确示范:
const int m=0;//正确
const int a[5]={};//正确 数组全部元素都为0

字符串

#include<stdio.h>
#include<stdlib.h>
int main() {
	char stra[] = "lijiale";//有隐藏的'\0'存在
	char strb[] = { 'l','i','j','i','a','l','e' };
	//改为char strb[]={ 'l','i','j','i','a','l','e' ,'\0'};
	int size1 = sizeof(stra);//8 还要加上'\0'
	int size2 = sizeof(strb);//7 没有'\0'
	printf("%s size1=%d\n", stra, size1);
	printf("%s size2=%d\n", strb, size2);\\没有'\0'导致越界访问 
	                                      \\用%s打印时 必须加上'\0'
	return 0;
}
输出:
lijiale size1=8
lijiale烫烫烫烫蘬ijiale size2=7

可以看出打印出了乱码,这是因为没有加'\0'导致越界访问.%s打印字符串,字符串会遇到'\0'才进行结束.
应该改为 char strb[]={ 'l','i','j','i','a','l','e' ,'\0'};
判断闰年函数
bool Is_Leap(int year) {

	return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));
}
判断月份天数
int Get_YM_Day(int year,int month) {
	int day = 0;
	switch (month) {
	case 1:
		case 3:
		case 5:
		case 7:
		case 8:
		case 10:
		case 12:
			day = 31; //1 3 5 7 8 10 12 月都为31天
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			day = 30;//4 6 9 11 都为30天
			break;
		default:
			if (Is_Leap(year)) {//判断是否为闰年
				day = 29;	 
			}
			else {
				day = 28;			
			}	
	}
return day;

}
优化
用查表法求月份天数
---------------------------------------------------------------------
用数组存放每个月份的天数 根据month的值进行读取.
1下标存放一月天数 2下标存放二月天数 3下标存放三月天数.
0下标特殊处理,存放闰年中的二月天数.
int Get_YM_Day(int year, int month) {

static const int days[] = { 29,31,28,31,30,31,30,31,31,30,31,30,31 };
//加上static 只创建一次,消除了(每次调用函数都需要开辟days[]数组)的缺点.
//加上const  防止被修改
 
	if (month == 2 && Is_Leap(year)) {
	//先判断月份是否满足条件 才进行是否调用函数
	//满足就执行函数 不满足不执行函数 效率较高
	
    //if(Is_Leap(year)&&month==2) 
    //这样先调动函数 如果month!=2 就白调用了Is_Leap()函数 效率不高
		month = 0;//如果是闰年且访问的月份为二月,
		          //就去访问0下标的值(闰年二月份天数)
	}
	return days[month];
}

计算从当前年份的第一天到现在月份的 第day天
int Get_YMD_Sum(int year, int month, int day) {
	int total=0;
	if (year < 1) return -1;//判断年份是否有误
	if (month < 1 || month>12) return -2;//判断月份是否有误
	if (day<1 || day>Get_YM_Day(year, month)) return -3;
	//判断天数是否大于此月的规范天数或者小于1天
	for (int i = 1; i < month; ++i) {//先算此月之前几个月的天数
		total = total + Get_YM_Day(year, i);

	}
	return total + day;//返回此月之前的天数加上这个月已经过去的天数

}
完整代码实现
#include<stdio.h>
#include<stdlib.h>
bool Is_Leap(int year) {//判断闰年

	return ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0));


}
int Get_YM_Day(int year, int month) {//获得输入的月份的天数
	int days[] = { 29,31,28,31,30,31,30,31,31,30,31,30,31 };
	if (month == 2 && Is_Leap(year)) {
		//if(Is_Leap(year)&&month==2) //这样先调动函数 如果month!=2 就白调用了Is_Leap()函数 效率不高
		month = 0;
	}
	return days[month];
}
int Get_YMD_Sum(int year,int month,int day){//获得从年初到当前的天数和
	int total=0;
	if (year < 1) return -1;
	if (month < 1 || month>12) return -2;
	if (day<1 || day>Get_YM_Day(year, month)) return -3;
	for (int i = 1; i < month; ++i) {
		total = total + Get_YM_Day(year, i);

	}
	return total + day;

}
int main() {
	int year;
	int month;
	scanf_s("%d", &year);
	bool p=Is_Leap(year);
	if (p == true) {
		printf("%d是闰年\n", year);
	}
	else {
		printf("%d不是闰年\n", year);
	}
	scanf_s("%d", &month);
	int day=Get_YM_Day(year,month);
	printf("%d月有%d天\n", month, day);
	int day1 = 0;
	scanf_s("%d", &day1);
	int sum = Get_YMD_Sum(year, month, day1);
	printf("从年初到现在一共%d天", sum);
	return 0;
}

联系我们

如果您对我们的服务有兴趣,请及时和我们联系!

服务热线:18288888888
座机:18288888888
传真:
邮箱:888888@qq.com
地址:郑州市文化路红专路93号