Оператор безусловного перехода
Оператор goto передает управление программой оператору, помеченному меткой, которая задана в операторе goto.
goto метка;... метка: оператор |
Все метки должны оканчиваться двоеточием и не должны вступать в конфликт ни с какими ключевыми словами или именами функций. Кроме того, оператор goto может передавать управление только внутри текущей функции (не от одной функции к другой).
Пример:
for (int i=0; i<100; i++) { for (int j=0; j<10; j + +) { for (int k=0; k<20; k++) { cout << i << j << k << endl; if (i*j*k == 259) goto done; // переход на метку done } } } done: cout << "i*j*k=259 – стоп"; |
Несмотря на то, что следует избегать использования оператора goto в качестве универсальной формы управления циклами, в особых случаях его все-таки можно применять с большим успехом.
Лабораторная работа № 2. Операторы языка С.
Продолжительность – 4 часа.
Максимальный рейтинг – 8 баллов.
Цель работы
Изучить операторы языка С++, научиться применять их при написании программ. Научиться отслеживать значения числовых и логических переменных и выражений в процессе отладки программы. Освоить умение переводить мнемонические выражения в последовательность операторов.
Задание на лабораторную работу
1. Преобразовать индивидуальное задание из мнемонического описания в последовательность операторов языка С++, построить блок-схему алгоритма и доказать его адекватность текстовому заданию.
2. Создать проект на Visual C++, написать программу на языке С++ в соответствии с разработанным алгоритмом, отладить ее и запустить на выполнение. Продемонстрировать преподавателю выполнение программы.
3. Все числовые константы по заданию вводить с клавиатуры. Ввод данных организовать в диалоговом интерактивном режиме.
4. Выводить на экран не только конечные значения переменных, но и их текущие значения в процессе расчета.
5. Произвести тестирование программы, задавая, по-возможности, нереальные и не предусмотренные заданием значения переменных. На этапе тестирования программы произвести проверку на зацикливание – предусмотреть невозможность попадания программы в «вечный цикл».
6. Составить отчет, в котором отразить листинг программного кода с комментариями, привести блок-схему алгоритма и скриншоты с результатами работы программы.
Таблица 2. Варианты индивидуальных заданий
1.
задать переменную i равную -10.
задать переменную j равную 28.
пока i меньше 23, повторять седующие действия: (
если i равно j, то i увеличить вдвое, иначе j уменьшить на 1.
увеличить i на 2).
| 2.
задать переменную q равную -30.
задать переменную r равную 6.
пока q меньше или равно 20, повторять седующие действия: (
если q равно r, то q увеличить втрое, иначе r уменьшить на 2.
увеличить q на 3).
|
3.
задать переменную M равную 28.
задать переменную L равную 10.
пока L меньше 19, повторять седующие действия: (
если L не равно M, то M уменьшить на 4, иначе L увеличить вдвое.
увеличить L на 1).
| 4.
задать переменную D равную -6.
задать переменную W равную 8.
пока D не станет равно 12, повторять седующие действия: (
если D не равно W, то W увеличить втрое, иначе W уменьшить на 5.
увеличить D на 3).
|
5.
задать переменную I равную 10.
задать переменную Y равную 8.
пока I больше -3, повторять седующие действия: (
если Y равно I, то I уменьшить вдвое, иначе Y уменьшить на 10.
уменьшить I на 3).
| 6.
задать переменную U равную 13.
задать переменную V равную 6.
пока U больше или равно -13, повторять седующие действия: (
если U равно V, то V увеличить втрое, иначе U уменьшить на 2.
уменьшить U на 3).
|
7.
задать переменную P равную 28.
задать переменную Q равную 10.
пока P больше 1, повторять седующие действия: (
если P не равно Q, то Q уменьшить на 4, иначе P уменьшить вдвое.
уменьшить P на 1).
| 8.
задать переменную D равную 6.
задать переменную W равную 18.
пока D не станет равно -12, повторять седующие действия: (
если D не равно W, то W увеличить втрое, иначе W уменьшить на 5.
уменьшить D на 3).
|
9.
задать переменную A равную -10.234.
задать переменную B равную 0.28.
пока A меньше 2.3, повторять седующие действия: (
если A равно B, то A возвести в квадрат, иначе B уменьшить на 1.3.
увеличить A на 2.5).
| 10.
задать переменную x равную -3.14.
задать переменную y равную 6.28.
пока x меньше или равно 20.34, повторять седующие действия: (
если x равно y, то x увеличить втрое, иначе y уменьшить на 2.36.
увеличить x на 3.14).
|
11.
задать переменную m равную 28.6.
задать переменную k равную 10.7.
пока k меньше 1.9, повторять седующие действия: (
если m не равно k, то m уменьшить на 4, иначе k увеличить вдвое.
увеличить k на 0.1).
| 12.
задать переменную f равную -6.0.
задать переменную g равную 8.4.
пока f не станет равно 12.0, повторять седующие действия: (
если f не равно g, то g увеличить втрое, иначе g уменьшить на 5.7.
увеличить f на 3.0).
|
13.
задать переменную H равную 10.5.
задать переменную h равную 8.6.
пока H больше -3.5, повторять седующие действия: (
если h равно H, то H уменьшить вдвое, иначе h уменьшить на 10.3.
уменьшить H на 3.5).
| 14.
задать переменную z равную 13.2.
задать переменную s равную 6.3.
пока z больше или равно -13.1, повторять седующие действия: (
если z равно s, то s увеличить втрое, иначе z уменьшить на 2.2.
уменьшить z на 3.7).
|
15.
задать переменную P равную 2.8.
задать переменную Q равную 10.1.
пока P больше 1.13, повторять седующие действия: (
если P не равно Q, то Q уменьшить на 0.4, иначе P уменьшить вдвое.
уменьшить P на 1.1).
| 16.
задать переменную j равную 7.2.
задать переменную i равную 1.8.
пока j не станет равно -1.2, повторять седующие действия: (
если j не равно i, то i увеличить втрое, иначе i уменьшить на 5.1.
уменьшить j на 1.2).
|
17.
задать переменную A равную -10.
задать переменную B равную 8.
повторять седующие действия: (
если A равно B, то A поделить пополам, иначе B уменьшить на 3.
увеличить A на 5), пока A меньше 3.
| 18.
задать переменную x равную -3.
задать переменную y равную 6.
повторять седующие действия: (
если x равно y, то x увеличить втрое, иначе y уменьшить на 2.
увеличить x на 3), пока x меньше или равно 20.
|
19.
задать переменную m равную 26.
задать переменную k равную 17.
повторять седующие действия: (
если m не равно k, то m уменьшить на 4, иначе k увеличить вдвое.
увеличить k на 1), пока k меньше 1.
| 20.
задать переменную f равную -6.
задать переменную g равную 14.
повторять седующие действия: (
если f не равно g, то g увеличить втрое, иначе g уменьшить на 5.
увеличить f на 3), пока f не станет равно 12.
|
21.
задать переменную H равную 11.51.
задать переменную h равную 7.6.
повторять седующие действия: (
если h равно H, то H уменьшить вдвое, иначе h уменьшить на 1.3.
уменьшить H на 3.5), пока H больше -13.5.
| 22.
задать переменную z равную 17.2.
задать переменную s равную 2.3.
повторять седующие действия: (
если z равно s, то s увеличить втрое, иначе z уменьшить на 0.2.
уменьшить z на 0.7), пока z больше или равно -3.1.
|
23.
задать переменную P равную 2.81.
задать переменную Q равную 10.11.
повторять седующие действия: (
если P не равно Q, то Q уменьшить на 0.43, иначе P уменьшить вдвое.
уменьшить P на 1.17), пока P больше 1.73.
| 24.
задать переменную j равную 11.2.
задать переменную i равную 1.18.
повторять седующие действия: (
если j не равно i, то i увеличить втрое, иначе i уменьшить на 5.11.
уменьшить j на 1.12), пока j не станет равно -1.12.
|
Указатели
— Зайди сюда, сынок!
— Отсутствует ссылка.
— НА КУХНЮ ЗАЙДИ!!!
Указатель - это переменная, которая содержит адрес некоторого объекта (переменной, ячейки памяти, функции) в памяти компьютера. Говорят, что указатель ссылается на перемнную, функцию и т.д. Понятно, что адрес - целое число. Понимание и правильное использование указателей очень важно для создания хороших программ. Многие конструкции языка С++ требуют применения указателей. Например, указатели необходимы для успешного использования функций и динамического распределения памяти. С указателями следует обращаться очень осторожно, но обойтись без указателей в программах на язке С++ невозможно.
Указатель описывается при помощи символа "*":
тип_данных * имя_переменной_указателя; // типизированный указатель void * имя_переменной_указателя; // нетипизированный указатель |
Специальных операций для работы с указателями всего две: это унарная операция "&", означающая "взять адрес переменной" – адресация и унарная операция "*", означающая "взять значение переменной, расположенное по указанному адресу" – разадресация.
int x= 101; // задать переменную x целого типа и присвоить ей значение 101 int* y; // задать переменную y – указатель на переменную целого типа y= &x; // присвоить переменной-указателю y адрес переменной х int z = *у; // переменной z присвоить значение, хранящееся в ячейке с адресом y |
Типизированный указатель указывает на ячейку памяти определенного типа, и использование его для адресации ячейки другого типа будет ошибкой. Нетипизированный указатель значение void* содержит абстрактный адрес и, прежде чем использовать его, необходимо принудительно преобразовать тип адреса.
Указатели можно использовать как операнды в арифметических операциях. Над указателями можно выполнять унарные операции: инкремент и декремент. При выполнении операций "++" и "--" значение указателя увеличивается или уменьшается на 1. Но не на 1 байт, а на 1 ячейку того типа, на который он указывает.
Спецификация "%p" функции printf() в С++ позволяет вывести на экран адрес памяти в шестнадцатеричной форме.
Пример:
int x= 101; void *v= &x; // нетипизированному указателю v присвоен адрес переменной х printf(" x= %d, v= %p \n", x, v); int *pw= (int*)v; // явное преобразование типа void* к типу int* printf(" x= %d, v= %p, pw= %p\n", x, v, pw); pw++; printf(" v= %p, pw= %p\n", v, pw); |
Рис. 9. Результаты выполнения программы
Из рисунка (Рис. 9) можно видеть, что адрес указателя pw после операции pw++ изменился на 4 – на sizeof(int) - размер ячейки памяти типа int. Указатели и целые числа можно складывать. Конструкция pw+3 задает адрес объекта, сдвинутый на 3 ячейки относительно той, на которую указывает pw. Это справедливо для любых объектов (int*, char*, float* и др.); транслятор будет масштабировать приращение адреса в соответствии с типом, указанным в определении объекта.
Значения двух указателей на одинаковые типы можно сравнивать в операциях ==,!=, <, <=, >, >= при этом значения указателей рассматриваются просто как целые числа, а результат сравнения равен 0 (false) или 1 (true).
int *ptr1, *ptr2, a=10; ptr1= &a+5; ptr2= &a+7; if (prt1>ptr2) cout << "ptr1>ptr2"; // не будет выполнено |
Для задания несуществующего адреса заведена константа-указатель NULL. Любой адрес можно проверить на равенство (==) или неравенство (!=) со специальным значением NULL, которое позволяет определить ничего не адресующий указатель.
Воспользуйтесь поиском по сайту: