Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
shprora_po_proge.docx
Скачиваний:
4
Добавлен:
23.09.2019
Размер:
518.78 Кб
Скачать

5.Classint_Matrix// класс для обработки целочисленной матрицы

6. { public:

7. int_Matrix(int, int, int, int); // прототипконструктора

8. voidOutPut(int, int); // прототип метода вывода матрицы //прототип бинарного оператора - (вычитания)

10. int_Matrixoperator - (int_Matrix&F);

11. //прототип бинарного оператора + (сложения)

12. int_Matrixoperator + (int_Matrix&D);

13. // прототип унарного оператора -

14. voidoperator - ();

15. private:

16. enum {n=10, m=12};

17. int int_Matr[n][m]; // поле для размещения матрицы

18. };

19. // определениеконструктора

20. int_Matrix::int_Matrix(int n, int m, int min, int max)

21. { for(int i=0; i<n; i++)

22. for(int j=0; j<m; j++)

23. int_Matr[i][j]=rand()%(max-min+1)+min;}

24. // определениеметода OutPut()

25. void int_Matrix::OutPut(int n, int m)

26. { for(int i=0; i<n; i++) {

27. for(int j=0; j<m; j++) cout << int_Matr[i][j] <<' '; 28. cout << endl; } }

29. // определениебинарногооператора -

30. int_Matrix int_Matrix::operator - (int_Matrix& F)

31. { for(int i=0; i<n; i++)

32. for(int j=0; j<m; j++)

33. F.int_Matr[i][j]=int_Matr[i][j]-F.int_Matr[i][j];

34. returnF; }

35. // определение бинарного оператора +

36. int_Matrix int_Matrix::operator + (int_Matrix& D)

37. { for(int i=0; i<n; i++)

38. for(int j=0; j<m; j++)

39. D.int_Matr[i][j]=int_Matr[i][j]+D.int_Matr[i][j];

40. returnD; }

41. // определение унарного оператора -

42. void int_Matrix::operator - ()

43. { for(int i=0; i<n; i++)

44. for(int j=0; j<m; j++) int_Matr[i][j]=-int_Matr[i][j]; }

45. Int main()

46. { int n, m, min=0, max=9;

47. srand((unsigned)time(NULL));

48. cout <<"Vvedite kol-vo strok (<=10) i stolbtsov (<=12): ";

49. cin >> n >> m;

50. cout <<"\nMatritsa A:";

51. int_Matrix A(n,m,min,max); cout << endl; A.OutPut(n,m);

52. cout <<"\nMatritsa B:";

53. int_Matrix B(n,m,min,max); cout << endl; B.OutPut(n,m);

54. int_Matrix C(n,m,min,max);

55. C=B; cout <<"\nMatritsa A-B:\n"; C=A-C; C.OutPut(n,m);

56. C=B; cout <<"\nMatritsa A+B:\n"; C=A+C; C.OutPut(n,m);

57. cout <<"\nMatritsa -B:\n"; -B; B.OutPut(n,m);

58. return 0;

59. }

В строках с 5 по 18 включительно представлено определение класса int_Matrix для организации обработки целочисленной матрицы.

В строках с 29 по 34 и строках с 35 по 40 определены соответственно бинарные операторы – и +. Например, на вход оператора + (см. стр. 35) подается объект D класса int_Matrix. На основе вложенных циклов реализована операция поэлементного сложения матриц объекта D и объекта, стоящего в выражении сложения слева от +. В результате формируется матрица объекта D, которая и возвращается в качестве результата.

В строках с 42 по 44 определен унарный оператор –. На основе вложенных циклов реализована операция поэлементного отрицания значений элементов матрицы, для которой выполняется эта унарная операция.

Функция main() определена в строках с 45 по 59 включительно. В начале определяются переменные n и m для размещения в них значений числа соответственно строк и столбцов матрицы. Переменные min и max используются для определения границ диапазона, в котором случайным образом формируются значения элементов матриц A,B,C. Отметим, что матрица C используется как промежуточная для корректного выполнения операций A+B, AB.

