3511 ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ НА ЯЗЫКЕ С++

1. ПРОГРАММИРОВАНИЕ ЛИНЕЙНЫХ АЛГОРИТМОВ

Основные понятия

Программа на языке С++ представляет собой совокупность функций. Обязательно присутствует хотя бы одна функция main()  или WinMain(), которая является точкой входа в программу. С нее обычно начинается выполнение программы.   Пользователь может сам определять функции или использовать более тысячи библиотечных функций.

Определение функции состоит из заголовка и блока выполняемых функцией операторов.

Заголовок включает тип возвращаемого функцией значения, имя функции и в круглых скобках - список параметров функции, разделенных запятыми. Блок представляет собой совокупность объявлений локальных переменных, операций, операторов и вызовов других функций, заключенную в фигурные скобки. Для возврата  результата функции используется зарезервированное слово return с последующим выражением, которое подсчитывается и его результат ставится в соответствие с вызовом функции.

Каждая программа включает  в себя директивы препроцессора, начинающиеся с символа #. Препроцессор представляет собой программу, обрабатывающую текст программы пользователя до компиляции. Управление препроцессором осуществляется из программы пользователя при помощи специальных команд – директив. Чаще всего используются директивы #define и #include.

Директива  #define позволяет задать имя для некоторого фрагмента текста, такое обозначение называется макроопределением или макросом. Формат записи:

#define NAME Текст замены

Препроцессор просматривает текст программы и заменяет NAME текстом замены.

Например:

#define COUNT  100

В тексте программы все имена COUNT будут заменяться на 100. Традиционно имена макросов записываются заглавными буквами.

Директива  #include “имя файла” позволяет включить в текст программы пользователя содержимое указанного файла. Если имя файла находится в кавычках, он должен находиться в текущей директории или необходимо указать путь к нему. Для файлов, хранящих  заголовки библиотечных функций, отведен специальный каталог с именем INCLUDE, в этом случае имя файла помещают в угловые скобки: #include <iostream.h>. Для расширений включаемых файлов обычно используются: .h .hpp, но можно включать и файлы с другими расширениями например или .срр.

Идентификаторы

Для обозначения переменных, констант, функций и т.д. пользователь может использовать символьные имена – идентификаторы. Они должны начинаться с латинской буквы и могут содержать до 32 символов.

Идентификаторы не должны включать в себя пробелы. В случае необходимости пробел заменяют знаком подчеркивания. Заглавные и строчные буквы считаются разными.

Пример идентификаторов: Doxod_2002, x1, Summ.

Пример простейшей программы

#include <iostream.h> //Директива препроцессора для ввода-вывода

float SrBall(float x,float y,float z) //Заголовок функции SrBall с 3-мя вещ.   параметрами и вещ. результатом

{ //Тело функции SrBall

float sum,sb; // Объявление локальных переменных  sum и sb

sum=x+y+z;

sb=sum/3;

return sb;

}

void main() //Заголовок функции main–точка входа в программу

{

float m,f,i; //Тело функции main

cout<<"Программа подсчитывает ср. балл по трем предметам"<<'\n';

cout<<"Введите ваши оценки”<<'\n';// Подсказка

cin>>m; cin>>f; cin>>i;//Ввод данных

cout<<"Первый предмет "<<m<<'\n'; cout<<"Второй  "<<f<<'\n';

cout<<"Третий -  "<<i<<'\n';// Эхо данных для контроля

cout<<"Средний балл  "<<SrBall(m,f,i)<<'\n';// Вывод результата

}

Все переменные должны быть объявлены до их использования в программе.

Объявление переменных

Тип Идентификатор; или

Тип Идентификатор1, Идентификатор2, Идентификатор3; для трех однотипных переменных. Точка с запятой заканчивает объявление.

Пример:

float x; double y, z ;  int  i, j, k;

Как видно из таблицы, типы данных отличаются по занимаемому объему памяти и  допустимому диапазону  изменения. Выбор того или иного типа определяется характером величины, которую он описывает. Например, для описания возраста студента подойдет тип unsigned char, а для описания возраста динозавра - unsigned long. Три последних типа, кроме диапазона, отличаются точностью вычислений. Для float это 7-8 значащих цифр мантиссы, для double 16-17.

Стандартные типы данных

Тип

Длина

Диапазон

unsigned char

8 бит

0  до  255

сhar

8 бит

-128  до  127

short int

16 бит

-32,768  до  32,767

unsigned int

32 бит

0  до  4,294,967,295

int

32 бит

-2,147,483,648  до  2,147,483,647

unsigned long

32 бит

0  до  4,294,967,295

long

32 бит

-2,147,483,648  до  2,147,483,647

float

32 бит

3.4 x 10-38  до  3.4 x 10+38

double

64 бит

1.7 x 10-308  до  1.7 x 10+308

long double

80 бит

3.4 x 10-4932  до  1.1 x 10+4932

Представление констант

