Определение и описание переменных 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Определение и описание переменных



В зависимости от способа определения переменной и его места размещения в программе явно, либо по умолчанию всегда определяются следующие её свойства:

· тип переменной;

· класс памяти (задаёт размещение переменной);

· продолжительность существования переменной;

· сфера действия имени переменной;

· видимость переменной;

· тип компоновки.

О типах и их свойствах, задаваемых при определении переменных, уже говорилось ранее. В общем виде определение переменных имеет следующий формат:

[s] [m] тип имя1 [иниц.1], имя2 [иниц.2], …;

где s - спецификатор класса памяти (auto, static, extern, register); m – модификатор const или volatile; тип – один из типов данных (основной или определенный программистом); имя – идентификатор; иниц. – необязательный инициализатор, определяющий начальное значение соответствующего объекта. В квадратных скобках указаны параметры, которые можно опустить при определении, задав тем самым их значения по умолчанию.

Синтаксис инициализатора (иниц.) переменной:

= инициализирующее выражение

либо

(инициализирующее выражение)

Пример:

const double pi = 3.1415; /*Определяется и инициализируется именованная статическая константа pi */

extern const double pi; // Описание константы pi

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

Модификаторы:

volatile (переменный) – ключевое слово (модификатор), которое сообщает, что значение переменной может быть изменено во время выполнения программы. Модификатор volatile практически никогда не употребляется в тексте программ, так как по умолчанию все переменные являются volatile.

const (постоянный) – ключевое слово (модификатор), которое сообщает, что значение переменной не может быть изменено во время выполнения программы. Модификатор const позволяет переопределить заданный по умолчанию при определении переменных модификатор volatile. Используется для создания именованных констант, например: const double PI = 3.14159; //определяется именованная константа PI.

Классы памяти:

auto – автоматически выделяемая, локальная память. Спецификатор auto может быть задан только при определении объектов блока, например, в теле функции. Этим объектам память выделяется при входе в блок и освобождается при выходе из него. Вне блока объекта класса auto не существует. Необходимость явно использовать спецификатор класса памяти auto в тексте программы практически всегда отсутствует, так как все переменные, определенные внутри блока по умолчанию, являются локальными, т.е. по умолчанию имеют спецификатор auto;

register – автоматически выделяемая, по возможности регистровая память. Спецификатор register аналогичен auto, но для размещения значений объектов используются регистры, а не участки основной памяти. Такая возможность имеется не всегда, и в случае отсутствия регистровой памяти (если регистры заняты другими данными) объект класса register компилятор обрабатывает как объект auto. Спецификатор register также практически не используется в тексте программ, так как компилятор очень часто сам оптимизирует код или по скорости выполнения, или по его размеру, тем самым самостоятельно решая какие переменные сделать register, а какие нет.

static – внутренний тип компоновки и статическая продолжительность существования. Объект, описанный со спецификатором static, будет существовать в пределах того файла с исходным текстом программы (модуля), где он определен. Класс памяти static может приписываться переменным и функциям. Спецификатор static используется в программах довольно часто, так как позволяет переопределить используемый по умолчанию для определенных внутри блока переменных спецификатор auto, тем самым сделав их статическими, а не локальными;

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

Переменные со статической продолжительностью существования существуют с момента запуска программы и до момента окончания её работы. Фактически, память под такие переменные отводится в сегменте данных программы, т.е. в исполняемом файле программы (*.exe) есть соответствующее типу переменной количество байт, в которых хранится значение статической переменной.

По определению статическими переменными являются переменные, определенные вне любого блока ({}), либо переменные, определенные в блоке со спецификатором static. Переменная, определенная вне любого блока ({}), называется также глобальной и по умолчанию имеет класс памяти extern. Сфера действия имени глобальной переменной, другими словами, фрагмент программы, где можно с помощью имени обратится к переменной, у глобальной переменной совпадает с областью существования, т.е. является вся программа.

При запуске программы на выполнение помимо памяти, требуемой под выполняемую программу (exe – файл), необходима дополнительная память (стек, куча), которая запрашивается у операционной системы. В зависимости от выполняемого фрагмента программы количество дополнительно используемой памяти может становиться больше или меньше. Именно в этой дополнительной памяти создаются и уничтожаются автоматические переменные. Таким образом, продолжительность существования локальной автоматической переменной - это не всё время выполнения программы, а только время, в течение которого выполняется какой-то её фрагмент.

