2.3. Функции - элементы структуры

-------------------------------- Повторим рассмотренный выше пример в другой форме:


//------------ структура dat - аналог класса объектов "дата" --struct dat

{

unsigned day;

unsigned month;

unsigned year;

int TestData();

void NextData();

void PlusData(int n)

{

while(n-- !=0) dat::NextData(this);

}

};

//----------- набор функций для класса объектов "дата" --------static int mm[] = {31,28,31,30,31,30,31,31,30,31,30,31};

//----------- Проверка на корректность -----------------------int dat::TestData()

{

if (month ==2 && day==29 && year %4 ==0) return(1);

if (month ==0 || month >12 || day ==0 || day >mm[month])

return(0);

return(1);

}

//----------- Следующая дата ----------------------------------void dat::NextData()

{

day++;

if (day month = 5;

this->day++;


или неявно


month = 5;

day++;


- для переменной, имеющей тип некоторой структуры, вызов

функцииэлемента этой структуры имеет вид


. ( )


2.4. Переопределение функций

--------------------------- В Си++ возможно определение нескольких функций с одинаковым

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

словом overload:


overload SetDat;

void SetDat(int dd,int mm,int yy,dat *p)

{ // Дата вводится в виде трех целых

p->day=dd;

p->month=mm;

p->year=yy;

}

void SetDat(char *s,dat *p) // Дата вводится в виде строки

{

sscanf(s,"%d%d%d", &p->day, &p->month, &p->year);

}


void main()

{

dat a,b;

SetDat(12, 12, 1990, &a); // Вызов первой функции

SetDat("12,12,1990", &b); // Вызов второй функции

}


Функции-элементы также могут быть переопределены, при этом явного объявления не требуется.


struct dat

{

int day,month,year;

void SetDat(int,int,int);

void Setdat(char *);

}

void dat::SetDat(int dd,int mm,int yy)

{

day=dd; month=mm; year=yy;

}

void dat::SetDat(char *s)

{

sscanf(s,"%d%d%d",&day,&month,&year);

}

void main()

{

dat a,b;

a.SetDat(12,12,1990);

b.SetDat("12,12,1990");

}


2.5. Операторы управления динамической памятью

---------------------------------------------

В библиотеке Си имеются две функции управления динамической памятью - malloc() и free(), которые выделяют и освобождают область памяти заданного размера (в байтах). В этой области программа может разместить переменную (или массив), которая называется динамической. При выделении памяти под динамическую переменную необходимо при помощи операции sizeof определять количество байтов, необходимое для размещения переменной указанного типа. В Си++ введены два оператора, аналогичные функциям malloc и free new и delete. Они отличаются от соответствующих функций тем, что допускают использования в качестве аргументов непосредственно спецификацию типа создаваемой динамической переменной и ссылки на динамическую переменную:


Си++ "Классический" Си

------------------------- ---------------------------------char *s,x[80]; char *s,x[80];

dat *p,*q; struct dat *p,*q;

void main() void main()

{ {

p = new dat; p = malloc(sizeof (struct dat));

q = new dat[15]; q = malloc(15*sizeof (struct dat));

gets(x); gets(x);

s = new char[strlen(x)+1]; s = malloc(strlen(x)+1);

... ...

delete p; free(p);

delete q; free(q);

delete s; free(s);

}


Операторы имеют вид:



delete


2.6. Параметры функций по умолчанию

----------------------------------

При определении формальных параметров функции может быть

указано его значение, принимаемое при вызове по умолчанию при

отсутствии этого параметра в списке фактических:


//----- Функция устанавливает по умолчанию текущее значение года,

//----- месяца и дня

#include


void dat::SetDat(int d=0, int m=0, int y=0)

{

struct date x;

getdate(&x); // Стандартная функция получения

// текущей даты

// Проверка на значение по умолчанию

year = (y == 0) ? x.da_year : y;

month= (m == 0) ? x.da_month: m;

day = (d == 0) ? x.da_day : d;

}



Информация о работе «Объективное программирование»
Раздел: Информатика, программирование
Количество знаков с пробелами: 61028
Количество таблиц: 0
Количество изображений: 0

Похожие работы

Скачать
14044
1
2

... обучающих программ Обучающие программы, построенные на бихевиористской основе, подразделяют на: а) линейные, разработанные Скиннером, б) разветвленные программы Н. Краудера. 1. Линейная система программированного обучения, первоначально разработанная американским психологом Б. Скиннером в начале 60-х гг. ХХ в. на основе бихевиористского направления в психологии. ·  Он выдвинул следующие ...

Скачать
93027
12
0

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

Скачать
109055
0
0

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

Скачать
165676
21
12

... отбора. ГЛАВА II. ЦЕЛЬ, ЗАДАЧИ, МЕТОДЫ И ОРГАНИЗАЦИЯ ИССЛЕДОВАНИЯ   2.1 Цель и задачи исследования Цель исследования - повышение эффективности физической подготовки вратарей учебно-тренировочных групп на соревновательном этапе. В процессе реализации поставленной цели решались следующие основные задачи: 1.     Изучить особенности возрастного развития двигательных способностей футболистов ...

0 комментариев


Наверх