Объявления переменных

При объявлении переменных отступ слева устанавливается таким же, как и для операторов данного уровня вложенности. Допускается отдельное выравнивание типов переменных и их имен.

int intVar;

char charVar;

float floatVar;

double doubleVar;

long int longVar;

При объявлении указателей символ * «прижимается» к имени переменной, а не к типу. Это позволяет избежать проблем, связанных с объявлением нескольких указателей в одной строке.

char *s1, *s2;

int *n;

Функции

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

Скобки, содержащие список параметров, «прижимаются» к имени функции. Этим подчёркивается тесная связь параметров функции и её имени.

Если функция возвращает указатель, то символ * по отношению к имени функции размещается так же, как и по отношению к имени переменной при объявлении указателя.

void *my_malloc(int blockSize);

Аналогичным образом оформляется и вызов функции: пробел перед скобками с параметрами функции не ставится.

int *p;

p = my_malloc(500);

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

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

int myFunc()

{

static i = 0;

return i++;

}

Правила именования

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

void myPrintSomeText();

int someVariable;

Символические константы записываются целиком в верхнем регистре.

#define MAX_INDEX 2000

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

struct mystruct

{

int field1;

char *field2;

} structvar;

union pole

{

int n;

float m;

char s;

} unionvar;

enum weekday {Sun,Mon,Tue,Wed,Thu,Fri,Sat};

Массивы

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

int mas[1000];

printf(“%d\n”,2 * mas[5] + 3);

Многомерные массивы индексируются следующим образом:

a = c + mas[5][13] * 84;

Отступы

Отступ от левого края экрана для данной строки определяется степенью её вложенности в различные операторные блоки. Для каждого уровня вложенности добавляется по 2 пробела. Блоки с наименьшей степенью вложенности записываются без отступа.

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

#include <stdio.h>

int n = 10;

int main()

{

printf(“%d\n”,n);

}

Приложение 2.
Borland C++ 3.1

Одной из распространенных сред разработки программ на языке Си является Borland C++ 3.1. IDE (интегрированная среда разработки) представляет собой программу, совмещающую в себе специализированный редактор исходных текстов программ, компилятор Си и C++, отладчик. Эта программа разработана для операционной системы MS DOS, однако может быть запущена в Windows.

Во время установки в корневой папке IDE (в нашем примере W:\TCpp) создаются подпапки, основными из которых являются:

Bgi Содержит драйверы видеоадаптера и наборы шрифтов.
Bin Содержит файлы программ и используемых ими библиотек
Include Содержит заголовочные файлы
Lib Содержит откомпилированные файлы библиотек

В папке Bin содержатся файлы программ. Наиболее часто используемыми являются:

Tlink.exe Линковщик
Сpp.exe Препроцессор
Tc.exe IDE (интегрированная среда разработки)
Tcc.exe Компилятор

Хотя исходный текст программы можно набрать в любом редакторе, а затем, воспользовавшись препроцессором, компилятором и компоновщиком, получить исполняемый файл, намного удобнее работать с IDE. Для того, чтобы открыть ее, запустите Tc.exe.

Перед началом работы необходимо настроить некоторые параметры среды. В частности необходимо указать директории, в которых расположены заголовочные файлы и файлы библиотек. Выберите пункт меню Options -> Directories и, в появившемся окне, в полях “Include Directories” и “Library Directories” введите пути к соответствующим директориям, например, “W:\TCpp\Include” и “W:\TCpp\Lib”. Кроме того, нужно указать компилятору, какого рода исполнимый файл следует создавать, для этого выберите пункт меню Options -> Application и нажмите на кнопку, с надписью “DOS Standard”. Т.к. описываемая IDE предназначена также для создания программ на C++, необходимо позаботиться о том, чтобы создаваемые вами программы компилировались в Си. Для этого выберите пункт меню Options -> Compilers -> C++ options и установите переключатель “Use C++ Compiler” в положение “CPP extension”. Это означает, что в C++ будут компилироваться только программы, исходный текст которых находится в файлах с расширением “cpp”. Из этого следует, что создаваемые вами программы должны иметь расширение “c”.

Кроме описанных выше установок, большинство программистов предпочитают установить режим автоматического сохранения исходного текста программ и среды окружения при каждой компиляции. Это можно сделать, установив галочки напротив всех пунктов блока Auto-Save в окне Options -> Environment -> Preferences.

Теперь IDE готова к работе. Чтобы начать работу, создайте новый файл или откройте уже существующий (меню File) и, набрав исходный текст программы, нажмите ctrl+F9, для того, чтобы запустить процесс компиляции. Если исходный текст программы не содержал ошибок, программа будет запущена на выполнение.

Исходный текст вашей первой программы может иметь приблизительно следующий вид:

#include <stdio.h>

void main()

{

printf("Hello world!");

}

После того, как программа закончит свою работу, можно просмотреть ее вывод, нажав комбинацию клавиш Alt+F5.

Приложение 3.
Microsoft Visual C++

Другим средством разработки программ является пакет Microsoft Visual C++. Он разработан для операционных систем семейства Windows. Несмотря на то, что эта IDE предназначена для разработки программ на C++, в ней также можно разрабатывать программы на Си. Установка пакета производится в полностью автоматическом режиме, и требует от пользователя лишь указания пути на диске и, если в этом есть необходимость, выбора компонент пакета для установки.

После того, как установка завершена, запустите программу (обычно это можно сделать, выбрав пункт Microsoft Visual C++ в меню «Пуск»), и выберите в меню пункт File -> New… В открывшемся окне выберите вкладку Projects и в поле Project Name введите название проекта. Это имя будет присвоено файлу, содержащему исходный текст программы. Далее, в списке слева выберите пункт Win32 Console Application, и нажмите кнопку “OK”. IDE Microsoft Visual C++ может создать стандартный каркас программы. Для этого, в появившемся окне установите переключатель в положение “A “Hello, world!” application”.