По определению любая переменная, определенная внутри блока ({}) без спецификатора static, является локальной автоматической, а со спецификатором static – локальной статической. Область существования локальной автоматической переменной ограничена, начиная с места определения её в программе и заканчивая концом блока, в котором эта локальная переменная определена, а областью существования локальной статической переменной является вся программа. Сфера действия имени у локальной статической и автоматической переменных совпадает. Она начинается с места их определения в программе и заканчивается концом блока, в котором эти локальные переменные определены. Помимо этого, формальные параметры в определении функции также являются локальными автоматическими переменными, область существования которых ограничена телом функции. Формальные параметры в описании функции – это тоже локальные автоматические переменные, область существования которых ограничена строкой программы, содержащей описание этой функции. Пример:

//Программа 3.1

#include "stdafx.h"

#include <iostream> //1

int pr = 7; /*2. Определение глобальной статической переменной pr. Область существования этой переменной pr  вся программа. */

int sum(int pa, int pr); /*3. Описание функции sum(), в которой два формальных параметра: pa и pr. Область существования pa и pr  только эта строка программы. */

void main(){ //4.

int pr = 8; /*5. Определение локальной переменной pr. Область существования pr c момента определения до конца тела функции main(), т.е. с 5 по 13 строки программы. */

std::cout<<"\n 1. sum(pr, 3) = "<<sum(pr, 3); /*6. Вызов функции sum()*/

{ //7. Начало нового блока

int pr = 9; /*8. Определение локальной переменной pr. Область существования pr c момента определения до конца блока, т.е. с 8 по 11 строки программы. */

std::cout<<"\n 2. sum(pr, 3) = "<<sum(pr, 3); /*9. Вызов функции sum()*/

std::cout<<"\n 3. sum(::pr, 3) = "<<sum(::pr, 3); /*10. Вызов функции sum()*/

} //11. Конец блока

std::cout<<"\n 4. sum(::pr, 3) = "<<sum(::pr, 3);/*12. Вызов функции sum()*/

getchar();

} //13. Конец тела функции main()

int sum(int z, int pr){ /*14. Определены две локальные переменные z и pr. Область существования – тело функции sum(), т.е. 14 – 18 строки программы. */

static int count = 0; /*15. Определение локальной статической переменной count. Область существования  вся программа. */

count ++; //16.

return z+pr; //17.

}

В этой программе в строках 1, 2, 4, 7, 13 определены переменные pr. Все эти переменные абсолютно разные, они хранят свои значения в разных фрагментах памяти, область существования у них тоже разная, единственное, что их объединяет - это имя.

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

Рис. 3.1. Видимость объектов, связанных с одним идентификатором (именем) в однофайловой программе

 

На рис. 3.1 прямоугольниками показаны области существования переменных pr. Стрелками обозначено, к какой конкретно переменной происходит обращение при использовании имени pr в программе. Таким образом, определение локальной переменной с таким же именем, как и у глобальной, делает невидимой глобальную переменную, но к ней можно получить доступ, если применить операцию указания области видимости (::), что и продемонстрировано в 10 и 12 строках. Интересен тот факт, что доступ к локальной переменной pr, определенной в 5 строке из строк с 7 по 11, невозможен никаким способом. Отметим также, что глобальные переменные видны во всей программе и поэтому их можно использовать в теле функций, передавая через них данные.

Переменная count – это статическая переменная, поэтому область её существования - вся программа, но так как она локальная, то сфера действия имени этой переменной заключена в пределах, начиная с её определения и до конца тела функции sum(), т.е. строки с 15 по 18. К этой переменной нельзя обратиться за пределами указанного диапазона.

Особенность использования локальных статических переменных заключена в том, что они не уничтожаются при выходе из функции, как локальные автоматические. Это значит, что в них функции могут хранить какие-то данные в промежутках между своими вызовами. Строка 15 фактически ни разу не выполняется в программе при вызове функции sum(), т.е. во время выполнения в строке 15 не создаётся и не инициализируется нулевым значением новая переменная. Она уже была создана и инициализирована нулевым значением на этапе компиляции. Поэтому при вызове функции sum() значение count не обнуляется в строке 15; в строке 16 оно увеличивается на единицу и хранится до следующего вызова sum(). Таким образом, с помощью локальной статической переменой count подсчитывается количество вызовов функции sum().

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

