字符串练

本文介绍了三个编程题目,涉及字符串处理和排序算法。首先,讲解了如何修改程序实现古诗词的‘ong’韵糟改,利用fgets、strstr和strncpy函数。接着,展示了英文单词按长度排序的代码实现,运用了排序算法和strcpy。最后,阐述了如何从字符串A中删除所有字符串B包含的字符,重点在于字符串遍历和比较。这些实例深入浅出地展示了字符串操作和排序算法的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

敲笨钟程序

题目及代码

7-7 敲笨钟 (20分)
微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。为了增加敲钟的趣味性,还会糟改几句古诗词。其糟改的方法为:去网上搜寻压“ong”韵的古诗词,把句尾的三个字换成“敲笨钟”。例如唐代诗人李贺有名句曰:“寻章摘句老雕虫,晓月当帘挂玉弓”,其中“虫”(chong)和“弓”(gong)都压了“ong”韵。于是这句诗就被糟改为“寻章摘句老雕虫,晓月当帘敲笨钟”。

现在给你一大堆古诗词句,要求你写个程序自动将压“ong”韵的句子糟改成“敲笨钟”。

输入格式:
输入首先在第一行给出一个不超过 20 的正整数 N。随后 N 行,每行用汉语拼音给出一句古诗词,分上下两半句,用逗号 , 分隔,句号 . 结尾。相邻两字的拼音之间用一个空格分隔。题目保证每个字的拼音不超过 6 个字符,每行字符的总长度不超过 100,并且下半句诗至少有 3 个字。

输出格式:
对每一行诗句,判断其是否压“ong”韵。即上下两句末尾的字都是“ong”结尾。如果是压此韵的,就按题面方法糟改之后输出,输出格式同输入;否则输出 Skipped,即跳过此句。

输入样例:
5
xun zhang zhai ju lao diao chong, xiao yue dang lian gua yu gong.
tian sheng wo cai bi you yong, qian jin san jin huan fu lai.
xue zhui rou zhi leng wei rong, an xiao chen jing shu wei long.
zuo ye xing chen zuo ye feng, hua lou xi pan gui tang dong.
ren xian gui hua luo, ye jing chun shan kong.
输出样例:
xun zhang zhai ju lao diao chong, xiao yue dang lian qiao ben zhong.
Skipped
xue zhui rou zhi leng wei rong, an xiao chen jing qiao ben zhong.
Skipped
Skipped

#include<stdio.h>
#include<string.h>
int main(void) {
    int n;
    scanf("%d", &n);
    char str[200][5000];
    char ch1[] = "ong,", ch2[] = "ong.", ch3 []= { "qiao ben zhong." };
    getchar();//这两行不加的话 读取的str[0]的结果为输入n后的回车
    for (int i = 0; i < n; i++) {
        fgets(str[i], 200, stdin);
    }
    for (int i = 0; i < n; i++) {
        if (strstr(str[i], ch1) != NULL && strstr(str[i], ch2) != NULL) {
            int m = strlen(str[i]);
            int j=m,count=0,p;
            for( j;j>0;j--){
                if(str[i][j]==' '){
                    count++;
                }
                if(count==3){
                    p=m-j;
                    break;
                }
            }
            strncpy(&str[i][m-p+1], ch3, 200);
            printf("%s\n",str[i]);
        }
        else {
            printf("Skipped\n");
        }
    }
    return 0;
}

知识点

fgets

函数获取一行字符,fgets的参数有三个,可以通过第一个参数的不同类型,比如一维数组,获取任意行数据

char *  fgets(char * s, int n,FILE *stream);   //函数原型

warning:
fgets遇到第一个换行符会将其储存在字符串中,遇到回车就读取
在此例中,n后有一个回车,本例用getchar()获取单个字符的特性保存了’\n’,否则读取出错;

strstr

此函数定义在<string.h>标准库中

const char *my_strstr(const char *str, const char *sub_str)  

主要功能为在str1中查找是否包含str2子串,如果包含则返回str1中str2子串的首元素地址,否则返回NULL.
warning:
在使用或者处理strstr(str1,str2)返回值之前,切记不要对str1字符串进行更改,若要更改,应该等使用完返回值后再更改!!

strncpy

此函数定义在<string.h>标准库中
可以将其理解为覆盖而不是复制

char *strncpy(char *dest, const char *src, size_t n)

把 src 所指向的字符串复制到 dest,最多复制 n 个字符。当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充。
warning:
s1指向的应该是位置,其返回值为覆盖后的字符串

英文单词排序

题目及代码

