- •Оглавление
- •Цель работы
- •Основные сведения Основные сведения
- •Варианты задания
- •Контрольные вопросы
- •Цель работы
- •Основные сведения
- •Варианты задания
- •Лабораторная работа3. Виртуальные функции. Выбор типа объектов Цель работы.
- •Основные сведения
- •Контрольные вопросы
- •Варианты задания
- •Контрольные вопросы
- •Лабораторная работа 4. КонтейнерыStl. Обработка исключений Цель работы.
- •Основные сведения
- •Варианты задания
- •Контрольные вопросы
- •Лабораторная работа 5. Классы, объекты, наследование в с# Цель работы
- •Основные сведения
- •Контрольные вопросы
- •Требования к отчету
- •Литература
- •Приложения
- •1.Создание консольного приложения в VisialStudio.Net
Контрольные вопросы
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-й работы.
