Способ обращения к членам-данным  и членам-функциям
Поможем в ✍️ написании учебной работы
Поможем с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой

КЛАССОВ

 

Методические указания к лабораторным работам по дисциплине

“Технология программирования”

для студентов специальности 23.01.01 “Вычислительные машины,

 комплексы, системы и сети” и направления подготовки

552800 “Информатика и вычислительная техника”

 

 

 

   

 

Москва – 2004


МИНИСТЕРСТВО ПУТЕЙ СООБЩЕНИЯ


РОССИЙСКОЙ ФЕДЕРАЦИИ

МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ПУТЕЙ СООБЩЕНИЯ (МИИТ)

 


Кафедра “Электронные вычислительные машины”

                       

 

М.Н.НИКОЛЬСКАЯ

 

 

                            УТВЕРЖДЕНО

Редакционно-издательским

советом университета

СОСТАВЛЕНИЕ ПРОГРАММ НА СИ++ С ИСПОЛЬЗОВАНИЕМ

 КЛАССОВ

 

Методические указания к лабораторным работам по дисциплине

“Технология программирования”

 для студентов специальности 23.01.01 “ Вычислительные машины,

, комплексы, системы и сети” и направления подготовки

552800 “ Информатика и вычислительная техника”

 


Москва - 2004


УДК 681.3

 Н-63

 

Никольская М.Н. Составление программ на Си++ с использованием классов: Методические указания. - М.: МИИТ, 2004, -76 с.

 

Методические указания состоят из трех разделов.

В первом разделе приведены теоретические сведения об объектно-ориентированых средствах языка С++, используемых при составлении программ.

Во втором разделе представлен набор заданий, распределенный по 6-ти темам. Выполнение этих заданий позволит изучить описанные в первом разделе средства языка СИ++.

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

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

           

Ó Московский государственный университет путей сообщения (МИИТ), 2004


Учебно-методическое издание

Никольская Марина Николаевна

Составление программ на Си++ с использованием классов

Методические указания


Подписано                  Формат                     Тираж

в печать                      Изд. №

Усл.печ.л.                    Заказ №                 Цена ( )


127994, Москва, ул. Образцова, 15

Типография МИИТ

Содержание стр
Введение 4
1. Объектно-ориентированные средства яыка Си++ 4
1.1 .Средства языка Си++ для создания и обработки объектов 4
1.2. Создание объектов заданной структуры с использованием конструкторов 10
1.3. Использование статических членов-данных и статических членов-функций в объектах 16
1.4. Использование динамической памяти при работе с объектами 18
1.5. Перегрузка операторов 24
2. Индивидуальные задания 33
2.1. Тема № 1. Создание и обработка наборов объектов заданной структуры 33
2.2. Тема № 2. Создание и обработка наборов данных заданной структуры с использованием конструкторов 39
2.3 Тема № 3. Создание и обработка наборов объектов заданной структуры с использованием статических членов-данных и членов-функций 40
2.4. Тема № 4.Создание и обработка наборов объектов заданной структуры с использованием динамической памяти. 44
2.5. Тема № 5. Создание и обработка наборов данных заданной структуры с использованием перегрузки встроенных операций 45
2.6. Тема № 6. Создание и обработка наборов данных заданной структуры с использованием перегрузки операторов ввода-вывода. 46
3. Примеры выполнения типового задания 47
3.1. Пример алгоритма и текста программы типового задания по первой теме 47
3.2. Пример алгоритма и текста программы типового задания по второй теме 52
3.3. Пример алгоритма и текста программы типового задания по третьей теме 58
Литература 68






Введение

 

Цель настоящих методических указаний состоит в том, чтобы дать студентам представления о методах составления программ с использованием абстрактных типов данных, используемых в Си++, то есть с основами объектно-ориентированного программирования.

Представленные методические указания состоят из 3-х частей.

В первой части представлены теоретические основы объектно-ориентированного программирования с использованием средств языка Си++.

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

В третьей части методических указаний представлены подробные примеры выполнения типовых заданий.

 

1. Объектно-ориентированные средства языка Си+

1.1.Средства языка Си++ для создания и обработки объектов

Напомним, что составленная на процедурно-ориентированном языке программа представляет последовательность операторов, определяющую обработку данных определенного типа. Тип данных задается в операторе описания данных. Тип данных определяет 2 аспекта:

1. формат представления данных в памяти;

2. тип операций, которые могут быть использованы при записи обработки.

Транслятор контролирует правильность использования операций в соответствии с указанным типом.

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

Абстрактный тип данных используется для определения данных, которые называются объектами.

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

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

В языке СИ++ для определения абстрактного типа используется понятие класса. Класс определяет структуру памяти будущего объекта по данным и те функции, которые будут обрабатывать эти данные. Подчеркнем, что описание класса не приводит к созданию объекта.

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

сlass имя1

{ // блок описания данных ( членов-данных)

// блок описания функций (членов-функций)

}; // конец определения класса

class – ключевое слово, имя1 – идентификатор , определяющий имя класса.

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

Определение объекта использует тот же самый формат определения, что и данные встроенного типа, а именно:

Имя1 obj1,obj2;

где имя1- имя класса(абстрактного типа).

По оператору определения объекта транслятор производит выделение памяти для всех данных, указанных в классе с именем имя1.

Пример

сlass Q1 //  заголовок класса

{ // члены-данные а,b

private:

int a; // закрытый член-данное

public:

int b; // открытый член-данное

private:

// члены –функции

void f1() // закрытая функция

  {a=5; b=10;}

public:// открытая функция

int f2()

{return (a+b);}

}; // конец описания класса

int main()

{

Q1 obj1,obj2; // создание 2-х объектов

Q1 ob3[5]; // создание массива из 5-ти объектов.

 

.Q1 *obj4; // указатель на объект класса Q1, сам объект не создается. . . . . . .

}

 

В этом случае транслятор создает следующие структуры данных:

                 
 
 

 


                                             5 элементов

     
 
*obj4

 


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

 



Обработка объектов

Ввод данных в объект

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

Ый способ

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

Пример 1

#include<stdio.h>

#include<string.h>

#include<conio.h>

class q1

