C语言日常练习 Day17

目录

一、找出一个二维数组的鞍点

二、有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中的英文大写字母、小写字母、数字、空格以及其他字符的个数

三、有一行电文,已按下面规律编译成密码:A->Z,a->z,B->Y,b->y,即第1个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求编程将密码译回原文,并输出密码和原文。


一、找出一个二维数组的鞍点

即该位置上的元素在该行上最大、在该列上最小,也可能没有鞍点。

  1. 先找出每行最大的值
  2. 再比较每行最大的值是否是该列最小的值

代码如下:

cpp 复制代码
#include<stdio.h>

int main()
{
	int arr[20][20];
	int n,m;
	scanf("%d %d",&n,&m);
	int i,j,count=0,max;
	int temp_i,temp_j;
	for(i=0;i<n;i++)
	{
		for(j=0;j<m;j++)
		{
			scanf("%d",&arr[i][j]);
		}
	}
	for(i=0;i<n;i++)
	{
		
		max=arr[i][0];
		for(j=0;j<m;j++)
		{
			if(max<arr[i][j])
			{
				max=arr[i][j];
				temp_j=j;
			}
		}
		//判断arr[i][temp_j]是否是arr[0][temp_j]...... arr[k][temp_j]中最小的
		int flag=1;
		int k;
		for(k=0;k<n;k++)
		{
			if(arr[k][temp_j]<max)
			{
				flag=0;
                break;
			}
		}
		if(flag==1)
		{
			printf("坐标为(%d,%d)的值:%d是鞍点\n",i,temp_j,arr[i][temp_j]);
			count++;
		}
		
	}
	if(count==0)
	{
		printf("404not found\n");
	}
	return 0;
}

运行结果如下:

二、有一篇文章,共有3行文字,每行有80个字符。要求分别统计出其中的英文大写字母、小写字母、数字、空格以及其他字符的个数

代码如下:

cpp 复制代码
#include<stdio.h>

int main()
{
	char arr[3][80]={0};
	int i,j;
	int big_word=0,small_word=0,number=0,space=0,other=0;
	for(i=0;i<3;i++)
	{
		gets(arr[i]);
	}
	for(i=0;i<3;i++)
	{
		for(j=0;arr[i][j]!='\0';j++)
		{
			if(arr[i][j]>='A'&&arr[i][j]<='Z')
			{
				big_word++;
			}
			else if(arr[i][j]>='a'&&arr[i][j]<='z')
			{
				small_word++;
			}
			else if(arr[i][j]==" ")
			{
				space++;
			}
			else if(arr[i][j]>='0'&&arr[i][j]<='9')
			{
				number++;
			}
			else
			{
				other++;
			}
		}
	}
	printf("大写字母:%d,小写字母:%d,数字:%d,空格:%d,其他字符:%d",big_word,small_word,number,space,other);
	return 0;
}

测试用例:

??123

ABCnihao

>>

运行结果如下**(如果输入的是中文输入法下的其他字符,比如:?其他字符会记数为2)**:

三、有一行电文,已按下面规律编译成密码:A->Z,a->z,B->Y,b->y,即第1个字母变成第26个字母,第i个字母变成第(26-i+1)个字母,非字母字符不变。要求编程将密码译回原文,并输出密码和原文。

题目的关键在于解密 ,解密的表达式我们可以写为**'A' + (25 - (si - 'A'))**

让我们分解这个表达式来理解它是如何工作的:

  1. s[i] - 'A' :这个子表达式计算当前字符 s[i] 与大写字母 'A' 之间的ASCII码差值。因为ASCII码是连续的,并且 'A' 的ASCII码是65,所以如果 s[i] 是 'B',那么 s[i] - 'A' 的结果就是 1(因为 'B' 的ASCII码是66)。

  2. 25 - ... :然后,从这个差值中减去 25。这是因为加密规则是将第 i 个字母映射到第 26-i+1 个字母。但是,由于我们已经通过 s[i] - 'A' 得到了从 0 开始的索引(对于 'A' 是 0,'B' 是 1,依此类推),我们需要做的是找到这个索引对应的"反向"索引。由于字母表有 26 个字母,所以 25 - (s[i] - 'A') 实际上是在计算从 'Z' 开始往回数的位置。

  3. 'A' + ...:最后,我们将上一步的结果加上 'A' 的ASCII码。这是因为我们想要得到的是解密后的大写字母的ASCII码。由于我们已经计算出了从 'Z' 往回数的位置,加上 'A' 的ASCII码就会将我们带回到字母表的正确位置。

举个例子,如果 s[i] 是 'Z'(ASCII码为90),那么:

  • s[i] - 'A' = 90 - 65 = 25
  • 25 - 25 = 0
  • 'A' + 0 = 'A'

所以,'Z' 被正确地解密回 'A'。

代码如下:

cpp 复制代码
#include<stdio.h>
int main()
{
	char s[100]={0};
	gets(s);
	printf("password is:%s\n", s);
	int i;
	while(s[i])
	{
		if(s[i]>='a'&&s[i]<='z')
		{
			s[i]='a' + (25 - (s[i] - 'a')) ;
		}
		else if(s[i]>='A'&&s[i]<='Z')
		{
			s[i]='A'+(25-(s[i]-'A') );
		}
		i++;
	}
	printf("original text is :%s",s);
	return 0;
}

运行结果如下:

测试用例:

I am

相关推荐
晴天的雨.9928 小时前
【C++算法】和为s的两个数
开发语言·数据结构·c++·算法
IvanCodes13 小时前
Python 数据处理(十三):JSON、CSV 与数据序列化
开发语言·python
aramae14 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
荆棘鸟智能15 小时前
城市感知设备怎么统一接入?从多协议网关到设备模型的中间件架构设计
人工智能·算法·边缘计算
无敌贵点大王15 小时前
RTThread学习记录11——RT-Thread 设备模型吃透:UART/ADC/PWM/PIN 到底有什么区别?
c语言·stm32·学习·链表
Logic10116 小时前
C语言/数据结构位运算题解:异或XOR找出时尚聚会中的“独特颜色“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质
qq_25183645717 小时前
springboot vue3 开发实现 拼豆管理系统
java·开发语言·ai编程
郑州光合科技余经理18 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
知识分享小能手18 小时前
C++ 学习教程,从入门到精通,C++ 入门知识 — 完整知识点(1)
开发语言·c++·学习
+VX:Fegn089518 小时前
计算机毕业设计|基于springboot + vue旅游管理系统(源码+数据库+文档)
java·开发语言·vue.js·spring boot·课程设计