Автор: Пользователь скрыл имя, 15 Мая 2013 в 16:47, курсовая работа
Язык Паскаль, названный в честь французского математика и философа Блеза Паскаля (1623-1662), был создан как учебный язык программирования в 1968-71 годах швейцарским ученым Никлаусом Виртом на кафедре информатики Стэнфордского университета (Цюрих). В настоящее время это язык имеет более широкую сферу применения, чем предусматривалось при его создании.
Введение 4
1 Теоретическая часть 5
1.1 Математическая постановка задачи 5
1.2 Язык программирования 5
1.3 Описание данных 20
1.4 Алгоритм решения задачи 21
1.5 Структурные схемы 23
2 Экспериментальная часть 27
2.1 Применение программы 27
2.2 Описание данных 27
2.3 Описание структуры программы 27
2.4 Руководство программиста 29
2.5 Анализ ошибок при отладке программы 29
2.6 Инструкция для использования 29
2.7 Анализ результатов решения 32
Заключение 33
Список литературы 34
Приложение. Листинг программы
Входные данные:
Выходные данные:
Константы:
usl – строковой массив с условием задачи.
menupnt – количество пунктов меню (5).
menunames – массив наименований пунктов меню.
ymenu – вертикальная координата пунктов меню.
xmenu – массив горизонтальных координат пунктов меню.
Пользовательские типы:
massiv – тип одномерный массив размерностью 15 состоящий из целых чисел.
matrica – тип двумерный массив размерностью 15´15 состоящий из целых чисел.
Глобальные переменные.
m – число строк матрицы, тип integer.
n – число столбцов матрицы, тип integer.
menu – номер режима работы с программой, тип integer.
i, j – счетчики циклов, тип integer.
a – матрица, тип matrica.
v1,v2,v3,v4 – сформированные векторы, тип massiv.
s – служебная строка.
с – символ, считанный с клавиатуры.
t – текстовый файл для вывода результата.
Подпрограммы пользователя.
Процедура initialize
Назначение: инициализация графического режима работы и формирование рабочего окна программы.
Локальные переменные:
bgiMode – номер графического режима работы экрана, тип integer.
bgiDriver – номер графического драйвера, тип integer.
i – счетчик циклов, тип integer.
Функция mainmenu(i)
Назначение: движение по меню, выбор пункта.
Входные параметры:
i – номер текущего пункта меню, тип integer.
Выходные параметры: номер выбранного пункта меню.
Локальные переменные:
ch – код нажатой клавиши, тип char.
Процедура sumrow(a, m, n)
Назначение: нахождение суммы элементов в каждой строке.
Входные параметры:
m – число строк матрицы, тип integer.
n – число столбцов матрицы, тип integer.
a – матрица, тип matrica.
Процедура выводит в файл матрицу и найденные суммы в конце каждой строки.
Локальные переменные:
sum – сумма элементов текущей строки строки, тип integer;
i, j – счетчики циклов, тип integer.
Процедура SbDivSa(v, n)
Назначение: расчет отношения суммы элементов массива, расположенных до минимального элемента в массиве, к сумме элементов, расположенных после минимального.
Входные параметры:
v – обрабатываемый вектор, тип massiv.
n – размерность вектора, тип integer.
Локальные переменные:
i – счетчик цикла, тип integer.
imin – индекс минимального элемента, тип integer.
s1 - сумма элементов вектора, расположенных до минимального элемента, тип integer.
s2 - сумма элементов, расположенных после минимального, тип integer.
otn - отношение найденных сумм, тип real.
После завершения набора текста программы необходимо записать его на диск командой Save (F2).
Отредактированную программу необходимо преобразовать в машинные коды (скомпилировать). Для компиляции программы используется комбинация клавиш Alt+F9 или команда Compile меню Compile. Если программа использует нескомпилированные модули (или модули с обновленным текстом), то компиляция осуществляется командами меню Compile: Make (F9) – с компиляцией измененных модулей или Build – с перекомпиляцией всех модулей. Компилятор выявляет синтаксические ошибки, устанавливает на неправильном операторе курсор и выдает соответствующее сообщение. После исправления ошибки необходимо снова запустить компилятор.
В результате компиляции программы образуется исполняемый файл (расширение .ЕXE) в оперативной памяти если установлена опция Memory в меню Compile, Destination или на диске (опция Disk) в каталоге, указанном в строке EXE & TPU directory меню Options, Directories.
Для запуска программы из среды программирования необходимо использовать комбинацию клавиш Ctrl – F9 или пункт Run из меню Run.
При отладке программы ошибок периода компиляции выявлено не было.
Выполняемый файл программы SMBDMA.EXE должен быть размещен в отдельном каталоге. В этом же каталоге должны находиться файлы:
Egavga.bgi – драйвер графического режима;
Trip.chr – русифицированный шрифт для графики.
Чтобы начать работать необходимо:
После загрузки программы на экран выводится окно с областью ввода – вывода и главным меню, расположенным в нижней части (рис. 4). При начальной загрузке в окне ввода – вывода расположено условие задачи.
Требуемый режим выбирается пользователем клавишами управления курсором ¬ и ®, активация – нажатие клавиши Enter.
Рассмотрим назначение и использование пунктов меню.
1) Ввод с клавиатуры. На экран будет выведено приглашение к вводу данных. Пользователю необходимо ввести два целых числа от 2 до 15 (размерность матрицы). После этого необходимо задать построчно элементы матрицы (рис. 5). Разделитель значений внутри строки – пробел. И в завершении вводится число на которое будут сдвинуты элементы вектора.
2. Загрузить из файла. Данный пункт позволяет загрузить данные из текстового файла. Пользователем вводится имя файла (рис. 6а). Файл может быть создан в любом текстовом редакторе или средствами самой программы.
а)
Если файл не существует, программа выведет сообщение об ошибке.
3. Сохранить массив. Введенную матрицу можно записать в текстовый файл и использовать в дальнейших расчетах. Для этого необходимо ввести имя файла (рис. 6б). При этом программа не проверяет существование файла с заданным именем. Если он существует, то производится перезапись данных.
4. Поиск решения. После выбора этого пункта программа произведет расчет в соответствии с постановкой задачи.
Результат будет помещен в текстовый файл с именем v4 и выведен на экран в область вывода. Решение выводится в два приема – вначале матрица и найденные минимумы, затем. после нажатия любой клавиши –сформированные векторы.
5. Выход. Завершение работы с программой.
Для проверки программы была взята произвольная матрица. Прогонка программы на компьютере дала следующий результат:
Рис. 1. Результат
В результате выполнения курсовой работы мною была разработана программа обработки заданной целочисленной матрицы и полученных векторов.
Программа позволяет:
Созданная программа позволяет производить вычисления для любых целочисленных матриц.
Программа работает в режиме диалога с пользователем. Пользователь вводит с клавиатуры необходимые исходные данные, после чего производится расчет.
Анализируя полученные результаты можно увидеть их полное совпадение с результатами ручного счета.
Также были освоены основные приемы программирования на языке Паскаль и работа в интегрированной среде по отладке и выполнению программы.
Program SummRow_MinBDivMinAft;
Uses Crt, Graph;
const
usl: array [1..6] of string[80] = (
'Дан двумерный массив размером M*N. Найти сумму элементов',
'каждой строки массива. Из первых четырех строк массива',
'сформировать четыре новых
вектора (одномерные массивы).'
'Определить отношение суммы
элементов массива,
'до минимального элемента
в массиве, к сумме элементов,'
'расположенных после
menupnt = 5;
menunames: array [1..menupnt] of string[40] =
('Ввод с клавиатуры', 'Загрузить из файла',
'Сохранить массив', 'Поиск решения', 'Выход');
ymenu=460;
xmenu:array [1..menupnt] of integer=(20,180,335,460,575);
type
massiv = array [1..15] of integer;
matrica = array [1..15] of massiv;
var
m,n,k,menu,i,j:integer;
a: matrica;
v1,v2,v3,v4:massiv;
s:string;
c:char;
t:text;
procedure initialize;
var
bgiDriver,bgiMode,i:integer;
begin
bgiDriver := VGA; bgiMode := VGAHi;
initgraph(bgiDriver, bgiMode, 'bgi');
directvideo := false;
setcolor(0);
settextjustify(0, 0);
settextstyle(1, 0, 1);
SetUserCharSize(1, 3, 1, 2);
setfillstyle(1,15);
bar3d(1, 1, getmaxx-2, getmaxy-2,0,false);
bar3d(5, 5, getmaxx-7, getmaxy-7,0,false);
setfillstyle(1,8);
bar3d(7, getmaxy-39, 450, getmaxy-9,0,false);
setfillstyle(1,1);
bar3d(455, getmaxy-39, 552, getmaxy-9,0,false);
setfillstyle(1,4);
bar3d(557, getmaxy-39, getmaxx-9, getmaxy-9,0,false);
setcolor(2);
SetUserCharSize(1, 2, 1, 1);
for i:=1 to 6 do
outtextxy(25, 40 + (i - 1) * 30, usl[i]);
SetUserCharSize(1, 3, 1, 2);
setcolor(15);
for i:=1 to menupnt do
outtextxy(xmenu[i], ymenu, menunames[i]);
rectangle(xmenu[1]-3, ymenu+7,
xmenu[1]+textwidth(menunames[
menu:=1;
end;
function mainmenu(i:integer):integer;
{движение по меню, выбор пункта}
var
ch: char;
begin
repeat
ch := Readkey; {читаем клавишу}
if ch = #0 then
ch := Readkey;
if ch in [#75, #77] then
begin
if i in [1..3] then
setcolor(8)
else
if i = 4 then
setcolor(1)
else
setcolor(4);
rectangle(xmenu[i]-3, ymenu+7,
xmenu[i]+textwidth(menunames[
case ch of {обработка}
#77: begin
i := i + 1;
if i > menupnt then i := 1;
end;
#75: begin
i := i - 1;
if i < 1 then i := menupnt;
end;
end;
setcolor(15);
rectangle(xmenu[i]-3, ymenu+7,
xmenu[i]+textwidth(menunames[
end;
until ch = #13; {пока не нажата Enter}
mainmenu:=i;
end;
procedure sumrow(a: matrica; m,n: integer);
{нахождение суммы элементов каждой строки}
var
sum,i,j: integer;
begin
writeln(t,'Исходная матрица и суммы элементов строк');
for i := 1 to M do
begin
sum := 0;
for j := 1 to N do
begin
write(t, a[i,j]:6);
sum := sum + a[i, j];
end;
writeln(t,'| Сумма=',sum);
end;
end;
procedure SbDivSa(v: massiv; n: integer);
{отношение суммы элементов
до минимального элемента в массиве, к сумме элементов,
расположенных после
var
i,imin,s1,s2: integer;
otn: real;
begin
for i := 1 to n do
write(t, v[i]:6);
writeln(t);
imin := 1;
for i := 1 to n do
if v[i] < v[imin] then
imin := i;
writeln(t,'Минимум ',v[imin],' позиция ', imin);
s1 := 0;
s2 := 0;
for i := 1 to n do
begin
if i < imin then
s1 := s1 + v[i];
if i > imin then
s2 := s2 + v[i];
end;
otn := s1 / s2;
writeln(t,'Отношение ',otn:3:2);
end;
begin
initialize;
repeat
menu:=mainmenu(menu);
case menu of
1:begin {клавиатура}
setfillstyle(1,0);
bar(7, 7, getmaxx-9, getmaxy-43);
window(2,2,79,24);
write('Задайте размерность матрицы M*N ');
readln(m,n);
writeln('Задайте матрицу построчно');
for i:=1 to m do
begin
write(i, ': ');
for j:=1 to n do
read(a[i,j]);
readln;
end;
writeln('для продолжения нажмите клавишу ...');
end;
2:begin {файл}
setfillstyle(1,0);
bar(7, 7, getmaxx-9, getmaxy-43);
window(2,2,79,24);
write('Задайте имя файла ');
readln(s);
{$I-} assign(t, s); reset(t); {$I+}
if ioresult <> 0 then
begin
writeln('Файл ' + s + ' не найден!');
continue;
end;
readln(t,m,n);
for i:=1 to m do
begin
for j:=1 to n do
read(t, a[i,j]);
readln(t);
end;
readln(t,k);
close(t);
writeln('Данные успешно считаны.');
end;
3:begin {запись}
setfillstyle(1,0);
bar(7, 7, getmaxx-9, getmaxy-43);
window(2,2,80,25);
write('Задайте имя файла ');