Теперь, когда тестовый проект создан, слева, в панели “workspace”, выберите файл с названием проекта и расширением cpp, чтобы открыть окно с исходным кодом. Будет открыт примерно такой файл:

// test.cpp: Defines the entry point for the console

// application

#include "stdafx.h"

int main(int argc, char* argv[])

{

printf("Hello World!\n");

return 0;

}

Для того чтобы откомпилировать, слинковать и запустить на выполнение программу, нажмите F5. Т.к. созданная программа запускается в отдельном окне и не ожидает никакого ввода пользователя, а лишь выводит строку “Hello, World!”, просмотреть вывод программы не удастся. Для того чтобы программа ожидала ввода, не завершаясь, дополните код программы вызовом стандартной функции:

int main(int argc, char* argv[])

{

printf("Hello World!\n");

getc(stdin); // Ждет нажатия любой клавиши

return 0;

}

Подключение заголовочных файлов можно производить в двух местах. Microsoft рекомендует подключать заголовочные файлы стандартных библиотек в StdAfx.h. Изначально, при создании проекта, именно там была подключена библиотека стандартного ввода-вывода stdio.h, которая нужна для printf. Вот как выглядит stdafx.h:

// stdafx.h: include file for standard system include files,

// or project specific include files that are used

// frequently, but are changed infrequently

//...

// Windows headers

#include <stdio.h>

#include <string.h>

// TODO: reference additional headers your program requires

// here Microsoft Visual C++ will insert additional

// declarations immediately before the previous line.

//...

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

Как видно из содержимого stdafx.h, заголовочные файлы можно подключать и непосредственно после строки «#include "stdafx.h"» в основном файле, например, так:

// test.cpp: Defines the entry point for the console

// application

#include "stdafx.h"

#include <string.h>

int main(int argc, char* argv[])

{

printf("Hello World!\n");

return 0;

}

Тесты к теоретическому разделу

Вопросы к разделу 1.
Основные типы данных

1. Какой объём памяти занимает переменная типа char?

а) 1 байт

б) 2 байта

в) 4 байта

г) 8 байт

2. Переменная типа float занимает в памяти компьютера

а) 16 бит

б) 32 бита

в) 64 бита

3. Какой из нижеперечисленных типов данных относится к скалярным?

а) тип void

б) массивы

в) тип “функция”

г) арифметические типы

4. Где ставится нуль-символ?

а) как первый символ в строке

б) после пробела

в) в конце файла

г) автоматически в конце строки

5. Какие действия выполняет функция printf?

а) присваивает значение символьной переменной

б) выводит форматированные данные на экран монитора

в) читает данные с клавиатуры

г) преобразовывает типы данных

6. Какой модификатор формата надо использовать для вывода с помощью функции printf на экран значения типа int?

а) x;

б) g;

в) d;

г) f.

7. Какие параметры передаются функции scanf?

а) переменные

б) адреса переменных

в) константы

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

8. Какой функции система передает управление при запуске программы?

а) расположенной раньше всех в коде программы

б) идентификатор которой начинается с символа ‘_’

в) функции main

г) не определено

9. Какой раздел системной библиотеки надо подключить к программе для использования функций стандартного ввода/вывода?

а) stdio.h

б) conio.h

в) stdlib.h

10. Какой диапазон представления переменной типа signed int для 16-разрядных микропроцессоров Intel?

а) от -32768 до 32767

б) от 0 до 65535

в) от -2 147 483 648 до 2 147 483 647

г) от 0 до 4 294 967 295

Вопросы к разделу 2.
Операции и выражения

1. Каков будет результат побитовой операции 7 & 2?

а) 5;

б) 9;

в) 2.

2. Что такое выражение?

а) Выражение в языке Си – это последовательность операндов, операций и символов-разделителей;

б) Выражение в языке Си – это совокупность функций и процедур;

в) Выражение в языке Си – это последовательность переменных, арифметических и логических операций.

3. Каково значение выражения 201 / 4?

а) 50;

б) 51;

в) 50,25.

4. Каково значение выражения 201%4?

а) 50;

б) 1;

в) 0,25.

5. Если переменные myAge, a и b имеют тип int, то каковы будут их значения после выполнения выражения:

myAge = 39;

a = myAge++;

b = ++ myAge;

а) а = 39, b = 41, myAge = 41;

б) а = 40, b = 39, myAge = 39;

в) а = 40, b = 40, myAge = 39;

г) а = 40, b = 41, myAge = 41.

6. Какая разница между выражениями if (x = 3) и if(x == 3)?

а) В первом выражении выполняется операция сравнения, а во втором – операция присваивания;

б) В первом выражении выполняется операция присваивания, а во втором – операция сравнения;

в) Выражения идентичны, т. к. и в первом, и во втором выражениях выполняется операция присваивания.

7. Результатом выполнения операции x = x >> 2, при x = 24 будет:

а) 12;

б) 48;

в) 96;

г) 6.

8. К какому типу будет преобразован результат вычисления выражения в правой части операции присваивания:

char ch;

int i;

float f;

double d;

result = (f / i) + (f * i) – (ch + d);

а) double;

б) int;

в) float.

9. Необходимо ли в данной операции использование скобок, если нужно сравнить значение x & MASK с нулем?

if ((x & MASK) == 0)

а) Скобки не нужны, т. к. логический оператор & имеет более высокий приоритет по отношению к оператору сравнения ==.

б) Скобки нужны, т. к. логический оператор & имеет более низкий приоритет по отношению к оператору сравнения ==.

в) Скобки нужны, т. к. без скобок логическая операция выполняться не будет.

10. Для чего используется оператор sizeof в языке Си?

а) Это унарный оператор, возвращающий длину в байтах переменной или типа;

б) Это унарный оператор, служащий для арифметических операций;

в) Это унарный оператор, возвращающий объём выделенной памяти.

