Структура и компоненты простой программы

Содержание

Введение. 3

Лабораторная работа №1: Разработка простейших программ линейной и разветвляющейся структуры на языке С.. 4

Лабораторная работа № 2: Организация циклов типа ДЛЯ и ПОКА на языке С.. 18

Лабораторная работа № 3: Массивы. Вложение операторов цикла на языке С.. 22

Лабораторная работа №4: Функции. 27

Лабораторная работа №5: Указатели. Динамические массивы.. 31

Лабораторная работа №6: Обработка символьной информации и строк. 40

Лабораторная работа №7: Структурные типы и структуры.. 45

Лабораторная работа №8: Работа с файлами. 52

Лабораторная работа №9: Графика на языке С.. 54

Литература. 60


Введение

Одним из наиболее эффективных средств для реализации алгоритмов решения прикладных и системных задач является язык программирования высокого уровня С.

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

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

Методическое пособие включает 9 лабораторных работ, каждая из которых посвящена конкретной теме, с описанием теоретической части, практическими примерами, заданиями и вопросами для самостоятельной работы.

Методические указания ориентированы на выполнение программ в среде Borland C/C++ 3.1.


ЛАБОРАТОРНАЯ РАБОТА №1

Тема: Разработка простейших программ линейной и разветвляющейся структуры на языке С

(4 часа)

Базовые понятия языка С

Алфавит. В алфавит языка С входят:

· Прописные и строчные буквы латинского языка

· Цифры

· Специальные знаки: “ , {} | () [] + - % \ ; ‘ . : ? < > = _ ! & * # ~ ^

· Неотображаемые символы, используемые для отделения лексем друг от друга (лексема – единица текста программы, которая при компиляции воспринимается как единое целое и по смыслу не может быть разделена на более мелкие элементы).

В языке С шесть классов лексем:

1. Идентификаторы.

2. Служебные (ключевые) слова.

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

4. Строки (строковые константы).

5. Операции (знаки операций).

6. Разделители (знаки пунктуации).

Структура и компоненты простой программы

Текст программы и препроцессор.Каждая программа на языке С есть последовательность препроцессорных директив, описаний и определений глобальных объектов и функций. Препроцессорные директивы управляют преобразованием текста прог­раммы до ее компиляции. Определения вводят функции и объ­екты. Объекты необходимы для представления в программе обрабатываемых данных. Функции определяют потенциально возможные действия программы. Описания уведомляют компи­лятор о свойствах и именах тех объектов и функций, которые определены в других частях программы (например, ниже по ее тексту или в другом файле).

Определения и описания программы на языке Си могут раз­мещаться в строках текстового файла достаточно произвольно (в свободном формате.) Для препроцессорных директив существуют ограничения. Во-первых, препроцессорная директива обычно размещается в одной строке, т.е. признаком ее оконча­ния является признак конца строки текста программы. Во-вторых, символ '#', вводящий каждую директиву препроцессора, должен быть первым отличным от пробела символом в строке с препроцессорной директивой.

Исходная программа, подготовленная на языке Си в виде текстового файла, проходит три обязательных этапа обработки:

• препроцессорное преобразование текста;

• компиляция;

• компоновка (редактирование связей или сборка).

Только после успешного завершения всех перечисленных этапов формируется исполняемый машинный код программы.

Задача препроцессора – преобразование текста программы до ее компиляции. Правила препроцессорной обработки определяет программист с помощью директив препроцессора. Каждая препроцессорная директива начинается с символа '#'. В этой работе нам будет достаточно двух директив: #include и #define.

Препроцессорная директива #defineуказы­вает правила замены в тексте. Директива #includeопределяет, какие текстовые файлы нужно включить в этом месте текста программы.

Директива #include <...>предназначена для включения в текст программы текста файла из каталога заголовочных файлов, поставляемых вместе со стандартными библиотеками компилятора. Каждая библиотечная функция, определенная стандартом языка Си, имеет соответствующее описание (прототип библиотечной функции плюс определения типов, переменных, макроопределений и констант) в одном из заголовочных файлов. Список заголовочных файлов для стандартных библиотек определен стандартом языка.

Важно понимать, что употребление в программе препроцессорной директивы #include < имя заголовочного _файла > не подключает к программе соответствующую стандартную библиотеку. Препроцессорная обработка выполняется на уровне исходного текста программы. Директива #include только позволяет вставить в текст программы описания из указанного заголовочного файла. Подключение к программе кодов библиотечных функций осуществляется только на этапе редактирования связей (этап компоновки), т.е. после компиляции, когда уже получен машинный код программы. Доступ к кодам библиотечных функций нужен только на этапе компоновки. Именно поэтому компилировать программу и устранять синтаксические ошибки в ее тексте можно без стандартной библиотеки, но обязательно с заголовочными файлами.