本题要求编写程序,输入若干英文单词,对这些单词按长度从小到大排序后输出。如果长度相同,按照输入的顺序不变。

输入格式:
输入为若干英文单词,每行一个,以#作为输入结束标志。其中英文单词总数不超过20个,英文单词为长度小于10的仅由小写英文字母组成的字符串。

输出格式:
输出为排序后的结果,每个单词后面都额外输出一个空格。

输入样例:
blue
red
yellow
green
purple

输出样例:
red blue green yellow purple

#include<stdio.h>
#include<string.h>
int main(void){
    char str[20][10],ch[10],t[20];
    int n=0;
    while(1){
        scanf("%s",ch);
        if(ch[0]=='#'){
            break;
        }else{
            strncpy(str[n],ch,10);
            n++;
        }
    }
    for(int i=0;i<n-1;i++){
        for(int j=0;j<n-i-1;j++){
            if(strlen(str[j])>strlen(str[j+1])){
                strcpy(t,str[j]);
                strcpy(str[j],str[j+1]);
                strcpy(str[j+1],t);
            }
        }
    }
    for(int i=0;i<n;i++){
        printf("%s ",str[i]);
    }
    return 0;
}

知识点

排序算法
此例调用两次循环通过相邻单词间的字母比较进行排序
通过使用strcpy函数进行相邻易位
warning:
strncpy是strcpy的安全形式,少s3(字符数)

A-B

本题要求你计算A−B。不过麻烦的是,A和B都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串A−B。

输入格式:
输入在2行中先后给出字符串A和B。两字符串的长度都不超过10
​4
​​ ,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。

输出格式:
在一行中打印出A−B的结果字符串。

输入样例:
I love GPLT! It’s a fun game!
aeiou
输出样例:
I lv GPLT! It’s fn gm!

题目及代码

#include<stdio.h>
#include<string.h>
int main(void){
    char str1[100000],str2[100000];
    fgets(str1,100000,stdin);
    int m=strlen(str1);
    fgets(str2,100000,stdin);
    int len=strlen(str2),j;
    for(int i=0;str1[i]!='\0';i++){
        for( j=0;j<len;j++){
            if(str1[i]==str2[j]){
                break;
            }
        }
        if(j==len)
            printf("%c",str1[i]);
    }
    return 0;
}

知识点

核心为判断算法
worning:
切勿混淆使用strpbrk函数

char*strpbrk(const char*s1,const char*s2);

如果s1包含s2任意字符,函数返回指向s1字符串首字符位置的指针
若未找到,则返回空字符(NULL)

分数阶傅里叶变换(Fractional Fourier Transform, FRFT)是对传统傅里叶变换的拓展,它通过非整数阶的变换方式,能够更有效地处理非线性信号以及涉及时频局部化的问题。在信号处理领域,FRFT尤其适用于分析非平稳信号,例如在雷达、声纳和通信系统中,对线性调频(Linear Frequency Modulation, LFM)信号的分析具有显著优势。LFM信号是一种频率随时间线性变化的信号,因其具有宽频带和良好的时频分辨率,被广泛应用于雷达和通信系统。FRFT能够更精准地捕捉LFM信号的时间和频率信息,相比普通傅里叶变换,其性能更为出色。 MATLAB是一种强大的数值计算和科学计算工具,拥有丰富的函数库和用户友好的界面。在MATLAB中实现FRFT,通常需要编写自定义函数或利用信号处理工具箱中的相关函数。例如,一个名为“frft”的文件可能是用于执行分数阶傅里叶变换的MATLAB脚本或函数,并展示其在信号处理中的应用。FRFT的正确性验证通常通过对比变换前后信号的特性来完成,比如评估信号的重构质量、信噪比等。具体而言,可以通过计算原始信号与经过FRFT处理后的信号之间的相似度,或者对比LFM信号的关键参数(如初始频率、扫频率和持续时间)是否在变换后得到准确恢复。 在MATLAB代码实现中,通常包含以下步骤:首先,生成LFM信号模型,设定其初始频率、扫频率、持续时间和采样率等参数;其次,利用自定义的frft函数对LFM信号进行分数阶傅里叶变换;接着,使用MATLAB的可视化工具(如plot或imagesc)展示原始信号的时域和频域表示,以及FRFT后的结果,以便直观对比;最后,通过计算均方误差、峰值信噪比等指标来评估FRFT的性能。深入理解FRFT的数学原理并结合MATLAB编程技巧,可以实现对LFM信号的有效分析和处理。这个代码示例不仅展示了理论知识在
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值