Основы языка Си: структура Си-программы, базовые типы и конструирование новых типов, операции и выражения. Структура простой программы

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

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

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

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

Листинг 1.1. Пример простой программы.

/* Пример простой программы*/
#include
int main()
{
printf(“Hello World!”);
return 0;
}

и обычно имеет расширение cpp, например, «ex1.cpp».

Следующий шаг – это компиляция исходного кода. Под компиляцией понимают процесс, при котором содержимое текстового файла преобразуется в исполняемый машинный код, понимаемый процессором компьютера. Однако компилятор создает не готовую к исполнению программу, а только объектный код (файл с расширением *.obj). Этот код является промежуточным этапом при создании готовой программы. Дело в том, что создаваемая программа может содержать функции стандартных библиотек языка С++, реализации которых описаны в объектных файлах библиотек. Например, в приведенной программе используется функция printf() стандартной библиотеки «stdio.h». Это означает, что объектный файл ex1.obj будет содержать лишь инструкции по вызову данной функции, но код самой функции в нем будет отсутствовать.

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

Рассмотрим более подробно пример программы листинга 1.1. Первая строка задает комментарии, т.е. замечания, помогающие лучше понять программу. Они предназначены только для чтения и игнорируются компилятором. Во второй строке записана директива #include, которая дает команду препроцессору языка С++ вставить содержимое файла ‘stdio.h’ на место этой строки при компиляции. В третьей строке определена функция с именем main, которая возвращает целое число (тип int) и не принимает никаких аргументов (тип void). Функция main() является обязательной функцией для всех программ на языке С++ и без ее наличия уже на этапе компиляции появляется сообщение об ошибке, указывающее на отсутствие данной функции. Обязательность данной функции обусловливается тем, что она является точкой входа в программу. В данном случае под точкой входа понимается функция, с которой начинается и которой заканчивается работа программы. Например, при запуске exe-файла происходит активизация функции main(), выполнение всех операторов, входящих в нее и завершение программы. Таким образом, логика всей программы заключена в этой функции. В приведенном примере при вызове функции main() происходит вызов функции printf(), которая выводит на экран монитора сообщение “Hello World!”, а затем выполняется оператор return, который возвращает нулевое значение. Это число возвращается самой функцией main() операционной системе и означает успешное завершение программы. Фигурные скобки {} служат для определения начала и конца тела функции, т.е. в них содержатся все возможные операторы, которые описывают работу данной функции. Следует отметить, что после каждого оператора в языке С++ ставится символ ‘;’. Таким образом, приведенный пример показывает общую структуру программ на языке С++.

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

Первоначально язык Си задумывался как заменитель Ассемблера для написания операционных систем. Поскольку Си - это язык высокого уровня, не зависящий от конкретной архитектуры, текст операционной системы оказывался легко переносимым с одной платформы на другую. Первой операционной системой, написанной практически целиком на Си , была система Unix. В настоящее время почти все используемые операционные системы написаны на Си . Кроме того, средства программирования, которые операционная система предоставляет разработчикам прикладных программ (так называемый API - Application Program Interface ), - это наборы системных функций на языке Си .

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

В данном разделе будут приведены лишь основные понятия языка Си (и частично C++). Это не заменяет чтения полного учебника по Си или C++, например, книг и .

Мы будем использовать компилятор C++ вместо Cи. Дело в том, что язык Си почти целиком входит в C++, т.е. нормальная программа , написанная на Си , является корректной C++ программой. Слово "нормальная" означает, что она не содержит неудачных конструкций, оставшихся от ранних версий Си и не используемых в настоящее время. Компилятор C++ предпочтительнее, чем компилятор Си , т.к. он имеет более строгий контроль ошибок. Кроме того, некоторые конструкции C++, не связанные с объектно-ориентированным программированием, очень удобны и фактически являются улучшением языка Си . Это, прежде всего, комментарии // , возможность описывать локальные переменные в любой точке программы, а не только в начале блока, и также задание констант без использования оператора #define препроцесора. Мы будем использовать эти возможности C++, оставаясь по существу в рамках языка Си .

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

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

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

  • заголовочные, или h-файлы;
  • файлы реализации, или Cи-файлы.

Имена заголовочных файлов имеют расширение " .h ". Имена файлов реализации имеют расширения " .c " для языка Си и " .cpp ", " .cxx " или " .cc " для языка C++.

К сожалению, в отличие от языка Си , программисты не сумели договориться о едином расширении имен для файлов, содержащих программы на C++. Мы будем использовать расширение " .h " для заголовочных файлов и расширение " .cpp " для файлов реализации.

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

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

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

Файлы реализации , или Cи-файлы, содержат тексты функций и определения глобальных переменных. Говоря упрощенно, Си -файлы содержат сами программы, а h-файлы - лишь информацию о программах.

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

Файлы реализации могут подключать описания, содержащиеся в заголовочных файлах. Сами заголовочные файлы также могут использовать другие заголовочные файлы. Заголовочный файл подключается с помощью директивы препроцессора #include . Например, описания стандартных функций ввода-вывода включаются с помощью строки

#include