Структура программы. После выполнения препроцессорной обработки в тексте программы не остается ни одной препроцессорной директивы. Теперь программа представляет собой набор описаний и определений. Если не рассматривать определений глобальных объектов и описаний, то программа будет набором определений функций.

Среди этих функций всегда должна присутствовать функция с фиксированным именем main.Именно эта функция является главной функцией программы, без которой программа не может быть выполнена. Имя этой главной функции для всех программ одинаково (всегда main)и не может выбираться произвольно. Таким образом, исходный текст программы в простом случае (когда программа состоит только из одной функции) имеет такой вид:

директивы препроцессора

void main( ){

определения _объектов;

исполняемые_операторы;

}

Каждая функция (в том числе и main)в языке С должна иметь набор параметров. Этот набор может быть пустым, тогда в скобках после имени функции помещается служебное слово voidлибо скобки остаются пустыми. Вслед за заголовком void main() размещается тело функции. Тело функции – это блок, последовательность определений, описаний и исполняемых операторов, заключенная в фигурные скобки. Определения и описания в блоке будем размещать до исполняемых операторов. Каждое определение, описание и каждый оператор завершается символом ';' (точка с запятой).

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

Функция форматированного вывода.Достаточно часто для вывода информации из ЭВМ в программах используется функция printf(). Она переводит данные из внутреннего кода в символьное представление и выводит полученные изображения символов результатов на экран дисплея. При этом у программиста имеется возможность форматировать данные, т.е. влиять на их представление, на экране дисплея.

Оператор вызова функции printf() можно представить так:

printf(форматная_строка, список_аргументов);

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

#include <stdio.h>

void main( ){ printf ("\n Здравствуй, МИР!\n"); }

Директива #include <stdio.h>включает в текст программы описание (прототип) библиотечной функции printf(). (Если удалить из текста программы эту препроцессорную директиву, то появятся сообщения об ошибках и исполнимый код программы не будет создан). Среди параметров функции printf() есть в этом примере только форматная строка (список аргументов отсутствует). В форматной строке два управляющих символа '\n' - "перевод строки". Между ними текст, который выводится на экран дисплея:

Здравствуй, МИР!

Первый символ '\n' обеспечивает вывод этой фразы с начала новой строки. Второй управляющий символ '\n' переведет курсор к началу следующей строки, где и начнется вывод других сообщений (не связанных с программой) на экран дисплея.

Спецификации преобразования данных предназначены для управления формой внешнего представления значений аргументов функции printf(). Обобщенный формат спецификации преобразования имеет вид:

%флажки ширина_поля. точность модификатор спецификатор

Среди элементов спецификации преобразования обязательными являются только два – символ '%' и спецификатор.

В задачах вычислительного характера используются спецификаторы:

d – для целых десятичных чисел (тип int);

u – для целых десятичных чисел без знака (тип unsigned);

f – для вещественных чисел в форме с фиксированной точкой (типы float и double);

е – для вещественных чисел в форме с плавающей точкой (с мантиссой и порядком) – для типов double и float.

В список аргументов функции printf() включают объекты, значения которых должны быть выведены из программы. Это выражения и их частные случаи – переменные и константы. Количество аргументов и их типы должны соответствовать последовательности спецификаций преобразования в форматной строке. Например, если вещественная переменная summa имеет значение 2102.3, то при таком вызове функции

printf("\n summa=%f", summa);

на экран с новой строки будет выведено: summa=2102.3

После выполнения операторов

float с, e;

int k;

с=48.3; k=-83; e=16.ЗЗ;

printf ("\nc=%f\tk=%d\te=%e", с, k, e) ;

на экране получится такая строка:

с=48.299999 k=-83 e=1.63300e+01

Здесь обратите внимание на управляющий символ '\t' (табуляция). С его помощью выводимые значения в строке результата отделены друг от друга.

Ширина_поля –- целое положительное число, определяющее длину (в позициях на экране) представления выводимого значения.

Точность – целое положительное число, определяющее количество цифр в дробной части внешнего представления вещественного числа (с фиксированной точкой) или его мантиссы (при использовании формы с плавающей точкой).

Пример с теми же переменными:

printf("\nc=%5.2\tk=%5d\te=%8.2f\te=%11.4e",c,k,e,e);

Результат на экране:

c=48.30 k= -83 e= 16.33 e= 1.6330+01

В качестве модификаторов в спецификации преобразования используются символы:

h - для вывода значений типа short int;

I - для вывода значений типа long;

L - для вывода значений типа long double.

При необходимости вывести на экран (на печать) парные кавычки или апострофы их представляют с помощью соответствующих последовательностей: \" или \’, т.е. заменяют парами литер. Обратная косая черта '\’ для однократного вывода на экран должна быть дважды включена в форматную строку.

При необходимости вывести символ % его в форматную строку включают дважды: % %.