Тема 5. Методы, технологии и инструментальные средства программирования.

Организация и основные функции инструментальной системы программирования. Понятия и возможности интегрированной системы программирования. Правила работы в интегрированной системе программирования.

Препроцессорные средства. Препроцессорные средства. Стадии и команды препроцессорной обработки. Замены в тексте. Включение текстов из файлов. Условная компиляция. Макроподстановки средствами препроцессора. Встроенные (заранее определенные) макроимена.

Директивы препроцессора – это инструкции, записанные в тексте программы, и выполняемые до ее трансляции. Они позволяют изменить текст программы, например, заменить некоторые фрагменты текста, вставить текст из другого файла, запретить трансляцию части текста и т.п. Директивы препр. Нач-ся со знака # решетка, в конце ; точка с запятой не ставятся.

Директива #include включает в текст программы содержимое указанного файла.

#include "имя файла"

#include <имя файла>

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

Директива #define служит для замены одного фрагмента текста другим. Идентификаторы, заменяющие текстовые или числовые константы, называют именованными константами. Идентификаторы, заменяющие фрагменты программ, называют макроопределениями, которые могут иметь аргументы.

#define идентификатор текст

#define идентификатор (список параметров) текст

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

#define WIDTH 80

#define LENGTH (WIDTH+10)

Эти директивы изменят в тексте программы каждое слово WIDTH на число 80, а каждое слово LENGTH на выражение (80+10) вместе с окружающими его скобками. Скобки, содержащиеся в макроопределении, позволяют предотвратить ошибки при вычислении выражений из-за нарушения последовательности операций. При отсутствии скобок выражение t=LENGTH*7 будет преобразовано в выражение t=80+10*7, а не в t=(80+10)*7, как это получается при скобках, и в результате получится 780, а не 630. Во втором случае у #define имеется список формальных параметров. Они в тексте макроопределения отмечают позиции на которые должны быть подставлены фактические аргументы макровызова. При макровызове вслед за идентификатором записывается список фактических параметров, количество которых должно совпадать с количеством формальных параметров.

#define MAX(x,y) ((x)>(y))?(x):(y)

Эта директива заменит фрагмент

t=MAX(i,s[i]);

на фрагмент