Вопросы к разделу 3.
Операторы управления
вычислительным процессом

1. Назовите альтернативу оператору выбора if/else.

а)?:

б) while

в) goto

2. Выведите целые числа от 1 до 10, используя для этого цикл for и переменную-счетчик x.

а)

for (x = 1; x = 10; x++)

printf (‘%d \n”, x);

б)

for (x = 10; x >= 1; x--)

printf (“%d \n”, 11 - x);

в)

for (x = 1; x < 10; x ++)

printf (‘%d \n”, x);

3. Какой результат даст следующий фрагмент кода программы:

int x = 1;

while (x<=10)

printf (“%d ”, x++);

а) Программа выведет числа: 2 3 4 5 6 7 8 9 10 11;

б) Программа выведет числа: 10 11 12 13 14 15;

в) Программа выведет числа: 1 2 3 4 5 6 7 8 9 10.

4. Какой оператор используется для выполнения некоторого действия в случае истинности условия и для выполнения другого в случае его ложности.

а) if/else

б) for

в) whilе

5. Правильно ли записано следующее выражение? Обоснуйте ответ.

for (i = 1, i <= 20, i++)

а) Ошибка. Выражения в скобках должны разделяться точкой с запятой.

б) Все правильно.

в) Ошибка. Выражения в скобках должны разделяться пробелами

6. Каков результат вычисления данного выражения

3+4>5&&3+5>4&&4+5>3?

а) 0;

б) -10;

в) 1.

7. Что неправильно в следующем фрагменте программы?

if (town <= 10)

printf (“Minsk \n”);

else;

printf (“ London \n”);

а) Помещение точки с запятой после ветви else приводит к логической ошибке, в итоге, второй оператор printf будет выполняться в любом случае.

б) Все правильно.

в) Неправильная запись оператора printf (“ London \n”); приводит к ошибке, так как здесь не нужны кавычки.

8. Какой оператор в цикле или в структуре switch вызывает немедленный выход?

а) Оператор break.

б) Оператор case.

в) Оператор continue.

9. Обязательно ли наличие в операторе switch блока default?

а) Блок default является обязательным в любом случае.

б) Блок default не является обязательным, если в программе нет никакого действия по умолчанию.

в) Блока default не должно быть в программе.

10. Выражение (x > y && a < b) истинно, если истинно либо выражение x > y, либо выражение a < b. Верно ли данное высказывание?

а) Верно.

б) Неверно, т.к. при операции && оба выражения отношений должны быть ложными.

в) Неверно, т.к. должны быть истинными оба выражения отношений.

Вопросы к разделу 4.
Массивы и указатели

1. Указатель – это переменная:

а) значением которой является имя другой переменной;

б) адресом которой является адрес другой переменной;

в) значением которой является тип другой переменной;

г) значением которой является адрес другой переменной.

2. При помощи указателей осуществляется:

а) косвенный доступ к переменным;

б) прямой доступ к переменным;

в) доступ с использованием процедур;

г) произвольный доступ.

3. Унарная операция & возвращает:

а) значение своего операнда;

б) тип своего операнда;

в) адрес своего операнда;

г) количество разрядов своего операнда.

4. Унарная операция * возвращает:

а) адрес своего операнда;

б) значение переменной, на которую ссылается указатель;

в) адрес переменной, на которую ссылается указатель;

г) значение своего операнда.

5. Нумерация массива начинается:

а) с нуля;

б) с единицы;

в) с n, где n – размерность массива;

г) с любого числа.

6. Какая из ниже перечисленных инициализаций массива неверная?

а) int a[3] = {0};

б) int a[3] = {1,2};

в) int a[3] = {1,2,3,4};

г) int a [] = {1,2,3,4,5}.

7. Двумерные массивы хранятся в памяти:

а) в порядке возрастания значений массива;

б) по столбцам;

в) в порядке убывания значений массива;

г) по строкам.

8. Результатом разности двух указателей одного и того же типа является:

а) количество байт между ними;

б) разность значений их адресов;

в) разность значений переменных, на которые указатели указывают;

г) эта операция не применима к указателям;

д) Разность 2-х указателей равна разности их значений, поделенной на sizeof (тип).

9. Без явного приведения типа над указателем типа void нельзя выполнить операцию:

а) разыменования указателя (*);

б) взятия адреса;

в) присваивания указателя на void указателю другого типа;

г) присваивания указателю на void значения указателя другого типа.

10. Начальные данные:

int mas[4] = {1,2,3,4};

int *p, a;

p = mas;

В каком из ниже перечисленных вариантов переменной «a» не присваивается значение второго элемента массива mas:

а) a = *(p+1);

б) a = *mas[1];

в) a = p[1];

г) a = *(mas+1).

11. Объявим массив указателей:

char *p[] = {“Иванов”, ”Петров”, “Сидоров”};

Какой из операторов выведет фамилию «Петров»?

а) printf (“%s”, *(p + 1));

б) printf (“%s”, *p);

в) printf (“%s”, *p + 1);

г) printf (“%s”, p[0] + 2).

12. Функция malloc возвращает:

а) количество выделенных байт;

б) единицу – в случае удачного выделения памяти и 0 – в обратном случае;

в) указатель типа void на начало выделенной памяти;

г) адрес начала сегмента данных.

13. Какое из ниже следующих утверждений является неверным:

а) функция realloc изменяет размер объекта, выделенного в результате предыдущего вызова malloc, calloc и realloc;

б) функция malloc не может выделить более 10 Кбайт;

в) функция calloc используется при распределении памяти для массивов;

г) функция free освобождает память и возвращает её системе.

Вопросы к разделу 5.
Функции

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

а) void myFunction ();

б) float myFunction (int, int);

в) myFunction (int, int).

2. Если не объявить тип возвращаемого функцией значения, то какой тип будет принят по умолчанию для возвращаемого значения?

а) int;

б) long;

в) unsigned long.