В строке 51 создается объектА, внутри которого с помощью ГСЗ формируется матрица целочисленных значений и ее значения выводятся на экран методом OutPut().

В строке 53 создается объект B, внутри которого с помощью ГСЗ формируется матрица целочисленных значений и ее значения выводятся на экран методом OutPut().В строке 54 создается объект C, внутри которого с помощью ГСЗ формируется матрица целочисленных значений.

В строках 55 и 56 соответственно реализованы операции AB и A+B, причем матрица Cиграет важную роль, поскольку в процессе реализации указанных операций необходимо, с одной стороны, сохранить исходные значения матриц Aи B, с другой стороны, формировать промежуточные результаты.

30 Основные правила перегрузки операторов в языке С++.

  1. Нельзя вводить собственные обозначения для операторов, не совпадающие со стандартными операторами языка С++.

  2. Не все операторы языка С++ могут быть перегружены. Так нельзя перегрузить:

. – прямой выбор элемента

.* – обращение к элементу через указатель на него

? : – условная операция

:: – операция указания области видимости

sizeof, # и ## – препроцессорные операции.

  1. Каждый оператор в языке имеет определенное число операндов, свой приоритет и ассоциативность. Все эти правила сохраняются и при перегрузке, а изменить их нельзя.

  2. Любой унарный оператор OP определяется двумя способами: либо как компонентная функция без параметров, либо как глобальная (возможно дружественная) функция с одним параметром. Выражение OPz означает в первом случае вызов z.operatorOP(), во втором - вызов operatorOP(z).

  3. Любой бинарный оператор OP определяется также двумя способами: либо как компонентная функция с одним параметром, либо как глобальная (возможно дружественная) функция с двумя параметрами. В первом случае x OP y означает вызов x.operatorOP(y), во втором – вызов operatorOP(x, y).

  4. Перегруженный оператор не может иметь аргументы по умолчанию.

  5. В языке С++ установлена идентичность некоторых операторов, например, ++z – это тоже, что и z += 1. Эта идентичность теряется для перегруженных операторов.

  6. Функцию operator можно вызвать по ее имени, например, z = operator * (x, y) или z = x.operator *(y). В первом случае вызывается глобальная функция, во втором – компонентная функция класса X, и x – это объект класса X. Однако, чаще всего функция operator вызывается косвенно, например, z = x * y.

31 Понятие потоков в языке С++.

Для обмена данными между программой и внешними устройствами в языках программирования предусматриваются операции ввода-вывода. Типичным внешним устройством ввода-вывода является консоль, представляющая собой комплект устройств (дисплей, клавиатура, мышь), присоединённых к компьютеру непосредственно, а не через сеть. На консоль можно вывести информацию, можно ввести информацию с клавиатуры или мыши.

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

В языке C++ нет специальных операторов для выполнения операций ввода или вывода данных. Вместо этого имеется стандартная библиотека <iostream>, стандартно поставляемая вместе с компилятором, c помощью классов которой и реализуются основные операции ввода-вывода (I/OInputandOutput). Такой подход обеспечил эффект “независимости от платформы”.

Механизм для обеспечения выполнения операций ввода-вывода в С++ называется потоком. Название произошло оттого, что данные вводятся и выводятся в виде потока байтов.

Операции “запись данных на внешнее устройство (диск)” и “считывание их с внешнего устройства (диска)” являются относительно медленными, а потому могут существенно притормаживать выполнение программы. Для повышения скорости обмена данными предусматривается механизм буферизации. В этом случае данные сначала записываются в буфер потока, а после его наполнения все содержимое записывается на диск.

