Автор работы: Пользователь скрыл имя, 24 Декабря 2012 в 01:41, курсовая работа
В наше время новые информационные технологии занимают очень важное место не только в специализированных, но и в повседневных сферах жизни. Компьютеры применяются в бизнесе, менеджменте, торговле, учебе и многих других сферах деятельности человека.
Компьютерные технологии очень удобны для выполнения разнообразных операций, но в разных сферах применения эти операции разные. Потому, каждая отдельная отрасль, которая использует специфические технические средства, нуждается в своих собственных программах, которые обеспечивают работу компьютеров.
Таблица 3.4 – Содержимое класса AutoThread
Имя |
Вид элемента |
Тип |
Спецификатор |
Описание |
1 |
2 |
3 |
4 |
5 |
Run |
Метод |
void |
public |
Запуск автоматического режима выполнения |
Весь исходный код программы представлен в Приложении А.
3.2 Реализация алгоритма на языке Java
/**
* @param a входной массив
* @param K – максимальное значение для элементов A
* @return отсортированный массив,
*/
private static Integer[] solve(int K, int[] a) {
// Переменные циклов
int s, i, j, m;
// Количество предметов
int N = M.length;
// Вспомогательный массив c[]
int[] c = new int[K];
// Выходной массив b[]
int[] b = new int[N];
// Заполнение нулями массива c[]
for(int s = 0; s < K; s++)
c[s] = 0;
// Заполнение массива
c[] for (j = 0; j < N; j++)
c[a[j] - 1] = c[a[j] – 1] + 1;
// Подсчет частичных сумм c[]
for(i = 1; i < K; i++)
c[i] = c[i] + c[i-1];
// Формирование выходного массива b[]
for(m = N - 1; m >= 0; m--)
{
b[c[a[m]-1] = a[m];
c[a[m] – 1] = c[a[m] – 1] – 1;
}
В этой программе операции ввода/вывода не приведены, так как их будет выполнять визуализатор.
3.3 Вычислительный эксперимент
Рисунок 3.1 – Состояние 0
Рисунок 3.2 – Состояние 1
Рисунок 3.3 – Состояние 2
Рисунок 3.4 – Состояние 3
Рисунок 3.5 – Состояние 4
Рисунок 3.6 – Состояние 6
ЗАКЛЮЧЕНИЕ
В ходе выполнения данной курсовой работы был создан визуализатор алгоритма сортировки методом подсчета в виде апплетов на языке Java, который пошагово сортирует массив натуральных чисел.
Для начала были приведены основные особенности языка программирования Java, преимущества и недостатки использования Java-апплетов, сравнение сред разработки Java и .NET. Далее производился алгоритмический анализ сортировки методом подсчета, где устанавливались постановка задачи, исходные данные к проекту, а также пошаговое описание алгоритма; после чего представляется программная реализация поставленной задачи, где можно увидеть структуру программного комплекса и вычислительный эксперимент.
Достоинством разработанной программы является её понятный интерфейс, простота в использовании и возможность наглядно, по шагам, отразить принцип работы алгоритма сортировки методом подсчета.
Разработанное приложение может использоваться
в учебных целях для большей
доступности понимания
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
ПРИЛОЖЕНИЕ А
(обязательное)
Текст программы на языке Java
Класс CountSortApplet
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.util.*;
import java.text.MessageFormat;
//Класс апплета
public class CountSortApplet extends Applet{
CSControls controls;
CSCanvas canvas;
public void init(){
setLayout(new BorderLayout());
canvas = new CSCanvas();
add("Center", canvas);
add("South", controls = new CSControls(canvas));
canvas.init();
this.setSize(600,300);
}
public void destroy() {
remove(controls);
remove(canvas);
}
public void start() {
controls.setEnabled(true);
controls.start();
}
public void stop() {
controls.setEnabled(false);
controls.stop();
}
public void processEvent(AWTEvent e) {
if (e.getID() == Event.WINDOW_DESTROY) {
System.exit(0);
}
}
public static void main(String args[]) {
}
public String getAppletInfo() {
return "Count Sort visualisation Applet.";
}
}
Класс CSCanvas
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.util.*;
import java.text.MessageFormat;
//Класс, реализующий отрисовку
class CSCanvas extends Canvas {
int N = 20;
int K = 10;
int i0, i, j, m;
int a[], b[], c[];
int vis_stage;
int astep, bstep, cstep;
int state = 0;
String comment = "";
String comment2 = "";
String comment3 = "";
public void init(){
a = new int [N];
b = new int [N];
c = new int [K];
for(int step = 0; step < N; step++)
a[step] = (int)((K-1) * Math.random())+1;
for(int step = 0; step < N; step++)
b[step] = -1;
for(int step = 0; step < K; step++)
c[step] = 0;
vis_stage = 0;
astep = -1;
bstep = -1;
cstep = -1;
comment = "Готов к работе.";
comment2 = "";
comment3 = "";
}
public void restart(){
state = 0;
this.init();
this.repaint();
}
public void randomStart(){
a = new int[N];
for(int step = 0; step < N; step++)
a[step] = (int)((K-1) * Math.random())+1;
this.restart();
}
public void paint(Graphics g) {
int xi;
int boxh, boxw, x0, y0;
String str = "";
boxw = 20; boxh = 20;
Color activeColor = new Color(255, 140, 140);
Color activeColor2 = new Color(120, 255, 120);
Color mainColor = new Color(0, 0, 0);
g.setColor(mainColor);
Font font = new Font("Times New Roman", Font.PLAIN, 14);
g.setFont(font);
// Массив A:
x0 = 80; y0 = 40;
for(xi = 0; xi < N; xi++)
{
if (xi == astep)
{
g.setColor(activeColor);
g.fillRect(x0, y0, boxw, boxh);
g.setColor(mainColor);
}
g.drawRect(x0, y0, boxw, boxh);
str = Integer.toString(a[xi]);
g.drawString(str, x0 + boxw/2 - str.length()*font.getSize()/4,
x0 += boxw;
}
g.drawString("A:", 10, y0 + boxh/2 + font.getSize()/2 - 1);
// Массив C:
x0 = 80; y0 = 100;
for(xi = 0; xi < K; xi++)
{
if (xi == cstep)
{
g.setColor(activeColor2);
g.fillRect(x0, y0, boxw, boxh);
g.setColor(mainColor);
}
if (vis_stage == 1)
if (xi == (cstep-1))
{
g.setColor(activeColor);
g.fillRect(x0, y0, boxw, boxh);
g.setColor(mainColor);
}
g.drawRect(x0, y0, boxw, boxh);
if (state > 0)
{
str = Integer.toString(c[xi]);
g.drawString(str, x0 + boxw/2 - str.length()*font.getSize()/4,
}
x0 += boxw;
}
g.drawString("C:", 10, y0 + boxh/2 + font.getSize()/2 - 1);
// Массив B:
x0 = 80; y0 = 160;
for(xi = 0; xi < N; xi++)
{
if (xi == bstep)
{
g.setColor(activeColor);
g.fillRect(x0, y0, boxw, boxh);
g.setColor(mainColor);
}
g.drawRect(x0, y0, boxw, boxh);
if (b[xi] > 0)
{
str = Integer.toString(b[xi]);
g.drawString(str, x0 + boxw/2 - str.length()*font.getSize()/4,
}
x0 += boxw;
}
g.drawString("B:", 10, y0 + boxh/2 + font.getSize()/2 - 1);
Font fontLittle = new Font("Times New Roman", Font.PLAIN, 9);
g.setFont(fontLittle);
String sNum = "";
x0 = 80; y0 = 40;
for(xi = 0; xi < N; xi++){
sNum = str.valueOf(xi + 1);
g.drawString(sNum, x0 - 1 + boxw*xi + boxw/2, y0-3);
}
x0 = 80; y0 = 100;
for(xi = 0; xi < K; xi++){
sNum = str.valueOf(xi + 1);
g.drawString(sNum, x0 - 2 + boxw*xi + boxw/2, y0-3);
}
x0 = 80; y0 = 160;
for(xi = 0; xi < N; xi++){
sNum = str.valueOf(xi + 1);
g.drawString(sNum, x0 - 3 + boxw*xi + boxw/2, y0-3);
}
g.setFont(font);
g.drawString(comment, 60, 220);
g.drawString(comment2, 60, 260);
g.drawString(comment3, 60, 280);
}
public void MakeStep() {
// Автомат
switch (state)
{
case 0:
state = 1; i0 = 0;
for (int step = 0; step < N; step++)
b[step] = -1;
for (int step = 0; step < K; step++)
c[step] = 0;
break;
case 1:
for (i0 = 0; i0 < K; i0++)
c[i0] = 0;
comment = "Заполнить нулями массив C.";
state = 2; j = 0;
break;
case 2:
if (j < N)
{
c[a[j]-1] = c[a[j]-1] + 1;
j++;
}
else
{
state = 3;
i = 1;
}
break;
case 3:
if (i < K) {c[i] = c[i] + c[i-1]; i++; }
else {state = 4; m = N - 1; }
break;
case 4:
if (m >= 0) {b[c[a[m]-1]-1] = a[m]; c[a[m]-1] = c[a[m]-1] -
1; m--; }
else {state = 5;}
break;
case 5:
break;
}
// Визуализация в состояниях автомата
switch (state)
{
case 0:
break;
case 1:
comment = "Заполнить нулями массив C.";
break;
case 2:
if (j < N)
{
astep = j;
cstep = a[j]-1;
bstep = -1;
String ss1 = Integer.toString(j+1);
String ss2 = Integer.toString(cstep+1);
comment = "В массиве C увеличить на единицу A[" + ss1+ "]-й элемент. (" + ss2 + "-й элемент).";
}
break;
case 3:
vis_stage = 1;
if (i < K)
{
astep = -1;
cstep = i;
bstep = -1;
if (i == 1)
comment = "Во " + Integer.toString(cstep+1) + "-й элемент массива С записать сумму " + Integer.toString(cstep) + "-го и " + Integer.toString(cstep+1) + "-го элементов.";
else
comment = "В " + Integer.toString(cstep+1) + "-й элемент массива С записать сумму " + Integer.toString(cstep) + "-го и " + Integer.toString(cstep+1) + "-го элементов.";
}
else
comment = "Массив С сформирован.";
break;
case 4:
vis_stage = 2;
if (m >= 0)
{
astep = m;
cstep = a[m]-1;
bstep = c[a[m]-1]-1;
String ss1 = "Значение "+ Integer.toString(astep+1) + "-го элемента A равно " + Integer.toString(a[m]) + ". ";
String ss2 = "Найти значение " + Integer.toString(a[m]) + "-го элемента C.";
comment = ss1 + ss2;
comment2 = "Искомое значение равно " + Integer.toString(bstep+1) +".";
comment3 = "Записать " + Integer.toString(astep+1) +"-й элемент А на " + Integer.toString(bstep+1) + " позицию в выходной массив B.";
}
else
{
comment = "Массив отсортирован. Работа алгоритма завершена.";
comment2 = "";
comment3 = "";
}
break;
case 5:
break;
}
repaint();
} // Makestep
}
Класс CSControls
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.util.*;
import java.text.MessageFormat;
//Класс элементов управления
class CSControls extends Panel implements ActionListener {
CSCanvas canvas;
private boolean auto = false;
private Thread autoThread = new AutoThread();
private static final int INITIAL_DELAY = 4;
private static final int[] DELAYS = new int[]{100, 200, 250, 400, 500, 1000, 2000, 2500};
//private int delay = INITIAL_DELAY;
public int delay = INITIAL_DELAY;
Button buttonNext, buttonRestart, buttonAuto, buttonStop, buttonDelayUp, buttonDelayDown;
Button buttonRandomize;
Label labelDelay;
public CSControls(CSCanvas canvas) {
this.canvas = canvas;
buttonNext = new Button(" >> ");
buttonRestart = new Button("Рестарт");
buttonAuto = new Button("Авто");
buttonStop = new Button("Стоп");
buttonDelayDown = new Button("<");
buttonDelayUp = new Button(">");
labelDelay = new Label("Задержка: 500 ");
buttonRandomize = new Button("Cлучайно");
buttonNext.addActionListener(t
buttonRestart.
buttonStop.addActionListener(t
buttonAuto.addActionListener(t
buttonDelayDown.
buttonDelayUp.
buttonRandomize.
buttonNext.setSize(50,20);
buttonStop.setEnabled(false);
add(buttonNext);
add(buttonRestart);
add(buttonRandomize);
add(buttonAuto);
add(buttonStop);
add(buttonDelayDown);
add(labelDelay);
add(buttonDelayUp);
}
public void start(){
autoThread.start();
}
public void stop(){
auto = false;
autoThread.interrupt();
}
public void actionPerformed(ActionEvent ev) {
Object source = ev.getSource();
String stLabel;
if (source == buttonNext){
canvas.MakeStep();
}
if (source == buttonAuto){
auto = true;
buttonStop.setEnabled(true);
buttonAuto.setEnabled(false);
buttonNext.setEnabled(false);
}
if (source == buttonStop){
auto = false;
buttonStop.setEnabled(false);
buttonAuto.setEnabled(true);
buttonNext.setEnabled(true);
}
if (source == buttonDelayDown){
if (delay == 7)
buttonDelayUp.setEnabled(true)
if (delay > 0)
delay--;
else
buttonDelayDown.setEnabled(fal
String str = "";
stLabel = "Задержка: " + str.valueOf(DELAYS[delay]);
labelDelay.setText(stLabel);
}
if (source == buttonDelayUp){
if (delay == 0)
buttonDelayDown.setEnabled(tru
if (delay < 7)
delay++;
else
buttonDelayUp.setEnabled(false
String str = "";
stLabel = "Задержка: " + str.valueOf(DELAYS[delay]);
labelDelay.setText(stLabel);
}
if (source == buttonRestart) {
if (canvas.state == 5){
buttonAuto.setEnabled(true);
buttonNext.setEnabled(true);
}
canvas.restart();
}
if (source == buttonRandomize) {
if (canvas.state == 5){
buttonAuto.setEnabled(true);
buttonNext.setEnabled(true);
}
canvas.randomStart();
}
}
//Нить, в случае автоматического режима через определенные
// интервалы инициирующая шаг визуализатора
Класс AutoThread
public class AutoThread extends Thread {
public AutoThread() {
super("Auto thread");
setDaemon(true);
}
public void run() {
while (true) {
if (auto) {
canvas.MakeStep();
if (canvas.state == 5) {
auto = false;
buttonStop.setEnabled(false);
buttonNext.setEnabled(false);
}
}
try {
sleep(DELAYS[delay]);
} catch (InterruptedException e) {}
}
}
}
}
ПРИЛОЖЕНИЕ Б
(обязательное)
Руководство пользователя
В верхней части визуализатора представляется следующая информация:
• значения массивов А[], B[], C[];
Информация о работе Сортировка подсчетом визуализатор на языке программирования Java