Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Мини шпоры по инфе.docx
Скачиваний:
4
Добавлен:
18.04.2019
Размер:
350.24 Кб
Скачать

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

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

#define, #elif, #else, #endif, #if, #ifdef, #ifndef, #include, #undef.

Директива #include

Строка  #include "имя. файла "  заменяет эту строку полным содержимым файла имя. файла. Если не указан путь то файл сначала ищется в директории исходного файла , затем в директории заданной в опциях компилятора(обычно директория Include). Строка #include <имя. файла> ищет файл только в директории заданной в опциях компилятора.

Директива #define

#define идентификатор строка символов заменяет все последующие вхождения идентификатора строкой символов.  пример: #define A_NUMBER 100 int n=A_NUMBER ; n присвоится значение 100

#define можно применять также для определения макросов,например #define SWAP(a,b) temp=(a);(a)=(b);(b)=temp подробнее о #define (и в частности о макросах) будет отдельная статья

Директива #undef

строка  #undef идентификатор отменяет прероцессорное определение идентификатора

Директивы #if #else #endif

директива  #if выражение ..... #endif  проверяет истинно ли выражение и если истинно, то выполняет все последующие строки до директивы #endif конструкция типа #if выражение .... #else ...  #endif  проверяет выражение, если оно истинно то выполняются строки между #if и #else а если ложно то между #else и #endif

Директивы #ifdef #ifndef

директива  #ifdef идентификатор ..... #endif  проверяет определен ли идентификатор в препроцессоре в данный момент(директивой #define) и если определен, то выполняет все последующие строки до директивы #endif

директива  #ifndef идентификатор ..... #endif наоборот, выполняет все последующие строки до директивы #endif если идентификатор не определен в препроцессоре в данный момент

Директива #error

Директива  #error сообщение об ошибке останавливает работу компилятора и выдает сообщение об ошибке  например: #ifndef smth_important #error smth important isn't defined #endif  компилятор выдаст что-то типа: Fatal F1003 file.cpp 2: Error directive: smth important isn't defined *** 1 errors in Compile ***

Директива #line

Директива #line константа “имя. файла” заставляет компилятор считать, что константа задает номер следующей строки исходного файла, и текущий входной файл именуется идентификатором. Если идентификатор отсутствует, то запомненное имя файла не изменяется.

Директива #pragma

#pragma - это директива препроцессора, которая реализует возможности компилятора. Эти особенности могут быть связанны с типом компилятора.Разные типы компиляторов могут поддерживать разные директивы. Общий вид директивы: #pragma команда компилятора

например: #pragma message("сообщение") просто выдает сообщение при компиляции

5) Понятие переменная и константа

Константа — это составная часть программы; объект, имеющий значение.

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

Переменная - это составная часть программы, имеющая значение и название.

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

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

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

6) Объявление и инициализация переменных.

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

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

Типы переменных:

1. Тип Char

2. Тип int

Объявление переменных.

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

Пример объявления переменных:

Int a, b, c;

Инициализация значения переменной при объявлении

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

Int x=100;

Таким образом, в переменную x при объявлении сразу же будет записано число 100.

7) Операции и выражения

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

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

Простейшие арифметические операции

Определены для данных арифметических типов, т.е. вещественных (floatdouble) и целых (intshortlongchar и соответствующих им беззнаковых данных unsigned intunsigned short,unsigned longunsigned char).

Действие этих операций - соответствующее арифметическое действие. Результат операции - результат арифметического действия.

Одноместные арифметические операции имеют один операнд. К ним относятся операции "+" и "-", которые меняют знак операнда.

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

Двуместные арифметические операции имеют два операнда. К ним относятся операции + , - , * , / и % . Каждая из этих операций выполняет соответствующее действие, результат которого и является результатом операции.

Операция + вычисляет сумму операндов, операция - вычисляет разность, операция * вычисляет произведение, операция / вычисляет частное от деления вещественных операндов или целую часть частного от деления целых операндов, операция % вычисляет остаток от деления первого операнда на второй.

