Санкт-Петербургский государственный университет телекоммуникаций
им. проф. М. А. Бонч-Бруевича
С. В. Козин, Н. А. Матиясевич
Лекции по дисциплине
Программирование на языке высокого уровня
САНКТ-ПЕТЕРБУРГ 2012
1
Язык программирования Си разработан в начале 70-х годов Денисом Ритчи. Реализация языка относится к 1972г.
Язык Си традиционно используется для системного программирования. В частности, большая часть операционной системы UNIX была написана на этом языке. Однако язык Си находит широкое применение и в прикладном программировании.
Популярность языка Си обусловлена рядом факторов. Это эффективный, мощный язык программирования. Имеются два стандарта языка Си (С89 и С99). Оба стандарта содержат как определение языка, так и определение стандартной библиотеки. Для обеспечения переносимости программы следует использовать те его библиотечные функции, которые поддерживаются стандартом языка.
Воснову создания языка были положены следующие принципы:
●Доверять программисту.
●Не мешать использовать программисту те средства, которые ему нужны.
●Сохранять язык простым и компактным.
●Обеспечить только один способ выполнения любой операции.
●Быстродействию следует отдать предпочтение по отношению к переносимости.
Некоторые авторы относят Си к языкам среднего уровня. В этом языке можно обнаружить как черты языка высокого, так и низкого уровня. С языками высокого уровня Си сближает наличие всех стандартных управляющих структур, которые характерны для структурного программирования. В языке Си используется развитый механизм подпрограмм. Используемые в языке подпрограммы называются функциями.
С языками низкого уровня Си сближает возможность работы с битами, байтами и адресами. Для языка Си характерна сравнительно низкая типизация, присущая языкам низкого уровня. В связи с этим на начальном этапе развития язык Си справедливо называли ассемблером высокого уровня. Одним из факторов исходного языка Си, определяющих низкий уровень типизации, являлось отсутствие контроля соответствия между параметрами определения функции и аргументами ее вызова. Это было обусловлено особенностями организации функций (старый стиль). В настоящее время в основном используется стиль организации функций, который называют новым. Последний заимствован Си из языка С++. Этот стиль основан на использовании так называемых прототипов. Прототип функции позволяет обеспечить корректную компиляцию вызова функции. Тем не менее, стандарт языка С89 допускал компиляцию вызова функции и при отсутствии прототипа. В этом случае компилятор создавал так называемое неявное объявление функции. Стандарт С99 неявное объявление не поддерживает.
Оценивая в целом язык Си, следует отметить его широкое применение, как для системного, так и для прикладного программирования. Следует
2
учитывать и наличие значительного количество языков, которые заимствовали базовый механизм организации типов, операторов и управляющих конструкций языка Си. К таким языкам относятся языки С++, С# и Java.
К недостаткам языка обычно относят сравнительно низкую типизацию и сложный синтаксис некоторых его конструкций.
Прежде чем переходить к последовательному изложению материала сделаем следующее замечание. Существуют различные варианты перевода на русский язык некоторых английских терминов, используемых в языке Си. В этом вопросе будем придерживаться принятым в [1] правилам перевода английских терминов на русский язык. Например, английский термин operator будем переводить как оператор, а термин statement будет переводиться как инструкция.
Программа (Си - программа), написанная на языке Си, состоит из подпрограмм, которые в языке Си называются функциями. Точкой входа в Си – программу является функция main(). Отличие этой функции от других функций состоит в следующем:
●Выполнение Си - программы всегда начинается с первой инструкции функции main().
●Завершение работы функции main() приводит к окончанию работы всей программы.
Вотличие от некоторых других языков программа, написанная на языке Си, должна содержать, по крайней мере, одну подпрограмму (функцию). Такой функцией и является функция main().
Функция в языке Си является основным строительным элементом, который используется при написании программ. На практике количество функций в программе может оказаться очень большим. В связи с этим возникает необходимость в объединении логически связанных функций. Такое объединение реализуется с помощью так называемых модулей. Под модулем в языке Си понимается один файл исходного текста с расширением .с.
В общем случае Си – программа имеет многомодульную структуру. На начальном этапе изучения языка Си ограничимся программами, исходный текст которых находится в одном файле. Такие программы являются одномодульными. Рассмотрим структуру простейших одномодульных программ.
Как отмечалось выше, весь исходный текст одномодульной программы должен находиться в одном файле. Выделим среди одномодульных программ класс простейших одномодульных программ. К этому классу программ будем относить программы, состоящие только из одной функции main().В
3
настоящей части пособия будут рассматриваться только такие программы. Отметим еще одно ограничение приводимых программ – в них будут отсутствовать так называемые внешние переменные. Внешними переменными называются переменные, которые объявляются вне функций. Программы, приводимые в настоящей части пособия, содержат три структурных компонента:
●Комментарий, относящийся ко всей программе в целом.
●Директивы препроцессора.
●Определение функции main().
Остановимся на каждом из этих компонентов подробнее.
Комментарии используются для целей документирования программ. Комментарии не влияют на выполнение программы. При компиляции они удаляются из программы. Стандарт С99 позволяет использовать в программах комментарии двух видов:
●Комментарии, традиционные для языка Си.
●Однострочные комментарии, заимствованные из языка С++. Традиционный комментарий в языке Си – это последовательность
символов, входящих в его алфавит, которая начинается двумя символами “/*” и заканчивается этими же символами, следующими в обратной последовательности “*/.”. Такой комментарий может располагаться на нескольких строках. Приведем пример традиционного комментария.
/* Лабораторная работа № 1
Программирование линейных вычислительных процессов
*/
Однострочный комментарий начинается с двух символов косая черта “//”. Такой комментарий включает в себя все символы текущей строки, следующие за этими символами. Ниже приводится пример применения однострочных комментариев.
//Лабораторная работа № 2
//Программирование разветвляющихся вычислительных процессов
Следует учитывать, что не все компиляторы языка Си, используемые на практике, поддерживают однострочные комментарии.
Препроцессор – это программа, которая выполняет предварительную обработку исходного текста программы, написанной на языке Си. Иногда препроцессор является самостоятельной системной программой, в других случаях он входит в состав компилятора. Препроцессор управляется так
4
называемыми директивами. В простейшем случае директива препроцессора имеет следующую структуру:
#имя_директивы содержательная_часть
Директива препроцессора всегда начинается с символа “#”, за которым
следует имя директивы. Приведем примеры директив препроцессора:
#include<stdio.h>
#include<math.h> #define MAXSIZE 100
В приведенном выше примере имеются три директивы препроцессора. Имя первой директивы include, а в ее содержательной части находится заключенное в угловые скобки имя системного заголовочного файла stdio.h. Эта директива предписывает препроцессору включить вместо рассматриваемой директивы содержимое системного заголовочного файла stdio.h. Наличие в модуле такой директивы необходимо в том случае, когда в нем содержатся вызовы функций стандартного ввода – вывода. В заголовочном файле stdio.h содержаться объявления функций стандартного ввода – вывода (о понятии объявления функции смотри немного ниже). Вторая директива c именем include выполняет такую же работу, что и первая директива препроцессора, но для математического заголовочного файла math.h. Этот заголовочный файл необходимо подключать в том случае, когда в исходном тексте модуля имеются вызовы библиотечных математических функций. Третья директива предписывает препроцессору заменить в рассматриваемом файле исходного текста все вхождения слова MAXSIZE константой 100. Директива define используется для определения так называемых символических констант. В рассматриваемом случае такой константой является MAXSIZE. В языке Си существует традиция записывать заглавными буквами имя символической константы, определенной с помощью директивы define.
Определение функции main() строится по тем же правилам, что и определения других функций языка Си. Ее определение состоит из двух частей, которыми являются заголовок и тело. Существуют два вида допустимых заголовков функции main(). Первый вид заголовка используется в тех случаях, когда при запуске программы отсутствуют параметры, ей передаваемые. Такой вариант использования программы предусмотрен во всех задачах первой части настоящего пособия. В связи с этим ограничимся рассмотрением указанной разновидности заголовка функции main().
Заголовок функции main(), не принимающей параметров, имеет
следующий вид.
int main(void)
Рассматриваемый заголовок содержит следующую информацию:
● Функция имеет имя main. На это указывают круглые скобки, следующие за этим именем.
5