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

> Внимание!

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

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

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


Пионер
**

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

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


Помогите друзья! Вроде несложное задание а чего то не получается. Задание такое: Удалить из строки самое длинное слово. Проше если не сложно написать текст проги здесь. Заранее благодарен.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

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

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


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


Гость






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

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


Пионер
**

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

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


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

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

 





- Текстовая версия 27.11.2020 10:11
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name