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

Вопрос №35 Методы. Виртуальные и динамические методы

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

Если посмотреть на этот код внимательно, то можно понять, что у компилятора нет возможности определить метод какого именно класса нужно вызывать. Поэтому, для определения адреса метода используются специальные таблицы, где хранятся адреса на виртуальные и динамические методы: VMT - таблица виртуальных методов и DMT - таблица динамических методов. Когда компилятор встречает указатель на виртуальный метод, то он ищет его адрес в VMT, где хранятся все адреса виртуальных методов класса унаследованных и перекрытых, поэтому такая таблица занимает много памяти, хотя и способ вызова метода работает сравнительно быстро. Динамические методы вызываются медленнее, но занимают меньше памяти, т.к. в них хранятся адреса динамических методов только данного класса и их индексы. При вызове динамических методов проводится поиск по этой таблице, если метод не найден, то поиск продолжается в DMT предков вплоть до Tobject, где вызывается стандартный обработчик вызова динамических методов. Зачем же нам все это надо? При проектировании иерархии классов предметной области, нужно статическими делать методы, которые не меняют своего поведения в потомках, т.е. при более детальном рассмотрении явления. Динамические и виртуальные методы могут меняться при переходе от общего к частному. Вспомните класс Tfield, который является общим предком для всех классов-полей таблицы. Потомки этого класса реализуют доступ к столбикам таблицы разных типов от целого числа до BLOB массива, однако, Вы можете иметь удобный доступ к этим потомкам через указатель типа Tfield и работать с ними одинаково.

Вопрос №36 Алгоритмический язык С++. Структура программы. Алфавит, идентификаторы, константы, переменные. Области видимости и время жизни переменных

C++ — компилируемый статически типизированный язык программирования общего назначения. Идеально подходит для сис. программироавния или написания приложении, требующих оптимального интерфейса.

Всегда существует главная функция main (в основном её тип- void или int), и эту функцию ни одна другая функция вызывать не может. Так же есть стандартные заголовочные файлы(модули) которые объявляются вначале(<iostream>стандартный заголовочный файл библиотеки ввода/вывода;<math.h> для математических вычислении и тд)

#include<iostream>;

#include<math.h>;

Int main()

int p1=2,p2=3,p3;

{ p3=p1+p2;

printf(“p3=%d”,p3);

Return0;}

Constintn=20-объявление константы;

Int a[20]-объявление массива а из 20 элементов.

Общее программирование – это еще один способ программирования, когда код программи создают независимо от типа данных.

Алфавит:

-Латинские буквы

-Арабские цифры

-спец.символы

Идентификатор – это название (имя), которое пользователь придает объектам, например, переменным, константам и т.д. Может содержать латинские буквы и знак подчеркивания.

В С++ регистр (размер букв) имеет значение.

Зарезервированные слова называют ключевыми словами, используются для написания команд:

Bool,break,case,char,class,const,continue,default,delete,do,double,else,float,for,goto,if,inline,int,long,new,return,short,signed,sizeof,switch,try,unsigned,void,while

Директивы препроцессора

Препроцессор – программа, которая обрабатывает директивы. Директивы препроцессора – команды компилятора соответствующего языка программирования, которые выполняются в начале компиляции программы. Директивы в С++ начинаются с символа #. Директивы:

#include <название файла . расширение> - означает, что к программе нужно присоединить программный код из обозначенного файла.

#define используется в двух случаях – 1) для объявления констант #define x 25; 2) для описания макроса - #define d(a,b,c) (b*c-c*a)

Вопрос №37 Операции и операторы языка С++.

Инструкция или оператор (англ.statement) — наименьшая автономная часть языка программирования; команда. Программа обычно представляет собой последовательность инструкций.

Многие языки (например, Си) различают инструкцию иопределение. Различие в том, что инструкция исполняет код, а определение создаёт идентификатор (то есть можно рассматривать определение как инструкцию присваивания).

Операторы:

For(i=0;i!=n){…}; while(i==0){…};if (условие){…}; switch(выражение){caseconst1: (операция№1);break; caseconst2: (операция№2);break;default (иначе выполняется)}; srand(time(0))-генератор случайных чисел…

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

Логические операции:

!= -не равно, == -равно, &&-и, ||- или, <=(>=) –меньше(больше) или равно, !-отрицание.

Простыеоперации:

(а=а+б)(а+=б); (а++)(a=a+1); (b=sin(a++))(a=a+1;b=sin(a)); (b=sin(++a))( b=sin(a);a=a+1);

Вопрос №38 Функции в С++. Прототипы функций. Встраиваемые функции

Прототипом функции в языке СиилиC++называетсяобъявлениефункции, которое не содержит тело функции, но указывает имя функции,арность,типыаргументов и возвращаемый тип данных. В то время как определение функции описывает, что именно делает функция, прототип функции может восприниматься как описание её интерфейса.

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

Void sqr_it(int i); /* прототип */

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

#include<stdio.h>

