
🔥个人主页:艾莉丝努力练剑 ❄专栏传送门:《C语言》、《数据结构与算法》、C语言刷题12天IO强训、LeetCode代码强化刷题 🍉学习方向:C/C++方向 ⭐️人生格言:为天地立心,为生民立命,为往圣继绝学,为万世开太平

前言:上一篇博客又带大家刷了一些相对来说简单的代码题目,本篇文章我们将继续练习下面的题目。这些题目的难度已经有的挖了大坑,大家做的时候要留意,如果做不出来,看了代码演示后要自己多敲几遍,去理解代码的逻辑。 宇宙安全声明:鉴于博主能力有限,本专栏适用于代码小白刷题,大佬们多多包涵(抱拳)!

两种写法没有本质区别,都可以写——
写法(1):
#include <stdio.h>
int main()
{
int n = 0;
int i = 0;
double max = 0.0;
double min = 100.0;
double sum = 0.0;
double score = 0.0;
scanf("%d",&n);
for(i = 0;i < n;i++)
{
scanf("%lf",&score);
sum += score;
if(score > max)
max = score;
if(score < min)
min = score;
}
printf("%.2lf %.2lf %.2lf",max,min,sum/n);
return 0;
}写法(2):
#include <stdio.h>
int main()
{
int n = 0;
int i = 0;
double max = 0.0;
double min = 100.0;
double sum = 0.0;
double avg = 0.0;
double score = 0.0;
scanf("%d",&n);
for (i = 0; i < n; i++)
{
scanf("%lf", &score);
sum += score;
if (score > max)
max = score;
if (score < min)
min = score;
}
avg = sum / n;
printf("%.2lf %.2lf %.2lf\n",max,min,avg);
return 0;
}说到这里,uu们帮博主看看,主包用数组写的代码究竟错在哪里——
失败案例
#include <stdio.h>
int main()
{
int n = 0;
int i = 0;
double max = 0.0;
double min = 100.0;
double sum = 0.0;
scanf("%d",&n);
double arr[] = {0};
for(i = 0;i < n;i++)
{
scanf("%lf",&arr[n]);
sum += arr[n];
if(arr[i] > max)
max = arr[n];
if(arr[i] < min)
min = arr[n];
}
printf("%.2lf %.2lf %.2lf",max,min,sum/n);
return 0;
}
这道题很简单,我们创建两个数组arr1和arr2,多组输入,题目要求用空格分开,我们学过字符函数和字符串函数的知识了,用strcmp比较arr1和arr2数组,等于0,说明两个字符串完全一样。
#include <stdio.h>
int main()
{
char password1[100] = {0};
char password2[100] = {0};
scanf("%s %s",password1,password2);
if(strcmp(password1,password2) == 0)
printf("same\n");
else
printf("different\n");
return 0;
}
1、在输入的同时,将大于0的数求和。
#include <stdio.h>
int main()
{
int n = 0;
int m = 0;
int num = 0;
int sum = 0;
scanf("%d %d",&n,&m);
{
int i = 0;
for(i = 0;i < n;i++)
{
int j = 0;
for(j = 0;j < m;j++)
{
scanf("%d",&num);
if(num > 0)
sum += num;
}
}
}
printf("%d\n",sum);
return 0;
}
很简单,我们先正序输入,再逆序输出,如下图——
#include<stdio.h>
int main()
{
int arr[100] = { 0 };
for(int i = 0;i <= 9;i++)
{
scanf("%d ",&arr[i]);
}
for (int i = 9; i >= 0; i--)
{
printf("%d ", arr[i]);
}
return 0;
}我们拓展思考一下: 如果这个题不仅仅是逆序输出,而是要把数组中的数据逆序存放,又如何处理呢?

