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

СТРУКТУРА ПРОСТОЙ ПРОГРАММЫ

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

РИС. 2.4. Структура функции в языке Си: заголовок и тело.

Из книги C++ автора Хилл Мюррей

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

Из книги Домашний архитектор. Подготовка к ремонту и строительству на компьютере автора Булат Виталий

Структура программы Super Home Suite Рассмотрим главное окно программы Super Home Suite (демонстрационной версии 3.5.2) (рис. 2.1). Рис. 2.1. Главное окно программы Super Home SuiteВверху расположено системное меню, включающее разделы команд для управления программой, редактированием данных,

Из книги Информатика и информационные технологии: конспект лекций автора Цветкова А В

Структура программы Окно программы PromOffice Euroremont (рис. 3.1) состоит из нескольких частей. Вверху находится горизонтальная панель с главным меню, под ней – панель инструментов. Остальную область окна занимают панели для работы с данными. В последней версии программы в правом

Из книги Информатика и информационные технологии автора Цветкова А В

1. Структура программы на ассемблере Программа на ассемблере представляет собой совокупность блоков памяти, называемых сегментами памяти. Программа может состоять из одного или нескольких таких блоков-сегментов. Каждый сегмент содержит совокупность предложений языка,

Из книги Язык программирования С# 2005 и платформа.NET 2.0. автора Троелсен Эндрю

47. Структура программы на ассемблере Программа на ассемблере представляет собой совокупность блоков памяти, называемых сегментами памяти. Программа может состоять из одного или нескольких таких блоков-сегментов. Каждый сегмент содержит совокупность предложений

Из книги Язык программирования Си для персонального компьютера автора Бочков C. О.

Структура простой программы на C# Язык C# требует, чтобы вся логика программы содержалась в рамках определения некоторого типа (вспомните из главы 1, что термин тип используется для обозначения любого элемента множества {класс, интерфейс, структура, перечень, делегат}). В

Из книги Создаем вирус и антивирус автора Гульев Игорь А.

СТРУКТУРА ПРОГРАММЫ Исходная программа Исходная программа представляет собой совокупность следующих элементов: директив препроцессора, указаний компилятору, объявлений и определений. Директивы препроцессора специфицируют действия препроцессора по преобразованию

Из книги Язык Си - руководство для начинающих автора Прата Стивен

Структура и процесс загрузки COM-программы Что же представляет собой COM-программа, как она загружается в память и запускается?Структура COM-программы предельно проста – она содержит только код и данные программы, не имея даже заголовка. Размер COM-программы ограничен

Из книги Linux и UNIX: программирование в shell. Руководство разработчика. автора Тейнсли Дэвид

Структура и процесс загрузки EXE-программы В отличие от COM-программ, EXE-программы могут состоять из нескольких сегментов (кодов, данных, стека). Они могут занимать больше 64Кбайт.EXE-файл имеет заголовок, который используется при его загрузке. Заголовок состоит из

Из книги Конец холивара. Pascal vs C автора Кривцов М. А.

ПРИМЕР ПРОСТОЙ ПРОГРАММЫ НА ЯЗЫКЕ СИ Давайте рассмотрим простую программу на языке Си. Следует сразу сказать, что такой пример нужен нам лишь для выявления некоторых основных черт любой программы, написанной на языке Си. Далее мы дадим пояснения к каждой строке, но, перед

Из книги Linux и все, все, все... Статьи и колонки в LinuxFormat, 2006-2013 автора Федорчук Алексей Викторович

18.5.1. Простой цикл for Этот цикл просто выводит на экран список, который состоит из " 1 2 3 4 5". Чтобы получить доступ к каждой переменной, в качестве параметра имя_переменной указывается "loop".$ pg for_i#!/bin/sh# for_ifor loop in 1 2 3 4 5doecho $LOOP doneПриведенный выше сценарий выводит следующие данные:$

Из книги Описание языка PascalABC.NET автора Коллектив РуБоард

1. Структура программы на языке Pascal В программе на Pascal выделяют следующие основные разделы: заголовок программы, описания, операторы. Разделы отделяются друг от друга точкой с запятой. В конце программы ставится точка. Каждый раздел начинается со своего ключевого

Из книги автора

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

Из книги автора