Арифметические операции в выражениях выполняются слева направо в соответствии с общепринятыми приоритетами. Приоритет можно изменить с помощью скобок.

  1. Примеры выражений с арифметическими операциями:  

  2.                        a + b%c  

  3.                        (a + b)/3*5  

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

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

Результат операции присваивания - значение присвоенной величины.

Поскольку присваивание является операцией, а не оператором, то в одном выражении допускается несколько присваиваний. В этом случае они выполняются справа налево

  1. Например:  

  2.   

  3.              ab = ( c = d+5 ) * 6  

Присваивание имеет самый низкий приоритет из всех операций.

Оператор-выражение

Выражение, оканчивающееся точкой с запятой, является оператором, т.е. наименьшей элементарной частью программы.

  1. БНФ:  

  2.         оператор = выражение ";"  

  3.   

  4. Пример:  

  5.         ab = ( c = d + 5 ) * 6;   /* это оператор */  

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

Использование в выражениях операндов разных типов

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

Типы данных в порядке возрастания точности:

char, short, int, long, float, double.

  1. Пример:  

  2.          int a, c;  

  3.          float d, e;  

  4.          e = d*(c+e);  /* c будет преобразовано в float */  

  5.          a = 'A' + 20; /* 'A' будет преобразовано в int */  

Операции преобразования типов

В некоторых случаях правила преобразования типов не позволяют получить верный результат, например:

  1. int a, b;  

  2. float c;  

  3. a = 7; b = 14;  

  4. c = a/b;       /* результат 0 */  

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

  1. c = a;  c = c/b;  

А можно применить операцию преобразования типа:

  1. БНФ:  

  2.       преобразование_типа = "("имя_типа ")" выражение  

имя_типа - название любого типа, в том числе и заданного программистом.

Для нашего примера применение операции преобразования типа будет выглядеть так:

  1. c = (float)a / (float)b;  

Операция преобразования типа имеет приоритет более высокий, чем арифметическая операция.

8) Арифметические операции.

примеры обозначения операций, принятые в языке С:

  • (..) - открывающая и закрывающая скобки. Показывают старшинство выполнения действий в скобках.

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

  • ++ увеличение на единицу (increment).

  • -- уменьшение на единицу (decrement).

  • + сложение.

  • - вычитание.

  • * умножение.

  • / деление.

  • > больше.

  • < меньше.

  • = равно.

  • == не равно.

  • && логическое умножение или конъюнкция.

  • || логическое сложение или дизъюнкция.

  • # знак операции препроцессора.

  • и так далее...

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

  • - вычитание или унарный минус;

  • + сложение;

  • * умножение;

  • / деление;

  • % деление по модулю;

  • ++ увеличение на единицу;

  • -- уменьшение на единицу;

    Операции сложения, вычитания, умножения и деления действуют так же, как в большинстве алгоритмических языков программирования. операции выполняются так: сначала вычисляется значение левого выражения (операнда), затем вычисляется значение выражения, стоящего справа от знака действия. Далее, в том случае, когда операнды имеют общий тип данных, этот же тип имеет и результат. Поэтому, если применяется деление "/" к целым числам, например, 11/3, то результат тоже будет целым, то есть в данном случае 3. А выражение 1/2 в этом случае будет равно нулю.     Операция "%" деление по модулю дает остаток от целочисленного деления. Она может применяться к целочисленным переменным.

9) Логические операции.

   Среди логических операций следует выделить операции 'и' ('and'), 'или' ('or'), отрицание 'не' ('not') и сложение по модулю 2 ('xor'). В языке Си логические операции обозначаются следующим образом:

Операция

Обозначение в Си

x and y

x && y

x or y

x || y

not x

!x

x xor y

x ^ y

