Всё для Учёбы — студенческий файлообменник
1 монета
doc

Студенческий документ № 081044 из СИЮ

Язык С.

Деннис Ритчи создал язык С в 1972 году, когда он разрабатывал операционную систему Unix, в которой и для которой этот язык разрабатывался.

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

В настоящее время известно множество реализаций языка С. Чтобы одна и та же программа могла работать на машинах различной аппаратной конфигурации, различные реализации должны соответствовать одному стандарту. Американский национальный институт стандартов (ANSI) разработал и в 1989 году принял стандарт ANSI С89, который поддерживается современными компиляторами.

Достоинства:

* Конструкции языка подходят для нисходящего, структурного и модульного программирования.

* Компактность программы (экономия памяти) и высокая скорость исполнения (использование команд ассемблера).

* Переносимость на другие компьютеры различных архитектур, от 8-разрядных микропроцессоров до суперкомпьютеров

Недостатки:

* Использование указателей может привести к трудноотыскиваемым ошибкам.

* Запутанность кода из -за большого количества операций.

В 1994 году объединенный комитет ANSI/ ISO (международная организация по стандартизации- International Organization for Standardization ISO)

выпустил стандарт С99.

Цель: * Создание способов работы с наборами интернациональных символов.

* Возможность переноса программ на 64-разрядные процессоры.

* Повышение вычислительной полезности для научно-технических задач, как альтернатива языку Фортран.

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

В 2007 - С11.

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

Алгоритмический язык - формализованный язык для однозначной записи алгоритмов, состоящий из набора допустимых символов (алфавита), синтаксических правил и семантических определений.

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

* прописные и строчные буквы латинского алфавита (A...Z, a...z);

* цифры (0...9);

* знаки арифметических операций +,-,*,/,%;

* вспомогательные символы (), ., ,, ;.:,[], {}, , =,_,$,&,....

* Составные символы =,==,!=,\n,\t... &&.