Реализация потоков и буферов в языке С++ построена на объектно-ориентированном подходе:

  • класс streambuf управляет буфером (с помощью соответствующих методов буфер может, например, наполняться, очищаться, сбрасываться).

  • класс ios является базовым для классов потоков ввода/вывода и внутри него в качестве переменной-члена предусмотрен объект streambuf.

  • классы istream и ostreamявляются производными от класса ios и используются, соответственно, для обеспечения потокового ввода и вывода данных.

  • класс iostreamявляется производным от классов istream и ostreamи используется для обеспечения ввода с клавиатуры и вывода на экран.

  • класс fstreamиспользуются для операций ввода и вывода из файлов.

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

Класс istream реализует поток ввода, класс ostream – поток вывода. Эти классы определены в библиотеке <iostream>. Библиотека потоков ввода-вывода определяет три глобальных объекта: cin, cout, и cerr. Объект cin отвечает за ввод данных, объект cout является стандартным выводом, а cerr является потоком сообщений об ошибках. Объекты cout и cerr являются экземплярами класса ostream, а cin – объект класса istream.

32 Ввод данных с помощью объекта cin в языке С++.

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

… intn; cin>>n;

Объект cin включает перегруженный оператор ввода >>, который записывает данные из буфера в локальную переменную n. Оператор ввода перегружен таким образом, что предусматривает ввод данных основных базовых типов, включая int&, short&, long&, double&, float&, char&, char*. Когда в программе компилятор встречает выражение cin>>…, то вызывается вариант оператора ввода, соответствующий типу переменной. Поскольку параметр передается как ссылка, то оператор ввода способен изменять исходную переменную.

Объект cin может принимать в качестве аргумента указатель на строку символов типа char*, а потому можно с его помощью вводить массив символов, т.е. строку. Рассмотрим фрагмент кода:

… charSTROKA[9];

cout<< “Введите строку:”;

cin>>STROKA; …

Если ввести слово ЯЗЫК, то массив STROKA будет заполнен слева 5 символами: Я, З, Ы, К, \0. Если же попробовать ввести фразу ЯЗЫК С++, то окажется, что введены будут только символы, стоящие до пробела, т.к. пробел выступает в роли заданного по умолчанию разделителя строк.

Отметим, что в языке С++ кроме перегружаемого оператора >> объект cin имеет ряд встроенных методов (getline(), get() и др.), которые позволяют обеспечивать более строгий контроль при выполнении ввода данных.

Например, для ввода строки символов можно использовать метод getline(). Рассмотрим пример простой программы, в которой определяются два массива типа charи ввод фразы ЯЗЫК С++ осуществляется с использованием метода getline()и оператора >>.

#include<iostream>

usingnamespace std;

int main()

{ char STROKA_1[9], STROKA_2[9];

cout <<"Vvedite 1 stroku:"; cin.getline(STROKA_1,9);

cout <<"Vvedite 2 stroku:"; cin >> STROKA_2;

cout << endl <<"STROKA_1:"<< STROKA_1;

cout << endl <<"STROKA_2:"<< STROKA_2 << endl;

return 0;

}

Отметим, что использование метода getline()позволило ввести полностью всю фразу, тогда как оператор >> обеспечил только ввод части фразы до первого слева пробела.

!!! При последовательном комбинированном вызове методов get(), getline() и оператора >> необходимо следить за правильным использованием буфера ввода.

33. Вывод данных с помощью объекта cout в языке С++

Вывод данных с помощью объекта coutможет осуществляться с использованием оператора <<. Причем этот объект позволяет осуществлять:

  • форматирование выводимых данных;

  • выравнивание столбцов;

  • вывод числовых значений не только в десятичном, но в восьмеричном и шестнадцатеричном представлении.

По умолчанию ширина поля вывода устанавливается автоматически таким образом, чтобы вместить все символы из буфера вывода. Используя метод width() можно точно определять значение ширины только следующего поля вывода. Отметим, что объект coutпо умолчанию заполняет пробелами пустые позиции поля, однако можно с помощью метода fill() установить другой символ заполнения.

#include<iostream>

usingnamespace std;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]