Основные языки программирования С/С++

Автор работы: Пользователь скрыл имя, 09 Ноября 2013 в 12:54, курсовая работа

Краткое описание

В качестве написания программного обеспечения используется среда программирования Visual Studio 2012 с использованием стандартных компонентов. Для создания программных продуктов используется принцип структурно-модульного программирования. Задание курсовой работы состоит реферата по двум теоретическим вопросам с номерами 8 и 28, а также создания четырех программ, которые решают поставленные задачи с номерами 8, 28, 48 и 68.
Язык Си не связан с какими-либо определенными аппаратными средствами или системами, и на нем легко писать программы, которые можно пропускать без изменений на любой ЭВМ, имеющей Си-компилятор.

Содержание

Календарний план 2
Реферат 3
Введение 5
Теоретическое задание № 1 6
Теоретическое задание № 2 25
Описание решения для задания 1 35
Описание решения для задания 2 36
Описание решения для задания 3 38
Описание решения для задания 4 39
Вывод 41
Список использованной литературы: 42
Приложения 43
Приложение № 1 (код программы 1) 43
Приложение № 2 (код программы 2) 45
Приложение № 3 (код программы 3) 46
Приложение № 4 (код программы 4) 46

Прикрепленные файлы: 1 файл

пояснительная записка к курсовой.docx

— 248.78 Кб (Скачать документ)

При смешивании в выражении указателей разных типов явное преобразование типов требуется для всех указателей, кроме void*. Указатель может неявно преобразовываться в значение тина booд (например, в выражении условного оператора), при этом ненулевой указатель преобразуется в true, а нулевой в false.

Присваивание без явного приведения типов допускается в двух случаях:

  • указателям типа void*:
  • если тип указателей справа и слева от операции присваивания один и тот же.

Таким образом, неявное преобразование выполняется только к типу void*. Значение 0 неявно преобразуется к указателю  на любой тип. Присваивание указателей на объекты указателям на функции (и  наоборот) недопустимо. Запрещено и  присваивать значения указателям-константам, впрочем, как и константам любого типа (присваивать значения указателям на константу и переменным, на которые  ссылается указатель-константа, допускается).

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

Инкремент перемещает указатель к следующему элементу массива, декремент — к предыдущему. Фактически значение указателя изменяется на величину sizeof (тип). Если указатель на определенный тип увеличивается или уменьшается на константу, его значение изменяется на величину этой константы, умноженную на размер объекта данного типа, например:

short * р = new short [5]; 
p++; // значение р увеличивается на 2 
long * q = new long [5]; 
q++; // значение q увеличивается на 4

Разность двух указателей — это разность их значений, деленная на размер типа в байтах (в применении к массивам разность указателей, например, на третий и шестой элементы равна 3). Суммирование двух указателей не допускается.

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

*р++ = 10;

Операции разадресации и инкремента имеют одинаковый приоритет и  выполняются справа налево, но, поскольку  инкремент постфиксный, он выполняется  после выполнения операции присваивания. Таким образом, сначала по адресу, записанному в указателе р, будет записано значение 10, а затем указатель будет увеличен на количество байт, соответствующее его типу. То же самое можно записать подробнее:

*р = 10; p++;

Выражение (*р)++. напротив, инкрементирует значение, на которое ссылается указатель.

Унарная операция получения адреса & применима к величинам, имеющим  имя и размещенным в оперативной  памяти. Таким образом, нельзя получить адрес скалярного выражения, неименованной  константы или регистровой переменной. Примеры операции приводились выше.

Классы хранения данных.

Класс представляет собой главное инструментальное средство C++ для объектно-ориентированного программирования. Как вы узнаете  из данного урока, класс очень  похож на структуру, в которой  сгруппированы элементы, соответствующие  данным о некотором объекте, и  оперирующие этими данными функции (называемые методами). Вы узнаете, что  объект представляет собой некоторую  сущность, например телефон. Класс C++ позволяет  вашим программам определять все  атрибуты объекта. В случае, когда  объектом является телефон, класс может  содержать такие элементы данных, как номер и тип телефона (кнопочный  или дисковый) и функции, работающие с телефоном, например dial, answer, и hang_up. Группируя данные об объекте и кодируя их в одной переменной, вы упрощаете процесс программирования и увеличиваете возможность повторного использования своего кода. Этот урок знакомит вас с классами C++ . К концу урока вы освоите следующие основные концепции:

