Реферат по предмету "Информатика, программирование"


Актуальные вопросы в работе с С++

Содержание
 
Введение
1.Написать программу
2. Что такое константа?Приведите примеры типизированных и не типизированных констант
3. Приведите полныйсписок базовых целочисленных типов и занимаемый ими размер памяти в байтах
4. Что такое указатель?Как по указателю можно занести значение? Приведите примеры
5. Что такое функция?Можно ли возвращать значения из функции через переданные ей аргументы? Если можно,то как? Приведите примеры
6. Что такое класс?В чем отличие класса от структуры? Приведите примеры структуры и класса
7. Что такое виртуальнаяфункция? Приведите пример. В каких случаях используются виртуальные функции?
Литература
 

 
Введение
Язык программированиярешает две взаимосвязанные задачи: позволяет программисту записать подлежащие выполнениюдействия и формирует понятия, которыми программист оперирует, размышляя о своейзадаче. Первой цели идеально отвечает язык, который очень «близок машине».Тогда со всеми ее основными «сущностями» можно просто и эффективно работатьна этом языке, причем делая это очевидным для программиста способом. Именно этоимели в виду создатели С. Второй цели идеально отвечает язык, который настолько«близок к поставленной задаче», что на нем непосредственно и точно выражаютсяпонятия, используемые в решении задачи. Именно это имелось в виду, когда первоначальноопределялись средства, добавляемые к С.
Связь между языком,на котором мы думаем и программируем, а также между задачами и их решениями, которыеможно представить в своем воображении, довольно близка. По этой причине ограничиватьвозможности языка только поиском ошибок программиста — в лучшем случае опасно. Каки в случае естественных языков, очень полезно обладать, по крайней мере, двуязычием.Язык предоставляет программисту некоторые понятия в виде языковых инструментов;если они не подходят для задачи, их просто игнорируют. Например, если существенноограничить понятие указателя, то программист будет вынужден для создания структур,указателей и т.п. использовать вектора и операции с целыми. Хороший проект программыи отсутствие в ней ошибок нельзя гарантировать только наличием или отсутствием определенныхвозможностей в языке.
Действительно,понятие класса в С++ проявило себя как мощное концептуальное средство.
Название С++ (сиплюс плюс), было придумано Риком Маскитти летом 1983 г. Это название отражает эволюционныйхарактер изменений языка С.
Обозначение ++относится к операции наращивания С. Чуть более короткое имя С+ является синтаксическойошибкой. Кроме того, оно уже было использовано как название совсем другого языка.
Выбор С в качествебазового языка для С++ объясняется следующими его достоинствами:
(1) универсальность,краткость и относительно низкий уровень;
(2) адекватностьбольшинству задач системного программирования;
(3) он идет влюбой системе и на любой машине;
(4) полностьюподходит для программной среды UNIX.
Язык программированияС++ задумывался как язык, который будет:
— лучше языкаС;
— поддерживатьабстракцию данных;
— поддерживатьобъектно-ориентированное программирование.
Цель работы –ознакомится с основными терминами С++ и их значениями, научиться составлять программы.

 
1. Написатьпрограмму
Которая:
— получает из стандартного потока ввода строку, содержащую число прописью(напр. « двадцать три»);
— подсчитывает и выводит на экран количество символов в строке и ихсредний код;
— переводит введенную строку в число (напр. соответственно 23) и выводитна экран.
// sp_kr.cpp: контрольная работа
//
#include «stdafx.h»
#include
#include
using namespace std;
int main( void )
{
printf(«rabota s chislami \n\n»);
// ввод и инициализация
cout
char stroka[80] = «сто двадцать три»;
//gets(stroka); // исходная строка
char razd[] = " ,\t\n"; // множество разделителей
char *slovo;
// количество символов в строке и их средний код
int kol_c= 0;
int kod_c= 0;
for (int j = 0; j
{
kod_c += putchar(stroka[j]);//код символа
kol_c ++;
}
cout
cout
// выдедение слова
slovo = strtok(stroka, razd);
int chislo= 0;
while(slovo != NULL)
{
// обработка слов
if (stricmp(slovo, «один»)==0) { chislo += 1;}
if (stricmp(slovo, «два»)==0) {chislo += 2;}
if (stricmp(slovo, «три»)==0) {chislo += 3;}
if (stricmp(slovo, «четыре»)==0) {chislo += 4;}
if (stricmp(slovo, «пять»)==0) {chislo += 5;}
if (stricmp(slovo, «шесть»)==0) {chislo += 6;}
if (stricmp(slovo, «семь»)==0) {chislo += 7;}
if (stricmp(slovo, «восемь»)==0) {chislo += 8;}
if (stricmp(slovo, «девять»)==0) {chislo += 9;}
if (stricmp(slovo, «десять»)==0) {chislo += 10;}
if (stricmp(slovo, «одиннадцать»)==0) {chislo += 11;}
if (stricmp(slovo, «двенадцать»)==0) {chislo += 12;}
if (stricmp(slovo, «тринадцать»)==0) {chislo += 13;}
if (stricmp(slovo, «четырнадцать»)==0) {chislo += 14;}
if (stricmp(slovo, «пятнадцать»)==0) {chislo += 15;}
if (stricmp(slovo, «шестнадцать»)==0) {chislo += 16;}
if (stricmp(slovo, «семнадцать»)==0) {chislo += 17;}
if (stricmp(slovo, «восемнадцать»)==0) {chislo += 18;}
if (stricmp(slovo, «девятнадцать»)==0) {chislo += 19;}
if (stricmp(slovo, «двадцать»)==0) {chislo += 20;}
if (stricmp(slovo, «тридцать»)==0) {chislo += 30;}
if (stricmp(slovo, «сорок»)==0) {chislo += 40;}
if (stricmp(slovo, «пятьдесят»)==0) {chislo += 50;}
if (stricmp(slovo, «шестьдесят»)==0) {chislo += 60;}
if (stricmp(slovo, «семьдесят»)==0) {chislo += 70;}
if (stricmp(slovo, «восемьдесят»)==0) {chislo += 80;}
if (stricmp(slovo, «девяносто»)==0) {chislo += 90;}
if (stricmp(slovo, «сто»)==0) {chislo += 100;}
if (stricmp(slovo, «двести»)==0) {chislo += 200;}
if (stricmp(slovo, «триста»)==0) {chislo += 300;}
if (stricmp(slovo, «четыреста»)==0) {chislo += 400;}
if (stricmp(slovo, «пятьсот»)==0) {chislo += 500;}
if (stricmp(slovo, «шестьсот»)==0) {chislo += 600;}
if (stricmp(slovo, «семьсот»)==0) {chislo += 700;}
if (stricmp(slovo, «восемьсот»)==0) {chislo += 800;}
if (stricmp(slovo, «девятьсот»)==0) {chislo += 900;}
//printf(" %s\n", slovo);
// выделение очередного слова
slovo = strtok(NULL, razd);
}
cout
gets(stroka);
return 0;
}

/>
/>
 
2. Что такое константа? Приведите примеры типизированных и не типизированныхконстант
C++ дает возможность записи значений основных типов: символьных констант,целых констант и констант с плавающей точкой. Кроме того, ноль (0) может использоватьсякак константа любого указательного типа, и символьные строки являются константамитипа char. Можно также задавать символические константы. Символическая константа- это имя, значение которого не может быть изменено в его области видимости. В C++имеется три вида символических констант: (1) любому значению любого типа можно датьимя и использовать его как константу, добавив к его описанию ключевое слово const;(2) множество целых констант может быть определено как перечисление; и (3) любоеимя вектора или функции является константой.
Типизированные константы можно сравнить с инициализированными переменными- переменными, значения которых определяются на входе в их блок. В отличие от нетипизированныхконстант в описании типизированной константы указывается как тип, так и значениеконстанты.
описание типизированной константы
L->¦идентификатор+->¦: +->¦тип+->¦ = +->¦типизированная+-->константа ¦
/>

Таблица 1 – Константа
Типизированные константы можно использовать точно так же, как переменныетого же самого типа, и они указываются в левой части оператора присваивания. Отметим,что типизированные константы инициализируются только один раз — в начале выполненияпрограммы. Таким образом, при каждом новом входе в процедуру или функцию локальноописанные типизированные константы заново не инициализируются.
Кроме обычных выражений-констант значение типизированной константыможет задаваться с помощью адресного выражения-константы. Адресное выражение-константа- это выражение, предусматривающее получение адреса, смещения или сегмента глобальнойпеременной, типизированной константы, процедуры или функции. Адресные выражения-константыне могут ссылаться на локальные переменные (расположенные в стеке) или динамическиепеременные (размещенные в динамически распределяемой области памяти), посколькуих адреса нельзя вычислить на этапе компиляции.
Константы простого типа. Описание типизированной константы с простымтипом означает указание значения константы:
Const
Maximum: integer = 9999;
Factor: real = -0.1;
Breakchar: char = #3;
Значение типизированной константы можно задать с помощью адресноговыражение-константы, то есть выражения, в котором используются адрес, смещение илисегмент глобальной переменной, типизированной константы, процедуры или функции.Например:
var
Buffer: array[0..1023] of Byte;
const
BufferOfs: Word = Ofs(Buffer);
BufferSeg: Word = Seg(Buffer);

Поскольку типизированная константа фактически представляет собой переменнуюсо значением константы, она не является взаимозаменяемой для обычных констант. Например,она не может использоваться в описании других констант или типов.
const
Min: integer = 0;
Max: integer = 99;
type
Vector = array[Min..Max] of integer;
Описание Vector является недопустимым, поскольку Min и Max являютсятипизированными константами.
Константы строкового типа
Описание типизированной константы строкового типа содержит максимальнуюдлину строки и ее начальное значение:
const
Heading: string[7] = 'Section';
NewLine: string[2] = #13#10;
TrueStr: string[5] = 'Yes';
FalseStr: string[5] = 'No';
Константы структурного типа
Описание константы структурного типа определяет значение каждого компонентаструктуры. Поддерживает описания констант типа массив, запись, множество и указатель.Константы файлового типа и константы типа массив или запись, содержащие компонентыфайлового типа, не допускаются.

Константы типа массив. Описание константы типа массив содержит значенияэлементов, заключенные в скобки и разделенные запятыми.
Приведем пример константы типа массив:
type
Status = (Active,Passive,Waiting);
StatusMap = array[Status] of string[7];
const
StatStr: StatusMap = ('Active','Passive','Waiting');
В этом примере определяется константа-массив StarStr, которая можетиспользоваться для преобразования значений типа Status в соответствующие им строковыепредставления. Элементами массива StarStrявляются:
StatStr[Active] = 'Active'
StatStr[Passive] = 'Passive'
StatStr[Waiting] = 'Waiting'
Тип элемента константы-массива может быть любым, кроме файлового типа.Упакованные константы строкового типа (символьные массивы) могут быть определеныи как одиночные символы, и как строки. Определение:
const
Digits:array[0..9] of
char=('0','1','2','3','4','5','6','7','8','9');
можно представить в более удобном виде:
const
Digits: array[0..9] of char = '0123456789';

При разрешении расширенного синтаксиса (с помощью директивы
компилятора {$X+}) массивы с нулевой базой могут инициализироватьсястрокой, которая короче, чем описанная длина массива, например:
const
FileName = array[0..79] of Char = 'TEXT.PAS';
В таких случаях оставшиеся символы устанавливаются в NULL (#0), и массивсодержит строку с завершающим нулем. При описании константы типа «многомерныймассив» константы каждой размерности заключаются в отдельные скобки и разделяютсязапятыми. Расположенные в середине константы соответствуют самым правым размерностям.Описание:
type
Cube = array[0..1,0..1,0..1] of integer;
const
Maze: Cube = (((0,1),(2,3)),((4,5),(6,7)));
задает следующие начальные значения массива Maze:
Maze[0, 0, 0] = 0
Maze[0, 0, 1] = 1
Maze[0, 1, 0] = 2
Maze[0, 1, 1] = 3
Maze[1, 0, 0] = 4
Maze[1, 0, 1] = 5
Maze[1, 1, 0] = 6
Maze[1, 1, 1] = 7

Константы типа запись
Описание константы типа запись содержит идентификатор и значение каждогополя, заключенные в скобки и разделенные точками с запятой.
Приведем несколько примеров констант-записей:
type
Point = record
x,y: real;
end;
Vector = array[0..1] of Point;
Month =
(Jan,Feb,Mar,Apr,May,Jun,Jly,Aug,Sep,Oct,Nov,Dec);
Date = record
d: 1..31; m: Month; y: 1900..1999;
end;
const
Origin: Point = (x: 0.0; y: 0.0);
Line: Vector = ((x: -3.1; y: 1.5),(x: 5.8; y: 3.0));
SomeDay: Date = (d: 2; m: Dec; y: 1960);
Поля должны указываться в том же порядке, как они следуют в описаниитипа запись. Если запись содержит поля файлового типа, то для этого типа записьнельзя описать константу. Если запись содержит вариант, то можно указывать толькополя выбранного варианта. Если вариант содержит поле признака, то его значение должнобыть определено.
Константы объектного типа
При описании константы объектного типа используется тот же синтаксис,что и при описании константы типа запись. Значения для элементов (компонентов) методазадаваться не могут. С учетом приводимых ранее описаний объектных типов, приведемнекоторые примеры констант объектного типа:
const
ZeroPoint: Point = (X: 0; Y: 0)
ScreenRect: Rect = (A: (X: 0; Y: 0); B: (X: 80; Y: 25);
CountField: NumField = (X: 5; Y: 20; Len: 4; Name: nil;
Value: 0; Min: -999; Max: 999);
Константы объектного типа, которые содержат виртуальные методы, нетребуется инициализировать с помощью вызова конструктора. Эта инициализация автоматическивыполняется компилятором.
Константы множественного типа
Описание константы множественного типа может содержать несколько элементов,заключенных в квадратные скобки и разделенных запятыми. Каждый элемент такой константыпредставляет собой константу или отрезок типа, состоящий из двух констант, разделенныхдвумя точками.
Приведем несколько примеров констант-множеств:
type
Digits = set of 0..9;
Letters = set of 'A'..'Z';
const
EvenDigits: Digits = [0,2,4,6,8];
Vowels: Letters = ['A','E','I','O','U','Y'];
HexDigits: set of '0'..'z' =
['0'..'9','A'..'F','a'..'f'];
Константы ссылочного типа
Описание константы ссылочного типа может содержать только значениеnil (пусто). Приведем несколько примеров
type
TDirection = (Left, Right, Up, Down);
TStringPtr = ^String;
TNodePtr = ^Node;
TNode = record
Next: NodePtr;
Symbol: StringPtr;
Value: Direction;
end;
const
S1: string[4] = 'DOWN';
S2: string[2] = 'UP';
S3: string[5] = 'RIGHT';
S4: string[4] = 'LEFT';
N1: Node = (Next: nil; Symbol: @S1; Value: Down);
N2: Node = (Next: @N1; Symbol: @S2; Value: Up);
N3: Node = (Next: @N2; Symbol: @S3; Value: Right);
N2: Node = (Next: @N3; Symbol: @S4; Value: Left);
DirectionTable: NodePtr = @N4;
Если разрешен расширенный синтаксис (указана директива компилятора{$X+}), типизированная константа типа PChar может инициализироваться строковой константой,например:
const
Message: PChar = 'Программа завершена';
Prompt: PChar = 'Введите значения: ';
Digits: array[0..9] of PChar = (
'Ноль', 'Один', 'Два', 'Три', 'Четыре',
'Пять', 'Шесть', 'Семь', 'Восемь', 'Девять');
Результатом будет то, что указатель теперь указывает на область памяти,содержащую копию строкового литерала с завершающим нулем.
Константы процедурного типа
Константы процедурного типа должны определять идентификатор процедурыили функции, совместимый по присваиванию с типом константы.
Приведем следующий пример:
type
ErrorProc = procedure(ErrorCode: Integer);
procedure DefaultError(ErrorCode: Integer); far;
begin
WriteLn('Error ', ErrorCode, '.');
end;
const
ErrorHandler: ErrorProc = DefaultError;
3. Приведите полный список базовых целочисленных типов и занимаемыйими размер памяти в байтах
Целочисленные типы — обозначают множества целых чисел в различных диапазонах.Имеется пять целочисленных типов, различающихся диапазоном допустимых значений иразмером занимаемой оперативной памяти. Целочисленные типы обозначаются идентификаторами:Byte, ShortInt, Word, Integer, LongInt; их характеристики приведены в следующейтаблице.

Таблица 1 — Целочисленные типыТип Диапазон Размер в байтах
Byte
ShortInt
Word
Integer
LongInt
0… 255
-128… 127
0… 65535
-32768… 32767
-2147483648… 2147483647
1
1
2
2
4
Значения целых типов записываются в программе привычным способом:
123 4 -3 +345 -699
Наличие десятичной точки в записи целого числа недопустимо. Будет ошибкойзаписать целое число следующим образом:
123.0
Кроме привычной десятичной формы записи допускается запись целых чиселв шестнадцатиричном формате, используя префикс $, например:
$01AF $FF $1A $F0A1B
Регистр букв A,B, ..., F значения не имеет.
Допустимые операции:
— присваивание;
— все арифметические: +, — ,*, /, div, mod (при обычном делении [/]результат вещественный!);
— сравнение , >=, , =.
 
4. Что такое указатель? Как по указателю можно занести значение? Приведитепримеры
Специальными объектами в программах на языках Си++ являются указатели.
Различают указатели-переменные (именно их мы будем называть указателями)и указатели-константы. Значениями указателей служат адреса участков памяти, выделенныхдля объектов конкретных типов: именно поэтому в определении и описании указателявсегда присутствует обозначение соответствующего ему типа. Эта информация позволяетв последующем с помощью указателя получить доступ ко всему сохраняемому объектув целом.
Указатели делятся на две категории — указатели на объекты и указателина функции. Выделение этих двух категорий связано с отличиями в свойствах и правилахиспользования. Например, указатели ФУНКЦИЙ не допускают применения к ним арифметическихопераций, а указатели объектов разрешено использовать в некоторых арифметическихвыражениях. Начнем с указателей объектов.
В простейшем случае определение и описание указателя-переменной нанекоторый объект имеют вид:
tуре *имя_ указателя;
где tуре _ обозначение типа; имя_указателя — это идентификатор;
* — унитарная операция раскрытия ссылки (операция разыменования; операцияобращения по адресу; операция доступа по адресу), операндом которой должен бытьуказатель (именно в соответствии с этим правилом вслед за ней следует имя_указателя).
Признаком указателя при лексическом разборе определения или описанияслужит символ '*', помещенный перед именем. Таким образом, при необходимости определитьнесколько указателей на объекты одного и того же типа этот символ '*' помещают передкаждым именем. Например, определение int *i1р, *i2р, *iЗр, i; вводит три указателя наобъекты целого типа i1р, i2р, i3р и одну переменную i целого типа. Переменной iбудет отведено в памяти 2 байта (ТС++ или ВС++), а указатели i1р, i2р, i3р разместятсяв участках памяти, размер которых также зависит от реализации, но которые толькоиногда имеют длину 2 байта.
В совокупности имя типа и символ '*' перед именем воспринимаются какобозначение особого типа данных «указатель на объект данного типа».
При определении указателя в большинстве случаев целесообразно выполнитьего инициализацию. Формат определения станет таким:
tуре *имя_ указателя инициализатор;
Как упоминалось, инициализатор имеет две формы записи, поэтому допустимыследующие две формы определения указателей:
tyре *имя_указателя = инициализирующее_выражение;
tурe *имя_указателя (инициализирующее_выражение);
В качестве инициализирующего_выражения должно использоваться константноевыражение, частными случаями которого являются:
— явно заданный адрес участка памяти;
— указатель, уже имеющий значение;
— выражение, позволяющее получить адрес объекта с помощью операции'&'.
Если значение константного выражения равно нулю, то это нулевое значениепреобразуется к пустому (иначе нулевому) указателю. Синтаксис языка «гарантирует,что этот указатель отличен от указателя на любой объект». Кроме того, внутреннее(битовое) представление пустого указателя может отличаться от битового представленияцелого значения 0. В компиляторах ТС++ и ВС++ условное нулевое значение адреса,соответствующее значению пустого указателя, имеет специальное обозначение NULL.Примеры определений указателей:
сhаr cc = 'd'; // Символьная переменная (типа сhаr)
сhаr *рс = &cс; // Инициализированный указатель на объект
// типа сhаr
сhаr *рtr(NULL); // Нулевой указатель на объект типа сhаr
сhаr *р; // Неинициализированный указатель на
// объект типа сhаr

5. Что такое функция? Можно ли возвращать значения из функции черезпереданные ей аргументы? Если можно, то как? Приведите примеры
Для чего нужны функции? Чтобы ответить на этот вопрос, нужно понять,что вообще представляют собой функции. В программировании, как и в математике, функцияесть отображение множества ее аргументов на множество ее значений. То есть функциядля каждого набора значений аргумента возвращает какие-то значения, являющиеся результатомее работы. Зачем нужны функции, попытаемся объяснить на примере. Классический примерфункции в программировании – это функция, вычисляющая значение факториала числа.То есть мы задаем ей число, а она возвращает нам его факториал. При этом не нужнодля каждого числа, факториал которого мы хотим получить, повторять один и тот жекод – достаточно просто вызвать функцию с аргументом, равным этому числу.
Функция вычисления факториала натурального числа

function fact($n){
if ($n==0) return 1;
else return $fact = $n * fact($n-1);
}
echo fact(3);
// можно было бы написать echo (3*2);
// но если число большое,
echo fact(50);
// то удобнее пользоваться функцией,
// чем писать echo (50*49*48*...*3*2);
?>

Таким образом, когда мы осуществляем действия, в которых прослеживаетсязависимость от каких-то данных, и при этом, возможно, нам понадобится выполнятьтакие же действия, но с другими исходными данными, удобно использовать механизмфункций – оформить блок действий в виде тела функции, а меняющиеся данные – в качествеее параметров.
Посмотрим, как в общем виде выглядит задание (объявление) функции.Функция может быть определена с помощью следующего синтаксиса:
function Имя_функции (параметр1, параметр2,
… параметрN){
Блок_действий
return «значение возвращаемое функцией»;
}
Если прямо так написать в php-программе, то работать ничего не будет.Во-первых, Имя_функции и имена параметров функции (параметр1, параметр2 и т.д.)должны соответствовать правилам наименования в PHP (и русских символов в них лучшене использовать). Имена функций нечувствительны к регистру. Во-вторых, параметрыфункции – это переменные языка, поэтому перед названием каждого из них должен стоятьзнак $. Никаких троеточий ставить в списке параметров нельзя. В-третьих, вместослов блок_действий в теле функции должен находиться любой правильный PHP-код (необязательно зависящий от параметров). И наконец, после ключевого слова return должноидти корректное php-выражение (что-либо, что имеет значение). Кроме того, у функцииможет и не быть параметров, как и возвращаемого значения. Пример правильного объявленияфункции – функция вычисления факториала, приведенная выше.
Как происходит вызов функции? Указывается имя функции и в круглых скобкахсписок значений ее параметров, если таковые имеются:


Имя_функции («значение_для_параметра1»,
«значение_для_параметра2»,...);
// пример вызова функции – вызов функции
// вычисления факториала приведен выше,
// там для вычисления факториала числа 3
// мы писали: fact(3);
// где fact – имя вызываемой функции,
// а 3 – значение ее параметра с именем $n
?>
Когда можно вызывать функцию? Казалось бы, странный вопрос. Функциюможно вызвать после ее определения, т.е. в любой строке программы ниже блока functionf_name(){...}. В PHP3 это было действительно так. Но уже в PHP4 такого требованиянет. Все дело в том, как интерпретатор обрабатывает получаемый код. Единственноеисключение составляют функции, определяемые условно (внутри условных операторовили других функций). Когда функция определяется таким образом, ее определение должнопредшествовать ее вызову.

$make = true;
/* здесь нельзя вызвать Make_event();
потому что она еще не существует, но можно
вызвать Save_info() */
Save_info(«Вася»,«Иванов»,
«Я выбрал курс по PHP»);
if ($make){
// определение функции Make_event()
function Make_event(){
echo "Хочу изучать Python";
}
}
// теперь можно вызывать Make_event()
Make_event();
// определение функции Save_info
function Save_info($first, $last, $message){
echo "$message";
echo «Имя: ». $first. " ". $last. "";
}
Save_info(«Федя»,«Федоров»,
«А я выбрал Lisp»);
// Save_info можно вызывать и здесь
?>
Пример 5.1. Определение функции внутри условного оператора
Если функция однажды определена в программе, то переопределить илиудалить ее позже нельзя. Несмотря на то, что имена функций нечувствительны к регистру,лучше вызывать функцию по тому же имени, каким она была задана в определении.

/* нельзя сохранить данные, т.е. вызвать
функцию DataSave() до того, как выполнена
проверка их правильности, т.е. вызвана
функция DataCheck() */
DataCheck();
DataSave();
function DataCheck(){
// проверка правильности данных
function DataSave(){
// сохраняем данные
}
}
?>
Пример 5.2. Определение функции внутри функции
Рассмотрим подробнее аргументы функций, их назначение и использование.
Аргументы функций
У каждой функции может быть, как мы уже говорили, список аргументов.С помощью этих аргументов в функцию передается различная информация (например, значениечисла, факториал которого надо подсчитать). Каждый аргумент представляет собой переменнуюили константу.
С помощью аргументов данные в функцию можно передавать тремя различнымиспособами. Это передача аргументов по значению (используется по умолчанию), по ссылкеи задание значения аргументов по умолчанию. Рассмотрим эти способы подробнее.
Когда аргумент передается в функцию по значению, изменение значенияаргумента внутри функции не влияет на его значение вне функции. Чтобы позволитьфункции изменять ее аргументы, их нужно передавать по ссылке. Для этого в определениифункции перед именем аргумента следует написать знак амперсанд «&».

// напишем функцию, которая бы добавляла
// кстроке слово checked
function add_label(&$data_str){
$data_str .= «checked»;
}
$str = "
// пусть имеется такая строка
echo $str .">";
// выведет элемент формы –
// не отмеченную радио кнопку
add_label($str);
// вызовем функцию
echo $str .">";
// это выведет уже отмеченную
// радио кнопку
?>
Пример 5.3. Передача аргументов по ссылке
В функции можно определять значения аргументов, используемые по умолчанию.Само значение по умолчанию должно быть константным выражением, а не переменной ине представителем класса или вызовом другой функции.
У нас есть функция, создающая информационное сообщение, подпись к которомуменяется в зависимости от значения переданного ей параметра. Если значение параметране задано, то используется подпись «Оргкомитет».

function Message($sign=«Оргкомитет»){
// здесь параметр sign имеет по умолчанию
// значение «Оргкомитет»
echo «Следующее собрание состоится завтра.»;
echo "$sign .";
}
Message();
// вызываем функцию без параметра.
// В этом случае подпись – это Оргкомитет
Message(«С уважением, Вася»);
// В этом случае подпись
// будет «С уважением, Вася»
?>
Пример 5.4. Значения аргументов по умолчанию
Результатом работы этого скрипта будет:
Следующее собрание состоится завтра.
Оргкомитет.
Следующее собрание состоится завтра.
С уважением, Вася.
Если у функции несколько параметров, то те аргументы, для которых задаютсязначения по умолчанию, должны быть записаны после всех остальных аргументов в определениифункции. В противном случае появится ошибка, если эти аргументы будут опущены привызове функции.
Например, мы хотим внести описание статьи в каталог. Пользователь долженввести такие характеристики статьи, как ее название, автор и краткое описание. Еслипользователь не вводит имя автора статьи, считаем, что это Иванов Иван.

function Add_article($title, $description,
$author=«Иванов Иван»){
echo «Заносим в каталог статью: $title,»;
echo «автор $author»;
echo "Краткое описание: ";
echo "$description ";
}
Add_article(«Информатика и мы»,
«Это статья про информатику ...»,
«Петров Петр»);
Add_article(«Кто такие хакеры»,
«Это статья про хакеров ...»);
?>
В результате работы скрипта получим следующее
Заносим в каталог статью: Информатика и мы,
автор Петров Петр.
Краткое описание:
Это статья про информатику...
Заносим в каталог статью: Кто такие хакеры,
автор Иванов Иван.
Краткое описание:
Это статья про хакеров...
Если же мы напишем вот так:

function Add_article($author=«Иванов Иван»,
$title, $description){
//… действия как в предыдущем примере
}
Add_article(«Кто такие хакеры»,
«Это статья про хакеров...»);
?>
То в результате получим:
Warning: Missing argument 3 for
add_article() in
c:\users\nina\tasks\func\def_bad.php
on line 2
Возвращаемые значения
Все функции, приведенные выше в качестве примеров, выполняли какие-либодействия. Кроме подобных действий, любая функция может возвращать как результатсвоей работы какое-нибудь значение. Это делается с помощью утверждения return. Возвращаемоезначение может быть любого типа, включая списки и объекты. Когда интерпретатор встречаеткоманду return в теле функции, он немедленно прекращает ее исполнение и переходитна ту строку, из которой была вызвана функция.
Например, составим функцию, которая возвращает возраст человека. Есличеловек не умер, то возраст считается относительно текущего года.

/* если второй параметр вычисляется
как true, то он рассматривается как
дата смерти, */
function Age($birth, $is_dead){
if ($is_dead) return $is_dead-$birth;
else return date(«Y»)-$birth;
}
echo Age(1971, false); // выведет 33
echo Age(1971, 2001); // выведет 30
?>
В этом пример можно было и не использовать функцию return, а простозаменить ее функцией вывода echo. Однако если мы все же делаем так, что функциявозвращает какое-то значение (в данном случае возраст человека), то в программемы можем присвоить любой переменной значение этой функции: $my_age = Age(1981, 2004);
В результате работы функции может быть возвращено только одно значение.Несколько значений можно получить, если возвращать список значений (одномерный массив).Допустим, мы хотим получить полный возраст человека с точностью до дня.

function Full_age($b_day, $b_month, $b_year){
if (date(«m»)>$b_month && date(«d»)>$b_day)
{
$day = date («d») — $b_day;
$month = date(«m») — $b_month;
$year = date(«Y») — $b_year;
} else {
$year = date(«Y») — $b_year — 1;
$day = 31 — ($b_day — date («d»));
$month = 12 — ($b_month — date(«m»));
}
return array ($day,$month,$year);
}
$age = Full_age(«07»,«08»,«1974»);
echo «Вам $age[2] лет, $age[1] месяцев
и $age[0] дней»;
// выведет «Вам 29 лет, 11 месяцев и 5 дней»
?>
Когда функция возвращает несколько значений для их обработки в программе,удобно использовать языковую конструкцию list(), которая позволяет одним действиемприсвоить значения сразу нескольким переменным. Например, в предыдущем примере,оставив без изменения функцию, обработать возвращаемые ей значения можно было так:


// задание функции Full_age()
list($day,$month,$year) = Full_age(«07»,
«08»,«1974»);
echo «Вам $year лет, $month месяцев и
$day дней»;
?>
Вообще конструкцию list() можно использовать для присвоения переменнымзначений элементов любого массива.

$arr = array(«first»,«second»);
list($a,$b) = $arr;
// переменной $a присваивается первое
// значение массива, $b – второе
echo $a," ",$b;
// выведет строку «first second»
?>
Пример 5.9. Использование list()
Возвращение ссылки
В результате своей работы функция также может возвращать ссылку накакую-либо переменную. Это может пригодиться, если требуется использовать функциюдля того, чтобы определить, какой переменной должна быть присвоена ссылка. Чтобыполучить из функции ссылку, нужно при объявлении перед ее именем написать знак амперсанд(&) и каждый раз при вызове функции перед ее именем тоже писать амперсанд (&).Обычно функция возвращает ссылку на какую-либо глобальную переменную (или ее часть– ссылку на элемент глобального массива), ссылку на статическую переменную (илиее часть) или ссылку на один из аргументов, если он был также передан по ссылке.

$a = 3; $b = 2;
function & ref($par){
global $a, $b;
if ($par % 2 == 0) return $b;
else return $a;
}
$var =& ref(4);
echo $var, " и ", $b, "";
//выведет 2 и 2
$b = 10;
echo $var, " и ", $b, "";
// выведет 10 и 10
?>
Пример 5.10. Возвращение ссылки
При использовании синтаксиса ссылок в переменную $var нашего примеране копируется значение переменной $b возвращенной функцией $ref, а создается ссылкана эту переменную. То есть теперь переменные $var и $b идентичны и будут изменятьсяодновременно.
6. Что такое класс? В чем отличие класса от структуры? Приведите примерыструктуры и класса
Для С++ классы System.Object, System.Exception, System.File-Streamи System.Random — это ссылочные типы (память выделяется из упр. кучи). В свою очередьразмерные типы в документации называются структурами (structure) и перечислениями(enumeration). Например, структуры System.In132, System.Boolean, System.Decimal,System.TimeSpan и перечисления System.DayOfWeek, System.10.FileAttributes и System.Drawing.FontStyleявляются размерными типами (хранятся обычно в стеке потока, но могут быть встроеныв ссылочные типы).
Переменные размерного типа непосредственно содержат данные, а переменныессылочного типа содержат ссылку на область памяти, содержащую данные. При этом,память под ссылочные переменные всегда выделяется в куче, а память под размерные,обычно, в стеке. Как известно, в .NET для освобождения неиспользуемой памяти в кучеиспользуется сборщик мусора. Особенностью стека является то, что память в нем освобождаетсяавтоматически (без каких-либо накладных расходов). Таким образом, уничтожение ссылочныхобъектов путем сборки мусора менее эффективно, чем размерных.
Другой важный момент — это упаковка (boxing) и распаковка (unboxing).При упаковке размерного типа происходит выделение области памяти в куче и копированиезначения размерного типа в эту область. Упакованный размерный тип обладает свойствамиссылочного. Распаковка — обратный процесс, в результате которого упакованный размерныйтип копируется на стек. Благодаря упаковке любой размерный тип может интерпретироватьсякак ссылочный и, как следствие этого, любой размерный тип может использоваться вместоobject. Важно понимать, что упаковка и распаковка требуют дополнительных затратпамяти и времени. Поэтому следует избегать этих операций в большом количестве.
Теперь вернемся к нашему вопросу. Отличие структуры от класса:
— Структура является размерным типом, а класс — ссылочным.
— Все структурные типы неявно наследуются от System.ValueType, онине бывают абстрактными и всегда неявно запечатаны (sealed)
— При присваивании переменных структурного типа, создается копия данных
— Объявления полей структуры не могут иметь инициализаторов
— Различная интерпретация this для структуры и класса
— Структура не может содержать конструктор без параметров
— Структура не может содержать деструктор
— Для ссылочных типов значение по умолчанию — null
— При конвертировании между ссылочным и размерным типами происходитупаковка и распаковка
Главное помнить и понимать главные:
1 — следствием этого является то, что экземпляр класса создается вкуче, а структуры, обычно (но не всегда) на стеке
3 — это должно быть очевидно
4- является следствием 6, т.к. код инициализации полей неявно вставляетсяво все конструкторы
6 является следствием оптимизации использования структур по скорости
Особенности 8 для структур и 9 рассмотрим ниже более подробно, т.к.именно на них любят акцентировать внимание на собеседовании.
Рассмотрим такой пример:
1.public struct MyStruct
2.{
3. public int m1;
4. public string s1;
5.}
6....
7.MyStruct ms1;
8.MyStruct ms2 = new MyStruct();
9.
10.Console.WriteLine(ms1.m1);
11.Console.WriteLine(ms2.m1);
12....
13.
В чем отличие между объявлениями в строках 7 и 8? Некоторые считают,что в первом случае (строка 7) объект создается на стеке, а во втором (строка 8)происходит упаковка и объект создается в куче. На самом деле это не так. В обоихслучаях объект создается на стеке. Разница в том, что в строке 7 будет создан неинициализированныйобъект, а в строке 8 инициализированный. Поля ms2 будут содержать значения по умолчанию(0 для m1 и null для s1), а поля ms1 неопределены. Поэтому в строке 10 возникнетошибка компиляции.
Теперь рассмотрим нюансы, связанные с упаковкой и распаковкой. Какизвестно, размерные типы могут наследоваться от интерфейсов (имплиментировать интерфейсы).Часто спрашивают, будет ли производиться упаковка при приведении размерного типак интерфейсу. Правильный ответ — да, будет, т.к. интерфейс является ссылочным типом.
Рассмотрим пример:
1.int i = 1;
2.Console.WriteLine(i.ToString());
3.Console.WriteLine(((IFormattable)i).ToString());
4.Console.WriteLine("{0}", i);
5.
Размерный тип int имплиментирует интерфейс IFormattable,содержащий метод ToString().Так какметод ToString() является частью класса int, а компилятор знает, что это размерныйтип и, следовательно, виртуальный метод ToString() не может быть переопределен (т.к.структурный тип является запечатанным), компилятор вставляет непосредственный вызовметода в строку 2 и упаковки не происходит. В строке 3 происходит упаковка, т.к.i приводится к интерфейсу IFormattable. Теперь вы сами можете сказать, что происходитв строке 4: неявное приведение к интерфейсу IFormattable и вызов метода ToString(),что, также, приводит к упаковке.
И еще один момент. Массивы являются ссылочными типами, но могут содержатьразмерные. Где же будет размещен, например, массив целых чисел? В куче, причем целыечисла будут неупакованными.
Значением this. Для класса:
class Indirect
{
//...
public void Method(Indirect that)
{ RefParameter(ref this); // compile-time error
OutParameter(out this); // compile-time error
this = that; // compile-time error
}
//...
}
Для структуры:
struct Direct
{
//...
public void Reassign(Direct that)
{
RefParameter(ref this); // compiles ok
OutParameter(out this); // compiles ok
this = that; // compiles ok
}
//...
}
Структура не может быть null, и вот это не пройдет:
if (s == null)… // compile-time error, where s — struct
Структуру не можно использовать с оператором as
Direct no = s as Direct; // compile-time error, where Direct — struct
Структуру не можно использовать с оператором lock
lock(s) {… } // compile-time error, where s — struct
Не может иметь полей типа volatile (Ключевое слово volatile указывает,что поле может быть изменено несколькими потоками, выполняющимися одновременно.)
private volatile Direct field; // compile-time error, where Direct- struct
Только структру могу работать с указателями, примеры
(Ключевое слово unsafe обозначает небезопасный контекст, необходимыйдля работы с указателями.)
Direct variable = new Direct();
unsafe {
Direct * ptr = &variable; // compiles ok
//...
}
но с классом
Indirect variable = new Indirect();
unsafe {
fixed(Indirect * ptr = &variable) // compile-time error
{
//...
}
}
атак же
Direct * array = stackalloc Direct[42]; // compiles ok
Только структуры могу использовать sizeof
int size = sizeof(Direct); // compiles ok
По разному работает сравнение Equals
struct Direct
{
public Direct(int value)
{
field = value;
}
private int field;
}
class Indirect
{
public Indirect(int value)
{
field = value;
}
private int field;
}
class EqualsBehavior
{
static void Main()
{
Direct s1 = new Direct(42);
Direct s2 = new Direct(42);
Indirect c1 = new Indirect(42);
Indirect c2 = new Indirect(42);
bool structEquality = s1.Equals(s2); // true
bool classIdentity = c1.Equals(c2); // false
}
}
7. Что такое виртуальная функция? Приведите пример. В каких случаяхиспользуются виртуальные функции?
В случае переопределяемыхфункций компилятор умеет отличать один вызов от другого по типу их аргументов. Используяэту информацию, он «жестко» связывает коды программы с соответствующимифункциями элементами. С другой стороны, бывает необходимо отличить один вызов отдругого, при наличии аргументов одного типа на этапе выполнения, и обеспечить потомкикласса разными версиями функций базового класса. Именно использование ключевогослова virtual приводит к отсрочке связывания, и вызову нужной функции на этапе выполнения.
Виртуальная функцияэлемент — это функция, которая будучи описана в потомках, замещает собой соответствующуюфункцию элемент везде — даже в предке, если она вызывается для потомка. В отличииот раннего связывания с использованием переопределяемых функций элементов, виртуальныефункции элементы должны иметь аргументы одного типа.
Синтаксис определениявиртуальных функций элементов очень прозрачный: добавьте слово virtual к первомуопределению функции элементу:  virtual void Show();  virtual void Hide();
Только встроенныефункции элементы могут быть объявлены как виртуальные. Как только функция объявленавиртуальной, она не может быть переопределена ни в каком наследуемом классе с однотипнымперечнем аргументов, но с другим типом возвращаемого значения. Если вы переопределяетеShow с тем же перечнем однотипных аргументов и таким же типом возвращаемого значения,то новая функция Show автоматически становится виртуальной, независимо от того,используется ключевое слово virtual или нет. В этом случае говорят, что новая виртуальнаяShow замещает Show в своем базовом классе. Вы можете свободно переопределять Showс другим перечнем разнотипных аргументов (изменяя при этом тип возвращаемого значенияили нет), но виртуальный механизм не задействуется для такой версии Show. акая именнофункция элемент Show будет вызвана — зависит только от класса объекта, для котороговызывается Show, даже если вызов производится через указатель на базовый класс.Например,
CircleACircle
Point*APoint_рointer = &ACircle;// указатель на Circle,
// которому присваивается
// значение указателяна
// базовый класс,Point
APoint_рointer->Show(); // вызывает Circle::Show!
Так как вызовневиртуальной функции-элемента выполняется несколько быстрее, чем виртуального,то в общем случае рекомендуется, когда не встает вопрос о расширяемости, но существенноезначение имеет производительность, пользоваться обычными функциями элементами. Впротивном случае, нужно пользоваться виртуальными.

Литература
 
1. Баженова И. Ю. С++ && Visual StudioNET. Самоучительпрограммиста. — М.: КУДИЦ-ОБРАЗ, 2003. — 448с.
2. ГилбертСтивен, Макартни Билл. Самоучитель Visual C++ 6 в примерах. — К.: ООО «ТИДДС», 2003. — 496с.
3. КасаткинА.И., Вальвачев А.Н. Профессиональное программирование на языке Си: От Турбо Сик С++. – Минск: Вышэйшая школа, 1992. – 240с.
4. НиколенкоД. В. Самоучитель по Visual C++. — СПб: Наука и техника, 2001. -368 с.
5. ПавловскаяТ.А. С/С++. Программирование на языке высокого уровня. – СПб.: Питер, 2003. – 461с.
6. ПаппасК., Мюррей У. Программирование на С и С++. — К.: BHV, 2000. – 320c.
7. СавичУ. С++ во всей полноте. — К.: BHV; СПб: Питер, 2005. 784 с.
8. ХолзнерС. Visual C++: Учебный курс. СПб: Питер, 2000. — 576с.
9. Уэйт М.,Прата С., Мартин Д. Язык Си. Руководство для начинающих. – М.: Мир, 1988. -512с.
10. ШимановичЕ.Л. C/C++ в примерах и задачах. — Минск: Новое знание, 2004, — 528с.
11. ШмидскийЯ. К. Программирование на языке С/С++. Самоучитель. –М.: Вильямс, 2004. -352с.


Не сдавайте скачаную работу преподавателю!
Данный реферат Вы можете использовать для подготовки курсовых проектов.

Поделись с друзьями, за репост + 100 мильонов к студенческой карме :

Пишем реферат самостоятельно:
! Как писать рефераты
Практические рекомендации по написанию студенческих рефератов.
! План реферата Краткий список разделов, отражающий структура и порядок работы над будующим рефератом.
! Введение реферата Вводная часть работы, в которой отражается цель и обозначается список задач.
! Заключение реферата В заключении подводятся итоги, описывается была ли достигнута поставленная цель, каковы результаты.
! Оформление рефератов Методические рекомендации по грамотному оформлению работы по ГОСТ.

Читайте также:
Виды рефератов Какими бывают рефераты по своему назначению и структуре.