Если программа состоит более чем из одного файла (модуля), то глобальная переменная, определенная в одном файле, может быть доступна в другом файле программы, а может быть и нет. Доступность глобальной переменной определяется типом компоновки. Внешний тип компоновки означает, что одна и та же глобальная переменная может быть видна в нескольких файлах программы; внутренний тип компоновки означает, что глобальная переменная видна только в том файле, в котором она определена. Пример:

//Программа 3.2

Файл 1.cpp Файл 2.cpp
#include "stdafx.h" #include <iostream> //1 int fst = 1; //2 int snd = 3; //3 void printFst(); //4 void printSnd(); //5 void main(){ //6 std::cout<<"\n fst = "<<fst;//7 printFst(); //8 printSnd(); //9 getchar(); } //10   #include "stdafx.h" #include <iostream> //11 static int fst = 2; //12 extern int snd; //13 void printFst(){ //14 std::cout<<"\n fst = "<<fst;//15 } //16 void printSnd(){ //17 std::cout<<"\n snd = "<<snd;//18 } //19  

Результаты работы программы:

fst = 1

fst = 2

snd = 3

Текст программы размещён в двух файлах (модулях) 1.срр и 2.срр. В файле 1.срр в строках 2 и 3 определены две глобальные переменные fst и snd с внешним типом компоновки, которая даёт возможность доступа к этим переменным из другого модуля. Для того чтобы реализовать эту возможность, необходимо описать переменные в другом модуле так, как показано на примере переменной snd в строке 13 модуля 2.срр. В строке 12 модуля 2.срр определена глобальная переменная fst с внутренним типом компоновки, которая может быть доступна только в модуле 2.срр и никак не связана с переменной fst из строки 2. Таким образом, в программе определены три глобальные переменные, причём snd доступна в обоих модулях, а переменные fst только в том модуле, где они определены.

Сказанное подтверждается результатами выполнения программы. В функции main() сначала печатается переменная fst, определенная в модуле 1.срр, затем вызываются функции printFst() и printSnd(), определение которых размещено в модуле 2.срр. Функция printFst() выводит на экран значение переменной fst из второго модуля, а не из первого. Функция printSnd() выводит на экран значение переменной snd, которое стало доступно в нем благодаря описанию в строке 13.

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

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

Всё вышесказанное относится не только к переменным основных типов данных, но и ко многим объектам (массивам, указателям, ссылкам, объектам типов, определенных пользователем и т.д.) языка Си++. Поэтому понимание этого материала особенно важно для дальнейшего изучения языка. Ниже дана таблица способов определения объектов и их свойств

 

Таблица 3.1

Объекты и их свойства

Способ определения объекта Вид объекта Свойства объекта
Определен вне блока Глобальный Статическая продолжительность существования. Область видимости - вся программа. Возможен либо внутренний, либо внешний тип компоновки. Класс памяти extern либо static
Определен в блоке со спецификатором static Локальный статический Статическая продолжительность существования. Область видимости с момента определения до конца блока. Возможен только внутренний тип компоновки. Класс памяти static
Определен в блоке, в описании функции или в списке формальных параметров функции Локальный автоматический Локальная продолжительность существования. Область видимости с момента определения до конца блока. Возможен только внутренний тип компоновки. Класс памяти auto либо register
Определен с помощью функции void*malloc(int) или оператора new. Уничтожен с помощью функции free(void*) или оператора delete Объект с динамической продолжительностью существования Существует с момента создания с помощью вызова функции malloc() или оператора new и до момента уничтожения с помощью вызова функции free() или оператора delete. Объект определяется внутри блока (тела функции), но при выходе за пределы блока не уничтожается так, как локальный статический объект. Программист должен обеспечить видимость объекта за пределами блока для того, чтобы, когда объект перестанет быть нужен, иметь возможность его уничтожить.

 

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

 

3.2. Явное и неявное преобразование типа

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

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

(type) операнд // каноническая форма

