红枣豚骨靓汤 2021-11-07 15:28 采纳率: 100%
浏览 99
已结题

输入的多个字符串解密

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

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

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

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

请仔细阅读输出要求。

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

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

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

 比较规则:现有两个字符串s1s2进行比较

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

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

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

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

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

             当"AndAnd""CidCid"相比较时,应输出 -25 的和即"33".

        ③当两个字符串不等长时,按短的计算,即如"AndABCDEFAndABCDEF""CidCid"相比较时,结果仍然为"33"

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

 解密规则:

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

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

                    例如:若key=2key=2,则字符AZAZ应该解密为CBCB ; 若key=-2key=−2,则字符AZAZ应该解密为YXYX

样例
输入复制
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

题目如上,C语言解题,有大佬看看吗

  • 写回答

2条回答 默认 最新

  • 从善若水 5G/6G通信领域优质创作者 2021-11-07 16:10
    关注
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    
    void calcu_count(char *s ,int *upper,int *lower,int *number,int *blank,int *other)
    {
        for(int i=0;i<strlen(s);++i)
        {
            if(isupper(s[i]))
                ++(*upper);
            else if(islower(s[i]))
                ++(*lower);
            else if(isdigit(s[i]))
                ++(*number);
            else if(isblank(s[i]))
                ++(*blank);
            else
                ++(*other);
        }
    }
    
    int calcu_key(char *str1 , char *str2)
    {
        int len = strlen(str1)>strlen(str2)?strlen(str2):strlen(str1);
        int key=0;
        for(int i=0;i<len;++i)
            key+=str1[i]-str2[i];
        
        return key;
    }
    
    void print_text(char *s ,int key)
    {
        for(int i=0;i<strlen(s);++i)
        {
            if(isupper(s[i])){
                while(key<0) key+=26;
                if((s[i]+key) > 'Z')
                    printf("%c",'A'+((s[i]+key)-'Z')-1);
                else
                printf("%c",(s[i]+key));
            }else if(isblank(s[i])){
                printf(" ");
            }else ;
        }
    }
    
    int main()
    {
        char line1_1[100];
        char line1_2[100];
    
        char line2[200];
        char line3[200];
    
        int upper=0,lower=0,number=0,blank=1,other=0,key=0;
    
        scanf("%s %s",line1_1,line1_2);
        getchar();
        gets(line2);
        gets(line3);
    
        calcu_count(line1_1,&upper,&lower,&number,&blank,&other);
        calcu_count(line1_2,&upper,&lower,&number,&blank,&other);
        calcu_count(line2,&upper,&lower,&number,&blank,&other);
        calcu_count(line3,&upper,&lower,&number,&blank,&other);
        
        printf("%d %d %d %d %d\n",upper,lower,number,blank,other);
        
        key = calcu_key(line1_1 , line1_2);
        printf("%d\n",key);
    
        print_text(line2 ,key);
        printf("\n");
        print_text(line3 ,key);
    
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月15日
  • 已采纳回答 11月7日
  • 创建了问题 11月7日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装