ОП_Лабораторная работа №1. Изучение базовых понятий программирования и технологии создания программ. Программирование ветвящихся
Скачать 278.73 Kb.
|
Лабораторная работа №1 Тема: Изучение базовых понятий программирования и технологии создания программ. Программирование ветвящихся. Цель работы: Освоение построения алгоритмов линейной структуры и простейшего диалогового интерфейса. Изучение логических операторов и операторов отношения, а также операторов ветвления и выбора. Получение навыков построения ветвящихся алгоритмов. Лабораторное задание Изучить теоретическую часть лабораторной работы : этапы трансляции программы структура программы на языке Си. директивы препроцессора #include и #define встроенные типы данных; операторы ветвления: условный оператор if, оператор выбора swich изучить функции ввода-вывода библиотеки stdio: printf и scanf Разобрать примеры программирования и выполнить их на компьютере. Выполнить задания (номер варианта соответствует номеру компьютера). Разработать и записать алгоритмы решения Написать программы, реализующие разработанные алгоритмы, используя, операторы ввода-вывода данных, присваивания, if, switch Теоретическая часть Действие – основное понятие программирования, оно должно приводить к желаемому результату. Действие всегда совершается над неким объектом (данными), в результате чего объект меняет свое состояние. В языках программирования описание действия называется инструкцией, а последовательность инструкций называется программой. Алгоритм – это конечная последовательность точно определенных элементарных действий для решения поставленной задачи при всех допустимых вариантах исходных условий задачи. Алгоритм, программа и данные - все три понятия тесно связаны между собой и играют в программировании важнейшую роль, упрощенно эту связь можно представить следующим образом : Программа = Алгоритм + Данные Алгоритм решения задачи В основе решения любой задачи лежит построение алгоритма. Разработка алгоритма для компьютера включает в себя выделение этапов обработки данных и представления их в определенной форме, например в виде блок-схемы алгоритма. Блок-схема - это графическое представление алгоритма программы с использованием стандартных графических элементов (прямоугольников, ромбов, трапеций и др.), обозначающих команды, действия, данные и т. п. Итак, для построения алгоритма этапы обработки данных необходимо представить в виде графических элементов (геометрических фигур или блоков) и соединить их линиями передачи управления. В блоках следует записывать последовательность действий. Разработка алгоритма – один из важнейших этапов решения задачи, помогающий с одной стороны лучше понять поставленную задачу и с другой стороны наметить пути её решения. Стандартные формы геометрических фигур, используемых в блок-схемах, приведены на рис 1 Рис. 1 Элементы блок-схемы Этапы трансляции программы. Превращение текста на языке высокого уровня в машинный код проходит в несколько этапов: На первом этапе происходит препроцессорная обработка текста. На втором этапе создается промежуточный (объектный) файл. На третьем этапе несколько объектных файлов компонуются в единый исполняемый файл, который может быть загружен в память компьютера и выполнен. Библиотечные файлы хранятся в объектном виде и присоединяются к программе пользователя на этапе компоновки. Ход трансляции приведен на рис. 2 Рис. 2. Этапы трансляции текста программы. После того, как программа оттранслирована, её можно выполнить, для чего используется специальная программа, называемая загрузчиком. Препроцессор языка Си Для того, чтобы исполнить программу на компьютере её нужно разместить в его памяти, но единственный язык, напрямую выполняемый процессором компьютера — это машинный код. Перевод исходного текста на языке высокого уровня, написанного программистом (текст программы), в машинный код выполняют специальные программы, называемые трансляторами или компиляторами, а процесс превращения исходного текста программы в машинные коды называется компиляцией. Препроцессор - это составная часть компилятора языка С, реализующая изменение текста программы перед компиляцией. В рамках данной лабораторной работы рассмотрим две важные возможности препроцессора: включение файлов в текст программы (директива #include); изменение текста программы с помощью макроподстановок (директива #define). Для того, чтобы обратиться к препроцессору, необходимо включить в текст программы специальные команды, или директивы препроцессора, начинающиеся со знака #. После директив препроцессора точка с запятой не ставятся. Директива #include #include – директива включения файла в исходный текст программы. Имеется две её формы: #include "имя файла" #include <имя файла> Если имя файла указано в кавычках, то поиск файла осуществляется в соответствии с заданным маршрутом, а при его отсутствии в текущем каталоге, то есть в том же каталоге, что и текст программы. Если имя файла задано в угловых скобках, то поиск файла производится в стандартных директориях операционной системы, задаваемых командой PATH (например, в каталоге файлов включений, прописанном в среде программирования). Директива #include широко используется для включения в программу так называемых заголовочных файлов, содержащих прототипы библиотечных функций, и поэтому большинство программ на С начинаются с этой директивы. Например #include Директива # define. #define служит для замены часто использующихся констант, ключевых слов, операторов или выражений некоторыми идентификаторами. Например, идентификаторы, заменяющие текстовые или числовые константы, называются именованными константами и могут быть заданы с помощью директивы #define. Формат директивы: #define идентификатор текст Эта директива заменяет все вхождения идентификатора на «текст». Текст может представлять собой любой фрагмент программы на С, а также может и отсутствовать. В последнем случае все экземпляры идентификатора удаляются из программы. Проводя аналогию с текстовым редактором, действия директивы #define аналогичны «поиску с заменой». Пример: #define QU 40 #define WEWQ (QU+15) Эти директивы изменят в тексте программы каждое слово QU на число 40, а каждое слово WEWQ на выражение (40+15) вместе с окружающими его скобками. При выполнении данной директивы препроцессора исключение составляют текстовые константы, заключенные в двойные кавычки, внутри которых подстановки не производятся. Например, внутри строки "В данной строке QU записано один раз" слово QU изменяться не будет. Структура программы на языке Си Любая программа на языке Си состоит из одной или более функций. Одна из этих функций (главная) должна иметь имя main() Отличительным признаком функции служат круглые скобки, а аргумент может и отсутствовать. Тело функции заключено в фигурные скобки и представляет собой набор операторов, каждый из которых оканчивается символом "точка с запятой". При запуске программы пользователя, операционная система передает управление на функцию main() и тем самым начинается выполнение программы. От других функций существующих в программе функция main() отличается тем, что её нельзя вызвать изнутри программы, а ее параметры, если они есть, задаются операционной системой. Обычно, хотя это и не обязательно, main() бывает первой функцией программы. Область директив препроцессора находится перед функцией main() Пример : /* Простейшая программа, выводящая приветствие на экран дисплея */ #include void main() { printf("Hello, world\n"); } Разбор программы : Первая строка : /* Простейшая программа, выводящая приветствие на экран дисплея */ является комментарием, который в данном случае кратко объясняет, что делает программа. Все символы, помещенные между /* и */, игнорируются компилятором, и этим можно свободно пользоваться, чтобы сделать программу более понятной. Инструкция printf("Hello, world\n");- это вызов функции printf, которая выполняет печать своего первого аргумента - текстовой строки. Функция printf находится в стандартной библиотеке stdio.h Результатом работы программа явится сообщение : Hello, world Рассмотрим подробнее функцию printf(), ей можно передать любое количество параметров, причем первый параметр обязательно должен быть текстовой строкой, описывающей формат вывода. При вызове функция печатает строку, стоящую первой. Если в этой строке встречаются специальные комбинации символов, начинающиеся с символа % , функция подставляет вместо них значения последующих параметров. Приведем наиболее часто используемые комбинации: %s - печать текстовой строки %c - печать отдельного символа %d, %i - печать целого числа %f, %e, %l - печать вещественного (дробного) числа Например, запишем инструкцию, которая выводит в одной строке значения переменных a, b и с целого типа (int), в качестве разделителя между переменными будем использовать знак «:» printf(" %d:%d:%d",a,c,b); Этот оператор имеет 4 параметра, разделенных запятыми. Первый параметр – это текстовая строка, определяющая формат (форму) и типы данных, выводимых на экран. Второй, третий и четвертый параметры – это имена переменных, выводимых на экран. Если значения переменных a,b и c соответственно равны 5,10,25, то результат на экране дисплея выглядит следующим образом: 5:25:10 Функция printf() позволяет не только выводить любые данные (как числовые, так и текстовые), но и форматировать их, например, снабжать числовую информацию текстовыми комментариями, переводить строки, делать отступы и тому подобное. Например, предыдущий пример можно отформатировать следующим образом: printf("\na= %d:\tb= %d:\tc= %d\n",a,b,c); Результат на экране дисплея выглядит следующим образом: a=5: b=10: c=25 Функция printf() «перевела строку» (символ \n), перед выводом числа поставила комментарий «а=», после каждого числа вывела знак «табуляции» (символ \t). Пассивная часть программы - данные : переменные и константы. Любой программе необходимо работать с данными, с объектами, которые несут в себе информацию. Некоторые данные устанавливаются равными определенным значениям еще до того, как программа начинает выполняться, а после ее запуска сохраняются неизменными на всем протяжении работы программ. Такие данные называются константами. Данные, которые могут изменяться, или же им могут быть присвоены значения во время выполнения программы, называются переменными. Различие между переменной и константой очевидно: во время выполнения программы значение переменной может быть изменено, значение же константы неизменно. Кроме различия между переменными и константами существует различие между типами данных. Тип данных определяет множество значений объекта программы плюс множество операций, которые можно выполнять над этими объектами. Проверка выполнения требований, накладываемых типом, осуществляется на этапе компиляции. Например, ошибочное присваивание числовой переменной логического значения можно выявить без выполнения программы. Другой пример: операция сложения определена для вещественных и целых типов, но не определена для логического типа. В языке Си предусмотрено использование основных (встроенных) типов данных, для этой цели используется семь ключевых слов: int , long, short, double, double, char, bool и два модификатора: signed (со знаком), unsigned (без знака) Классификация типов данных представлена на рис. 3 Рис. 3 Встроенные типы данных. Классификация. При объявлении переменной задается тип данных, который определяет объем выделяемой памяти и допустимые операции. На рис 4 представлена информация о диапазоне значений и размере занимаемой памяти для встроенных типов данных.
Рис 4 Встроенные типы данных. Размещение в памяти. Обратите внимание на отличие типов short и unsignedshort - данные занимают одинаковую область памяти, но имеют различные диапазоны значений. О языке Си говорят, что он строго типизирован. Программист должен описать данные, явно указывая их типы. Объявляя переменную, следует задать ее тип, при этом происходит выделение необходимого объема памяти (говорят, что переменная размещается в памяти). Например : double var; // переменная var - вещественного типа int rez ; // переменная rez - целого типа Язык Си позволяет одновременное объявление переменной и присваивание ей начального значения, в этом случае говорят, что переменная инициализирована. При инициализации происходит одновременное выделение памяти и присваивание ей начального значения, в нашем примере запись нуля в память, выделенную для переменной r целого типа. Пример : int r = 0; // переменная r инициализирована, double s; // переменная s- только объявлена (выделена память) Для константы тип можно задать как явно, указав его при описании, так и неявно. Явное описание констант: const int B=10 ; //целая константа const double C=10 ; // вещественная константа (10.0) Неявное задание основано на том, что компилятор может распознать тип константы по её внешнему виду, например, наличие десятичной точки говорит о том, что константа вещественная (дробное число), а её отсутствие указывает на то, что константа целая. Например : 3. // вещественная константа 3 // целая константа. Добавление после константы знака L (или l) заставляет компилятор выделять под переменную двойной размер памяти, например: // определение константы двойной точности 3.141 592 653 589 793 2L // определение константы обычной точности 3.141 592 Активная часть программы. Выражения. С точки зрения языка программирования выражение состоит из операндов (переменных, констант, функций), соединенных знаками операций. Знак операции - это символ или группа символов, сообщающих компилятору о необходимости выполнения арифметических, логических или других действий. Например: a+b, a*10, a / sin(x) a, b,10, sin(x) - операнды + * / - операции Операции выполняются в строгой последовательности, определяемой их приоритетом, но порядок выполнения операций может быть изменен с помощью круглых скобок. Все операции делятся на три группы: арифметические, логические и операции отношения. операции с битами. Арифметические операции Унарные арифметические операции (операции с одним операндом) : ++ инкремент (увеличение) -- декремент (уменьшение) - изменение знака операнда Бинарные арифметические операции (операции с двумя операндами): |