
- •1 Компьютер для программиста.
- •12. Пользовательские скалярные типы данных в языках Си
- •13.Структурированые типы данных в языке си
- •14.Арифметические выражения
- •18. Выражения с указателями
- •20.Константные выражения
- •21. Приоритет операций и скобочная структура выражений
- •22. Структура программы на си
1 Компьютер для программиста.
Компьютер состоит из
1АЛУ с входными и выходными регистрами
2Оперативной памяти с областью команд и данных
3Устройства управления
4Устройства ввода-вывода
Регистры представляют собой устройства для хранения одной единицы информации
Арифметико-логическое устройство выполняет основные вычислительные и логические команды.Оперативная память представляет собой последовательность пронумерованных ячеек, называемых байтом. Каждая ячейка имеет порядковый номер, который является ее линейным адресом. В ячейке храниться информация, которая составляет содержимое ячейки. Элемент данных записывается в один байт или группу смежных байтов. Адрес первого из них является адресом этого элемента. В ОП хранятся как данные, так и команды.
Устройство современных ЭВМ основано на принципах двоичной арифметики, где для представления чисел используются всего две цифры - 0 и 1. В двоичной арифметике любое число кодируется битовыми последовательностями.
Первая попытка оптимизации программирования в двоичных кодах заключалась в разработке специальной системы кодирования двоичных машинных команд многобуквенными мнемоническими сокращениями.
Программирование в мнемонических командах удобнее для программиста, поскольку мнемонические коды содержат для программиста дополнительную информацию по сравнению с трудно различимыми последовательностями нулей и единиц. Вместе с тем текст подобной программы становится абсолютно непонятным вычислительной машине и требует специальной программы-переводчика (или транслятора), которая бы заменяла мнемонический код исходной двоичной командой. С момента реализации этой идеи кодирование становится программированием.
Машинные команды, это команды низкого уровня, обращенные непосредственно к процессору. Точный вид команд на языках низкого уровня зависит от типа компьютера. Инструкции, написанные на языке ассемблера, выглядят почти также как машинные команды, однако для их реализации необходимо дополнительное преобразование (а именно, перевод в двоичные строки).
Перевод инструкций с языка высокого уровня на машинный язык осуществляют специальные программы, называемые компилятором. Компиляторы - это особый вид программ, для которых входными и выходными данными являются программы. Принято первичную программу называть исходной программой, а переведенную компилятором объектным кодом.
Языки, которые требуют предварительного перевода, называются языками высокого уровня. Считается, что эти языки в определённом смысле более близки к естественному языку.
2. Программное обеспечение. Компиляторы и интерпритаторы.
Текст программы на языке С можно записать в любом редакторе. После этого ее надо скомпилировать. Способ компиляции и работы С программ зависит от особенностей используемой системы. Наиболее распространенные это Турбо Борланд и Microsoft visual studio. В любом случае нужно уметь компилировать, компоновать и запускать программу в конкретной среде программирования.
При обнаружении синтаксической ошибки компилятор сообщает об этом пользователю, прекращает работу и указывает на приблизительное место ошибки. Иногда компилятор выдает предупреждение об ошибке. Это означает, что в программе есть строки не противоречащие синтаксису языка, но они могут содержать ошибку или другую некорректность использования ЭВМ. Существуют ошибки времени выполнения (например, деление на ноль), которые также сообщает среда программирования.
Ошибки при составлении алгоритма или переводе алгоритма на машинный язык называются логическими. Пока не существует методов обнаружения этих ошибок и поэтому надо тщательно составлять алгоритм программы с учетом всех особенностей решаемой задачи.
3. Создание программ. Жизненный цикл программного обеспечения.
Не существует универсального способа написания программ, однако при написании следует придерживаться следующей стратегии. Во-первых, весь процесс написания программы можно разделить на два этапа: фаза решения задачи и фаза реализации. И во-вторых, следует придерживаться формализованного способа документирования написания программы.
Результатом фазы решения задачи является алгоритм, записанный в виде последовательности инструкций. Затем этот алгоритм переводиться на язык программирования. Эта фаза составляет суть фазы реализации.
В соответствии с предложенной стратегией, вначале нужно убедиться, что решаемая задача корректно поставлена. Необходимо решить, что будет являться входной информацией, что выходной, в какой форме эта информация будет представлена. Алгоритм решения может быть записан на языке программирования или в виде обычных предложений. Главное, чтобы алгоритм отражал последовательность точных инструкций решения задачи. Фаза реализации – это тоже не тривиальный процесс. Здесь требуется хорошие знания, навыки и умение работать со средой программирования.
Результат обеих фаз создания программы необходимо подвергнуть тщательной проверке. Такая проверка осуществляется мысленным прохождением всех инструкций алгоритма. На практике ошибки и недочеты в программе обнаруживаются на самых разных стадиях создания программы и это вынуждает возвращаться назад на предыдущие этапы и начинать все заново.
Разработку программных продуктов принято делить на шесть этапов создания программы:
1.Анализ и точное определение проблемы (постановка задачи)
2.Разработка программы (разработка алгоритма)
3.Реализация алгоритма (кодирование задачи)
4.Тестирование
5.Поддержка и развитие системы
6.Старение.
4. Транслятор и компоновщик. Библиотеки языка Си
Транслятор —программа или техническое средство, выполняющее трансляцию программы. Машинная программа, которая транслирует с одного языка на другой и, в частности, с одного языка программирования на другой. Обрабатывающая программа, предназначенная для преобразования исходной программы в объектный модуль. Транслятор обычно выполняет также диагностику ошибок, формирует словари идентификаторов, выдаёт для печати тексты программы и т. д. Трансляция программы — преобразование программы, представленной на одном из языков программирования, в программу на другом языке и, в определённом смысле, равносильную первой. Язык, на котором представлена входная программа, называется исходным языком, а сама программа — исходным кодом. Выходной язык называется целевым языком или объектным кодом.
В ходе трансляции устанавливается соответствие между операндами и адресами областей памяти вычислительной машины. Так вот задача компоновщика состоит в согласовании адресов во всех фрагментах кода, из которых собирается готовая к выполнению программа. Компоновщик отвечает за то, чтобы конкретному операнду выражения соответствовала определённая область памяти. Компоновщик также добавляет к компонуемой программе коды так называемых библиотечных функций (они обеспечивают выполнение конкретных действий - вычисления, вывод информации на экран дисплея и т.д.), а также код, обеспечивающий размещение программы в памяти, её корректное начало и завершение. Преобразованная компоновщиком программа называется загрузочным или выполнимым модулем. Файлы, содержащие загрузочные модули, называют загрузочными или выполнимыми файлами.
Практически каждая система, реализующая тот или иной язык программирования (транслятор, компоновщик и прочее программное окружение) имеет набор готовых к использованию фрагментов программного кода. Этот код может находиться в разной степени готовности. Это могут быть фрагменты текстов программ, но, как правило, это объектный код, располагаемый в особых файлах. Такие файлы называются библиотечными файлами.
Для использования библиотечного кода программисту бывает достаточно указать в программе требуемый файл и обеспечить вызов соответствующих функций. Для использования библиотечного кода бывает достаточно стандартного набора языковых средств. Решение всех остальных проблем транслятор и компоновщик берут на себя. Разумеется, программисту должно быть известно о существовании подобных библиотек и о содержании библиотечных файлов.
Библотеки бывают:
Контейнеры, Общие, Поточные и ввода-вывода (тут содержиться <iostream>), Строковые, Числовые,
Языковая поддержка
8. Программный модуль
Программный модуль - программа или функционально завершенный фрагмент программы, предназначенный для: -1-хранения; -2-трансляции; -3-объединения с другими программными модулями; и -4- загрузки в оперативную память.
Различают: -стандартные модули, входящие в язык программирования; и - пользовательские модули, предназначенные для упрощения работы программистов.
Программа строится на основе программных модулей. Модуль состоит из элементов программного модуля. В модуле нет ничего, кроме инструкций препроцессора и (или) списков операторов.
Как сказано в справочном руководстве по C++, файл состоит из последовательности объявлений.
Здесь нет ничего странного: определение является частным случаем объявления (например, объявление, содержащее инициализацию).
Сложность оператора практически ничем не регламентируется, к ним, в частности, относятся объявления и определения объектов, объявления (или прототипы) и определения функций.
В свою очередь, функция состоит из заголовка, который включает спецификаторы объявления, описатели и инициализаторы и тела.
Тело функции представляет собой блок операторов - список операторов (опять!), заключаемый в фигурные скобки.
11. Стандартные скалярные типы данных в языках Си
Целые типы :
char 1
unsigned char 1
int 2
signed short 2
signed long 4
unsigned short 2
unsigned long 4
Плавающие типы:
Float 4
Double 8
long double 10
Переменная любого типа может быть объявлена как немодифицируемая. Это достигается добавлением ключевого слова const к спецификатору-типа. Объекты с типом const представляют собой данные используемые только для чтения, т.е. этой переменной не может быть присвоено новое значение. Отметим, что если после слова const отсутствует спецификатор-типа, то подразумевается спецификатор типа int. Если ключевое слово const стоит перед объявлением составных типов (массив, структура, смесь, перечисление), то это приводит к тому, что каждый элемент также должен являться немодифицируемым, т.е. значение ему может быть присвоено только один раз.