- •Вопросы к экзамену по дисциплине Программирование. 2012 год.
- •Директивы препроцессора #include, #define
- •Выражения. Классификация выражений. Правила вычисления выражений.
- •Классы памяти. Определение, время существования, область действия, инициализация.
- •Массивы. Объявление, инициализация, индексирование. Одномерные, двумерные массивы.
- •Инициализация массива
- •Двумерные массивы
- •Пользовательские типы данных: структуры. Битовые поля. Передача структур в функции
Выражения. Классификация выражений. Правила вычисления выражений.
Основными элементами выражения служат числа, имена
и операции *, /, +, – (унарный и бинарный) и =. Имена
не всегда описываются до использования.
Примеры выражений:
(а + 0.12)/6
х && у || !z
(t * sin(x)-1.05e4)/((2 * к + 2) * (2 * к + 3))
— вычитание или унарный минус;
+ сложение или унарный плюс;
* умножение;
/ деление;
% деление по модулю (аналог Mod в Паскале);
++ унарная операция увеличения на единицу (инкремент);
-- унарная операция уменьшения на единицу (декремент).
По убыванию старшинства арифметические операции расположены в следующем порядке:
++, --
— (унарный минус)
*, /, %
+, -
Операции языка С++. Приоритет операций.
Структура программы на языке С++.
/*Заголовки и комментарии, описывающие программу*/
/*Директивы include*/
#include имя_файла_1
...
#include имя_файла_n
/*Макро*/ 59
#define макро_1 значение_1
...
#define макро_n значение_n
/*Описание глобальных переменных*/
тип_данных глобальная_переменная_1;
...
тип_данных глобальная_переменная_n;
main()
{
/*Описания extern, обеспечивающие ссылку вперед на функции
и используемые в теле функции main*/
/*Описания локальных переменных*/
тип_данных локальная_переменная_1;
...
тип_данных локальная_переменная_m;
/*Тело функции main*/
...
}
/*Функции, используемые в программе main*/
Тип_данных имя_функции_1 (формальные параметры)
{
/*Описания extern, обеспечивающие ссылку вперед на функции
и используемые в теле данной программы*/
/*Описания локальных переменных*/
тип_данных локальная_переменная_1;
...
тип_данных локальная_переменная_u;
/Тело функции – 1*/
...
}
... 60
Тип_данных имя_функции_n (формальные параметры)
{
/*Описания extern, обеспечивающие ссылку вперед на функции
и используемые в теле данной функции n */
/*Описания локальных переменных*/
тип_данных локальная_переменная_1;
...
тип_данных локальная_переменная_r;
/*Тело функции n */
...
}
Структура каждой функции совпадает со структурой главной
программы (main), поэтому функции иногда еще называются п о д -
п р о г р а м м а м и . Подпрограммы решают небольшую и специфи-
ческую часть общей задачи.
Операторы языка С++. Определение, пустой оператор, составной оператор.
Самый простой вид оператора — оператор выра/
жение. Он включает в себя выражение, за которым
следует точка с запятой.
К примеру:
a = b*3 + c;
cout << «go go go»; lseek(fd,0,2);
Простейший оператор — пустой оператор:
;
Он не делает ничего. Но он используется тогда, ког/
да синтаксис требует присутствия оператора, а дан/
ный оператор не нужен
Составной оператор представляет собой несколько операторов и объявлений, заключенных в фигурные скобки:
{ [oбъявление] : оператор; [оператор]; : }
Заметим, что в конце составного оператора точка с запятой не ставится.
Выполнение составного оператора заключается в последовательном выполнении составляющих его операторов.
Пример:
int main () { int q,b; double t,d; : if (...) { int e,g; double f,q; : } : return (0); }
Переменные e,g,f,q будут уничтожены после выполнения составного оператора. Отметим, что переменная q является локальной в составном операторе, т.е. она никоим образом не связана с переменной q объявленной в начале функции main с типом int. Отметим также, что выражение стоящее после return может быть заключено в круглые скобки, хотя наличие последних необязательно.
Операторы языка С++. Операторы выбора.
- операторы выбора (ветвлений);
оператор switch - оператор ветвлений
к операторам выбора также относится оператор условия if
if ( expression )
statement1
[else
statement2]
Нельзя использовать в операторе switch вещественные типы
данных (такие как float и double), указатели, строки и другие струк-
туры данных, но разрешается использовать элементы структур дан-
ных, совместимых с целыми значениями.
Операторы языка С++. Операторы цикла.
- операторы организации циклов;
служат для выполнения одной и той же группы операторов итеративно.
Различают циклы с предусловием while, пост условием do и цикл с заданным количеством итераций for
while ( expression )
statement
Операторы языка С++. Операторы передачи управления.
- операторы перехода (передачи управления);
к операторам перехода относятся операторы изменяющие обычный последовательный ход исполнения программы -
break, continue, return, goto
оператор break аналогичен оператору break в delphi - служит для немедленного выхода из цикла for, while и do, кроме того используется для выхода из ветви оператора switch (в delphi для этих целей не применяется)
оператор continue аналогичен оператору continue в delphi - служит для немедленного перехода к следующей итерации цикла for, while и do
оператор return
return [expression]
служит для возврата из функции или процедуры. Если выполняется возврат из функции, то значение выражения expression возвращается в качестве результата. Для функций void (процедур) никакого результата не возвращается.
Для возврата из процедуры (функция с результатом void) специального вызова return не требуется. Выполнение процедуры будет закончено там, где кончаются ее логические скобки.
оператор goto служит для безусловной передачи управления на указанную метку -
goto identifier ;
Адреса и указатели. Понятие адреса, операция получения адреса, понятие указателя, доступ к переменной по указателю, операция разименования.
Основной операцией при работе с указателями является получение доступа к значению, адрес которого хранится в указателе.
Например:
int *pn, n;
*pn = 5;
n = *pn;
Выражение *pn имеет такой же смысл, как имя целой переменной. Операция <<*>> называется разыменованием.
Действие, обратное к разыменованию, позволяет получить адрес переменной по ее имени. Например, pn = &n;, эта операция называется взятие адреса.
Указатель — элемент программы хранящий адреса памяти некоторого объекта (например, переменной) определённого типа.
Си поддерживает две специальные адресные операции: опера-
цию определения адреса (&) и операцию обращения по адресу (*).
Операция & возвращает адрес данной переменной. Если sum яв-
ляется переменной типа int, то &sum является адресом (расположе-
нием в памяти) этой переменной. С другой стороны, если msg явля-
ется указателем на тип char, то *msg является символом, на кото-
рый указывает msg. Рассмотрим следующую программу:
main()
{
int sum;
char *msg;
sum = 5 + 3;
msg = "Hello, thore\n";
printf(" sum = %d &sum = %p \n", sum, &sum);
printf("*msg = %c msg = %p \n", *msg, msg);
}
В первой строке печатается два значения: значение sum (8) и ад-
рес sum (назначаемый компилятором). Во второй строке также пе-
чатается два значения: символ, на который указывает msg (H), и
значение msg, которое является адресом этого символа (также на-
значен компилятором).
Адреса и указатели. Понятие указателя, обобщенный указатель.
Указатель — элемент программы хранящий адреса памяти некоторого объекта (например, переменной) определённого типа.
Указатели. Инициализация указателей. Операции с указателями.
Способы инициализации указателей
Присваивание указателю адреса существующего объекта:
с помощью операции получения адреса:
int а = 5; // целая переменная
int* р = &а; //в указатель записывается адрес а
int* р (&а); // то же самое другим способом
с помощью значения другого инициализированного указателя:
int* r = р;
с помощью имени массива или функции, которые трактуются как адрес:
int b[10]; // массив
int* t = b; // присваивание адреса начала массива
...
void f(int а ){ /* ... * / } // определение функции
void (*pf)(int); // указатель на функцию
pf = f; // присваивание адреса функции
Присваивание указателю адреса области памяти в явном виде:
char* vp = (char *)0хВ8000000;
Здесь 0хВ8000000 — шестнадцатеричная константа, (char *) — операция приведения типа: константа преобразуется к типу «указатель на char».
Присваивание пустого значения:
int* suxx = NULL;
int* rulez = 0;В первой строке используется константа NULL, определенная в некоторых заголовочных файлах С как указатель, равный нулю. Рекомендуется использовать просто 0, так как это значение типа int будет правильно преобразовано стандартными способами в соответствии с контекстом. Поскольку гарантируется, что объектов с нулевым адресом нет, пустой указатель можно использовать для проверки, ссылается указатель на конкретный объект или нет.
Выделение участка динамической памяти и присваивание ее адреса указателю:
с помощью операции new:
int* n = new int; //1
int* m = new int (10); // 2
int* q = new int [10]; // 3
с помощью функции malloc (для того чтобы использовать malloc, требуется подключить к программе заголовочный файл <malloc.h>.)
int* u = (int *)malloc(s1zeof(int)); // 4
С указателями можно выполнять следующие операции:
разадресация, или косвенное обращение к объекту (*)
присваивание,
сложение с константой,
вычитание,
инкремент (++),
декремент (—),
сравнение,
приведение типов.
Функции. Прототип функции, определение функции, вызов функции, встраиваемые функции.
Прототип функции (function prototype) — это объявление функции, но не ее определение. Благодаря явному объявлению возвращаемого типа и списка типов аргументов, в C++ при обращении к функции возможны строгая проверка типов и неявные преобразования типов.
Итак, функция может быть объявлена до того, как она определена. Определение функции может идти позже в этом же файле, браться из библиотеки или из указанного пользователем файла. Прототип функции имеет следующую форму:
тип имя(список_объявлений_аргументов);
Функция printf () из стандартной библиотеки stdio.h имеет следующий прототип:
int printf(const char* cntrl_str, ...);
Функция (в программировании) - это фрагмент кода или алгоритм, реализованный на каком-то языке программирования, с целью выполнения определённой последовательности операций. Итак, функции позволяют сделать программу модульной, то есть разделить программу на несколько маленьких подпрограмм (функций), которые в совокупности выполняют поставленную задачу.
/* Определение функций */
void get_parms(float *p1, float *p2)
{
printf("Введите два числа: ");
scanf("%f %f", p1, p2);
}
float get_ratio(float divident, float divisor)
{
if (divisor == 0.0)
return (INFINITY);
else
return(divident / divisor);
}
void put_ratio(float ratio)
{
if (ratio == INFINITY)
printf("Внимание! Деление на ноль!\n");
else
printf("Результат деления двух чисел: %f\n",ratio);
}
Функции. Механизмы передачи параметров в функцию.
Ссылки. Передача параметров в функцию по ссылке.
Ссылки – особый тип данных, являющийся скрытой формой указателя, который при использовании автоматически разименовывается. Ссылка может быть объявлена как другим именем, так и как псевдоним переменной, на которую ссылается.
// структура объявления ссылок
/*тип*/ &/*имя ссылки*/ = /*имя переменной*/;
При объявлении ссылки перед её именем ставится символ амперсанда "&", сама же ссылка должна быть проинициализирована именем переменной, на которую она ссылается.
#include "stdafx.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
int value = 15;
int &reference = value; // объявление и инициализация ссылки значением переменной value
cout << "value = " << value << endl;
cout << "reference = " << reference << endl;
reference+=15; // изменяем значение переменной value посредством изменения значения в ссылке
cout << "value = " << value << endl; // смотрим, что получилось, как будет видно дальше значение поменялось как в ссылке,
cout << "reference = " << reference << endl; // так и в ссылочной переменной
system("pause");
return 0;
Функции. Область видимости локальных и глобальных переменных.
переменные, объявленные внутри функции, называются локальными. Локальные переменные имеют свои области видимости, этими областями являются функции, в которых объявлены переменные.
Глобальные переменные объявляются вне тела какой-либо функции, и поэтому область видимости таких переменных распространяется на всю программу. Обычно глобальные переменные объявляются перед главной функцией, но можно объявлять и после функции main(), но тогда данная переменная не будет доступна в функции main().
#include "stdafx.h"
#include <iostream>
using namespace std;
void example();
int variable = 48; // инициализация глобальной переменной
int main(int argc, char* argv[])
{
int variable = 12; // инициализация локально переменной
cout << "local variable = " << variable << endl; // печать значения содержащегося в локальной переменной
example(); // запуск функции
system("pause");
return 0;
}
Области действия идентификаторов: блок, файл, функция, прототип функции, класс, поименованная область.
Блок. Идентификаторы, описанные внутри блока, являются локальными. Область действия идентификатора начинается в точке определения и заканчивается в конце блока, видимость — в пределах блока и внутренних блоков, время жизни — локальное. После выхода из блока память освобождается.
Файл. Идентификаторы, описанные вне любого блока, функции, класса или пространства имен, имеют глобальную видимость и время жизни и могут использоваться с момента их определения.
Функция. Единственными идентификаторами, имеющими такую область действия, являются метки операторов. В одной функции все метки должны различаться, но могут совпадать с метками других функций.
Прототип функции. Идентификаторы, указанные в списке параметров прототипа (объявления) функции, имеют областью действия только прототип функции.
Класс. Элементы структур, объединений и классов (за исключением статических элементов) являются видимыми лишь в пределах класса. Они образуются при создании переменной указанного типа и разрушаются при ее уничтожении.
Поименованная область. С++ позволяет явным образом задать область определения имен как часть глобальной области с помощью оператора namespace.