Создаём простой пул Освоив ранее основные понятия, мы научились понимать ZFS. Для обратной же задачи – чтобы ZFS понимала нас – нужно ознакомиться с её командами. Главные из них – две: zpool для создания и управления пулами, и zfs для создания и управления наборами данных.

Из книги автора

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

Из книги автора

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

Состав языкаВ тексте на любом естественном языке можно выделить четыре
основных элемента: символы, слова, словосочетания и предложения.
Подобные элементы содержит и алгоритмический язык:
Алфавит языка, или его символы - это основные неделимые знаки, с
помощью которых пишутся все тексты на языке.
Лексема- минимальная единица языка, имеющая самостоятельный
смысл.
Выражение задает правило вычисления некоторого значения.
Оператор задает законченное описание некоторого действия.
Для описания сложного действия требуется последовательность
операторов. Операторы могут быть объединены в составной
оператор, или блок (блоком в языке С++ считается
последовательность операторов, заключенная в фигурные скобки { }).
В этом случае они рассматриваются как один оператор.
Каждый элемент языка определяется синтаксисом и семантикой.
Синтаксические определения устанавливают правила построения
элементов языка, а семантика определяет их смысл и правила
использования.
Объединенная единым алгоритмом совокупность описаний и
операторов образует программу на алгоритмическом языке.

Процесс выполнения программы

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

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

В алфавит языка Си входят:
прописные и строчные буквы латинского алфавита (A,B,...,Z, а, b,..., z) и и
знак подчеркивания;
цифры: 0,1,2,3,4,5,6,7,8,9
специальные знаки: " , {} | () * + - / % \ ; " . :?< = >_ ! & # неотображаемые символы ("обобщенные пробельные символы"),
используемые для отделения лексем друг от друга (например, пробел,
табуляция, переход на новую строку).
Из символов алфавита
формируются лексемы языка:
идентификаторы;
ключевые (зарезервированные) слова;
знаки операций;
константы;
разделители (скобки, точка, запятая, пробельные символы).
Границы лексем определяются другими лексемами, такими, как
разделители или знаки операций.

Идентификаторы

Идентификатор - это имя программного объекта. В
идентификаторе могут использоваться латинские
буквы, цифры и знак подчеркивания. Прописные и
строчные буквы различаются. Первым символом
идентификатора может быть буква или знак
подчеркивания. При этом:
идентификатор не должен совпадать с ключевыми
словами и именами используемых стандартных
объектов языка;
не рекомендуется начинать идентификаторы с символа
подчеркивания;
Идентификаторы могут иметь любую длину, но
компилятор учитывает не более 31-го символа от
начала идентификатора;
Примеры идентификаторов:
КОМ_16, size88, _MIN, TIME, time

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

Ключевые слова - это зарезервированные идентификаторы, которые имеют
специальное значение для компилятора. Их можно использовать только в том
смысле, в котором они определены. Список ключевых слов С++ приведен в
таблице:
INT
CHAR
FLOAT
DOUBLE
STRUCT
UNION
LONG
SHORT
UNSIGNED
AUTO
CONST
TRUE
EXTERN
REGISTER
TYPEDEF
STATIC
GOTO
RETURN
SIZEOF
BREAK
CONTINUE
IF
VOID
NEW
ELSE
FOR
DO
WHILE
SWITCH
CASE
DEFAULT
ENTRY
AND
STRUCT
TYPEDEF
BOOL

Знаки операций

Знак операции - это один или более
символов, определяющих действие
над операндами. Внутри знака
операции пробелы не допускаются.
Операции делятся на унарные,
бинарные и тернарную по количеству
участвующих в них операндов.

Простые типы данных

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

Типы данных
К спецификаторам типов относятся:
char
- символьный;
double - вещественный двойной точности с плавающей точкой;
float - вещественный с плавающей точкой;
int - целый;
long
- целый увеличенной длины (длинное целое);
short - целый уменьшенной длины (короткое целое);
signed - знаковый, т.е. целое со знаком (старший бит считается
знаковым);
unsigned - беззнаковый, т.е. целое без знака (старший бит не
считается знаковым);
void
- отсутствие значения;
bool - логический (могут принимать только значения true и false.
Внутренняя форма представления значения false - 0 (нуль).
Любое другое значение интерпретируется как true.)
Для описания констант используют служебное слово const перед
описанием типа. Например, const float g=9.8;

10. Структура Си-программы