(stdio - от слов standard input /output). Имя h-файла записывается в угловых скобках, если этот h-

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

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

#include
#include «math.h»

После чего Мы можем добавить нужные нам константы #define A 3

После этого начинается функция, командой Main ()

После того как всё выполнено можно ввести getchar ()

2. Для чего в языке Си служит точка с запятой?

Для обозначения конца оператора в языке Си используется точка с запятой

3. Все ли компиляторы Си требуют использования в программе инструкции return?

Для возврата целочисленного значения перед завершением функции дописывается строка

Также в большенстве случаев return означает выход из фуннкции

Операторы тела функции выполняются до первого оператора return. Если в теле функции нет такого оператора (т.е. функция не возвращает никакого результата), то выполняются все операторы до закрывающейся операторной скобки.

Функция вывода элементов массива на печать не возвращает никакого результата, т.е. в теле функции оператор return отсутствует.

4. С какой целью в текст программы вводятся комментарии?

Коментарии вводятся для пояснения того или иного действия

например Printf (‘’Hello World’’) ; // выведем на экран надпись Hello World

Так же коментарии можно ввести символами /* - в начале */ - в конце коментария

5. Для чего при вызове функции используются параметры?

Ссылка - это по сути второе имя того же самого объекта. Когда в функцию передаётся объект по ссылке, то передаётся фактически этот объект. Когда же мы передаём объект по значению, то в функцию передаётся его копия.

void func_1(int a) // передача по значению

6. Все ли функции требуют передачи параметров при вызове?

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

1. Что такое тип данных char?

Тип данных char - это целочисленный тип данных, который используется для представления символов. То есть, каждому символу соответствует определённое число из диапазона . Тип данных char также ещё называют символьным типом данных, так как графическое представление символов в С++ возможно благодаря char. Для представления символов в C++ типу данных char отводится один байт, в одном байте - 8 бит, тогда возведем двойку в степень 8 и получим значение 256 - количество символов, которое можно закодировать. Таким образом, используя тип данных char можно отобразить любой из 256 символов. Все закодированные символы представлены в таблице ASCII.

2. Чем символ "3" отличается от числа 3?

символ 3 отличается от целого числа 3 тем, что символ не может быть использован в арифметических операциях

3. В чем заключается различие между константой и переменной?

Различие между переменной и константой довольно очевидно: во время выполнения программы значение переменной может быть изменено (например, с помощью присваивания), а значение константы - нет

4. Как определить константу?

Константы в С++ аналогичны константам в Си. Для представления константы в Си использовалась только директива препроцессора #define:

const тип ИмяПеременной = НачальноеЗначение;

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

5. Поддерживает ли Си строковый тип данных?

Язык Си не поддерживает отдельный строковый тип данных, но он позволяет определить строки двумя различными способами. В первом используется массив символов, а во втором - указатель на первый символ массива.

6. Сохраняет ли переменная свое значение в ходе выполнения всей программы?

во время выполнения программы значение переменной может быть изменено (например, с помощью присваивания), а значение константы - нет

7. Как изменить значение константы?

1. В чем заключаются различия между escape-последовательностями \n и \r?

Грубо говоря, предполагалось, что \r обнулит номер символа. оставляя неизменным номер строки (т.е. сдвинет каретку пишущей машинки к началу строки, не трогая бумагу), а \n - наоборот, сделает переход к следующей строке, оставляя текущую позицию печати неизменной (прокрутит бумагу, не трогая каретку).

2. Как вывести на экран символ «кавычка»?

printf("My text is: \"my text\"\n");

3. Из каких двух частей состоит список параметров функции printf()?

При печати какого либо числа или выражения сначала пишется Printf ()

В скобках, в начале в кавычках пишем нужные нам данные, а именно

%с – одиночный символ
%d – десятичное целое число со знаком
%f – число с плавающей точкой (десятичное представление)
%s – строка символов (для строковых переменных)
%u – десятичное целое без знака
%% - печать знака процента

Например:

printf ("x=%5i\ty=%f\tz=%7.3f\n",x, y, z);

4. Какие преимущества имеет функция printf() по сравнению с puts()?

5. Что такое указатель формата?

Читает значение с плавающей точкой (только C99)

Аналогично коду %a (только C99)

Читает один символ

Читает десятичное целое

Читает целое в любом формате (десятичное, восьмеричное или шестнадцатеричное)

Аналогично коду %e

Читает число с плавающей точкой

Аналогично коду %f (только С99)

Читает число с плавающей точкой

Аналогично коду %g

Читает восьмеричное число

Читает строку

Читает шестнадцатеричное число

Аналогично коду %x

Читает указатель

Принимает целое значение, равное количеству прочитанных до сих пор символов

Читает десятичное целое без знака

Просматривает набор символов

Читает знак процента

6. Как вывести на экран значение числовой переменной?

Вывести её значение можно с помощью функции Printf()

printf("%7.3f\t%7.3f\n",x,y);

%<количество_позиций_под_значение>.<количество_позиций_под_дробную_часть>f

%<количество_позиций_под_значение>i

Последнее обновление: 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 можно посмотреть по