Пример программы на Си

Введение. Историческая справка

Язык Си представляет собой язык программирования общего назначения, характеризующийся краткостью выражений, современными управляющими конструкциями и структурами данных, а также богатым набором операций. Разработчики языка дали ему следующую характеристику: «Си – это язык не слишком высокого уровня, не слишком объемный и не приспособленный специально к какой- либо конкретной области приложений. Но зато отсутствие в нем каких-либо ограничений и большая общность делают его более удобным и эффективным для решения многих задач, чем языки, даже считающиеся по разным причинам более мощными».

Первоначально язык Си разработан в США сотрудниками фирмы Bell Laboratories в начале 70-х годов для операционной системы (ОС) UNIX. Операционная система UNIX, компилятор Си и практически все основные прикладные программ для UNIX написаны на Си. Но язык Си не привязан к какой-либо конкретной аппаратной или системной платформе, он широко применяется и в других операционных системах, например, в ОС типа Windows (Windows XP, Windows Vista, Windows 7 и др.). И хотя язык Си называют «языком системного программирования», поскольку на нем удобно писать компиляторы и операционные системы, он столь же удобен и для написания больших прикладных программ в самых различных областях.

Предшественники языки BCPL и B. Многие ключевые идеи Си пришли из языка BCPL. BCPL оказал влияние на Си опосредованно – через язык B, разработанный в 1970 году для первой системы UNIX на ЭВМ DEC PDP-7. (Отсюда и название языка Си, буква английского алфавита С следует за буквой B).

Первое описание языка дано его разработчиками – Б. Керниганом и Д. Ритчи. После было разработано десятки реализаций языка Си, поддерживающий разный диалект.

В 1983 г. при Американском национальном институте стандартов (American National Standards Institute - ANSI) образован комитет по стандартизации языка Си, в 1989 г. утвержден стандарт ANSI языка Си. Большинство средств и возможностей этого стандарта поддерживаются современными компиляторами. Эту версию языка принято называть ANSI C или C89. Однако в конце 1990-х годов стандарт подвергся пересмотру, что привело к публикации нового стандарта ISO 9899:1999 в 1999 году. Этот стандарт обычно называют «С99».

Приведем некоторые особенности языка Си:

– язык Си – язык программирования «среднего» уровня: поддерживает операции низкого уровня (операции над битами), базовые типы отражают те же объекты, что и язык Ассемблера (байты, машинные слова, символы, строки), в то же время, имеет основные управляющие конструкции, присущие языкам «высокого» уровня;

– поддерживает механизм указателей на переменные и функции;

– язык со слабой типизацией, с одной стороны слабый контроль за преобразованием типов повышает эффективность программ, с другой, является источником ошибок и затрудняет отладку;

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

Рассмотрим основные элементы языка Си, начнем рассмотрение с алфавита языка.

 

Алфавит языка Си

Алфавит Си включает:

– прописные и строчные буквы английского алфавита: A,…,Z, a,…,z;

– арабские цифры 0, 1,…, 9;

–  специальные символы:

– пробельные символы (неотображаемые символы): пробел, табуляция, перевод строки, новая строка, возврат каретки, новая страница, вертикальная табуляция,

– другие символы: ,.;:? ‘! “ / | \ ~ _ () { } [ ] > < # % & ^ - = + * (в некоторых компиляторах, например, Visual C++ разрешается в идентификаторах использовать символ $).

Символы алфавита находятся в первой половине кодовой таблицы (первые 128 символов) кодировки ASCII.

Из символов алфавита строятся лексемы.

Лексема – единица текста программы, имеющая для компилятора самостоятельный смысл.

Примеры лексем: идентификаторы, ключевые (зарезервированные) слова, знаки операций, константы, разделители.

 

Идентификаторы (имена) языка Си

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

Прописные и строчные буквы в идентификаторах различаются (идентификаторы х и Х это разные имена).

Примеры верных идентификаторов: x, X, abc124, A_c3, x4er, x_, __d.

Примеры неверных идентификаторов (первый символ – цифра): 1c, 4sd.

 

Ключевые слова

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

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

Список ключевых слов языка Си:

auto double int struct
break else long switch
case enum register typedef
char extern return union
const float short unsigned
continue for signed void
default goto sizeof volatile
do if static while

 