Программа на языке С++ представляет собой
одну или несколько функций. Одна из функций
должна называться main () . Именно с этой
функции начинает выполняться программа, и из
этой функции, по мере необходимости,
вызываются другие функции.
Простейшее определение функции имеет следующий формат:
тип_возвращаемого_значения имя ([ параметры ])
{
операторы, составляющие тело функции
}
Как правило, функция используется для вычисления какого-либо
значения, поэтому перед именем функции указывается его тип. Если
функция не должна возвращать значение, указывается тип void.
При этом:
– Тело функции заключается в фигурные скобки.
– Функции не могут быть вложенными.
– Каждый оператор заканчивается точкой с запятой (кроме
составного оператора).

11. Структура Си-программы

Программа может состоять из нескольких модулей (исходных файлов) и, как правило,
содержит директивы препроцессора. Пример структуры программы, содержащей
функцииmain, f1 и f2:
директивы препроцессора
описания
int main()
{
операторы главной функции
}
int f1() {
операторы функции f1
}
int f2() {
операторы функции f2
}
/* Пример простой программы*/
#include
int main()
{
printf(“Hello World!”);
return 0;
}

12. функции ввода/вывода в стиле Си

Основные функции ввода/вывода в стиле С:
int scanf (const char* format...) // ввод
int printf(const char* format...) // вывод
Они выполняют форматированный ввод и вывод произвольного количества величин в соответствии со строкой
формата format. Строка формата содержит символы, которые при выводе копируются в поток (на экран) или
запрашиваются из потока (с клавиатуры) при вводе, и спецификации преобразования, начинающиеся со
знака %, которые при вводе и выводе заменяются конкретными величинами.
#include
int main() {
int i;
printf("Введите целое число\n");
scanf("%d", &i);
printf("Вы ввели число %d, спасибо!", i);
return 0; }
Первая строка этой программы - директива препроцессора, по которой в текст программы вставляется
заголовочный файл , содержащий описание использованных в программе функций ввода/вывод. Все
директивы препроцессора начинаются со знака #.
Третья строка - описание переменной целого типа с именем i .
Функция printf в четвертой строке выводит приглашение Введите целое число и переходит на новую строку в
соответствии с управляющей последовательностью \n.
Функция scanf заносит введенное с клавиатуры целое число в переменную i, а следующий оператор выводит на
экран указанную в нем строку, заменив спецификацию преобразования на значение этого числа.

13. функции ввода/вывода в стиле Си++

Та же программа с использованием библиотеки
классов С++ :
#include
using namespace std;
int main()
{
int i;
cout << "Введите целое число\n";
cin >> i;
cout << "Вы ввели число" << i << ", спасибо!"; return 0;
}

14. Стандартные библиотеки

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

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

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

16. Директива препроцессора # include

Для подключения библиотек используется
директива препроцессора
# include [имя файла]
Директива #include <имя_файла> вставляет
содержимое указанного файла в ту точку
исходного файла, где она записана.
Например:
#include
#include “mylib.h”

17. Директива препроцессора #define

Директива #define определяет подстановку в тексте
программы. Она используется для определения
символических констант.
Формат определения символической константы:
#define имя текст_подстановки /*Все вхождения
имени заменяются на текст подстановки */
Примеры:
#define M 1000
#define Vasia “Василий Иванович”

18. Некоторые стандартные библиотеки

ALLOC.H
Описание функций управления памятью
(allocation, deallocation и др.)
BIOS.H
Описание различных функций, используемых при
обращении к подпрограммам BIOS (базовой
системе ввода-вывода).
CONIO.H Описание различных функций, используемых в
обращении к подпрограммам DOS ввода-вывода с
клавиатуры.
GRAPHICS.H Содержит прототипы графических функций.
MATH.H Содержит описание прототипов математических
функций
STDIO.H Определяет типы и макросы, необходимые для
стандартного пакета ввода-вывода. Определяет так же
стандартные потоки ввода-вывода stdin, stdout и
описывает подпрогpаммы ввода/вывода.
STDLIB.H Описывает некоторые подпрограммы общего назначения:
подпрограммы преобразования, поиска, сортировки и другие.
STRING.H
Описывает несколько подпрограмм обработки строк и
работы с памятью.

19. Функция форматного вывода PRINTF

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

20. Функция форматного ввода SCANF