3. Что должно соответствовать в прототипе и в определении одной и той же функции?

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

б) тип возвращаемого значения и имя функции;

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

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

а) нет;

б) да;

в) значение глобальной переменной нельзя изменить.

5. Что такое рекурсия?

а) способность функции вызывать другую функцию;

б) способность функции в качестве параметра использовать другую функцию;

в) способность функции вызывать саму себя.

6. Какое объявление указателя на функцию является правильным?

а) int (*funcPtr) (int);

б) long *funcPtr (int);

в) оба правильные.

7. Что будет объявлять выражение long * func (int)?

а) указатель на функцию, возвращающую значение типа long и принимающую в качестве параметра данные типа int;

б) функцию, возвращающую указатель на данные типа long и принимающую в качестве параметра данные типа int;

в) так объявлять нельзя.

8. Правильно ли задана функция MyFunc()?

#include <stdio.h>

void MyFunc(int b);

main()

{

int a, c;

c = MyFunc(a);

printf(“%d”, c);

return 0;

}

void MyFunc(int b)

{

return (4 * b);

}

а) неправильно передан параметр в функцию;

б) функция не может возвращать значение;

в) всё правильно.

9. При передаче указателя в параметр функции копируется:

а) значение;

б) и значение, и адрес;

в) адрес.

10. Должны ли имена параметров, указанные в прототипе, определении и вызове функции, соответствовать друг другу?

а) должны;

б) не должны;

в) имена указателей должны, а переменных не должны.

Вопросы к разделу 6.
Строки

1. Как правильно ввести две строки, и получить в переменной str их конкатенацию?

а)

char str[80];

scanf("%s", str);

scanf("%s", str + strlen(str));

б)

char str1[40], str2[40], str[80];

scanf("%s", str1);

scanf("%s", str2);

str = str1 + str2;

в)

char str[40], str1[40];

scanf("%s", &str);

scanf("%s", &str1);

str = strcat(str, str1);

г) ни один из ответов а) – в) не является правильным;

д) несколько ответов из а) – в) являются правильными.

2. Как правильно создать временную копию строки str1 в str2?

а)

char str1[40], str2[30];

str2 = strdup(str1);

б)

char str1[40], str2[30];

str2 = strdup(str1 + 10);

в)

char str1[40], *str2;

str2 = strdup(str1);

г) ни один из ответов а) – в) не является правильным;

д) несколько ответов из а) – в) являются правильными.

3. Как правильно скопировать строку из str2 в str1?

а)

char str1[40], str2[30];

str1 = str2;

б)

char str1[40], str2[30];

str1 = str2 + 10;

в)

char str1[40], *str2;

strcpy(&str2, str1);

г) ни один из ответов а) – в) не является правильным;

д) несколько ответов из а) – в) являются правильными.

4. Как правильно создать в str2 строку, являющуюся конкатенацией str1 и str2?

а)

char str1[40], str2[30];

int j;

for (j = 0; str1[j] || *str2[j]; j++)

{

str2[j + strlen(str2)] = str2[j];

str2[j] = str1[j]

}

б)

char str1[40], str2[30];

strcat(str1, str2);

strcpy(str2, str1);

в)

char str1[40], *str2;

str2 = str1 + str2;

г) ни один из ответов а) – в) не является правильным;

д) несколько ответов из а) – в) являются правильными.

5. Как правильно объявить массив array из 20 строк?

а)

typedef char *string;

string array[20];

б)

const char *array[20];

в)

char array [20];

г) ни один из ответов а) – в) не является правильным

д) несколько ответов из а) – в) являются правильными

6. Функции передан массив строк: function(char **sa). Как правильно получить в переменной res пятый символ третьей строки?

а)

char res;

res = sa[5][3];

б)

char res;

res = *(sa +5) + 3;

в)

char res;

res = *(*sa +5) + 3;

г) ни один из ответов а) – в) не является правильным;

д) несколько ответов из а) – в) являются правильными.

7. Как правильно вывести на экран все символы строки, начиная с пятого?

а)

char* str;

puts (str[5]);

б)

char* str;

puts (&str[5]);

в)

char* str;

puts (str + 5);

г) ни один из ответов а) – в) не является правильным.

8. Сколько байт в памяти займет строка str2 после последнего присваивания?

char *str2 = "first";

str2 = strdup(str2, "second");

а) 11;

б) 12;

в) в примере есть ошибки;

г) ни один из ответов а) – в) не является правильным.

9. Сколько байт в памяти займет строка str1 после последнего вызова функции?

char str1[] = "first", str1[] = "second";

str2 = strcpy(str1, str2);

а) 5;

б) 6;

в) 7;

г) в примере есть ошибки;

д) ни один из ответов а) – г) не является правильным.

10. Какую максимальную длину может иметь Си-строка (DOS)?

а) 255;

б) 256;

в) 65535;

г) неограниченную;

д) ни один из ответов а) – г) не является правильным.

Вопросы к разделу 7.
Классы хранения и видимость переменных

1. Какие значения будут выведены на экран при выполнении программы

#include <stdio.h>

int num = 10;

void write(void);

void main(void)

{

printf("\n%d", num);

int num = 20;

printf("\n%d", num);

write();

}

void write(void)

{

printf("\n%d", num);

}

а) 10, 20, 30;

б) 20, 10, 20;

в) 10, 20, 10;

г) 10, 0, 10.

2. Какая из этих операций недопустима для переменной объявленной как

register long sum;

а) сравнение;

б) присваивание значения;

в) передача в функцию по значению;

г) взятие адреса.

3. Какие числа будут выведены следующей программой

#include <stdio.h>;

int print1(void);

int print2(void);

void main(void)

{

int i;

for (i = 5; i >= 1; i--)

{

printf("\n%d", print1());

}

}

int print1(void)

{

static int i = 0;

i++;

return i;

}

а) 1 2 3 4 5;

б) 5 4 3 2 1;

