русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Выведенный в консольное окно текст на русском языке будет нечитабельным.


Дата добавления: 2014-04-05; просмотров: 878; Нарушение авторских прав


Вот второй вариант этой же программы, лишенный этих недостатков:

 

#include <iostream> /* Директива препроцессору включить в текст заголовочный файл библиотеки классов C++ для управления вводом – выводом */

using namespace std;/*Директива компилятору использовать пространство имен std стандартной библиотеки С++ */

int main() // Основная функция программы – начало выполнения программы

{

setlocale(0, ""); // Установка локальных настроек на вывод русского текста

cout << "Это пример программы на языке С++" << endl; // Вывод на экран

system("Pause"); // Приостановка выполнения программы

return 0; // Выход из функции и из программы

}

 

А вот пример более сложной программы, содержащей две функции:

 

#include <iostream>

using namespace std;

int sum(int a, int b)

{

int c = a + b;

return c;

}

int main()

{

setlocale(0, "");

cout << "5 + 7 = " << sum(5, 7) << endl;

system("Pause");

return 0;

}

 

Более интересный вариант этой же программы, выполняющий сложение любых целых чисел, введенных с клавиатуры:

 

#include <iostream>

using namespace std;

int sum(int a, int b)

{

int c = a + b;

return c;

}

int main()

{

int s1, s2;

setlocale(0, "");

cout << "Введите первое слагаемое: ";

cin >> s1;

cout << "Введите второе слагаемое: ";

cin >> s2;

cout << s1 << " + " << s2 << " = " << sum(s1, s2) << endl;

system("Pause");

return 0;

}

 

2.4. Трансляция программ и их выполнение

При желании исходный текст программ можно вводить с помощью любого текстового редактора (например, с помощью Блокнота или WordPad) и обязательно сохранять его именно в текстовом формате без информации форматирования. Дело в том, что информация о форматировании помешает работе C++ - компилятора.



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

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

Способ компиляции программ зависит от используемого компилятора и выбранных опций. Более того, многие компиляторы, например Visual С++ (Microsoft) и С++ Builder (Borland), предоставляют два различных способа компиляции программ: с помощью компилятора командной строки и интегрированной среды разработки (Integrated Development Environment — IDE). Поэтому для компилирования С++ - программ невозможно дать универсальные инструкции, которые подойдут для всех компиляторов.

Поскольку самыми популярными компиляторами являются Visual С++ и С++ Builder, здесь приведены инструкции по компиляции программ, соответствующие этим компиляторам.

Чтобы скомпилировать программу MyProg.срр, используя Visual С++ компилятор командной строки, необходимо ввести следующую командную строку:

 

C:\...>cl -GX MyProg.срр

 

Чтобы скомпилировать программу MyProg.срр, используя С++ Builder, необходимо ввести такую командную строку:

 

С: \...>bcc32 MyProg.срр

 

В результате работы С++-компилятора получается выполняемый объектный код. Для
Windows-среды выполняемый файл будет иметь то же имя, что и исходный, но другое
расширение, а именно расширение .exe. Итак, выполняемая версия программы
MyProg.срр будет храниться в файле MyProg.ехе.

При использовании интегрированных сред разработки (IDE) соответствующие действия выполняются с помощью соответствующих команд меню.

Скомпилированная программа готова к выполнению. Поскольку результатом работы
C++ компилятора является выполняемый объектный код, то для запуска программы MyProg.ехе необходимо выполнить командную строку:

 

С:\...>MyProg.exe

 

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

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

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

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

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

При разработке программ возникают ошибки трех видов:

Синтаксические ошибки - нарушения синтаксиса (то есть грамматических правил) языка программирования, например, пропущена точка с запятой;

2. Ошибки периода выполнения – возникающие только при работе программы (например, деление на 0);

3. Логические ошибки – ошибки исходного алгоритма (например, вместо операции + ошибочно использована операция *).

 

 

