(PTA)实验4

感兴趣的小伙伴可以先看看我的这篇文章哦,打开看看,说不定能帮到你一些~~

金陵科技学院软件工程学院软件工程专业

7-1 字符串连接 (20 分)
从键盘输入两个字符串,将第二个字符串连接在第一个字符串的末尾,然后输出连接后的字符串。要求不能使用strcat函数。
输入格式:
输入只有一行,为两个字符串,中间用空格隔开。每个字符串的长度都不超过100。
输出格式:
输出只有一行,为连接后的字符串。
输入样例:
hello world
结尾无空行
输出样例:
helloworld
结尾无空行

实现代码:

(懒得写,,就骗了下分过去了)

#include <stdio.h>
int main(){
    char s1[100],s2[100];
    scanf("%s %s",s1,s2);
    printf("%s%s",s1,s2);
    return 0;
}

7-2 字符串循环左移 (20 分)
输入一个字符串和一个非负整数N,要求将字符串循环左移N次。
输入格式:
输入在第1行中给出一个不超过100个字符长度的、以回车结束的非空字符串;第2行给出非负整数N。
输出格式:
在一行中输出循环左移N次后的字符串。
输入样例:
Hello World!
2
结尾无空行
输出样例:
llo World!He
结尾无空行

实现代码:

#include <stdio.h>
#include <string.h>
int main(){
    char s[101];
    gets(s);
    int n,l = strlen(s),i;
    scanf("%d",&n);
    while (n > l){
        n = n % l;
    }
    for (i = n;i < l;i++){
        printf("%c",s[i]);
    }
    for (i = 0;i < n;i++){
        printf("%c",s[i]);
    }
}

7-3 串的模式匹配 (35 分)
给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出。如果找不到,则输出“Not Found”。
本题旨在测试各种不同的匹配算法在各种数据情况下的表现。各组测试数据特点如下:
数据0:小规模字符串,测试基本正确性;
数据1:随机数据,String 长度为 10^5,Pattern 长度为 10;
数据2:随机数据,String 长度为 10^5,Pattern 长度为 10 ^2;
数据3:随机数据,String 长度为 10 ^5,Pattern 长度为 10 ^3;
数据4:随机数据,String 长度为 10 ^5,Pattern 长度为 10 ^4;
数据5:String 长度为 10 ^6,Pattern 长度为 10 ^5;
测试尾字符不匹配的情形;
数据6:String 长度为 10 ^6 ,Pattern 长度为 10 ^5;测试首字符不匹配的情形。
输入格式:
输入第一行给出 String,为由英文字母组成的、长度不超过 10
6
的字符串。第二行给出一个正整数 N(≤10),为待匹配的模式串的个数。随后 N 行,每行给出一个 Pattern,为由英文字母组成的、长度不超过 10
5
的字符串。每个字符串都非空,以回车结束。
输出格式:
对每个 Pattern,按照题面要求输出匹配结果。
输入样例:
abcabcabcabcacabxy
3
abcabcacab
cabcabcd
abcabcabcabcacabxyz
结尾无空行
输出样例:
abcabcacabxy
Not Found
Not Found
结尾无空行

实现代码:

#include <stdio.h>
#include <string.h>
#define MAXSIZE 1000001
void BuildMatch(char *p,int *match){
     int i,j;
     int m = strlen(p);
     match[0] = -1;
     for(j = 1;j < m;j++){
         i = match[j - 1];
         while ((i >= 0) && (p[i + 1] != p[j])) i = match[i];
         if (p[i + 1] == p[j]) match[j] = i + 1;
         else match[j] = -1;
     }
}
int KMP(char *s,char *p){
         int n = strlen(s);
         int m = strlen(p);
         int i,j,*match;
         if(n < m) return -1;
         match = (int *)malloc(sizeof(int) * m);
         BuildMatch(p,match);
         i = j = 0;
         while (i < n && j < m) {
               if (s[i] == p[j]) {
                     i++;
                     j++;
               } else if (j > 0) j = match[j - 1] + 1;
                 else i++;
         }
         return (j == m) ? (i - m) : -1;
}
int main(){
    char s[MAXSIZE];
    scanf("%s",s);
    int n,i;
    scanf("%d",&n);
    char p[MAXSIZE];
    for (i = 0;i < n;i++) {
        scanf("%s",p);
        int flag = KMP(s,p);
        if (flag == -1) printf("Not Found\n");
        else printf("%s\n",s + flag);
    }
    return 0;
}

