Конструирование программ
Контрольная работа - Компьютеры, программирование
Другие контрольные работы по предмету Компьютеры, программирование
влению Ancestor static procedure.. Ведь мы объявили MyObject2: TAncestor, поэтому и была вызвана процедураStaticProcedure; класса TAncestor.
А вот вызов MyObject2. VirtualProcedure; привел к вызову VirtualProcedure; реализованной в потомке(TDescendant). Это произошло потому, что MyObject2 был создан не какTAncestor, а как TDescendant: MyObject2:= TDescendant. Create; И виртуальный метод VirtualProcdure был перекрыт.
В Delphi полиморфизм реализован с помощью так называемой виртуальной таблицы методов (или VMT).
Достаточно часто виртуальные методы забывают перекрыть с помощью ключевого слова override. Это приводит к закрытию метода. В этом случае замещения методов в VMT не произойдет и требуемая функциональность не будет получена.
Эта ошибка отслеживается компилятором, который выдаёт соответствующее предупреждение.
Вызов метода предка из перекрытого метода
Бывает необходимо вызвать метод предка в перекрытом методе.
Объявим два класса. Предка(Ancestor):
TAncestor = class
private
protected
public
{Виртуальная процедура.}
procedure VirtualProcedure; virtual;
end;
и его потомка (Descendant):
TDescendant = class(TAncestor)
private
protected
public
{Перекрытие виртуальной процедуры.}
procedure VirtualProcedure; override;
end;
Обращение к методу предка реализуется с помощью ключевого слова inherited
procedure TDescendant. VirtualProcedure;
begin
inherited;
end;
Стоит помнить, что в Delphi деструктор должен быть обязательно перекрытым - override - и содержать вызов деструктора предка
TDescendant = class(TAncestor)
private
protected
public
destructor Destroy; override;
end;
destructor TDescendant. Destroy;
begin
inherited;
end;
В языке C++ не нужно вызывать конструктор и деструктор предка, деструктор должен быть виртуальным. Деструкторы предков вызовутся автоматически. Чтобы вызвать метод предка, нужно явно вызвать метод:
class Ancestor
{:
virtual void function1 () {printf (Ancestor:function1);}
};
Descendant: public Ancestor
{:void function1 () {(Descendant:function1);:function1 (); // здесь будет напечатано Ancestor:function1
}
};
Для вызова конструктора предка нужно указать конструктор:
class Descendant: public Ancestor
{:
Descendant(): Ancestor();
};
Задание 2
Значение аргумента х изменяется от а до b с шагом h. Для каждого x найдите значение функции Y(x) суммы S(x) и |Y(x) - S(x)| и выведите в виде таблицы. Значения a, b, h введите с клавиатуры произвольно. Вычисление Y(x) и S(x) реализуйте в виде функций.
В основной программе организуйте ввод исходных данных, обращение к функциям и вывод результатов.
Текст программы
#include
#include
#include
#include
#pragma hdrstop
#include Unit2.h
#pragma package (smart_init)double (*TFun) (double);funY(double);funS(double);funDYS(double);Out_Tabl (TFun, double, double, double);main()
{a, b, h;(Input a, b, h);(%lf % lf % lf, &a, &b, &h);(\n\t Function - Y(x));_Tabl (funY, a, b, h);(\n\t Function - S(x));_Tabl (funS, a, b, h);(\n\t Function - |S(x) - Y(x)|);_Tabl (funDYS, a, b, h);(\n Press any key…);();
}funY (double x)
{cos(x);
}
funS (double x)
{s=1, a=1;(int k=1; k<=20; k++)
{=-a*x*x/((2*k-1)*(2*k));+=a;
}s;
}
funDYS (double x)
{fabs (funS(x) - funY(x));
}Out_Tabl (TFun f, double xn, double xk, double h)
{(double x=xn; x<=xk; x+=h)( x =%5.2lf, y =%8.4lf\n, x, f(x));
}
Результат выполнения программы
Задание 3
Разработайте программу обработки массивов. Входные данные введите с клавиатуры. Результаты работы программы отобразите на экране.
Дана целочисленная квадратная матрица порядка N. Найдите номера строк, элементы в каждой из которых одинаковы.
Текст программы
#include
#pragma hdrstop
#include Unit3.h
#pragma package (smart_init)
#include
#include
#include main()
{a[20] [20];i, j, n=0, k;(nn;
}a[i] [j];<<\nRaws with equals elements:\n;(i=0; i<n; i++) {=0;(j=1; j<n; j++)(a[i] [j]==a[i] [0]) k++;(k==n-1) cout<<i<<\n;
}<<\nPress any key…;(! kbhit());
}
Результат выполнения программы
Задание 4
виртуальный класс программа массив
Разработайте программу работы со строками. Организуйте ввод исходных данных с клавиатуры. Используйте функции из библиотеки обработки строк string.h. Результаты работы программы отобразите на экране.
Дана строка произвольной длины. Группы символов, разделенные пробелами (од-ним или несколькими), будем называть словами. Определите в соответствии с вариантом:
Вариант 8
Количество слов в строке, а также самое короткое слово (если несколько слов имеют минимальную длину, то возьмите первое из них).
Текст программы
#include
#include
#include
#include main()
{();string[100];*word, minword[50];k=0;<<\n;<< Input string:;.getline (string, 100);<<\n;<< Words:\n;=strtok (string, );(word!= NULL)
{++;<<word<<\n;(k==1) strcpy (minword, word);(strlen(word)<strlen(minword)) strcpy (minword, word);= strtok (NULL, );
}<<\nNumber of words is equal to <<k;<<\nShortest word in string: <<minword<<\n;
getch();
}
Результат выполнения программы
Задание 5
Разработайте программу обработки структур. В программе используйте структуру, содержащую поля с информацией об учащихся:
фамилия и инициалы;
дата рождения;
номер группы;
оценки за семестр по предметам: физика, математика, информатика, этика, психология.
Организуйте ввод исходных данных, средний балл каждого учащегося рассчитайте по введенным оценкам. На