в) 0 0 0 0 0;

г) ошибка компиляции.

4. В каком случае при определении переменных используется модификатор extern?

а) при работе с динамической памятью;

б) при написании приложений, состоящих из нескольких модулей;

в) при использовании ассемблерных вставок;

г) всегда.

5. Каким будет поведение следующей программы?

#include <stdio.h>

int main()

{

{

int i=5;

}

printf(“%d\n”,i);

return 0;

}

а) будет выведено число 5;

б) будет выведено число 0;

в) будет обнаружена синтаксическая ошибка;

г) будет обнаружена ошибка «неопределённая переменная».

6. Какой класс хранения имеют по умолчанию глобальные переменные:

а) auto;

б) static;

в) extern;

г) register;

7. Какой класс хранения имеют по умолчанию локальные переменные:

а) auto;

б) static;

в) extern;

г) register.

8. Какие из приведенных конструкций не вызовут ошибок при компиляции?

а)

void main()

{

a = 10;

int a;

}

б)

int a;

void main()

{

a = 3;

int a;

}

в)

void main()

{

int A;

a = 7;

}

г)

void main()

{

extern int a = 10;

}

float a;

9. Какими будут результаты работы программы?

#include <stdio.h>

int i = 3;

void main()

{

int i, j;

i = 4;

printf (“%d %d”, i, j);

}

а) 0 0;

б) 1 0;

в) 3 0;

г) 4 0;

д) i=4 j – неопределенное значение;

е) возникнет ошибка при компиляции.

10. Каким будет последнее выведенное на экран значение переменной m:

#include <stdio.h>;

void f();

void main()

{

for (int i = 1; i <= 5; i++) f();

}

void f()

{

static int m = 0;

printf("\nm=%d", m);

m++;

}

а) 0;

б) 1;

в) 2;

г) 3;

д) 4;

е) 5.

Вопросы к разделу 8.
Структуры, объединения
и перечисления

1. Какое из следующих определений структуры правильное?

а) совокупность переменных, возможно разных типов, сгруппированных под одним именем;

б) совокупность переменных только одного типа, сгруппированных под одним именем;

в) переменная определённого типа;

г) указатель на массив переменных только одного типа.

2. Что происходит при выполнении следующего фрагмента кода?

struct base

{

int n;

char name [20];

float cost;

int quant;

char note [100];

};

а) создаются переменные n, cost, quant и массивы name и note;

б) компилятор выделяет количество памяти, достаточное, чтобы разместить члены структуры;

в) компилятор выдаст ошибку, т.к. при декларировании структуры не объявлена ни одна структурная переменная;

г) определяется тип Base.

3. Память структурной переменной резервируется при

а) определении структурной переменной;

б) задании шаблона структуры или типа структуры;

в) объявлении указателя на структуру;

г) вообще не резервируется.

4. Можно ли присвоить одну структуру другой с помощью одного оператора присваивания?

а) можно в любом случае;

б) можно, если они одного типа;

в) нельзя;

г) со структурами нельзя производить никаких действий.

5. Что передаётся функции f1 при выполнении следующего фрагмента кода:

struct base

{

int n;

char name[20];

float cost;

int quant;

char note[100];

} mas[100];

...

f1 (mas.name);

а) функции f1 передаётся значение пятого элемента name;

б) функции f1 передаётся сумма всех значений элементов name;

в) компилятор выдаст ошибку;

г) функции f1 передаётся адрес (смещение) name.

6. Какой из следующих элементов структуры будет находиться в памяти по самому младшему адресу?

struct base

{

int n;

char name [20];

float cost;

char note [100];

} m1;

а) name;

б) cost;

в) n;

г) note.

7. Используя ключевое слово typedef можно …?

а) определять новое имя для уже существующего типа;

б) создавать новые типы данных;

в) декларировать переменные;

г) печатать файл.

8. Можно ли получить адрес битового поля и существуют ли массивы битовых данных?

а) можно получить адрес битового поля и массивы битовых данных существуют;

б) нельзя получить адрес битового поля, а массивы битовых данных существуют;

в) нельзя получить адрес битового поля и массивы битовых данных не существуют;

г) можно получить адрес битового поля, а массивы битовых данных не существуют.

9. Чему равен объем памяти, выделяемой под объединение?

а) размеру самого большого элемента в объединении;

б) сумме размеров всех элементов в объединении;

в) размеру самого малого элемента в объединении;

г) под объединение выделяется вся свободная память.

Вопросы к разделу 9.
Динамические структуры данных

1. Чем отличаются динамические структуры данных от статических?

а) под статические структуры можно выделить неограниченное количество памяти;

б) статические структуры данных обеспечивают хранение информации на более длительный срок;

в) динамические структуры данных увеличиваются или уменьшаются в процессе выполнения программы, а размер статических структур строго определен в процессе компиляции;

г) динамические структуры требуют меньшее количество памяти, чем статические.

2. Что представляет собой связный список?

а) это линейная динамическая структура данных, последовательность связных между собой узлов, где их количество изменяется по мере добавления и удаления;

б) это нелинейная структура, элементы в которой следуют друг за другом;

в) это динамическая структура, из которой, после ее заполнения, нельзя удалять элементы;

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

3. Чем отличаются однонаправленный и двунаправленный списки?

а) двунаправленный список состоит из двух полей данных и указателя на следующий элемент, однонаправленный – из двух указателей на следующие элементы и двух полей данных;

б) однонаправленный список состоит из поля данных и указателя на следующий элемент, двунаправленный – из поля данных и двух указателей на следующий и предыдущий элемент списка;

в) двунаправленный список состоит из поля данных и двух указателей на следующий элемент справа и слева, однонаправленный – поля данных и одного указателя на левый элемент или правый;

г) однонаправленный список состоит из нескольких полей данных и одного указателя на одно из них, а двунаправленный – из нескольких полей данных и двух указателей, на элементы, находящиеся слева и справа.

