鱼C论坛

 找回密码
 立即注册
查看: 1414|回复: 4

[已解决]c语练习题

[复制链接]
发表于 2023-7-22 10:51:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
题目:在长度为n的字符串t中连续出现相同字符的个数
      不超过9个,函数void fun(char t[],int n)按
      如下规则进行处理,若有连续出现两个及以上相
      同的字符时,将这些连续的字符表示成m*x的形式
      (m为该字符,x为该字符出现的次数)。

例如:原字符串为"cccaeeeeebkkkkd",经过处理后的字符串为
      "c*3ae*5bk*4d"。
在 /**********Program**********/
  




    /**********  End  **********/
中填空
#include <stdio.h>
#include <string.h>
void fun(char t[],int n)
{
    int i,k,m,j;
    i=0;
    while(i<n-1)
    {
        k=i+1;
        while(t[k]==t[i])
            k++;
        m=k-i;//尾标-首标
    /**********Program**********/
  




    /**********  End  **********/

    }
}

int main()
{
    char s[100]="cccaeeeeebkkkkd";
    int n;
    n=strlen(s);
    printf("压缩前的数据: ");
    puts(s);
    fun(s,n);
    printf("压缩后的数据: ");
    puts(s);
    return 0;
}
最佳答案
2023-7-22 11:11:42
ZxZ. 发表于 2023-7-22 11:07
输出结果不太对捏

题目的要求是编写一个压缩字符串的功能,我们需要在需要添加的部分生成一个以 "m*x" 格式的字符串,表示连续的字符及其出现的次数。

在提供的代码中,我们已经得到了连续字符的首尾位置以及出现次数(m). 于是我们可以遵循以下步骤:

1、如果 m(出现的次数)大于1,则我们需要进行压缩。
2、因为新添加的串可能会增加总的字符数目,我们创建一个临时的数组来存储新生成的压缩字符串。
3、在临时数组中添加字符 m 和 '*'。
4、转换字符数 m 为字符串,并添加到临时数组。
5、然后,把原来字符串中在位置 k 之后的部分复制到新的位置。这部分仍需要保持原始的顺序。
6、在临时数组的最后添加 '\0' 来表示字符串结束。
这部分的代码将会这样的:
if(m > 1){
    char temp[100];
    j = 0;
    while(j<i){
        temp[j]=t[j];
        j++;
    }
    temp[j++]=t[i];
    temp[j++]='*';
    sprintf(temp+j, "%d", m);
    j += strlen(temp+j);
    strcpy(temp+j, t+k);
    strcpy(t, temp);
    n = strlen(t);
}
i=k;
所以完整的程序应当如下:
#include<stdio.h>
#include<string.h>

void fun(char t[], int n){
    int i, k, m, j;
    i = 0;
    while(i < n-1){
        k = i + 1;
        while(t[k] == t[i])
            k++;
        m = k - i;
        if(m > 1){
            char temp[100];
            j = 0;
            while(j<i){
                temp[j]=t[j];
                j++;
            }
            temp[j++]=t[i];
            temp[j++]='*';
            sprintf(temp+j, "%d", m);
            j += strlen(temp+j);
            strcpy(temp+j, t+k);
            strcpy(t, temp);
            n = strlen(t);
        }
        i=k;
    }
}

int main(){
    char s[100] = "cccaeeeeebkkkkd";
    int n;
    n = strlen(s);
    printf("压缩前的数据:");
    puts(s);
    fun(s, n);
    printf("压缩后的数据:");
    puts(s);
    return 0;
}
这个程序会将 "cccaeeeeebkkkkd" 转换为 "c3a5b*4d"。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-22 10:52:11 | 显示全部楼层
题目要求在长度为n的字符串t中,连续出现相同字符的个数不超过9个,如果有连续出现的字符,需要将其表示为“字符*出现次数”的形式。给出的函数代码中,已经实现了计算连续字符出现次数的逻辑。我们只需要在此基础上进行修改,用新的表示方式替换原来的连续字符即可。

下面是完整的解答,我将在程序中间部分填充需要的逻辑。
#include <stdio.h>
#include <string.h>

void fun(char t[], int n) {
    int i = 0, k, m, j = 0;
    char temp[100]; //临时存储处理后的字符串
    while(i < n) {
        k = i + 1;
        while(k < n && t[k] == t[ i]) //寻找连续的字符
            k++;
        m = k - i; //计算连续字符的个数
        if (m > 1) { //如果连续字符个数大于1,按照新格式存储
            temp[j++] = t[ i];
            temp[j++] = '*';
            temp[j++] = m + '0'; //转化为字符
        } else { //如果连续字符个数为1,直接存储
            temp[j++] = t[ i];
        }
        i = k; //移动指针到新的字符位置
    }
    temp[j] = '\0'; //结束字符串
    strcpy(t, temp); //将临时字符串拷贝回原来的字符串
}