Для интерактивного режима ввода, вероятно, можно использовать в
большинстве случаев функцию scanf. scanf это функция ввода, по смыслу
эквивалентная printf; ее формат выглядит так:
scanf(<строка формата>,<адрес>,<адрес>,...)
Однако scanf имеет одно очень важное отличие: объекты, следующие за
строкой формата, должны быть адресами, а не значениями. Например, в
программе содержится следующий вызов:
scanf("%d %d", &a, &b);
Этот вызов сообщает программе, что она должна ожидать от вас ввода
двух десятичных (целых) чисел, разделенных пробелом; первое будет
присвоено а, а второе b. Заметим, что здесь используется операция
адреса (&) для передачи адресов а и b функции scanf.

21. Строка формата

Строка формата - это строка, которая начинается
и заканчивается двойными кавычками ("как эта");
цель printf - запись этой строки на экран. Перед
выводом printf заменяет все дополнительно
перечисленные объекты в строке в соответствии
со спецификациями формата, указанными в
самой строке. Пример оператора printf:
printf(“ d= %f \n",d);

22. Строка формата

%f в строке формата - это спецификация формата. Все
спецификации формата начинаются с символа процента (%) и
(обычно) сопровождаются одной буквой, обозначающей тип
данных и способ их преобразования.
%f, используемое в спецификации, говорит о том, что ожидается
некоторое вещественное число. Вот несколько других общеиспользуемых спецификаций формата:
- %u целое число без знака
- %ld длинное целое число
- %p значение указателя
- %d целое число
- %e число с плавающей точкой в экспоненциальной форме
- %c cимвол
- %s строка
- %x или %X целое в шестнадцатиричном формате.

23. Строка формата

Вы можете задать ширину поля, помещая ее
между % и буквой, например, десятичное поле
шириной 4 задается, как %4d. Значение будет
напечатано сдвинутым вправо (впереди
пробелы), так что общая ширина поля равна 4.
Или например %6.2f будет обозначать что
отведено 6 позиций под вещественное число,
причем 2 – под дробную часть.
Если нужно напечатать знак %, то вставьте %%.

24. Строка формата

\n в строке не является спецификацией формата, а
употребляется (по историческим мотивам) как
управляющая (escape) последовательность, и представляет
специальный символ, вставляемый в строку. В этом случае
\n вставляет символ в начале новой строки, поэтому
после вывода строки курсор передвинется к началу новой
строки.
- \f (перевод формата или очистка экрана)
- \t (табуляция)
- \b (забой <-)
- \xhhh (вставка символа c кодом ASCII hhh, где hhh
содержит от 1 до 3 16-ричных цифр)
Если вам нужно напечатать обратную косую черту, то
вставьте \\.

25. Пример Си-программы

#include
#include
main()
{
float x1,y1,x2,y2;
printf("Введите два числа: ");
scanf("%f %f %f %f”,&x1,&y1,&x2,&y2);
float d = sqrt(pow((x2-x1),2)+pow((y2-y1),2));
printf(“d= %f \n", d);
}

26. Другие функции вывода PUTS, PUTCHAR

Имеются две другие функции вывода, которые могут вас
заинтересовать: puts и putchar. Функция puts выводит строку на
экран и завершает вывод символом новой строки.
Рассмотрим пример программы:
#include
main ()
{
puts("Привет, студент ВКИ НГУ");
}
Заметим, что в конце строки опущен \n; это не нужно, так как
puts сама добавляет этот символ.
Наоборот, функция putchar записывает единственный символ на
экран и не добавляет \n. Оператор putchar(ch) эквивалентен
printf("%c",ch).

27. Функции GETS, GETCH

main ()
{
char name ;
printf("Как вас зовут: ");
scanf (“%s”,name);

}
Если ввести фамилию и имя, то выведется только фамилия. Потому, что
введенный вами после имени пробел сигнализирует scanf о конце вводимой
строки.
Решить эту проблему можно, используя функцию gets.
main ()
{
char name ;
printf("Как вас зовут: ");
gets (name);
printf ("Привет, %s\n", name);
}

28. Функции GETS, GETCH

# include
# include
main ()
{
clrscr();
char name ;
printf("Как вас зовут: ");
gets (name);
printf ("Привет, %s\n", name);
getch();
}
Здесь функция getch ожидает ввода любого символа.
Функция getch читает единственный символ с клавиатуры, не выдавая
его на экран (в отличии от scanf и gets). Заметим, что у нее нет
параметра. Если же присвоить функцию символьной переменной, то
она получит значение нажатого символа.
Например: c=getch();

29. Операция присваивания

Самой общей операцией является присваивание,
например, p=a/b или ch = getch(). В Си
присваивание обозначается одним знаком
равенства (=); при этом значение справа от знака
равенства присваивается переменной слева.
Можно применять также последовательные
присваивания, например: sum=a= b. В таких
случаях присваивание производится справа
налево, то есть b будет присвоено a, которая в
свою очередь будет присвоена sum, так что все
три переменных получат одно и то же значение (а
именно, начальное значение b).

30. Арифметические операции. Инкремент. Декремент.

Си поддерживает обычный набор арифметических операций:
- умножение (*)
- деление (/)
- определение остатка от деления (%)
- сложение (+)
- вычитание (-)
Для увеличения значений переменной на единицу используют инкремент (++),
для уменьшения на единицу декремент (--).
Так:
x++; // увеличивает x на единицу
y--; // уменьшает y на единицу
Примеры постфиксных и префиксных операций:
a=2;
a=2;
x=18-2*a++;
x=18-2*(++a);
Получим:
a=3
a=3
x= 14
x=12

31. Комбинированные операции

Ниже приводятся некоторые примеры выражений
и способы их сокращения:
a = a + b; сокращается до a += b;
a = a - b; сокращается до a -= b;
a = a * b; сокращается до a *= b;
a = a / b; сокращается до a /= b;
a = a % b; сокращается до a %= b;

32. Пример 1

Вычислите X3 и X10 , используя четыре операции умножения для
заданного целого значения X.
#include
int x,x2,x3,x5,x10;
main() {
printf("\n Программа расчета X^3 и X^10\n");
puts("Введите значение X");
scanf("%i",&x);
x2=x*x;
x3=x*x2;
x5=x2*x3;
x10=x5*x5;
printf("%i в 3-ей степени = %i \n",x,x3);
printf("%i в 10-ой степени = %i",x,x10);
}

33. Пример 2

Дан угол в радианах. Вычислить синус и косинус угла.
#include
#include
float Angle,Result1,Result2;
main()
{
printf("\n Программа вычисления sin и сos угла\n");
puts("Задайте значение угла в радианах");
scanf("%f",&Angle);
Result1=sin(Angle);
Result2=cos(Angle);
printf("Синус угла равен %f \n",Result1);
printf("Косинус угла равен %f",Result2);

Последнее обновление: 18.05.2017

Программа на языке Си состоит из набора директив препроцессора, определений функций и глобальных объектов. Директивы препроцессора управляют преобразованием текста до его компиляции. Глобальные объекты определяют используемые данные или состояние программы. А функции определяют поведение или действия программы. Простейшая программа на Си, которая была определена в прошлых темах:

#include int main(void) { printf("Hello world! \n"); return 0; }

Инструкции

Простейшим строительным элементом программы на Си являются инструкции (statements). Каждая инструкция выполняет определенное действие. В конце инструкций в языке Си ставится точка с запятой (;). Данный знак указывает компилятору на завершение инструкции. Например:

Printf("Hello world!");

Вызов функции printf, которая выводит на консоль строку "Hello world!" является инструкцией и завершается точкой с запятой.

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

{ printf("Hello world!"); printf("Bye world!"); }

В этом блоке кода две инструкции. Обе инструкции представляют вызов функции printf() и выводят определенную строку на консоль.

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

Для вывода данных на консоль в примере выше используется функция printf() , но чтобы использовать эту функцию, чтобы она вообще стала нам доступна в программе на Си, необходимо в начале файла с исходным кодом подключать заголовочный файл stdio.h с помощью директивы include .

Директива include является директивой препроцессора. Кроме данной include есть еще ряд директив препроцессора, например, define.

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

Непосредственно директива "include" определяет, какие файлы надо включить в данном месте в текст программы. По умолчанию мы можем подключать стандартные файлы из каталога так называемых "заголовочных файлов", которые обычно поставляются вместе со стандартными библиотеками компилятора. И файл "stdio.h" как раз является одним из таких заголовочных файлов.

Вообще сам термин "заголовочный файл" (header file) предполагает включение текста файла именно в начало или заголовок программы. Поэтому заголовочные файлы подключаются, как правило, в начале исходного кода. Кроме того, заголовочный файл должен быть подключен до вызова тех функций, которые он определяет. То есть, к примеру, файл stdio.h хранит определение функции printf, поэтому этот файл необходимо подключить до вызова функции printf.

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

При компиляции исходного кода вначале срабатывает препроцессор, который сканирует исходный код на наличие строк, которые начинаются с символа #. Эти строки расцениваются препроцессором как директивы. И на месте этих директив происходит преобразование текста. Например, на месте директивы #include вставляется код из файла stdio.h.

Функция main

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

Функция также является блоком кода, поэтому ее тело обрамляется фигурными скобками, между которыми идет набор инструкций.

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

#include void main() { printf("Hello world!"); }

#include int main() { printf("Hello world!"); return 0; }

Использование этих определений не было бы ошибкой, и программа также вывела бы строку "Hello world" на консоль. И для большинства компиляторов это было бы нормально.

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

Полностью последний стандарт C11 можно посмотреть по

Прежде чем приступить к написанию программ, необходимо изучить структуру программ на языке программирования С++. Своими словами, структура программ это разметка рабочей области (области кода) с целью чёткого определения основных блоков программ и синтаксиса. Структура программ несколько отличается в зависимости от среды программирования. Мы ориентируемся на IDE Microsoft Visual Studio, и по этому примеры программ будут показаны именно для MVS. Если вы используете другую IDE, то вам не составит труда перенести код из MVS в другие среды разработки, и вы поймете со временем, как это сделать.

Структура программ для Microsoft Visual Studio.

// struct_program.cpp: определяет точку входа для консольного приложения. #include "stdafx.h" //здесь подключаем все необходимые препроцессорные директивы int main() { // начало главной функции с именем main //здесь будет находится ваш программный код }

В строке 1 говорится о точке входа для консольного приложения, это значит, что данную программу можно запустить через командную строку Windows указав имя программы, к примеру, такое struct_program.cpp . Строка 1 является однострочным комментарием, так как начинается с символов // , подробнее о комментариях будет рассказано в следующей статье. В строке 2 подключен заголовочный файл "stdafx.h" . Данный файл похож на контейнер, так как в нем подключены основные препроцессорные директивы (те, что подключил компилятор, при создании консольного приложения), тут же могут быть подключены и вспомогательные (подключенные программистом).

include — директива препроцессора, т. е. сообщение препроцессору. Строки, начинающиеся с символа # обрабатываются препроцессором до компиляции программы.

Препроцессорные директивы также можно подключать и в строках, начиная после записи #include "stdafx.h" до начала главной функции. Причём такой способ подключения библиотек является основным, а использование "stdafx.h" — это дополнительная возможность подключения заголовочных файлов, которая есть только в MVS. С 4-й по 6-ю строки объявлена функция main . Строка 4 – это заголовок функции, который состоит из типа возвращаемых данных (в данном случае int), этой функцией, и имени функции, а также круглых скобок, в которых объявляются параметры функции.

int — целочисленный тип данных

Между фигурными скобочками размещается основной программный код, называемый еще телом функции. Это самая простая структура программы. Данная структура написана в Microsoft Visual Studio. Все выше сказанное остается справедливым и для других компиляторов, кроме строки 2. Контейнера "stdafx.h" нигде кроме MVS нет.

Структура программы для C++ Builder.

При создании консольного приложения мастер создания проектов создает автоматически следующий код:

//препроцессорная директива, автоматически подключённая мастером создания проектов #include int main() { return 0; }

Мы видим, что у функции тип данных — int . Это говорит о том что по завершении работы функция вернет какое-то целочисленное значение, в нашем случае 0. Целочисленное потому, что int – это тип данных для целых чисел, таких как 4, 5, 6, 456, 233 и т. д.

Главное помнить, что если тип возвращаемых данных у функции main — это int или любой другой, кроме void , то следует писать строку типа этой: return <возвращаемое значение>;

В строке 2 подключена библиотека vcl.h – её автоматически подключает мастер создания приложений, поэтому удалять её не следует, иначе проект не будет рабочим.

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

Например:

Int main(int argc, char* argv) { return 0; }

Такой пример структуры генерируется мастером в MVS2010. Данный main немного отличается. Подробнее рассмотрим позже, но скажу, что данный main имеет такой вид, так как изначально рассчитан на поддержку юникода.

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

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

Пример структуры программы MVS с подключенными библиотеками.

#include "stdafx.h" #include using namespace std; int main() { }

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

Синтаксис подключения заголовочных файлов:

#include <имя заголовочного файла>

Более старые заголовочные файлы подключаются так (этот стиль подключения библиотек унаследован у языка программирования C):

#include <имя заголовочного файла.h>

Различие состоит в том, что после имени ставится расширение.h .

Язык программирования С++ является регистрозависимым. Например:
Return 0; – не правильно, будет ошибка компиляции.
return 0; – правильно!!!

В данной статье рассмотрены структуры программ на С++ в таких средах как MVS и Borland. И как вы уже заметили, эти структуры почти не отличаются. Поэтому данная статья актуальна для любой IDE. Если вы ещё не определились с выбором IDE, прочитайте .

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

Внутренняя структура программы

Исполняемая программа на Си состоит из 4 частей: область команд, область статических данных, область динамических данных, область стека. см. Рис.2.

1. Область команд содержит машинные команды; инструкции, которые должен выполнить микропроцессор.

2. Область статических данных для хранения переменных, с которыми работает программа;

3. Область динамических данных для размещения дополнительных данных, которые появляются в процессе работы программы (например, временных переменных).

4. Стек используется для временного хранения данных и адресов возврата из функций.


тело функции /*тело функции*/

printf("Hello World!");

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



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

3-я строка – начало тела функции. {} определяют тело функции (в Паскале - это begin и end)

4-я строка – комментарий, он не компилируется, а только поясняет что делается.

5-я строка – библиотечная функция – печатать на экране, выражение в скобках на этой строке – параметр функции, он всегда берётся в кавычки.

; - это признак оператора Си, это часть оператора, а не разделитель операторов, как в Паскале.

Советы, как сделать программу читаемой:

1) Выбирать осмысленные имена

2) Использовать комментарии

3) Использовать пустые строки для того, чтобы отделить одну часть функции от другой

4) Помещать каждый оператор в другой строке.