4. Какое значение имеет указатель последнего элемента циклического списка?

a) он указывает на первый узел данного списка, то есть на начало списка;

б) имеет значение NULL;

в) указывает на предыдущий элемент списка;

г) указывает на еще не заполненную ячейку памяти.

5. Что представляет собой стек?

a) это упорядоченный набор элементов, доступ к которым осуществляется только с одного конца, называемого вершиной стека;

б) это подвид списка, где удалять можно с одного конца, а добавлять с другого;

в) это упорядоченный набор элементов с произвольным к ним доступом;

г) это список, из которого нельзя удалять элементы.

6. Основные функции работы со стеком:

а) функции копирования и создания стека;

б) функция перемещения по стеку;

в) функция удаления стека;

г) функции занесения элемента в стек и извлечения элемента из стека.

7. Что такое очередь?

а) динамическая структура, набор связных данных, где удаление и запись производится с одного конца;

б) подвид списка, где добавлять элементы можно в любое место списка;

в) подвид списка, где удаление осуществляется из начала списка, а запись – с конца;

г) структура с ограниченным числом операций удаления и добавления.

8. В чем отличие очереди от стека?

a) в принципе организации и функциях работы с ними;

б) в количестве элементов, которые они могут себя вместить;

в) в разности эффективности доступа к данным;

г) только в функциях работы с ними.

9. Дерево – это…

а) нелинейная структура данных с особыми свойствами;

б) нелинейная структура, вид направленного графа;

в) линейная структура, являющаяся разновидностью списка с особыми свойствами;

г) линейная структура, в которую можно добавлять элементы только с одного конца.

10. В чем особенность бинарных деревьев?

а) из бинарного дерева нельзя удалять узлы;

б) бинарное дерево нельзя изменить;

в) бинарное дерево состоит из ограниченного количества узлов;

г) бинарное дерево состоит из узлов, каждый из которых имеет 0, 1 или 2 потомка.

11. Как организованы бинарные деревья?

а) значения в узлах поддеревьев меньше значения в корне дерева;

б) значения в узлах поддеревьев больше значения в корне дерева;

в) значение в левом узле-потомке меньше значения в данном узле, а значение в правом узле-потомке больше значения в данном узле.

Вопросы к разделу 10.
Файлы

1. Для какого типа файлов характерно следующее представление строки «f c e a r t y н u d н у a» в файле?

f c e a r t y н u d н у a

a) для текстового;

б) для бинарного;

в) и для текстового и для бинарного.

2. Можно ли текстовый файл открыть в двоичном формате и прочитать строку функцией fscanf()?

а) можно открыть файл и прочитать функцией;

б) нельзя открыть файл;

в) можно открыть файл, но прочитать строку нельзя.

3. Что выполняет данный участок программы

...

char s[25];

FILE *out;

if ((out = fopen("d:\\Ex2.txt", "wb")))

for (int i = 0; i < 3; i++)

{

gets(s);

fprintf(out, "%s \r\n", s);

}

getch();

fclose(out);

...

а) считывает одну строку и заносит ее в файл;

б) считывает три строки и выводит их на экран;

в) считывает три строки и записывает в файл;

г) программа имеет ошибки и работать не будет.

4. В каком файле можно управлять позиционированием?

а) текстовом;

б) в текстовом и двоичном;

в) двоичном.

5. Что будет находиться в строке s после выполнения программы

#include<stdio.h>

#include<conio.h>

void main()

{

FILE *f;

char s[20] = "1";

clrscr();

f = fopen("e:\\tmp.txt", "rb");

if (f)

{

fseek(f, –4, 2);

fscanf(f, "%s", s);

printf("%s", s);

}

}

если в файле содержится следующая информация

fc136902fsw

а) c136902fsw;

б) 2fsw;

в) 02fsw;

г) sw;

д) s.

6. Относительно какого положения можно изменять указатель на текущую позицию в файле?

а) Относительно начала файла.

б) Относительно конца файла.

в) Относительно текущей позиции.

г) Относительно всех вышеперечисленных положений.

7. Что будет находиться в строке s после выполнения программы,

#include<stdio.h>

#include<conio.h>

void main()

{

FILE *f;

char s[20] = "1";

clrscr();

f = fopen("e:\\tmp.txt","rb");

if (f)

{

fseek(f, 1, SEEK_SET);

fscanf(f,"%s", s);

printf("%s", s);

}

}

если в файле содержится следующая информация

fc136902fsw

а) c136902fsw;

б) fc136902fsw;

в) 136902fsw;

г) sw;

д) c.

8. Какое число соответствует EOF?

а) 0;

б) 1;

в) -1;

г) 65534.

9. Для чего используется функция fread()?

а) Без изменений копирует блок данных из файла в память.

б) Без изменений копирует блок данных из памяти в файл.

в) Считывает строку из файла.

г) Записывает строку в файл.

Вопросы к разделу 11.
Директивы препроцессора

1.Что такое препроцессор?

а) Это составная часть языка Си, которая обрабатывает исходный текст программы до того, как он пройдет через компилятор.

б) Это составная часть операционной системы, которая запускает программу.

в) Это составная часть языка Си, которая обрабатывает исходный текст, после того, как она прошла компилятор.

2. Для чего предназначена директива #include?

а) Для включения копии указанного в директиве файла в том месте, где находится эта директива.

б) Для определения символических констант.

в) Для условной компиляции.

3. На что заменяется идентификатор константы или идентификатор макроса, определенный директивой #define?

а) Заменяются на значение, определенное в стандартном библиотечном файле.

б) Заменяются на функцию с таким же именем, описанную ниже в программе.

в) Автоматически заменяются на указанный в директиве заменяющий текст, расположенный непосредственно справа от него.

4. В чем преимущества использования макроса, определенного директивой #define перед функцией?

а) Уменьшение времени выполнения программы.

б) Экономия памяти.

