- •7. Программирование алгоритма линейной структуры на языке Си 27
- •8. Понятие о препроцессоре языка Си 28
- •9. Операторы языка Си и приемы программирования 28
- •10. Массивы. Адресная арифметика языка Си 47
- •1.Правила записи программы на языке Си
- •2.Правила формального описания синтаксиса языка программирования
- •3.Идентификаторы языка Си
- •4.Понятие о типах данных.
- •4.1.Системы счисления. Представление данных в эвм.
- •4.2.Основные типы данных языка Си
- •4.3.Правила записи констант различных типов
- •4.4.Беззнаковый тип для целых данных
- •4.5.Символьные строки
- •5.Понятие функции
- •5.1.Стандартная функция printf
- •5.2.Стандартная функция scanf
- •6.Операции и выражения
- •6.1.Простейшие арифметические операции
- •6.2.Операция присваивания
- •6.3.Оператор-выражение
- •6.4.Использование в выражениях операндов разных типов
- •6.5.Операции преобразования типов
- •6.6.Стандартные математические функции
- •6.7.Простейшие функции, определяемые программистом
- •6.8.Дополнительные арифметические операции
- •6.9.Дополнительные операции присваивания
- •6.10.Битовые операции
- •6.11.Операции отношения
- •6.12.Логические операции
- •6.13.Операция определения размера данных
- •6.14.Приоритеты операций
- •7.Программирование алгоритма линейной структуры на языке Си
- •8.Понятие о препроцессоре языка Си
- •9.Операторы языка Си и приемы программирования
- •9.1.Оператор цикла while
- •9.2.Условный оператор и условная операция
- •1) Короткие операторы:
- •2) Группы коротких операторов:
- •3) Длинные группы операторов:
- •9.3.Запись алгоритмов с помощью диаграмм Несси - Шнейдермана (структограмм )
- •9.4.Н екоторые приемы программирования
- •9.5.Оператор прерывания цикла
- •9.6.Оператор продолжения цикла
- •9.7.Пример организации простейшего меню
- •9.8.Множественный выбор. Оператор переключения
- •9.9.Оператор цикла do-while.
- •9.10.Перечисления. Работа с клавиатурой ibm pc
- •9.11.Пример организации светового меню
- •10.Массивы. Адресная арифметика языка Си
- •10.1.Описание массива
- •10.2.Ввод-вывод массива
- •10.3.Инициализация массива
- •10.4.Программа вычисления длины строки символов
- •10.5.Двумерные массивы (массивы массивов)
- •10.6.Адресная арифметика языка Си
- •10.7.Указатели и одномерные массивы
- •10.8.Указатели и двумерные массивы
- •10.9.Указатели и функции
- •10.10.Оператор typedef
- •10.11.Дополнительные описания указателей для ibm pc
- •10.12.Непосредственная работа с экранной памятью
- •11.Дополнительные сведения о функциях
- •11.1.Области видимости и глобальные данные
- •11.2.Время жизни переменных и классы памяти языка Си
- •11.3.Передача аргументов в функцию
- •11.4.Возврат значений из функций
- •12.Работа с динамической памятью
- •12.1.Стандартные функции управления динамической памятью
- •12.2.Пример использования динамической памяти
- •12.3.Особенности работы с двумерными массивами
- •12.3.1.Пересчет индексов вручную
- •12.3.2.Массивы с постоянной длиной строки
- •12.3.3.Общий случай двумерного массива
- •12.4.Особенности работы с массивами большого размера
- •13.Модульное программирование в системе Turbo c
- •13.1.Обеспечение корректной стыковки модулей
- •13.2.Создание библиотек функций
- •14.Некоторые библиотечные функции языка Си
- •14.1.Функции консольного ввода/вывода (уникальны для tc)
- •14.2.Функции обработки строк.
- •14.3.Функции распознавания вида символа
- •14.4.Функции преобразования данных
- •15.Структуры языка c.
- •15.1.Описание структуры
- •1 Способ
- •2 Способ
- •15.2.Трактовка имени структуры.
- •15.2.1.Доступ к элементу структуры.
- •15.3.Инициализация структур.
- •15.4.Структуры и функции.
- •15.5.Поля бит в структурах.
- •16.Объединения.
- •17.Дополнительные сведения о препроцессоре языка c.
- •18.Условное выражение.
- •18.1.Приоритеты и направления операций.
- •19.Динамические данные.
- •19.1.Линейные списки.
- •19.2.Организация данных в виде стека.
- •19.3.Организация данных в виде очереди.
- •19.4.Организация данных в виде деревьев.
- •20.Библиотека ввода-вывода языка c.
- •20.1.Открытие потока.
- •20.2.Закрытие потока.
- •20.3.Предопределенные указатели потоков.
- •20.4.Функции ввода-вывода.
Сибирский государственный университет
телекоммуникаций и информатики
Дисциплина “Информатика”
Язык программирования Си.
Лекции
Преподаватель: к.т.н., доцент кафедры
Прикладной информатики и кибернетики
Ситняковская Елена Игоревна
Новосибирск – 2011
Содержание
ВВЕДЕНИЕ
1. Правила записи программы на языке Си 7
2. Правила формального описания синтаксиса языка программирования 8
3. Идентификаторы языка Си 9
4. Понятие о типах данных. 9
4.1. Системы счисления. Представление данных в ЭВМ. 10
4.2. Основные типы данных языка Си 11
4.3. Правила записи констант различных типов 12
4.4. Беззнаковый тип для целых данных 14
4.5. Символьные строки 14
5. Понятие функции 15
5.1. Стандартная функция printf 15
5.2. Стандартная функция scanf 16
6. Операции и выражения 17
6.1. Простейшие арифметические операции 17
6.2. Операция присваивания 18
6.3. Оператор-выражение 18
6.4. Использование в выражениях операндов разных типов 18
6.5. Операции преобразования типов 19
6.6. Стандартные математические функции 19
6.7. Простейшие функции, определяемые программистом 20
6.8. Дополнительные арифметические операции 21
6.9. Дополнительные операции присваивания 22
6.10. Битовые операции 23
6.11. Операции отношения 24
6.12. Логические операции 25
6.13. Операция определения размера данных 26
6.14. Приоритеты операций 26
7. Программирование алгоритма линейной структуры на языке Си 27
8. Понятие о препроцессоре языка Си 28
9. Операторы языка Си и приемы программирования 28
9.1. Оператор цикла while 29
9.2. Условный оператор и условная операция 30
9.3. Запись алгоритмов с помощью диаграмм Несси - Шнейдермана (структограмм ) 33
9.4. Некоторые приемы программирования 34
9.5. Оператор прерывания цикла 37
9.6. Оператор продолжения цикла 38
9.7. Пример организации простейшего меню 38
9.8. Множественный выбор. Оператор переключения 39
9.9. Оператор цикла do-while. 41
9.10. Перечисления. Работа с клавиатурой IBM PC 42
9.11. Пример организации светового меню 44
10. Массивы. Адресная арифметика языка Си 47
10.1. Описание массива 47
10.2. Ввод-вывод массива 48
10.3. Инициализация массива 49
10.4. Программа вычисления длины строки символов 50
10.5. Двумерные массивы (массивы массивов) 51
10.6. Адресная арифметика языка Си 54
10.7. Указатели и одномерные массивы 58
10.8. Указатели и двумерные массивы 59
10.9. Указатели и функции 61
10.10. Оператор typedef 62
10.11. Дополнительные описания указателей для IBM PC 63
10.12. Непосредственная работа с экранной памятью 65
11. Дополнительные сведения о функциях 66
11.1. Области видимости и глобальные данные 66
11.2. Время жизни переменных и классы памяти языка Си 69
11.3. Передача аргументов в функцию 70
11.4. Возврат значений из функций 71
12. Работа с динамической памятью 73
12.1. Стандартные функции управления динамической памятью 73
12.2. Пример использования динамической памяти 75
12.3. Особенности работы с двумерными массивами 76
12.3.1. Пересчет индексов вручную 76
12.3.2. Массивы с постоянной длиной строки 78
12.3.3. Общий случай двумерного массива 79
12.4. Особенности работы с массивами большого размера 84
13. Модульное программирование в системе Turbo C 87
13.1. Обеспечение корректной стыковки модулей 87
13.2. Создание библиотек функций 88
14. Некоторые библиотечные функции языка Си 89
14.1. Функции консольного ввода/вывода (уникальны для TC) 89
14.2. Функции обработки строк. 91
14.3. Функции распознавания вида символа 93
14.4. Функции преобразования данных 94
15. Структуры языка C. 95
15.1. Описание структуры 96
15.2. Трактовка имени структуры. 97
15.2.1. Доступ к элементу структуры. 97
15.3. Инициализация структур. 97
15.4. Структуры и функции. 98
15.5. Поля бит в структурах. 99
16. Объединения. 101
17. Дополнительные сведения о препроцессоре языка C. 101
18. Условное выражение. 103
18.1. Приоритеты и направления операций. 103
19. Динамические данные. 105
19.1. Линейные списки. 105
19.2. Организация данных в виде стека. 112
19.3. Организация данных в виде очереди. 113
19.4. Организация данных в виде деревьев. 114
20. Библиотека ввода-вывода языка C. 115
20.1. Открытие потока. 115
20.2. Закрытие потока. 116
20.3. Предопределенные указатели потоков. 117
20.4. Функции ввода-вывода. 117
Введение
Язык программирования Си создан в 1972 г. Деннисом Ритчи при разработке операционной системы UNIX. Язык проектировался как инструмент для системного программирования с ориентацией на разработку хорошо структурированных программ. Первоначально он появился в операционной системе UNIX, и развивался как основной язык систем, совместимых с ОС UNIX. Сам язык, однако, не связан с какой-либо одной операционной системой или машиной; и хотя его называют языком системного программирования, так как он удобен для написания операционных систем, он может использоваться для написания любых больших вычислительных программ, программ для обработки текстов и баз данных. Компиляторы языка Си работают почти на всех типах современных ЭВМ в операционных системах UNIX, MS-DOS, OS/2, Windows, Windows NT и т.д.
Зачем нужно программирование?
Иногда создается впечатление, что все существующие задачи могут быть решены с помощью готовых программ для компьютеров. Во многом это действительно так, но опыт показывает, что всегда находятся задачи, которые не решаются (или плохо решаются) стандартными средствами. В этих случаях приходится писать собственную программу, которая делает все так, как вы этого хотите.
Два этапа создания программ
Программа на языке Си, также как и на большинстве современных языков программиро-
вания, создается в два этапа
1) трансляция – перевод текста программы в машинные коды;
2) компоновка – сборка частей программы и подключение стандартных функций.
Исходный файл:
first.cpp
транслятор
Объектный файл:first.o Стандартные функции
компоновщик
Исполняемый файл:
first.exe
Почему же не сделать все за один шаг? Для простейших программ это действительно было бы проще, но для сложных проектов двухступенчатый процесс имеет явные преимущества:
• обычно сложная программа разбивается на несколько отдельных частей (модулей), которые отлаживаются отдельно и зачастую разными людьми; поэтому в завершении остается лишь собрать готовые модули в единый проект;
• при исправлении в одном модуле не надо снова транслировать (переводить в машинные коды) все остальные (это могут быть десятки тысяч строк);
• при компоновке во многих системах можно подключать модули, написанные на других
языках, например, на Ассемблере (в машинных кодах).
Трансляторы языка Си называются компиляторами: они переводят (транслируют) сразу
всю программу в машинный код, а не транслируют строчка за строчкой во время выполнения, как это делают интерпретаторы. Это позволяет значительно ускорить выполнение программы и не ставить интерпретатор на каждый компьютер, где программа будет выполняться.
Исходный файл программы на языке Си имеет расширение *.с или *.cpp (расширение
*.cpp говорит о том, что в программе могут быть использованы возможности языка Си++).
Это обычный текстовый файл, в который записывают текст программы в любом текстовом редакторе, например, в Блокноте.
Транслятор переводит исходный файл (вернее, записанную в нем программу) в машин-
ные коды и строит так называемый объектный файл с тем же именем и расширением *.o. Хотя в нем уже записан машинный код, объектный файл еще нельзя запускать на компьютере, потому что в нем не хватает стандартных функций (например, для ввода и вывода данных).
Компоновщик подключает стандартные функции, хранящиеся в библиотеках (они имеют
расширение *.a). В результате получается один файл с расширением *.exe, который и пред
ставляет собой готовую программу.
Простейшая программа на Си
Такая программа состоит всего из 8 символов. Вот она:
main()
{
}
Основная программа всегда называется именем main (будьте внимательны – Си различает
большие и маленькие буквы, а все стандартные операторы Си записываются маленькими буквами). Пустые скобки означают, что main не имеет аргументов. Фигурные скобки обозначают начало и конец основной программы – поскольку внутри них ничего нет, наша программа ничего не делает, она просто соответствует правилам языка Си, ее можно скомпилировать и получить exe-файл.
Вывод текста на экран
Составим теперь программу, которая делает что-нибудь полезное, например, выводит на
экран слово «Привет».
#include <stdio.h> подключение функций стандартного ввода и вывода,
описание которых находится в файле stdio.h
main() вызов функции
{
printf("Привет"); вывода на экран
}
Выводы:
• Чтобы использовать стандартные функции, необходимо сказать транслятору, что есть
функция с таким именем и перечислить тип ее аргументов – тогда он сможет определить,
верно ли мы ее используем. Это значит, что надо включить в программу описание этой
функции. Описания стандартных функций Си находятся в так называемых заголовочных
файлах с расширением *.h.
• Для подключения заголовочных файлов используется директива (команда) препроцессора #include, после которой в угловых скобках ставится имя файла. Внутри угловых скобок не должно быть пробелов. Для подключения еще каждого нового заголовочного файла надо использовать новую команду #include.
Препроцессор – это специальная программа, которая обрабатывает текст вашей программы раньше транслятора. Все команды препроцессора начиняются знаком #.
• Для вывода информации на экран используется функция printf. В простейшем случае
она принимает единственный аргумент – строку в кавычках, которую надо вывести на эк-
ран.
• Каждый оператор языка Си заканчивается точкой с запятой.
Как запустить программу?
Чтобы проверить эту программу, надо сначала «напустить» на нее транслятор, который
переведет ее в машинные коды, а затем – компоновщик, который подключит стандартные
функции и создаст исполняемый файл. Раньше все это делали, вводя команды в командной строке или с помощью так называемых пакетных файлов. На современном уровне все этапы создания, трансляции, компоновки, отладки и проверки программы объединены и выполняются внутри специальной программы-оболочки, которую называют интегрированная среда разработки (IDE – integrated development environment). В нее входят:
• редактор текста
• транслятор
• компоновщик
• отладчик
В этой среде вам достаточно набрать текст программы и нажать на одну клавишу, чтобы она выполнилась (если нет ошибок).
В оболочке, например, Dev-C++ для запуска программы надо нажать клавишу F9. Если в программе есть ошибки, вы увидите в нижней части экрана оболочки сообщения об этих ошибках (к сожалению, на английском языке). Если щелкнуть по одной из этих строчек, в тексте программы выделяется строка, в которой транслятору что-то не понравилось.
При поиске ошибок надо помнить, что
• часто ошибка сделана не в выделенной строке, а в предыдущей – проверяйте и ее тоже;
• часто одна ошибка вызывает еще несколько, и появляются так называемые наведенные
ошибки.
Остановим мгновение
Если запускать рассмотренную выше программу, то обнаружится, что программа сразу
заканчивает работу и возвращается обратно в оболочку, не дав нам посмотреть результат ее работы на экране. Бороться с этим можно так – давайте скажем компьютеру, что в конце работы надо дождаться нажатия любой клавиши.
#include <stdio.h>
#include <conio.h> подключение заголовочного файла conio.h
main()
{
printf("Привет"); // вывод на экран
getch(); /*ждать нажатия клавиши*/
}
Выводы:
• Задержка до нажатия любой клавиши выполняется функцией getch().
• Описание этой функции находится в заголовочном файле conio.h.
