Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Оператор выбора (переключатель)




Формат оператора выбора:

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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...