Программирование СИ++

Переменные и операции языка СИ: используемые символы, константы, идентификаторы и ключевые слова. Использование комментариев в тексте программы. Типы данных и их объявление. Приоритеты операций и порядок вычислений. Функции, переменные, макроподстановки.

Рубрика Программирование, компьютеры и кибернетика
Вид учебное пособие
Язык русский
Дата добавления 17.02.2012
Размер файла 135,0 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

point(const point &pt);

// другие функции-элементы

};

6. Объявление объекта класса, которое может содержать параметры и, в качестве параметра, имя уже существующего объекта, влечет за собой вызов конструктора. Но какой из конструкторов будет использоваться в каждом конкретном случае? Ответ зависит от того, как много конструкторов вы объявили и с какими аргументами вы объявляете объект класса.

Например, рассмотрим следующие объявления объектов.

point p1; //применяется конструктор по умолчанию

point p2(1.1, 1.3); // используется второй по счету конструктор

point p3 (p2); // используется конструктор копии

Поскольку объект р1 объявляется без параметров, компилятор использует конструктор по умолчанию. Объект p2 объявляется с двумя вещественными аргументами, поэтому компилятор вызовет второй конструктор. Объект p3 при объявлении имеет параметром объект p2, поэтому компилятор вызовет конструктор копии, чтобы создать новый объект из объекта p2.

Деструкторы. Классы C++ могут содержать деструкторы, которые автоматически разрушают объекты класса.

Общий синтаксис объявления деструктора:

class className

{

public:

className(); // конструктор по умолчанию

// другие конструкторы

~className() ;

// другие функции-элементы

};

Пример:

class String

{

protected:

char *str;

int len;

public:

String() ;

String(const String& s);

~String() ;

// другие функции-элементы

};

Деструкторы в C++ имеют следующие особенности и подчиняются следующим правилам:

1. Имя деструктора должно начинаться со знака тильды (~), за которым должно следовать имя класса.

2. Вы не должны определять тип возвращаемого значения, даже тип void.

3. Класс может иметь только один деструктор или ни одного. В последнем случае компилятор создаст деструктор по умолчанию.

4. Деструктор не должен иметь параметров.

5. Исполняющая система автоматически вызывает деструктор класса, когда объект класса выходит за пределы области действия и может быть удален, или удаляется явным образом.

2.3 Производные классы

Одно из мощных объектно-ориентированных свойств языка C++ состоит в том, что вы можете строить новые классы на основе уже существующих, Класс-потомок наследует элементы своих классов-предков (т.е. «отцовского» класса, «дедушкиного» класса и т.д.) и при этом может переопределять, если это необходимо, некоторые наследуемые функции. Таким образом, наследование позволяет вам в классе-потомке повторно использовать программный код класса-предка.

Общая форма объявления производного класса:

class classname : [<спецификатор доступа>] parentClass

{

дружественные классы>

private:

<закрытые элементы-данные>

<закрытые конструкторы>

<закрытые функции-элементы>

protected:

<защищенные элементы-данные>

защищенные конструкторы>

защищенные функции-элементы»

public:

открытые элементы-данные>

<открытые конструкторы>

< открытый деструктор>

<открытые функции-элементы>

<дружественные функции и дружественные операции>

}

Пример:

В следующем примере объявляются класс Rectangle и класс-потомок Box:

class Rectangle

{ protected:

double length;

double width;

public:

Rectangle(double len, double wide);

double getLength() const;

double getWidthO const;

double assign(double len, double wide);

double calcArea();

};

class Box : public Rectangle

{ protected:

double height;

public:

Box(double len, double wide, double height);

double getHeight() const;

assign(double len, double wide, double height);

double calcVolume ();

};

При объявлении производного класса после его имени ставится двоеточие и указывается родословная класса: список имен родительских классов, которым может предшествовать спецификатор доступа (которым может быть либо public, либо protected, либо private). Если вы указали спецификатор public, то объекты класса-потомка будут иметь доступ к открытым элементам родительского класса и других классов-предков. А если вы укажете спецификатор private или опустите спецификатор, то вы лишите объект класса-готомка доступа к элементам классов-предков.

Класс-потомок наследует данные-элементы своих классов-предков. В C++ нет возможности отказаться от наследования ненужных элементов-данных, но зато можно переопределять наследуемые функции-элементы.

Рассмотрим пример объявления простой иерархии классов. Текст программы CIRCLE.CPP содержится в листинге. Объявляется иерархия классов графических примитивов: окружностей и цилиндров. В программе отсутствует ввод данных. Все данные для создания объектов задаются самой программой, затем программа выводит характеристики объектов - размеры и площадь.

Исходный текст для программы C1RCLE.CPP

// Простой пример иерархии классов

#include <iostream.h>

#include <math.h>

const double pi = 4 * atan(l);

inline double sqr(double x)

{

return x * x;

}

class Circle

{

protected:

double radius;

public:

Circle (double radiusVal =0) : radius (radiusVal) )

void setRadius(double radiusVal)

{ radius = radiusVal; }

double Radius() const

{ return radius; }

double Area() const

{ return pi * sqr(radius); }

void showData();

}

class Cylinder : public Circle

