Вопрос № 180620: Здравствуйте эксперты! Помогите с алгоритмом программы на Си. {}-условие того что должна делать программа, будет описано ниже. Условие программы: Дана строка, содержащая слова, разделенные одним или несколькими разделительными символами (пробел...
Вопрос № 180620:
Здравствуйте эксперты! Помогите с алгоритмом программы на Си. {}-условие того что должна делать программа, будет описано ниже. Условие программы: Дана строка, содержащая слова, разделенные одним или несколькими разделительными символами (пробелами, табуляторами) в начале строки и в конце строки также могут находиться разделительные символы. {}. В начале и в конце строки не должно быть разделительных символов. {}: 1.Сформировать новую строку в которой слова исходной строки записаны в порядке
возрастания длин и разделены одним пробелом. 2. Сформировать новую строку, состоящую только из слов, начинающихся и заканчивающихся на один и тот же символ, разделенных 1-м пробелом. 3. Сформировать новую строку, в которой удалить из каждого слова исходной строки символы, встречающиеся 1-раз. 4. Сформировать новую строку, в которой поместить нечетные слова разделенные 1-м пробелом.
P.S.:Составить алгоритм для каждого из условий в отдельности.И если возмож
но то в двух видах: с использованием функций таких как (strcat,strcpn и т.д) и без них.
Заранее Большое Спасибо!!!!!!!!!!!!!!
Отправлен: 08.11.2010, 12:25
Вопрос задал: Magma (Посетитель)
Всего ответов: 1 Страница вопроса »
/* Сформировать новую строку, в которой удалить из каждого слова */ /* исходной строки символы, встречающиеся 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); // найдена ли буква в подмассиве символов
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 (Россия) |
Еще номера »
Оценить выпуск »
Нам очень важно Ваше мнение об этом выпуске рассылки!
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.