欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 艺术 > C语言日常练习 Day17

C语言日常练习 Day17

2024/10/24 11:24:52 来源:https://blog.csdn.net/m0_65544927/article/details/141261169  浏览:    关键词:C语言日常练习 Day17

目录

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

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

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


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

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

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

代码如下:

#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个字符。要求分别统计出其中的英文大写字母、小写字母、数字、空格以及其他字符的个数

代码如下:

#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 - (s[i] - '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'。

 代码如下:

#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 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com