БАЗОВЫЕ ЭЛЕМЕНТЫ ЯЗЫКА СИ

Рассмотрим обязательные элементы, с помощью которых должна оформляться программа на Си:

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

Ø 1 способ : /* Текст */ - в любом месте программы.

Как только компилятор встречает /**/, он их пропускает. Компилятор игнорирует /* */, так как он не в состоянии интерпретировать язык, отличающийся от языка Си. То есть, если вы хотите исключить из компиляции какую-то строку, то заключите её в /**/.

Ø 2 способ : если комментарий большой, то используем такой тип

/* Строка 1 - для комментария любой длины

строка 3*/

Ø 3 способ : // - текст до конца строки.

2. Идентификатор - это имя, которое присваивается какому-либо объекту (переменной). Используются строчные и прописные буквы, цифры и знак подчёркивания. Строчные и прописные буквы различаются. (В Бейсике не различаются). Если назвать переменную name, Name или NAME, то это будут разные переменные.

Начинаются идентификаторы с буквы или знака подчеркивания. Например, _name. Но не рекомендуется начинать с _, так как этот знак используется для глобальных имен сомого языка Си.

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

b – байт; ch – однобайтовый символ;

w – слово; f – флаг;

l – длинное слово; fn – функция;

u – беззнаковое; p – указатель;