в) Уменьшение объема программного кода.

5. Для чего используется директива #undef?

а) Для аннулирования символических констант и макросов, определенных ранее директивой #define.

б) Для переопределения констант и макросов на новые значения.

в) Для условной компиляции.

6. Какие переменные могут использоваться при условной компиляции?

а) Любые переменные, объявленные ранее.

б) Символические константы, определенные директивой #define.

в) Зарезервированные библиотечные константы.

7. В каком случае компилируется условное выражение?

а) Если выражение, расположенное справа от директивы #if, возвращает не 0.

б) Если выражение возвращает 0.

в) Если выражение является строковой константой.

8. В чем отличие директивы #ifdef от #ifndef?

а) При использовании директивы #ifdef выражение возвращает истинное знчение, если ранее использовалась директива #define, a #ifndef – если не использовалась.

б) При использовании директивы #ifdef выражение возвращает истинно, если ранее не использовалась директива #define, a #ifndef – если использовалась.

в) #ifndef аннулирует #ifdef.

9. Для чего используется директива #error?

а) Для выдачи ошибок, которые обрабатываются пользователем, после чего компиляция продолжается.

б) Для остановки программы.

в) Для остановки программы и выдачи ошибок, после чего компиляция прекращается.

10. В чем предназначение директивы #pragma?

а) Вызов действия, зависящие от опции, указанной непосредственно справа от директивы.

б) Выдача сообщения об ошибках.

в) Вызов других директив препроцессора.

11. В чём отличие операции # от операции ##?

а) Операция # выполняет конкатенацию двух лексем. Операция ## преобразует лексему в строку символов, взятую в кавычки.

б) Операция # преобразует лексему в строку символов, взятую в кавычки. Операция ## выполняет конкатенацию (сцепление, склеивание) двух лексем.

в) Операция # выполняет конкатенацию двух символов, а операция ## – двух строк.

12. Найдите ошибки и скажите, что будет выведено на экран:

#define MAX 10;

void main()

{

int array[MAX];

printf(“Массив: ”);

for(int i = 1; i < MAX; i++)

printf(“%d”, array[MAX]);

}

а) Ошибка: точка с запятой после определения константы.

б) Ошибка: точка с запятой после определения константы. На экран будут выведены значения 1, 2, 3, …, MAX.

в) Ошибок нет. На экран будут выведены неопределённые значения.

Вопросы к разделу 12.
Модульное программирование

1. На какие стадии разделяется процесс преобразования исходного кода программы на Си в исполняемый файл?

а) Обработка препроцессором и компиляция.

б) Обработка препроцессором и трансляция.

в) Трансляция, обработка препроцессором и связывание.

г) Обработка препроцессором, компиляция и связывание.

2. На какой из стадий процесса преобразования исходного кода программы на Си в исполняемый файл обнаруживаются ошибки типа «неопределенная функция»?

а) Обработка исходного текста препроцессором.

б) Трансляция.

в) Компиляция.

г) Связывание.

3. На какой из стадий процесса преобразования исходного кода программы на Си в исполняемый файл обрабатываются заголовочные файлы?

а) Обработка исходного текста препроцессором.

б) Трансляция.

в) Компиляция.

г) Связывание.

4. Выполняется ли на стадии компиляции проверка типов параметров, передаваемых функции?

а) Да, выполняется всегда.

б) Нет, не выполняется никогда.

в) Выполняется, если включена соответствующая опция компилятора.

г) Выполняется, если перед обращением к функции, был определен ее прототип.

5. Что не следует помещать в заголовочные файлы?

а) Прототипы функций.

б) Определения констант.

в) Директивы препроцессора.

г) Определения функций.

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

а) Для того, чтобы исключить возможность появления неверного объявления в заголовочном файле.

б) Чтобы избежать повторной компиляции кода.

в) Директивы препроцессора.

г) Среди ответов нет правильного.

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

а) Прототипы функций.

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

в) Директивы препроцессора.

г) Среди ответов нет правильного.

8. Пусть некоторая функция определена в модуле «main.c», вызывается в модуле «first.c», и используется для передачи в качестве аргумента другой функции в «second.c». В какие модули следует включить заголовочный файл, с прототипом этой функции?

а) «first.c» и «second.c».

б) «first.c», «second.c», «main.c».

в) «first.c».

г) «second.c», «main.c».

9. Пусть в некотором модуле «first.c», определена функция function:

void* function(int*)

{

static void (*variablie) (int);

//...

}

Какую строку должен содержать заголовочный файл, чтобы к переменной variable можно было обращаться из других модулей?

а) extern variable;

б) extern void (*variablie) (int);

в) extern static void (*variablie) (int);

г) среди ответов а) – в) нет правильного.

Вопросы к разделу 13.
Введение в ООП

1. Заданы прототипы перегруженной функции:

I void print(int a);

II void print(char c);

III void print(char * s);

Какие функции будут вызваны в следующем примере?

void f(double a, char c, int* s)

{

print(a);

print(c);

print(s);

}

а) на стадии компиляции будут обнаружены ошибки;

б) I, II и III соответственно;

в) II, I и III соответственно;

г) I, II и III или I соответственно;

д) I или II, II и III соответственно.

2. Какие синтаксические ошибки есть в следующем определении класса?

class complex

{

function();

private

void complex();

public

int nonfunction(int);

private

void bigfunction(int a);

};

а) нарушены правила оформления отступов;

б) неправильно объявлена функция function();

в) неправильно объявлен конструктор;

г) отсутствует деструктор;

д) пропущены двоеточия;

е) дважды встречается директива private;

ж) ответы в), д), б) и одновременно;

з) ответы в) и д) одновременно.

3. Какие из приведенных ниже примеров являются определениями (в отличие от объявлений)?

class abcdef: public ghijkllm { abcdef(); }; // 1

int function(int) {}; // 2

int data(int) {};// 3

а) определений нет;

