​​1050 - 6.5 字符操作

有一篇加密后的文章,由三行组成。

第一行是以空格分割的两个字符串

第二、三行是由 大小写字母数字空格以及其它字符 构成的文章,称为密文正文

请编写程序,使该程序能根据输入输出符合输出要求的内容。

请仔细阅读输出要求。

输入

符合要求的文章,可参见样例。

输出

Ⅰ.第一行:分别统计该文章中三行总共英文大写字母小写字母数字空格以及其它字符的个数。并按顺序输出,输出的数字之间以空格分割。

Ⅱ.第二行:将第一行的两个字符串进行比较(注:此比较规则不同于strcmp函数),输出比较后的值,称此值为keykeykey。

     比较规则:现有两个字符串s1和s2进行比较

             ①若s1>s2,输出一个正数;若s1=s2,输出0;若s1<s2,输出一个负数。

             ②输出的正数或者负数的绝对值应是相比较的两个字符串相应字符的ASCII码的差值之和

                例如“AAA”与“CCC”相比,由于“A” < “C”,应该输出负数,因“A”与“C”的ASCII码差值为2,故应输出"−2-2−2"。

                当"AAAAAA"与"CCCCCC"相比时,应输出 -2 与 -2 的和即"−4-4−4"。

                同理:“AndAndAnd”和“AidAidAid”比较,根据第二个字符比较的结果,"n"比"i"大5,因此输出"555"。

                 当"AndAndAnd"和"CidCidCid"相比较时,应输出 -2 与 5 的和即"333".

            ③当两个字符串不等长时,按短的计算,即如"AndABCDEFAndABCDEFAndABCDEF"与"CidCidCid"相比较时,结果仍然为"333"。

Ⅲ.第三、四行:将密文正文进行解密,按行输出解密后的文章。

     解密规则:

                    ①将密文正文的除英文大写字母空格以外的字符删除。

                    ②将密文正文的所有英文大写字母字母表顺序移动keykeykey个位置。

                        例如:若key=2key=2key=2,则字符AZAZAZ应该解密为CBCBCB ; 若key=−2key=-2key=−2,则字符AZAZAZ应该解密为YXYXYX

样例

输入

7cVvbj12TWl%HwL YJwK77YULEg^i2QwbnCb2HD
42fb5qg^cJm M^rfgPlv5Wvs^*Fpcib^gsm%4lfrn
O5Vkwxm?rBr?zjgcba90uhybonyxB3fs6ab7d

输出

25 62 18 2 10
25
I LOVE
NUAA

输入

AAAAA ZZZZZ
X F T A
XFTA

输出

18 0 0 4 0
-125
C K Y F
CKYF

//以下解答已AC,但对于 不同的key 解密过于复杂,有时间看看有没有更好解法

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define STRINGLENGTH 100

char str1[STRINGLENGTH];
char str2[STRINGLENGTH];
char str3[STRINGLENGTH];
char str4[3 * STRINGLENGTH];//用来存储连接的三个串
char s1[STRINGLENGTH]; //用来放置第一个串的两个子串
char s2[STRINGLENGTH];

void count(char str[]);
void decode(char str[], int key);

int main()
{
	//输入字符串
	gets(str1);
	gets(str2);
	gets(str3);
	//将三个字符串连接起来
	strcat(str4, str1);
	strcat(str4, str2);
	strcat(str4, str3);
	//统计连接后的字符串
	count(str4);
	//比较第一行中的两个字符串
	int str1length = strlen(str1);
	int flag = 1;
	int j = 0;
	for (int i = 0; i < str1length; i++ ) {

		if (!isspace(str1[i])) //以空格为界分隔字符串
			if (flag) s1[i] = str1[i];
			else s2[j++] = str1[i];
		else {
			flag = 0;
			continue;
		}


	}
	//比较分隔的子串
	int s1len = strlen(s1);
	int s2len = strlen(s2);
	int len = s1len > s2len ? s2len : s1len; //取字符串短的长度
	int key = 0; //两子串字符差的和
	for (int i = 0; i < len; i++) {
		key +=  s1[i] - s2[i];
	}
	printf("%d\n", key);
	//将密文正文进行解密
	decode(str2, key);
	printf("%s\n", s1);
	decode(str3, key);
	printf("%s\n", s1);
	return 0;
}

//统计
void count(char str[])
{
	int length;
	int upper = 0; 		//大写字母计数
	int lower = 0;		//小写字母计数
	int digit = 0;		//数字计数
	int space = 0;		//空格计数
	int other = 0;		//其它计数

	length = strlen(str);

	for (int i = 0; i < length; i++) {
		if (isupper(str[i]))
			upper++;
		else if (islower(str[i]))
			lower++;
		else if (isdigit(str[i]))
			digit++;
		else if (isspace(str[i]))
			space++;
		else
			other++;
	}
	printf("%d %d %d %d %d\n", upper, lower, digit, space, other);

}


//解密
void decode(char str[] , int key)
{
	int length;
	int j = 0;
	length = strlen(str);

	for (int i = 0; i < length; i++) {
		if (isupper(str[i]) || isspace(str[i])) {
			s1[j++] = str[i];
		} else
			continue;
	}
	s1[j] = '\0';
	//根据key值变换
	int lens1 = strlen(s1);
	if (key < 0) {
		for (int i = 0; i < lens1; i++) {
			if (isupper(s1[i])) {
				char t = (s1[i] + 26 + key % 26) % 90;
				if (t <= 26)  s1[i] = 64 + t;
				else s1[i] = s1[i] + 26 + key % 26;
			}

		}

	} else {
		for (int i = 0; i < lens1; i++) {
			if (isupper(s1[i])) {
				char t = s1[i] + key % 26;
				if (t > 90)  s1[i] = 64 +t % 90;
				else s1[i] = t;
			}
		}
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值