Следует отметить также логическую операцию сравнения, обозначаемую в Си двумя знаками равенства. При этом выражение (x == y) эквивалентно  !(x xor y). Операция называется операцией "сложение по модулю 2", потому что x xor y = (x + y) mod 2. Логические операции подчиняются правилу Де-Моргана:

not (x and y) = (not x) or (not y)

или то же самое

!(x && y) = !x || !y

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

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

Результат операции присваивания - значение присвоенной величины.

Поскольку присваивание является операцией, а не оператором, то в одном выражении допускается несколько присваиваний. В этом случае они выполняются справа налево

  1. Например:  

  2.   

  3.              ab = ( c = d+5 ) * 6  

Присваивание имеет самый низкий приоритет из всех операций.

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

== равно

!= не равно

< меньше

> больше

<= меньше или равно

>= больше или равно

Операции сравнения. Сравнивать можно операнды любого типа, но либо они должны быть оба одного и того же встроенного типа ( сравнение на равенство и неравенство работает для двух величин любого типа), либо между ними должна быть определена соответствующая операция сравнения. Результат – логическое значение true или false.

12) Преобразование типов. Правило преобразования типов.

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

Среди преобразования типов в языке Си выделяют:

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

2.      преобразование указателей;

3.      преобразование ссылок.

 

Пример:

Неявное приведение типов

Явное приведение типов

I способ

Явное приведение типов

II способ

 

int x = 5;

float y;

y = 1/x;

 

Ответ: y = 0.000000;

int x = 5;

float y;

y = 1.0/x;

 

Ответ: y = 0.200000;

int x = 5;

float y;

y = (float) 1/ (float) x;

 

Ответ: y = 0.200000;

 

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

Для явного приведения типов арифметических выражений используются 2 способа преобразования:

1.     каноническая операция приведения типов: (float) 2/5, (int) 7.12; может применяться и для типов, имеющих сложные обозначения: (int) x/(2+x);

2.     функциональная операция приведения типов (не может применяться для для типов, не имеющих простого имени): int (3.1415), float (2/5);

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

 

Рисунок 7. Арифметические преобразования типов

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

13) Условный оператор

Основные операторы языка Си можно условно разделить на 3 группы:

1. операторы выбора;

2. операторы циклов;

3. операторы переходов.

Условный оператор if, относящий к операторам выбора,  имеет 3 формы. Первая форма – сокращенная:

if(выражение_условие)

операторы_дествия;

Рисунок 8. Блок схема сокращенной формы условного оператора

где в качестве выражения_условия могут использоваться арифметические выражения, отношения и логические выражения. Действие выполняется только в случае истинности (т.е. при ненулевом значении) выражения_условия.

Пример:

if(x < 0)

y = -x;

Кроме сокращенной формы, существует полная форма условного оператора if:

if(выражение_условие)

операторы_действия_1;

else

операторы_действия_2;

Рисунок 9. Блок схема полной формы условного оператора

 

Здесь в случае истинности выражения_условия выполняется только действие_1 или блок действий_1, при нулевом значении выражения_условия выполняется только действие_2.

Пример:

if(x > 0)

y = x;

else

y = -x;

Часто встречается необходимость использовать конструкцию if-else-if или вложенный условный оператор:

if(выражение_условие_1)

операторы_действия_1;

else if(выражение_условие_2)

операторы_действия_2;

else

операторы_действия; 

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

 

Пример:

if(x > 0)

y = x;

else if(x < 0)

y = -x;

else

y = 0;

Не стоит забывать о некорректной записи вложенных связок с участием условного оператора:

if (x > 0)

z = y / x;

if (y < 0)

z = x + y;

else

z = x - y;

 

В такой форме непонятно, к какому из операторов if относится else. В языке Си оператор else ассоциируется с ближайшим if в соответствующем блоке. В последнем примере else относится к if (y<0).

Таблица 8

Примеры с использованием условного оператора

 

Пример 1 [программа pr_4]

Пример 2 [программа pr_5]

#include <stdio.h>