Арифметические константы, соответствующие переменным целых типов данных,  могут быть представлены в десятичной, восьмеричной и шестнадцатеричной системах счисления. Константы в десятичной системе счисления начинаются с ненулевого символа, например 56,  64, 32767. Восьмеричные константы начинаются с 0 и могут содержать, в зависимости от значения, несколько цифр в диапазоне от 0 до 7. Например: 011 или 077.

Шестнадцатеричные константы начинаются с символов 0x  или 0X с последующими цифрами от 0 до F. Например: 0x898 или 0xFFFE.

Для  представления вещественных чисел используются две формы: естественная – 3.1416 и степенная - 0.3146E+1.

Символьные константы

Переменные типа char могут использоваться как для самых коротких целых данных, так и для хранения кодов отдельных символов. Символическая константа представляется в виде символа, заключенного в апострофы (одиночные кавычки).

Пример:

char c; c=’a’; c=’b’;

Для кодов, не имеющих видимого представления на экране, предусмотрены специальные обозначения:  ‘\n ’-переход к началу новой строки (соответствует нажатию клавиши Enter); ‘\t’-горизонтальная табуляция; ‘\a’-звуковой сигнал; ‘\b’-возврат на один символ; ‘\v’-вертикальная табуляция; ‘\r’- возврат каретки.

Такие обозначения называют Escape-последовательности, они используются также для символов кавычка ‘\”’, апостроф ’\’’ и обратный слэш ‘\\’.

Строковые константы

Строковые константы представляют  собой последовательности символов, заключенные в кавычки –  “Это строковая константа”.

Ввод – вывод данных

Для организации ввода данных используются стандартный поток ввода cin и операция извлечения из потока <<. Для вывода данных используются стандартный поток cout и операция помещения в поток >>. Использование этих средств возможно после директивы #include <iostream.h>.

Пример:

#include <iostream.h>

void main(void)

{

int i;

cout<<”Введите целое число 4 ”;

// Строка “Введите целое число 4 ” появится на экране

cin>>i;// Ввод с клавиатуры

cout<<”Вы ввели число”<<i<<’\n’;

// на экране появится “Вы ввели число 4”, и переводится строка

}

Математические функции

Заголовки большинства математических функций находятся в файле <math.h>, который необходимо включить в программу. Функции синуса sin(x), косинуса cos(x) , квадратного корня sqrt(x), тангенса tan(x), арксинуса asin(x) , арккосинуса acos(x), арктангенса atan(x), модуля fabs(x) , экспоненты  exp(x), степенная функция  pow(x,y), логарифм натуральный log(x) и десятичный log10(x) имеют  тип аргумента double и возвращают значение типа double.


Приоритет операций языка С++

Группа

Операции

Ассоциативность

1

()

[]

->

::

.

слева - направо

2

!

~

+

-

++

--

&

*

sizeof

new

delete

справа - налево

3

*

/

%

слева - направо

4

+

-

слева - направо

5

<<

>>

слева - направо

6

<

<=

>

>=

слева - направо

7

==

!=

слева - направо

8

&

слева - направо

9

^

слева - направо

10

|

слева - направо

11

&&

слева - направо

12

||

справа - налево

13

?:

слева - направо

14

=

*=

/=

%=

+=

-=

&=

^=

|= <<=

>>=

справа - налево

15

,

слева - направо

  1. [ ] - операция индексирования; Student[i], X[3][2] – выбор элементов массива.
  2. (  )  - операция вызова функции; пример: sin(х).
  3. .    - выбор поля структуры; пример: Product.Cost.
  4. - косвенный выбор поля структуры через указатель.
  5. :: - разрешение контекста (унарная операция), делает доступными глобальные переменные из некоторой функции.

Пример:

int i=5;

main(){

int i=3;

cout<<i;//будет выведенно i=3

cout << ::i;} //будет выведенно i=5

  1. ++ и --  - операции inc и dec. ++C и С++ постфиксная форма имеет более высокий приоритет.

Пример: i++ эквивалентно i = i + 1.

  1. (тип), например (int)x – операция приведения к типу (в примере – к целочисленному типу).
  2. ~  -  операция побитового отрицания.
  3. !  - логическое не.
  4. -  - унарный минус (смена знака).
  5. & - определение адреса (унарная операция).
  6. *p - операция извлечения значения из какого-то адреса.

Пример:  int  i=3, *Ptr;

Ptr = &i;

// В переменную Ptr записывается адрес переменной i.

*Ptr - это выражение возвращает значение объекта, например, переменной i, на который указывает указатель Ptr.

  1. (умножение), / (деление), % (остаток от деления).
  2. + (сложение), - (вычитание).
  3. >>, << - побитовые операции сдвиг влево и сдвиг вправо.

Пример:

int i=3;

i=i<<2; //i=0112<<2=011002=1210

i=12.

  1. >=, <=, <> - операции сравнения.
  2. ==, != - операции отношений (равенство и неравенство).
  3. & - побитовое “и” (бинарная операция).
  4. ^ - побитовое XOR.
  5. |  - побитовое “или”.

Пример: пусть а = 1011, b = 0110, тогда a&b будет равно 0010,  a^b – 1101, a|b – 1111, a<<3 – 1000, ~a – 0100, b>>1 – 0011.

  1. && - логическое “и”.
  2. || - логическое “или”.
  3. ?: - сравнение (тернарная операция - с тремя аргументами).

