二级C语言题解:二维数组每行最大值与首元素交换、删除结构体的重复项、取出单词首字母

简介: 本教程专为C语言二级考生、中职学生及编程初学者设计,涵盖三大核心题型:二维数组每行最大值与首元素交换、结构体重复项删除(保留首个)、字符串单词首字母提取。含详细分析、易错点解析与标准代码,助你夯实基础、提升解题思维。

前言
本章讲解:二维数组每行最大值与首元素交换、删除结构体的重复项、取出单词首字母

适用人群:

  1. 要参加C语言二级
  2. 中职学生
  3. 想提升C语言编程思维
  4. C语言学习者

一、程序填空 --- 二维数组每行最大值与首元素交换

难度:

题目

函数 fun 的功能是:根据所给的二维数组,将二维数组每一行中的最大值,与该行中的第一个元素进行交换。

例如,如有二维数组:
51 27 44 50 99
74 58 28 62 84
45 75 71 97 76
51 35 72 67 46
91 34 42 73 32

则输出结果是:
99 27 44 50 51
84 58 28 62 74
97 75 71 45 76
72 35 51 67 46
91 34 42 73 32

请在程序的下划线处填入正确的内容并把下划线删除,使程序得出正确的结果。

注意:源程序存放在 BLANK1.C 中。不得增行或删行,也不得更改程序的结构!

代码如下:
1️⃣2️⃣3️⃣处填空

#include <stdio.h>
#define N 5
void fun(int a[N][N])
{
    int i,j,k,t;
    for(i=0;i<N;i++)   
    {
        /**********found**********/
        ____1️⃣____;
        for(j=1;j<N;j++)
        /**********found**********/
            if(a[i][j]>____2️⃣____)
                k=j;
        t=a[i][0];
        a[i][0]=a[i][k];  
        /**********found**********/
        ____3️⃣____ =t;   
    }
}
main()
{
    int i,j;
    int a[N][N]={
  {51,27,44,50,99},
                 {74,58,28,62,84},
                 {45,75,71,97,76},
                 {51,35,72,67,46},
                 {91,34,42,73,32}};
    fun(a);
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
            printf("%3d",a[i][j]);
        printf("\n");
    }
 }

分析

本题就是要找一行中最大的值,步骤如下:

  1. 假设每一行中的第一个为最大值
  2. 与同行其余值进行比较
  3. 找到最大值后进行交换

解答代码如下:

#include <stdio.h>
#define N 5
void fun(int a[N][N])
{
    int i,j,k,t;
    for(i=0;i<N;i++)   
    {
        /**********found**********/
        //由下方代码可知
        //这个k是控制列的
        //所以先假设第一个是最大值
        k = 1️⃣0;
        for(j=1;j<N;j++)
        /**********found**********/
        //找一行的最大值 
        if(a[i][j] > 2️⃣a[i][k])
                k=j;
        t=a[i][0];
        a[i][0]=a[i][k];  
        /**********found**********/
        //从上方两个语句可以知道这里是一个交换语句
        3️⃣a[i][k]=t;   
    }
}
main()
{
    int i,j;
    int a[N][N]={
  {51,27,44,50,99},
                 {74,58,28,62,84},
                 {45,75,71,97,76},
                 {51,35,72,67,46},
                 {91,34,42,73,32}};
    fun(a);
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
            printf("%3d",a[i][j]);
        printf("\n");
    }
 }

知识点 --- 交换语句

这里要记住的是这个交换语句,例如:

int a = 1, b = 2;
int t;
t = a;
a = b;
b = t;

这样就实现了变量a与变量b的交换,这里有个技巧就是:


二、程序修改 --- 删除结构体的重复项

难度:

题目

已知用户记录由账号和密码两项信息构成,N 名用户的数据已经存入结构体数组 a 中,函数 fun 的功能是:删除用户记录中账号重复的记录,如有多个重复账号记录,则保留第一个账号的用户记录。

请改正程序中的错误,使它能得到正确结果。

注意:不要改动 main 函数,不得增行或删行,也不得更改程序的结构。

代码如下:
在代码中找出3个错误并修改

