Лекция. Лекция 1. Программа написанная на языке C как и на многих других языках программирования высокого уровня переводится компьютером в язык самого низкого уровня на машинный язык.
Скачать 147.46 Kb.
|
Одно из положительных качеств языка С++ связано с его универсальностью. Один и тот же исходный код C ++ может быть скомпилирован под различные платформы, например, Linux, Windows и выполняться процессорами различной архитектуры. Программа написанная на языке C++ как и на многих других языках программирования высокого уровня переводится компьютером в язык самого низкого уровня на машинный язык. Средство, осуществляющее перевод программы с языка С++ на машинный язык называется компилятором. В процессе компиляции осуществляется также проверка синтаксиса каждой строки вашей программы, оптимизация программного кода и многое другое. Процесс создания программы представлен на рисунке 1.1 Помимо компилятора для написания программы на языке С++ требуется текстовой редактор и другие компоненты, представленные на рисунке 1.1 Рассмотрим их назначение. Рисунок 1.1. Этапы создания программы Препроцессор добавляет или изменяет содержимое исходного файла перед началом компиляции. Препроцессор в основном используется с директивой #include для информирования о библиотеках, которые используются в нашей программе. Компилятор переводит исходный код C ++ в машинный код. Компоновщик объединяет сгенерированный компилятором машинный код с предварительно скомпилированным библиотечным кодом для создания полноценной исполняемой программы. Скомпилированный код программиста не способен работать сам по себе и нуждается в дополнительном машинном коде для создания полноценной исполняемой программы. Отсутствующий машинный код был предварительно скомпилирован и сохранен в хранилище кода, называемого библиотекой. Программа под названием компоновщик объединяет скомпилированный код программиста и код библиотеки для создания полной программы. Отладчик. Отладчик позволяет программисту: запустить программу и посмотреть, какая строка в исходном коде отвечает за текущие действия, отслеживать выполнение программы по порядку, найти и исправить ошибки в реализации программы. Программист может получить значения переменных, чтобы сравнить их с ожидаемыми. Отладчики полезны для поиска ошибок. Профилировщики. Профилировщик собирает статистику о выполнении программы, позволяя разработчикам настраивать соответствующие части программы, чтобы улучшить ее общую производительность. Профилировщик показывает: сколько раз часть программы выполняется во время определенного запуска, сколько времени занимает выполнение этой части. Основная цель профилирования найти части программы, которые можно улучшить, чтобы ускорить работу программы. Если текстовой редактор поддерживает цветовое выделение ошибок, подсветку операторов языка С++, подсказки и другое, то это сильно упрощает написание программ. Редактор со всеми подключенными к нему этими возможностями, компилятором, справочными материалами, а также приведенными выше компонентами называется интегрируемые средой разработки IDE (Integrated Development Environment). Таким образом, IDE своего рода набор инструментальных средств для построения, запуска и отладки программ. IDE имеет очень большой набор возможности, который описывается в документации, некоторые из которых используются только в редких случаях при разработке сложных программных продуктов. Существуют различные IDE для изучения С++ и профессионального программирования, например, Visual Studio C++ и другие. IDE могут различаться между собой своими функциональными возможностями, интерфейсом, поддерживаемой операционной системой. Но основные возможности, необходимые для разработки программ на С++ и изучения программирования есть у всех. Одним из простейших и бесплатных IDE является Code::blocks [ ]. Для работы с этим IDE необходимо скачать дистрибутив «codeblocks-17.12mingw-setup.exe»1 в разделе Downloads сайта [ ] под Windows или другую версию дистрибутива под Linux. После установки этого дистрибутива и запуска. В меню «File» -> «Empty file» создадим файл и введем текст простейшей программы, как показано на рисунке 1.2. Рисунок 1.2. Запуск IDE и ввод программы Сохраняем файл под именем “first.cpp”, как показано на рисунке 1.3. Далее с помощью команды «Build and run» меню «Build» (клавиша F9) запускаем программу. Результаты, представлены на рисунке 1.4. Рисунок 1.3. Сохранение файла. Рисунок 1.4. Результаты программы. В конце программы включают также оператор system("pause") для того, чтобы окно консольного приложения не закрывалось сразу после запуска программы. Если в процессе написания программы были допущены ошибки, то после компиляции в нижней части IDE появятся сообщения о допущенных ошибках, кодах этих ошибок. Выбрав любое из этих сообщений в нижней части окно IDE сделает переход курсора на строку, содержащую выбранную ошибку. |
Имя типа | Короткое название | Кол. байт | Минимальное значение | Максимальное значение |
short int | short | 2 | -32 768 | 32 768 |
int | int | 4 | -2 147 483 648 | 2 147 483 647 |
long int | long | 4 | -2 147 483 648 | 2 147 483 647 |
long long int | long long | 8 | -9 223 372 036 854 775 808 | 9 223 372 036 854 775 807 |
unsigned short | unsigned short | 2 | 0 | 65 535 |
unsigned int | unsigned | 4 | 0 | 4 294 967 295 |
unsigned long int | unsigned long | 4 | 0 | 4 294 967 295 |
unsigned long long int | unsigned long long | 8 | 0 | 18 446 744 073 709 551 615 |
Для многих вычислительных задач требуются дробные числа. C ++ поддерживает такие нецелые числа, и они называются числами с плавающей точкой. Имя происходит из того, что во время математических вычислений десятичная точка может перемещаться или «плавать».
Существуют различные типы чисел с плавающей точкой. Тип double используется чаще, так как он расшифровывается как «с плавающей точкой двойной точности», и может представлять более широкий диапазон значений с и с большей точностью. Переменные типа double следует использовать для вычислений, где требуется высокая точность.
Тип float представляет значения с плавающей точкой одинарной точности, которые являются менее точными, как показано в таблице 2
Таблица 2. Характеристики чисел с плавающей точкой на 32-х разрядных процессорах
Имя типа | Кол. байт | Минимальное положительное значение | Максимальное значение |
float | 4 | 1,17549×10-38 | 3,40282×1038 |
double | 4 | 2,22507×10-308 | 1,79769×10308 |
long double | 8 | 2,22507×10-308 | 1,79769×10308 |
Пример создания двух переменных типа с плавающей точкой представлен ниже. В выражении для переменной s2 символ f означает, что число следует представлять, как число с плавающей точкой одинарной точности.
float s2 = 5.13f;
double s3 = 5.13;
Тип данных char используется для представления отдельных символов: букв алфавита (как верхнего, так и нижнего регистра), цифры, знаки пунктуации и управляющие символы (например, символы новой строки и символы табуляции). Большинство систем поддерживают набор символов Американского стандартного кода для обмена информацией (ASCII). Стандарт ASCII может представлять 128 символов.
В C ++ символы заключаются в одинарные кавычки ('), как в примере
char ch = 'A';
Стандартные (двойные) кавычки (") зарезервированы для строк и не допускаются для символов.
В памяти переменные типа char хранятся в виде целочисленных значений, и C++ позволяет присваивать числовые значения символьным переменным и присвоение символов числовым переменным и такая запись равносильна предыдущей.
ch = 65; // 65 – ASCII код буквы A
Строка это последовательность символов, наиболее часто используемая для представления слов и имен.
Строка должна быть заключена в двойные кавычки, например,
strings = “Helloworld”;
C ++ поддерживает нечисловой тип данных bool, который является очень простым и может представлять только два значения: истина или ложь. Этот тип данных часто используется в оценке значений логических выражений в условных операторах и в других случаях.
bool t = true;
bool t = 123;
В последнем выражении 0 – это всегда false, ненулевое значение эквивалентно true.
C ++ поддерживает именованные константы. Константы объявляются, как переменные с добавлением ключевого слова const:
constdoublePI = 3.14159;
После объявления и инициализации константа может использоваться, как переменная во всех отношениях, кроме одного – константе нельзя повторно присвоить значение. Недопустимо, чтобы константа появлялась слева от оператора присваивания (=).
const string programAuthor = “Ivanov Anton”;
Локальные переменные – это переменные, которые определяются внутри функции и используются только внутри функции . В языке С++ локальные переменные можно определять внутри блока программы.
Блок программы – это набор директив (в том числе и описание переменных), которые заключены в фигурные скобки.
Локальные переменные имеют некоторые очень желательные свойства:
Локальная переменная занимает память только тогда, когда переменная находится в области видимости. Локальные переменные создаются при входе в блок и ликвидируются при выходе. Переменные, которые объявлены в одном блоке, не имеют никакого отношения к переменным другого блока даже в случае совпадения имен. Локальная переменная является временной, поэтому ее значение теряется между вызовами функций.
Иногда желательно иметь переменную, которая живет до тех пор, пока работает программа; то есть, пока основная функция не завершится.
В отличие от локальной переменной, глобальная переменная объявляется вне всех функций и не является локальной для каких-либо конкретных функций.
void main()
{
…
// 1-йблок.
{
int x, y, z;
...
}
// 2-йблок.
{
int x, y, z;
...
}
}
Переменные x, y, z первого блока никак не связаны с переменными x, y, z второго блока. Параметры, которые перечисляются в заголовке функции, относятся к локальным переменным.
Глобальные переменные – это те переменные, которые объявляются вне функции (перед заголовком функции или блока программы). Глобальные переменные можно использовать в любой директиве, независимо от того, в какой функции или в каком блоке эта директива используется.
#include"stdafx.h"
#include
int x; // глобальная переменная x
void doSomething()
{
// Глобальные переменные можно использовать в любом месте программы
x = 4;
}
int _tmain(int argc, _TCHAR* argv[])
{
doSomething();
x = 7;
std::cout << x << "\n";
return 0;
}
Переменные во внутреннем блоке скрывают переменные с теми же именами во внешнем блоке, локальные переменные скрывают глобальные переменные с одинаковыми именами внутри блока, в котором они определены. Однако, с помощью оператора разрешения области видимости (::), компилятору можно сообщить, какую версию переменной вы хотите использовать: глобальную или локальную.
#include"stdafx.h"
#include
int x = 4; // глобальнаяпеременная
int _tmain(int argc, _TCHAR* argv[])
{
int x = 8; // эта переменная (локальная) скрывает значение глобальной переменной
x++; // увеличивается локальная переменная value, не глобальная
::x--; // уменьшается глобальная переменная value, не локальная
std::cout << "Global value: " << ::x << "\n";
std::cout << "Local value: " << x << "\n";
return 0;
}
Результат работы программы:
Global value: 3
Local value: 9
Однако, не рекомендуется использовать одинаковые имена для локальных и глобальных переменных, т.к. возможны проблемы и ошибки.
Статические переменные
Память для локальных переменных и параметров функций выделяется во время выполнения, когда функция начинает выполняться. Когда функция завершается, память, используемая для локальных переменных и параметров освобождаются для других целей.
Поскольку локальные переменные являются временными, функция не может сохранять какую-либо информацию между вызовами. C ++ обеспечивает способ, которым локальная переменная в функции, может быть сохранена между вызовами.
Листинг показывает, как объявление статической локальной переменной позволяет ей оставаться в памяти на время выполнения программы.
#include
#include
int count() {
// переменная cnt's сохраняется между вызовами, так как объявлена
// как статическая
staticintcnt = 0;
return ++cnt; // Увеличение и возврат текущего значения count
}
int main()
{
// Подсчетдо 10
for (int i = 0; i < 10; i++)
std::cout << count() << ' ';
std::cout << '\n';
}
Функция count() вызывается 10 раз. Каждый раз, при вызове статическая переменная cntувеличивается. В результате выводится ряд:
1 2 3 4 5 6 7 8 9 10
Если удалить слово static из листинга перекомпилировать его и запустите снова, то получим:
1 1 1 1 1 1 1 1 1 1
Так как новая память выделяется для переменной cnt каждый раз, когда вызывается функция.
Локальное объявление переменной static int cnt = 0;
выделяет место для cnt и присваивает ему ноль один раз - в начале выполнения программы. Память для переменной cnt не освобождается, пока программа не закончит свое выполнение.
Операторы для консольного ввода/вывода
В С++ существует библиотека ввода-вывода iostream, использующая концепцию объектно-ориентированного программирования:
#include
сin это объект входного потока пространства имен std: std::cin >> x; В данном коде программы используется оператор cin, операция взятия из потока >> чтобы получить от пользователя введенное им значение. Объект std::cin забирает вводимую пользователем информацию из стандартного потока ввода, который обычно является клавиатура.
Объект std::cout выводит информацию в стандартный поток вывода, который обычно является экран. Оператор cout помещает в поток <<, чтобы вывести на экран пользователю определенную информацию.
Библиотека iostream определяет три стандартных потока:
cin стандартный входной поток (stdin в С)
cout стандартный выходной поток (stdout в С)
cerr стандартный поток вывода сообщений об ошибках (stderr в С)
Для сокращения записи необходимо подключить имен
using namespace std;
Напишем программу, которая находит сумму двух целых чисел и выводит результат на экран.
#include
using namespace std;
voidmain ()
{
int x,y; //объявляем переменный целого типа
cin>>x; //вводим с клавиатуры первое число
cin>>y; //вводим с клавиатуры второе число
cout<<"x+y= "<
}
Символ '\n' служит для перевода курсора на новую строку.
Фрагмент кода
std :: cin >> x;
std :: cout << x;
может быть записан в явном виде:
cin.operator>>(x);
cout.operator<<(x);
Первый оператор вызывает метод operator >> от имени объекта std :: cin, передающего переменную х по ссылке. Второе выражение вызывает метод оператора << от имени объекта std :: cout передавая значение переменной х.
В следующем листинге программа работает нормально, пока пользователь вводит целочисленное значение. Что делать, если пользователь
вводит слово «five» вместо целого числа? Программа выдаст неверные результаты. Можно использовать некоторые дополнительные методы, доступные для объекта std :: cin, для создания более надежной программы.
Следующая программа обнаруживает недопустимый ввод и продолжает вводить, пока пользователь не предоставит приемлемое значение.
#include
#include
int main() {
int x;
std::cout << "Please enter an integer: ";
// Цикл продолжается до тех пора пока пользователь вводит
// неверное значение
while (!(std::cin >> x)) {
std::cout << "Bad entry, please try again: ";
// Очисткабуфераввода
std::cin.clear();
std::cin.ignore(std::numeric_limits
}
std::cout << "Вы ввели " << x << '\n';
}
В этой программе выражение
std :: cin >> x
имеет логическое значение, которое мы можем использовать в условном или итеративном выражении. Если пользователь вводит значение с типом, совместимым с объявленным типом переменной, выражение оценивается как true; в противном случае это интерпретируется как false.
Выражение ! (std :: cin >> x) возвращает значение true, если ввод неправильный. Неверный ввод символов пользователя, приводит к тому, что объект std :: cin переходит в состояние ошибки.
Объект входного потока остается в состоянии ошибки, пока программист не сбросит его вручную с помощью выражения
cin.clear(); // сбрасывает объект потока, чтобы он мог обрабатывать больше входных данных.
Если в буфере ввода остаются символы, то это также может привести к переходу объект потока в ошибочное состояние
Очистка объекта потока не удаляет оставшиеся нажатия клавиш. Решение состоит в том, чтобы удалить из буфера клавиатуры все символы, которые пользователь ввел с момента последнего действительного ввода данных.
Выражение
cin.ignore(numeric_limits
удаляет из буфера все символы, вплоть до символа новой строки ('\ n').
Вызов функции numeric_limits
Как только объект потока был сброшен из состояния ошибки и буфер клавиатуры пуст, пользовательский ввод может действовать как обычно.
1 Версия дистрибутива возможно измениться.
2 В этом формате часть, заключенная в фигурные скобки необязательная