б) 1, 2, 3;

в) 1, 2;

г) 2, 3;

д) 1, 3;

е) 1;

ж)2;

з) 3.

4. Сколько байтов памяти будет выделено для массива complex *mas[10] в следующем примере?

class complex

{

char* function(char *);

char mas [200];

};

char* complex::function(char* a)

{

char mas;

//...

}

complex* mas [10];

а) 2010;

б) 200 + 10*sizeof(complex *);

в) 200;

г) 10*sizeof(complex *);

д) 201 +10*sizeof(complex *);

е) 2000.

5. Укажите ошибки (если они есть) в данном примере:

class iStack

{

public:

~iStack();

void push(int a);

int pop();

private:

iStack(int);

int init();

int *top;

};

iStack::iStack(int a)

{

*top = init(); // Точка 1

}

void f(int a)

{

iStack stack (a); // Точка 2

*top = pop(); // Точка 3

}

а) ошибок НЕТ;

б) ошибки в точках 1, 2, 3;

в) ошибки в точках 1, 2;

г) ошибки в точках 2, 3;

д) ошибки в точках 1, 3;

е) ошибки в точке 1;

ж) ошибки в точке 2;

з) ошибки в точке 3.

6. Какие из членов класса myclass являются открытыми?

struct myclass

{

int mymember; // 1

public:

int myfunction(); // 2

private:

myclass(); // 3

};

а) открытых членов у класса myclass нет;

б) 1, 2, 3;

в) 1, 2;

г) 2, 3;

д) 1, 3;

е) 1;

ж) 2;

з) 3.

7. Укажите ошибки (если они есть) в данном примере:

class Date

{

int dd, mm, yy;

public:

Date();

Date* change_day(int);

Date& change_month(int);

Date& change_year(int);

};

void somefunction(Date date, Date dt)

{

// 1

date.change_day(12).change_month(12).change_year(12);

// 2

date.change_day(12).change_month(12).change_year(12) = dt;

// 3

date.change_day(12)->change_month(12)->change_year(12);

}

а) ошибок НЕТ;

б) ошибки в точках 1, 2, 3;

в) ошибки в точках 1, 2;

г) ошибки в точках 2, 3;

д) ошибки в точках 1, 3;

е) ошибки в точках 1;

ж) ошибки в точке 2;

з) ошибки в точке 3.

8. Укажите ошибки (если они есть) в данном примере (объявление iStack см. в вопросе 5):

class Stack: public iStack // iStack из прошлого вопроса

{

public:

Stack(int a);

};

Stack::Stack(int a)

{

*top = pop(); // Точка 1

}

int f(int a)

{

Stack stack (a); // Точка 2

*top = pop(); // Точка 3

}

а) ошибок НЕТ;

б) ошибки в точках 1, 2, 3;

в) ошибки в точках 1, 2;

г) ошибки в точках 2, 3;

д) ошибки в точках 1, 3;

е) ошибки в точке 1;

ж) ошибки в точке 2;

з) ошибки в точке 3;

9. Какие термины соответствуют следующим определениям:

— способность классов скрывать детали реализации;

— механизм позволяющий получить новый тип данных из существующего;

— возможность одинаково обращаться к родственным классам.

а) инкапсуляция, наследование, полиморфизм соответственно;

б) инкапсуляция, полиморфизм, наследование соответственно;

в) наследование, полиморфизм, инкапсуляция соответственно;

г) наследование, инкапсуляция, полиморфизм соответственно;

д) полиморфизм, наследование, инкапсуляция соответственно;

е) полиморфизм, инкапсуляция, наследование, соответственно.

10. В каких случаях можно указать заранее, что будет выведено на экран (первые числа в ответе), и в каких случаях есть синтаксические ошибки (вторые числа в ответе):

void f(void)

{

int a = 1, b = 3, &c = a, *d = &b;

printf("%d", a + b*c**d); // 1

printf("%d", a + b**c*d); // 2

printf("%d", a + b*&c*d); // 3

printf("%d", a + b*&c**d); // 4

}

а) {1, 2}, {4};

б) {1}, {2, 3, 4};

в) {}, {1, 2, 3, 4};

г) {1, 3}, {4};

д) {1, 3}, {2, 4};

е) {1, 4}, {3};

ж){1, 2}, {};

з) {3, 4}, {1, 3}.

11. Данные какого типа может возвращать функция-конструктор класса?

а) Функция конструктор не имеет типа возвращаемого значения.

б) Любого.

в) int.

г) int*.

д) Любого целочисленного.

е) void.

ж) void*.

12. Развитием каких из базовых идей ООП можно считать перегрузку функций?

а) Инкапсуляция.

б) Инкапсуляция и наследование.

в) Наследование и полиморфизм.

г) Наследование, инкапсуляция и полиморфизм.

д) Полиморфизм.

е) Наследование.

13. Данные какого типа может возвращать функция-деструктор класса?

а) Функция-деструктор не имеет типа возвращаемого значения.

б) Любого.

в) int.

г) int*.

д) Любого целочисленного.

е) void.

ж) void*.

14. Сколько параметров будет помещено в стек при вызове функции:

sometype &sometype::somefunction(sometype* b, sometype& c) {};

//...

sometype someobject;

someobject = someobject->somefunction(b, c);

//...

а) 1;

б) 2;

в) 3;

г) 4;

д) 5.

15. Каким будет результат функции f()?

struct someclass

{

someclass();

~someclass();

};

someclass::someclass() { printf(“1”); }

someclass::~someclass() { printf(“2”); }

void f()

{

someclass a;

int b = 5;

{

someclass a;

}

b++;

printf(“%d”, b);

}

а) “”;

б) “12126”;

в) “21216”;

г) “11262”;

д) “22611”;

е) в примере есть синтаксические ошибки;

ж) нет правильного ответа.

Правильные ответы на вопросы тестов
к теоретическому разделу


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: