Оператор выбора (переключатель)
Формат оператора выбора: switch (целочисленное_выражение) { case константа1: список_операторов; case константа2: список_операторов; .................. default: список_операторов; }
1. Вычисляется выражение. 2. Полученное значение последовательно сравнивается с константами, при первом совпадении значений выполняются операторы, стоящие после двоеточия. 3. Если ни с одной из констант совпадения не произошло, то выполнятся операторы после слова 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 Это удовлетворительно! Это хорошо! Это отлично! Нет такой оценки! Указатели Понятие указателя знакомо читателю из разд. 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 т. е. переменные х и у поменялись значениями.
Массивы Понятие массива знакомо из Паскаля. Массив — это структура однотипных элементов, занимающих непрерывную область памяти. С массивом связаны следующие его свойства: имя, тип, размерность, размер. Формат описания массива следующий: тип элементов имя [константное_выражение]
Константное выражение определяет размер массива, т. е. число элементов этого массива. Например, согласно описанию int A[10]; Нижнее значение индекса равно 0: В отличие от Паскаля в Си нельзя определять произвольные диапазоны для индексов. Размер массива может явно не указываться, если при его объявлении производится инициализация значений элементов. Например: int p[]={2, 4, 6, 10, 1}; int M[6]={5, 3, 2}; будет создан массив из шести элементов. Первые три элемента получат инициализированные значения. Значения остальных будут либо неопределенными, либо равны нулю, если массив внешний или статический. Пример. Ввод с клавиатуры и вывод на экран одномерного массива. #include <iostream.h> #include <conio.h> void main () { int i, A [ 5 ]; clrscr(); for(i=0; i<5; i++) { cout<<"A["<<i<<"]="; cin>>A[i]; for(i=0; i<5; i++) cout<<"A["<<i<<"] ="<<A[i]<<” ”; }
Пример. Ввод вещественного массива и вычисление среднего значения. //Среднее значение массива #include <iostream.h> #include <conio.h> void main () { const n=10; int i; double A[n], SA; clrscr (); for(i=0; i<n; i++) {cout<<"A["<<i<<" ] ="; cin>>A[i]; } SA=0; for(i=0; i<n;i++) SA=SA+A[i]; SA=SA/n; cout<<" /n Середнее значение="<<SА; } В этой программе обратите внимание на определение размера массива через константу. Пример. Сортировка массива «методом пузырька». //Сортировка массива #include <iostream.h> #nclude <conio.h> void main () { int X[]={6,4,9,3,2,1,5,7,8,10}; int i,j,n,A; clrscr (); n=sizeof (X) /sizeof (X[0]); for(i=0; i<n-l; i++) for(j=0; j<n-l-i; j++) if (X[j]>X[j+l]) {A=X[j]; X[j]=X[j+l]; X[j+1]=A;} for(i=0; i<n; i++) cout<<X[i]<<" "; } Чтобы сделать программу универсальной по отношению к размеру массива, значение размера вычисляется автоматически и заносится в переменную n. Для этого используется операция sizeof () — определение размера в байтах. Результат sizeof (X) равен размеру в памяти всего массива х — 20 байтам. Результат sizeof (X[0]) равен размеру одного элемента массива — 2 байтам. Отношение этих величин равно 10 — числу элементов массива. Внимательно проанализируйте организацию перебора значений параметров вложенных циклов — i, j.
В результате выполнения этой программы на экран выведется упорядоченная числовая последовательность 123456789 10 Многомерные массивы. Двумерный массив трактуется как одномерный массив, элементами которого является массив с указанным в описании типом элементов. Например, оператор float R[5] [10]; объявляет массив из пяти элементов, каждый из которых есть массив из десяти вещественных чисел. Отдельные величины этого массива обозначаются именами с двумя индексами: R [ 0 ] [ 0 ], R [ 0 ] [ 1 ],..., R [ 4 ] [ 9 ]. Объединять индексы в одну пару скобок нельзя, т. е. запись R [ 2, 3 ] ошибочна. Пример описания трехмерного массива: double X[3] [7] [20]; Как и в Паскале, порядок расположения элементов многомерного массива в памяти такой, что прежде всего меняется последний индекс, затем предпоследний и т.д., и лишь один раз пробегает свои значения первый индекс. При описании многомерных массивов их также можно инициализировать. Делать это удобно так:
int M[3] [3]={ 11,12,13, 21,22,23, 31,32,33 }; Рассмотрим примеры программ обработки матриц — числовых двумерных массивов. Пример. Вычисление и вывод на экран таблицы умножения в форме матрицы Пифагора, // Матрица Пифагора #include <stdio.h> #include <conio.h> void main () { int i, j, A[10] [10]; clrscr (); for(i=l; i<=9;i++) { for(j=l; j<=9;j++) {A[i][j]=i*j; printf ("%5d",A[i] [j]); } printf ("\n"); } } По данной программе в двумерном массиве А не будут заполнены нулевая строка и нулевой столбец. По-прежнему интерпретируем первый индекс двумерного массива как номер строки матрицы, а второй индекс — как номер столбца. Пример. Заполнение матрицы случайными числами в диапазоне от 0 до 99 и поиск в ней максимального значения. #include <iostream.h> #include <iomanip.h> #include <conio.h> #include <stdlib.h> #define n 5 void main() { int i,j,ImaxA,JmaxA,A[n][n]; clrscr (); randomize(); //Установка датчика случайных чисел for(i=0; i<n;i++) { for(j=0;j<n;j++) { A[i][j]=rand()%100; cout<<setw (6) <<A[i] [ j ]; } cout<<endl; } ImaxA=JmaxA=0; for(i=0; i<n; i++) { for(j=0; j<n; j++) if (A[i][j]>A[ImaxA][JmaxA]) { ImaxA=i; JmaxA=j; } } сout<<"Максимальное_значение:[“<<ImaxA<<"][“<<JmaxA<<”]="<<A[ImaxA][JmaxA]; }
17. Практические задания ПРАКТИЧЕСКАЯ РАБОТА №1 (линейное программирование) Написать программу, вычисляющую значение функции
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|