• Для определения класса программа должна указать имя класса, элементы данных класса и функции класса (методы).

• Определение класса обеспечивает шаблон, с помощью которого ваши программы могут создать объекты типа этого класса, подобно тому, как программы создают переменные типа int, char и т. д.

• Программа присваивает значения элементам данных класса, используя оператор точку.

• Программа вызывает функцию-элемент класса, используя оператор точку.

Класс памяти

Класс памяти определяет порядок размещения объекта в  памяти. Различают автоматический и  статический классы памяти. C++ располагает  четырьмя спецификаторами класса памяти:

auto

register

static

extern

по два для  обозначения принадлежности к автоматическому  и статическому классам памяти.

В свою очередь, статический  класс памяти может быть локальным (внутренним) или глобальным (внешним).

Следующая таблица  иллюстрирует иерархию классов памяти.

Динамический класс памяти

Статический класс памяти

Автоматический

Регистровый

Локальный

Глобальный

auto

register

static

Extern


Спецификаторы позволяют  определить класс памяти определяемого  объекта:

  • auto. Этот спецификатор автоматического класса памяти указывает на то, что объект располагается в локальной (или автоматически распределяемой) памяти. Он используется в операторах объявления в теле функций, а также внутри блоков операторов. Объекты, имена которых объявляются со спецификатором auto, размещаются в локальной памяти непосредственно перед началом выполнения функции или блока операторов. При выходе из блока или при возвращении из функции (о механизмах вызова функций и возвращения из них речь ещ╦ впереди), соответствующая область локальной памяти освобождается и все ранее размещ╦нные в ней объекты уничтожаются. Таким образом спецификатор влияет на время жизни объекта (это время локально). Спецификатор auto используется редко, поскольку все объекты, определяемые непосредственно в теле функции или в блоке операторов и так по умолчанию располагаются в локальной памяти. Вне блоков и функций этот спецификатор не используется.
  • register. Ещ╦ один спецификатор автоматического класса памяти. Применяется к объектам, по умолчанию располагаемым в локальной памяти. Представляет из себя "ненавязчивую просьбу" к транслятору (если это возможно) о размещении значений объектов, объявленных со спецификатором register в одном из доступных регистров, а не в локальной памяти. Если по какой-либо причине в момент начала выполнения кода в данном блоке операторов регистры оказываются занятыми, транслятор обеспечивает с этими объектами обращение, как с объектами класса auto. Очевидно, что в этом случае объект располагается в локальной области памяти.
  • static. Спецификатор внутреннего статического класса памяти. Применяется только(!) к именам объектов и функций. В C++ этот спецификатор имеет два значения. Первое означает, что определяемый объект располагается по фиксированному адресу. Тем самым обеспечивается существование объекта с момента его определения до конца выполнения программы. Второе значение означает локальность. Объявленный со спецификатором static локален в одном программном модуле (то есть, недоступен из других модулей многомодульной программы) или в классе (о классах - позже). Может использоваться в объявлениях вне блоков и функций. Также используется в объявлениях, расположенных в теле функций и в блоках операторов.
  • extern. Спецификатор внешнего статического класса памяти. Обеспечивает существование объекта с момента его определения до конца выполнения программы. Объект, объявленный со спецификатором extern доступен во всех модулях программы, то есть глобален.

Выбор класса памяти, помимо явных спецификаторов, зависит  от размещения определения или объявления в тексте программы. Модуль, функция, блок могут включать соответствующие операторы объявления или определения, причём всякий раз определяемый объект будет размещаться в строго определённых областях памяти.

 

 

                                                       Теоретическое задание № 2

Библиотечные  функции

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

 

