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

embedded/2025/2/2 2:30:56/

目录

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

题目

分析

知识点 --- 交换语句

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

题目

分析

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

题目

分析


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

适用人群:

  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语言


http://www.ppmy.cn/embedded/158787.html

相关文章

MaxCompute—阿里云原生大数据计算机服务——SQL概述与服务支持

MaxCompute&#xff08;原名ODPS&#xff0c;Oriented Data Processing Service&#xff09;是阿里云提供的一款云原生大数据计算服务。它是一种基于SQL的全托管式大数据处理平台&#xff0c;允许用户在云端快速、简便地处理和分析海量数据。 什么是MaxCompute MaxCompute是适…

directx12 3d+vs2022游戏开发第三章 笔记五 变换

一、变换实质 总结来说就是通过矩阵和向量计算控制点变换&#xff0c;变换的效果可以实现局内物体的平移&#xff0c;旋转&#xff0c;缩放等一系列操作。 具体实现为先使用线性变换&#xff0c;即向量矩阵控制物体对于自身坐标系的旋转&#xff0c;缩放。 再使用仿射变换&a…

P1158

题意 就是给你机器的工作半径&#xff0c;每次工作要花钱&#xff0c;就是工作半径的平方&#xff0c;问你怎么花最少的钱&#xff0c;拦截所有导弹。 思路 每次通过我们的公式计算距离&#xff0c;存入并排序&#xff0c;最后即可得出答案。 代码 #include <bits/stdc…

STM32-时钟树

STM32-时钟树 时钟 时钟

Spring 面试题【每日20道】【其一】

1、Spring 当中什么是循环依赖&#xff08;常问&#xff09;&#xff1f; 中等 在Spring框架中&#xff0c;循环依赖&#xff08;Circular Dependency&#xff09;是指两个或多个bean互相之间直接或间接地依赖对方的注入。例如&#xff1a; A bean依赖于B bean。B bean又依赖…

react native i18n插值:跨组件trans

想要实现动态插值以及插入元素&#xff0c;如下效果 这个找了蛮久的&#xff0c;官网的例子在我这无效&#xff0c;所以网上找了比较久&#xff0c;没能理解用法。最后是在 github issue 中看到别人的用法&#xff0c;自己理解下实现出来了&#xff0c;所以这里记录下。 例如…

Learning Vue 读书笔记 Chapter 4

4.1 Vue中的嵌套组件和数据流 我们将嵌套的组件称为子组件&#xff0c;而包含它们的组件则称为它们的父组件。 父组件可以通过 props向子组件传递数据&#xff0c;而子组件则可以通过自定义事件&#xff08;emits&#xff09;向父组件发送事件。 4.1.1 使用Props向子组件传递…

Github 2025-01-30 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2025-01-30统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Ollama: 本地大型语言模型设置与运行 创建周期:248 天开发语言:Go协议类型:MIT LicenseStar数量:42421 个Fork数量:2724 次关注人…