Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
шпоры программирование.doc
Скачиваний:
7
Добавлен:
17.04.2019
Размер:
257.54 Кб
Скачать
  1. Стек и динамическая память.

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

Стек (англ. stack — стопка) — структура данных с методом доступа к элементам LIFO (Last In — First Out, последним пришел — первым вышел). Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно взять верхнюю.

Добавление элемента, называемое также проталкиванием (push), возможно только в вершину стека (добавленный элемент становится первым сверху), выталкивание (pop) — также только из вершины стека, при этом второй сверху элемент становится верхним.

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

  1. Функции в С++. Библиотечные функции.

Функции в С++

Коды или команды в программе часто объединяются в так называемые функции. Например, группа команд, необходимых для чтения исходных данных, объединена в функцию readData(). Также для выполнения оставшихся подзадач обозначим функции sortData(), compactData() и ShowData().

Функция main()

В каждой С++ программе должна быть ровно одна функция с именем main(). Исполнение программы начинается с выполнения первой команды в функции main(), Затем последовательно одна за другой выполняются все дальнейшие команды, и, выполнив последнюю команду функции main(), программа завершает работу.

Любая функция состоит из четырех частей:

Тип возвращаемого значения,

Имени самой функции,

Списка параметров функции (может быть пустой)

Сам код функции.

Первые три части составляют прототип функции.

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

Пример общего вида функции

void readData() { cout << "Считываем \n"; }

В нашем примере ниже тело функции main() содержит вызовы функций readData(), sortData(), compactData() и showData(). Последней выполняется инструкция return 0.

Инструкция return

Инструкция return обеспечивает механизм завершения работы функции. Если оператор return сопровождается некоторым значением (в данном примере 0), это значение становится возвращаемым значением функции. Возвращаемое значение 0 говорит об успешном выполнении функции. (В стандарте С++ функция main() возвращает 0 по умолчанию, если оператор return не указан явно.)

Определим наши функции readData(), sortData(), compactData() и showData():

void readData() { cout << "Считываем \n"; }

void sortData() { cout << "Сортируем\n"; }

void compactData() { cout << "Упаковываем\n"; }

void showData() { cout << "Выводим результат\n"; }

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

Листинг примера использования функций

#include<iostream>

void readData() { cout << "Считываем\n"; }

void sortData() { cout << "Сортируем\n"; }

void compactData() { cout << "Упаковываем\n"; }

void showData() { cout << "Выводим резульатат\n"; }

int main()

