Создать текстовый файл с расширением .dat, содержащий текст, величина которого не превышает 1000 символов, а длина строки текста содержит не более 70 символов.
Программа должна выводить текст из файла на экран, позволять задавать два слова, как первое и второе, которые нужно найти и выделить в тексте, а затем там же поменять их местами.
Проектирование приложения.
Выбор, размещение и задание свойств компонентов.
Коды обработчиков событий и функций
Для подготовки текста, выводимого в файл, воспользуемся окном редактирования многострочного текста – компонентом Memo, в котором для всего текста формат одинаков. Сохранять текст в файле удобно, используя компонент “Сохранить файл” – SaveDialog, а для чтения из файла – компонент “Открыть файл” – OpenDialog.
Выводить текст, имея в виду последующую работу с текстом, целесообразно в многострочное окно редактирования – компонент RichEdit, который работает с текстом в обогащенном формате RTF. Здесь можно устанавливать атрибуты выделенного текста свойством SelAttributes, которое имеет ряд подсвойств, например, Style (стиль). Весь текст в RichEdit, представленный одной строкой типа AnsiString, внутри которой используются разделители типа символов возврата каретки и перевода строки, содержится в свойстве Text.
Memo и RichEdit имеют общее основное свойство – Lines, содержащее текст окна в виде списка строк. Доступ к отдельной строке текста, например первой, можно получить так: RichEdit1->Lines->String[0]. Во время выполнения приложения можно заносить текст в окно с помощью методов свойства Lines.
При работе с Memo и RichEdit пользуются компонентом PopupMenu – контекстным всплывающим меню. Это меню привязано к конкретным компонентам. Оно всплывает, если во время, когда данный компонент (в нашем случае Memo или RichEdit) находится в фокусе, пользователь щелкнет правой кнопкой мыши. Для Memo всплывающее меню должно содержать команды Сохранить и Сохранить как, а для RichEdit – Открыть.
Первое и второе слова, которые нужно найти и выделить в окне RichEdit, а затем там же поменять их местами, удобно задавать в однострочных окнах редактирования с метками – LabeledEdit. Введенный в окно текст присваивается свойству Text, который имеет тип строки AnsiString.
В компонентах Memo, RichEdit и LabeledEdit свойства только времени выполнения SelLength, SelStart, SelText определяют соответственно длину выделенного текста, позицию перед первым символом выделенного текста и сам выделенный текст.
1.Запустите C++Builder 6.
2.Создайте новый проект командой Файл/Новый/Приложение.
3.Сохраните файлы модуля и проекта командой Файл/Сохранить все под именами LR_2 и PR_LR_2 в каталоге ТЕХН_ПРОГР. Для этого удобно использовать соответствующую быструю кнопку (Сохранить все). В последующих сеансах работы сохраненный проект можно открыть командой Файл/Открыть проект (или Повторно открыть). Теперь перейдем к проектированию приложения - переносам на форму необходимых компонентов и заданию их свойствам значений, а в обработчиках событий – размещению кодов соответствующих алгоритмов. (Рекомендуется нажимать кнопку Сохранить все по окончании работы с каждым компонентом.) В результате проектирования получим форму, представленную на рис.2.1.
Рис.2.1 – форма по окончании проектирования
4.Выделите форму, щелкнув на ней левой кнопкой мыши, и в свойство Caption(надпись) впишите ТЕКСТОВЫЕ ФАЙЛЫ, СИМВОЛЫ, СТРОКИ.
5.Перенесите на форму (страница Диалоги) компоненты SaveDialog1 и OpenDialog1. Все диалоги являются невизуальными компонентами, так что место их размещения на форме не имеет значения. При обращении к этим компонентам вызываются стандартные диалоги.
6.Перенесите дважды на форму со страницы Стандарт компонент PopupMenu. Он также является невизуальным компонентом. Двойным щелчком на компоненте PopupMenu1 перейдите в Конструктор Меню (окно Form1->PopupMenu1) и внесите разделы Сохранить и Сохранить как, а для компонента PopupMenu2- Открыть.
7.Перенесите на форму компоненты Memo1 (страница Стандарт) и RichEdit1 (страница Win32). В свойство PopupMenu компонента Memo1 внесите из выпадающего списка PopupMenu1, а в свойство PopupMenu компонента RichEdit1 - внесите PopupMenu2.
8.В файле LR_2.cpp перед обработчиком щелчка на разделе Сохранить дайте объявление
AnsiString MyFName="";
а в обработчик щелчка на разделе Сохранить внесите (курсив)
void __fastcall TForm1::N1Click(TObject *Sender)
{
if(MyFName!="")
Memo1->Lines->SaveToFile(MyFName);
else
if(SaveDialog1->Execute())
{
MyFName=SaveDialog1->FileName;
Memo1->Lines->SaveToFile(SaveDialog1->FileName);
}
}
9.В обработчик щелчка на разделе Сохранить как внесите (курсив)
void __fastcall TForm1::N2Click(TObject *Sender)
{
SaveDialog1->FileName=MyFName;
if(SaveDialog1->Execute())
{
MyFName=SaveDialog1->FileName;
Memo1->Lines->SaveToFile(SaveDialog1->FileName);
}
}
10.В обработчик щелчка на разделе Открыть внесите (курсив)
11.Перенесите на форму (рис.2.1) кнопку Button1 (страница Стандарт) с надписью СБРОС для очистки окон редактирования; перед обработчиком щелчка на кнопке внесите int f=0; а в обработчик – {курсив}
12.Поместите на форме, ниже кнопки с надписью СБРОС, окно редактирования с меткой LabeledEdit1 (страница Дополнительно). Свойству LabelPosition присвойте значение lpAbove (из выпадающего списка), а раскрыв свойство EditLabel, в подсвойство Caption впишите первое слово.
13.Ниже разместите кнопку Button2 (страница Стандарт) с надписью найти первое слово. В файле LR_2.cpp перед обработчиком щелчка на кнопке дайте объявления
{Memo1->Lines->Add("Первое слово - с позиции "+IntToStr(k1+1));
RichEdit1->SelStart=k1;
RichEdit1->SelLength=l1;
RichEdit1->SelAttributes->Style=
RichEdit1->SelAttributes->Style<<fsBold;
RichEdit1->SelStart=k1+l1;}
else Memo1->Lines->Add("Нет первого слова!");
}
14.Ниже разместите LabeledEdit2 (страница Дополнительно). Свойству LabelPosition присвойте значение lpAbove (из выпадающего списка), а раскрыв свойство EditLabel, в подсвойстве Caption впишите второе слово.
15.Ниже разместите кнопку Button3 (страница Стандарт) с надписью найти второе слово, в обработчик щелчка на которой внесите (курсив)
{Memo1->Lines->Add("Второе слово - с позиции "+IntToStr(k2+1));
RichEdit1->SelStart=k2;
RichEdit1->SelLength=l2;
RichEdit1->SelAttributes->Style=
RichEdit1->SelAttributes->Style<<fsBold;
RichEdit1->SelStart=k1+l2;}
else Memo1->Lines->Add("Нет второго слова!");
}
16.Введенные в компоненты LabeledEdit1 и LabeledEdit2 первое и второе слова в тексте могут оказаться стоящими как второе и первое. Следовательно, введенные слова необходимо упорядочить. Разместите на форме кнопку Button4 (страница Стандарт) с надписью упорядочить, в обработчик щелчка на которой внесите (курсив)
Memo1->Lines->Add("Второе слово - с позиции "+IntToStr(k1+1));
Memo1->Lines->Add("Первое слово - с позиции "+
IntToStr(k2+1+(l2-l1)));}
}
18.Проектирование приложения закончим включением в файл LR_2.cpp перед обработчиком щелчка на кнопке Button2 (с надписью найти первое слово) определения функции, которая для строк типа char* ищет одну строку в другой. В случае успеха функция возвращает номер позиции, с которой начинается короткая строка в длинной строке, а в случае неуспеха - возвращает -1.
int FindWord(char*str,char*word)
{ unsigned ls=strlen(str);
for(unsigned i=0; i<ls; i++)
{ bool find=true;
char*w=word; int k=i;
if(str[i]==*w)
{ while(*w) if(*w++!=str[k++])
{ find=false; break;}
if(find) return k-strlen(word);}
}
return -1;
}
19.По окончании проектирования файл LR_2.cpp будет выглядеть так:
Пример выполнения приложения представлен на рис.2.2, 2.3.
Рис.2.2 – заданные первое и второе слова найдены и выделены в тексте
Рис.2.3 – найденные слова упорядочены и переставлены местами
1.Запустите приложение на выполнение, нажав быстрые кнопки Сохранить все и Запуск. Нажмите кнопку СБРОС.
2.Наберите текст в окне Memo1 для вывода в файл. Правой кнопкой мыши щелкните на окне и во всплывшем меню выберите нужную команду (сохранить или сохранить как). Сохраните текст в файле с расширением .dat.
3.Сотрите текст в окне Memo1, щелкнув на кнопке СБРОС. Щелкните правой кнопкой мыши на окне RichEdit1 и прочитайте файл.
4.В окно первое слово введите слово из текста, выделите введенное слово и нажмите кнопку найти первое слово.
5.В окно второе слово введите слово из текста, выделите введенное слово и нажмите кнопку найти второе слово. Результат представлен на рис.2.2.
6.Нажмите кнопку упорядочить. Если в тексте порядок следования введенных слов другой, то слова в окнах ввода поменяются местами (как в примере на рис.2.2).
7.Нажатием кнопки поменять местами завершаем выполнение задания (рис.2.3).
8.Для завершения работы щелкните на кнопке формы “Закрыть” и выйдите из среды Builder.
Контрольные вопросы
1.Поясните назначение и использование компонентов “Сохранить файл” и “Открыть файл”.
2.Поясните назначение компонента контекстное всплывающее меню. Как осуществляется связь этого компонента с окнами Memo и RichEdit?
3.Какие общие свойства имеют компоненты LabeledEdit, Memo и RichEdit? Компоненты Memo и RichEdit? Чем отличается RichEdit от Memo?
4.Как используются компоненты LabeledEdit, Memo и RichEdit при выполнении задания?
5.Представьте блок-схему алгоритма, реализованного функцией FindWord(). Расскажите по алгоритму, как осуществляется поиск слова в строке.
6.Какие операции с указателями используются в функции FindWord()?
7.Как вызывается функция FindWord()?
8.Как преобразовать строку типа AnsiString в строку типа char*? Как выполнить обратное преобразование?
9.Объясните, как упорядочиваются найденные в тексте слова. Какие свойства компонента RichEdit при этом используются?
10.Объясните, как переставляются местами найденные в тексте слова. Какие свойства компонента RichEdit при этом используются?
11.Поясните назначение глобальных переменных.
12.Как сохранить в файле текст, представленный в RichEdit?
13.Как заключить в кавычки выделенные в тексте слова?
14.Как изменить размер шрифта и цвет выделенных в тексте слов?
Задания
С помощью текстового редактора создать файл, содержащий текст, длина которого не превышает 1000 символов, а длина строки текста содержит не более 70 символов.
Имя файла должно иметь расширение DAT.
Написать программу, которая:
а) выводит текст на экран дисплея;
б) далее – по варианту.
1. По нажатию произвольной клавиши поочередно выделяет каждое предложение текста; определяет количество предложений в тексте.
2. По нажатию произвольной клавиши поочередно выделяет каждое слово текста; определяет количество слов в тексте.
3. По нажатию произвольной клавиши поочередно выделяет каждое слово текста, оканчивающееся на гласную букву; определяет количество таких слов в тексте.
4. По нажатию произвольной клавиши поочередно выделяет каждое предложение текста в последовательности 2, 1, 3.
5. По нажатию произвольной клавиши поочередно выделяет каждое из слов текста, у которых первый и последний символы совпадают; определяет количество таких слов в тексте.
6. По нажатию произвольной клавиши поочередно выделяет каждое слово текста, начинающееся на гласную букву; определяет количество таких слов в тексте.
7. Определяет количество символов в самом длинном слове; по нажатию произвольной клавиши поочередно выделяет каждое слово текста, содержащее максимальное количество символов.
8. Определяет количество символов в самом коротком слове; по нажатию произвольной клавиши поочередно выделяет каждое слово текста, содержащее минимальное количество символов.
9. Определяет в каждом предложении текста количество символов, отличных от букв и пробела; по нажатию произвольной клавиши поочередно выделяет каждое предложение текста, а в выделенном предложении – поочередно все символы, отличные от букв и пробела.
10. Определяет количество предложений текста и количество слов в каждом предложении; по нажатию произвольной клавиши поочередно выделяет каждое предложение текста, а в выделенном предложении - поочередно все слова.
11. Определяет количество букв ‘а’ в последнем слове текста; по нажатию произвольной клавиши выделяет последнее слово текста, а в выделенном слове – поочередно все буквы ‘а’.
12. Определяет самую длинную последовательность цифр в тексте (считать, что любое количество пробелов между двумя цифрами не прерывает последовательности цифр); по нажатию произвольной клавиши поочередно выделяет каждую последовательность цифр, содержащую максимальное количество символов.
13. Определяет порядковый номер заданного слова в каждом предложении текста (заданное слово вводится с клавиатуры); по нажатию произвольной клавиши поочередно выделяет каждое предложение текста, а в выделенном предложении – заданное слово.
14. По нажатию произвольной клавиши поочередно выделяет в тексте заданное слово (заданное слово вводить с клавиатуры); выводит текст на экран дисплея ещё раз, выкидывая из него заданное слово и удаляя лишние пробелы.
15. По нажатию произвольной клавиши поочередно выделяет в тексте заданные слова, которые нужно поменять местами (заданные слова вводить с клавиатуры); выводит текст на экран дисплея ещё раз, меняя в нём местами заданные слова и удаляя лишние пробелы.
16. По нажатию произвольной клавиши поочередно выделяет в тексте заданное слово (заданное слово вводить с клавиатуры); выводит текст на экран дисплея ещё раз, заключая заданное слово в кавычки, и поочередно выделяет заданное слово вместе с кавычками.
17. Выводит текст на экран дисплея ещё раз, вставляя в каждое предложение в качестве последнего заданное слово, введенное с клавиатуры в качестве исходных данных; по нажатию произвольной клавиши поочередно выделяет в тексте вставленное слово.
18. По нажатию произвольной клавиши поочередно выделяет в тексте лишние пробелы между словами; выводит текст на экран дисплея ещё раз, удаляя лишние пробелы между словами и начиная каждое предложение с новой строки.
19. По нажатию произвольной клавиши поочередно выделяет в тексте заданное слово (заданное слово вводится с клавиатуры); выводит текст на экран дисплея ещё раз, заменяя в заданном слове строчные буквы прописными.
20. Определяет наибольшее количество подряд идущих пробелов в тексте; по нажатию произвольной клавиши поочередно выделяет каждую из последовательностей пробелов максимальной длины.
21. Определяет в каждой строке текста количество прописных букв; по нажатию произвольной клавиши поочередно выделяет каждое слово, начинающееся с прописной буквы, а в выделенном слове – прописные буквы.
22. По нажатию произвольной клавиши поочередно выделяет в тексте слово с заданной буквой; выводит на экран дисплея ещё раз те слова, в которых заданная буква встречается более одного раза.
23. По нажатию произвольной клавиши поочередно выводит фрагменты текста, отделенные знаками препинания; выводит на экран дисплея сведения о знаках препинания по строкам в виде: знак препинания – количество.
24. По нажатию произвольной клавиши поочередно выводит построчно фрагменты текста, разделенные символом горизонтальной табуляции; выводит на экран дисплея общее количество символов табуляции в тексте.
25. Выводит текст на экран дисплея ещё раз, разделяя знаками переноса каждое слово на слоги; по нажатию произвольной клавиши поочередно выделяет в каждой строке текста слово с наибольшим количеством слогов.
26. По нажатию произвольной клавиши поочередно выделяет в тексте слова, после которых стоит знак препинания; выводит текст на экран ещё раз, выделяя знаки препинания.
27. По нажатию произвольной клавиши выводит количество десятичных чисел по строкам; выводит текст на экран дисплея ещё раз, заменяя десятичные числа на шестнадцатеричные.
28. По нажатию произвольной клавиши поочередно выделяет каждое число в тексте; выводит текст на экран дисплея ещё раз, заменяя числа пробелами.
29. По нажатию произвольной клавиши поочередно выделяет в тексте слова с заданной буквой (вводится с клавиатуры); выводит на экран дисплея ещё раз те слова, в которых нет заданной буквы.
30. По нажатию произвольной клавиши поочередно выделяет в тексте каждые первое и второе слово с первыми строчными гласными буквами.