{ int a,b;// закрытые по умолчанию члены-данные

int mas1[10];

char mas2[12];

public:

void vvod(int x1,int x2,int* x3,char * x4) /* открытая член- функция ввода*/

{ a=x1; b=x2;

for(int i=0;i<10;i++)// запись в массив объекта mas1//

  mas1[i]=x3[i];

  strcpy(mas2,x4);// запись в массив объекта mas2

}

}; // конец определения класса q1

int main()

 { int a=3, b=5;/* инициализация a,b*/

int y1[10]={0,1,3,44,7,8,9,1,43,5}; /* инициализация массива y1*/

char y2[12]="ffffffff";/* инициализация массива y2*/

q1 obj1; // определение объекта obj1

clrscr();

obj1.vvod(a,b,y1,y2); /* ввод данных в объект obj1 массивов y1 и y2*/

return 0;

}

Комментарии

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

Ой способ

В этом случае ввод производится непосредственно в теле члене-функции ввода.

Замечание

В приведенных примерах используются средства переопределенного ввода-вывода языка Си++ (смотри комментарии в программах и раздел 1.5). Для использования этих средств должен быть подключен с помощью оператора include файл iostream.

Пример

#include<iostream.h>

#include <conio.h>

class q1

{ int a,b;/*закрытые члены-данные*/

int mas1[10];

char mas2[12];

public:

void vvod() /* член-функция ввода членов-данных*/

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

{ cout<<"введите текущий элемент -целое число \n ";

       cin>>mas1[i]; /* ввод данных через стандартный объект cout*/

}

cout<<"введите строку"<<endl;

cin>>mas2;

}//* конец функции ввода

}; /* конец описания класса q1*/

int main()

{clrscr();

 q1 obj1;

 obj1.vvod(); /* вызов открытой член –функции ввода данных в объект   obj1*/

return 0;

}

Комментарий

В данном случае используется член-функция ввода, которая не имеет параметров; ввод членов-данных вводится непосредственно в теле функции.

 

Вывод данных объекта

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

 

Ый способ

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

Пример

Один из приведенных выше примеров дополнен функцией вывода.

#include<stdio.h>

#include<string.h>

#include<conio.h>

class q1

{ int a,b;// закрытые члены-данные

int mas1[10]; // массив целых чисел

char mas2[12];// массив символов

public:

void vvod(int x1,int x2,int* x3,char * x4) // член-функция ввода

{ a=x1; b=x2;

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

     mas1[i]=x3[i];

  strcpy(mas2,x4);

}

void vivod()         // член-функция вывода без параметров

{ printf("dannie obekta \n");

printf("a=%d b=%d \n",a,b);

for (int i=0;i<10;i++)// печать массива mas1

printf("mas1[%d]=%d \n",i,mas1[i]);

printf ("massiv mas2 %s",mas2); //печать массива mas2

}

 }; // конец определения класса

int main()

 { int a=3, b=5;

int y1[10]={0,1,3,44,7,8,9,1,43,5};

char y2[12]="ffffffff";

q1 obj1; // определение объекта obj1

clrscr();

obj1.vvod(a,b,y1,y2); // ввод данных в объект

obj1.vivod();// // вывод данных объекта

return 0;

}

Ой способ

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

Пример

#include<iostream.h>

#include<string.h>

#include <conio.h>

class q1

{;/*закрытые члены-данные*/

int mas1[10];

char mas2[12];

public:

void vvod() /* функция ввода*/

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

{ cout<<"введите текущий элемент -целое число \n ";

  cin>>mas1[i];

}

  cout<<"введите строку"<<endl;

cin>>mas2;

}

void vivod(int *x1, char *x2) /*функция вывода членов-данных в данные главной программы*/

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

x1[i]=mas1[i];

strcpy(x2,mas2);

} /*конец функции вывода*/

 

}; /* конец описания класса*/

int main()

{clrscr();

 int a[10]; /* память для записи членов-данных из объекта*/

 char stroka[12]; /* память для записи членов-данных из объекта*/

 q1 obj1;

 obj1.vvod(); /*ввод данных в объект*/

 obj1.vivod(a,stroka); /* вывод данных из объекта в главную функцию*/

 for(int i=0;i<10;i++) /* вывод данных из объекта в главной функции*/

cout<<"a["<<i<<"]= "<<a[i]<<endl;

cout<<"строка "<<stroka<<endl;

 return 0;

}

Комментарий

В данном примере члены –данные объекта записываются член-функцией вывода в память , которая выделена в функции main. Эта память задается фактическими параметрами a,stroka. При этом надо помнить, что в этом случае необходимо передавать значения адресов переменных. Непосредственная выдача на печать производится в главной функции.

 

Функции обработки

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

-      необходимо использовать, в основном, только закрытые члены-данные;

- необходимо использовать закрытые член-функции, которые могут использоваться открытыми член-функциями;

- если результат обработки представлен одним значением, то следует использовать член-функцию, которая возвращает значения результата и передает его в основную программу;

- в общем случае не следует записывать значения результатов обработки в качестве членов- данных объекта; это нерационально увеличивает объем памяти, выделяемой объекту;

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

 

Ый способ

Этот метод инициализации аналогичен, описанному выше, и может быть использован, если все члены-данные класса являются открытыми.

Например,

сlass M

{

public:

int h;

char k;

char w [12];

………..

};

int main()

 {M obj={56,’t’,”jjjjjjj”}’;…} ;/*объявление и инициализация членов данных объекта*/

 В этом случае в соответствии с позициями членам-данным объекта будут присвоены следующие значения : h=56; k=’t’; w=”jjjjjjj”

Примечание

Если в классе определены другие открытые данные, то они не будут инициализированы.

Если в классе, определяющем объект, определены и закрытые данные, то этот способ инициализации не может быть использован.

Способ

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

 

Особенности конструктора

- Имя конструктора обязательно совпадает с именем класса; именно по этому признаку транслятор определяет имеется ли конструктор в классе.

- В конструкторе никогда не указывается тип возвращаемого значения.

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

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

- Для конструктора должен быть определен режим public. Если для него определен режим private, то он может быть использован только другими членами-функциями класса, и он не может быть вызван автоматически.

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

 

Пример использования конструктора

