Смекни!
smekni.com

Курс лекции по Информатике (стр. 8 из 11)

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

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

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

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

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

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

Текст на Си или просто текст, заключенный в скобки /* и */, компилятором игнорируется.

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

Одним из удобных отличий языка Турбо Си является наличие в нем вложенных комментариев. Вложенные комментарии особенно полезны при отладке программы. Если программа работает не так, как надо, то иногда оказывается полезным закомментировать часть кода, заново скомпилировать программу и выполнить ее. Если теперь программа начнет работать правильно, то, значит, закомментированный код содержит ошибку и должен быть исправлен. Поскольку и сам исходный текст может содержать комментарии, то рассматриваемая возможность Турбо Си, позволяет быстро удалить фрагмент кода из текста программы.

Во многие программы на Си подставляются один или несколько файлов. Появление директив

#include <файл_1>

#include “файл_2”

приводит к тому, что препроцессор подставляет на место этих директив тексты файлов файл_1, файл_2, … соответственно.

Если имя файла заключено в угловые скобки < >, то поиск файла производится в специальном разделе подстановочных файлов. Если в разделе отсутствует искомый файл, то препроцессор выдает сообщение об ошибке и процесс препроцессирования, компилирования и загрузки прерывается.

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

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

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

Каждый исполняемый файл системы Турбо Си должен содержать функцию main. Эта функция может не иметь параметров, и тогда ее описание – main(). Если функция mainимеет параметры, то эти параметры выбираются из строки вызова и их значения – строки символов. В этом случае заголовок mainимеет вид

main ( intargc, char* argv[] )

Код, задающий тело функции main, заключается в фигурные скобки { и }. Общая структура функции main такова :

main( )

{

}

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

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

intnumber_of_marbles,

number_of_pebbles;

float weight;

int exam_score;

char ch;

В первом описании имеется список переменных, содержащих два имени (number_of_marbles и number_of_pebbles). Обе переменные описываются как целые (int). Переменная exam_scoreцелого типа и описана отдельно, хотя ее можно и добавить к первому списку целых переменных.

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

Переменные можно инициализировать в месте их описания. Поясним сказанное примером

intheight = 71;

float income = 26034.12,

bank_balance = 4052.67,

time;

Переменным height, incomeи bank_balanceприсваиваются начальные значения, а переменной timeне присваивается.

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

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

Стандарт Турбо Си поддерживает прототипы функций. Назначение прототипов функций можно проиллюстрировать на примере функции, возвращающей куб ее вещественного аргумента.

double cube ( double x )

{

return x*x*x;

}

Аргумент x типа doubleспецифицируется вслед за первой открывающей скобкой. В соответствии с более старым стандартом K&R Си описание этой функции выглядело бы так:

double cube ( x )

double x;

{

returnx*x*x;

}

В Турбо Си для достижения совместимости прежних программ на Си вверх разрешено использовать старый стандарт K&R.

Турбо Си предоставляет необычайно высокую гибкость для физической организации программы или программной системы. Ниже представлена типичная организация небольшой программы на Турбо Си. Заметим, что обычно (но не обязательно) первой по порядку в тексте программы функцией является функция main.

/* Заголовки и комментарии, описывающие программу */

/* Директивы include */

#include имя_файла_1

#include имя_файла_n

/* Макро */

#define макро_1 значение_1

#define макро_n значение_n

/* Описание глобальных переменных */

тип_данных глобальная_переменная_1;

тип_данных глобальная_переменная_k;

main()

{

/* Описание extern, обеспечивающее ссылку вперед на функции и используемые в теле функции main */

/* Описание локальных переменных */

тип_данных локальная_переменная_1;

тип_данных локальная _переменная_m;

/* Тело функции main */

}

/* Функции, используемые в программе main */

тип_данных имя_функции_1( формальные параметры )

{

/* Описание extern, обеспечивающее ссылку вперед на функции и используемые в теле данной функции */

/* Описание локальных переменных */

тип_данных локальная_переменная_1;

тип_данных локальная _переменная_u;

/* Тело функции – 1 */

}

тип_данных имя_функции_p( формальные параметры )

{

/* Описание extern, обеспечивающее ссылку вперед на функции и используемые в теле данной функции */

/* Описание локальных переменных */

тип_данных локальная_переменная_1;

тип_данных локальная _переменная_r;

/* Тело функции – p */

}

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

Отметим, что Турбо Си реализует достаточно совершенный стандарт для языка Си. В Турбо Си имеется сильная поддержка работы в среде MS-DOS для процессора 80х86, реализованная в виде расширений языка, которые обычно не представлены в других реализациях Си. Использование указанных расширений делает немобильной часть системы или всю систему, реализованную в Турбо Си. Однако предоставляемые при этом преимущества могут иметь для программиста решающее значение.

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

Лекция 11

Структура простой программы на Си

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

#include<stdio.h>

main( ) /*Простаяпрограмма*/

{

int num;