с – счетчик; d – разность двух пре-х

cz – строка; и т.д.

3. Служебные слова – это слова, с которыми в языке жестко сопоставлены определённые смысловые значения и которые не могут быть использованы для других целей. Это имена операторов, библиотечных функций, команды препроцессора и так далее. Этим слова нельзя использовать для создания имен своих функций, переменных…

ДАННЫЕ В ПРОГРАММЕ НА СИ

Каждая программа оперирует с данными . Они присутствуют в программе в виде переменных и констант.

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

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

Константы

Константы - это фиксированные значения. Значение, будучи установлено, больше не меняется. Константы бывают различных типов. Типы отличаются по принципу размещения в памяти ЭВМ, а для человека по виду записи. В Си существует 7 ключевых слов, используемых для указания на различные типы данных: int, long, short, unsigned, char, float, double.

Типы констант :

a) Целые и длинные целые . Записываются в десятичной, восьмеричной и шестнадцатеричной системе счисления. Они могут быть знаковые и беззнаковые.

Десятичная система: целые константы занимают 16 бит памяти, и принимают диапазон значений: -32768 до +32767 (2 15) . Если константа беззнаковая, то диапазон удваивается: 0 до 65535 (за счет того, что 15-й разряд – знаковый используется под число). Для обозначения беззнакового числа используют суффикс u (unsigned), например 123u.