#include<iostream.h>

class m // заголовок класса

{

int a[12]; // закрытые члены-данные

int n;

int g;

public:

m(int n1,int *x)// описание конструктора с двумя параметрами

{

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

{     

      a[i]=x[i]; ….// передача внешнего массива

       cout<<a[i]<<' '<<x[i]<<endl;

}

n=n1;

} ..// конец определения конструктора

};.// конец определения класса

 

int main() // главная функция

{ int f[4]={4,3,2,1}; // инициализация массива f

m obj1(4,f); /* создание объекта и вызов конструктора по передаче массива f в массив а объекта obj1; фактическими параметрами при вызове конструктора являются данные 4 и f)*/

return 0;

}

 

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

Возможно использование двух способов.

1-ый способ –явный вызов конструктора

Пример

Для приведенного выше примера m obj1=m(4,f);// в данном случае явное обращение к функции конструктора в классе m.

2-ой способ – неявная форма - указание фактических параметров в определении объекта.

m obj1(4,f);

m obj2(2,f);

 m obj3(1,f);

Пример

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

#include<iostream.h>

#include <conio.h>

class m

{ int a[12];// закрытые член-данные объекта

int n;

int g;

public:

m(int n1)/* первый конструктор с одним параметром по количеству вводимых элементов*/.

{ n=n1;

cout<<"vvedite "<<n1<<" dannie"<<endl;

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

{ cout<<”vvedite element”<<endl;

     cin>>a[i];

       cout<<”a[i]=”<<a[i]<<endl;

}

}// конец определения 1-го конструктора

m(int n1,int x) /*второй конструктор с двумя параметрами- массиву и количеству элементов*/

{

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

{ a[i]=x[i];

       cout<<”a[i]=”<<a[i]<<endl;

}

n=n1;

}// конец определения 2-го конструктора

}; //конец определения класса m

 

int main() // главная функция

 

{ clrscr();

int f[4]={4,3,2,1};

m obj1=m(4,f); //при инициализации вызывается второй конструктор

m obj2[3]={m(2),m(1),m(1,f)}; /*при инициализации первых 2-х элементов массива вызывается первый конструктор, а для третьего элемента вызывается второй конструктор*/

}

Пример

m obj[3]={m(4,f),m(3,f),m(1,y)}; /* описание и инициализация массива из трех объектов*/

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

- Если конструктор содержит только один параметр, то эти параметры могут быть указаны без явного вызова конструктора.

Пример

m obj[3]={1,5,4)}; /*описание массива из трех объектов для случая, когда конструктор содержит только один формальный параметр */

 

Пример

#include<iostream.h>

#include <conio.h>

class m

