(21)计算天数(22)删除指定的数(23)字符串拷贝(24)合并有序数组

1. 每日一言

在今天和明天之间,有一段很长的时间;趁你还有精神的时候,学习迅速办事. 歌德

2.(21)计算天数

输入y和m两个整数,y表示年,m表示月,计算y年m月有多少天,输出天数

3. 解题思路

这题只要在m=2时判断一下y是否为闰年就OK啦~
其他的应该没啥难的awa

4. 代码

#include<stdio.h>
int main()
{
	int y = 0;
	int m = 0;
	scanf("%d %d", &y, &m);
	
	switch (m)
	{
	case 1:printf("31"); break;
	case 2:
		//判断是否是闰年
		if ((y % 100 != 0 && y % 4 == 0 )|| (y%400 == 0))
			printf("29");
		else
			printf("28");
		break;
	case 3:printf("31"); break;
	case 4:printf("30"); break;
	case 5:printf("31"); break;
	case 6:printf("30"); break;
	case 7:printf("31"); break;
	case 8:printf("31"); break;
	case 9:printf("30"); break;
	case 10:printf("31"); break;
	case 11:printf("30"); break;
	case 12:printf("31"); break;
	}
	
	return 0;
}

5.(22)删除指定的数

先输入10个整数存放在数组中,再输入一个整数n,删除数组中所有等于n的数字,打印数组中剩余的数


输入:
1 2 3 4 5 6 7 8 9 0
6
输出:
1 2 3 4 5 7 8 9 0

6. 解题思路

定义两个指针 i 和 j
i从前往后走遍整个数组
j每走一步就判断一下当前指向的数字是否是要删除的数字

  1. 如果是,j 停下一步
  2. 如果不是,就让 j 指向的位置放上 i 指向的数字

7. 代码

#include<stdio.h>
int main()
{
	int i = 0,x = 0;
	int arr[10] = { 0 };
	for (i = 0; i < 10; i++)//输入10个数
	{
		scanf("%d", &arr[i]);
	}
	scanf("%d", &x);//输入要删除的数
	int j = 0;
	
	//删除
	for (i = 0; i < 10; i++)
	{
		if (arr[i] == x)
		{
			continue;
			//这里continue的作用就是让j少走一步
		}
		arr[j] = arr[i];
		j++;
	}
	
	for (i = 0; i < j; i++)//打印
		printf("%d ", arr[i]);
	return 0;
}

8.(23)字符串拷贝

写一个函数,实现拷贝字符串的功能,拷贝内容包括字符串末尾的 \0 字符
输入一个字符串,要求输出拷贝后的字符串

9. 解题思路

利用while循环,遍历整个字符串,每个字符逐一拷贝

10. 代码

#include<stdio.h>

void Strcpy(char* dest,char* src)
{
	while (*src)//如果src不为\0就进入循环
	{
		*dest = *src;
		src++;
		dest++;
	}
	*dest = '\0';//别忘了加上末尾的\0
}

int main()
{
	char str1[100] = { 0 };
	char str2[100] = { 0 };
	gets(str1);
	Strcpy(str2, str1);
	puts(str1);
	puts(str2);
}

其实以上代码还可以再简洁一点

#include<stdio.h>

void Strcpy(char* dest,char* src)
{
	while (*dest++=*src++);
	//这里需要你对操作符的运算顺序有一定了解
	//*dest++: 这是一个后置自增运算符,作用于 dest 指针。
	//它会首先将 src 指针指向的值赋给 *dest
	//然后自增 dest和src 指针,使其指向下一个位置。
}

int main()
{
	char str1[100] = { 0 };
	char str2[100] = { 0 };
	gets(str1);
	Strcpy(str2, str1);
	puts(str1);
	puts(str2);
}

11.(24)合并有序数组

输入两个升序排序的序列,将两个序列合并为一个有序序列并输出。

输入包含三行,第一行包含两个正整数n,m用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。其中1<=n<=30,1<=m<=30。

第二行包含n,个整数,用空格分隔。
第三行包含m个整数,用空格分隔。

输出合并后的有序序列

12. 解题思路

12.1 方法一:

不管三七二十一先把这两个序列放到一个数组中,之后再利用冒泡、选择等等的排序方法把它变成有序数列。

12.2 方法二:

方法一虽然容易想到,但是运行效率却不怎么高。仔细观察题干,我们发现还有一个条件没用上:两个升序排序的序列
这怎么才能用到这个条件呢?

我们可以同时遍历两个数组,挨个比较,哪个小,就将小的放在新数组里,并将小的下标向前走一格。两个数组下标对应的数字再进行比较。不断重复以上过程,直到有数组下标走完整个数组。
此时有以下几种情况

  1. 同时走完
  2. 第一个先走完
  3. 第二个先走完

情况1:
其实你仔细想想,情况一是不可能出现的~

情况2、3:
此时只要让那个没走完的数组后面的的元素逐一放到新数组中就OK了

13. 代码

13.1 方法一:

#include<stdio.h>

int main()
{
	int n, m;
	
	//接收m和n的值
	scanf("%d %d", &n, &m);
	
	int i = 0;
	int arr[60] = { 0 };

	//将第二、三行数字统一放到一个数组中
	for (i = 0; i < m + n; i++)
	{
		scanf("%d", &arr[i]);
	}

	//对arr数组排序
	int j = 0;
	//我使用的是冒泡排序
	for (i = 0; i < m + n - 1; i++)
	{
		for (j = 0; j < m + n - i - 1; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}

	//打印
	for (i = 0; i < m + n; i++)
	{
		printf("%d ", arr[i]);
	}
	return 0;
}

13.2 方法二:

#include<stdio.h>
int main()
{
	int i, j, n, m;
	//接收n、m的值
	scanf("%d %d", &n, &m);
	int arr1[30] = { 0 };
	int arr2[30] = { 0 };
	int arr3[60] = { 0 };
	
	//接收第二行的数字
	for (i = 0; i < n; i++)
		scanf("%d", &arr1[i]);
	//接收第三行的数字
	for (i = 0; i < m; i++)
		scanf("%d", &arr2[i]);

	int k = 0;//用来记录新数组的下标
	
	//循环条件:两个下标都没有走完
	for (i = 0, j = 0; arr1[i] != '\0' && arr2[j] != '\0';)
	{
		//比较大小,小的放入新数组中
		if (arr1[i] <= arr2[j])
		{
			arr3[k] = arr1[i++];
			//上面的式子等价于
			//arr3[k] = arr1[i];
			//i++;
		}
		else
		{
			arr3[k] = arr2[j++];
			//上面的式子等价于
			//arr3[k] = arr2[j];
			//j++;
		}

		k++;//新数组下标向后走一格
	}

	//情况1
	if (i == n)
	{
		while (j < m)
		{
			arr3[k++] = arr2[j++];
			//上面的式子等价于
			//arr3[k] = arr2[j];
			//k++;
			//j++;
		}
	}

	//情况2
	if (j == n)
	{
		while (i < n)
		{
			arr3[k++] = arr1[i++];
			//上面的式子等价于
			//arr3[k] = arr1[i];
			//k++;
			//i++;
		}
	}

	//打印
	for (i = 0; i < n + m; i++)
	{
		printf("%d ", arr3[i]);
	}
}

结语

请给自己些耐心,一口吃不成胖子。
山外青山楼外楼,莫把百尺当尽头。
保持空杯心态加油努力吧!


都看到这里啦!真棒(*^▽^*)

可以给作者一个免费的赞赞吗,这将会鼓励我继续创作,谢谢大家

编程小白写作,如有纰漏或错误,欢迎指正


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月临水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值