当前位置: 首页 > article >正文

二级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.kler.cn/a/527289.html

相关文章:

  • Day52:range()函数
  • 【Proteus仿真】【51单片机】多功能计算器系统设计
  • YOLOv8源码修改(4)- 实现YOLOv8模型剪枝(任意YOLO模型的简单剪枝)
  • Qt中json的使用
  • C++模板初识
  • 中国股市“慢牛”行情的实现路径与展望
  • 【C语言】内存管理
  • 洛谷P2651 添加括号III
  • 我的创作纪念日——成为创作者的 第365天(1年)
  • Spring RESTful API 设计与实现
  • 使用openAI与Deepseek的感受
  • 安心即美的生活方式
  • 2025-1-26-sklearn学习(46) 无监督学习: 寻求数据表示 空伫立,尽日阑干倚遍,昼长人静。
  • Native Memory Tracking 与 RSS的差异问题
  • 验证二叉搜索数(98)
  • 【算法】动态规划专题① ——线性DP python
  • 理解动手学深度学习的自编包d2l
  • 青少年编程与数学 02-008 Pyhon语言编程基础 05课题、数据类型
  • 【Elasticsearch】match_bool_prefix 查询 vs match_phrase_prefix 查询
  • DeepSeek的使用技巧介绍
  • SARIMA介绍
  • 【TCP协议】流量控制 滑动窗口
  • 高速PCB设计指南5——电磁干扰和电磁兼容
  • CSDN的历史
  • Flink Connector 写入 Iceberg 流程源码解析_confluent icebergsinkconnector
  • git push到远程仓库时无法推送大文件