type (операнд) // функциональная форма

где type – основной, составной или определенный пользователем тип данных; операнд – константа, переменная или структурированный объект произвольного типа. Результатом выполнения операции явного преобразования типа является создание неименованного объекта типа type, который инициализируется значением операнда.

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

Примеры:

long k = 123456789; /* Определение переменной k (задаётся её тип – long и значение) */

float g = float(k); /* В соответствии с таблицей приоритетов операций сначала выполняется операция преобразования типа, т.е. float(k). Результатом выполнения этой операции является создание неименованной переменной типа float, которая инициализируется в данном случае с потерей точности значением переменной k. При этом ни тип, ни значение переменной k не изменяются. Далее определяется переменная g типа float, которая инициализируется значением неименованной переменной. Область существования неименованной переменной – данная строка программы. При переходе к следующей строке программы неименованная переменная уничтожается.*/

cout<<”\n float(k) = “<<float(k); /*Оператор выведет на экран (float(k) = 1.234567e+08) результат операции преобразования типа, на примере которого можно видеть, что младшие разряды отброшены. */

double pi = 3.14159;

cout<<”\n int(pi) = “<<int(pi); /*Результатом выполнения этих строк программы будет вывод строки программы int(pi) = 3 на экран монитора. Дробная часть числа отброшена. */

cout<<”\n double(k) = “<<double(k); /* Результат (double(k) = 1.23456789е+08) потеря точности при преобразовании типа не происходит, так как число double имеет 15 значащих цифр. */

Кроме явного преобразования типа для арифметических операций и арифметических типов данных в языке Си++ определена операция неявного преобразования типа. Суть её состоит в том, что если в арифметической операции участвуют два операнда разного типа, то происходит неявное преобразование типа одного операнда к типу другого и только после этого происходит выполнение операции. Из двух возможных типов операндов компилятор всегда выбирает наиболее точный (в соответствии со схемой, изображенной на рис. 3.2) и преобразует к нему один из операторов. Этот же тип является типом результата операции.

Рис. 3.2. Схема арифметических преобразований типов, гарантирующих сохранение значимости

 

Из рис. 3.2 видно, что если в арифметической операции участвуют два операнда, например, типа int и double, то операнд типа int будет неявно преобразован к типу double, так как double точнее int, затем выполнится арифметическая операция, результат которой будет иметь тип double. Пример:

int f = 2;

double e = 2.71;

f = e*f; /*f неявно преобразуется к типу double; выполняется операция умножения; результат операции равен 5.42 и имеет тип double. */

f= 1-e; /* константа единица имеет тип int, который по умолчанию преобразуется к типу double, выполняется операция вычитания; результат операции равен -1.71 типа double.*/

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

int a =1, b = 2;

double f = 1;

f = a/b*f+a*f/b;

cout<<”\n f = “<<f; /* На экран монитора выводится результат f = 0.5, хотя логичнее было бы предположить, что результат должен быть равен единице. */

Полученный результат объясняется тем, что операции в выражении выполняются последовательно друг за другом в строгом соответствии с их рангом и направлением ассоциативности. Следовательно, первой выполнится операция (a/b). Оба операнда у неё имеют тип int, поэтому неявного преобразования типа не происходит; результатом операции является неименованная переменная типа int, значение которой равно нулю (дробная часть при делении целых чисел отбрасывается). Второй выполняется операция умножения неименованной переменной типа int на переменную f типа double, в результате умножения нуля типа int на единицу типа double получаем ноль типа double. Далее выполняется операция (а*f), в результате получаем единицу типа double. Единица типа double делится на переменную b типа int, получаем 0.5 типа double. Ноль типа double складывается с 0 типа double, получаем 0.5 типа double. Результат выполнения выражения a/b*f+a*f/b равен 0.5 типа double.

Таким образом, потеря точности произошла во время выполнения одной из операций (в данном случае a/b) и значение всего выражения стало не тем, которое можно было бы ожидать. Приведём ещё несколько примеров

int a = 10000, b = 5;

double c = 1.;

c = a*b/c; /* потеря точности происходит при выполнении операции a*b. Так как оба операнда имеют тип int, то результат тоже будет иметь тип int. Но в результате выполнения операции a*b получается значение 50000, которое выходит за допустимый диапазон значений переменных типа int. Поэтому значение выражения a*b/c будет непредсказуемо. */