{protected:

double height;

public:

Cylinder(double height Val = 0, double radiusVal = 0) : height(heightVal);

Circle(radiusVal);

void setHeight(double heightVal)

{ height = heightVal; }

double Height() const

{ return height; }

double Area() const

{ return 2 * Circle::Area() + 2 * pi * radius * height; }

void showData();

};

void Circle::showData ()

{

cout <<"Circle radius = "<< Radius()<<endl<<"Circle area = "<< <<Area()<<endl<<endl;

void Cylinder::showData()

{

cout << "Cylinder radius = "<< Radius()<<endl<<

<<"Cylinder height ="<<Heigth()<<endl<<

<< "Cylinder area = "<< Area()<<endl<<endl;

}

int main() {

Circle circle (1);

Cylinder cylinder (10, 1);

circle.showData();

cylinder.showData ();

return 0;

}

В программе объявляются классы Circle и Cylinder. Класс Circle является моделью окружностей, а класс Cylinder представляет цилиндры. Класс Circle содержит только один элемент данных, radius, предназначенный для хранения радиуса окружности. В классе объявляется конструктор и несколько функций-элементов. Конструктор присваивает значение элементу radius при создании объекта класса. Обратите внимание на новый синтаксис, используемый для присвоения конструктором значения элементу radius. Когда конструктор вызывается, он вызывает конструктор базового класса и, кроме того, инициализирует данные-элементы: все это должно быть указано после двоеточия. В нашем случае элемент radius создается» вызовом его с аргументом radiusVal, т.е. ему присваивается новое значение.

Функция setRadius присваивает значение, а функция Radius возвращает значение переменной radius. Функция Area возвращает значение площади круга. Функция showData выводит значения радиуса и площади объекта.

Класс Cylinder, потомок класса Circle, объявляет только один элемент данных height, в котором хранится высота цилиндра. Класс наследует элемент данных radius, предназначенный для хранения радиуса цилиндра. В классе объявляется конструктор и несколько функций-элементов. При создании объекта класса конструктор присваивает значения элементам radius и height. Обратите внимание на синтаксис определения конструктора - элемент height инициализируется, а конструктор базового класса Circle инициализирует элемент radius величиной radiusVal. Функция setHeight присваивает значение, а функция Height возвращает значение переменной height. Класс наследует функции setRadius и Radius для работы с унаследованным элементом данных radius. Функция Area, переопределяющая наследуемую функцию Circle::Агеа(), возвращает величину площади поверхности цилиндра. Заметьте, что эта переопределенная функция вызывает свою прародительницу - функцию Circle::Агеа(). Функция showData выводит значения радиуса, высоты и площади объекта.

В объявлениях функций Area, Height содержится ключевое слово const. Эта спецификация const сообщает компилятору о том, что функция-элемент не может изменять значения данных-элементов. Эта черта языка очень удобна при создании программ группой программистов, когда руководитель группы, объявляющий класс, может указать те элементы-функции, которые не должны изменять данные объекта класса.

В функции main объявляется объект circle класса Circle с радиусом, равным 1. Объявляется объект cylinder, экземпляр класса Cylinder, с высотой, равной 10 и радиусом равным 1. Затем функция main выводит на экран параметры объектов.

2.4 Изменяемые данные-элементы

Применение ключевого слова const при объявлении функции-элемента запрещает изменять значения элементов-данных. Однако при помощи спецификатора mutable это ограничение можно обойти.

Спецификатор mutable

Общий вид применения спецификатора mutable к объявлению переменной:

mutable <type> <variable>

Спецификатор mutable позволяет объявить данные-элементы изменяемыми теми функциями-элементами, которые были объявлены со спецификатором const.

Пример:

#include <iostream.h>

class A

{

mutable int count;

mutable const int* iptr;

int last;

public:

int func(int i=0) const // не должна изменять данные

{

count = i++; //но изменяет count

iptr = Si; // также изменяет указатель iptr

last = i; // но не элемент last: ОШИБКА!

return count;

}...

Спецификатор mutable может быть полезен для «технических» переменных, например, подсчитывающих количество внутренних обращений и т.п. Определив необходимые данные-элементы со спецификатором mutable, а некоторые функции-элементы со спецификатором const, вы сможете изменять такие изменчивые данные, защитив все остальные.

2.5 Виртуальные функции

Важной особенностью объектно-ориентированного программирования является полиморфизм.

Рассмотрим следующий пример:

#include <iostream.h>

class X

{

public:

double A(double x) {return x *.x; }

double B(double x) {return A(x) / 2; }

};

class Y : public X

{

public:

double A(double x) {return x * x * x; }

};

int main()

{

Y y;

cout<<y.B(3)«endl;

return 0;

}

В классе Х объявляются функции А и В, причем, функция В вызывает функцию А. Класс Y, потомок класса X, наследует функцию В, но переопределяет функцию А. Цель этого примера - демонстрация полиморфного поведения класса Y. Мы должны получить следующий результат: вызов наследуемой функции Х::В должен привести к вызову функции Y::A. Что же выдаст нам наша программа? Ответом будет 4.5, а не 13.5. В чем же дело? Почему компилятор разрешил выражение у.В(3) как вызов наследуемой функции Х::В, которая, в свою очередь, вызывает Х::А, а не функцию Y::A, что должно было бы произойти в случае полиморфной реакции класса. C++ решает эту проблему и обеспечивает полиморфизм при помощи механизма виртуальных функций.

Виртуальные функции объявляются при помощи спецификатора virtual, указываемого перед типом возвращаемого функцией значения. Выбор нужной виртуальной функции осуществляется во время выполнения программы.

После того как вы объявили функцию как виртуальную, вы можете переопределить (заместить) ее только в классах-потомках, замещающие функции должны иметь тот же список параметров. Виртуальные функции могут замещать невиртуальные функции базовых классов. Как только вы объявили функцию как виртуальную, во всех классах-потомках она будет трактоваться как виртуальная, даже если спецификатор virtual не будет применяться.

Виртуальные функции объявляются следующим образом:

class classNamel

{

// функции-элементы

virtual returnType functionName(<список_параметров>);

};

class className2 : public classNamel

{

// функции-элементы

virtual returnType functionName(<список_п параметров>);

Пример:

# include <iostream.h>

class X

{

public:

virtual double A (double x) {return x*x ; }

double В (double x) {return A(x)/2; }

};

class Y : public X

{

public:

virtual double A (double x) {return x*x *x; }

};

main()

{ Y y;

cout<<y.B(3)«endl;

return 0;

}

Этот пример выведет правильное значение 13.5, потому что в результате вызова наследуемой функции Х::В, вызывающей функцию А, в качестве функции А во время выполнения программы будет использована замещающая функция Y::A.

Раздел III. Примеры программ

3.1 Вывод строки приветствия

#include <iostream.h>

int main()

{

cout << "Hello";

return 0;

}

Программа использует директиву #include для включения заголовочного файла потокового ввода-вывода iostream.h (в нем определяется код, необходимый для вывода). Главная функция программы - функция main целого типа описана командой int main(). В качестве ее значения команда return 0 возвращает 0. Фигурные скобки ограничивают содержимое функции main. Основная команда - вывод текстового сообщения с помощью процедуры вывода cout. Символы `<<' служат для разделения элементов потокового вывода. Обратите внимание на использование разделителей операторов `;' в программе.

3.2 Работа с простыми переменными

#include <iostream.h>

int main()

{

int i,j=2;

double x,y=355.0/113;

i=3*j;

cout << "i=" << i << endl

<< "j=" << j << endl;

x=2*y;

x=x*x;

cout << "x=" << x <<

<< "y=" << y << endl;

return 0;

}

В программе объявляются переменные i,j типа int и переменных double x,y типа double. Переменные j,y инициализируются при объявлении. Переменная j умножается на 3 и результат сохраняется в переменной i . Значения переменных i,j отображаются на экран.

Элемент потокового вывода endl служит для перевода строки при выводе информации на экран. Переменная y умножается на 2 и результат сохраняется в переменной x. Переменная x возводится в квадрат (умножается сама на себя) и результат сохраняется в этой же переменной x. Значения переменных x,y отображаются на экран.

3.3 Работа с константами с помощью директивы компилятора #define

Программа запрашивает ввод количества часов, минут и секунд, прошедших с полуночи. Затем программа отображает на экране общее число прошедших с полуночи секунд.

#include <iostream.h>

#define sec_in_min 60

#define min_in_hour 60

int main()

{

long h,m,s;

long ts;

cout << "Введите часы : " ;

cin >> h;

cout << "Введите минуты : ";

cin >> m;

cout << "Введите секунды : ";

cin >> s;

ts=((h*min_in_hour +m )* sec_in_min)+s;

cout << endl << ts << " секунд после полуночи";

return 0;

}

Заголовочный файл iostream.h содержит определения, необходимые и для ввода информации. Директива #define объявляет константы, определенные с помощью макросов. Объявляются четыре переменные типа long . Значения переменных h,m,s вводятся с помощью процедуры потокового ввода cin , использующей разделители `>>'. Для вывода подсказки и итоговой информации по-прежнему используется процедура cout. В переменной ts сохраняется общее число секунд.

3.4 Работа с константами с использованием формальных констант

Программа аналогична предыдущей. Для объявления констант используется формальный синтаксис языка С++. Константа sec_in_min объявлена вне функции main и является глобальной, константа min_in_hour объявлена внутри функции main и является локальной, то есть ее можно использовать только внутри этой функции.

#include <iostream.h>

const sec_in_min=60;

int main()

{

const int min_in_hour=60 ;

long h,m,s;

long ts;

cout << "Введите часы : " ;

cin >> h;

cout << "Введите минуты : ";

cin >> m;

cout << "Введите секунды : ";

cin >> s;

ts=((h*min_in_hour +m )* sec_in_min)+s;

cout << endl << ts << " секунд после полуночи";

return 0;

}

3.5 Сокращенные операции присваивания и инкремента

#include <iostream.h>

int main()

{

int i,j;

double x,y;

// Действия с переменными типа int

cout << "Введите i : " ;

cin >> i;

cout << "Введите j : ";

cin >> j;

i+=j;

j-=6;

i*=4;

j/=3;

i++;

j--;

cout << "i=" << i << endl

<< "j=" << j << endl;

// Действия с переменными типа double

cout << "Введите x : " ;

cin >> x;

cout << "Введите y : ";

cin >> y;

x+=y;

y-=4.0;

x*=4.0;

y/=3.0;

x++;

y--;

cout << "x=" << x << endl

<< "y=" << y << endl;

return 0;

}

3.6 Программа, возвращающая размеры данных, использующая для этого операцию sizeof() с переменными и типами данных

#include <iostream.h>

int main()

{

short int aS;

int aI;

long aL;

char aC;

float aR;

cout << "Тип даты Используемая память , байты " << endl;

cout << "short int "<< sizeof(aS) << endl;

cout << "integer "<< sizeof(aI) << endl;

cout << "long integer "<< sizeof(aL) << endl;

cout << "character "<< sizeof(aC) << endl;

cout << "float "<< sizeof(aR) << endl;

cout << endl << endl << endl;

cout << "Тип даты Используемая память , байты " << endl;

cout << "short int " << sizeof(short int) << endl;

cout << "integer " << sizeof(int) << endl;

cout << "long integer " << sizeof(long) << endl;

cout << "character " << sizeof(char) << endl;

cout << "float " << sizeof(float) << endl;

cout << endl << endl << endl;

return 0;

}

3.7 Преобразование типов

#include <iostream.h>

int main()

{

short sI1,sI2;

unsigned short aB;

int aI;

long aL;

char aC;

float aR;

sI1=10;

sI2=6;

aB=sI1+sI2;

aI=sI1-sI2;

aL=sI1*sI2;

aC=aL+5;

aR=sI1*sI2+0.5;

cout <<" sI1= " << sI1 << endl

<<" sI2= " << sI2 << endl

<<" aB= " << aB << endl

<<" aI= " << aI << endl

<<" aL= " << aL << endl

<<" aC is " << aC << endl

<<" aR= " << aR << endl

<< endl << endl << endl;

aB=(unsigned short) (sI1 + sI2);

aI=(int) (sI1-sI2);

aL=(long) (sI1*sI2);

aC=(unsigned char) (aL + 5);

aR=(float) (sI1*sI2 + 0.5);

cout <<" sI1= " << sI1 << endl

<<" sI2= " << sI2 << endl

<<" aB= " << aB << endl

<<" aI= " << aI << endl

<<" aL= " << aL << endl

<<" aC is " << aC << endl

<<" aR= " << aR << endl

<< endl << endl << endl;

return 0;

}

3.8 Работа с логическими операциями и условной операцией

#include <iostream.h>

const int MIN_NUM = 30;

const int MAX_NUM = 199;

int main()

{

int i, j, k;

int xor_sum;

int flag1, flag2, in_range,

same_int, xor_flag;

cout << "Первое число: "; cin >> i;

cout << "Второе число: "; cin >> j;

cout << "Третье число: "; cin >> k;

flag1 = i >= MIN_NUM;

flag2 = i <= MAX_NUM;

in_range = flag1 && flag2;

cout << endl << i << " в диапазоне от "

<< MIN_NUM << " до " << MAX_NUM << ": "

<< (in_range ? "ИСТИНА" : "ЛОЖЬ");

same_int = i == j || i == k || j==k;

cout << endl << "по крайней мере два числа из введенных совпадают: "

<< (same_int ? "ИСТИНА" : "ЛОЖЬ");

cout << endl << i << " != " << j << ": "

<< ((i != j) ? "ИСТИНА" : "ЛОЖЬ");

cout << endl << "NOT (" << i << " < " << j << "): "

<< ((!(i < j)) ? "ИСТИНА" : "ЛОЖЬ");

cout << endl << i << " <= " << j << ": "

<<((i <= j) ? "ИСТИНА" : "ЛОЖЬ");

cout << endl << k << " > " << j << ": "

<< ((k > j) ? "ИСТИНА" : "ЛОЖЬ");

cout << endl << "(" << k << " = " << i << ") AND ("

<< j << " != " << k << ") : "

<< ((k == i && j != k) ? "ИСТИНА" : "ЛОЖЬ");

xor_sum = (k <= i) + (j >= k) ;

xor_flag = xor_sum == 1;

cout << endl << "(" << k << "<=" << i << ") XOR ("

<< j << ">=" << k <<") : "

<< (xor_flag ? "ИСТИНА" : "ЛОЖЬ");

cout << endl << "(" << k << ">" << i << ") AND ("

<< j << "<=" << k << ") : "

<< ((k>i && j<=k) ? "ИСТИНА" : "ЛОЖЬ");

cout << endl << endl;

return 0;

}

3.9 Краткая форма условного оператора if

#include <iostream.h>

int main()

{

double x;

cout << "Введите Х ";

cin >> x;

if (x !=0)

cout << " ФУНКЦИЯ ОТ " << x

<< " РАВНА "<<(1/x)<< endl;

return 0;

}

3.10 Полная форма условного оператора if

#include <iostream.h>

#include <ctype.h>

int main()

{

char c;

cout <<"Введите букву :";

cin >> c;

c = toupper (c);

if (c >='A' && c <='Z')

cout << "Это буква" << endl;

else

cout << " Это не буква" << endl;

return 0;

}

Файл ctype.h содержит оприсание функции перевода символа в верхний регистр toupper();

3.11 Использование вложенных операторов if

#include <iostream.h>

int main()

{

char c;

cout << "Введите символ : ";

cin >> c;

if (c >='A' && c<='Z')

cout << "Это большая буква" << endl;

else if (c >='a' && c<='z')

cout << "Это строчная буква" << endl;

else if (c >='0' && c<='9')

cout << "Это цифра" << endl;

else

cout << "Это вообще чушь" << endl;

return 0;

}

3.12 Применение оператора switch

#include <iostream.h>

int main()

{

char c;

cout <<"Введите переменную : ";

cin >> c;

switch (c)

{

case 'A':

case 'B':

case 'C':

case 'D':

...

cout <<"Это буква прописная" << endl;

break;

case 'a':

case 'b':

case 'c':

case 'd':

...

cout <<"Это буква строчная" << endl;

break;

case '1':

case '2':

case '3':

case '4':

...

cout <<"Это цифра" << endl;

break;

default:

cout << "Это вообще чушь" << endl;

break;

}

return 0;

}

3.13 Использование вложенных операторов if

#include <iostream.h>

int main()

{

char c;

cout << "Введите символ : ";

cin >> c;

if ((c >='A' && c <='Z') || (c >='a' && c <='z'))

if (c >='A' && c <='Z')

cout <<"Это буква прописная" << endl;

else

cout <<"Это буква строчная" << endl;

else

cout << "Это вообще чушь" << endl;

return 0;

}

3.14 Расчет суммы и среднего значения ряда целых чисел

#include <iostream.h>

int main()

{

int count = 0;

double sum = 0.0;

int f, l, t;

cout << "Введите первое число : ";

cin >> f;

cout << "Введите последнее число : ";

cin >> l;

if (f > l)

{

t = f;

f = l;

l = t;

}

for (int i = f; i <= l; i++)

{count++;

sum += (double)i;

}

cout << "Сумма чисел от " << f << " до " << l << " = "

<< sum << endl;

cout << " Cреднее значение = " << sum / count << endl;

return 0;}

3.15 Расчет суммы и среднего значения ряда целых чисел

Программа аналогична предыдущей, но в операторе цикла выражение 1 опускается и оператор цикла работает без установления начального значения переменной, управляющей циклом. Фактически, в качестве переменной цикла используется переменная f.

#include <iostream.h>

int main()

{

int count = 0;

double sum = 0.0;

int f, l, t;

cout << "Введите первое число : ";

cin >> f;

cout << "Введите последнее число : ";

cin >> l;

if (f > l)

{

t = f;

f = l;

l = t;

}

cout << "Сумма чисел от " << f << " до " << l << " = " ;

for (; f <= l;)

{count++;

sum += (double)f++;

}

cout << sum << endl;

cout << " Cреднее значение = " << sum / count << endl;

return 0;}

3.16 Использование оператора for для создания неопределенного цикла

#include <iostream.h>

#include <ctype.h>

int main()

{

char ch;

double x,y;

for(;;)

{

cout << "Введите число : ";

cin >> x;

if (x !=0)

{

y=1/x;

cout << " 1/" << x << "="<< y << endl;

cout << "Продолжать вычисления? (Y/N) ";

cin >> ch;

if (toupper(ch) != 'Y')

break;

}

else

cout << "Нельзя вводить 0 " << endl ;

}

return 0;

}

3.17 Использование оператора цикла do while

Программа аналогична предыдущей, но вместо цикла for используется оператор цикла do while . Программа содержит внутренний цикл для проверки на нулевое значение, что на самом деле не очень удобно, так как при данном решении задачи после каждого числа приходится еще вводить и ноль. Более удобно в этом случае использовать оператор цикла while.

#include <iostream.h>

#include <ctype.h>

int main()

{

char ch;

double x,y;

do

{

do

{

cout << "Введите число : ";

cin >> x;

if (x ==0 )

cout << "Нельзя вводить 0 " << endl;

} while ( x == 0 );

y=1/x;

cout << " 1/" << x << "="<< y << endl;

cout << "Продолжать вычисления? (Y/N) ";

cin >> ch;

} while (toupper(ch) != 'Y')

return 0;

}

3.18 Расчет суммы и среднего значения ряда целых чисел. Использование оператора цикла while

Программа аналогична примеру 3.2, но вместо цикла for используется оператор цикла while

#include <iostream.h>

int main ()

{

int count = 0;

double sum = 0.0;

int f, l, t;

cout << "Введите первое число : ";

cin >> f;

cout << "Введите последнее число : ";

cin >> l;

if (f > l)

{

t = f;

f = l;

l = t;

}

cout << "Сумма чисел от " << f << " до " << l << " = " ;

while ( f <= l;)

{

count++;

sum += (double)f++;

}

cout << sum << endl;

cout << " Cреднее значение = " << sum / count << endl;

return 0;}

3.19 Использование оператора contunue для пропуска итераций

#include <iostream.h>

#include <match.h>

int main()

{

for (int i = 0; i < 10; ++i)

{

if (i >=4 && i <=6)

continue;

cout << " Шаг номер " << i << endl;

}

return 0;

}

3.20 Работа с перечисляемыми типами данных

Тип данных matherror, содержит возможные варианты ошибок математических операций

noErr - нет ошибки

badOp - плохой оператор

divZero - деление на нуль

В программе используется переменная этого типа err

#include <iostream.h>

enum matherror { noErr, badOp, divZero };

int main()

{

double x, y, z;

char op;

matherror err = noErr;

cout << " Введите число ,знак, число : ";

cin >> x >> op >> y ;

switch (op)

{

case '+':

z = x + y;

break;

case '-':

z = x - y;

break;

case '*':

z = x*y;

break;

case '/':

if (y != 0)

z = x/y;

else

err = divZero;

break;

default:

err = badOp;

break;

}

if (err == noErr)

cout << x << " " << op << " " << y << " = " << z << endl;

else

switch (err)

{

case noErr:

cout << " нет ошибки " << endl;

break;

case badOp:

cout << "ошибка : неправильный оператор " << endl;

break;

case divZero:

cout << "ошибка : деление на ноль " << endl;

break;

}

return 0;

}

Обратите внимание, что сообщение «нет ошибки», хотя и предусмотрено в программе, на самом деле никогда не появляется.

3.21 Работа со структурами. Вычисление площади прямоугольника

Программа содержит две структуры - координаты точки (x,y), и структура - содержащую точку-верхний левый угол прямоугольника, точку - нижний правый угол прямоугольника и его площадь.

#include<iostream.h>

#include<math.h>

struct point

{

double x;

double y;

};

struct rect

{

point ulc;

point lrc;

double area;

};

int main()

{

rect r;

double length, width;

cout << "Введите х у - координаты верхнего левого угла ";

cin >> r.ulc.x >> r.ulc.y;

cout << "Введите х у - координаты верхнего правого угла ";

cin >> r.lrc.x >> r.lrc.y;

length = fabs (r.ulc.x - r.lrc.x);

width = fabs (r.ulc.x - r.lrc.y);

r.area = length * width;

cout << "Площадь = " << r.area << endl;

return 0;

}

3.22 Работа со ссылочными переменными

#include<iostream.h>

int main()

{

int x = 10;

int& rx = x;

cout << “ x содержит ” << x << endl;

cout << “ x содержит (используется ссылка)” << rx << endl;

x *= 2;

cout << “ x содержит (используется ссылка)” << rx << endl;

rx *= 2;

cout << “ x содержит ” << x << endl;

return 0;}

3.23 Работа с указателями на действительные переменные

#include <iostream.h>

int main()

{

int x = 10;

int* px = &x;

cout << “ x содержит ” << x << endl;

cout << “ x содержит (используется указатель)” << *px << endl;

x *= 2;

cout << “ x содержит (используется указатель)” << *px << endl;

*px *= 2;

cout << “ x содержит ” << x << endl;

return 0;

}

3.24 Работа с массивами с использованием указателей

Вводится количество элементов массива и их значения. Определяются сумма и среднее значение. Указатель *realPtr указывает на ячейку с нулевым элементом массива.

#include <iostream.h>

const int MAX =30;

int main()

{

double x[MAX];

double *realPtr = x; // можно &x[0]

double sum = 0.0, mean;

int n, count;

do

{

cout << "Введите количество данных от 2 до " << MAX << ": ";

cin >> n;

cout << endl;

} while (n < 2 || n > MAX);

for (int i = 0; i < n; i++)

{

cout << "X[" << i << "]: ";

cin >> *(x+i); // Запись данных в элемент x[i]

}

count = n;

for (i = 0; i < n; i++)

sum += *(realPtr+i);

mean = sum / count;

cout << endl << "Среднее = " << mean << endl ;

return 0;

}

3.25 Работа с массивами с использованием указателей. Использование метода инкремента/декремента указателя

#include <iostream.h>

const int MAX =30;

int main()

{

double x[MAX];

double *realPtr = x;

double sum = 0.0, mean;

int n, count;

do

{

cout << "Введите количество данных от 2 до " << MAX << ": ";

cin >> n;

cout << endl;

} while (n < 2 || n > MAX);

for (int i = 0; i < n; i++)

{

cout << "X[" << i << "]: ";

cin >> *realPtr++;

}

realPtr -= n;

count = n;

for (i = 0; i < n; i++)

sum += *(realPtr++);

mean = sum / count;

cout << endl << "Среднее = " << mean << endl ;

return 0;

}

3.26 Обращение к элементам массива непосредственно через указатель

Во многом совпадает с предыдущей программой, отличие - обращение к элементам массива непосредственно через указатель.

В структуру rect добавляется новый элемент - порядковый номер прямоугольника.

Добавляется также новый тип данных rectArr - массив из прямоугольников.

При обращении к координатам прямоугольника вместо названия переменной структуры используется указатель с операцией ->.

#include<iostream.h>

#include<stdio.h>

#include<math.h>

const int MAX_RECT = 4;

struct point

{

double x;

double y;

};

struct rect

{

point ulc;

point lrc;

double area;

int id;

};

typedef rect rectArr[MAX_RECT];

int main()

{

rectArr r;

rect temp;

rect* pr = r;

rect* pr2;

double length, width;

for (int i = 0; i < MAX_RECT; i++,pr++)

{

cout << "Введите х у - координаты верхнего левого угла прямоугольника "

<< i+1 << “: “ ;

cin >> pr->ulc.x >> pr->ulc.y;

cout << "Введите х у - координаты верхнего правого угла прямоугольника "

<< i+1 << “: “ ;

cin >> pr->lrc.x >> pr->lrc.y;

pr->id = i;

length = fabs (pr->ulc.x - pr->lrc.x);

width = fabs (pr->ulc.x - pr->lrc.y);

r.area = length * width;

cout << "Площадь прямоугольника " << i << "= " << pr->area << endl;

}

return 0;

}

3.27 Управление динамической памятью с помощью указателей

В заголовочном файле except.h объявлено исключение xalloc(описана ошибочная ситуация), которое возникает при неудаче операции динамического распределения памяти new.

#include <except.h>

#include <iostream.h>

const int MAX =30;

int main()

{

double* x;

double sum = 0.0, mean;

int *n, count;

try { n = new int ;}

catch (xalloc&) {return 1;}

do

{

cout << "Введите количество данных от 2 до " << MAX << ": ";

cin >> *n;

cout << endl;

} while (*n < 2 || *n > MAX);

try { n = new double [*n];}

catch (xalloc&)

{

delete n;

return 1;

}

for (int i = 0; i < *n; i++)

{

cout << "X[" << i << "]: ";

cin >> *x[i];

}

count = *n;

for (i = 0; i < *n; i++)

sum += *(x + i);

mean = sum / count;

cout << endl << "Среднее = " << mean << endl ;

delete n;

delete [] x;

return 0;

}

3.28 Использование локальной переменной

#include<iostream.h>

void fun1 (int start)

{

int ix;

for (ix=start; ix < start +5; ++ix)

cout << ix << endl;

}

int main()

{

fun1 (23);

return 0;

}

3.29 Использование статической локальной переменной

#include<iostream.h>

double aver (double x)

{

static double count = 0;

static double sum = 0;

++count;

sum += x;

return sum / cout;

}

int main()

{

cout << “Среднее значение равно” << aver (1) << endl;

cout << “Среднее значение равно” << aver (2) << endl;

cout << “Среднее значение равно” << aver (4) << endl;

cout << “Среднее значение равно” << aver (10) << endl;

cout << “Среднее значение равно” << aver (11) << endl;

return 0;

}

3.30 Встроенная функция

#include<iostream.h>

inline double sqr (double x)

{

return x * x;

}

inline double cube (double x)

{

return x * x * x;

}

int main()

{

double x;

cout << “Введите число : ”;

cin >> x;

cout << “Квадрат от” << x << “ = ” << sqr (x) << endl;

cout << “Куб от” << x << “ = ” << cube (x) << endl;

return 0;

}

3.31 Использование аргументов по умолчанию

#include<iostream.h>

void mess (const char *msg, const char *name = " Вася")

{

cout << name << " говорит \" " << msg << " \" " << endl;

}

int main()

{

mess (“Привет ”);

mess (“Здравствуй ”, “Петя”);

return 0;

}

3.32 Рекурсивная функция. Вычисление факториала

#include<iostream.h>

const int MIN = 1

const int MAX = 30

double factorial ( double x)

{

if ( f > 1)

return f * factorial ( f - 1 );

else

return f ;

}

int main()

{

int x;

do

{

cout << “Введите число между ” << MIN << “ и ” << MAX “ : ”;

cin >> x;

} while ( x < MIN || x > MAX);

cout << x << “! = “ << factorial (x) << endl;

return 0;

}

3.33 Перегрузка функции

Программа выполняет следующие действия:

объявляет переменные типов char, int, double и инициализирует их;

выводит начальные значения этих величин;

вызывает перегруженные функции, которые увеличивают значения этих величин;

выводит вычисленные значения.

#include<iostream.h>

void pfun (int &i) // версия для аргумента целого типа

{ i = i+1; }

void pfun (double &x) // версия для аргумента вещественного типа

{ i = i+1; }

void pfun (char &c) // версия для символьного аргумента

{ i = i+1; }

int main()

{

char c = `A';

int i = 10;

double x = 10.2;

cout << “c = ” << c << endl

<< “i = ” << i << endl

<< “x = ” << x << endl ;

pfun (c);

pfun (i);

pfun (x);

cout << “c = ” << c << endl

<< “i = ” << i << endl

<< “x = ” << x << endl;

return 0;}

3.34 Программа, иллюстрирующая использование класса

#include <iostream.h>

class rectangle

{

private:

double length;

double width;

public:

rectangle ()

{assign (0, 0); }

rectangle(double Len, double Wide)

{assign (Len, Wide);}

double Length()

{ return length; }

double Width()

{ return width; }

double Area()

{return length * width;}

void assign(double Len, double Wide);

};

void rectangle::assign(double Len, double Wide)

{

length = Len;

width = Wide;

}

int main()

{

rectangle rect;

double len, wide;

cout << "Enter length of rectangle: " ;

cin >> len;

cout << "Enter width of rectangle: ";

cin >>wide;

rect.assign (len, wide);

cout << " Rectanglelength = << rect.Length()<<endl

<<” width=”<<rect.Width()<<endl

<<” area=”<< rect.Area()<<endl;

return 0;

}

В программе объявляется класс rectangle, моделирующий прямоугольник. Класс имеет два элемента данных типа double - length и width, определяющих размеры прямоугольника, длину и ширину соответственно. Кроме того, класс имеет два конструктора, один из которых является конструктором по умолчанию. В классе определяются функции-элементы: Length, Width, Area, assing.

Конструктор по умолчанию не имеет параметров (или все его параметры должны иметь значения по умолчанию) и вызывается при создании представителя класса, которому не заданы аргументы. Если при объявлении представителя класса указываются параметры, то в этом случае вызывается соответствующий конструктор, а не конструктор по умолчанию.

Функция Length, определенная в объявлении класса, просто возвращает значение элемента данных length. Функция Width, также определенная в объявлении класса, возвращает значение элемента width. Функция Area, шределенная в объявлении класса, просто возвращает значение произведения элементов length и width.

Функция assign, определенная вне объявления класса, присваивает значения своих параметров Len и Wide элементам-данным length и width соответственно.

В функции main определяются экземпляр rect класса rectangle и переменные len и wide типа double. Заметьте, что в этом примере при объявлении данных им не присваиваются никакие начальные значения, но вы могли бы присвоить значения длине и ширине прямоугольника, если бы объявили rect таким образом: rectangle rect(10, 20);

Такое объявление объекта класса приведет к вызову конструктора

rectangle::rectangle(double, double), а не конструктора rectangle::rectangle().

В результате, данные-элементы length и width получат соответствующие значения. Операторы ввода/вывода предлагают ввести значения и помещают ввод в переменные len и wide. Затем функция main использует эти переменные при вызове функции-элемента assign. Оператор вывода выводит значения Length, Width и Area для объекта rect.

Список рекомендуемой литературы

1. Иванова Г.С. Программирование на СИ++ /Учебник. Изд. МГТУ им. В.Н. Баумана, 2002 г.

2. Страуструп Б. Язык программирования СИ++/ Пер с англ.- М.:Радио и связь, 2004.

3. Теренс Чан Системное программирование на СИ++ для Unix./Под ред. Коломыцева, Киев, 2002.

Приложение

Математические библиотечные функции

Функция

Краткое описание

Abs

Нахождение абсолютного значения выражения типа int

Acos

Вычисление арккосинуса

Asin

Вычисление арксинуса

Atan

Вычисление арктангенса x

Atan2

Вычисление арктангенса y/x

Cabs

Нахождение абсолютного значения комплексного числа

Ceil

Нахождение наименьшего целого, большего или равного x

Cos

Вычисление косинуса

Exp

Вычисление функции экспоненты

Fabs

Нахождение абсолютного значения типа double

Floop

Нахождение наибольшего целого, меньшего или равного x

Fmod

Нахождение остатка от деления x/y

Hypot

Вычисление гипотенузы

Labs

Вычисление абсолютного значения типа long

Log

Вычисление натурального логарифма

Log10

Вычисление логарифма по основанию 10

Modf

Разложение x на дробную и целую часть

Pow

Вычисление x в степени y

Sin

Вычисление синуса

Sgrt

Вычисление квадратного корня

Tan

Вычисление тангенса

Размещено на Allbest.ru


Подобные документы

  • Ознакомление со структурой, комментариями, переменными и типами данных, константами, перечислениями, преобразованием типов языка программирования высокого уровня С++. Ключевые понятия языка, идентификаторы, ключевые слова, функции, операторы, выражения.

    контрольная работа [31,2 K], добавлен 12.12.2009

  • Элементы языка Object Pascal: идентификаторы, константы, переменные, выражения. Структура проекта Delphi. Операторы и метки. Типы данных языка OPascal. Статические и динамические массивы. Записи с вариантными полями. Совместимость и преобразование типов.

    курс лекций [385,4 K], добавлен 18.02.2012

  • Понятие и общая характеристика языка программирования РНР, принципы и этапы его работы, синтаксис и ассоциируемые массивы. Обработка исключений в языке Java. Работа с базами данных с помощью JDBC. Изучение порядка разработки графического интерфейса.

    презентация [192,3 K], добавлен 13.06.2014

  • Лингвистическая концепция языка Паскаль. Интегрированная инструментальная оболочка. Основы построения программ на ТП 7.0. Алфавит языка и специфика использования символов. Простые типы данных: константы и переменные. Циклические конструкции и операции.

    курсовая работа [284,6 K], добавлен 02.07.2011

  • Конструкции Си, базовые типы данных языка программирования. Идентификаторы и типизированные константы. Область видимости и время жизни переменных. Функции преобразования символьных строк. Функции, работающие со строками. Разработка визуальных компонент.

    методичка [400,2 K], добавлен 06.07.2009

  • История создания и применение языка Basic. Стандартные математические и строковые функции. Операции и выражения языка. Блоки данных и подпрограммы. Операторы управления, цикла, ввода-вывода и преобразования информации. Константы, переменные, массивы.

    контрольная работа [2,3 M], добавлен 04.05.2015

  • Элементы и переменные, используемые для составления записи в Паскале. Основные числовые типы языка Turbo Pascal. Составление блок-схемы приложения, программирование по ней программы для вычисления функции. Последовательность выполнения алгоритма.

    лабораторная работа [256,9 K], добавлен 10.11.2015

  • Понятие алгоритма. Цикл программы. Структурная схема алгоритма. Элементы языка Тurbo Рascal. Алфавит. Идентификаторы. Комментарии. Лексика языка С++. ESC-последовательности. Операции. Ключевые слова. Комментарии.

    контрольная работа [43,0 K], добавлен 24.04.2006

  • Основы языка программирвоания C++. Элементы управления в Microsoft Visual C++. Алгоритмические конструкции языка программирования Visual C++ и базовые элементы управления. Глобальные константы и переменные. Управление программой с помощью клавиатуры.

    курсовая работа [1,7 M], добавлен 08.04.2015

  • Метод половинного деления и метод касательных. Переменные, константы, объявление типов данных. Объект WorkBook: его свойства, методы и события. Методы нахождения корней уравнений. Структурированные типы данных. Терминальные свойства объекта Workbook.

    курсовая работа [1,1 M], добавлен 14.07.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.