- •Часть 1
- •Практическое занятие 1. Работа в среде Microsoft Visual Studio
- •Проекты и решения
- •Создание консольного приложения
- •Отладка в Visual Studio
- •Отладка программ
- •Практическое занятие 3. Операции и выражения. Линейные программы Операции и выражения
- •Логические операции
- •Поразрядные (побитовые) операции
- •Практическое занятие 4. Разветвляющиеся алгоритмы
- •If (выражение) оператор_1 else оператор_2
- •Операции сравнения (отношения)
- •Тернарная (условная) операция
- •Выражение_1 ? выражение_2 : выражение_3
- •Практическое занятие 5. Организация циклов. Операторы цикла
- •Оператор while
- •Оператор do…while
- •Оператор for
- •Операторы передачи управления Оператор break
- •Оператор continue
- •Указатели
- •Инициализация указателей
- •Операции над указателями
- •Одномерные массивы
- •Практическое занятие 7. Двумерные массивы. Организация работы с динамической памятью Двумерные массивы
- •Динамические массивы
- •Практическое занятие 8. Структуры. Форматный ввод/вывод данных. Структуры в языке с
- •Форматный ввод/вывод данных в стиле языка с
- •Int printf(строка_форматир-я [, список_переменных]);
- •Int scanf(const char * строка_форматирования,
- •Практическое занятие 9. Функция. Способы передачи параметров в функцию.
- •Выход из функции
- •Прототип (описание, объявление) функции
- •Рекурсия
- •Передача параметров в функцию
- •Передача массивов в качестве параметров функции
- •Практическое занятие 10. Перегрузка функций. Шаблоны функций Перегрузка функций
- •Перегрузка и область видимости
- •Шаблоны функций
- •Прототип шаблона
- •Параметры шаблона, не являющиеся типами
- •Явная специализация шаблонной функции
- •Директива #include
- •Директива #define
- •Символических констант
- •Макроимён, управляющих условной компиляцией:
- •Препроцессорные операторы # и ##
- •Директива #undef
- •Директивы условной компиляции #if, #ifdef, #ifndef
- •Вспомогательные директивы
- •Практическое занятие 12. Поразрядные операции Операции с разрядами Машинное слово
- •Представление машинных слов в программе
- •Технология работы с машинными словами
- •Поразрядная операция и
- •Поразрядная операция или
- •Операция поразрядной инверсии
- •Поразрядная операция исключающее или
- •Операция сдвиг влево
- •Операция сдвиг вправо
- •Формы представления числовых данных Целое без знака
- •Представление отрицательных чисел Дополнительный код
- •Преобразование типов операндов в выражениях
- •Стандартные программные решения Преобразование типов операндов в выражениях
- •Подсчет количества единичных битов
- •Упаковка данных полями переменной длины
- •Машинная арифметика – целые произвольной точности
- •01000 Хххххххх 00011 ххх 10000 хххххххххххххххх 00000.
- •Практическое занятие 13. Пространства имен
- •Пространство имен std
- •Приложение 1. Простые алгоритмы сортировки одномерных массивов
- •Сортировка простыми обменами (пузырьковая)
- •Сортировка простыми вставками (прямого включения)
- •Приложение 2. Создание файла с результатами препроцессорной обработки в среде Visual Studio
- •Создание файла с результатами препроцессорной обработки из командной строки
- •Приложение 3. Использование генератора случайных чисел
- •Рекомендуемая литература
- •Содержание
Приложение 2. Создание файла с результатами препроцессорной обработки в среде Visual Studio
В окне Обозреватель решений Visual Studio выберите проект.
В обозревателе решений щёлкните правой кнопкой мыши по узлу проекта и выберите пункт Свойства (Properties).
В окне Property Pages выберите пункт С/С++:
Щёлкните для выбора страницы свойств Preprocessor (Препроцессор). Измените значение свойства Generate Preprocessed File (Создание предварительно обработанного файла) с No на Without Line Numbers (/EP /P):
Нажмите на кнопки Применить и ОК.
Нажмите функциональную клавишу F7. Пусть имя проекта pr1, а имя файла с программой pr1.cpp. Тогда в папке pr1/pr1 появится файл pr1.i с результатами препроцессорной обработки, но файл pr1.obj не создаётся. Чтобы создать файлы pr1.obj и pr1.exe, надо в странице Preprocessor вернуть установку значения свойства Generate Preprocessed File на No и скомпилировать программу (нажать F7, Build Solution). Чтобы выполнить программу, нажмите Ctrl+F5.
Откройте файл с результатами препроцессорной обработки pr1.i и проанализируйте его. Для этого в меню выберите File, Open, File:
Создание файла с результатами препроцессорной обработки из командной строки
Откройте окно Командная строка Visual Studio. Для этого нажмите кнопку Пуск, последовательно выберите пункты: Все программы, Microsoft Visual Studio, Visual Studio Tools (Средства Visual Studio), а затем выберите пункт Visual Studio Command Prompt (Командная строка Visual Studio).
Перейдите в папку, в которой находится файл с текстом программы. Пусть файл pr1.cpp с текстом программы находится в папке C:\Cprograms. Для того, чтобы сделать эту папку текущей, в командной строке введите cd \Cprograms, а затем просмотрите содержимое папки, введя команду dir:
Для запуска компилятора в командной строке введите:
cl /EP /P /C pr1.cpp
После выполнения команды в папке C:\Cprograms создаётся файл pr1.i с результатами препроцессорной обработки программы:
В этом файле сохраняются комментарии и не добавляются директивы #line. Просмотреть содержимое данного файла можно с помощью текстового редактора.
Препроцессорная обработка в GNU C++
Опция -E указывает драйверу g++ пропустить исходный код через препроцессор CPP и не производить никаких дальнейших действий. По следующей команде будет выполнена последовательная предобработка исходного кода из файла prim.cpp и выдача результата предобработки на стандартное устройство вывода:
$ g++ -E prim.cpp
Расширение имени файла, принятый в GCC для результатов предобработки – .ii . Такой файл может быть выработан при использовании опции -o, например, так:
$ g++ -E prim.cpp -o prim.ii
Приложение 3. Использование генератора случайных чисел
Для генерации случайных чисел можно использовать средства стандартной библиотеки, описанные в заголовке stdlib.h: функцию rand() и константу RAND_MAX.
Функция rand() при каждом обращении возвращает псевдослучайное значение типа int из диапазона от 0 до RAND_MAX.
RAND_MAX – препроцессорная константа, определяющая предельное значение псевдослучайных целых чисел, формируемых функцией rand(). Конкретное значение RAND_MAX зависит от реализации (конкретного компилятора), но не может быть менее 32767 (требование Стандарта языка С).
Пусть надо получить целое случайное число из диапазона от a до b (a < b). Тогда его можно вычислить по формуле:
rand()*(b - a)/RAND_MAX + a
Например, надо получить целое случайное число из диапазона от -1000 до +1000. Его можно вычислить по формуле:
rand()*(1000 + 1000)/RAND_MAX - 1000
Например, надо получить целое случайное число из диапазона от 0 до 200. Тогда его можно вычислить по формуле:
rand()*200/RAND_MAX
Например, надо получить целое случайное число из диапазона от 5 до 200. Тогда его можно вычислить по формуле:
5 + rand()*195/RAND_MAX
Вещественное случайное число из диапазона от -1000 до +1000 можно вычислить по формуле:
(1000 + 1000)*(double)rand()/RAND_MAX - 1000
Функция rand генерирует псевдослучайные числа. Повторный вызов rand производит последовательность чисел, которые кажутся случайными. Но одна и та же последовательность чисел повторяется при каждом новом запуске программы. Для того, чтобы при каждом выполнении программы вырабатывались разные последовательности случайных чисел, необходимо предварительно выполнить рандомизацию, которая реализуется с помощью стандартной библиотечной функции srand.
Функция srand() получает целый аргумент типа unsigned и при каждом выполнении программы задаёт начальное число, которое функция rand() использует для генерации последовательности случайных чисел. Например,
...
int n;
cin >> n; // Ввод числа с клавиатуры
srand(n);
...
Если необходимо рандомизировать, не вводя каждый раз начальное число с клавиатуры, можно использовать такой вызов функции:
srand(time(NULL));
При этом для автоматического получения начального числа компьютер считывает показания системных часов. Функция time(NULL) (для её использования необходимо подключить заголовочный файл time.h или ctime) возвращает текущее «календарное время» в секундах, которое преобразуется в беззнаковое целое число и используется как начальное значение в генераторе случайных чисел. Поскольку системное время при различных запусках программы будет разное, функция rand() будет генерировать различные последовательности случайных чисел.
