Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СПО.doc
Скачиваний:
46
Добавлен:
12.03.2015
Размер:
605.18 Кб
Скачать

8. Язык программирования с.

8.1. Константы.

В языке С существует три вида арифметических констант.

  • десятичные (обязательно начинаются с цифры от 0 до 9)

  • восьмеричные (начинаются с цифры 0 и включают цифры от 0 до 7)

  • шестнадцатеричные (начинаются с 0х или 0Х и могут включать в себя цифры от 0 до 9 и символы от A до F

Кроме того, программист может задать длину константы. Если за числом не идет никакого символа, то константа является короткой, если же за числом есть символ l(L), тогда константа длинная.

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

Примеры:

100 - десятичное сто

0100 - восьмеричное

0х100 - шестнадцатеричное

100L - десятичное длинное (4 байта)

0100L - восьмеричное длинное

0х100L - шестнадцатеричное длинное

Вопрос: Как записать десятичное число 0,9 в восьмеричной форме? Ответ: 011Е-1.

В языке С различаются символьные и строковые константы. Символьная константа состоит из одного символа и заключается в апострофы (к примеру, можно записать так - ‘а’). Строковая константа состоит из нуля или более символов и заключается в двойные апострофы (например, “ас”). В конце строки обязательно ставится символ с кодом 0 (все строки в языке С типа PChar). Кроме того символ может быть задан специальной последовательностью, при этом такая последовательность обязательно начинается обратным знаком деления («\») и заключается в апострофы или двойные кавычки.

Предопределенные знаки:

\n – новая строка, перевод строки

\t – табуляция

\v – вертикальная табуляция

\b – возврат на шаг

\r – возврат каретки

\f – перевод формата

\\ - \

\’’ – '

\”” – “

\0 – код нуля

\<nnn> - , где nnn задает код символа от 0 до 255.

Для унификации программного обеспечения рекомендуется употреблять в строках только следующие обозначения: \n, \t, \r, \f, \\, \’ ,\”, \0.

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

8.2. Синтаксис С.

Тип строка записывается следующим образом Char[]. Символы [ и ] говорят о том, что пользователь задает массив. Нижняя граница массива всегда равна нулю. Верхняя граница может быть как заданной, так и незаданной. Если граница задана, то транслятор выделяет память под данные в начале работы программы. Если граница не задана, то массив будет распределен динамически в куче. При этом правильность выделения массива лежит полностью на программисте.

Комментарии начинаются на /* и заканчиваются на */.

Программа на языке С состоит из трех частей:

  • включаемые модули и директивы компилятора

  • определение типов и переменных внутри программы

  • программный код

8.3. Типы памяти переменных

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

  1. auto (в соответствии с вышеперечисленными правилами, приписывается по умолчанию)

  2. Extern (внешняя переменная, распространяет свою область на весь программный комплекс)

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

  4. Static (тип переменных, которые уничтожаются после завершения работы функции или операторных скобок).

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

8.4 Структуры в С.

Структура языка С имеет ключевое слово struct <имя> { здесь перечисляются поля}

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

Union <name> {перечисляемые поля}

Перечисляемые поля накладываются друг на друга. Разрешается включать как подструктуру так и подобъединение. В типе struct длина складывается из всех длин полей, в типе union вычисляется как максимальная из перечисленных полей.

В отличии от Паскаля в С можно определить как поле в записи только несколько бит из байта. Слова или двойного слова. Это делается с помощью разделителя «:» и числа, стоящим за ним.

Пример.

struct my {

unsigned int bi10:10;

unsigned int bi6:6;

unsigned char a;

char b;

long int c

}

В данной структуре my определены два поля bi10 и bi6, которые объединяются в одно слово.

8.5. Операции в выражениях.

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

  1. “+” – сумма, может быть определена между числами и указателями

  2. “-” – аналогично

  3. “*” – аналогично в языке Паскаль (только между числами)

  4. “/” – аналогично в языке Паскаль, но результат деления определяется типами участвующих чисел по следующему правилу: если один из целых операндов длиннее другого, то короткий операнд преобразуется к более длинному. Если один из операндов – действительное число, то второй операнд преобразуется к действительному. Если одно из действительных чисел длиннее второго, то второе преобразуется к более длинному. В некоторых трансляторах иногда происходит ошибка, поэтому рекомендуется при сложных вычислениях задавать порядок преобразований непосредственно программисту. Порядок преобразования задается утверждением (<тип>) <данное>, например (real)I.

  5. “%” – остаток от деления на цело (соответствует Mod в Паскале)

  6. “++” – увеличивает значение выражения на 1, но возвращает результат равный предыдущему, например, {j=4; I=++j;} в результате I=4, j=5.

  7. “<выр>++” – аналогично, только результат возвращается равный значению переменной, например, { j=4; I=++j;} в результате I=5, j=5.

  8. “<выр>--” – аналогично “<выр>++”

  9. “--<выр>” – аналогично “++<выр>”. Операции ++ и – могут быть проделаны как над числами, так и над указателями.

  10. Операция присваивания =, например, I=4

  11. Присваивание с модификацией переменной “+=”, например, {I=5;j+=7}, в результате I=12

  12. “+=” – аналогично предыдущей. Данные операции могут производиться как над переменными числовых типов, так и над указателями.

  13. “*=” - только над числовым типом, например, {I=2;j=3;I*=j++}, в результате I=8.

  14. “/=” – аналогично предыдущему.

  15. “%=” – аналогично

  16. “>>=” – сдвиг вправо, например, {I=4;I>>=1;}, в результате I=2.

  17. “<<=” – сдвиг влево

  18. “&=” - логическое умножение, пример, {I=12;j=4;I&=J}, в результате I=4.

  19. “!=” – логическое сложение, например, {I=12;j=4;I!=J}, в результате I=12.

  20. “^=” - исключающее или

Пример, {I=12;j=4;I^=J}.

8.5.2. Адресные операции.

  1. & - вычисляет адрес переменной (в Паскале @). Пример, I=&N.

  2. * - присваивание значения указателю. Пример, {N=5;I=&N;*I=10;}.

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

8.5.3. Операции отношения.

Операции отношения употребляются в логических операторах и операторах цикла.

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

  2. != - проверка на неравенство, допускается как арифметический тип, так и строковый, а также указатели.

  3. < - операция меньше, допускается все типы данных, а также указатели.

  4. <= - операция меньше или равно, допускается все типы данных, а также указатели.

  5. > - операция больше, допускается все типы данных, а также указатели.

  6. >= - операция больше или равно, допускается все типы данных, а также указатели.

Операции отношения могут быть объединены с помощью логических операций, допускается три вида логических операций:

  1. ! – отрицание.

  2. !! – логическое сложение.

  3. && - логическое умножение.

8.5.4. Специальные операции.

  1. Встроенная логическая операция:

синтаксис: (<лог. выр.>?< выр.1>:< выр.2>)

<лог. выр.> - выражение, которое проверяется до выполнения < выр.1> или < выр.2>.

< выр.1> - выполняется, если логическое выражение истинно.

< выр.2> - выполняется, если логическое выражение ложно.

Пример: C=((A<0) ? A/2 : SQRT(A));

  1. Определить размер:

синтаксис: SIZE of (<тип/массив>)

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

  1. (<тип>) – функция явного преобразования.

Пример: в Turbo Pascal Word(I), Real(K) в Си (Word)I, (Real)K соответственно.

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

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

Си : I++, J=0, k=--4; - один оператор.

8.6. Операторы языка Си.

  1. Оператор { } (в Turbo Pascal Begin End;”)

  2. Логический

If (<ЛВ>) <ОП true> [else<ОП false>]

Пример: If (A<3)

If (A<5)

Else B=2;

Else относится ко второму If.

  1. Сложный логический оператор:

Switch (<Bыр.>){

Case <const>:<OП1> ;…; <ОПN>;

Else <const> <ОП>1

…………………………………

Case <constK>:<OП1 >;…; <ОПN>;

[default : <OП1> ;…; <ОПN>;]}

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

Пример: Turbo Pascal:

Case of

1 : A:=1

2 : A:=2

end;

Си:

Switch {

Case 1 : A=1

Case 2 : A=2

}

Если I=1, то case в Turbo Pascal присваивает переменной 1, в Си Switch присваивает переменной A – значение 2.

Для того чтобы выйти из любого цикла существует оператор Break.

В Си есть оператор продолжить цикл Continue (т.е. тело цикла игнорируется).

  1. Оператор с фиксированным значением повторений:

For (<B1>[;<B2>;[<B3>]]) <ОП>;

B1 – начальные параметры цикла.

В2 – выражение истинность которого выполняется для продолжения цикла

В3 - постоянная часть цикла.

Пример: в Turbo Pascal:

For I:=0 to 9 do M[I]:=0;

В Си:

For (I=0; I<10; I++) M[I]=0;

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

For (i=0; j=N-1; i<N; I++, j--) a[i]=a[j];

  1. Оператор Do While

DO <ОП> While (<ЛВ>) – повтор один или несколько раз.

(в Turbo Pascal: repeat - until)

  1. While

While (<ЛВ>) <ОП>;

(в Turbo Pascal: While)

8.7. Функции в языке Си.

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

Описание функции:

<TB>

<имя Ф>[(<П1>,<П2>,…,<ПN>)]

<Тип1><n1>;

<Тип2><n2>;

…………….

<ТипN><nN>;

{

/*Tело Ф*/

[Return(<B>);]

}

<TB> - тип возврата

- имя функции и необязательные параметры передаваемые в функцию, если для функции определены параметры передачи, то они обязательно должны быть описаны. Команды и если функция возвращает какое-то значение, внутри нее должен быть хотя бы один оператор Return, при попадании на данный оператор работа функции заканчивается и также через стек происходит возврат значения, также как и в Turbo Pascal может быть несколько точек выхода из функции.

Double

LimFunc(x,a,b)

Double : x

Double : a

Int registers b;

{Return (a*b+x)

}

Пример обращения:

Правильный: L= LimFunc(2e-1,3e-2,14)

Не правильный: L= LimFunc(2e-1,5,14)

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

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

8.8. Структура головной программы на языке Си

main (arqc, arqv, envp)

int arqv

char ** arqv

char ** enpv

{

/*меню программы/

}

arcc – кол-во элементов программы, передающихся в главный модуль.

В TP соответствует ParamCount

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

enpv – символьная матрица, передающая в себя установки в ОС. Данная матрица не заполняется, а формируется транслятором автоматически.

8.9. Включаемые библиотеки

В языке Си существует множество директив к транслятору, позволяющих создавать независимые от платформы программное обеспечение. Директивы к транслятору начинаются со знака #. Наиболее часто употребляются директивы #include </”<ф>”/> - включить файл. Включение текстов программ. Файл имеет расширение *.h (в языке Си *.c или *.cpp). Если имя файла идет в знаках < >, например, #include <math.h>, то файл math.h ищется в стандартной директории языка Си. Если имя файла заключено в “”, то файл ищется по директориям:

  1. текущей директории;

  2. директории определяемой ОС, с атрибутом path;

  3. стандартной директории языка Си.

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

Кроме include существуют:

#define

#undef

#if<ЛВ>

#ifdef<ЛВ>

#else

#endif

#line