Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Задачка на Си

Автор: Янычар 25.12.2007 23:49

Помогите друзья! Вроде несложное задание а чего то не получается. Задание такое: Удалить из строки самое длинное слово. Проше если не сложно написать текст проги здесь. Заранее благодарен.

Автор: volvo 26.12.2007 0:39

Ну, скажем... Вот так:

#include <stdio.h>
#include <ctype.h>

int main() {
char s[256] = "begin end starting finishing f\0";
int len = 0, max_len = 0; char *p, *pp, *start;

// gets(s);

// изначально и P и PP указывают на начало обрабатываемой строки S
for(p = pp = s; ;) {

// В следующем фрагменте находится длина самого длинного слова в строке (len)
// и сохраняется указатель на его начало (start)

// если очередной символ (*p - это разыменование указателя на символ,
// значит это и есть сам символ) - НЕ конец строки (строки в С заканчиваются
// нулем, соответственно *p будет истиной если конец строки не достигнут, и
// ложью если мы уже пришли на конец строки ) и является буквой или цифрой
// (это проверяется готовой библиотечной функцией isalnum), то просто увеличиваем
// длину слова
if(*p && isalnum(*p)) {
len += 1;
}
else {
// раз мы здесь - значит добрались до конца строки или просто слово закончилось
// в обоих случаях надо проверить, не является ли только что закончившееся слово
// более длинным, чем то, что было самым длинным раньше...
if(max_len < len) {
max_len = len; start = pp; // да, последнее слово длиннее - запоминаем его начало и длину
}

// в любом случае после обработки слова надо сбросить счетчик длины,
// и запомнить в PP позицию следующего (за текущим) символа, вдруг ПОТОМ выяснится,
// что именно там начинается еще более длинное слово...
len = 0; pp = p + 1;
}

// если еще не добрались до конца строки - продвигаемся дальше,
// иначе просто завершаем цикл поиска самого длинного слова...
if(*p) p++;
else break;
}


// вот теперь у нас в start - указатель на начало слова, которое надо удалить,
// а в max_len - его длинна.

// Как удалять слово? Правильно, копировать символы с позиции start + max_len
// (сразу ПОСЛЕ удаляемого слова) в позицию start - заменяя удаляемое слово тем,
// что идет следом за ним...


// Вот и делаем то, что написано выше:
// p - это КУДА будем копировать (приемник);
// pp - ОТКУДА будут копироваться символы (источник)

p = start; pp = start + max_len;
do {
*p++ = *pp; // Копируем символ и увеличиваем индекс ПРИЕМНИКА
} while(*pp++); // Пока ИСТОЧНИК не достиг конца строки, его тоже увеличивать

// Все, слово удалено
printf("%s\n", s, max_len);
return 0;
}

Подойдет?

Автор: Янычар 26.12.2007 3:27

Если бы я еще понимал что ты тут делаешь. Что такое: 1)if(*p && isalnum(*p))
2) if(*p) p++;3)*p++ = *pp;
Вобще если бы написал пояснения, хотя хотелось бы чтобы была написана более понятно

Автор: volvo 26.12.2007 4:04

Цитата
хотелось бы чтобы была написана более понятно
Это на С-то? Более понятно чем что? Чем на Паскале? Так в С другой путь работы со строками, чтобы решать подобные задачи тебе надо иметь хоть малейшее понятие об указателях и работе с ними. Не работают в Сях так, как в Паскале - индексируя символы строки целым числом...

Я добавил комментарии, если что еще непонятно - спрашивай...

Автор: Янычар 26.12.2007 14:11

Спасибо огромное с комментариями намного лучше.