Консультация № 183619
14.06.2011, 14:48
53.35 руб.
0 11 2
Уважаемые эксперты! помогите пожалуйста с решением данных задач:

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

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

Обсуждение

Неизвестный
14.06.2011, 15:16
общий
14.06.2011, 15:20
А что такое string в C? Есть такой класс в C++. Да и вообще, такой стиль объявления функций свойственен Pascal, а не C.
Неизвестный
14.06.2011, 15:28
общий
так и скажу преподавателю )
давно
Академик
320937
2216
14.06.2011, 15:56
общий
это ответ
Здравствуйте, 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;
}

Удачи!
5
Спасибо!
Неизвестный
14.06.2011, 16:15
общий
а на счет 2й задачи идей нет? )
Неизвестный
14.06.2011, 17:02
общий
это ответ
Здравствуйте, 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"
5
Спасибо!
Неизвестный
14.06.2011, 17:03
общий
14.06.2011, 17:07
Сейчас 2ю сделаю. Что значит без повторений? Приведите несколько примеров.
Неизвестный
14.06.2011, 17:15
общий
14.06.2011, 17:15

Без повторений например: базовая строка: Aeeeaarhhjii
Финальная строка: Aei
т.е. при повторении букв по типу а - они ещё раз не выводятся
Неизвестный
14.06.2011, 17:49
общий
Добавил в ответ 2ю задачу.
давно
Академик
320937
2216
14.06.2011, 17:51
общий
Добавил обработку пробелов, изменил обработку конца '\0'
Неизвестный
14.06.2011, 18:19
общий
Спасибо большое все работает!
Неизвестный
14.06.2011, 18:20
общий
Адресаты:
Спасибо! работает!
Форма ответа