{

int a[12]; //закрытые члены -данных

int n;

int g;

public:

m()//конструктор без параметров

{ cout<<"constructor without parametr "<<endl;

       cout<<" vvedite kolichestvo dannie "<<endl;

       cin>>n;

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

       { cout<<"elementi "<<endl

       cin>>a[i];

        cout<<a[i]<<endl;

      }  

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

m(int n1,int *x)// конструктор с двумя параметрами

{cout<<"constructor with 2 parametrami"<<endl;

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

{ a[i]=x[i];

       cout<<a[i]<<' '<<x[i]<<endl;

}

n=n1;

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

};// конец определения класса

 

int main()// главная функция

{ clrscr();

int f[4]={4,3,2,1};

m obj1=m(4,f); // использование конструкторами с 2-мя параметрами

m obj4; // использование конструктора без параметров

m obj2[3]={m(4,f)};/* вызов конструктора с 2-мя параметрами для 1-го элемента массива объектов, вызов конструктора без параметра для 2-го и 3-его элемента массива*/

} // конец определения главной функции

Внимание

Если в определении объекта указаны скобки () ( как предполагается для вызова конструктора без параметров), то это приводит к ошибке.

Например, вместо m obj4 будет записано m obj4(). Такая запись транслятором воспринимается как объявление функции obj4 без параметров, которая возвращает значение типа m.

 

Пример

#include<iostream.h>

#include <conio.h>

class m

{ int a[12]; // закрытые члены-данные

int n;

int g;

public:

m(int n1=3) /* конструктор с параметром по умолчанию*/

{ cout<<"constructor with default "<<endl;

       cout<<"kolichestvo dannie "<<n1<<endl;

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

       { cout<<"vvedite element a"<<endl;

       cin>>a[i];

       cout<<a[i]<<' '<<endl;

       }

       n=n1;

} // конец определения конструктора с параметром по умолчанию

 

m(int n1,int *x)/* конструктор с двумя параметрами */

{cout<<"constructor with 2 parametrami"<<endl;

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

{ cout<<"vvedite element a"<<endl;

       a[i]=x[i];

       cout<<a[i]<<' '<<x[i]<<endl;

}

n=n1;

}// конец определения конструктора с 2-м параметрами

 

};// конец определения класса

 

int main() //главная функция

{ clrscr();

int f[4]={4,3,2,1};

m obj1=m(4,f); // вызов конструктора с двумя параметрами

m obj4; /* вызов конструктора с параметром по умолчанию n=3*/

m obj(1); /* вызов конструктора с параметром n=1*/

m obj2[3]={m(4,f)}; /* вызов для 1-го элемента массива obj конструктора с двумя параметрами, вызов конструктора с параметром по умолчанию n=3 для 2-го и 3-го элемента массива объектов obj2*/

}

 

Внимание

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

 

Статические член-функции

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

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

1-ый способ – имя объекта.член-функция (обычный способ вызова любой член-функции);

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

Пример

       Class M1

        {….    

       static int k; // статический член-класса

       ……………………………………………

        }; // конец определения класса

int M1::k=4; // М1- класс, в котором описана статический член к

 

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

 

Пример

#include<iostream.h>

#include<conio.h>

#include<string.h>

class m1

{ char kniga[12]; /* текст */

static char zag[120]; /*текст-заголовок , одинаковый для всех объектов*/

public:

static void pech () /* статическая функция печати заголовка*/

{cout<<"zagolovok "<<zag<<endl;}

m1(char * x) /* конструктор для задания текста объекта*/

{strcpy(kniga,x);}

void vivod() /* вывод текста объекта */

{ cout<<”text ”<<kniga<<endl;}

 }; // конец определения класса  m1

 char m1::zag[12]="kniga"; // выделение памяти и инициализация статической переменной

int main() // главная функция

{clrscr();

/*. Обращение к статической функции до создания объекта для выдачи общего заголовка для всех объектов */

m 1:: pech ();

 m1 obj[3]={"ttttt","hhhh","jjj"}; // задания текста в трех объектах

for(int i=0;i<3;i++) /* вывод постоянного заголовка и текста объекта*/

{ m1::pech(); /* 1-ый вариант использования статической функции без указания объекта */

obj[i].vivod();

};

cout<<"--------------"<<endl;

for(i=0;i<3;i++)// вывод постоянного заголовка и текста книги

{ obj[i].pech(); /* 2-ой вариант использование статической функции с указанием объекта*/

obj[i].vivod();

};

return 0;

}

Замечание

1.В этой программе используются 2 варианта обращения к статической функции. Это указано в комментариях.

При исполнении этой программы перед печатью содержимого текстов по каждому объекту печатается один и тот же заголовок - kniga.

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

 

Пример

int *g;

g=new int [12];

По этому оператору выделяется память для 12 элементов целого типа.

Тип выделяемой памяти должен соответствовать типу указателя.

 

Пример

Class g1

 {……};

int main()

{ g1 *obj1; g1 * obj2;

obj1=new g1; /* динамический объект obj1 */

obj2=new g1[4]; /* динамический массив из 4-х объектов */

        }

- выделение памяти для членов-данных объекта

Пример

Class g1

{ int * h; // член-данное указатель

…….

g1()

{ h=new int; …….} /*выделение в конструкторе памяти для данного целого типа *}

}; // конец определения класса

 

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

Пример

class q

 {

int x[12]; // массив x с максимальной длиной ,равной 12

int n;.// действительное количество элементов

public:

q(int n1…..) {n=n1; ……}; /* конструктор, в котором передается действительное количество элементов массива x, которое используется при вводе и обработке; n1-параметр для передачи действительного количества элементов */

}; // конец определения класса

 

Недостатком этого метода является то, что при создании всех объектов этого класса для каждого объекта будет выделяться память для 12-ти элементов целого типа, а использоваться только часть этого массива; рабочий размер этого массива, например, определяется в конструкторе формальным параметром n1.

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

Способ 2а

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

Пример

#include<iostream.h>

#include <conio.h>

class q1

{

int *x; // указатель на массив целых чисел

int n; // количество элементов в массиве

public:

q1(int *y,int n1)/* конструктор, передающий массив y и количество n1 обрабатываемых элементов */

{ x=y; //присвоение адреса внешнего массива

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

       {

       cout<<"x[i]="<<x[i]<<" y[i]="<<y[i]<<endl;/* распечатка передаваемого массива и массива объекта*/

       }

       n=n1; /* фиксация действительного размера массива */

} .// конец определения конструктора

}; // конец определения класса

int main() // главная функция

{ clrscr();

int f[4]={4,3,2,1};

q1 obj1(f,3); // задание в объекте адреса внешнего массива f

}// конец главной функции

 

 

Недостатком этого способа является то, что в этом случае данные объекта и данные внешней (главной) функции имеют одинаковые адреса (т. е. являются связанными по адресам); поэтому данные объекта фактически незащищены, хотя они имеют режим доступа private.

Способ 2б

 В рассматриваемом способе используется динамическая память для массива.

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

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

- переписать в эту память передаваемый массив.

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

Пример

В данном случае используется та же структура объекта, что и в примере способа 2а.

#include<iostream.h>

#include <conio.h>

class q1

{

int *x; //указатель на массив целых чисел

int n;// действительное количество элементов в массиве

public:

q1(int *y,int n1)// конструктор для передачи n1 элементов целого типа

{ x=new int [n1]; /* запрос памяти для массива из n1 элементов целого типа*/

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

       {

       x[i]=y[i];// передача i-го элемента

       cout<<"x[i]="<<x[i]<<" y[i]="<<y[i]<<endl;

       }

       n=n1;

}

}; // конец определения класса

int main()

{ clrscr();

int f[4]={4,3,2,1};

q1 obj1(f,3); /* в этом случае при исполнении конструктора выделяется память для трех элементов целого типа, в которую копируются три элемента внешнего массива f */

}

 

Примечание

Замечание о необходимости использования динамической памяти, конечно, справедливы и для  случая использования простых скалярных величин. Но особенно это актуально, как было уже сказано, для массивов.

 

Перегрузка операторов

Пример перегрузки встроенной операции

Заданы величины X1,X2,X3 - объекты некоторого класса q1.

Членами-данных объекта являются динамические массивы.

Составить программу вычисления объекта X4=X1*X2*3;

Результат операции перемножения объектов класса q1 должен представлять суммарный массив целых чисел: в начале этого массива должен быть расположен массив левого сомножителя, а за ним должен быть расположен массив правого сомножителя.

Далее представлена программа реализации такой задачи с использованием оператора перегрузки операции умножения*.

 

Вариант 1 – оператор перегрузки является членом-функцией класса

В этом случае запись Х1*Х2 рассматривается как Х1. operator *(Х2), где Х1- объект, для которого вызывается функция operator *, Х1- левый сомножитель,Х2- объект, правый сомножитель

#include<iostream.h>

#include <conio.h>

class q1 // описание класса q1

{

int *x;       // указатель на массив целого типа

int n;        //     размер массива

public:

q1(int *y,int n1) // 1-ый конструктор

{ x=new int [n1]; // динамическое выделение памяти

  for(int i=0;i<n1;i++) // передача внешнего массива по указателю

       {

       x[i]=y[i];

       cout<<"x[i]="<<x[i]<<" y[i]="<<y[i]<<endl;

       }

       n=n1; // запоминание действительного размера массива

} // конец 1-го конструктора

 

 

q1()         /*2-ой конструктор, ничего не делает, инициализация членов данных отсутствует, необходим для создания локального объекта */

{} /* пустое тело конструктора*/

 

q1 operator*(q1 obj)     // функция перегрузки операции умножения *

{ q1 y;  //     локальный объект для результата

        y.x=new int[n+obj.n]; //запрос памяти под суммарный массив в объекте y

        for(int i=0;i<n;i++) /*перепись массива левого сомножителя в локальный объект y*/

       y.x[i]=x[i];

        for(i=0;i<obj.n;i++)          /*дополнение массива локального объекта y массивом правого сомножителя*/

       y.x[i+n]=obj.x[i];

       y.n=n+obj.n;                   /*фиксирование суммарной длины массива в локальном объекте y*/

        return y;   //     возврат значения результата, т. е. объекта y

       }// конец перегружаемой операции умножения*

 

void vivod()        //     функция вывода массива объекта

{

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

       {

       cout<<"x[i]="<<x[i]<<endl;

       }

}

 

}; // конец определения класса q1

 

int main()              //     главная функция

{ clrscr();

int f1[4]={4,3,2,1}; //инициализация массива f1

int f2[5]={8,8,8,8,8,};// инициализация массива f2

q1 X1(f1,3),X2(f2,2),X3(f2,5); // инициализация трех объектов

q1 X4; /*определение результирующего объекта Х1 без инициализации по 2-ому конструктору*/

X4=X1*X2*X3; //вычисление Х4 по перегруженной операции умножения*

X4.vivod();        //     вывод результата, объекта X4

return 0;

}

 

Замечание.

Оператор X4=X1*X2*X3; в действительности с точки зрения вызова функций интерпретируется транслятором как Х4=(Х1.operator*(Х2)).operator(Х3) .

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

 

Вариант 2 – оператор перегрузки является дружественной функцией класса

В этом случае запись Х1*Х2 рассматривается как operator *(Х1,Х2), где Х1- объект, левый сомножитель, Х2- объект, правый сомножитель, а функция operator * имеет право обращаться при выполнении к закрытым элементам объектов класса q 1 , так как она является дружественной к классу q 1.

Замечание

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

Транслятор в этом варианте интерпретирует запись вида Х1*Х2*Х3 как выражение  operator*(operator*(X1,X2),X3).

 

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

Вариант 1

Исходные данные: набор книг.

Функции:

1) Определение номера книги, в которой заданное слово встречается максимальное  количество раз.

2) Стирание заданных слов на заданной странице в книге с заданным номером.