{

//выводим последовательно функции

readData();

sortData();

compactData();

showData();

return 0; //программа завершилась корректно}

О стандартных библиотеках

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

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

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

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

Функции второй категории предоставляют возможность получить доступ к функциям ядра данной операционной системы к внутренним структурам данной операционной системы, к регистрам используемых аппаратных устройств. Кроме того, ко второй категории относятся функции, которые добавлены в библиотеку, исходя из личных предпочтений разработчиков конкретной системы программирования -- как им видится удобный набор средств для разработки различных алгоритмов -- сравните, например, функции memset и setmem.

Со времени принятия стандарта языка Си, что окончательно произошло в 1989 году, в системах программирования Си такие необоснованные расширения библиотек практически исчезли, но в ранних версиях языка подобный разнобой был очень велик. К сожалению, наборы функций второй категории не согласованы даже для различных систем программирования в рамках одной операционной системы на одном типе архитектур компьютеров. Это четко прослеживается на примере систем программирования Turbo C от Borland и Microsoft C: библиотечные функции, обеспечивающие интерфейс для вызова одной и той же функции операционной системы, могут иметь не только разные параметры, но и разные названия.

Эти несогласованности объяснялись, с одной стороны, коммерческими соображениями стремлением удержать под контролем рынок программного обеспечения, чтобы пользователи, начавшие программировать с использованием одной системы программирования, покупали затем более новые программные продукты той же фирмы, а с другой стороны, поздним появлением стандарта на язык и на его библиотеки и независимые эволюции от версии к версии каждой системы программирования [3]. (Напомним, что стандарт языка был принят примерно через пятнадцать лет после его появления и через десять лет после того, как его уже начали активно использовать) При этом, надо отметить, происходило постепенное сближение различных систем программирования по мере того, как каждая из них заимствовала наиболее ценные идеи у конкурентов. Так, различия между библиотеками последних систем программирования Turbo C и Microsoft C практически отсутствуют.

  1. Локальные и глобальные переменные в С++, их область видимости.

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

Глобальная переменная - переменная, объявленная за пределами всех функций. Областью видимости глобальных переменных является вся программа. Глобальная переменная не локализована ни на каком уровне. Глобальная переменная может быть проинициализирована только соответствующей ее типу константой (но не выражением). Инициализация глобальных переменных производится однократно перед началом исполнения специальных функций.

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

int main() {

int i=1;

return 0;

}

void afunc()

{

int i=2;

}

Компилятор при этом ничего типа [Error: redeclaration of `int i'] не скажет. В main() у нас своя перемення i, а в afunc() своя, никакого отношения друг к другу они не имеют. Если же объявить переменную вне всяких функций (такие переменные называются глобальными), то её можно использовать во всех функциях без объявления, т.е. вот так:

int i=0;

int main()

{

i=3;

return 0;

}

void afunc()

{

i=5;

}

Тут уже любые действия над переменной в одной функции значимы для другой, то есть в данном случае в функции afunc() до присвоения i 5 значение i будет 3, а не 0. Глобальную переменную можно использовать в функции, только если в функции не объявлена та же преременная. Если же она объявлена, то она локальна, то есть глобальную функция "не видит".

#include

int i=1;

int main()

{

int i;

i=2;

cout<<""i in main(): "<<"i<<"endl;

return 0;

}

void afunc()

{

cout<<""i in afunc(): "<<"i;

}

результат:

i in main(): 2

i in afunc(): 1

Это значит, что в main() у нас своя локальная переменная i, а afunc() использует глобальную, так как в ней i не объявлена.

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

#include

int i=1;

int main()

{

int i;

i=2;

cout<<""i local: "<<"i<<"" i global: "<<"::i;

return 0;

}

получим:

i local: 2 i global: 1

:: перед переменной значит что нам нужна глобальная переменная.

Аргументы функции передаются в функцию как значения, то есть они являются локальными переменными. Это значит, что при передаче аргументов в функцию создаются их локальные копии, с которыми работает функция. То есть если в функции вы изменяете значение аргумента, то изменяется не переменная, которую передали функции в качестве аргумента, а её локальная копия. Вот пример:

#include

void func(int x,int y);

int main()

{

int x=1,y=2;

cout<<""main(): x="<<"x<<"" y=" <<"y<<"endl;

func(x,y);

cout<<""main(): x="<<"x<<"" y=" <<"y<<"endl;

return 0;

}

void func(int x,int y)

{

cout<<""func(): x="<<"x<<"" y=" <<"y<<"endl;

x=3;

y=4;

cout<<""func(): x="<<"x<<"" y=" <<"y<<"endl;

}

результат выполнения:

main(): x=1 y=2

func(): x=1 y=2

func(): x=3 y=4

main(): x=1 y=2

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

Область видимости переменной - это среда, в которой она определена. В большинстве случаев все переменные PHP имеют единую область видимости. Эта единая область видимости охватывает также включаемые (include) и требуемые (require) файлы. Например:

<?php

$a = 1;

include "b.inc";

?>

Здесь переменная $a будет доступна внутри включенного скрипта b.inc. Однако, внутри определенных пользователем функций вводится локальная область видимости функции. Любая, используемая внутри функции переменная, по умолчанию ограничена локальной областью видимости функции. Например:

<?php

$a = 1; /* глобальная область видимости */

function Test()

{

echo $a; /* ссылка на переменную локальной области видимости */

}

Test();

?>

Этот скрипт не сгенерирует никакого вывода, поскольку выражение echo указывает на локальную версию переменной $a, а в пределах этой области видимости ей не не было присвоено значение. Возможно вы заметили, что это немного отличается от языка C в том, что глобальные переменные в C автоматически доступны функциям, если только они не были перезаписаны локальным определением. Это может вызвать некоторые проблемы, поскольку люди могут нечаянно изменить глобальную переменную. В PHP, если глобальная переменная будет использоваться внутри функции, она должна быть объявлена глобальной внутри нее.