IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

 
 Ответить  Открыть новую тему 
> Задачка на Си
Янычар
сообщение 25.12.2007 19:49
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 115
Пол: Мужской
Реальное имя: Александр

Репутация: -  1  +


Помогите друзья! Вроде несложное задание а чего то не получается. Задание такое: Удалить из строки самое длинное слово. Проше если не сложно написать текст проги здесь. Заранее благодарен.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 25.12.2007 20:39
Сообщение #2


Гость






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

#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;
}

Подойдет?

Сообщение отредактировано: volvo - 26.12.2007 0:01
 К началу страницы 
+ Ответить 
Янычар
сообщение 25.12.2007 23:27
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 115
Пол: Мужской
Реальное имя: Александр

Репутация: -  1  +


Если бы я еще понимал что ты тут делаешь. Что такое: 1)if(*p && isalnum(*p))
2) if(*p) p++;3)*p++ = *pp;
Вобще если бы написал пояснения, хотя хотелось бы чтобы была написана более понятно
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 26.12.2007 0:04
Сообщение #4


Гость






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

Я добавил комментарии, если что еще непонятно - спрашивай...
 К началу страницы 
+ Ответить 
Янычар
сообщение 26.12.2007 10:11
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 115
Пол: Мужской
Реальное имя: Александр

Репутация: -  1  +


Спасибо огромное с комментариями намного лучше.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 28.07.2025 7:58
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"