1.(21)计算天数
输入y和m两个整数,y表示年,m表示月,计算y年m月有多少天,输出天数
2. 解题思路
这题只要在m=2时判断一下y是否为闰年就OK啦~
其他的应该没啥难的awa
3. 代码
#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;
}
4.(22)删除指定的数
先输入10个整数存放在数组中,再输入一个整数n,删除数组中所有等于n的数字,打印数组中剩余的数
例
输入:
1 2 3 4 5 6 7 8 9 0
6
输出:
1 2 3 4 5 7 8 9 0
5. 解题思路
定义两个指针 i 和 j
i从前往后走遍整个数组
j每走一步就判断一下当前指向的数字是否是要删除的数字
- 如果是,j 停下一步
- 如果不是,就让 j 指向的位置放上 i 指向的数字
6. 代码
#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;
}
7.(23)字符串拷贝
写一个函数,实现拷贝字符串的功能,拷贝内容包括字符串末尾的 \0 字符
输入一个字符串,要求输出拷贝后的字符串
8. 解题思路
利用while循环,遍历整个字符串,每个字符逐一拷贝
9. 代码
#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);
}
10.(24)合并有序数组
输入两个升序排序的序列,将两个序列合并为一个有序序列并输出。
输入包含三行,第一行包含两个正整数n,m用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。其中1<=n<=30,1<=m<=30。
第二行包含n,个整数,用空格分隔。
第三行包含m个整数,用空格分隔。
输出合并后的有序序列
11. 解题思路
11.1 方法一:
不管三七二十一先把这两个序列放到一个数组中,之后再利用冒泡、选择等等的排序方法把它变成有序数列。
11.2 方法二:
方法一虽然容易想到,但是运行效率却不怎么高。仔细观察题干,我们发现还有一个条件没用上:两个升序排序的序列。
这怎么才能用到这个条件呢?
我们可以同时遍历两个数组,挨个比较,哪个小,就将小的放在新数组里,并将小的下标向前走一格。两个数组下标对应的数字再进行比较。不断重复以上过程,直到有数组下标走完整个数组。
此时有以下几种情况
- 同时走完
- 第一个先走完
- 第二个先走完
情况1:
其实你仔细想想,情况一是不可能出现的~
情况2、3:
此时只要让那个没走完的数组后面的的元素逐一放到新数组中就OK了
12. 代码
12.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;
}
12.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]);
}
}