Исходный текст программы (.cpp)
Препроцессор
Полный текст (.cpp)
Компилятор
Объектный код (.obj)
Компоновщик
Исполняемая программа (.exe)
Включаемые файлы (.h)
Библиотечные модули

 

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

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

Логические ошибки компилятором и исполняющей системой компьютера не обнаруживаются и могут привести к непредсказуемому поведению программы. Обнаружить такие ошибки можно только путем анализа результатов работы программы на различных наборах тестовых данных, но и в этом случае 100% уверенности в правильности работы программы никогда нельзя дать.

3. Стандартные (базовые) типы данных, операции и выражения

 

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

3.1. Типы данных, переменные и константы

Понятие типов данных

Любая программа предназначена для обработки некоторых данных. Данные представляют некоторую информацию. Информация многообразна – это числовая информация, текстовая информация, аудио и видеоинформация и т.д. Однако, несмотря на многообразие видов информации, внутреннее машинное представление ее едино. Любые данные хранятся в памяти компьютера в виде двоичных кодов.

Память компьютера можно представить в виде непрерывной последовательности двоичных ячеек, каждая из которых может находиться в двух состояниях условно обозначаемых 0 и 1. Каждая такая двоичная ячейка называется битом. Вся эта последовательность ячеек условно разбита на порции из 8 бит, называемые байтами. Таким образом, 1 байт = 8 битам. Байт является основной единицей измерения объема памяти.


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

Пусть, например, программе необходимо вывести на экран данные, хранящиеся в байте с адресом 1. Но как это сделать? Ведь двоичный код, содержащийся в этом байте, можно трактовать по-разному: это может быть число, а может быть это некоторая буква. Таким образом, программе для правильной обработки этого байта необходимо «знать» что это – число или буква. Другими словами, программе необходимо точно представлять какие данные хранятся в этом байте памяти.

Для разрешения подобных коллизий в языках программирования введено понятие типов данных.

Тип данных для каждого программного объекта, представляющего данные, определяет:

· характер данных (число, со знаком или без знака, целое или с дробной частью, одиночный символ или текст, представляющий последовательность символов и т.д.);

· объем памяти, который занимают в памяти эти данные;

· диапазон или множество возможных значений;

· правила обработки этих данных (например, допустимые операции).

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

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

Классификация простых предопределенных типов данных

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

· int (целый);

· float (вещественный);

· double (вещественный тип с двойной точностью);

· bool (логический);

· char (символьный).

Типы int, bool и char относят к группе целочисленных (целых) типов, а float и double - к группе вещественных типов - типов с плавающей точкой. Код, который формирует компилятор для обработки целых величин, отличается от кода для величин с плавающей точкой.

Существует четыре спецификатора типа, уточняющих внутреннее представление и диапазон значений стандартных типов:

· short (короткий);

· long (длинный);

· signed (знаковый);

· unsigned (без знаковый).

Спецификаторы добавляются слева к названию типа, например, так:

 

short int – короткое целое;

unsigned short int - короткое целое без знака.

 

Спецификаторы могут в произвольном порядке. Например: unsigned short int эквивалентно short unsigned int.

Допустимы не все сочетания спецификаторов и типов данных. Например: unsigned double является недопустимым сочетанием. Есть и другие варианты. Допустимые сочетания спецификаторов и типов данных будут приведены при рассмотрении конкретных типов данных.

Переменные, константы

В программах данные представлены константами и переменными.

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

Общее правил определения переменной можно сформулировать так:

 

[класс памяти] <тип данных> <идентификатор - имя> [инициализатор];

 

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

Примеры описания переменных:

 

int а; // переменная a типа int (целого типа)

double х; // переменная х типа double (вещественного типа с двойной точностью)

unsigned short int d; // переменная d – короткое целое без знака

 

Однотипные переменные можно определять в одной строке:

 

int i, j, k;

 

Описание переменной можно совместить с ее инициализацией:

 

int а = 1213; // переменная a инициализирована значением 1213

double х = 0.003; // переменная х инициализирована значением 0.003

unsigned short int d = 13; // переменная d инициализирована значением 13

 

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

 