Каждая программа определяется правилами ее представления (синтаксисом) и правилами интерпретации ее содержательного значения (семантикой

Синтаксис (от греческого - syntaxic - построение, порядок) - набор правил, по которым из алфавита строятся отдельные слова и предложения.

Семантика - правила интерпретации различных языковых конструкций.

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

Идентификатор - это имя программного объекта. В идентификаторе могут использоваться латинские буквы, цифры и знак подчеркивания. Прописные и строчные буквы различаются, например, s и S - два различных имени. Первым символом идентификатора может быть буква или знак подчеркивания, но не цифра. Пробелы внутри имен не допускаются.

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

При выборе идентификатора необходимо иметь в виду следующее:

1. идентификатор не должен совпадать с ключевыми словами и именами используемых стандартных объектов языка;

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

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

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

Ключевые слова - это зарезервированные идентификаторы, которые пользователь не имеет права использовать. Их можно использовать только в том смысле, в котором они определены. Ключевые слова определяют типы данных, классы памяти, квалификаторы типов, операторы, модификаторы и т.д.

Список ключевых слов

Идентификаторы стандартных типов (Все ниже перечисленные слова называются спецификаторы)

Char

Int Float Double

Модификаторы типов используются для изменения размера типа.

Short Long Signed

Unsigned

Следующие модификаторы введены стандартом ANSI

Const Volatile Операторы

Do else for if

return

switch case default

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

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

Операнд - это объект, над которым выполняется действие.

123+2/3-а

Операции делятся на унарные, бинарные и тернарную по количеству участвующих в них операндов.

-5 унарная;

2+х бинарная

?: условная операция (тернарная ). Например: х . > 2. ! + - ++ -- & * (тип) sizeof (унарные) 4. + - (бинарные: сложение и вычитание) > 5. = (отношения) > 6. == != (сравнения) > 7. && (конъюнкция "И") > 8. || (дизъюнкция "ИЛИ") > 9. ?: (условная операция)

Операции

. используются для обращения к элементам структур (записям).

-> используются для обращения к элементам структур через указатель (записям).

Операция [] - вычисление смещения, то есть вычисление адреса элемента массива.

Операция * - косвенная адресация.

Операция & - взятие адреса переменной.

Операция (тип) - используется для явного изменения типа объекта программы.

Операция sizeof - операция вычисления размера (в байтах) для объекта того типа, который имеет операнд (int a; sizeof(a) = 2 байта).

Операция условная тернарная ?: выражение_1 ? выражение_2 : выражение_3. первым вычисляется значение выражения_1, если оно истинно (то есть не равно 0), то вычисляется выражение_2 и становится результатом, если оно ложно(то есть 0), то вычисляется и становится результатом выражение_3.

Некоторые операции можно объединить в группы:

1. Арифметические операции: +, -, *, /, %, ++, --;

2. Операции отношения (сравнения): >, =, !=, = =;

3. Операции присваивания: =, +=, -=, *=, /=, %=;

4. Логические операции: &, |, ^, &&, ||, ! (6&5 - 4: 101&110 = 100; 6|5 = 7: 101|110 = 111).

Константы

Константы - это объекты программы, которые в ходе ее выполнения не изменяют свое значение.

Константы по способу записи в программе делятся на именованные и неименованные.

Именованные константы.

Вариант 1.

Директива #define определяет символьное имя, или именованную константу, для заданной строки символов:

#define имя подставляемый-текст

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

#define DL 10

#define N 30

#define STEP 20

Вариант 2.

Если к объявлению переменной добавить модификатор const, то ее значение далее в программе меняться не будет и называться будет константная переменная:

Const float p=3.14;

Неименованные константы.

Тип константы определяется ее значением.

Если требуется сформировать отрицательную целую или вещественную константу, то перед константой ставится знак унарной операции изменения знака (-), например: -218, -022, -0x3С, -4.8, -0.1e4.

Вещественная константа в экспоненциальном формате представляется в виде мантиссы и порядка. Мантисса записывается слева от знака экспоненты (E или e), порядок - справа от знака. Значение константы определяется как произведение мантиссы и возведенного в указанную в порядке степень числа 10. Обратите внимание, что пробелы внутри числа не допускаются, а для отделения целой части от дробной используется не запятая, а точка.

Символьные константы, состоящие из одного символа, занимают в памяти один байт и имеют стандартный тип char.

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

Константа Формат Примеры

Целая Десятичные 0, 8, 123, 10478

Вещественная Обычные 5.7, .0012, 35.

Экспоненциальные 0.2Е6, 11е-3

Символьная Один символ заключенный в апострофы 'A', 'ю', '*'

Строковая Последовательность символов, заключенная в кавычки "Hello world!"

В Си есть константы состоящие из двух символов, но обозначают они только один. Это, например, управляющие последовательности \n (символ конца строки).

Двухсимвольные константы занимают два байта и имеют тип int. Символ обратной косой черты используется для представления:

кодов, не имеющих графического изображения (например, \а - звуковой сигнал, \n - перевод курсора в начало следующей строки);

символов апострофа ( ' ), обратной косой черты ( \ ), знака вопроса ( ? ) и кавычки ( " );

Управляющие последовательности в языке Си

Изображение Шестнадцатеричный код Наименование \a 7 Звуковой сигнал \b 8 Возврат на шаг \f C Перевод страницы (формата) \n A Перевод строки \r D Возврат каретки \t 9 Горизонтальная табуляция \v B Вертикальная табуляция \\ 5C Обратная косая черта \' 27 Апостроф \" 22 Кавычка

Управляющие последовательности могут использоваться и в строковых константах, называемых иначе строковыми литералами. Например, если внутри строки требуется записать кавычку, ее предваряют косой чертой, по которой компилятор отличает ее от кавычки, ограничивающей строку: "Издательский дом \"Питер\"".

Все строковые литералы рассматриваются компилятором как различные объекты.

В конец каждого строкового литерала компилятором добавляется нулевой символ, представляемый управляющей последовательностью '\0'. Поэтому длина строки всегда на единицу больше количества символов в ее записи. Таким образом, пустая строка "" имеет длину 1 байт. Обратите внимание на разницу между строкой из одного символа, например, "A", и символьной константой 'A'. Пустая символьная константа недопустима.

Разделители

1. Для обозначения соответственно начала и конца составного оператора или блока используют фигурные скобки {}.

2. Запятая может использоваться в качестве операции, а может применяться для разделения элементов списка.

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

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

/* многострочный

комментарий */ или

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

Заголовок функции main( )

{ } Текст между фигурными скобками называется телом функции.

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

однострочный (//...);

многострочный (/*...*/).

1. препроцессорная директива обычно размещается в одной строке.

2. все директивы начинаются с символа #.

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

После выполнения обработки в тексте программы не остается ни одной препроцессорной директивы. Теперь программа представляет собой набор описаний и определений.

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

Объявления стандартных функций, используемых в программах на Си находятся в заголовочных файлах с расширением *.h.

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

Препроцессор - это специальная программа, которая обрабатывает текст программы раньше транслятора.

//Пример программы вычисления площади треугольника

#include #include

#define DL 10 #define N 30

#define STEP 20

int main (void)

{ double a, b, c, p, s;

printf ("Введите длины сторон треугольника\n");

scanf ("%lf%lf%lf", &a, &b, &c);

p=(a+b+c)/2;

s=sqrt(p*(p-a)*(p-b)*(p-c));

printf ("Площадь S=%lf", s);

return 0: } Объявления.

В программе все переменные должны быть объявлены до их использования определенным типом. Признаком хорошего тона считается объявление всех переменных в начале функции, но разрешено объявлять и по контексту. Правда не все версии компиляторов это поддерживают (Borland не поддерживает???).

int m,k,i,n,y;

float s; int x=(y+(++n))*6;

Типы данных.

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

В языке С существует 4 базовых типа данных:

Char с='R'; - 1 байт, используется для хранения символов, однако формально является целочисленным, т.к. каждый символ имеет свой числовой код, значение которого и хранится в ячейке. Символ R имеет код 82.

Int x,y,z; - 2 байта или 4 байта. В зависимости от аппаратной и системной реализации компьютера. Диапазон допустимых значений для 2-х байтовой ЭВМ будет -32768.. 32767.

Float а; - 4 байта, 3.4*10-38.. 3.4*1038 . Вещественное число одинарной точности.

Double; - 8 байт, 1.7*10-308.. 1.7*10308. Вещественное число двойной точности.

Void - этот тип обозначает пустое множество значений. Обозначает отсутствие значения.

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

Кроме того, существуют модификаторы типа - специальные служебные слова short, long, Signed (со знаком) и unsigned (без знака). Они могут применяться к базовым типам:

Signed и unsigned применяются только к типам Char и Int. К целым числам применимы short, long.

short Int x,y,z; слово Int в этом случае можно опустить:

short x,y,z; Sizeof (int) - позволяет получить информацию об объеме памяти, выделяемой для данного типа.

В таблице 3 представлены типы данных, размеры ячейки и допустимые значения переменных.

Таблица 3

Тип данных Размер байт/бит Диапазон значений unsigned char 1/8 0 ... 255 char 1/8 -128 ... 127 unsigned int 2/16 0 ... 65535 short int 2/16 -32768 ... 32767 unsigned short 2/16 0 ... 65535 int 2/16 -32768 ... 32767 unsigned long 4/32 0 ... 4294967295 long 4/32 -2147483648 ... 2147483647 float 4/32 3.4E-38 ... 3.4E+38 double 8/64 1.7E-308 ... 1.7E+308 long double 10/80 3.4E-4932 ... 1.1E+4932

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

Порядок выполнения операций определяется рангом (приоритетом) операции и правилами группировки (ассоциативность). Для изменения порядка выполнения операций и их группирования используют разделители (круглые скобки).

В общем случае, унарные операции, условная операция и операции присваивания правоассоциативны, а остальные операции левоассоциативны: выражение x = y = z; означает x = (y = z); выражение x+ y -z; означает (x + y) - z.

Арифметические выражения.

В Си простейшим выражением является отдельный операнд:

4, -6, 2+76, а=2+5

Математические функции (библиотека math.h)

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

Математические функции

№ пп Формула Функция Описание действий 1. double sqrt(x) Возвращает положительное значение квадратного корня 2. double pow(x, y) Возвращает значение x в степени y 3. double log(x) Возвращает значение натурального логарифма 4. double log10(x) Возвращает значение десятичного логарифма 5. double exp(x) Возвращает значение экспоненциальной функции 6. double sin(x) Функция синуса, угол задается в радианах 7. double cos(x) Функция косинуса, угол задается в радианах 8. double tan(x) Функция тангенса, угол задается в радианах 9. double atan(x) Функция арктангенса 10. int abs(x) Возвращает абсолютное значение целого аргумента x double fabs(x) Возвращает абсолютное значение вещественного аргумента x asin(x) арксинус х в диапазоне [ -pi/2, pi/2], х принадлежит [-1, 1]

acos(x) арккосинус x диапазоне [0,pi], х принадлежит [-1, 1]

atan(x) арктангенс х в диапазоне [pi/2,pi/2]

atan2(y, x) арктангенс y/х в диапазоне [-pi,pi]

sinh(x) гиперболический синус х

cosh(x) гиперболический косинус х

tanh(x) гиперболический тангенс х

exp(x) экспоненциальная функция еx

log(x) натуральный логарифм ln(x), х > 0

log10(x) десятичный логарифм log10(x), х > 0

pow(x, y) xy. Ошибка области, если х = 0 и y 0

ceil(x) наименьшее целое в виде double, которое не меньше x

floor(x) наибольшее целое в виде double, которое не больше х

результата равны нулю

modf(x, double *ip) разбивается на целую и дробную части, обе имеют тот же знак, что и х. Целая часть запоминается в *ip, дробная часть выдается как результат

fmod(x, y) остаток от деления х на y в виде числа с плавающей точкой. Знак результата совпадает со знаком х. Если y равен нулю, результат зависит от реализации

Инициализацией - называется присваивание начального значения переменной:

имя_переменной = начальное значение;

или одновременно с объявлением переменной:

тип имя_переменной = значение_переменной.

int m,k,i,n=1,y=2;

float s=0.0000001;

float s=1е-5; char ch='&';

char st[5]="Привет"

Компилятор разрешает давать вещественное значение целой переменной.

Int y=3,33; но это значение буде преобразовано к типу переменной стоящей слева, то есть произойдет потеря информации, так как дробная часть просто отбрасывается..

Операторы

Операторы распознаются по символу ; . Этот символ является завершающей частью оператора. Простейший оператор - пустой ;.

Чаще всего это выражения с присваиванием.

x=(y=n)*6; x=18;

Оператор присваивания

Сокращенная запись Полная запись

x += a; x = x + a;

x -= a; x = x - a;

x *= a; x = x * a;

x /= a; x = x / a;

x %= a; x = x % a;

Некоторые арифметические операции.

При делении целого числа на целое остаток от деления отбрасывается, таким образом, 7/4 будет равно 1. Если же надо получить вещественное число и не отбрасывать остаток, делимое или делитель надо преобразовать к вещественной форме. Например:

int i, n;

i = 7; x = i / 4; // x=1, делится целое на целое

x = i / 4.; // x=1.75, делится целое на дробное

x =(float) i / 4; // x=1.75, явное изменение тиа переменной i

n = 7. / 4.; // n=1, результат записывается в целую переменную

ostatok = 5 % 7; ответ= 5

В языке Си определены специальные операции

Инкремента

i ++ увеличение i на 1 после использования переменной i в вычислениях, постфиксная форма i = i + 1.

++ i увеличение i на 1 до использования переменной i в вычислениях, что равносильно оператору присваивания i = i + 1, префиксная (инфиксная) форма.

Декремента

i-- уменьшение i на 1 после использования переменной i в вычислениях

--i; уменьшение i на 1 до использования переменной i в вычислениях, что равносильно оператору присваивания i = i - 1.

Примеры.

1. Int k,n=1;

K=n++; k=1, n=2.

K=++n; k=2, n=2.

2. Int n=1;

Постфиксная форма инкремента k=2*n++; к=2 n=2.

Префиксная форма инкремента k=2*++n; k=4 n=2.

3. n=3 y=2 // В этой строке и ниже записаны выражения, а не операторы

x=(y+n++)*6

х=30 n=4

!!! Следующий пример работает неверно, так как непонятно какие операции имеются в виду- унарный + или инкремент? Поскольку у них одинаковые приоритеты, то и непонятно какую из них выполнять первой!!!

x=(y+++n)*6 х=30 n=3

Исправленный вариант

x=(y+(++n))*6

х=36 n=4

Пример 1.

int main (void)

{

int k,s,i,n=1;

float a;

#define N 5

#include

printf ("Aaaae ?enei k e a=");

i=scanf ("%d %f", &k,&a);

printf ("k=%5d i=%-10d a=%5.2f N=%d\n", k,i,a,N);

k=2*n++;

printf ("\n k=%5d i=%-10d \n", k,n);

return 0;

} Пример 2.

int main (void)

{ int k,s,i,n=3,x,y=2;

float a;

#define N 5

#include

/* printf ("Aaaae ?enei k e a=");

i=scanf ("%d %f", &k,&a);

printf ("k=%5d i=%-10d a=%5.2f N=%d\n", k,i,a,N);

k=2*n++;

printf ("\n k=%5d i=%-10d \n", k,n);*/

x=(y+n++)*6;

printf ("\n x=%5d n=%-10d \n", x,n);

return 0;

} X=30 n=4

Приведение типов в выражениях.

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

При выполнении присваивания значение справа преобразуется в тип переменной, стоящей слева.

Пример. Компилятор ошибку не выдаст, но произойдет потеря информации.

int k,s,i,n=3,x,y=2;

float a=2.71;

k=a; printf ("\n k=%5d a=%f \n", k,a);

k=2, в переменной к произошла потеря информации. a=2.710000

Правила приведения типов.

Если операнды типов char и short, то оба приводятся к int.

? Если какой-либо из операндов имеет тип long double, то другой приводится к long double.

? если какой-либо из операндов имеет тип double, то другой приводится к double.

? если какой-либо из операндов имеет тип float, то другой приводится к float.

? В противном случае для обоих операндов осуществляется целочисленное повышение: затем, если один из операндов имеет тип unsigned long int, то и другой преобразуется в unsigned long int.

? В противном случае, если один из операндов принадлежит типу long int, а другой - unsigned int, то результат зависит от того, покрывает ли long int все значения unsigned int, и если это так, то unsigned int приводится к long int; если нет, то оба операнда преобразуются в unsigned long int.

? если один из операндов имеет тип long int, то другой приводится к long int.

? если один из операндов - unsigned int, то другой приводится к unsigned int.

? В противном случае оба операнда имеют тип int.

Пример. Char ch;

Int i; Float f;

Double d; Long double r;

R = ch * 2 + ( i - 0.5 ) + ( f + d ) - 7 ;

Явное преобразование типов

Оператор приведения типа

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

выражение-приведенное-к-типу:

унарное-выражение

(имя-типа) выражение-приведенное-к-типу

Данная конструкция называется приведением. Явное преобразование состоит в том, что программист сам указывает тип, используя операцию приведения типа (тип) .

1/2=0

(float) 1/2=0.5

Изменение типа относится к операнду 1.

(float)( 1/2)=0.000000

Преобразовался целый результат в вещественный.

2

Показать полностью… https://vk.com/doc69801468_442775774
189 Кб, 1 марта 2017 в 19:45 - Россия, Москва, СИЮ, 2017 г., doc
Рекомендуемые документы в приложении