Материал: lectures_3

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Санкт-Петербургский государственный университет телекоммуникаций

им. проф. М. А. Бонч-Бруевича

С. В. Козин, Н. А. Матиясевич

Лекции по дисциплине

Программирование на языке высокого уровня

САНКТ-ПЕТЕРБУРГ 2012

1

Введение

Язык программирования Си разработан в начале 70-х годов Денисом Ритчи. Реализация языка относится к 1972г.

Язык Си традиционно используется для системного программирования. В частности, большая часть операционной системы UNIX была написана на этом языке. Однако язык Си находит широкое применение и в прикладном программировании.

Популярность языка Си обусловлена рядом факторов. Это эффективный, мощный язык программирования. Имеются два стандарта языка Си (С89 и С99). Оба стандарта содержат как определение языка, так и определение стандартной библиотеки. Для обеспечения переносимости программы следует использовать те его библиотечные функции, которые поддерживаются стандартом языка.

Воснову создания языка были положены следующие принципы:

Доверять программисту.

Не мешать использовать программисту те средства, которые ему нужны.

Сохранять язык простым и компактным.

Обеспечить только один способ выполнения любой операции.

Быстродействию следует отдать предпочтение по отношению к переносимости.

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

С языками низкого уровня Си сближает возможность работы с битами, байтами и адресами. Для языка Си характерна сравнительно низкая типизация, присущая языкам низкого уровня. В связи с этим на начальном этапе развития язык Си справедливо называли ассемблером высокого уровня. Одним из факторов исходного языка Си, определяющих низкий уровень типизации, являлось отсутствие контроля соответствия между параметрами определения функции и аргументами ее вызова. Это было обусловлено особенностями организации функций (старый стиль). В настоящее время в основном используется стиль организации функций, который называют новым. Последний заимствован Си из языка С++. Этот стиль основан на использовании так называемых прототипов. Прототип функции позволяет обеспечить корректную компиляцию вызова функции. Тем не менее, стандарт языка С89 допускал компиляцию вызова функции и при отсутствии прототипа. В этом случае компилятор создавал так называемое неявное объявление функции. Стандарт С99 неявное объявление не поддерживает.

Оценивая в целом язык Си, следует отметить его широкое применение, как для системного, так и для прикладного программирования. Следует

2

учитывать и наличие значительного количество языков, которые заимствовали базовый механизм организации типов, операторов и управляющих конструкций языка Си. К таким языкам относятся языки С++, С# и Java.

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

Прежде чем переходить к последовательному изложению материала сделаем следующее замечание. Существуют различные варианты перевода на русский язык некоторых английских терминов, используемых в языке Си. В этом вопросе будем придерживаться принятым в [1] правилам перевода английских терминов на русский язык. Например, английский термин operator будем переводить как оператор, а термин statement будет переводиться как инструкция.

1. Структура программы на языке Си

Программа (Си - программа), написанная на языке Си, состоит из подпрограмм, которые в языке Си называются функциями. Точкой входа в Си – программу является функция main(). Отличие этой функции от других функций состоит в следующем:

Выполнение Си - программы всегда начинается с первой инструкции функции main().

Завершение работы функции main() приводит к окончанию работы всей программы.

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

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

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

2. Структура простейшей одномодульной программы

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

3

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

Комментарий, относящийся ко всей программе в целом.

Директивы препроцессора.

Определение функции main().

Остановимся на каждом из этих компонентов подробнее.

2.1.Комментарии в программе на языке Си

Комментарии используются для целей документирования программ. Комментарии не влияют на выполнение программы. При компиляции они удаляются из программы. Стандарт С99 позволяет использовать в программах комментарии двух видов:

Комментарии, традиционные для языка Си.

Однострочные комментарии, заимствованные из языка С++. Традиционный комментарий в языке Си – это последовательность

символов, входящих в его алфавит, которая начинается двумя символами “/*” и заканчивается этими же символами, следующими в обратной последовательности “*/.”. Такой комментарий может располагаться на нескольких строках. Приведем пример традиционного комментария.

/* Лабораторная работа № 1

Программирование линейных вычислительных процессов

*/

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

//Лабораторная работа № 2

//Программирование разветвляющихся вычислительных процессов

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

2.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.

2.3.Определение функции main().

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

Заголовок функции main(), не принимающей параметров, имеет

следующий вид.

int main(void)

Рассматриваемый заголовок содержит следующую информацию:

● Функция имеет имя main. На это указывают круглые скобки, следующие за этим именем.

5

Источник: https://studfile.net/preview/16544272/