Обработка:

1) Определить номер объекта, в котором первая функция выдает ответ равный заданной величине.

2) Для найденного объекта выполнить вторую функцию.

Вариант 2

Исходные данные: набор точек и радиус окружности на плоскости.

Функции:

1) Определение количества точек, принадлежащих окружности.

2) Удаление из исходного набора точек, принадлежащих окружности.

Обработка:

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

2) для найденных объектов выполнить вторую функцию.

Вариант 3

Исходные данные: набор из 4-х точек на плоскости.

Функции:

1) Определение вида фигуры. которую определяет этот набор точек : прямоугольник, квадрат, ромб и т. д;

2)Подсчет площади фигуры при условии, что фигура является квадратом.

Обработка:

1)Определить с помощью первой функции номера объектов, определяющих квадраты.

2) Для найденных объектов выполнить вторую функцию.

Вариант 4

Исходные данные: информация. которая записывается в школьный журнал : фамилия, оценка. Количество записей в журнале является переменным.

Функции:

1)Определение количества и фамилий двоечников

2) Удаление заданных фамилий с перестроением списка

Обработка:

1)Определить с использованием первой функции номер объекта, который имеет максимальное количество двоечников.

Вариант 5

Исходные данные: набор точек и координаты квадрата на плоскости со сторонами, параллельными оси координат.

Функции:

1) Определение количества точек, принадлежащих сторонам квадрата.

2) Удаление из исходного набора точек, принадлежащих квадрату.

Обработка:

1) Определить с использованием первой функции номер объекта, который имеет максимальное количество точек, принадлежащих квадрату.

2) для найденного объекта выполнить функцию 2

Вариант 6

Исходные данные: набор точек на плоскости, определяющих треугольник.

Функции:

Вариант 8

Исходные данные: набор четырехугольных фигур на плоскости.

Функции:

1) Определение типа фигуры : квадрат, прямоугольник и т. д.

2) уменьшение прямоугольника до квадрата по минимальной стороне.

Обработка:

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

2) Для найденных объектов выполнить вторую функцию.

Вариант 9

Исходные данные: набор треугольных фигур на плоскости.

Функции:

1) Определение является ли фигура равносторонним треугольником.

2) Вычисление площади равностороннего треугольника

Обработка:

1) определить с использованием первой функции номера объектов, в которых все фигуры определяют равносторонние треугольники.

2) для найденных объектов выполнить вторую функцию для каждого треугольника объекта.

Вариант 10

Исходные данные: набор прямых на плоскости

Функции:

1)Определение являются ли все прямые, параллельными заданной прямой.

2)Изменение параметров прямой таким образом, чтобы она была параллельна горизонтальной оси.

Обработка:

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

2)Для найденных объектов выполнить вторую функцию для каждой прямой объекта.

Вариант 11

Исходные данные: набор точек и прямая на плоскости.

Функции:

1)Определение количества точек, принадлежащих прямой объекта.

2)Изменение угла наклона прямой на заданную величину.

Обработка:

1)Определить с использованием первой функции номер объекта,. который имеет максимальное количество точек на прямой

2) Для найденного объекта выполнить вторую функцию.

Вариант 12

Исходные данные: текст книги.

Функции:

1)Определение средней длины слова в книге.

2)Вставка заданного заголовка в начало каждой страницы.

Обработка:

1)Определить с использованием первой функции номер объекта, который имеет максимальную среднюю длину слова.

2) Для найденного объекта выполнить вторую функцию.

Вариант 13

Исходные данные: текст книги

Функции:

1)Определение максимального размера заголовка страницы в книге.

2)Вставка заданного заголовка в начало страницы с указанным номером.

Обработка:

1)Определить с использованием первой функции номер объекта, который имеет максимальную длину заголовка страницы

2)Для найденного объекта выполнить вторую функцию.

Вариант 14

Исходные данные: текст книги.

Функции:

1) определение средней длины предложения в книге.