Если число больше 40000, то компилятор автоматически преобразует его в отрицательное число, поэтому суффикс u обязателен:40000u. В примере 123u компилятору все равно – есть суффикс или его нет, так как это число входит в диапазон 32767.

Длинное целое занимает 32 бита , диапазон значений

± 2147483648 (знаковое длинное – long). Если вы поставили суффикс l , то, несмотря на число, будет занято 32 бита. Например: -5326l

0 – 4294967295 беззнаковое длинное - (unsigned long). Диапазон увеличивается за счет 31-го бита. Используются суффиксы ul , например, 32659ul.

Восьмеричная система :

Если число начинается с цифры 0, оно интерпретируется как восьмиричное число

16 битов 0 ¸ 077777

0100000 ¸ 0177777u

32 бита 0200000 ¸ 01777777777l

020000000000 ¸ 037777777777ul

Шестнадцатеричная система :

Если число начинается с символа 0х, то оно интерпретируется как шестнадцатиричное

16 битов 0x0000 ¸ 0x7FFF

0x8000 ¸ 0xEFFFu

32 бита 0x10000 ¸ 0x7FFFFFFFl

0x80000000 ¸ 0xFFFFFFFFul

b) Вещественные константы . Это числа с плавающей точкой. Значение имеет дробную часть. По умолчанию все вещественные константы имеют тип двойной точности double . Занимают в памяти 8 байт (даже если 0,0). Диапазон значений ±1*10 ± 307 , можно записать и в научной форме, например: 0,5е+15 или