#include <conio.h>

#include <math.h>

 

int main(void)

{

float x, y, z;

clrscr();

printf("\nx = ");

scanf("%f", &x);

printf("\ny = ");

scanf("%f", &y);

if(x!=2 && (x+y)/(2-x)>=0 && (x-y)>0)

{

z = sqrt((x+y)/(2-x))*sin(y) - log(x-y);

printf("\nz = %.2f", z);

}

else

printf("Error!");

getch();

return 0;

}

#include <stdio.h>

#include <conio.h>

 

int main(void)

{

int x, y;

clrscr();

printf("\nx = ");

scanf("%d", &x);

if(x)

y = 1;

else

y = 0;

printf("y = %d", y);

if(!x)

y = 1;

else

y = 0;

printf("\ny = %d", y);

getch();

return 0;

}

14) Условная операция

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

  1. БНФ:  

  2.      условное_операция = выр_0 "?" выр_1 ":" выр_2  

Значение условной операции равно <выр_1>, если <выр_0> не равно 0 и <выр_2> в противном случае. Например, следующий оператор

  1. if ( x>a ) f = sin( x-a ); else f = sin(x);  

можно заменить условной операцией, и сразу вычислить f:

  1. f = sin( x>a ? x-a : x );  

Очевидно, в последнем случае получился более короткий код, поскольку обращений к переменной f и функции sin вдвое меньше.

15) Оператор множественного выбора (switch)

Основным средством для организации мультиветвления служит оператор- переключатель switch. Основная форма оператора:

switch(выражение)

{

case константа_1:

действия_1;

break;

case константа_2:

действия_2;

break;

case константа_N:

действия_N;

break;

default:

действия;

}

Сначала вычисляется выражение в скобках за ключевым словом switch. Затем просматривается список меток (case константа_1  и так далее) до тех пор, пока не находится метка, соответствующая значению вычисленного выражения. Далее происходит выполнение соответствующей последовательности действий, следующих за двоеточием. Если же значение выражения не соответствует ни одной из меток оператора switch, то выполняется последовательность действий, следующая за ключевым словом default. Допускается конструкция switch, когда слово default  и соответствующая последовательность конструкция операторов может отсутствовать.

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

Пример программа 

#include <stdio.h>

#include <conio.h>

 

int main(void)

{

int x;

float y;

clrscr();

printf("x = ");

scanf("%d", &x);

switch(x)

{

case 4: y = 1.0/(x-2);  break;

case 8: y = x*2.0;        break;

default: y = x/2.0;

}

printf("\ny = %.2f\n", y);

getch();

return 0;

}

16) Оператор цикла for

Основная форма цикла for имеет следующий вид:

for(выражение_1; выражение_2; выражение_3)

операторы_действия;

или

for(инициализация; проверка условия; шаг цикла)

операторы_действия;

В простейшем форме инициализация или выражение_1 используется для присвоения начального значения параметру цикла. Проверка условия или выражение_2 – обычно условное или арифметическое выражение, которое определяет, когда цикл должен быть завершен. Изменение-шаг или выражение_3 обычно используется для изменения параметра цикла каждый раз при повторении цикла. Эти три раздела заголовка цикла должны быть разделены точкой с запятой. Выполнение цикла происходит до тех пор, пока условное выражение истинно. Как только условие становится ложным, начинает выполняться следующий за циклом for оператор. Любое из трех выражений в операторе for могут отсутствовать, но разделяющие их символы «; - точка с запятой» должны присутствовать всегда. Если отсутствует выражение_2, то считается, что оно истинно и нужны специальные средства для выхода из цикла.

Пример программа :

Вариант 1

printf(“x\ty\n”);

for(x=0; x<11; x++)

{

y = x*x;

printf(“%d\t%d\n”, x, y);

}

 

Вариант 2

printf(“x\ty\n”);

for(x=0; x<11; x++)

printf(“%d\t%d\n”, x, x*x);