2) усечение или расширение каждого предложения до средней длины.

Обработка:

1)Определить с использованием первой функции номер объекта, который имеет максимальную среднюю длину предложения.

2) Для найденного объекта выполнить функцию.

Вариант 15

Исходные данные: текст книги.

Функции:

1)Определение номера страницы, на которой расположено предложение с максимальной длиной.

2) Усечение предложения с максимальной длиной до заданной длины.

Обработка:

1)Определить с использованием первой функции номера объектов, которые имеют номер страницы, совпадающий с заданным номером.

2) для найденного объекта выполнить вторую функцию.

Вариант 16

Исходные данные: текст книги

Функции:

1)Определение минимальной длины слова в книге

2)Повторение слова с максимальной длиной в начале каждой страницы

Обработка:

1) Определить с использованием первой функции номер объекта, который имеет максимальную минимальную длину слова.

2) Для найденного объекта выполнить вторую функцию.

Вариант 17

Исходные данные: расписание движения поездов, имя вокзала.

Функции:

1)Определение номера поезда с максимальным временем нахождения в пути.

2)Сортировка расписания поездов в порядке увеличения времени нахождения в пути

Обработка:

1)Определить с использованием первой функции номер объекта, который имеет максимальное время нахождения в пути.

2)Для найденного объекта выполнить вторую функцию.

Вариант 18

Исходные данные: набор книг.

Функции:

1) Определение среднего размера книги.

2)Усечение или расширение текста каждой книги до средней длины.

Обработка:

1)Определить с использованием первой функции номер объекта, который имеет максимальный средний размер книги.

2)Для найденного объекта выполнить вторую функцию.

Вариант 19

Исходные данные: текст книги.

Функции:

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

2)Замена заданного слова на произвольно заданное слово.

Обработка:

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

2) Для найденного объекта выполнить вторую функцию.

Вариант 20

Исходные данные: текст книги.

Функции:

1)Определение количества предложений, в которых встречается произвольно заданное слово.

2)Замена слов с заданными номерами на заданный массив слов.

Обработка:

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

2) Для найденного объекта выполнить вторую функцию.

Вариант 21

Исходные данные: координаты треугольника на плоскости.

Функции:

1)Определение вида треугольника.

2)Подсчет площади правильного треугольника.

Обработка:

1)Определить с использованием первой функции номера объектов, которые определяют равносторонние треугольники.

2)Для найденных объектов выполнить вторую функцию.

Вариант 22

Исходные данные: набор четырехугольников.

Функции:

1)Определение количества квадратов в объекте.

2)Удаление из объекта данных по фигурам, которые не являются квадратами.

Обработка:

1)Определить с использованием первой функции номер объекта, который имеет максимальное количество квадратов.

2) Для найденного объекта выполнить вторую функцию.

Вариант 23

Исходные данные: текст книги.

Функции:

1)Определение количества предложений, длина которых меньше средней длины предложения объекта.

2) Замена слов с заданными номерами на произвольно заданные слова

Обработка:

1)Определить с использованием первой функции номер объекта, который имеет максимальное количество предложений.

2)Для найденного объекта выполнить вторую функцию.

Вариант 24

Исходные данные: предложение, которое может содержать следующие знаки препинания - , : ?

Функции:

1) определение количества повторений каждого знака препинания.

2) Замена всех знаков препинания на знак, который встречается чаще всего в предложении.

Обработка:

1)Определить с использованием первой функции номер объекта, в котором записано максимальное количество знаков препинания.

2) Для найденного объекта выполнить вторую функцию.

Вариант 25

Исходные данные: двумерная таблица, содержащая показания температуры в течение месяца: наименования дня, температура.

Функции:

1)Определение количества дней и наименования дней с температурой, превышающей среднюю температуру в течение месяца.

2)Определение дня и номера недели с максимальной температурой.

Обработка:

1) определить с использованием первой функции номер объекта, который имеет максимальное количество по этой функции.

 2) для найденного объекта выполнить вторую функцию.

 

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

Варианты заданий по этой теме остаются теми же, что и в первой теме.

 

Варианты статических членов-данных и статических член-функций

Вариант 1

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

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

Вариант 2

1. Статическая величина задает радиус окружности.

2. Статическая функция выдает инициированное значение радиуса окружности и по запросу может выполнить коррекцию значения радиуса для дальнейшей обработки.

Вариант 3

1. Статическая величина задает координаты одной из вершин. Это означает, что для всех объектов одна из вершин будет одинаковой, и будет необходимо вводить координаты только оставшихся вершин.

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

Вариант 4

1. Статическая величина задает количество записей в журнале.

2. Статическая функция выдает инициированное значение количества записей и по запросу может выполнить коррекцию количества записей для дальнейшей обработки.

Вариант 5

1. Статическая величина задает координаты квадрата.

2. Статическая функция выдает инициированные значения координат квадрата и по запросу может выполнить коррекцию координат квадрата для дальнейшей обработки.

Вариант 6

1. Статическая величина задает координаты одной из вершин треугольника.

2. Статическая функция выдает инициированное значение координат вершины и по запросу может выполнить коррекцию координат общей вершины для всех объектов для дальнейшей обработки.

Вариант 7

1. Статическая величина задает номер школы;

2. Статическая функция выдает инициированное значение номера школы и по запросу может скорректировать данные по номеру школы;.

Вариант 8

1. Статические величины задают количество четырехугольных фигур в объекте и фиксируют количество объектов, которые были инициированы или для которых был выполнен ввод данных ; то есть объекты, участвующие в обработке.

2. Статические функции выдают инициированное значение количества фигур, количества инициированных объектов и по запросу могут выполнить коррекцию количества фигур.

Вариант 9

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

2. Статические функции выдают инициированное значение количества фигур, количество инициированных объектов и по запросу могут выполнить коррекцию количества фигур.

Вариант 10

1. Статическая величина задает  координаты прямой, относительно которой проверяется параллельность прямых объекта по первой функции.

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

Вариант 11

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

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

Вариант 12

1. Статическая величина задает количество символов в тексте книги, то есть объекты имеют книги одинаковой длины.

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

Вариант 13

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

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

Вариант 14

1. Статическая величина задает величину-константу, до которой усекается или расширяется по второй функции предложение.