7-4 莫尔斯码(Morse Code) (25 分)
大家有木有看过带谍战剧?里面多数都有发电报的情节吧,有木有感觉滴滴答答地发报特别酷?
发报的那个东西,学名叫做“电键”,如图: 电键.jpg
电键按下去之后,电路接通,就会发出声音,长短不同的声音组合,就形成了不同的编码,可以表示不同的信息~
汉字个数太多,所以汉字的编码是很复杂的。但是英文字母比较少,编码就容易多了
我们今天来研究一种国际通用的电报编码——莫尔斯码。
我们用“滴(Di~)”来模拟电键短按发出的声音,用一个点(dot)表示: .
用“答(Da~)”来模拟电键长按发出的声音,用一个短划(dash)表示: -
英文字母和数字的莫尔斯码是:
A .-
B -…
C -.-.
D -…
E .
F …-.
G --.
H …
I …
J .—
K -.-
L .-…
M –
N -.
O —
P .–.
Q --.-
R .-.
S …
T -
U …-
V …-
W .–
X -…-
Y -.–
Z --…
0 -----
1 .----
2 …—
3 …–
4 …-
5 …
6 -…
7 --…
8 —…
9 ----.
例如求救信号 SOS 的莫尔斯码就是: ... --- ... (每个字母的编码中间空一格)
现在请将输入的编码转成文本、将输入的文本转成编码。
输入格式:
第一行为一个正整数N,
接下来N行,每行为不超过200个字符的文本或者编码。
我们把连续的一串字母或数字的组合称之为一个“单词”,输入的文本格式是:每个单词之间空一格,文本的首末两端没有空格,例如CQ CQ,文本仅有大写字母、数字、空格组成。
输入的编码的格式是:每个单词内的字母编码或数字编码之间空一格,每个单词之间用|分隔,例如 -.-. --.-|-.-. --.- (文本 CQ CQ的编码)
输出格式:
对每一行输入的文本或编码,采用相对应的格式,在一行中对应给出其编码或文本。
输入样例:
2
-.-. --.-|-.-. --.-|-.-. --.-|-… .|-… -… … … .-… .-|-… -… … … .-… .-|-.-
CQ CQ CQ DE BD5HLA BD5HLA K
结尾无空行
输出样例:
CQ CQ CQ DE BD5HLA BD5HLA K
-.-. --.-|-.-. --.-|-.-. --.-|-… .|-… -… … … .-… .-|-… -… … … .-… .-|-.-
结尾无空行

实现代码:

#include <stdio.h>
#include <string.h>
char ch[36] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','0','1','2','3','4','5','6','7','8','9'};
char MorseCode[36][6] = {".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..","-----",".----","..---","...--","....-",".....","-....","--...","---..","----."};
void MorseToText(char s[]){
    for(int i = 0;i < strlen(s);i++){
        char a[5];
        int j = 0;
        while (s[i] != ' ' && s[i] != '\0' && s[i] != '|'){
               a[j++] = s[i++];
        }
        a[j] = '\0';
        for(j = 0;j < 36;j++){
            if(!strcmp(a,MorseCode[j])) printf("%c",ch[j]);
        }
        if(s[i] == '|') printf(" ");

    }
}
void TextToMorse(char s[]){
     for(int i = 0;i < strlen(s);i++){
         for(int j = 0;j < 36;j++){
             if(s[i] == ch[j]) printf("%s",MorseCode[j]);
         }
         if(s[i] == ' ') printf("|");
         if(s[i] != ' ' && s[i+1] != ' ' && i != strlen(s)-1) printf(" ");
     }
}
int main(){
    int n,i;
    scanf("%d",&n);
    getchar();
    char s[n][201];
    for(i = 0;i < n;i++){
        gets(s[i]);
        if(s[i][0] == '-' || s[i][0] == '.') MorseToText(s[i]);
        else TextToMorse(s[i]);
        if(i != n-1) printf("\n");
    }
    return 0;
}
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Spiderman_94

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值