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

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

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

Обсуждение

давно
Академик
320937
2216
14.11.2010, 10:38
общий
это ответ
Здравствуйте, 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, lastr) ||
(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;
}
Пример работы
Код:
Границы ключ переломлен пополам /* Гражданская оборона */
еелле_попо_ааа_ооо

Удачи!
Форма ответа