Консультация онлайн # 183619

Раздел: С / С++
Автор вопроса: Polotenchikko
Дата: 14.06.2011, 14:48 Консультация неактивна
Поступило ответов: 2
Уважаемые эксперты! помогите пожалуйста с решением данных задач:

1. Заменить в строке последовательности одинаковых символов (не пробелов) на десятичное число, состоящее из двух десятичных цифр и соответствующее их количеству (т.е. “ abcdaaaaa xyznnnnnnn ” на “abcd5a xyz7n ”).
2. Разработать функцию MakeStr(const S:string):string, возвращающую строку, состоящую из всех гласных латинских букв строки S без повторений. С помощью данной функции для каждой строки из введенного набора вывести все ее гласные латинские буквы без повторений. Гласными считаются следующие буквы: aeiouyAEIOUY.

желательно на языке С:

Ответ # 1, lamed (Академик)

Здравствуйте, Polotenchikko!
Ответ на первое задание. Описывается частный случай, число подряд идущих символов не более 99,
как и указано в задании.
Код
/* Заменить в строке последовательности одинаковых символов (не пробелов)
на десятичное число, состоящее из двух десятичных цифр и соответствующее
их количеству (т.е. “ abcdaaaaa xyznnnnnnn ” на “abcd5a xyz7n ” */
/* G++/Code::Blocks */
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    enum {n=80};
    char s[n];
    int i, j, k;
    char c;
    int done=0;

    gets(s);
    j=0;
    k=1;
    c=s[0];
    for (i=1; !done; i++)
    {
        if (s[i]==c)
            if (s[i]==' ')
                s[j++]=s[i];
            else
                k++;
        else
        {
            if (k>9) /* две цифры */
                s[j++]='0'+k/10;
            if (k>1) /* одна цифра */
                s[j++]='0'+k%10;
            s[j++]=c;
            c=s[i];
            k=1;
            if (s[i]=='\0')
                done=1;
        }
    }
    s[j]='\0';

    puts(s);
    system("pause");
    return 0;
}

Удачи!

lamed

Академик
14.06.2011, 15:56
5
Спасибо!

Ответ # 2, Micren (Посетитель)

Здравствуйте, Polotenchikko!
Задача 1:
Код
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

// Ф-я преобразования числа в строку
// Т.к. заведомо в задаче отрицательных чисел быть не может игнорируем это

char* itoa(int val)
{
#define BUF_LEN  32
    static char buf[BUF_LEN] = {0};
    int i = BUF_LEN - 1;
    while (val && i)
    {
        buf[--i] = "0123456789"[val % 10];
        val /= 10;
    }
    return buf + i;
}

// Решение задачи

void process(char* dest)
{
    char* src = dest;
    int count = 0;
    // Перемещаемся по строке
    while (*src)
    {
        // Если два подряд одинаковые и не пробел
        if (*src == *(src + 1) && !isspace(*src))
        {
            // Увеличим счетчик
            ++count;
            ++src;
        }
        else
        {
            // Если не одинаковые и счетчик одинаковых не 0
            if (count)
            {
                // Переводим в число
                char* tmp = itoa(count + 1);
                // Заменяем в строке
                while (*tmp)
                {
                    *dest++ = *tmp++;
                }
                // Обнулим счетчик
                count = 0;
            }
            
            *dest++ = *src++;
        }
    }
    *dest = 0;
}

int main()
{
    // Буфер
    char buf[BUFSIZ];

    printf("string:");
    // Ввод строки
    if (!fgets(buf, BUFSIZ, stdin))
    {
        printf("I/O Error\n");
        exit(EXIT_FAILURE);
    };

    // Удалим '\n' если есть
    int len = strlen(buf);
    if (len && buf[--len] == '\n')
    {
        buf[len] = 0;
    }

    process(buf);

    printf("result:\"%s\"\n", buf);

    return 0;
}

Пример работы:
Код
string:abcdaaaaa xyznnnnnnn
result:"abcd5a xyz7n"


Задача 2:
Код
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

// Гласные
#define VOWELS  "AEIOUY"

// Копирует гласные из строки src в dst
// Возвращает количество гласных символов(требуемый размер буфера без учета '\0'
// Если src==NULL - возвращает -1
// Если dst==NULL - ничего не копирует, просто возвращает необходимый размер буфера

int makeStr(char* dst, const char* src)
{
    if (!src)
    {
        return -1;
    }

    // Множество допустимых символов
    char vowels[] = VOWELS;
    int count = 0;

    // Перемещаемся по строке
    while (*src)
    {
        // Позиция в множестве допустимых
        char* pos;
        // Приведение к верхнему регистру и проверка на наличие в множестве
        if (pos = strchr(vowels, toupper(*src)))
        {
            ++count;
            // Копируем в строку
            if (dst)
            {
                *dst++ = *src;
            }
            // Удалим из множества встретившийся символ
            while (*pos++)
            {
                *(pos - 1) = *pos;
            };
        }
        ++src;
    }

    if (dst)
    {
        *dst = 0;
    }

    return count;
}

int main()
{
    // Буфер
    char buf[BUFSIZ];

    printf("string:");
    // Ввод строки
    if (!fgets(buf, BUFSIZ, stdin))
    {
        printf("I/O Error\n");
        exit(EXIT_FAILURE);
    };

    // Удалим '\n' если есть
    int len = strlen(buf);
    if (len && buf[--len] == '\n')
    {
        buf[len] = 0;
    }

    // Выделим память под буфер
    char* result = malloc(makeStr(0, buf) + 1);
    // Копируем гласные
    makeStr(result, buf);

    printf("result:\"%s\"\n", result);

    // Освобождаем память
    free(result);

    return 0;
}

Пример работы:
Код
string:Aeeeaarhhjii
result:"Aei"

Micren

Посетитель
14.06.2011, 17:02
5
Спасибо!

Мини-форум консультации # 183619

Micren

258662

= общий =    14.06.2011, 15:16
А что такое string в C? Есть такой класс в C++. Да и вообще, такой стиль объявления функций свойственен Pascal, а не C.
Последнее редактирование 14.06.2011, 15:20 [неизвестный]
неизвестный

258666

= общий =    14.06.2011, 15:28
так и скажу преподавателю )
неизвестный

258673

= общий =    14.06.2011, 16:15
а на счет 2й задачи идей нет? )
Micren

258682

= общий =    14.06.2011, 17:03
Сейчас 2ю сделаю. Что значит без повторений? Приведите несколько примеров.
Последнее редактирование 14.06.2011, 17:07 [неизвестный]
неизвестный

258684

= общий =    14.06.2011, 17:15

Без повторений например: базовая строка: Aeeeaarhhjii
Финальная строка: Aei
т.е. при повторении букв по типу а - они ещё раз не выводятся
Последнее редактирование 14.06.2011, 17:15 [неизвестный]
Micren

258687

= общий =    14.06.2011, 17:49
Добавил в ответ 2ю задачу.
lamed

Академик

ID: 320937

258688

= общий =    14.06.2011, 17:51
Добавил обработку пробелов, изменил обработку конца '\0'
неизвестный

258699

= общий =    14.06.2011, 18:19
Спасибо большое все работает!
неизвестный

258700

= общий =    14.06.2011, 18:20
Спасибо! работает!
Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.