1. Анализ графического  модуля “graphics.h”

 

Как было уже сказано, данный модуль используется для работы с  графикой под ОС MS-DOS. Функции, используемые в нём, для работы с графикой, да и как и сама графика, довольно примитивны. Итак, начнём.

Для инициализации модуля требуется подключить, так называемый, заголовочный файл (#include <graphics.h>). В  этом файле описаны все функции, которые требуются для написания  программы работающей с “графикой”.

 

1.1 Анализ функции  модуля

 

initgraph( &grdriver, &grmode, “path”); – функция инициализации графического режима, где &grdriver, &grmode, “path” – параметры загружаемого режима;

grdriver и grmode – переменные  типа integer;

“path” – путь к загружаемому драйверу графического режима.

Функция закрытия графического режима: closegraph(); – данная функция без каких либо параметров и закрывает текущий графический режим.

Функция определения графического драйвера и видео режима: detectgraph( &grdriver, &grmode);

Функция, возвращающая структуру  определения палитры: getdefaultpalette(); –  возвращает указатель на заданную по умолчанию структуру палитры  для текущего драйвера инициализированного по initgraph.

getdrivername(); – функция возвращает  имя текущего графического драйвера.

getgraphmode(); – функция возвращает  текущий графический режим.

getmoderange( grdriver, &low, &high); – функция возвращает диапазон режимов для данного графического драйвера, где grdriver, low, high – переменные типа integer.

graphdefaults(); – сбрасывает  текущие настройки в настройки  по умолчанию.

_graphgetmem(); – функция выделения  памяти. Эту функцию вызывают  подпрограммы в графической библиотеке, чтобы распределить память. Данную  функцию можно использовать независимо  от графической библиотеки, вызвав  её с указанием нужного объёма  памяти в байтах.

_graphfreemem(); – функция освобождения  памяти. Используется в сочетании  с _graphgetmem().

setgraphbufsize(); – функция изменяет  внутренний размер графического  буфера. Вызывается до initgraph().

graphresult(); – возвращает  код ошибки для последней неудачно  выполненной операции.

installuserdriver( int *name, int huge( *detect)); – функция устанавливает драйвер определённый программистом. *name – название нового драйвера, *detect – указатель на дополнительную функцию авто определения, которая может сопровождать новый драйвер. Эта функция (авто определения) не берёт ни каких параметров и возвращает целочисленное значение.

registerbgidriver( *grdriver) – Функция сообщает графической системе, что драйвер устройства, на который указывает *grdriver был включён во время “линковки”.

registerbgifont( *font) – Функция информирует графическую систему, что шрифт, на который указывает *font был включен во время “линковки”.

restorecrtmode() – Функция восстанавливает  режим, существовавший до активизации  графического режима функцией initgraph().

arc( int x, int y, int stangle, int endangle, int radius); – Функция рисует дугу, по заданным координатам x, y, начальным и конечным углом stangle, endangle и заданным радиусом radius.

bar( int left, int top, int right, int bottom); – Функция рисует прямоугольник начиная от левого верхнего угла с координатами left, top до правого нижнего угла с координатами right, bottom.

bar3d( int left, int top, int right, int bottom, int depth); – Функция рисует “трёхмерный прямоугольник” или, так сказать, подобие параллелепипеда, начиная от верхнего левого угла, до правого нижнего угла и с указанием глубины depth.

circle( int x, int y, int radius); – Функция рисует окружность с центром в точке с координатами ( x, y) и радиусом radius.

cleardevice(); – Функция очищает  экран в графическом режиме  и возвращает текущую позицию  указателя в точку с координатами  ( 0, 0).

clearviewport(); – Функция стирает  область просмотра и перемещает  текущую позицию в точку с  координатами ( 0, 0), относительно области просмотра.

drawpoly( int numpoints, int *polypoints); – Функция рисует полигон с количеством вершин numpoints и координатами вершин *polypoints. *polypoints является одномерным массивом.

ellipse( int x, int y, int stangle, int endangle, int xradius, int yradius); – Функция рисует эллипс с координатами в точке ( x, y), начальным и конечным углами stangle, endangle, и радиусами xradius, yradius по осям x и y.

fillpoly( int numpoints, int *polypoints); – Функция рисует и закрашивает заданным цветом полигон.

fillelipse( int x, int y, int xradius, int yradius); – Функция рисует закрашенный эллипс.

floodfill( int x, int y, int border); – Область, ограниченная цветной границей закрашивается установленным образцом и цветом.

getarccoords( &arcinfo); – Функция возвращает координаты последней точки, на которую был переведён указатель, где параметр &arcinfo объявлен как struct arccoordstype arcinfo.

getaspectratio( &xasp, &yasp); – Получает значения коэффициента сжатия в &xasp, &yasp, где xasp, yasp являются переменными типа integer.

getbkcolor() – Возвращает значение  типа integer текущего цвета фона.

getcolor() – Возвращает значение  типа integer установленного на данный  момент цвета.

getdefaultpalette() – ( дополнение) Возвращает структуру определения палитры в переменную объявленную как struct palettetype far *<имя_переменной>=(void *) 0;.

getfillpattern( char far *pattern); – Копирует определённый пользователем заполненный образец в память.

getfillsetting( &fillinfo); – Получает информацию о текущих настройках стиля и цвета, где параметр &fillinfo объявлен как struct fillsettingstype fillinfo.

getimage( int left, int top, int right, int bottom, void far *bitmap); – Сохраняет картинку в специально отведённой области памяти, где left, top, right, bottom координаты картинки, а *bitmap указатель на область памяти.

getlinesettings( &lineinfo); – Получает текущий тип линии, образец и толщину, где параметр &lineinfo объявлен как struct linesettingstype lineinfo.

getmaxcolor(); – Возвращает  значение типа integer, которое соответствует  номеру цвета.

getmaxmode(); – Возвращает  значение типа integer, которое соответствует  максимальному номеру графического  режима, для текущего драйвера.

getmaxx(); – Возвращает значение  типа integer, которое соответствует  максимальному количеству точек  по оси x для текущего графического  режима.

getmaxy(); – Возвращает значение  типа integer, которое соответствует  максимальному количеству точек  по оси y для текущего графического  режима.

getmodename( int mode_number); – Возвращает значение типа integer, которое соответствует указанному графическому режиму.

getpalette( &palette); – Получает информацию о текущей палитре, где параметр &palette объявлен как struct palettetype palette.

getpalettesize(); – Функция возвращает  значение типа integer, соответствующее  количеству цветов палитры для  текущего графического режима.

getpixel( int x, int y); – Функция возвращает номер цвета точки, находящейся по координатам ( x, y).

gettextsettings( &textinfo); – Функция возвращает текущие настройки фонта для текущего графического режима, где параметр &textinfo определён как struct textsettingstype textinfo.

getviewsettings( &viewinfo); – Получает информацию о текущей области просмотра, где параметр &viewinfo определяется как struct viewporttype viewinfo.

getx(); – Функция типа integer возвращает текущую позицию указателя  по оси x.

gety(); – Функция типа integer возвращает текущую позицию указателя  по оси y.

grapherrormsg( int errorcode); – Возвращает код ошибки в виде переменной errorcode типа intger.

imagesize( int left, int top, int right, int bottom); – Определяет размер области памяти, необходимый для сохранения двоичного образа.

installuserfont( char far *name); – Функция типа intger возвращает номер идентификатора шрифта, который можно передать функции settextstyle для выбора данного шрифта. Параметр *name это путь к файлу шрифта. Одновременно данной функцией можно подключить до двадцати шрифтов.

line( int x0, int y0, int x1, int y1); – Функция рисует линию от точки с координатами x0, y0 до точки с координатами x1, y1. Не обновляет текущую позицию.

linerel( int dx, int dy); – Функция рисует линию от текущей позиции до точки, находящейся на относительном расстоянии от текущей позиции, затем передвигает текущую позицию.

Информация о работе Основные языки программирования С/С++