1,2е-3=1,2*10 -8 =0,0012.

Принудительно можно задать формат одинарной точности float . Число будет занимать 4 байта , используется суффикс f (5.7 f). Соответсвенно диапазон сужается ±1*10 ± 37

А также расширенной точности long double – 10 байт . (3.14L)

Знак + можно не писать. Разрешается опускать либо десятичную точку, либо экспоненциальную часть, но не одновременно (.2; 4е16). Можно не писать дробную либо целую часть, но не одновременно (100.; .8е-5)

c) Символьные константы. Это набор символов, используемых в ЭВМ.

Делятся на 2 группы: печатные и не печатные (управляющие коды). Символьная константа включает в себя только 1 символ, который необходимо заключить в апострофы и занимает 1 байт памяти.

Любой символ имеет своё двойное представление в таблице ASCII. В программе символьные константы вводятся в одинарных кавычках, при компиляции в программу подставляется числовое значение символа из ASCII. Один символ занимает 1 байт.

Символ "А" "a" " " "\n"

Его код 65 97 32 10

Как целый тип данных "A"=0101 8 , 01000001 2 , 41 16 , 65 10 . Коды запоминать не надо.

Управляющие коды начинаются с символа \ и тоже заключаются в апострофы. Наиболее распространенные управляющие коды:

\n – переход на новую строку

\t – табуляция (сдвиг курсора на некоторое фиксированное значение)

\b – шаг назад (сдвиг на одну позицию назад)

\r – возврат каретки (возврат к началу строки)

\f – подача бланка (протяжка бумаги на 1 страницу)

\’ - апостроф

\” - кавычки

Последние три знака могут выступать символьными константами, а также применяться в функции printf() , поэтому применение их в качестве символов может привести к ошибке. Например, если мы хотим вывести строку «Символ \ называется слеш», то оператор должен выглядеть так:

рrintf(«Символ \\ называется слеш»);

a) Строковые константы - содержат последовательность из 1 и более символов, заключённых в " ". Расходуется по 1 байту на любой символ + 1байт на так называемый ноль-символ - признак конца строки. Ноль-символ – не цифра ноль, он означает, что количество символов в строке (N) должно быть на 1 байт больше (N+1), чтобы обозначать конец строки (компилятор его прибавляет сам автоматически). Например: «строка текста» занимает (13+1) байт;

«Мир» -