2. Статическая функция выдает инициированное значение величины-константы и по запросу может выполнить коррекцию этой величины.

Вариант 15

1. Статическая величина задает величину-константу, до которой усекается или расширяется по второй функции.

2. Статическая функция выдает инициированное значение величины-константы и по запросу может выполнить коррекцию этой величины.

     Вариант 16

1. Статическая величина задает повторяющееся по второй функции слово.

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

Вариант 17

1. Статическая величина задает имя вокзала, для которого составлено расписание; то есть все расписания-объекты заданы для одного вокзала.

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

Вариант 18

1. Статические величины задают значение величины-константы, до которой производится усечение по второй функции , и символ, который используется для расширения текста..

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

Вариант 19

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

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

Вариант 20

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

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

Вариант 21

1. Статическая величина задает координаты одной из вершин треугольника. В этом случае все объекты имеют одну и ту же вершину.

2. Статическая функция выдает инициированное значение координат вершины и по запросу корректирует данные по координатам общей вершины треугольников.

Вариант 22

1. Статические величины определяют количество четырехугольников в наборе и координаты первого четырехугольника из этого набора. В этом случае все объекты имеют один общий четырехугольник.

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

Вариант 23

1. Статические величины задают номера слов и слова замены, которые используются во второй функции.

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

Вариант 24

1. Статическая величина задает символ, который используется для замены по второй функции.

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

Вариант 25

1. Статическая величина определяет номера обрабатываемых дней в месяце по первой и второй функциям.

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

 

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

Варианты заданий по этой теме остаются теми же, что в первой теме.

 

2.5. Тема № 5. Создание и обработка наборов данных заданной структуры с использованием перегрузки встроенных операций

Цель этого задания состоит в том , чтобы перегрузить(переопределить) одну из заданных встроенных операций языка Си(сложения, вычитания , умножения , деления и т.д.), для которых в языке определены синтаксис использования этих операций при записи выражений .

 

Требования:

- - В качестве исходных данных используется структура объекта предыдущих заданий.

- Тип перегружаемой операции и алгоритм обработки, реализуемый по этой операции, выбирается самим студентом в соответствии со структурой заданного объекта и должен быть обязательно согласован с преподавателем.

- Перегружаемая операция для объектов должна на выходе выдавать объект того же типа;

-  В случае использования динамического выделения памяти для данных объекта должна быть переопределена операция присваивания;

- В тестовом примере должны быть проверены особенности синтаксиса перегружаемых операций (смотри далее).

-

Пример алгоритма переопределяемой операции

 

Исходные данные: информация, записываемая в школьный журнал.

Функции:

1) Определение количества учеников с баллом выше среднего по классу

2)Выделение фамилий учеников, определенных по первой функции, в отдельный список

Обработка:

1) определить номер объекта, который имеет максимальное количество учеников с баллом выше среднего по классу.

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

Варианты заданий остаются теми же самыми, что и в первой теме.

Примеры выполнения типовых заданий

 

3.1. Пример алгоритма и текста программы типового задания по первой теме

 

Задание

Задана структура некоторого объекта- библиотеки.

Члены-данные объекта-библиотеки – набор книг.

Члены-функции этого объекта-библиотеки, которые определяют возможное поведение объекта:

- вычисление максимального размера книги в библиотеке, т.е. максимального количества символов в книге.

- Запись в книгу максимального размера заданного заголовка.

Требуется составить на основе заданной структуры объекта программу, которая для заданного набора объектов-библиотек реализует следующий алгоритм:

1. Определение номера библиотеки, в которой находится книга максимального размера, с использованием первой член-функции объекта.

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

 

Алгоритм выполнения задания.

 

1. Выбор структуры данных объекта.

Закрытые член-данные объекта представлены:

a/ 2-мерным символьным массивом сhar kniga [m][к] – где каждая строка символов представляет текст всей книги, который может содержать максимум k – символов; m – максимальное количество книг в объекте-библиотеке.

b/ целой величиной n – которая представляет действительное количество книг в объекте-библиотеке.

3. Для работы с объектом-библиотекой определены следующие открытые член-функции, включая и заданные в определении объекта-библиотеки:

a/ функция ввода исходных данных в объект, которая имеет два формальных параметра : символьный массив строк и целую величину n; эта функция копирует символьный массив, задаваемый формальным параметром, в закрытый символьный массив kniga; количество копируемых строк задается формальным параметром n.

b/ функция вывода символьного массива строк – содержимого книг библиотеки.

c/ функция определения максимальной длины строки или номера книги которая имеет эту максимальную длину – т. е. книги максимального размера ( в комментарии к программе указанo , каким образом меняется интерпретация этого возвращаемого значения).

d/функция записи некоторого текста(заголовка) в строку(книгу) с заданным номером.


Выполнение открытой член-функции change , которая записывает введенный заголовок в книгу с номером nomerkn в объект-библиотеку с номером nomer
Выполнение открытой член-функции maxdlina для вычисления номера книги nomerkn с максимальной длиной в объекте-библиотеке с вычисленным номером nomer
Цикл выполнения для каждого i-го объекта-библиотеки открытой член-функции maxdlina для вычисления максимальной длины книги, записанной в объекте, и вычисление номера объекта nomer , который содержит книгу максимального размера (i=1,2…m)
2
12
11
10
9
8
7
6
5
4
3
1
Определение массива объектов-библиотек заданного класса         
Блок-схема


КЛАССОВ

 

Методические указания к лабораторным работам по дисциплине

“Технология программирования”

для студентов специальности 23.01.01 “Вычислительные машины,

 комплексы, системы и сети” и направления подготовки

552800 “Информатика и вычислительная техника”

 

 

 

   

 

Москва – 2004


МИНИСТЕРСТВО ПУТЕЙ СООБЩЕНИЯ


РОССИЙСКОЙ ФЕДЕРАЦИИ

МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ПУТЕЙ СООБЩЕНИЯ (МИИТ)

 


Кафедра “Электронные вычислительные машины”

                       

 

М.Н.НИКОЛЬСКАЯ

 

 

                            УТВЕРЖДЕНО

Редакционно-издательским

советом университета