Дополнительно компилятор Microsoft Visual C++ включает следующие ключевые слова:

__asm dllimport2 __int8 naked2
__based1 __except __int16 __stdcall
__cdecl __fastcall __int32 thread2
__declspec __finally __int64 __try
dllexport2 __inline __leave  

 

Константы (литералы)

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

В языке Си выделяют следующие разновидности констант, которые могут иметь разные типы и формы представления:

1. Целые константы.

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

- тип int (по умолчанию), в оперативной памяти константа данного типа кодируется в MS DOS – 2 байтами, в Win32 – 4 байтами, примеры: 1245, 6, 175, 5, 1425;

- тип long – в оперативной памяти константа кодируется 4 байтами, константа будет иметь этот тип, если диапазон выходит за тип int (в MS DOS), или явно указывается тип с помощью суффикса l (L), примеры: 12l, 14567L, 125234 (для MS DOS);

- константы могут быть представлены типами unsigned int и unsigned long, для явного указания необходимо использовать суффикс u (U), примеры 105u (unsigned int), 105ul(unsigned long).

Целые константы всегда задают неотрицательные значения, для задания отрицательного значения используют операцию унарный минус, которую применяют к целой константе: -1000, -200l.

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

- в десятичной системе счисления (по умолчанию) – 1234, 378l, 346;

- в шестнадцатеричной системе счисления, признаком данного представления являются 2 первых символа константы 0x (или 0X), в константе можно использовать шестнадцатеричные цифры: 0..9, A (a), B (b), …, F (f), примеры  – 0x10, 0x10acd, 0XFFFF;

- в восьмеричной системе счисления, признаком данного представления является первый символ 0, в константе можно использовать восьмеричные цифры: 0..7, примеры – 010, 070, 01237;

2. Вещественные константы.

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

Существует следующие три типа вещественных констант:

- тип double (по умолчанию), в оперативной памяти константа кодируется 8 байтами, примеры: 12.5,.123, 0.5, 1. (наличие точки в таком представлении обязательно);

- тип float – 4 байта, используется суффикс f (F), примеры: 10.5f, 0.123F;

- тип long double – 10 байт, используется суффикс l (L), примеры: 10.5l, 0.9L.

Существуют две формы представления вещественных констант:

- форма с точкой (десятичная форма), примеры: 10.125, 1.  (значение 1.0), .125 (значение 0.125), 0.125, представляется в форме десятичной дроби, состоит из трех основных элементов целой части, точки, дробной части, причем, целая или дробная часть могут отсутствовать, наличие точки обязательно, если целая часть отсутствует, то она считается равной 0, если дробная часть отсутствует, то она также считается равной 0;

- форма со знаком экспоненты (экспоненциальная форма): 1e-5, 12.23E4F (тип константы float), представляется в виде мантиссы и порядка, мантисса записывается слева от знака экспоненты (Е или е), порядок — справа от знака. Значение константы определяется как произведение мантиссы и возведенного в указанную в порядке степень числа 10..

3. Символьные константы. Изначально в Си стандарта ANSI символьные константы представлялись одним символом, который мог быть буквой, цифрой, знаком пунктуации или специальный символом, заключенным в апострофы, примеры, ‘a’, ‘d’, ‘1’, ‘.’, ‘ ‘, данные константы представлены в памяти типом char и занимают 1 байт. Значением символьной константы является числовое значение кода символа в кодировке, используемой в данной операционной системе, например, в кодировке ASCII.

Символьные константы могут участвовать в арифметических операциях на правах полноценных целых чисел, хотя чаще их сравнивают с другими символами. Некоторые символы представляются в символьных и строковых константах с помощью специальных управляющих последовательностей символов, начинающихся с ‘\’ (косая обратная наклонная черта), называемых эскейп- последовательностями. Примеры: ‘\\’ - символ обратный слеш, ‘\’’ - символ апостроф, ‘\”’ - символ двойные кавычки, ‘\n’ – символ конец строки (код 10), ‘\r’ – возврат каретки (код 13), ‘\a’ – звуковой сигнал (код 7), ‘\b’ – возврат на шаг (забой) (код 8). Кроме того, любой символ можно представить в виде его кода в восьмеричной или шестнадцатеричной системах счисления в форматах ‘\ooo’ или ‘\xhh’, где o – восьмеричная цифра, а h – шестнадцатеричная цифра (значение восьмеричное кода не может превышать 255). Например, символ пробел с десятичным кодом 32 может быть записан как ‘ ‘, или в шестнадцатеричном коде как ‘\x20’ или в восьмеричном коде как ‘\40’.

