- •Часть 1
- •«Языки программирования»
- •2. Объектно-ориентированное программирование
- •3. Лексические элементы языка
- •4. Типы данных
- •5. Область видимости
- •Операции и выражения
- •Структура программы
- •7. Директивы препроцессора
- •8. Данные вещественного типа (см. Типы данных)
- •10. Данные логического типа
- •11. Программирование ветвлений. Инструкции if и if-else
- •12. Данные символьного типа
- •Описание данных символьного типа
- •13. Программирование циклов
- •14. Оператор выбора (переключатель)
- •15. Указатели
- •16. Массивы
- •17. Практические задания
- •Практическая работа №2 (программирование ветвлений)
- •Практическая работа №3 (программирование циклов)
- •Практическая работа №4(массивы)
14. Оператор выбора (переключатель)
Формат оператора выбора:
switch (целочисленное_выражение)
{ case константа1: список_операторов;
case константа2 : список_операторов;
. . . . . . . . . . . . . . . . . .
default: список_операторов; }
Вычисляется выражение.
Полученное значение последовательно сравнивается с константами, при первом совпадении значений выполняются операторы, стоящие после двоеточия.
Если ни с одной из констант совпадения не произошло, то выполнятся операторы после слова default.
Для того чтобы «обойти» выполнение операторов на последующих ветвях, нужно принять специальные меры, используя операторы выхода или перехода.
Рассмотрим фрагмент программы, который переводит числовую оценку знаний ученика в ее словесный эквивалент. Согласно вузовской системе: 5 — «отлично», 4 — «хорошо», 3 — «удовлетворительно», 2 — «неудовлетворительно».
Пример .
#include <iostream.h>
void main ()
{int ball;
cout<<"\nBBeдите оценку: ";
cin>>ball;
switch (ball)
{ case 2: cout<<" \tЭтo неудовлетворительно ! \n"; break;
case 3: cout<<" \tЭTO удовлетворительно ! \n"; break;
case 4: cout<<"\t Это хорошо !\n"; break;
case 5: cout<<" \tЭTO отлично !\n"; break;
default: cout<<"\tHeт такой оценки! \n";
}
}
Два варианта результатов выполнения этой программы:
Введите оценку: 3 Это удовлетворительно!
Введите оценку: 7 Нет такой оценки!
Если на всех ветвях убрать оператор break, то результат может выглядеть следующим образом:
Введите оценку: 3 Это удовлетворительно!
Это хорошо! Это отлично! Нет такой оценки!
15. Указатели
Понятие указателя знакомо читателю из разд. 3.21, в котором описывается ссылочный тип данных в Паскале. Смысл этого понятия в Си/Си++ остается тем же: указатель — это адрес поля памяти, занимаемого программным объектом.
Операция & — адрес. Применение этой операции к имени переменной дает в результате ее адрес в памяти.
Описание указателей. Для хранения адресов используются переменные типа «указатель». Формат описания таких переменных следующий:
тип *имя_переменной
Примеры описания указателей:
int *pti; char *ptc; float *ptf;
После такого описания переменная pti может принимать значение указателя на величину целого типа; переменная ptc предназначена для хранения указателя на величину типа char; переменная ptf — на величину типа float.
Указателям могут присваиваться значения адресов объектов только того типа, с которым они описаны. В нашем примере допустимы операторы
pti=&a; ptc=&c; ptf=&r; В результате указатели примут следующие значения:
pti - FFCO, ptc - FFC2, ptf - FFC3.
Как и для других типов данных, значения указателей могут инициализироваться при описании. Например:
int a=5; int *pti=&a; char c='G'; char *ptc=&c; float r=1.2E8; float *ptf=&r;
В заголовочном файле stdio. h определена константа — нулевой указатель с именем null. Ее значение можно присваивать указателю. Например:
ptf=NULL;
Не надо думать, что после этого указатель ptf будет ссылаться на нулевой байт памяти. Нулевой указатель обозначает отсутствие конкретного адреса ссылки.
Использованный в описаниях указателей символ * (звездочка) в данном контексте является знаком операции разадресацш. С ее помощью можно сослаться через указатель на соответствующую переменную.
После приведенных выше описаний в записи выражений этой программы взаимозаменяемыми становятся а и *pti, с и *ptc, г и *ptf. Например, два оператора
х=а+2; И x=*pti+2; тождественны друг другу. В результате выполнения оператора
cout«*pti«a;
на экран выведется 55.
Операции над указателями. Записывая выражения и операторы, изменяющие значения указателей, необходимо помнить главное правило: единицей изменения значения указателя является размер соответствующего ему типа.
Использование указателей для передачи параметров функции. Рассматривая ранее правила использования функций, мы обращали внимание на то, что в языке Си возможна только односторонняя передача значений фактических параметров из вызывающей программы к формальным параметрам вызываемой функции. Возвращаемое значение несет сама функция, используемая в качестве операнда в выражении. Отсюда, казалось бы, следует неукоснительное правило: в процессе выполнения функции не могут изменяться значения переменных в вызывающей программе. Однако это правило можно обойти, если в качестве параметров функции использовать указатели.
В следующем примере функция swap ( ) производит обмен значениями двух переменных величин, заданных своими указателями в аргументах.
void swap(int *a,int *b)
{ int с ;
Если в основной программе имеется следующий фрагмент:
int x=l,y=2; swap (&x, &у) ; printf("x=%d y=%d",x,y) ;
то на экран будет выведено:
х=2 у=1 т. е. переменные х и у поменялись значениями.