先看一个失败案例,大家看看为什么不对——
//失败案例
#include <stdio.h>
int main()
{
int n = 0;
while(scanf("%d",&n) != EOF)
{
for(int i = 0;i < 10;i++)
{
if(n > 0)
{
printf("positive:%d",n);
}
else if(n < 0)
{
printf("negative:%d",n);
}
}
}
return 0;
}下面是正确示范,很简单,没什么好讲的。我们直接接收10个数——
#include <stdio.h>
int main()
{
int num = 0;
int positive = 0;
int negative = 0;
for(int i = 0;i < 10;i++)
{
scanf("%d",&num);
if(num >= 0)
positive++;
else
negative++;
}
printf("positive:%d\nnegative:%d",positive,negative);
return 0;
}这道题没什么好讲的,当然,我们这里是合起来一起打印的,也可以分开——
#include <stdio.h>
int main()
{
int i = 0;
int positive = 0;
int negative = 0;
int tmp = 0;
for (i = 0; i < 10; i++)
{
scanf("%d", &tmp);
if (tmp >= 0)
positive++;
else
negative++;
}
printf("positive:%d\n", positive);
printf("negative:%d\n", negative);
return 0;
}
这道题太简单了,我们不讲。只要按照题目要求分两行输入就可以了。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int N = 0;
scanf("%d\n", &N);
int num = 0;
int sum = 0;
for (int i = 0; i < N; i++)
{
scanf("%d ", &num);
sum += num;
}
printf("%d", sum);
return 0;
}
这道题, 我们之前已经做过类似的题目了,我们设一个最大值max和最小值min两个变量,很眼熟吧,之前做了一道去掉最大值、最小值让你算平均值的题目,这里同理。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int n = 0;
int min = 100;
int max = 0;
scanf("%d", &n);
int tmp = 0;
for (int i = 0; i < n; i++)
{
scanf("%d", &tmp);
if (tmp > max)
max = tmp;
if (tmp < min)
min = tmp;
}
printf("%d\n", max - min);
return 0;
}

1、题目中设置2个标记变量,flag1,flag2,满足相邻2个元素升序把flag1设置为1,满足相邻2个元 素降序把flag2设置为1.如果flag1和flag2都是1,那就是乱序。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int n = 0;
int arr[50] = { 0 };
scanf("%d", &n);
int flag1 = 0;//正序
int flag2 = 0;//降序
for (int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
if (i > 0)
{
if (arr[i] > arr[i - 1])
{
flag1 = 1;
}
else
{
flag2 = 1;
}
}
}
if (flag1 + flag2 == 1)
{
printf("sorted");
}
else
{
printf("unsorted");
}
return 0;
}

