Краткий конспект семинарских занятий по языку C - Н.Д. Васюкова_ И.В. Машечкин_ В.В.Тюляева_ Е.М.Шляховая
Описание файла
Документ из архива "Краткий конспект семинарских занятий по языку C - Н.Д. Васюкова_ И.В. Машечкин_ В.В.Тюляева_ Е.М.Шляховая", который расположен в категории "". Всё это находится в предмете "операционные системы" из 3 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Онлайн просмотр документа "Краткий конспект семинарских занятий по языку C - Н.Д. Васюкова_ И.В. Машечкин_ В.В.Тюляева_ Е.М.Шляховая"
Текст из документа "Краткий конспект семинарских занятий по языку C - Н.Д. Васюкова_ И.В. Машечкин_ В.В.Тюляева_ Е.М.Шляховая"
Московский Государственный Университет им. М.В. Ломоносова
Факультет вычислительной математики и кибернетики
Н.Д.Васюкова , И.В.Машечкин , В.В.Тюляева , Е.М.Шляховая
Краткий конспект семинарских занятий
по языку Си.
(учебно-методическое пособие для студентов II курса)
Москва
1999
УДК 681.3.06
ББК 32.973-018.1
В20
В пособии представлен конспект семинарских занятий по программированию на языке Си, проводящихся на факультете ВМиК в поддержку основного курса лекций «Системное программное обеспечение». Рассматриваются основные особенности языка, специфика применения. Пособие рекомендуется для студентов, аспирантов и преподавателей.
УДК 681.3.06
ББК 32.973-018.1
Рецензенты:
доцент В.Г.Баула
доцент А.Н.Терехин
Васюкова Н.Д., Машечкин И.В., Тюляева В.В., Шляховая Е.М.
В20 “Краткий конспект семинарских занятий по языку Си
(учебно-методическое пособие)”.
Издательский отдел факультета ВМиК МГУ
(лицензия ЛР №040777 от 23.07.96), 1999, - 50 c.
Печатается по решению Редакционно-издательского Совета факультета вычислительной математики и кибернетики МГУ им. М.В. Ломоносова
ISBN 5-89407-052-X
© Издательский отдел факультета вычислительной математики и кибернетики МГУ им. М.В. Ломоносова, 1999
Введение. 4
ТЕМА 1. Краткая характеристика языка. Базовые типы данных. Квалификаторы. Переменные и константы. Операторы и операции. Таблица приоритетов операций. Выражения. Приведение типов. 4
ТЕМА 2. Операторы управления: if, switch, while, do while, for, break, continue. Простейшие функции ввода/вывода: getchar, putchar, printf. 10
ТЕМА 3. Понятие указателя. Работа с адресами. Указатели и массивы. 14
ТЕМА 4. Понятие функции. Оператор return. Понятие прототипа функции. Механизм передачи параметров. 17
ТЕМА 5. Общая структура программного файла. Области видимости и существования переменных. Препроцессор. 22
ТЕМА 6. Инициализация одномерных массивов. Массивы указателей и их инициализация. Аргументы командной строки. Указатели на функции. 30
ТЕМА 7. Многомерные массивы и их инициализация. Передача многомерных массивов в качестве параметров функций. Указатель на массив. Интерпретация сложных деклараций. Оператор typedef. 34
ТЕМА 8. Структуры, объединения, битовые поля. Программирование динамических структур данных. 38
ТЕМА 9. Файлы. Библиотечные функции для работы с файлами. 43
Приложение 1. Приоритеты и порядок вычисления операторов. 49
ЛИТЕРАТУРА. 50
Введение.
Пособие подготовлено авторами на основании практического опыта использования и преподавания языка Си на факультете ВМиК. В данном пособии авторы сделали попытку рассмотреть наиболее «тонкие», с точки зрения освоения, возможности языка, которые часто опускаются при изучении или используются не совсем верно. К таким особенностям языка отнесены правила работы с типами данных, работа с указателями, структура программы, видимость и существование переменных и т.п. В то же время, в пособии не рассматриваются многие детали языка, хорошо и полно изложенные в доступной литературе, такие как синтаксис языка, редко используемые конструкции (например, volatile), описание библиотечных функций. При написании пособия авторы часто опирались на сведения из популярной книги Б.Кернигана и Д.Ритчи (Язык программирования Си. М., «Финансы и статистика», 1992г.).
ТЕМА 1. Краткая характеристика языка. Базовые типы данных. Квалификаторы. Переменные и константы. Операторы и операции. Таблица приоритетов операций. Выражения. Приведение типов.
Язык Си – язык программирования высокого уровня, тесно связанный с системой UNIX. Разработан Кеном Томпсоном и Денисом Ритчи в 1972 году. В данном пособии рассматривается стандарт ANSI C, принятый в 1989г.
В Си имеются основные управляющие конструкции, используемые в хорошо структурированных программах. Язык Си обеспечивает разнообразие типов данных. Кроме базовых типов: char, int, float и double имеется возможность получать целую иерархию выводимых типов данных из указателей, массивов, структур и объединений.
Базовые типы данных могут быть использованы с квалификаторами: short, long, signed и unsigned. Всегда выполняется соотношение – размер short не больше размера int, а int, в свою очередь, не больше размера long.
Имена переменных могут состоять из букв (знак подчеркивания считается буквой) и цифр. Первая литера обязательно буква. Большие и маленькие буквы различаются. Для внутренних имен значимыми являются первые 31 литера, а для внешних – 6 литер.
Все переменные должны быть описаны до использования, например,
int a;
long b,c,d;
unsigned char s;
double m[100]; /* m - массив из 100 элементов
типа double, индексы принимают
значения от 0 до 99 */
К любой переменной в декларации может быть применен квалификатор const, указывающий на то, что ее значение далее изменяться не будет (для массива это означает, что ни один из его элементов не будет меняться)
const char warnmsg[] = "warning: ";
Особенности записи констант: целая константа, например, 123 имеет тип int. Целое значение может также иметь восьмеричное или шестнадцатеричное представление. Восьмеричное начинается с нуля (017), а шестнадцатеричное начинается с 0x или 0X (0x1a). Константа типа long завершается буквой l или L, например, 123L. Беззнаковые константы заканчиваются буквой u или U. Константы типа double имеют десятичную точку или экспоненциальную часть, например, 123.4 или 1.234е2. Константы типа float заканчиваются буквой f или F. Константы типа long double заканчиваются буквой l или L, например, 123.4L.
Константа типа char записывается в виде литеры, обрамленной одиночными кавычками (‘*’, ‘s’). Некоторые литеры записываются с помощью заранее определенных эскейп-последовательностей (‘\n’-новая строка, ‘\t’-табуляция, ‘\a’-сигнал звонок и т.д.). Кроме того, произвольный восьмеричный код можно задать в виде ‘\ooo’, где ooo-одна, две или три восьмеричные цифры или ‘\xhh’, где hh-одна или две шестнадцатеричные цифры.
Строковая константа (строка) это ноль или более литер, заключенных в двойные кавычки (“asdf”). Во внутреннем представлении в конце строки присутствует ‘\0’, поэтому, фактически – это массив типа char из n+1 элементов, где n число значащих символов.
В Си имеются средства описания перечислимого типа, для этого используется ключевое слово enum. При описании перечислимого типа полностью задается набор его значений:
enum palette{whitе, black=10, red, green=-1,
blue};
/* white, black, red, green и blue – константы перечислимого типа palette */
enum palette color;
/*color – переменная типа palette, ей может быть присвоена любая из констант этого типа*/
color = white;
Именование констант перечислимого типа уникально в пределах области видимости. Данные константы ассоциированы с целым типом Си и могут использоваться везде, где используются константы типа int. По умолчанию, константам перечислимого типа присваиваются последовательные значения (0,1,2, ….). Если для константы указано “= значение”, то ей присваивается это значение, а следующая за ней константа получает значения на 1 больше и т.д. Таким образом в примере константы перечислимого типа palette имеют следующие значения:
white - 0
black - 10
red - 11
green - -1
blue - 0
В языке Си определены операции следующих типов:
-
Арифметические операции (+, -, *, /, %):
-
унарные операции + и - (изменяет знак стоящей справа величины) имеют более высокий приоритет, чем бинарные операции + и - ;
-
бинарные операции +(сложение) и –(вычитание) имеют одинаковый приоритет, ниже приоритета операций *(умножение), /(деление) и %(остаток от деления);
-
операция / с операндами целых типов выполняется с усечением дробной части;
-
операция % определена только для операндов целых типов;
-
арифметические операции с одинаковым приоритетом выполняются слева направо.
-
Логические операции (!, &&, ||)
-
результатом унарной операции ! (логическое НЕ) будет 0 для ненулевого операнда и 1 для нуля;
-
приоритет бинарной операции &&(логическое И) выше приоритета бинарной операции ||(логическое ИЛИ).
-
Операции отношения(<, <=, >, >=, ==, !=)
-
операции <, <=, >, >= имеют одинаковый приоритет, ниже приоритета операций сравнения на равенство == и != ;
-
операции отношения имеют более низкий приоритет, чем арифметические операции, но более высокий, чем логические операции && и ||.
-
Побитовые операции (&, |, ^, <<, >>, ~)
-
все побитовые операции можно применять только к операндам целых типов (знаковым и беззнаковым char, shot, int и long);
-
результат поразрядных операций & и | не совпадает с результатом логических операций && и ||, например, для x=2 и y=5 результатом x&y будет 0, тогда как результатом x&&у будет 1;
-
операции <<(сдвиг влево) и >>(сдвиг вправо) могут использоваться как эффективное умножение и деление на степени 2: x<<n умножает x на 2 в n-ой степени, а x>>n делит x на 2 в n-ой степени, если число неотрицательное.
-
Операции присваивания (=,+=, -=, *=, /=, %=, <<=, >>=, &=, |=, ^=)
-
типом и значением любой операции присваивания является тип и значение ее левого операнда после завершения присваивания.
-
Инкрементная (++) и декрементная(--) операции
-
могут быть как префиксными, так и постфиксными, так например, ++x увеличивает x на 1 до того, как его значение будет использовано, а x++ - после;
-
эти операции можно применять только к переменным: запись ++(x+y) не верна.
-
Условная(тернарная) операция (?:)
-
в выражении x?y:z первым вычисляется значение выражения x, и если он не нуль, то результатом считается значение выражения у, иначе – значение выражения z.
Полная таблица операций с правилами их выполнения приведена в Приложении 1.
В выражении могут быть использованы операнды различных типов. При вычислении любой бинарной операции над операндами различных типов предварительно осуществляется автоматическое приведение к объемлющему типу в соответствии со следующей схемой:
Примечание. Читать схему следует следующим образом: «если один из операндов имеет тип long double, то другой операнд приводится к long double» и т.д. Особого внимания требует случай, когда один из операндов имеет тип long, а другой – unsigned int: если представление типа long включает все значения типа unsigned int, то unsigned int приводится к long, если же это не так – оба операнда приводятся к unsigned long (эта особенность вызвана тем, что стандарт языка Си не накладывает ограничений на машинное представление переменных, кроме того, что машинное представление переменной long должно быть не короче машинного представления переменной int).
При выполнении операции присваивания тип правой части приводится к типу левой, например:
...int x;
double y=2.9;
x=2+y;
Тип правой части – double, а переменной x будет присвоено значение 4.
Кроме автоматического приведения типов в выражении можно использовать операцию явного приведения типа:
(<тип>)<выражение>
Примечание. В языке Си нет логического типа, а любое значение отличное от нуля считается истинным. Выражение-условие принимает значение 1, если оно истинно и 0, если ложно. Например:
...int c,d;
c=getchar();
d=c>=’0’ && c<=’9’;
Если введенный символ – цифра, то переменной d будет присвоено значение 1, в противном случае 0.
Вычисление логического выражения прекращается как только становится известна истинность или ложность результата.
Задачи.
-
Какое значение примет переменная z?
int x=1, y=2, z;
-
z=x & y | x && x==y;
-
z=x & y | (x && y);
-
Изменятся ли значения переменных x,y,z и какое значение будет присвоено переменной k?
int x, y, z, k;