unsigned int a = 5, b=70;

double k = 1;

k = k*(a-b);. /*Результат выполнения операции (a-b) имеет тип unsigned int, а число –65 выходит за допустимый диапазон значений типа unsigned int, поэтому значение выражения k*(a-b) будет непредсказуемо. */

k = 1/2*b; /*Значение выражения 1/2*b равно нулю. Так как первой выполняется операция деления, оба операнда - целые константы. Следовательно, результат выполнения операции тоже будет иметь тип int и будет равен нулю (при делении целых операндов дробная часть отбрасывается). Чтобы получить правильный результат, нужно сделать хотя бы одну константу константой вещественного типа. Для этого рядом с ней нужно поставить точку 1./2*b. */

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

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

int k;

double pi= 3.1415;

k = pi; /*Создаётся неименованная переменная типа int, которая инициализируется значением переменной pi; при этом происходит потеря точности. Ни тип, ни значение переменной pi не изменяются. После этого значение неименованной переменной присваивается переменной k.*/

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

Проектные задания

1. Набрать и отладить прогграмму 1.1. Модифицировать программу так, чтобы по центру экрана выводилось Фамилия И.О. учащегося.

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

3. Запишите свою фамилию, используя управляющие символы ESC-последовательности и ASCII коды таблицы 1251 – MS Windows.

4. В выражении (3+4>5 && 3+5 > 4 && 4+5>3) содержится 8 операций. Пометьте цифрами, в какой последовательности будут выполняться эти 8 операций. Найдите вручную, чему равно значение выражения (3+4>(5 && 3)+5 > 4 && 4+5>3). Объясните почему

5. Приведите примеры явного и неявного преобразования типов данных при выполнении арифметических операций и операции присваивания.

6. Напишите функцию, вычисляющую модуль, и функцию, вычисляющую аргумент комплексного числа.

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

8. Набрать и отладить программу 2.8. Модифицировать её так, чтобы найти значения sin(π/4), cos(π/4) и tg(π/4)

9. Набрать и отладить программу 3.1, выполнить её в пошаговом режиме. Рассказать какой тип, класс памяти, продолжительность существования, сфера действия имени, видимость и тип компоновки имеют все переменные в данной программе.

10. Набрать и отладить программу 3.2. Убедится в том, какие значения принимают глобальные переменные с внутренней и внешним типом компоновки.

 

Тесты рубежного контроля

1. Какие типы данных, из перечисленных ниже, являются вещественными?

a) double

b) Int

c) Long

2. Какие типы данных из перечисленных ниже являются целыми?

a) Long

b) Float

c) Long double

3. сколько байтов занимает тип long

a) 1

b) 4

c) 8

4. В каком диапазоне могут изменяться значения типа char?

a) 0…255

b) -128…127

5. Укажите, какая из предложенных констант является константой типа double

a) 1

b) 1.L

c) 1.

6. Укажите, какая из предложенных констант, является константой типа int

a) 2.

b) 2L

c) 2

7. Укажите, какая из предложенных констант, является строковой.

a) ‘A’

b) “A”

8. Какой из управляющих символов является символом перевода каретки на новую строку

a) \t

b) \n

c) \r

9. После компиляции C программы компилятор создаёт файлы с расширением:

a) *.exe

b) *.lib

c) *.obj

10. Выберите, какой из идентификаторов записан неверно

a) 1Array

b) temp

c) obj

11. Унарная операция – это операция с

a) двумя операндами

b) тремя операндами

c) одним операндом

12. Какой из предложенных ниже символов не является операцией в языке Си++

a) ()

b),

c) #

13. Чему равно значение выражения 3&7

a) 1

b) 3

c) 7

14. Чему равно значение выражения 3&&7

a) 1

b) 3

c) 7

15. Чему равно значение выражения 3|7

a) 1

b) 3

c) 7

16. Чему равно значение выражения 3||7

a) 1

b) 3

c) 7

17. Чему равно значение выражения 15%8

a) 1

b) 3

c) 7

18. Чему равно значение переменной k = 1; k*=3+4;

a) 1

b) 3

c) 7