int а (1213); // переменная a инициализирована значением 1213

double х (0.003); // переменная х инициализирована значением 0.003

unsigned short int d (13); // переменная d инициализирована значением 13

 

Определения неинициализированных и инициализированных однотипных переменных можно совмещать в одной строке:

 

int i = 0, j, k (10);

 

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

 

double y = a * x; /* переменная y инициализирована значением равным произведению значений переменных a и x */

 

При инициализации переменной присваивается конкретное значение. Однако, если переменная не инициализирована, это не означает, что она не имеет значения. На самом деле она хранит некоторое значение, которое находилось в этой области памяти до определения переменной. Это значение невозможно предсказать. Такие случайные данные обычно называют “мусором”.

Во время выполнения программы значение переменной можно изменять.

 

Константа – это величина, значение которой в процессе работы программы не изменяется.

Константы бывают двух видов: константы – литералы и именованные константы.

Константы – литералы представляют собой сами значения. Например:

 

123 -245 0.003 -12.45 ’R’ ”Это текст”

 

Тип данных, которому принадлежит констант – литера, определяется компилятором автоматически по виду самого значения. Способы записи констант – литералов разных типов будет рассмотрены позже при изучении соответствующих типов данных.

Именованные константы задаются с помощью ключевого слова const:

 

const double Pi = 3.14;

const int c1 = 1000, c2 = 2000;

const char point = ’.’;

 

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

 

3.2. Целочисленные типы данных

Размер типа int не определяется стандартом, а зависит от компьютера и компилятора. Для 16-разрядного процессора под величины этого типа отводится 2 байта – в этом случае диапазон возможных значений составляет -32 768 ... 32 767 (2 в степени 16 различных значений). Для 32-разрядного - 4 байта – диапазон значений -2 147 483 648 ... 2 147 483 647 (2 в степени 32 различных значений).

Спецификатор short перед именем типа указывает компилятору, что под число требуется отвести 2 байта независимо от разрядности процессора.

Спецификатор long означает, что целая величина будет занимать 4 байта. Таким образом, на 16-разрядном компьютере эквиваленты int и short int, а на 32-разрядном — int и long int.

При определении переменных вместо short int или long int можно использовать более короткие обозначения: short или long соответственно:

 

short a;

long b;

 

Использование типов int, short int (short), long int (long) подразумевает представление целых чисел со знаком, поэтому спецификатор signed можно не указывать.

Внутреннее представление величины целого типа — целое число в двоичном коде. Например, число +22 типа short int (short) представляются в памяти так:

 

Номера разрядов: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Значения разрядов: 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 ,

 

а отрицательное число -22 выглядит следующим образом:

 

Номера разрядов: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0

Значения разрядов: 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0

 

При использовании спецификатора signed (или при его отсутствии) старший бит числа (в данном случае – разряд с номером 15) интерпретируется как знаковый (О — положительное число, 1 — отрицательное).

Спецификатор unsigned позволяет представлять только положительные числа, при этом старший разряд рассматривается как часть кода числа. Таким образом, диапазон значений типа int зависит от спецификаторов. Диапазоны значений величин целого типа со спецификатором unsigned выглядят так:

 

unsigned int (16-разрядного процессор): от 0 до 65 535;

unsigned int (32-разрядного процессор): от 0 до 4 294 967 295;

unsigned short int или unsigned short (не зависимо от процессора): от 0 до 65 535.

 

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

Целые константы литералы можно задавать в трех форматах: в десятичном, восьмеричном и в шестнадцатеричном.

В десятичном формате целые значения записываются в обычном виде:

 

1345 +34 -245

 

В восьмеричном формате сначала записывается 0 (нуль), а за ним восьмеричные разряды самого числа:

 

011 07345 -0456

 

В шестнадцатеричном формате значащим разрядам числа должны предшествовать символы 0x или 0X:

 



<== предыдущая лекция | следующая лекция ==>
Выполнить результирующую программу. | X12B5 -0xAF2B 0X1FF02


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.87 сек.