методичка с++. Лабораторные работы по программированию в среде С Builder 0
Скачать 1.64 Mb.
|
ЛАБОРАТОРНАЯ РАБОТА №4. ОПЕРАТОРЫ ЦИКЛА, ПРОГРАММИРОВАНИЕ ЦИКЛИЧЕСКИХ ПРОЦЕССОВ. Цель работы: освоение способов реализации циклических процессов на основе конструкций языка С++. Краткие теоретические сведения: Под циклом понимается многократное выполнение одних и тех же операторов при различных значениях промежуточных данных. Число повторений может быть задано в явной или неявной формах. Для ор- ганизации повторений в языке C++ используются три различных опе- ратора цикла. I. Цикл с параметром for (выражение1; выражение2; выражение3) { Операторы; } Здесь: выражение1 (инициализирующее). Задает начальное значение пере- менной, управляющей циклом (инициализация счётчика цикла); выражение2 задает условие продолжения цикла (как правило, это операция отношения). Если оно возвращает не ноль (истина), то вы- полняется тело цикла, если возвращает ноль (ложь), то выполняется первый оператор стоящий за закрывающей цикл фигурной скобкой; выражение3 обеспечивает изменение цикловой переменной (счетчи- ка цикла). Принцип работы for-цикла: 1. Вычисляется выражение1. 2. Вычисляется выражение2. Если оно истинно (true или не ноль), то выполняется тело цикла, после чего вычисляется выражение 3 и см. п.2 сначала. Если ложно – цикл прерывается и управление пе- редается на следующий за циклом оператор. Упражнение 1. Числа Фибоначчи Числа Фибоначчи (ряд Фибоначчи) – это элементы числовой возвратной последовательности вида 1, 1, 2, 3, 5, 8, ..., в которых каждый последующий член равен сумме двух предыдущих. Необходимо составить программу, вы- водящую первые N членов ряда Фибоначчи. 25 Один из вариантов решения: 1. Создать новый проект, имя проекта – PrFib, имя модуля unitFib. 2. В файле модуля подключить модуль iostream.h. 3. Перейти в функцию main() и набрать код, представленный на рис. 6: int N; cout << “Vvedite N:”; cin >> N; cout << endl << endl << endl << "Ryad Fibona44i для N=" << N << “:”; cout << "Элемент 1 = 1"; cout << "Элемент 2 = 1"; unsigned int f1,f2,f3; f1=f2=1; for (unsigned int i=3;i<=N;i++) { f3=f2+f1; f1=f2; f2=f3; cout << "Элемент " << i << " = " << f3; } cin >> N; Рис. 6. Код модуля 4. Запустить проект и убедиться в правильности работы кода. 5. Cамостоятельно в отладчике пошагового «прогнать» программу, предвари- тельно добавив в Wath List все необходимые переменные. 6. Нарисовать схему алгоритма программы. 7. Проанализировать работу проекта, выданного преподавателем. II. Итерационные циклы 1. Цикл с предусловием (while-цикл) while (условие выполнения цикла) { Операторы; } Принцип работы while-цикла: 1. Вычисляется условие выполнения цикла. 2. Если оно истинно (не ноль), то выполняются операторы цикл. Далее см. п.1. Если оно ложно, управление передается на следующий оператор. 26 2. Цикл с постусловием (do-while цикл) do { операторы; } while (условие выполнения цикла); Принцип работы do-while-цикла: 1. Выполняются операторы цикла. 2. Вычисляется условие выполнения цикла. Если оно истинно (не ноль), то см. п.1. Если оно ложно, управление передается на следующий оператор. Упражнение 2. 1. Открыть проект PrWhileFib 2. Перейти в модуль, и сравнить код с тем, что был приведен в п. 3 упражнения 1. 3. Запустить программу, убедиться в ее работоспособности. 4. Нарисовать схему алгоритма программы. 5. Как можно было бы оптимизировать программный код? 6. Изменить while-цикл на do-while цикл. Модуль сохранить с именем unitDoWhileFib, а проект – с именем PrDoWhileFib. 7. Проанализировать работу проекта, выданного преподавателем. Содержание отчета: 1. Титульный лист 2. Цель работы 3. Краткие теоретические сведения (список используемых операторов, их цель, синтаксис, формат и проч.) 4. Коды модулей С++ 5. Копии экрана с примерами работы программ 6. Схемы алгоритмов программ. 7. Выводы по работе. Контрольные вопросы 1. Дайте определение понятия «цикл». 2. Объясните понятия «условие продолжение цикла», «условие окончания цикла», «тело цикла», «прерывание цикла», «зацикливание». 27 3. Какие виды циклов Вам известны? 4. Нарисуйте схему алгоритма цикла с преусловием. 5. Нарисуйте схему алгоритма цикла с постусловием. 6. В каких случаях используются итерационные циклы? 7. Какие виды итерационных циклов Вам известны? 8. Когда удобно использование цикла с параметром? 9. К какому виду относится цикл с параметром: к циклам с предусловием или с постусловием? почему? 10. Сколько синтаксических конструкций для реализации циклов существует в С++? Приведите их запись. 11. Объясните назначение выражения 1, выражения 2, выражения 3 в синтак- сисе записи for-цикла. 12. Объясните принцип работы for-цикла. 13. Могут ли в for-цикле в полях выражения 1, выражения 2, выражения 3 находится составные операторы? оператор «запятая»? 14. Может ли тело цикла быть простым оператором? составным? 15. Может ли выражение 2 в синтаксисе записи for-цикла содержать не логи- ческое выражение? 16. Допустимо ли в for-цикле объявление переменных в выражении 1, выра- жении 2, выражении 3, а также в теле цикла? 17. Запишите цикл с предусловием в синтаксисе С++. 18. Каков алгоритм выполнения while-цикла? 19. Запишите цикл с постусловием в синтаксисе С++. 20. Каков алгоритм выполнения do-while-цикла? 21. Допустимо ли объявление переменных в теле while или do-while циклов? 22. Может ли в поле «условие» while или do-while циклов находится не логи- ческое выражение? 28 ЛАБОРАТОРНАЯ РАБОТА №5 МАССИВЫ ДАННЫХ, ПРОГРАММИРОВАНИЕ ЦИКЛИЧЕСКИХ ПРОЦЕССОВ Цель работы: знакомство с массивами; освоение реализаций цикличе- ских алгоритмов при работе с массивами; знакомство с датчиком случайных чисел. Краткие теоретические сведения I. Массивы в С++ 1. Одномерный массив. Для объявления: <ТипЭлементовМассива> <ИмяМассива> [<КоличествоЭлементовМассива>]; Для обращения к элементу массива: <ИмяМассива>[<НомерЭлемента>] Нумерация элементов начинается с 0!!!! 2. Двумерный массив Для объявления: <ТипЭлементовМассива> <ИмяМассива>[<КоличествоСтрок>][<КоличествоСтолбцов>]; Для обращения к элементу массива: <ИмяМассива>[<НомерСтроки>][<НомерСтолбца>] Нумерация элементов начинается с 0!!!! Упражнение 1. Ввод значений элементов массива. 1. Создать новый проект. Сохранить его в папке «InpTable». Имя проекта – InpTable, имя файла модуля – unitTable. 2. Перейти в функцию main, набрать в ней следующий код: double Mas[100]={0}; unsigned char NEl; cout << «Vvedite koli4estvo elementov massiva (<100)»; cin >> NEl; for (int i=1;i<=NEl;i++) { cout << “Vvedite znachenie elementa N”< cin >> Mas[i-1]; } 3. В режиме отладчика запустить программу до строки return 0. Задать количество элементов – 5, значения элементов – 20, 10, 0, -10, -20. 29 4. Открыть Watch List и добавить в него переменную Mas. Просмотреть ре- зультат. 5. Добавить в Watch List переменные Mas[0], Mas[2], Mas[4]. Просмотреть результат, сравнить его с тем, что наблюдалось в п. 4. Сделать вывод, какой из способов (п. 4 или п. 5) удобнее. 6. Сбросить программу. 7. Убрать (удалить) в строке double Mas[100]={0} символы ={0}. 8. Вновь выполнить п. 3 и просмотреть Watch List. Какие изменения наблю- даются? Почему? 9. Сбросить программу. 10. Вернуться в функцию main() и после окончания цикла по i набрать следующий код: for (int j = 0;j { cout << Mas[j]<<", "; } cout << endl; 11. Не запуская программу, постараться понять действия, выполняемые в вышеприведенном коде. 12. Проверить свои размышления: запустить программу, задать количество элементов – 5, значения элементов – 20, 10, 0, -10, -20. 13. Выполняется по желанию: изменить код в блоке вывода так, чтобы после значения последнего элемента массива не выводилась бы запятая. 14. Закомментарить строки ввода NEl и цикла по i. Вспомнив возможности инициализации, задать значения первым шести элементам массива 20, 0.2, 30, 0.3, 40, 0.4. 15. Сохранить проект. Краткие теоретические сведения: II. Датчик случайных чисел При работе с массивами очень удобен встроенный датчик слу- чайных чисел (функция rand), который существенно облегчает зада- ние значений элементов массива. Синтаксис: <ИмяПеременной> = rand(); 30 Функция возвращает псевдослучайное целое число (тип int) в диапазоне от 0 до RAND_MAX. RAND_MAX – константа, определяющая максимальное значение, которое может быть возвращено функцией rand(). RAND_MAX = 2 32 = 4 294 967 296. Примечания: 1. Для генерации случайных чисел, находящихся в диапазоне 0…N следует пользоваться следующей записью: <ИмяПеременной> = rand() % (N+1); 2. Для генерации случайных чисел, находящихся в диапазоне -N…N следует пользоваться следующей записью: <ИмяПеременной> = (rand() % (2N+1))-N; 3. Для генерации действительных чисел, находящихся в диапазоне 0…N следует пользоваться следующей записью: <ИмяПеременной> = N.*rand()/RAND_MAX; 4. Поскольку генерируемые функцией rand числа являются псевдо- случайными, при каждом новом запуске приложения будет вырабаты- ваться одна и та же последовательность чисел. Если это недопус- тимо, генератор случайных чисел надо принудительно рандомизиро- вать, т. е. задавать каждый раз новое случайное исходное (первое в последовательности) число. Для этого в тексте программы перед запуском датчика указывается оператор randomize(); 5. Функции rand и randomize описаны в файле stdlib.h, поэтому для использования описанных функций необходимо вручную подклю- чить файл stdlib.h, используя директиву: #include Упражнение 2. Заполнение массива с помощью датчика случайных чисел 1. Открыть проект InpTable из папки InpTable. 2. Сохранить проект с именем RandTable в новой папке. 3. В блоке ввода исходных данных добавить ввод переменной, отвечающей за режим заполнения массива. Имя переменной – Reg. Будем полагать сле- дующий принцип работы: при Reg=1 – массив заполняется вручную с кла- виатуры, при Reg=2 генерируются целые случайные числа от 0 до N, при reg=3 генерируются целые случайные числа от –N до N, а при Reg=4 гене- рируются действительные случайные числа в диапазоне 0 …N. 31 4. После блока ввода исходных данных написать код, действующий согласно алгоритму, представленному на рис. 7 (по возможности, код оптимизиро- вать!): 5. Запустить программу и убедиться в ее работоспособности. Содержание отчета: 1. Титульный лист 2. Цель работы 3. Краткие теоретические сведения (список используемых операторов, их цель, синтаксис, формат и проч.) 4. Коды модулей С++ 5. Копии экрана с примерами работы программ 6. Схемы алгоритмов программ. 7. Выводы по работе. Контрольные вопросы 1. Дайте определение понятия «массив» 2. Что такое размер и размерность массива? 3. Какие сведения нужно знать для объявления массива в С++? 4. Каков синтаксис объявления в С++ одномерного массива? 5. Каков синтаксис объявления в С++ двумерного массива? 6. Каков принцип нумерации элементов массива? 7. Как обратиться к i-му элементу массива? 8. Как выполнить инициализацию ячеек массива? 9. Объясните принцип задания значений элементов массива при консольном режиме ввода. 10. Объясните принцип вывода значений элементов массива при консольном режиме. 11. Для каких целей служит встроенный датчик случайных чисел? 12. В каком стандартном файле описаны функции, необходимые для исполь- зования датчика случайных чисел? Как подключить этот файл? 13. Какой тип данных у случайных чисел, генерируемых с помощью функции rand? 14. Ограничен ли предел значений случайных чисел, генерируемых функци- ей rand? Укажите этот интервал. 32 Рис. 7. Схема алгоритма начало Да Код, позволяющий вручную с клавиатуры ввести значе- ния элементов массива Примечание. Уже сделано в пре- дыдущем упражнении Нет В коде в отдельном цикле должна добавиться строка вида Mas[i]=rand()%(N+1); Ввод ручной? Генерировать целые числа от 0 до N? Да Нет Генерировать целые числа от –N до N? Да Нет конец Код написать самостоятель- но с учетом примечания 2 и примера в блоке слева. Код написать самостоятель- но с учетом примечания 3 и примера в блоке слева. Ввод N 33 15. Каким образом получить случайное целое число (набор целых случайных чисел), значения котор ого( ых ) наход и( я ) тся в интервале [0, K]? 16. Каким образом получить целое случайное число (набор целых случайных чисел), значения которого(ых) находи(я)тся в интервале [ K, K]? 17. Каким образом получить действительное случайное целое число (набор действительных случайных чисел), значения которого(ых) находи(я)тся в ин- тервале [0, K]? 18. Каким образом получить действительное случайное целое число (набор действительных случайных чисел), значения которого(ых) находи(я)тся в ин- тервале [ K, K]? 19. Объясните понятие «рандомизация генератора случайных чисел». 20. Какая функция служит для перезапуска генератора случайных чисел? 34 ЛАБОРАТОРНАЯ РАБОТА №6 ПРОГРАММИРОВАНИЕ ПОЛЬЗОВАТЕЛЬСКОГО ИНТЕРФЕЙСА: ОСНОВНЫЕ СВОЙСТВА ВИЗУАЛЬНЫХ КОМПОНЕНТОВ. ЛИНЕЙНЫЙ ВЫЧИСЛИТЕЛЬНЫЙ ПРОЦЕСС. Цель работы: знакомство с принципом разработки приложений с окон- ным пользовательским интерфейсом; освоение визуальных компонентов, не- обходимых для организации линейного вычислительного процесса. Краткие теоретические сведения: I. Создание приложения с оконным windows-интерфейсом пользовате- ля состоит из создание заготовки окна-приложения с размещенными на ней элементами управления (поля ввода, кнопки, списки и проч.) и программирования событий этих элементов управления. Как правило, проект с заготовкой окна-приложения автоматически от- крывается при запуске среды. Стандартный состав окон среды программирования C++ Builder 6.0 представлен на рис. 8. Рис. 8. Возможный вид интерфейса среды программирования Палитра компонентов Редактор кода Окно Object Inspector Дизайнер (окно) формы Панель инструментов 35 II. Способы просмотра/переключения между основными окнами среды представлены в табл. 2. Таблица 2 Окно Цель окна Способ переключения Через меню Клавиатур- ный аналог Project Manager (Менеджер проекта) Просмотр структуры проек- та; Добавление нового мо- дуля в проект; Удаление существующего модуля из проекта. View Pro- ject Manager Ctrl+Shift+F11 Object Inspector (инспектор объек- тов) Управление свойствами и событиями визуальных компонент View Ob- ject Inspec- tor F11 Переключение мо- дуль/форма или форма/модуль View Tog- gle Form|Unit F12 Для любого откры- того окна View Win- dow List III. Состав проекта. Состав проекта C++ Builder с оконным интерфейсом: файл проекта (*.срр) (головной файл проекта). двоичный файл ресурсов *.res. текстовый файл опций проекта *.bpr файлы модулей (см. ниже). В 99% случаев эти файлы не подлежат коррекции пользователем. Од- нако, можно просмотреть головной файл проекта, выполнив Project View Source. Каждый проект состоит из модулей. Каждый модуль содержит ис- ходный текст логического блока программы на языке C++ и пред- ставляет собой файл с расширением *.срр. Модуль может быть связан с формой или не связан с ней. Для модуля, связанного с формой, автоматически среда C++ Builder создаются еще два отдельных файла: h-файл(*.h) – заголовочный файл модуля; cодержит описание содержащихся на форме компонентов и обработчиков событий. Файл формы (.dfm) - двоичный файл (или текстовый) формы. Как правило, все изменения в заголовочный файл и файл формы вно- сятся средой C++ Builder автоматически. 36 При создании нового проекта один модуль с формой создаются автоматически. Остальные модули и формы добавляются по желанию пользователя в процессе работы над проектом. Для создания нового проекта: File New Application. Для открытия существующего проекта: File Open Project. Для сохранения головного файла проекта File Save Project As. |