#include <stdio.h>
#include <string.h>
#define N 10
struct user{
    char name[20];
    char password[20];
};
int  fun(struct user users[])
{
    int i=0,j,k;
    int n=N;
    while(i<n)
    {
    /**********found**********/
        j=0;
        while(j<n)
        {
            if(strcmp(users[i].name,users[j].name)==0)
                {
                    k=j;
    /**********found**********/
                    for(;k<n;k++)
    /**********found**********/
                        users[k]=users[k-1];
                    n--;
                }
            j++;
        }
        i++;
    }
    return n;
}
main()
{
    int i,n=N;
    struct user users[N]={
  {"zhang","skf"},{"li","kf123"},{"chen","df77dd"},{"zhang","tt186"},
                      {"ou","ou1236"},{"li","kk99qq"},{"sun","s9527"},{"guo","gg99"},
                      {"yu","qiqi11367"},{"li","ww8866"}};
    printf("删除用户记录中账号重复的记录之前:\n");
    for(i=0;i<n;i++)
        printf("%4d%20s%20s\n",i,users[i].name,users[i].password);
    printf("删除用户记录中账号重复的记录之后:\n");
    n=fun(users);
    for(i=0;i<n;i++)
        printf("%4d%20s%20s\n",i,users[i].name,users[i].password);
 }

分析

删除结构体中的重复项,也还好理解,就是要注意第2空和第3空要一起来看

解答代码如下:

#include <stdio.h>
#include <string.h>
#define N 10
struct user{
    char name[20];
    char password[20];
};
int  fun(struct user users[])
{
    int i=0,j,k;
    int n=N;
    while(i<n)
    {
    /**********found**********/
        //由下面字符串对比可知
        //j要从i的后一位开始
        j=i+1;
        while(j<n)
        {
            if(strcmp(users[i].name,users[j].name)==0)
                {
                    k=j;
    /**********found**********/
                    //由下方的赋值语句可知
                    //当前位置要被后一位赋值
                    //那么最后只要循环到倒数第二个就可以了
                    //也就是,倒数第一的赋值给倒数第二的位置
                    for(;k<n - 1;k++)
    /**********found**********/
                        users[k]=users[k+1];
                    n--;
                }
            j++;
        }
        i++;
    }
    return n;
}
main()
{
    int i,n=N;
    struct user users[N]={
  {"zhang","skf"},{"li","kf123"},{"chen","df77dd"},{"zhang","tt186"},
                      {"ou","ou1236"},{"li","kk99qq"},{"sun","s9527"},{"guo","gg99"},
                      {"yu","qiqi11367"},{"li","ww8866"}};
    printf("删除用户记录中账号重复的记录之前:\n");
    for(i=0;i<n;i++)
        printf("%4d%20s%20s\n",i,users[i].name,users[i].password);
    printf("删除用户记录中账号重复的记录之后:\n");
    n=fun(users);
    for(i=0;i<n;i++)
        printf("%4d%20s%20s\n",i,users[i].name,users[i].password);
 }

三、程序设计 --- 取出单词首字母

难度:⭐⭐⭐

题目

请编写函数 fun,fun 的功能是按顺序将形参 a 所指的字符串中每个单词的第一个字母取出,依次存放到形参 b 所指的字符串中去。

形参 a 所指的字符串中的单词以一个或多个空格进行分隔,字符串首部和尾部可以有一个或多个空格

代码如下
在fun函数中编写

#include <stdio.h>
#include <string.h>
void fun(char *a,char *b)
{
}
main()
{
    char a[50],b[50];
    gets(a);
    fun(a,b);
    puts(b);
}

分析

之前做过一道类似的:程序设计:提取单词尾部元素
而这道题是提取单词的第一个字母
这题思路还是差不多的,就是反着来

  1. 先取第一个单词的首字母
  2. 循环判断,空格后面是否是字母
    如果空格后面是字母,则表示为首部字母,就保存到b数组中

解答代码如下:

#include <stdio.h>
#include <string.h>
void fun(char *a,char *b)
{
    int i = 0,j = 0;
    //考虑到第一个单词前面可能有空格
    while( a[i] == ' ' ) i++;
    //因为第一个单词可以直接加
    b[j++] = a[i];
    while( a[i + 1] != '\0' )
    {
        if(a[i] == ' ' && a[i+1] != ' ')
        {
            b[j++] = a[i + 1];
        }
        i++;
    }
    b[j] = '\0';
}
main()
{
    char a[50],b[50];
    gets(a);
    fun(a,b);
    puts(b);
}

这里就是要注意,前面有空格的情况,使用while循环将空格跳过

希望这篇文章对您(* ̄︶ ̄)
专栏:二级C语言

