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

news/2025/2/2 23:51:30 标签: 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语言


http://www.niftyadmin.cn/n/5840378.html

相关文章

玉米苗和杂草识别分割数据集labelme格式1997张3类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;1997 标注数量(json文件个数)&#xff1a;1997 标注类别数&#xff1a;3 标注类别名称:["corn","weed","Bean…

【Redis】set 和 zset 类型的介绍和常用命令

1. set 1.1 介绍 set 类型和 list 不同的是&#xff0c;存储的元素是无序的&#xff0c;并且元素不允许重复&#xff0c;Redis 除了支持集合内的增删查改操作&#xff0c;还支持多个集合取交集&#xff0c;并集&#xff0c;差集 1.2 常用命令 命令 介绍 时间复杂度 sadd …

跨组织环境下 MQTT 桥接架构的评估

论文标题 中文标题&#xff1a; 跨组织环境下 MQTT 桥接架构的评估 英文标题&#xff1a; Evaluation of MQTT Bridge Architectures in a Cross-Organizational Context 作者信息 Keila Lima, Tosin Daniel Oyetoyan, Rogardt Heldal, Wilhelm Hasselbring Western Norway …

微信小程序1.3 开发工具的使用

内容提要 1.1 创建项目 1.2 开发者工具界面 1.3 模拟器区域 创建项目 开发者工具界面 模拟器区域

windows蓝牙驱动开发-查询蓝牙接口

蓝牙驱动程序堆栈会公开以下接口&#xff0c;配置文件驱动程序可使用这些接口与蓝牙设备交互。 GUID_BTHDDI_SDP_NODE_INTERFACE&#xff1a; 配置文件驱动程序会查询 GUID_BTHDDI_SDP_NODE_INTERFACE 以获取指向允许其创建服务发现协议 (SDP) 记录的函数的指针。此接口对应于…

PostgreSQL 数据查询操作(排序、筛选、连接、分组、子查询)

&#xff08;1&#xff09;排序查询与筛选查询操作 排序查询使用ORDER BY&#xff0c;对某个表中的列1按照列升序&#xff08;ASC&#xff0c;默认升序&#xff09;或降序&#xff08;DESC&#xff09;排序&#xff0c;排序后展示列1和列2两列。此外&#xff0c;也可以按照多列…

【数据结构-前缀树】力扣208. 实现 Trie (前缀树)

Trie&#xff08;发音类似 “try”&#xff09;或者说 前缀树 是一种树形数据结构&#xff0c;用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景&#xff0c;例如自动补全和拼写检查。 请你实现 Trie 类&#xff1a; Trie() 初始化前缀树对象。 void…

代码随想录 Day 15 | 【第六章 二叉树】110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和、222.完全二叉树的节点个数

一、110.平衡二叉树 再一次涉及到&#xff0c;什么是高度&#xff0c;什么是深度&#xff0c;可以巩固一下。 题目链接/文章讲解/视频讲解&#xff1a;代码随想录 1. 整体逻辑 一棵高度平衡二叉树定义为平衡二叉树 是指该树所有节点的左右子树的高度相差不超过 1。通过比较两两…