1. Начальное сочетание образует последовательность 1, 2, .. m, а последнее n-m+1,…,n.
2. Переход к следующему сочетанию осуществляется по следующему правилу: требуется просмотреть текущее сочетание с конца и найти элемент, который можно увеличить. То есть такой элемент что Sochet[kol,i] <> n-m+i. Далее увеличиваем этот элемент на 1, а оставшуюся часть сочетания заполняем числами натурального ряда большими измененного элемента в порядке их следования.
Функция Summ(Chisla:Arr;Idxs:Arr2;m,nom:integer):integer
предназначена для определения суммы чисел соответствующего сочетания, где:
Chisla – масив исходных чисел, которые будут суммироваться;
Idxs – массив сгенерированных сочетаний (содержит только номера позиций);
M – количество элементов в сочетании;
NOM – номер сочетания из массива Idxs, сумму которого нужно найти.
В функции будет анализироваться строка NOM массива Idxs, точнее не вся строка, а только первые M элементов. Эти элементы задают номера чисел в массиве Chsila, которые нужно просуммировать.
Алгоритм выполнения описанных действий приведен на рисунке А.2 приложения А, а код функции приведен в строках 36-48 приложения Б.
3.3 Алгоритм основной программыАлгоритм выполнения основного тела программы и основных функций приведен на рисунке А.3 в приложении А. Так в процедуре в первую очередь осуществляется очистка экрана инициализация файловой переменной и открытие текстового файла «sochet.res» для записи результатов.
Затем производится вывод информации о задании курсовой работы на экран и в файл результатов при помощи вызова процедуры INFO.
После этого осуществляется ввод исходных данных, а именно: числа элементов последовательности N и самой последователности чисел. Ввод исходных данных организован в строках 76-85 листинга в приложении Б.
После ввода исходных данных оргиназуется цикл по m (по количеству элементов в сочетании). В теле этого цикла выполняются действия:
- генерируются все возможные сочетания по m натуральных элементов 1.. N при помощи процедуры GenerateSochet;
- организуется цикл по i, в котором перебираются все из сгенерированных на предыдущем этапе сочетания и выполняются действия:
- вывод на экран и в файл элементов сочетания (цикл по j в строках 95 99);
- вычисление суммы при помощи функции SUMM (строка 100);
- проверка полученной суммы на деление на K (остаток от деления определяется при помощи оператора MOD), (строки 103-113);
Для преобразования целого числа в строку используется процедура STR(a;var S:string), где a задает целое число, а через параметр S возвращается строковое значение.
Если сумма Sm удовлетворяет условию и искомое сочетание чисел найдено, устанавливается флаг fnd и осуществляется выход из цикла.
В конце программы анализируется значение флага fnd , и если флаг установлен в false, то значит не была найдена последовательность, удовлетворяющая условию, о чем выводится соответствующее сообщение на экран и в текстовый файл.
4. ИНСТРУКЦИЯ ОПЕРАТОРУ
Разработанная программа представляет собой исполняемый файл SOCHET.EXE размером 8096 байт. В программе выполняется обработка числовой последовательности.
После запуска программы появляется окно, изображенное на рисунке 4.1.
Рисунок 4.1 – Главное окно программы
После этого пользователь может вести длину последовательности. На рисунке 4.2 задан пример реакции программы в случае ошибочного набора.
Рисунок 4.2 – Реакция программы на ошибочный ввод количества N
После корректного ввода длины последовательности пользователь может задать саму последовательность целых чисел.
После корректного ввода программа выполняет перебор всех сочетаний. На рисунке 4.3 показан пример выполнения программы, а содержимое файла sochet.res приведен в приложении В.
Рисунок 4.3 – Результат работы программы
На рисунке 4.4 приведен пример выполнения программы, когда среди всех сочетаний не было найдено ни одного , удовлетворяющего условию задачи.
Рисунок 4.4 – Результат работы программы (поиск неудачен)
Функционирование программы полностью соответствует заданию.
ВЫВОДЫ
Данная курсовая работа была выполнена в полном соответствии поставленному заданию и отлажена в среде Turbo Pascal 7.0. В ходе выполнения курсовой работы была разработана программа для обработки числовой последовательности.
В результате выполнения данной курсовой работы, я убедилась в широких возможностях языка программирования Turbo Pascal, закрепила практические навыки программирования в cреде Turbo Pascal.
Перечень ссылок
1. Зуев Е.А. Программирование на языке Turbo Pascal 6.0,7.0. – М.: Радио и связь, Веста, 1993.
2. Фаронов В.В. Turbo Pascal 7.0. Начальный курс. - М.: Нолидж, 2000.
3. Йенсен К., Вирт Н. Паскаль. Руководство для пользователя и описание языка. — М.: «Финансы и статистика», 1982. — С. 151.
4. Вирт Н. Алгоритмы+структуры данных= программы. — М.: «Мир», 1985. — С. 406.
5. Грогоно П. Программирование на языке Паскаль. — М.: «Мир», 1982. — С. 384.
6. Перминов О. Н. Язык программирования Паскаль : Справочник. — М.: «Радио и связь», 1989. — С. 128. — ISBN 5-256-00311-9
7. Культин Н.Б. Delphi 6. Программирование на Object Pascal. — СПб.: «БХВ-Петербург», 2001. — С. 528. — ISBN 5-94157-112-7
8. Моргун А. Н. Программирование на языке Паскаль (Pascal). Основы обработки структур данных. — М.: «Диалектика», 2005. — С. 576. — ISBN 5‐8459‐0935‐X
9. Гранпер Ж., Коттэ Р. Трехмерная графика на Турбо-Паскале
10. Белецкий Я. Турбо-Паскаль с графикой для ПК.- М.: Машиностроение, 1991. - 320 с.
11. Бородич Ю.С. и др. Паскаль для ПК: Справочное пособие. - МН.: Высш. шк.: БФ ГИТМП "НИКА", 1991. - 365 с.
12. Зуев Е.А. Язык программирования Turbo Pascal 6.0. - М.: Унитех, 1992. - 298 с.
13. Фаронов В.В. Турбо-Паскаль (в 3 книгах). - М.: "МВТУ-ФЕСТО ДИДАКТИК", 1992-1993.
|
Алгоритм программы
Рисунок А.1 – Алгоритм процедуры генерации сочетаний GenerateSochet
Рисунок А.2 – Алгоритм функции определения суммы SUMM
Рисунок А.3 – Алгоритм выполнения тела программы
ПРИЛОЖЕНИЕ Б
Листинг программы
1. unit Unit1;
2. program sochet;
3. uses crt;
4. type
5. Arr = array[1..20] of integer;
6. Arr2=array[1..1000,0..20] of byte;
7. var
8. i,j,m,n,k,kol:integer;
9. Sm : integer;
10. Idx : Arr2;
11. Chisla: Arr;
12. fnd : boolean;
13. tf:TEXT;
14. S,St:string;
15. Procedure Info(var ft:TEXT);
16. begin
17. writeln('**********************************************************');
18. writeln('**** КУРСОВАЯ РАБОТА ПО ПРОГРАММИРОВАНИЮ ****');
19. writeln('** **');
20. writeln('** Задана последовательность из n чисел **');
21. writeln('** Выбрать в последовательности несколько таких чисел, **');
22. writeln('** чтобы их сумма делилась на m. **');
23. writeln('**** ****');
24. writeln('**********************************************************');
25. writeln;
26. writeln(ft,'********************************************************');
27. writeln(ft,'**** КУРСОВАЯ РАБОТА ПО ПРОГРАММИРОВАНИЮ ****');
28. writeln(ft,'** **');
29. writeln(ft,'** Задана последовательность из n чисел **');
30. writeln(ft,'** Выбрать в последовательности несколько таких чисел, **');
31. writeln(ft,'** чтобы их сумма делилась на m. **');
32. writeln(ft,'**** ****');
33. writeln(ft,'********************************************************');
34. writeln(ft,'');
35. end;
36. {процедура суммирует числа с номерами, которые заданы в строке nom массива Idxs}
37. Function Summ(Chisla:Arr;Idxs:Arr2;m,nom:integer):integer;
38. var
39. idx,i,Sm:integer;
40. begin
41. Sm:=0;
42. for i:=1 to m do
43. begin
44. idx:= Idxs[nom,i];
45. Sm:=Sm + Chisla[idx];
46. end;
47. Summ:=Sm;
48. end;
49. {процедура генерации сочетания из n по m, для чисел 1,2, ... , n}
50. Procedure GenerateSochet(var Sochet:Arr2; n,m:integer;var kol:integer);
51. var
52. ii,jj:integer;
53. begin
54. kol:=1;
55. { Генерация самого первого сочетания }
56. for ii:=0 to m do
57. Sochet[kol,ii]:=ii;
58. repeat
59. { Vivod(Sochet,nom,m);}
60. kol := kol+1;
61. for ii:=0 to m do
62. Sochet[kol,ii]:=Sochet[kol-1,ii];
63. ii:=m;
64. while (Sochet[kol,ii]=(n-m+ii))and(ii>0) do
65. ii:=ii-1; { поиск элемента для изменения }
66. Sochet[kol,ii]:=Sochet[kol,ii]+1;
67. for jj:=ii+1 to m do
68. Sochet[kol,jj]:=Sochet[kol,jj-1]+1; { изменение правой части сочетания }
69. until ii=0;
70. end;
71. begin
72. clrscr;
73. assign(tf,'sochet.res');
74. rewrite(tf);
75. INFO(tf);
76. write('Задайте количество чисел n :'); readln(n);
77. while (n<1) or (n>20) do
78. begin
79. write('Ошибочный ввод! Задайте количество чисел n (n>0;n<21):');
80. readln(n);
81. end;
82. write('Задайте числа :');
83. for i:=1 to n do
84. read(Chisla[i]);
85. write('Задайте k (на него должна делиться сумма без остатка) :'); readln(k);
86. fnd:=false;
87. for m:=1 to n do
88. begin
89. GenerateSochet(Idx,n,m,kol);
90. Writeln (' * * * Перебор сочетаний по ',M,' элементов! * * *');
91. Writeln (tf,' * * * Перебор сочетаний по ',M,' элементов! * * *');
92. for i:=1 to kol-1 do
93. begin
94. S:='';
95. for j:=1 to m do
96. begin
97. Str(Chisla[Idx[i,j]],St);
98. S := S + St + ' ';
99. end;
100. Sm := Summ(Chisla,Idx,m,i);
101. Str(Sm,St);
102. S:= S + ' Sum = '+St;
103. if (Sm mod k) = 0 then
104. begin
105. S:=S+ ' Искомая пара!';
106. writeln(S);
107. writeln(tf,S);
108. fnd := true;
109. break;
110. end else begin
111. writeln(S);
112. writeln(tf,S);
113. end;
114. end;
115. if fnd then break;
116. end;
117. if fnd then begin
118. writeln('Искомая комбинация найдена!');
119. writeln(tf,'Искомая комбинация найдена!')
120. end else begin
121. writeln('Искомая комбинация чисел НЕ найдена!');
122. writeln(tf,'Искомая комбинация чисел НЕ найдена!');
123. end;
124. Close(tf);
125. readln;
126. end.
|
Пример выполнения программы (поиск удачен)
************************************************************
**** КУРСОВАЯ РАБОТА ПО ПРОГРАММИРОВАНИЮ ****
** **
** Задана последовательность из n чисел **
** Выбрать в последовательности несколько таких чисел, **
** чтобы их сумма делилась на m. **
**** ****
************************************************************
* * * Перебор сочетаний по 1 элементов! * * *
2 Sum = 2
13 Sum = 13
27 Sum = 27
9 Sum = 9
8 Sum = 8
* * * Перебор сочетаний по 2 элементов! * * *
2 13 Sum = 15
2 27 Sum = 29
2 9 Sum = 11
2 8 Sum = 10
13 27 Sum = 40
13 9 Sum = 22
13 8 Sum = 21
27 9 Sum = 36
27 8 Sum = 35
9 8 Sum = 17
* * * Перебор сочетаний по 3 элементов! * * *
2 13 27 Sum = 42
2 13 9 Sum = 24
2 13 8 Sum = 23 Искомая пара!
Искомая комбинация найдена!
Пример выполнения программы (поиск неудачен)
************************************************************
**** КУРСОВАЯ РАБОТА ПО ПРОГРАММИРОВАНИЮ ****
** **
** Задана последовательность из n чисел **
** Выбрать в последовательности несколько таких чисел, **
** чтобы их сумма делилась на m. **
**** ****
************************************************************
* * * Перебор сочетаний по 1 элементов! * * *
8 Sum = 8
9 Sum = 9
21 Sum = 21
5 Sum = 5
* * * Перебор сочетаний по 2 элементов! * * *
8 9 Sum = 17
8 21 Sum = 29
8 5 Sum = 13
9 21 Sum = 30
9 5 Sum = 14
21 5 Sum = 26
* * * Перебор сочетаний по 3 элементов! * * *
8 9 21 Sum = 38
8 9 5 Sum = 22
8 21 5 Sum = 34
9 21 5 Sum = 35
* * * Перебор сочетаний по 4 элементов! * * *
8 9 21 5 Sum = 43
Искомая комбинация чисел НЕ найдена!
... это особые объекты – бегунки. Нижние бегунки – правый и левый – отвечают за отступ основного текста от границ страницы, а верхний бегунок – за абзацный отступ. - 10 - 4. Текстовый процессор Microsoft Word. Microsoft Word – основа любого офиса и, пожалуй, самая нужная и популярная программа во всем Microsoft Office. Эта программа ...
... комплекс, предназначенный для обучения пользователей, который осуществляет передачу знаний пользователям в зависимости от степени их подготовки и способности усваивать полученную информацию. Концепция электронного документа Для эффективного управления процессами на предприятиях и в организациях необходима эффективная система электронного документооборота. Документы являются основным ...
... . Переключателем между режимами вставки и замены служит клавиша Ins. При вставке все последующие символы сдвигаются вправо. При замене текущий символ исчезает. Документы, создаваемые в редакторе MS-DOS Editor, можно сохранять в текстовых файлах, для этого следует пользоваться меню File Save. Меню File Save As... позволит сохранить файл под другим именем. Для очистки редактора и начала работы ...
... экране и требует сдвига (прокрутки) вверх-вниз или влево-вправо. В нижней части Главного окна Word 2003 находится строка состояния, на которую выводится информация о положении текстового курсора в документе и о текущем режиме работы [3, С. 5-6]. Создание оглавления, сносок и колонтитулов Оглавление представляет собой список заголовков документа. Оно используется для просмотра тем, обсуждаемых в ...
0 комментариев