СОСТАВЛЕНИЕ ПРОГРАММ НА СИ++ С ИСПОЛЬЗОВАНИЕМ

 КЛАССОВ

 

Методические указания к лабораторным работам по дисциплине

“Технология программирования”

 для студентов специальности 23.01.01 “ Вычислительные машины,

, комплексы, системы и сети” и направления подготовки

552800 “ Информатика и вычислительная техника”

 


Москва - 2004


УДК 681.3

 Н-63

 

Никольская М.Н. Составление программ на Си++ с использованием классов: Методические указания. - М.: МИИТ, 2004, -76 с.

 

Методические указания состоят из трех разделов.

В первом разделе приведены теоретические сведения об объектно-ориентированых средствах языка С++, используемых при составлении программ.

Во втором разделе представлен набор заданий, распределенный по 6-ти темам. Выполнение этих заданий позволит изучить описанные в первом разделе средства языка СИ++.

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

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

           

Ó Московский государственный университет путей сообщения (МИИТ), 2004


Учебно-методическое издание

Никольская Марина Николаевна

Составление программ на Си++ с использованием классов

Методические указания


Подписано                  Формат                     Тираж

в печать                      Изд. №

Усл.печ.л.                    Заказ №                 Цена ( )


127994, Москва, ул. Образцова, 15

Типография МИИТ

Содержание стр
Введение 4
1. Объектно-ориентированные средства яыка Си++ 4
1.1 .Средства языка Си++ для создания и обработки объектов 4
1.2. Создание объектов заданной структуры с использованием конструкторов 10
1.3. Использование статических членов-данных и статических членов-функций в объектах 16
1.4. Использование динамической памяти при работе с объектами 18
1.5. Перегрузка операторов 24
2. Индивидуальные задания 33
2.1. Тема № 1. Создание и обработка наборов объектов заданной структуры 33
2.2. Тема № 2. Создание и обработка наборов данных заданной структуры с использованием конструкторов 39
2.3 Тема № 3. Создание и обработка наборов объектов заданной структуры с использованием статических членов-данных и членов-функций 40
2.4. Тема № 4.Создание и обработка наборов объектов заданной структуры с использованием динамической памяти. 44
2.5. Тема № 5. Создание и обработка наборов данных заданной структуры с использованием перегрузки встроенных операций 45
2.6. Тема № 6. Создание и обработка наборов данных заданной структуры с использованием перегрузки операторов ввода-вывода. 46
3. Примеры выполнения типового задания 47
3.1. Пример алгоритма и текста программы типового задания по первой теме 47
3.2. Пример алгоритма и текста программы типового задания по второй теме 52
3.3. Пример алгоритма и текста программы типового задания по третьей теме 58
Литература 68






Введение

 

Цель настоящих методических указаний состоит в том, чтобы дать студентам представления о методах составления программ с использованием абстрактных типов данных, используемых в Си++, то есть с основами объектно-ориентированного программирования.

Представленные методические указания состоят из 3-х частей.

В первой части представлены теоретические основы объектно-ориентированного программирования с использованием средств языка Си++.

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

В третьей части методических указаний представлены подробные примеры выполнения типовых заданий.

 

1. Объектно-ориентированные средства языка Си+

1.1.Средства языка Си++ для создания и обработки объектов

Напомним, что составленная на процедурно-ориентированном языке программа представляет последовательность операторов, определяющую обработку данных определенного типа. Тип данных задается в операторе описания данных. Тип данных определяет 2 аспекта:

1. формат представления данных в памяти;

2. тип операций, которые могут быть использованы при записи обработки.

Транслятор контролирует правильность использования операций в соответствии с указанным типом.

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

Абстрактный тип данных используется для определения данных, которые называются объектами.

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

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

В языке СИ++ для определения абстрактного типа используется понятие класса. Класс определяет структуру памяти будущего объекта по данным и те функции, которые будут обрабатывать эти данные. Подчеркнем, что описание класса не приводит к созданию объекта.

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

сlass имя1

{ // блок описания данных ( членов-данных)

// блок описания функций (членов-функций)

}; // конец определения класса

class – ключевое слово, имя1 – идентификатор , определяющий имя класса.

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

Определение объекта использует тот же самый формат определения, что и данные встроенного типа, а именно:

Имя1 obj1,obj2;

где имя1- имя класса(абстрактного типа).

По оператору определения объекта транслятор производит выделение памяти для всех данных, указанных в классе с именем имя1.

Пример

сlass Q1 //  заголовок класса

{ // члены-данные а,b

private:

int a; // закрытый член-данное

public:

int b; // открытый член-данное

private:

// члены –функции

void f1() // закрытая функция

  {a=5; b=10;}

public:// открытая функция

int f2()

{return (a+b);}

}; // конец описания класса

int main()

{

Q1 obj1,obj2; // создание 2-х объектов

Q1 ob3[5]; // создание массива из 5-ти объектов.

 

.Q1 *obj4; // указатель на объект класса Q1, сам объект не создается. . . . . . .

}

 

В этом случае транслятор создает следующие структуры данных:

                 
 
 

 


                                             5 элементов

     
 
*obj4

 


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

 



Обработка объектов

Способ обращения к членам-данным  и членам-функциям

При обработке объектов программа должна обращаться к членам объекта. При этом используется 2 формата записи:

 

Имя объекта.имя члена-данного или члена функции

или

Имя указателя на объект.->имя члена-данного или члена-функции, если используется указатель на объект.

Например, obj1.b; и ob4->f2(); где b– член-данное объекта, f2()- член-функция класса.

Для каждого члена задается режим доступа private и public.

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

Если задан режим public, то это означает, что члены являются открытыми, и к ним может быть выполнено обращение как из членов-функций объекта, так и из внешней функции; в частности, из главной функции.

В приведенном выше примере в главной функции, где определены объекты, может быть записано выражение

int a; a=obj1.b; ob2.f2(); /* ‘ член-данное b объекта является открытым; член-функция f2() является открытой*/

Следующие выражения являются ошибочными, так как используемые в них члены класса закрыты для доступа

int b; b=ob2.a; ob3[1].f1(); obj4->f1();

 

Дата: 2019-03-05, просмотров: 217.