目录
相关文章
|
21天前
|
缓存 人工智能 自然语言处理
阿里云qwen3.7-max模型详解:模型能力、价格、上下文限制及使用注意事项参考
本文介绍阿里云通义千问系列面向智能体时代的旗舰模型Qwen3.7-Max,系统梳理其作为综合能力最强的Max模型的核心特性与适用场景。该模型2026年5月推出基础文本版本,同年6月增强版引入原生图像与视频输入多模态能力,专为复杂智能体任务设计,在编程、办公自动化及长周期自主执行等高阶场景表现卓越。模型在全球五大区域同步部署,功能存在差异化(如批量推理仅限北京区域),支持百万级超长上下文与结构化输出等高级功能,同时提供清晰的梯度定价策略。
|
2月前
|
人工智能
Qwen3.8抢先体验!正式版即将发布并开源!
千问Qwen3.8即将开源,参数达2.4T,进化速度以“天”计,实力媲美Fable 5。预览版Qwen3.8-Max已上线阿里Token Plan等平台,限时优惠:日间Credits低至1折,夜间更优,个人/团队版月付仅35元起!
4549 147
|
21天前
|
Java 程序员 应用服务中间件
Maven之初识与安装
本文详解Maven安装与配置全流程:从基础概念、下载安装、环境变量配置到版本验证,助新手一次理清逻辑、顺利完成部署;涵盖一键构建、依赖管理核心功能,并提供交流支持。
145 0
Maven之初识与安装
|
21天前
|
人工智能 C语言
二级C语言题解:十进制转其他进制、非素数求和、重复数统计
本文详解三类经典编程题:十进制转任意进制(填空)、非素数求和(修改)与重复数字统计(设计),含完整代码、逐空分析及易错点解析,助你夯实C语言基础。
75 2
二级C语言题解:十进制转其他进制、非素数求和、重复数统计
|
21天前
|
存储 C语言
二级C语言题解:整数序列奇偶个数、拼接数字字符、数组取偶数并加小数点
本文详解C语言三道经典编程题:①统计整数序列中奇偶数个数并返回结构体;②提取字符串中数字字符拼接成整数;③筛选数组偶数并按原序拼接为“数字.”格式字符串。含完整代码、填空/修改/设计解析及易错点提醒。
80 1
二级C语言题解:整数序列奇偶个数、拼接数字字符、数组取偶数并加小数点
|
21天前
|
C语言 索引
二级C语言题解:迭代求根、字符串加法、字符串拆分
本文详解三道C语言编程题:①迭代法求平方根(牛顿法),误差≤1e-6;②字符串模拟大数加法,处理进位与字符数字转换;③字符串按索引模3拆分为三子串。含填空、修改、设计三类题型及完整解析代码。
74 1
二级C语言题解:迭代求根、字符串加法、字符串拆分
|
21天前
|
SQL Java 数据库连接
MyBatis 之基础概念与框架原理详解
MyBatis是一款轻量级半自动ORM框架,封装JDBC,让开发者专注SQL编写与业务逻辑;支持XML/注解配置、动态SQL、高级映射,SQL与代码分离,灵活高效,显著提升持久层开发效率。(239字)
86 1
MyBatis 之基础概念与框架原理详解
|
21天前
|
存储 C语言
C语言二级题解:查找字母以及其他字符个数、数字字符串转双精度值、二维数组上下三角区域数据对调
本文详解C语言二级考试三类典型题:统计字母及非字母字符个数、数字字符串转双精度浮点数、二维数组上下三角区域数据对调。含题目解析、错误定位与完整代码,适合备考学生、中职生及编程爱好者提升实战能力。
106 1
C语言二级题解:查找字母以及其他字符个数、数字字符串转双精度值、二维数组上下三角区域数据对调
|
21天前
|
缓存 运维 安全
阿里云ESA边缘安全加速免费领取:支持2个网站域名免费,通过宝塔面板快速领取指南
宝塔面板联合阿里云ESA推出免费CDN活动,可一键领取2个长期免费站点额度,支持中国大陆节点加速(需备案)、HTTPS加密、基础安全防护及面板内统一管理,降本增效,轻松上手。阿里云ESA官网:https://t.aliyun.com/U/AlRpfa
118 1
|
21天前
|
人工智能 数据挖掘 测试技术
每天都在“点点点”,功能测试的下一步到底在哪?
这是一篇面向功能测试工程师的深度职业指南:剖析“忙而无积累”的困境,指出焦虑根源并非工作量,而是缺乏可沉淀的技术能力与质量思维。文章以真实学员案例切入,倡导从高频重复场景(如登录支付链路)切入自动化,强调“先解决问题再选工具”,并提出用线上数据驱动测试、提升质量工程能力等进阶路径,助力测试人突破职业瓶颈。

热门文章

最新文章