t=((i)>(s[i])?(i):(s[i]);

Директива #undef отменяет соответствующее определение #define.

Синтаксис и семантика языка программирования: алфавит, понятия, синтаксические правила. Формы описания синтаксиса и семантики языка. Металингвистические переменные, нечеткие металингвистические переменные. Компиляция и интерпретация. Основные этапы компиляции. Средства управления процессами компиляции и исполнения программ (директивы компилятора языка Visual C++, их виды и назначение).

Алфавит – набор символов, из которых может состоять программа. Набор понятий – идентификатор, переменная, операция, выражение, оператор, блок и т.д.

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

< идентификатор > :: = < буква >

| < идентификатор > < буква >

| < идентификатор > < цифра >

<прав_послед_скобок> ::= <пусто>

| (<прав_послед_скобок>)

| < прав_послед_скобок >< прав_послед_скобок >

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

Для управления процесс компиляции, обеспечения условной трансляции используются директивы #if, #elif, #else, #endif. Для диагностики компиляции используются директивы #error, #warning, #line. Для управления исполнением – #pragma.

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

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

Интегрированные среды разработки IDE, Integrated Development Environment имеют большой набор инструментов для разработки программ. Редактор текстов, компилятор, интерпретатор, отладчик, просмотрщик объектов, справочную систему помощи Help.

IDE MS VisuslStudio запускается из меню «Пуск» обычным образом. Выбирать тип проекта «консольное приложение», Win32 Console Application. Проекты необходимо сохранять на диске студента H:. Каждый прект должен быть в отдельной папке. Хранить до конца семестра.

Пуск -> Все программы-> Microsoft Visual Studio

File -> New -> Project

win32 -> win32 console application

Application settings -> Application settings

Тема 5. Методы, технологии и инструментальные средства программирования. - student2.ru

Рис.5. Выбор типа приложения.

Для добавления фала в проект используется коменда

Project -> Add new item -> C++ source file (.cpp)

Тема 5. Методы, технологии и инструментальные средства программирования. - student2.ru

Рис.6. Программа Здравствуй мир, Hello world.

Для сборки и отладки использовать команды, полный набор которых содержится в меню Build (Сборка). Здесь же видны сочетания «горячих клавиш», которые можно нажимать для быстрого запуска той или иной команды:

Ctrl+F7 или Build -> Compile – скомпилировать текущий (открытый в редакторе) файл с исходным текстом программы, выдать ошибки компиляции (если будут).

F7 или Build -> Build Solution – полностью собрать все решение, включая компиляцию всех исходных текстов и линковку всех проектов. При этом компилироваться и линковаться будут только измененные с последней сборки файлы, это очень экономит время сборки.

Ctrl+Alt+F7 или Build -> Rebuild Solution – полная пересборка решения: перекомпилируются абсолютно все файлы, составляющие проекты решения. Иногда помогает устранить непонятные ошибки компиляции, вызываемые сбоями сетевого оборудования.

Ctrl+F5 или Debug -> Start Without Debugging – запустить собранную программу на выполнение без отладчика.

F5 или Debug -> Start Debugging – запустить собранную программу на выполнение под отладчиком.

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

Тема 6. Функции и методы

Способы задания. Описание. Передача параметров. Способы вызова.

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

В программах на СИ должны явно объявляться все переменные вместе с указанием их типов.

[спецафикатор-класа-памяти] спецификатор-типа

описатель [=инициатор] [,описатель [= инициатор] ]...

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

Спецификатор класса памяти - определяется одним из четырех ключевых слов языка СИ: auto, extern, register, static, и указывает,каким образом будет распределяться память под объявляемую переменную, с одной стороны, а с другой, область видимости этой переменной, т.е., из каких частей программы можно к ней обратиться.

Переменная любого типа может быть объявлена как немодифицируемая. Это достигается добавлением ключевого слова const к спецификатору-типа. Данные с типом const представляют собой данные используемые только для чтения, т.е. этой переменной не может быть присвоено новое значение.

При объявлении переменной ей можно присвоить начальное значение, присоединяя инициатор к описателю. Инициатор начинается со знака "=" и имеет следующие формы.

Формат 1: = инициатор;

Формат 2: = { список - инициаторов };

Стандартные типы данных. Базовые типы данных. Время жизни и области значений переменных. Основные базовые типы данных, представление в памяти, диапазоны значений.

Для определения данных целого типа используются различные ключевые слова:

char 1 байт от -128 до 127

int 2 байта

short 2 байта от -32768 до 32767

long 4 байта от -2 147 483 648 до 2 147 483 647

unsigned shar 1 байта oт 0 до 255

unsigned int 2 байта от 0 до 65535

unsigned short 2 байта от 0 до 65535

unsigned long 4 байта от 0 до 4 294 967 295

Ключевые слова signed и unsigned необязательны. Они указывают, как интерпретируется нулевой бит объявляемой переменной, т.е., если указано ключевое слово unsigned, то нулевой бит интерпретируется как часть числа, в противном случае нулевой бит интерпретируется как знаковый. В случае отсутствия ключевого слова unsigned целая переменная считается знаковой. В том случае, если спецификатор типа состоит из ключевого типа signed или unsigned и далее следует идентификатор переменной, то она будет рассматриваться как переменная типа int.

unsigned int n;

unsigned int b;

int c; //подразумевается signed int c

unsigned d; //подразумевается unsigned int d

signed f; //подразумевается signed int f

Модификатор-типа char используется для представления символа (из массива представление символов) или для объявления строковых литералов. Значением объекта типа char является код (размером 1 байт), соответствующий представляемому символу. Для представления символов русского алфавита, модификатор типа идентификатора данных имеет вид unsigned char, так как коды русских букв больше 127.

В зависимости от компьютера и компилятора размер памяти под данные одного и того же типа может быть разным. Более точно характеристики типов данных см. в документации! Для определения длины памяти занимаемой переменной можно использовать операцию sizeof языка СИ, возвращающую значение длины указанного модификатора-типа.

a = sizeof(int);

b = sizeof(long int);

c = sizeof(unsigned long);

d = sizeof(short);

Для определения данных нецелого типа, т.н. с плавающей точкой, используются слова float, double, long double.

float f, a, b;

double x,y;

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

enum [имя-тега-перечисления] {список-перечисления} описатель[,описатель...];

enum имя-тега-перечисления описатель [,описатель..];

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

В первом формате имена и значения перечисления задаются в списке перечислений. Необязательное имя-тега-перечисления, это идентификатор, который именует тег перечисления, определенный списком перечисления. Описатель именует переменную перечисления. В объявлении может быть задана более чем одна переменная типа перечисления. Список-перечисления содержит одну или несколько конструкций вида:

идентификатор [= константное выражение]

Каждый идентификатор именует элемент перечисления. Все идентификаторы в списке enum должны быть уникальными. В случае отсутствия константного выражения первому идентификатору соответствует значение 0, следующему идентификатору - значение 1 и т.д.

enum week {VS, PN, VT, SR, CH, PT, SB, VS} rab_ned ;

В данном примере объявлен перечислимый тег week, с соответствующим множеством значений, и объявлена переменная rab_ned имеющая тип week.

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

enum week rab1;

Организация памяти и указатели языка Си. Указатели. Ссылочный (указательный) тип.

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

спецификатор-типа [ модификатор ] * описатель .

Спецификатор-типа задает тип объекта и может быть любого основного типа, типа структуры, смеси (об этом будет сказано ниже).

В качестве модификаторов при объявлении указателя могут выступать ключевые слова const, near, far, huge. Const говорит о том, чточто указатель не может быть изменен. Размер указателя зависит от компьютера и от используемой модели памяти, для которой будет компилироваться программа. Для модификации размера указателя используются ключевые слова near, far, huge.

int * a; // указатель а указывает на тип unsigned int

double * x; // х указывает на переменную типа double

char * fuffer ; // fuffer указывает на переменную типа char

double nomer;

void *addres;

addres = & nomer;

(double *)addres ++;

Переменная addres объявлена как указатель на объект любого типа. Поэтому ей можно присвоить адрес любого объекта (& - операция вычисления адреса). Однако, как было отмечено выше, ни одна арифмитическая операция не может быть выполнена над указателем, пока не будет явно определен тип данных, на которые он указывает. Это можно сделать, используя операцию приведения типа (double *) для преобразования addres к указателю на тип double, а затем увеличение адреса.

const * dr;

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

unsigned char * const w = &obj.

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

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

Приведение типов это изменение (преобразование) типа объекта. Для выполнения преобразования необходимо перед объектом записать в скобках нужный тип:

( имя-типа ) операнд.

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

int i;

double x;

b = (double)i+2.0;

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

Наши рекомендации