Условие задачи : Найти самое длинное слово заданного предложения и вывести его длину.
Сложность : средняя .
Начнем решать эту. В условии сказано что надо найти самое длинное слово предложения, т.е. сразу же ясно что нам нужна строка, но так как мы будем перебирать каждое слово предложения нам понадобиться функция getline, подобную мы использовали (тут), если у нас будет обычные cin , то в итоге мы будем работать только с одним словом.
Давайте сделаем каркас , объявим переменную и попросим пользователя ввести строку :
#include <iostream> using namespace std; // используем именное пространство std int main() { setlocale(LC_ALL,"Rus"); // включаем русский язык char str[256]; cout << "Введите строку : " ; cin.getline(str,256); system("pause"); return 0; }
Первый параметр ф-и getline, т.е str, в него мы будем заносить саму строку,а второй(256) это размер строки.
Но к сожалению как и в той задаче у нас не получиться работа со строкой из русских символов.
Вот теперь самое трудное. Для того чтобы решить эту задачу мы будем использовать так называемые указатели.
Подробнее про них я расскажу в видео уроке. А сейчас скажу то что указатель представляет собой адрес памяти, который указывает (или ссылается) на определенный участок.
Знаю что не понятно. Но надеюсь сейчас станет всё понятно.
И так мы создаем два указателя :
char* ptr=strtok(str," .,!?"); char* max=ptr;
В одном у нас будет храниться адрес на первое слово.
Как вы заметили у нас в указателе ptr есть функция strtok(), это функция разбивает строку на символы, т.е. она нам вернет набор символов, проще говоря слово. У неё два параметра : 1-й — это сама строка, а 2-й — это разделители.
Допустим у нас есть строка : I,Love,it. И как только мы запустим программу у нас отделиться I . Потом уже с помощью цикла мы отделим Love и It.
Во втором указателе у нас будет адрес на ptr. Это точно также как и с поиском наибольшего элемента массива, там чтобы найти его мы присваивали переменной max значение первого элемента, а потом уже сравнивали со следующим, так и тут, нам нужно какое-то начальное максимальное значение.
Чтобы вывести обычное значение нам нужно написать либо max либо ptr, т.е. если мы напишем :
char* ptr=strtok(str," .,!?"); char* max=ptr; cout << ptr << endl; cout << max << endl;
То у нас выведется первое слово строки.
Теперь нам нужен цикл в котором мы и будем искать самое длинное слово предложения :
do { if(strlen(max)<strlen(ptr)) max=ptr; } while(ptr=strtok(NULL," .,!?"));
В самом цикле мы сравниваем длину слов, и если ptr больше max, то в max уже будет другое слово, как с числами.
Что значит while(ptr=strtok(NULL,» .,!?»)); ?
Исходная строка задается при первом вызове strtok. Во всех последующих вызовах задается нулевой указатель(NULL).
Т.е. пока ptr что либо присваивается у нас цикл работает. Когда я делал эту задачу, я думал именно так ). = — значит присвоить , не забывайте это.
Ну и нам осталось только вывести самое длинное слово предложения :
Надеюсь объяснение было понятно.
cout<< max << endl;
Весь код программы :
#include <iostream> using namespace std; int main() { setlocale(LC_ALL,"Rus"); char str[256]; cin.getline(str,256); char* ptr=strtok(str," .,!?"); char* max=ptr; do { if(strlen(max)<strlen(ptr)) max=ptr; } while(ptr=strtok(NULL," .,!?")); cout<< max << endl; system("pause"); return 0; }