Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛаборООП.docx
Скачиваний:
53
Добавлен:
01.06.2015
Размер:
1 Мб
Скачать
☆

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

1. Что представляет из себя контейнер? Покажите контейнер в своей программе.

2. В процессе отладки программы появилась необходимость увеличить массивы, объявленные ниже, на 4 элемента. Можно ли это сделать в первом и во втором случаях, не изменяя константу 10?

int *mas1=new int[10]; // 1

vector <int> mas2(10); //2

3. Если работа с массивами, объявленными выше, заканчивается, то в каком случае обязательно использование оператора delete?

4. Если вы хотя бы приблизительно знаете размер динамического массива в программе, то является ли удачным объявление его как нулевого вектора и неиспользование resize() и почему?

vector <MyClass> my;

5. Что представляет из себя итератор? Что возвращают begin() и end()?

6. Можно ли обрабатывать исключительные ситуации, не используя try, throw, catch, и если да, то зачем нужны последние?

7. Какие сообщения и в какой последовательности будут выведены на монитор при а=1 и a=0 и почему?

class Alpha {

public:

Alpha(){cout<<"Constructor A"<<endl;}

~Alpha(){cout<<"Destructor A"<<endl;}

};

void myfunc() {

try {

Alpha alf;

int a;

cin>>a;

if ( a) throw 1;

cout << “End of function”;

}

catch(int) {cout<<"HandleIn"<<endl;}

cout<<"Continue"<<endl;

}//myfunc

int main()

{ myfunc();

return 0;

}

8. Разберитесь в приведенном фрагменте программы и ответьте, почему в иерархии исключений единственный обработчик запускает нужную функцию ErrProcess.

//Базовыйклассобработкиошибок

class MathError {

virtual void ErrProcess() {};

}; // MathError

//Класс ошибок переполнения

class Overflow:public MathError {

void ErrProcess (){/*…*/};

}; // Overflow

//класс ошибок деления на 0

class ZeroDivide: public MathError {

void ErrProcess() {/*…*/};

}; // ZeroDivide

/* …………*/

try {

/* В точках возникновения ошибок записываются операторы

if(…) throw Overflow vr;

/*…*/

if(…) throw ZeroDivide vr;…

*/

}

// единственный обработчик для всех типов исключений

catch (MathError& vr)

{vr.ErrProcess();

}

Лабораторная работа 5. Классы, объекты, наследование в с# Цель работы

Ознакомление с основами программирования на С#.

Основные сведения

Известной монографией по программированию на С#, включая материал по созданию графических интерфейсов, является [5]. В [6] кратко рассмотрены основные вопросы.

Приведем программу, реализующую класс комплексных чисел аналогичную 1.1; шаблон программы выполнен мастером Visial Studio 2012.

Листинг 5.1

using System

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace ConsoleApplication1

{

class Complex

{ //Поля

public double real;

public double imag;

//Конструкторы

//Пустой

public Complex() { }

//С параметрами

public Complex(double _r, double _im) { real = _r; imag = _im; }

// Методы

//Ввод числа

public void SetComplex()

{

string re, im;

Console.WriteLine("Действительная часть ? ");

re = Console.ReadLine();

this.real=Convert.ToDouble(re);

Console.WriteLine("Мнимая часть ? ");

im = Console.ReadLine();

this.imag = Convert.ToDouble(im);

} // Вывод числа

public void ShowComplex()

{

Console.WriteLine(real + " +i" + imag);

}

//Перегрузка операций

//cложения

public static Complex operator +(Complex t, Complex s)

{

Complex tmp = new Complex();

tmp.real = s.real + t.real;

tmp.imag = s.imag + t.imag;

return tmp;

}

//умножения

public static Complex operator *(Complex t, Complex s)

{

Complex tmp = new Complex();

tmp.real = s.real * t.real - s.imag * t.imag;

tmp.imag = s.imag * t.real + s.real * t.imag;

return tmp;

}

} //Complex

class Program

{

static void Main(string[] args)

{

Complex cm1=new Complex();

Complex cm2=new Complex();

Complex cm3 =new Complex();

Console.WriteLine ("1-е число ");

cm1.SetComplex();

Console.WriteLine ("2-е число ");

cm2.SetComplex();

Console.WriteLine ("Сумма:");

cm3=cm1+cm2;

cm3.ShowComplex();

Console.WriteLine ("Произведение:");

cm3=cm1*cm2;

cm3.ShowComplex();

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

Complex cm4=new Complex (34.7, 21.8);

Console.WriteLine ("Массив из 2-х чисел");

Complex[] cm5=new Complex[2];

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

{

cm5[i] = new Complex();

cm5[i].SetComplex();

}

}

}

}

Не касаясь принципиальных различий между выполнением программ на стандартном С++ и CLR Visual Studio .Net, посмотрим на различия между листингами.

Определение класса Complexпрактически не отличается от определения такого же класса на языке С++ - модификаторpublicне имеет заключительного символа ‘:’ ; после определения класса нет символа ‘;’ . Вместе с тем, программа существенно отличается отC++.

Пространство имен Systemиспользуется вместо подключаемых файлов. Отличается ввод и вывод информации на консоль. При создании объекта класса в С++ операторnewвозвращает адрес созданного объекта указателю, а в С# указатель, как правило, не употребляется.

Существенное различие существует в концепциях типов в С# и в С++. Прежде всего, типы данных в С# подразделяются на типы – значения (value types) и ссылочные типы(reference types). Величины ссылочного типа хранятся в динамической памяти, а переменные типов-значений в памяти, управляемой компилятором. В частности, объекты классов относятся к ссылочным типам и создаются только в динамической памяти с помощью оператора new. Освобождение памяти от объектов ссылочного типа производится автоматически.

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

Все классы системные и пользовательские являются наследниками класса System.Object(object), однако упоминание его в программе как базового необязательно.

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

Механизм наследования в С# работает так же, как и в С++. Виртуальные функции в производных классах сопровождаются словом override.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace Гараж

{

class Vehicle{

protected int price;//цена

protected int year; //год выпуска

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

public virtual void setVehicle(){}

public virtual void getVehicle(){}

}

class Lorry: Vehicle{

int capacity;

override public void setVehicle(){

Console.WriteLine("setLorry");

price=40000; year=5;capacity=600;

}

override public void getVehicle(){

Console.WriteLine("Lorry" +price +" "+year+" "+capacity);}

}

class Car: Vehicle{

int speed;

//То же для авто

override public void setVehicle(){

Console.WriteLine("setCar");

price=10000; year=2;speed=180;}

override public void getVehicle(){

Console.WriteLine("Car "+price+" "+year+" "+speed);}

}

class Garage

{

public static int n=2;

//Массивы ссылок на производные классы

public Lorry[] lor=new Lorry[n];

public Car[] car= new Car[n];

//Ссылка на базовый класс

public Vehicle vec=new Vehicle();

public Garage()

{

//Инициализация ссылок на производные классы

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

{ car[i]=new Car();

lor[i]= new Lorry();

}

}

// Ввод и вывод данных для машин с вызовом виртуальных функций

public void setVehicle(){

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

{ vec=car[i]; //Автомобили

vec.setVehicle();

vec=lor[i]; //Грузовики

vec.setVehicle();

}

}

public void getVehicle(){

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

{ vec=car[i];

vec.getVehicle();

vec=lor[i];

vec.getVehicle();

}

}

}

class Program

{

static void Main(string[] args)

{ Garage g= new Garage();

g.setVehicle();

g.getVehicle();

}

}

}// namespace

В качестве задания выбирается соответствующий вариант 2-й работы.