Пример:   min = a>b? b: a (если выражение (a>b) истина, то результатом будет b, иначе - a).

  1. = - операция присваивания. Если слева и справа от операции присваивания стоит одна и та же переменная, то запись операции присваивания можно сократить. Полный список комбинированных операций присваивания имеет вид: +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, |=.

Пример:  x = y = z = 5;  S += a;(эквивалентно S = S + a;).

  1. ,  - последовательность выполнения выражения. Используется в качестве операции и как разделитель.

Пример: 1) for (x=p1, y=p2, i=2; i<n; z=x+y, x=y, y=z, i++)

int i,n; float x,y,z;

2) int i=1; m[ ] = {i, (i=2,i*i), i}

 

Контрольные вопросы

1. Какова структура программы в языке С++?

2. Что такое препроцессор?

3. В чем состоит назначение директив #define и #include ?

4. Каким требованиям должен удовлетворять идентификатор в С++ ?

5. Как происходит объявление переменных в программе ?

6. Приведите пример констант целого, символьного, вещественного и строкового типов данных.

7. Перечислите основные математические функции в С++.

Варианты заданий

Составить программу вычисления значения функции . В программе реализовать ввод исходных данных с клавиатуры и вывод значения функции и промежуточных данных на экран.

 

1

 

, где

 

2

 

, где

 

3

 

, где

 

4

 

, где

 

5

 

, где

 

6

 

, где

 

7

 

, где

 

8

 

, где

 

9

 

, где

 

10

 

, где

 

11

 

, где

 

12

 

, где

 

13

 

, где

 

14

 

, где

 

15

 

, где

 

16

 

, где

 

17

 

, где

 

18

 

, где

 

19

 

, где

 

20

 

, где

 

 

2. ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ РАЗВЕТВЛЯЮЩЕЙСЯ СТРУКТУРЫ

 

Операторы управления

Оператор if имеет следующий синтаксис:

if  (< выражение  >)

( <оператор 1>);

[ else

<оператор 2>;]

Если выражение отлично от нуля выполняется оператор 1, если равно нулю  то выполняется оператор 2.

Например, оператор, вычисляющий y = |x|, будет иметь следующий вид:

if (x >= 0)   y = x;  else   y = -x;

Для многоальтернативного выбора используется оператор switch:

switch (выражение целого типа)
{ case значение 1: оператор 1; break;
case значение 2: оператор 2; break;
[default:<операторы>;]

}

При совпадении результата выражения после switch со значением после case, выполняется соответствующий оператор.

Если в конце выбранного варианта поместить оператор break , то управление будет сразу передано в конец оператора switch.   Когда некоторому значению выражения не соответствует никакая метка, то управление передаётся оператору с меткой default (прочие). Вариант default может отсутствовать.

switch ( Znak )

{

case ’+’: y = a + b; break;
case ‘-‘:  y = a - b; break;
case ’*’: y = a * b; break;

case ‘/’ : y = a / b; break;
default : printf(“Недопустимый знак операции \ n”);

}

 

Контрольные вопросы

  1. Перечислите операторы управления в С++.
  2. Как работает условная операция?
  3. Объясните принцип работы условного оператора.
  4. Объясните принцип работы оператора выбора.

Варианты заданий

Модифицировать программу вычисления значения функции  из лабораторной работы № 1. В программе предусмотреть вывод сообщения «значение функции не определено», если введенные исходные данные не принадлежат области определения функции (т.е. если при таких исходных данных вычисление значения функции невозможно).

 

3. ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ ЦИКЛИЧЕСКОЙ СТРУКТУРЫ

Цикл с предусловием:

while (<выражение>)

<Оператор>;

Пока выражение после while отлично от нуля, выполняется Оператор. После while “;” не ставится. Рассмотрим  программу, считывающую с клавиатуры предложение и определяющую его длину:

#inciude<conio.h>

#include<stdio.h>

main () {

char ch; int len = 0;

puts(“\n Наберите предложение, затем нажмите <Enter>:\n”);

while ((ch = getch())!=’\r’) { putch(ch); len++;}

printf(“\n Ваше предложение имеет длину %d символов. \n”,len);

}

Цикл с постусловием

do

<Оператор> ;

while(<выражение>);

Пока выражение после while отлично от нуля, выполняется Оператор.

Пример деления двух чисел a и b:

#include <iostream.h>

void main()

{

float a,b,FDiv;

char Symbol;

Symbol='y';

do

{cout<<'\n'<<"Введите два числа: ";

cin>>a; cin>>b;

if (b<=0.1E-6)

cout<<'\n'<<"Внимание! Деление на ноль!"<<'\n';

else {FDiv=a/b;

cout<<'\n'<<"Результат деления: "<<'\n'<<FDiv;}

cout<<'\n'<<"Повторить ввод чисел a,b?"<<'\n';

cout<<"('y' - да; остальные - нет)"<<'\n';

cin>>Symbol;}

while (Symbol=='y');}



 
цветсоответствующей схемы а строка