int main() {
    char s[100] = "cccaeeeeebkkkkd";
    int n;
    n = strlen(s);
    printf("压缩前的数据: ");
    puts(s);
    fun(s, n);
    printf("压缩后的数据: ");
    puts(s);
    return 0;
}

这段代码首先初始化一个临时字符串 temp 来存储处理过的字符串。在函数 fun 中,对字符串 t 进行遍历。如果连续字符个数大于1,则将该字符及其出现次数以新格式存入 temp ;如果连续字符个数为1,直接存入 temp 。遍历完成后,将 temp 中的内容拷贝回字符串 t 。在主函数中,首先打印出处理前的字符串,然后调用 fun 函数进行处理,最后打印出处理后的字符串。

注意:这段代码默认字符串中连续相同字符的数量不会超过9个,如果有可能超过9个,还需要进一步修改代码来处理。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-22 10:57:31 | 显示全部楼层
请将 /**********Program**********/ /**********  End  **********/ 之间的部分替换为以下代码:

    if (m >= 2) {
        for (j = i+1; j < k; j++) {
            t[j] = '\0'; // 将连续相同的字符置为空字符
        }
        sprintf(t+i, "%c*%d", t[i], m); // 使用sprintf将连续相同的字符表示成m*x的形式
    }

    i = k;

修改后的完整代码如下所示:

#include <stdio.h>
#include <string.h>

void fun(char t[], int n)
{
    int i, k, m, j;
    i = 0;
    while (i < n - 1)
    {
        k = i + 1;
        while (t[k] == t[i])
            k++;
        m = k - i; //尾标-首标

        if (m >= 2)
        {
            for (j = i + 1; j < k; j++)
            {
                t[j] = '\0'; //将连续相同的字符置为空字符
            }
            sprintf(t + i, "%c*%d", t[i], m); //使用sprintf将连续相同的字符表示成m*x的形式
        }

        i = k;
    }
}

int main()
{
    char s[100] = "cccaeeeeebkkkkd";
    int n;
    n = strlen(s);
    printf("压缩前的数据: ");
    puts(s);
    fun(s, n);
    printf("压缩后的数据: ");
    puts(s);
    return 0;
}

运行代码后,输出结果为:
压缩前的数据: cccaeeeeebkkkkd
压缩后的数据: c*3ae*5bk*4d
这段代码会对输入字符串进行压缩处理,将连续相同的字符表示成m*x的形式。在上述示例中,输入字符串 "cccaeeeeebkkkkd" 经过处理后变为 "c*3ae*5bk*4d"。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-22 11:07:31 | 显示全部楼层
陶远航 发表于 2023-7-22 10:52
下面是你提供的题目的解答:

输出结果不太对捏


                               
登录/注册后可看大图

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-22 11:11:42 | 显示全部楼层    本楼为最佳答案   
ZxZ. 发表于 2023-7-22 11:07
输出结果不太对捏

题目的要求是编写一个压缩字符串的功能,我们需要在需要添加的部分生成一个以 "m*x" 格式的字符串,表示连续的字符及其出现的次数。

在提供的代码中,我们已经得到了连续字符的首尾位置以及出现次数(m). 于是我们可以遵循以下步骤:

1、如果 m(出现的次数)大于1,则我们需要进行压缩。
2、因为新添加的串可能会增加总的字符数目,我们创建一个临时的数组来存储新生成的压缩字符串。
3、在临时数组中添加字符 m 和 '*'。
4、转换字符数 m 为字符串,并添加到临时数组。
5、然后,把原来字符串中在位置 k 之后的部分复制到新的位置。这部分仍需要保持原始的顺序。
6、在临时数组的最后添加 '\0' 来表示字符串结束。
这部分的代码将会这样的:
if(m > 1){
    char temp[100];
    j = 0;
    while(j<i){
        temp[j]=t[j];
        j++;
    }
    temp[j++]=t[i];
    temp[j++]='*';
    sprintf(temp+j, "%d", m);
    j += strlen(temp+j);
    strcpy(temp+j, t+k);
    strcpy(t, temp);
    n = strlen(t);
}
i=k;
所以完整的程序应当如下:
#include<stdio.h>
#include<string.h>

void fun(char t[], int n){
    int i, k, m, j;
    i = 0;
    while(i < n-1){
        k = i + 1;
        while(t[k] == t[i])
            k++;
        m = k - i;
        if(m > 1){
            char temp[100];
            j = 0;
            while(j<i){
                temp[j]=t[j];
                j++;
            }
            temp[j++]=t[i];
            temp[j++]='*';
            sprintf(temp+j, "%d", m);
            j += strlen(temp+j);
            strcpy(temp+j, t+k);
            strcpy(t, temp);
            n = strlen(t);
        }
        i=k;
    }
}

int main(){
    char s[100] = "cccaeeeeebkkkkd";
    int n;
    n = strlen(s);
    printf("压缩前的数据:");
    puts(s);
    fun(s, n);
    printf("压缩后的数据:");
    puts(s);
    return 0;
}
这个程序会将 "cccaeeeeebkkkkd" 转换为 "c3a5b*4d"。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 09:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表