Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Программирование на C / C++


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Гаряка Асмик
Статус: Профессор
Рейтинг: 5251
∙ повысить рейтинг »
Boriss
Статус: Академик
Рейтинг: 2518
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2023
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / C/C++

Номер выпуска:1594
Дата выхода:16.11.2010, 22:00
Администратор рассылки:Verena (Профессионал)
Подписчиков / экспертов:337 / 176
Вопросов / ответов:1 / 1

Вопрос № 180620: Здравствуйте эксперты! Помогите с алгоритмом программы на Си. {}-условие того что должна делать программа, будет описано ниже. Условие программы: Дана строка, содержащая слова, разделенные одним или несколькими разделительными символами (пробел...



Вопрос № 180620:

Здравствуйте эксперты! Помогите с алгоритмом программы на Си.
{}-условие того что должна делать программа, будет описано ниже.
Условие программы: Дана строка, содержащая слова, разделенные одним или несколькими разделительными символами (пробелами, табуляторами) в начале строки и в конце строки также могут находиться разделительные символы. {}. В начале и в конце строки не должно быть разделительных символов.
{}:
1.Сформировать новую строку в которой слова исходной строки записаны в порядке возрастания длин и разделены одним пробелом.
2. Сформировать новую строку, состоящую только из слов, начинающихся и заканчивающихся на один и тот же символ, разделенных 1-м пробелом.
3. Сформировать новую строку, в которой удалить из каждого слова исходной строки символы, встречающиеся 1-раз.
4. Сформировать новую строку, в которой поместить нечетные слова разделенные 1-м пробелом.

P.S.:Составить алгоритм для каждого из условий в отдельности.И если возмож но то в двух видах: с использованием функций таких как (strcat,strcpn и т.д) и без них.

Заранее Большое Спасибо!!!!!!!!!!!!!!

Отправлен: 08.11.2010, 12:25
Вопрос задал: Magma (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает lamed (Профессор) :
Здравствуйте, Magma! GCC/Code::Blocks.
Код:
/* Сформировать новую строку, в которой удалить из каждого слова */
/* исходной строки символы, встречающиеся 1-раз. */
/* lamed, rfpro, 2010 */
/* очередная буква слова повторяется, если она встречается среди */
/* записанных или среди оставшихся */
#include <stdio.h>

int iswhite(int c);
// является ли символ пробельным

int found(const char c, const char t[], const int first, const int last);
// найдена ли буква в подмассиве символов

void create(char s[], const char t[]);
int main(void)
{
enum {SIZE=1000};
char s[SIZE];
char t[SIZE];

gets(t);
create(s,t);
puts(s);
system("pause");
return 0;
}

int iswhite(const int c)
{
return (c==' '||c=='\t');
}

void create(char s[], const char t[])
{
int i, j, k;
int c;
int inword;
int firstr, lastr; // первая и последняя буквы прочитанного слова
int firstw, lastw; // первая и последняя буквы записанного слова
int written=0;

i=0;
while (iswhite(c=t[i])) // пропускаем левые пробелы
i++;
if (t[i]=='\0')
{
s[i]='\0';
return;
}

inword=1;
j=0;
while ((c=t[i])!='\0')
{
if (!iswhite(c))
{
firstr=i;
while ((c=t[i])!='\0' && !iswhite(c))
i++;
lastr = i-1;

for (k=firstr; k<=lastr; k++)
{
if (found(t[k], t, k+1, l astr) ||
(written==1) && found(t[k], s, firstw, lastw))
{
if (written==0) // буква уже записана
{
firstw=j; // позиция первой записанной буквы
written=1;
}
lastw=j; // позиция последней записанной буквы
s[j++]=t[k];
}
}
if (written==1)
{
s[j++]='_'; // если слово записано, тогда пробел
written=0;
}
}
else
while ((c=t[i])!='\0' && iswhite(c)) // пропуск пробелов
i++;
}
if (s[j-1]=='_')
j--;
s[j]='\0';
}

int found(const char c, const char t[], const int first, const int last)
{
int i;
for (i=first; i<=last; i++)
if (c==t[i])
return 1;
return 0;
}
Пример работы
Код:
Границы ключ переломлен пополам /* Гражданская оборона */
еелле_попо_ааа_ооо

Удачи!

Ответ отправил: lamed (Профессор)
Ответ отправлен: 14.11.2010, 10:38
Номер ответа: 264023

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 264023 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFPRO.RU, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.23 от 10.11.2010

    В избранное