В некоторых компиляторах, например, Visual C++ разрешены много символьные константы (до 4-х символов): ‘asdf’, ‘GR’, они представлены в памяти типом int (первый символ – младший байт).

4. Строковые константы – последовательность символов, заключенных в кавычки (не в апострофы), внутри строковых констант допускается использовать эскейп- последовательности или коды символов. Пример: “начало строки\nтекст с новой строки”, при печати текст будет выводится на две строки. Формально строковая константа является массивом символов. Во внутреннем представлении строки в оперативной памяти в конце присутствует нулевой символ ‘\0’, так что физический объем памяти для хранения строки превышает количество символов, записанных между кавычками на единицу.

5. Константы типа перечислений. Можно создавать перечисляемый тип, содержащий константы. Переменным этого типа можно присваивать значения только этих констант. Данные константы представляются в памяти точно так же, как константы типа int.

Формат перечислений следующий:

enum <имя_типа> {

<имя1>[=<инициализатор1>],

<имя2>[=<инициализатор2>],

……………….

<имяN>[=<инициализаторN>] };

Идентификаторы <имя1>, <имя2>, …, <имяN> -выступают далее в качестве констант, по умолчанию, если нет инициализатора, первая константа инициализируется 0, каждая последующая на 1 больше.

Пример перечисления

enum A

{

a, // 0

       b, // 1

       c=10, // 10

       d // 11

};

Далее в программе обращаться к данным константам, int i=b; переменной i будет присвоено значение 1.

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

 

Комментарии

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

В Си два вида комментариев:

1. Начало комментария - два символа //, конец комментария – символ перехода на новую строку.

// комментарий до конца строки

Например,

int v=100; // Переменная определяет скорость

2. Начало комментария - 2 символа /*, конец комментария – 2 символа */. Пример,

/* Комментарий на

   несколько

   строк */

 

Пример программы на Си

Рассмотрим пример программы на языке Си. В среде Visual C++ необходимо создать новый проект. Для этого в главном меню выбираем элемент File – New – Proect. Появляется диалоговое окно, представленное на рисунке 1 (скриншоты представлены для среды разработки Microsoft Visual C++ 2005, для других версий среды они могут немного отличаться).

Рисунок 1 - Окно создания проекта

В окне создания проекта выбираем тип проекта Win32 и Win32 Console Application, задаем имя проекта MyProect1 и нажимаем кнопку Ok, появится окно, представленное на рисунке 2. Нажимаем кнопку Next. Появится окно, представленное на рисунке 3.

 

Рисунок 2 – Первое окна мастера создания проекта

Рисунок 3 – Второе окна мастера создания проекта

В данном окне необходимо включить контрольный переключатель (поставить «галочку») с именем Empty project и нажать кнопку Finish. Будет создан «пустой» проект, возможный вид главного окна представлен на рисунке 4.

Рисунок 4 – Главное окно проекта

Теперь необходимо создать новый файл с расширением .cpp и включить его в проект. Выделяем на вкладке пустой каталог с именем Source Files, нажимаем правую клавишу «мыши» и в появившемся контекстном меню выделяем элемент Add – New Item…, появится диалоговое окно для создания файла, представленное на рисунке 5.

Рисунок 5 – Окно для добавления нового файла в проект

 

В левой части окна в «дереве» с категориями (Categories) выделяем элемент Code. В правой части окна с шаблонами (Templates) в списке выбираем тип файла C++ File (.cpp), вводим имя файла, например, MyProect и нажимаем кнопку Add. Будет создан и открыт в текстовым редакторе пустой файл. В редакторе набираем текст программы, представленной ниже:

 

#include <stdio.h>

void main()

{

printf("Hello World");

}

Для запуска программы необходимо ввести комбинацию клавиш Ctrl-F5. В случае отсутствия ошибок результаты работы программы будут представлены в консольном окне, представленном на рисунке 6.

Рисунок 6 – Окно с результатами работы программы


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: