C, PHP, VB, .NET

Дневникът на Филип Петров


Категория ‘С/С++’

* Stack или heap?

Публикувано на 06 ноември 2008 в раздел С/С++.

При разглеждането на оператора new споменахме понятието „динамична памет“ (heap), но не дадохме ясно определение защо се използва. Когато дефинираме променливи по обикновения познат начин (например „int x = 5;“) те се записват в стека (stack) на паметта. Стандартно тази памет е 1MB и може да се досетите, че в много случаи тя ще бъде недостатъчна (например ако искаме да създадем гигантски масив с един милион елемента double d[1000000]). Компилаторът няма да даде грешка, но програмата няма да може да се изпълни (ще се даде грешка от типа stack overflow). Прочети още…

.

 


* Приятелски функции

Публикувано на 06 ноември 2008 в раздел С/С++.

Приятелски се наричат функциите, които не са член-функции на клас, но имат достъп до неговите private елементи. Приятелски функции се използват, когато е необходимо една функция да има достъп до private членовете на два или повече различни класа. Декларацията на приятелската функция може да се намира както в частта public, така и в частта private и се характеризира с ключовата дума friend, която се поставя в началото на декларацията. Една приятелска функция се дефинира като обикновена функция, която не е член на клас. Има два вида приятелски функции: Прочети още…

.

 


* Класове, член-функции, конструктори и деструктори

Публикувано на 06 ноември 2008 в раздел С/С++.

Класовете позволяват да дефинираме нови типове данни. Един клас представлява описание на тип, включващ едновременно данни и функции, които ги обработват. Данните се наричат член-променливи, а функциите – член-функции. Дефиницията на един клас включва декларация на класа и дефиниции на член-функциите.

Декларацията на класа има следния синтаксис:

	class  <име-на-клас>{
		// Декларации на член-променливи
		// Декларации на член-функции
	};

Дефиницията на член-функция има следния синтаксис:

	<връщан-резултат> <име-на-клас>::<функция>(вх. парам.)
	{
		// Tяло на функцията
	}

За да се създаде обект, се използва името на класа като спецификатор за типа. Прочети още…

.

 


* Оператори new и delete

Публикувано на 06 ноември 2008 в раздел С/С++.

Както вече споменахме, в обектно-ориентираното програмиране е възможно да създаваме много инстанции на един и същи „модул“ (обект). Контролът върху този обект се осъществява чрез операторите new и delete. Обекти, създадени чрез операторът new, се наричат „динамични обекти“. Те се разпределят в паметта за динамични обекти (heap). Синтаксисът е следният:

	<указател> = new <тип>;

Типа данни на указателя трябва да съвпада с типа данни на обекта, който създаваме. По този начин създаваме нова променлива, която е достъпна чрез указателя. Унищожаването на така създаден обект се осъществява, чрез операторът delete:

	delete <указател>;

Прочети още…

.

 


* Константи, псевдоними и булев тип

Публикувано на 06 ноември 2008 в раздел С/С++.

Всички типове данни от С (int, float, double, char, указатели, и тн…), които сме разгледали дотук, са валидни и за С++. Като разширение на езика ни се предоставят и допълнителни възможности:

1. Константи: Досега, когато ни се налагаше да въвеждаме константи използвахме предпроцесора. Това не винаги е удобно, а освен това може да доведе до неочаквани грешки. Затова в С++ са въведени константи:

	const <тип> <име на променлива> = <стойност>;

Както се досещате те са много удобни при дефиниране на размерност на масиви, заделяне на памет и в всякакви подобни операции, където използваме една и съща постоянна величина на множество места в програмата. Важно е да се каже, че е задължително константите да се инициализират в момента на декларирането си. Прочети още…

.

 


* Въведение в C++

Публикувано на 06 ноември 2008 в раздел С/С++.

C++ на практика е език, който „надгражда“ езика за програмиране С, като добавя нови възможности:

– Обектно-ориентирано програмиране
– Създаване и използване на абстрактни типове данни
– Подобрения на някои съществуващи конструкции

На практика вие можете да използвате всичко научено дотук от езика за програмиране С при С++ (най-малкото примерите от предишните статии са писани за компилаторът на Microsoft – Visual C++ 6.0). Затова няма да преразглеждаме вече научени езикови конструкции, а ще даваме примери за част от нововъведенията. Прочети още…

.

 


* Накратко за обектно-ориентираното програмиране

Публикувано на 06 ноември 2008 в раздел С/С++.

За да обясним понятието „обектно-ориентирано програмиране“ е добре да опишем какви програми писахме на езика за програмиране С досега:

1. Скриптови програми: Последователно изпълнение на предварително зададена поредица от операции.

2. Процедурно програмиране: Възможност за „разклоняване“ на програмата, така че тя да извършва различни последователности от операции (процедури или както споменахме в т.1 – скриптове), в зависимост от въведени данни от потребителят. След изпълнение на дадена процедура програмата се „връща“ на мястото, където процедурата е извикана.

3. Модулно-процедурно програмиране: Предоставя възможност за обединяване на различни процедури в т.нар. „модули“. По този начин разделяме програмата на различни логически части, които се свързват почежду си чрез т.нар. „procedure calls“. Прочети още…

.

 


* Допълнителни задачи към упражнения 2 и 3

Публикувано на 01 ноември 2008 в раздел С/С++.

Задача: Дадена е матрица с N реда и M стълба, която може да съдържа елементи числата 0 и 1. Нека тази матрица е лабиринт, в който 0 означава, че има път, а 1 че има препятствие. Елемент (0, 0) се нарича вход, а елемент (N, M) изход от лабиринта. В лабиринта можем да се движим само по хоризонтала и вертикала. Напишете програма с меню и следните функции:
– Въвежда елементите на матрицата от клавиатурата.
– Генерира случаен лабиринт.
– Обхожда лабиринта и намира възможен път (ако има такъв).
– Намира най-краткият от възможните пътища (ако има такива).

Задача: Даден е едномерен масив от тип int. Запълнете масива с произволни числа и реализирайте функция, която намира най-голямото възможно число, образувано от елементите на масива.

Задача: В текстов файл са записани имена, телефони и e-mail адреси в следния формат:

Ivan, 0888555666, ivan@abv.bg
Petko, 0899555666, petko@yahoo.com

Напишете програма, която прочита файла и:
– Изважда имената и телефоните и ги записва в нов файл phonebook.txt, като всяко име и телефон са на отделен ред.
– Изважда всички e-mail адреси и ги записва във файл maillist.txt, като всеки адрес е на нов ред.

.

 


* Функции за разпределение на паметта

Публикувано на 26 октомври 2008 в раздел С/С++.

Всеки компютър разполага с определено количество свободна памет. За да се използува ефективно тя трябва да се разпределя динамично. В С имаме възможност да променяме подразбиращият се размер на стека по време на изполнението на програмата. Програмистът обаче сам трябва да се грижи да предпазва стека от препълване.

Ще разгледаме две от функциите за разпределение на паметта от високо ниво – malloc, calloc и free.

1. malloc: Резервира блок памет и връща указател към блока:

	int *p = (int *)malloc(unsigned bytes);

Чрез bytes указваме точно колко байта памет искаме да резервираме. Ако няма достатъчно памет в указателя p ще се запише NULL. Имайте предвид, че ако се опитате да записвате информация чрез такъв указател програмата ще завърше с фатална грешка, затова винаги проверявайте резултатът от malloc! Прочети още…

.

 


* Работа с файлове от ниско ниво (UNIX стил)

Публикувано на 26 октомври 2008 в раздел С/С++.

Функциите open, close, creat, unlink, read, write и lseek предоставят небуфериран достъп до данните във файловете. Това означава, че ще е нужно ние сами да се грижим за създаването на съответен буфер. Използват се предимно при UNIX -базирани операционни системи (Linux или BSD например).

1. open: Отваря файл с режим на достъп четене (0), запис (1) или четене+запис:

	int fd = open(char *path, int flags, mode_t mode);

Променливата fd се напича дескриптор на файла. Ако отварянето на файла не е възможно, то дескриптора ще получи стойност -1. Входния параметър name е символен низ, който описва пътя до файла в операционната система. Флаговете (flags) са следните:
O_RDONLY – само за четене.
O_WRONLY – само за запис.
O_CREAT – Създава файла ако той не съществува.
O_TRUNC – Изтрива съдържанието на файла.
Прочети още…

.