首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【C语言刷题】第九天:加量加餐继续,代码题训练,融会贯通IO模式

【C语言刷题】第九天:加量加餐继续,代码题训练,融会贯通IO模式

作者头像
艾莉丝努力练剑
发布2025-11-13 10:01:07
发布2025-11-13 10:01:07
960
举报
文章被收录于专栏:C / C++C / C++

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



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

正文

一、统计成绩

BC87 统计成绩

两种写法没有本质区别,都可以写——

写法(1):

代码语言:javascript
复制
#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):

代码语言:javascript
复制
#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们帮博主看看,主包用数组写的代码究竟错在哪里——

代码语言:javascript
复制
失败案例
#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;
}

二、密码验证

BC89 密码验证

这道题很简单,我们创建两个数组arr1和arr2,多组输入,题目要求用空格分开,我们学过字符函数和字符串函数的知识了,用strcmp比较arr1和arr2数组,等于0,说明两个字符串完全一样。

代码语言:javascript
复制
#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;
}

三、矩阵计算

BC90 矩阵计算

1、在输入的同时,将大于0的数求和。

代码语言:javascript
复制
#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;
}

四、逆序输出

BC92 逆序输出

很简单,我们先正序输入,再逆序输出,如下图——

代码语言:javascript
复制
#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;
}

我们拓展思考一下: 如果这个题不仅仅是逆序输出,而是要把数组中的数据逆序存放,又如何处理呢?

五、统计数据正负个数

BC93 统计数据正负个数

先看一个失败案例,大家看看为什么不对——

代码语言:javascript
复制
//失败案例
#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个数——

代码语言:javascript
复制
#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;
}

这道题没什么好讲的,当然,我们这里是合起来一起打印的,也可以分开——

代码语言:javascript
复制
#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;
}

六、N个数之和

BC94 N个数之和

这道题太简单了,我们不讲。只要按照题目要求分两行输入就可以了。

代码语言:javascript
复制
#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;
}

七、最高分与最低分之差

BC95 最高分与最低分之差

这道题, 我们之前已经做过类似的题目了,我们设一个最大值max和最小值min两个变量,很眼熟吧,之前做了一道去掉最大值、最小值让你算平均值的题目,这里同理。

代码语言:javascript
复制
#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;
}

八、有序序列判断

BC96 有序序列判断

1、题目中设置2个标记变量,flag1,flag2,满足相邻2个元素升序把flag1设置为1,满足相邻2个元 素降序把flag2设置为1.如果flag1和flag2都是1,那就是乱序。

代码语言:javascript
复制
#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;
}

九、 序列中删除指定数字

BC98 序列中删除指定数字

我们这里要考虑删除多个相同的数字怎么实现——

代码语言:javascript
复制
#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;
}

也可以这样写,博主这里增加了注释——

代码语言:javascript
复制
#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我们就没有存储,直接跳过去了。

十、 序列中整数去重

BC99 序列中整数去重

1、牛客网的通过代码大部分都是有问题的; 2、其他的看注释 。

代码语言:javascript
复制
#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;
}

十一、有序序列合并

BC100 有序序列合并

代码语言:javascript
复制
#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个数组中找较小的一次打印,等有一个数组中没有元素了,打印另外一个数组剩下的元素。

帮铸币主包看看,铸币主包这个存储的方法,为什么会是这个样子(哽咽)——

代码语言:javascript
复制
//不知道为什么错了
//存储的方法
#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;
}

兄弟们,主包是铸币,主包找到问题了——

代码语言:javascript
复制
//主包是铸币,空间给小了,越界了。。。
#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模式

结语:本篇文章带大家刷了十一道题目,大家认真思考一下,结合知识点就能想出来,大家一定要及时回顾前面刷过的题目。本文到这里就结束了,希望对友友们有所帮助。本文的代码相比起之前的题目,难度上已经有了加深,大家要上手操作,后面的代码题难度上整体是逐渐递增的,博主控制了难度,这样友友们能比较丝滑地上手敲下去。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-07-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 正文
    • 一、统计成绩
    • 二、密码验证
    • 三、矩阵计算
    • 四、逆序输出
    • 五、统计数据正负个数
    • 六、N个数之和
    • 七、最高分与最低分之差
    • 八、有序序列判断
    • 九、 序列中删除指定数字
    • 十、 序列中整数去重
    • 十一、有序序列合并
  • 结尾
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档