/* Это определение будет также служить и

прототипом внутри этой программы. */

void f(int a, int b)

{

printf("%d ", a % b);

}

int main(void)

{

f(10,3); 

return0;

}

Встроенные функции.Встроенные функции используются как термы выражений и подразделяются на две категории: списковые операторы и унарные операторы. Это влияет на их приоритет по отношению к оператору ',' - запятая. Списковые операторы могут иметь множество (список) аргументов, а унарные только один. Таким образом, запятая завершает аргументы унарного оператора и разделяет аргументы спискового. Аргумент унарного оператора воспринимается обычно в скалярном контексте, а спискового как в скалярном, так и списковом, причем скалярные аргументы идут первыми. В дальнейшем списковые аргументы мы будем обозначать словом 'LIST', это значит, что функция имеет список аргументов, разделенных запятой. Аргументы функций можно заключать в круглые скобки и таким образом обозначать, что "это функция" и приоритет не имеет значения, иначе это списковый или унарный оператор с определенным фиксированным приоритетом. Пробел после имени функции и скобкой значения не имеет. Поэтому будьте внимательны!

Пример:

print 1 + 2 + 3; # результат 6

print(1+2)+3; # результат 3

print (1+2)+3; # опять 3

print (1+2+3); # 6

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

Вопрос №39 Массивы данных в С++. Массив как параметр функции

Int fibon[9] = { 0, 1, 1, 2, 3, 5, 8, 13, 21 };

Здесьfibon – это имя массива. Элементы массива имеют тип int, размер (длина) массива равна 9. Значение первого элемента – 0, последнего – 21. Для работы с массивом мы индексируем (нумеруем) его элементы, а доступ к ним осуществляется с помощью операции взятия индекса. Казалось бы, для обращения к первому элементу массива естественно написать:

intfibon[9] = { 0, 1, 1, 2, 3, 5, 8, 13, 21 };

индексация массивов в C++ начинается с 0, поэтому элемент с индексом 1 на самом деле является вторым элементом массива, а индекс первого равен 0.Таким образом, чтобы обратиться к последнему элементу массива, мы должны вычесть единицу из размера массива:

fibon[0]; // первый элемент

fibon[1]; // второй элемент

...

fibon[8]; // последний элемент

fibon[9]; // ... ошибка

Девять элементов массива fibon имеют индексы от 0 до 8.

Передача параметров в дельфи:

scal/Delphi

1:

2:

Type Ta=array of something; 

Var a:Ta; 

Procedure Proc(a:Ta); - внутри процедуры создаётся копия массива, внутри процедуры работа осуществляется только с копией данных Procedure Proc(var a:Ta); - внутри процедуры код работает именно с переменной а и её содержимым Procedure Proc(const a:Ta); - внутри процедуры запрещено изменять данные переменной а Procedure Proc(out a:Ta); - при входе в процедуру массив рассматривается как пустой, но после выполнения процедуры можно получить значения

Вопрос №40 Форматный и потоковый ввод/вывод данных в С++.

Потоковый ввод.

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

cin >> d;

...........

cin >> x1 >> x2 >> x3;

Первая строка соответствует запросу на ввод значения единственной переменной d. Следующая строка программы представляет запрос на ввод трех числовых значений, первое из которых будет присвоено переменной x1, второе значение предназначается для переменной x2, третье значение - для переменной x3. В ответ на запрос программы пользователь должен набрать на клавиатуре затребованные числа, разделяя их, по крайней мере, одним пробелом. Набор строки завершается нажатием клавиши Enter. Количество числовых значений, набираемых пользователем в пределах строки, может оказаться как меньше, так и больше, чем требуется программе. В первом случае продолжение программы задержится до тех пор, пока пользователь не введет дополнительные строки с недостающими значениями. Если пользователь наберет слишком много значений в вводимой строке, то лишние числовые данные сохранятся в буфере ввода и будут переданы программе при выполнении следующего оператора cin.

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

Для обеспечения потокового ввода к программе следует подключить заголовочный файл iostream.h:

#include <iostream.h>

int main()

{ int i;

float f;

double d;

..........

cin >> i >> f >> d;

Форматный ввод.

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

#include <stdio.h>

int main()

{ int i;

float f;

double d;

..........

scanf("%d %f %lf",&i,&f,&d);

Строка вводимых данных поступает со стандартного устройства ввода ( stdin ), которым по умолчанию считается клавиатура. Завершение набора строки ввода - нажатие клавиши Enter.

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

В приведенном примере переменной i (в списке ввода указан ее адрес - &i ), объявленной с помощью спецификатора типа int, соответствует форматный указатель %d. Это означает, что первым числовым значением в строке ввода может быть только целое десятичное число со знаком ( d - от decimal, десятичный). Вещественной переменной f типа float в форматной строке соответствует указатель %f. Это означает, что второе числовое значение в строке ввода должно принадлежать диапазону, предусмотренному для коротких вещественных данных. Для переменной d типа double использован форматный указатель %lf ( l - от long ).

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