我们这里要考虑删除多个相同的数字怎么实现——
#include <stdio.h>
int main()
{
int n;
scanf("%d", &n);
int arr[50];
for (int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
int target;
scanf("%d", &target);
int newIndex = 0;
for (int i = 0; i < n; i++)
{
if (arr[i] != target)
{
arr[newIndex++] = arr[i];
}
}
for (int i = 0; i < newIndex; i++)
{
if (i > 0)
{
printf(" ");
}
printf("%d", arr[i]);
}
return 0;
}也可以这样写,博主这里增加了注释——
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
int arr[50] = {0};
//读取n个数字
for (int i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
//读取要删除的数字
int target = 0;
scanf("%d", &target);
//删除的动作
int newIndex = 0;
//记录存放数据位置的下标
for (int i = 0; i < n; i++)
{
if (arr[i] != target)
{
arr[newIndex++] = arr[i];
}
}
//此时的newIndex就是删除元素后数据的个数
for (int i = 0; i < newIndex; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
我们一个变量i用来遍历数组,博主给的代码里面用的是newIndex,画图画不下,所以就用 j 代替一下,j用来存储数组的位置。这个4我们就没有存储,直接跳过去了。

1、牛客网的通过代码大部分都是有问题的; 2、其他的看注释 。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int n = 0;
scanf("%d", &n);
int arr[1000] = { 0 };
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
//去重
for (i = 0; i < n; i++)
{
//判断arr[i]是否在后边出现
int j = 0;
for (j = i + 1; j < n; j++)
{
//先找出相同的元素
//如果相等,要把后续元素往前移动
if (arr[i] == arr[j])
{
//去重——后面的元素往前覆盖
int k = 0;
for (k = j; k < n - 1; k++)
{
arr[k] = arr[k + 1];
}
n--;
j--;
//如果去重了arr[j]
//把下一个位置的数字arr[j+1],放在新的arr[j]上
//恰好又和arr[i]相同,所以也要再判断
}
}
}
for (i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int n = 0;
int m = 0;
int arr1[1000] = { 0 };
int arr2[1000] = { 0 };
//输入
scanf("%d %d", &n, &m);
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr1[i]);
}
for (i = 0; i < m; i++)
{
scanf("%d", &arr2[i]);
}
//处理
int j = 0;
i = 0;
while (i < n && j < m)
{
if (arr1[i] < arr2[j])
{
printf("%d ", arr1[i]);
i++;
}
else
{
printf("%d ", arr2[j]);
j++;
}
}
if (i == n)
{
for (; j < m; j++)
{
printf("%d ", arr2[j]);
}
}
else
{
for (; i < n; i++)
{
printf("%d ", arr1[i]);
}
}
return 0;
}1、只是打印出合并后的结果,所以不需要存储; 2、先在2个数组中找较小的一次打印,等有一个数组中没有元素了,打印另外一个数组剩下的元素。
帮铸币主包看看,铸币主包这个存储的方法,为什么会是这个样子(哽咽)——
//不知道为什么错了
//存储的方法
#include <stdio.h>
int main()
{
int n = 0;
int m = 0;
int arr1[1000] = { 0 };
int arr2[1000] = { 0 };
int arr3[200] = { 0 };
//输出n和m
scanf("%d %d", &n, &m);
//输出两个升序序列
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d ", &arr1[i]);
}
for (i = 0; i < m; i++)
{
scanf("%d ", &arr2[i]);
}
//合并有序序列
i = 0;
int j = 0;
int k = 0;
while (i < n && j < m)
{
if (arr1[i] < arr2[j])
{
arr3[k++] = arr1[i++];
}
else
{
arr3[k++] = arr2[j++];
}
}
if (i == n)
{
for (; j < m; j++)
{
arr3[k++] = arr2[j];
}
}
else
{
for (; i < n; i++)
{
arr3[k++] = arr1[i];
}
}
//arr3打印
for (i = 0; i < k; i++)
{
printf("%d ", arr3[i]);
}
return 0;
}
兄弟们,主包是铸币,主包找到问题了——
//主包是铸币,空间给小了,越界了。。。
#include <stdio.h>
int main()
{
int n = 0;
int m = 0;
int arr1[1000] = { 0 };
int arr2[1000] = { 0 };
int arr3[1000] = { 0 };
//输出n和m
scanf("%d %d", &n, &m);
//输出两个升序序列
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d ", &arr1[i]);
}
for (i = 0; i < m; i++)
{
scanf("%d ", &arr2[i]);
}
//合并有序序列
i = 0;
int j = 0;
int k = 0;
while (i < n && j < m)
{
if (arr1[i] < arr2[j])
{
arr3[k++] = arr1[i++];
}
else
{
arr3[k++] = arr2[j++];
}
}
if (i == n)
{
for (; j < m; j++)
{
arr3[k++] = arr2[j];
}
}
else
{
for (; i < n; i++)
{
arr3[k++] = arr1[i];
}
}
//arr3打印
for (i = 0; i < k; i++)
{
printf("%d ", arr3[i]);
}
return 0;
}不知道uu们发现问题所在了没有?
往期回顾: 【C语言刷题】第八天:加量加餐继续,代码题训练,熟练IO模式 【C语言刷题】第七天:加量加餐继续,代码题训练,熟练IO模式 【C语言刷题】第六天:继续加量加餐,代码题训练,熟练IO模式 【C语言刷题】第五天:继续加量加餐,代码题训练,熟练IO模式 【C语言刷题】第四天:继续加量加餐,代码题入门,熟练IO模式 【C语言刷题】第三天:继续加量加餐,代码题入门,熟练IO模式 【C语言刷题】第二天:加量加餐,代码入门,熟悉IO模式 【C语言刷题】第一天:简单代码入门,熟悉IO模式
结语:本篇文章带大家刷了十一道题目,大家认真思考一下,结合知识点就能想出来,大家一定要及时回顾前面刷过的题目。本文到这里就结束了,希望对友友们有所帮助。本文的代码相比起之前的题目,难度上已经有了加深,大家要上手操作,后面的代码题难度上整体是逐渐递增的,博主控制了难度,这样友友们能比较丝滑地上手敲下去。