19. В какой последовательности выполняются операции в следующем выражении -1+2*3

a) - + *

b) - +

c) + -

d) - * +

20. Что такое описание функции

a) тип имя_функции(список формальных параметров);

b) тип имя_функции(список формальных параметров){тело функции}

c) имя_функции(список фактических параметров);

21. Что такое определение функции

a) тип имя_функции(список формальных параметров);

b) тип имя_функции(список формальных параметров){тело функции}

c) имя_функции(список фактических параметров);

22. Что такое вызов функции

a) тип имя_функции(список формальных параметров);

b) тип имя_функции(список формальных параметров){тело функции}

c) имя_функции(список фактических параметров);

23. Сколько в вызове функции fun(fun1(3)+fun2(5), 2+fun4()); фактических параметров

a) 2

b) 3

c) 4

24. Поясните, с помощью какого оператора функция возвращает значение в точку вызова.

a) Goto

b) Break

c) return

25. Какой тип возвращаемого в точку вызова значения функции int fun(double, long)?

a) int

b) double

c) long

26. Чем является запись extern int k;

a) определениеv переменной k

b) описанием переменной k

27. Функция с определением void fun(){static int k=0; k++;} вызывается три раза. Чему равно значение переменной k после третьего вызова

a) 1

b) 2

c) 3

28. Функция с определением void fun(){int k(0); k++;} вызывается три раза. Чему равно значение переменной k после третьего вызова

a) 1

b) 2

c) 3

29. Какие переменные называются локальными?

a) переменные, определённые в блоке или в списке формальных параметров функции.

b) переменные, определённые за пределами блока

30., Какие переменные называются глобальными?

a) переменные, определённые в блоке или в списке формальных параметров функции.

b) переменные, определённые за пределами блока

31. Где содержатся описания библиотечных функций

a) в библиотеке

b) в заголовочном файле

c) в настройках проекта

32. Какое значение будет иметь переменная k после выполнения следующих двух строк программы float k = 3.14; long g = long(k);

a) 3

b) 3.14

33. Какое типу будет пренадлежать переменная k после выполнения следующих двух строк программы float k = 3.14; long g = long(k);

a) long

b) float

34. Чему равно значение переменной f после выполнения следующих трёх строк программы int a =1, b = 2; double f = 1; f = a/b*f+a*f/b;

a) 1

b) 0.5

c) 2

35. Чему равно значение переменной f после выполнения следующей строк программы double f = 1/2 * 2;

a) 0

b) 1

c) 2

Таблица правильных ответов

№ Вопроса Правильный ответ № Вопроса Правильный ответ
  a   d
  a   a
  b   b
  b   c
  c   a
  c   c
  b   a
  b   b
  c   c
  a   a
  c   a
  c   b
  b   b
  a   b
  c   b
  a   b
  c   a
  c    

 

Квалиметрическая оценка

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

от 85 до 100% - это отлично;

от 70 до 84% - это хорошо;

от 55 до 69% - это удовлетворительно;

менее 55% - это не удовлетворительно.

 

 

Список литературы

1. В.В. Подбельский Язык Си++: Учебное пособие. - 5-е изд. - М.: Финансы и статистика, 2000. - 560с. ил.

2. Ален И. Голуб. Си и Си++ правила программирования. - М.: БИНОМ, 1996. - 272с.

3. Бьерн Страуструп Язык программирования Си++. 3-е изд. /Пер. с англ. - СПб.; М.: «Невский диалект» - «Издательство БИНОМ», 1999. - 991с. ил.

 

МОДУЛЬ 2

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

4. ОПЕРАТОРЫ ЯЗЫКА Си++

Операторы алгоритмических языков программирования являются средством, с помощью которого программист записывает последовательность действий, которую необходимо выполнить вычислительной машине для решения какой-то конкретной задачи. В информатике такую последовательность действий называют алгоритмом. Алгоритм обычно может быть представлен или в графической форме, или в виде текстового описания. Знание алгоритмов решения, хотя бы типовых задач, обычно встречающихся в профессиональной области обучаемого, является залогом успеха его успеваемости по информатике.

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

 



Поделиться:


Последнее изменение этой страницы: 2016-08-10; просмотров: 778; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 34.234.83.135 (0.258 с.)