Смекни!
smekni.com

калашник Борис Борисович разработка среды поддержки сценариев для генерации графических текстов, дипломная работа (стр. 4 из 7)

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

Работоспособность программы будет зависеть от правильности введения данных. Если мы не правильно ввели зависимости действий, то в нашем графе может образоваться цикл. Тем самым программа не будет работать. В этом случае нам необходимо реализовать проверку на цикличность – и в случае цикла будем сообщать об этом. Также сделаем и со случаем, когда может не хватать каких-то файлов.

Теперь поговорим о выводе данных. Вывод данных будет зависеть от нашего запроса действий. Мы можем ввести как одно, так и несколько действий. Например, на первом рисунке запрос на действие «7», на втором на действия «7» и «8».

Вывод данных будет находиться в текстовом файле:

.

Через пустую строку будет начинаться следующее запрошенное действие.

4.3.ПРОГРАММИРОВАНИЕ СЦЕНАРИЯ ПУТЁМ ДЕМОНСТРАЦИЙ

Термин "Программирование по образцам", определяется для систем, которые позволяют программисту использовать образцы вводимой и выводимой информации в течение процесса программирования. В программировании по образцам можно выделить два основных аспекта - формирование образцов (примеров) ввода и вывода и процесс логического вывода (или угадывания) программы по этим образцам.

Программирование путём демонстраций ведётся посредством манипуляций над данными на экране, демонстрирующими вычислительной системе, что программа должна делать. Преимущества такого подхода очевидны - программисту легче выполнить нечто, чем описать это текстуально. Как пишет Сайфер - "Доводы за программирование путём демонстраций просты и неотразимы - если пользователь знает, как решить задачу на ЭВМ, то он должен быть способен создать программу для решения этой задачи. И вовсе не обязательно учить язык программирования типа Си или Бейсика. Вместо этого пользователь должен иметь возможность проинструктировать ЭВМ: "наблюдай за тем, что я делаю", и ЭВМ создаст программу, соответствующую действиям пользователя.

Несмотря на то, что наша главная задача выполнена, сделаем редактирование и создание сценария путём программирования по образцам. Как мы уже говорили, наш сценарий представлен виде графа, значит, редактировать и создавать нам нужно граф. Напишем программу на языке C# для редактирования графа по образцам. Результат программы будет файл actions.txt, который в свою очередь будет использовать наша программа сценария, соответственно он будет организован точно так же, как и описывалось ранее. Диалоговое окно программы имеет следующий вид.

При нажатии вкладки ОТКРЫТЬ, открывается и отображается граф, представленный в файле (файл должен иметь такое же строение, как и файл actions.txt). При нажатии вкладки СОХРАНИТЬ нужно, указать имя сохраняемого файла, в результате создаётся текстовый файл с описанием графа. При нажатии вкладки СОЗДАТЬ требуется ввести количество вершин графа. Рассмотрим пример создания и редактирования графа с восьмью вершинами. Вершины графа пронумерованы и расположены на окружности.

Если кликнуть на вершину, то она окраситься жёлтым цветом, это значит что вершина выделена, затем, кликнем на другую вершину, получится ребро графа, направленное из жёлтой вершину в указанную. Таким образом, мы можем легко редактировать и задавать нужную нам зависимость действий.

ЗАКЛЮЧЕНИЕ

В ходе работы была получена реализация информационной системы на примере мануала по обслуживанию персонального компьютера. Система имеет собственный сценарий, который представляет собой программу, написанную на языке программирования C#. Редактирование сценария улучшено путём программирования по образцам, что значительно повысило и упростило применение и использование данного сценария для других информационных систем.

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

Пользователь системы работает на страницах сайта.

При выборе нужного действия он получает описательную информацию.

Для получения неизвестных ему терминов, действий, пользователь может узнать об этом, развернув частично или полностью страницу.

Полностью развёрнутая страница будет выглядеть так.

ЛИТЕРАТУРА

Авербух В.Л., Байдалин А.Ю., Казанцев А.Ю., Рябинина Л.Б. Метафоры и комплексные виды отображения для систем информационной визуализации // Пробл. Теорет. и прикл. Математики: Тр.36 Регион. Мол. Конф. Екатеринбург, ИММ Уро РАН, 2005. С.314-315.

Авербух В.Л. К теории компьютерной визуализации // Вычислительные технологии Т. 10, N 4, 2005, стр 21-51.

Watch What I Do/ Programming by Demonstration. (Ed.- Allen Cypher) MIT Press. Cambridge, (Mass.), 1993.

Averbukh V.L., Bakhterev M.O., Baydalin A.Yu., Gorbashevskiy D.Yu., Ismagilov D.R., Kazantsev A.Yu., Nebogatikova P.V., Popova A.V., Vasev P.A. Searching and Analysis of Interface and Visualization Metaphors // Human – computer Interaction? New Developments. / Edited by Kikuo Asai. Chapter 3, Vienna, In-teh. ISBN 978-953-7619-15-5, pp. 49-84.

Averbukh K.L. Magic Fairy Tales as Source for Interface Metaphors // Journal of // HCI Vistas Vol. IV, UX Design / Article 9.

ПРИЛОЖЕНИЕ

Код программы сценария.

namespace Boris

{

public class Constants

{

public const string textDir = @"Files\Actions";

public const string imageDir = @"Files\Photos";

public const string videoDir = @"Files\Videos";

}

}

using System;

namespace Boris

{

public class CycleException : Exception

{}

}

using System.Collections.Generic;

namespace Boris

{

public interface IPrinter

{

void Print(IEnumerable<int> needActins);

}

}

namespace Boris

{

public interface IGraph

{

int[] GetPreviousVertexes(int num);

}

}

using System.Collections.Generic;

using System.IO;

using System.Linq;

namespace Boris

{

public class Printer : IPrinter

{

private readonly TextWriter writer;

private string[] imageFiles;

private string[] textFiles;

private string[] videoFiles;

public Printer(TextWriter writer)

{

this.writer = writer;

imageFiles = Directory.GetFiles(Constants.imageDir);

textFiles = Directory.GetFiles(Constants.textDir);

videoFiles = Directory.GetFiles(Constants.videoDir);

}

private static string[] GetFiles(IEnumerable<string> files, int num)

{

return files.Where(x => Path.GetFileNameWithoutExtension(x).Split('-')[0].Equals("" + num)).ToArray();

}

public void Print(IEnumerable<int> needActins)

{

foreach (var i in needActins)

{

writer.WriteLine("Action: " + (i + 1));

writer.WriteLine(" TextFiles: " + (GetFiles(textFiles, i + 1).Length > 0?"":"files not found"));

foreach (var i1 in GetFiles(textFiles, i + 1))

{

writer.WriteLine(" " + i1);

}

writer.WriteLine(" ImageFiles: " + (GetFiles(imageFiles, i + 1).Length > 0 ? "" : "files not found"));

foreach (var i1 in GetFiles(imageFiles, i + 1))

{

writer.WriteLine(" " + i1);

}

writer.WriteLine(" VideoFiles: " + (GetFiles(videoFiles, i + 1).Length > 0 ? "" : "files not found"));

foreach (var i1 in GetFiles(videoFiles, i + 1))

{

writer.WriteLine(" " + i1);

}

}

writer.WriteLine("");

}

}

}

using System;

using System.Collections.Generic;

using System.IO;

using System.Linq;

namespace Boris

{

public class Graph : IGraph

{

private int[][] graph;

private int n;

private List<int> order;

public Graph(TextReader reader)

{

n = Int32.Parse(reader.ReadLine());

graph = new int[n][];

for (int i = 0; i < n; ++i)

{

graph[i] = new int[n];

string[] strings = reader.ReadLine().Split(' ').Where(x => !string.IsNullOrEmpty(x)).ToArray();

var s = strings.Select(x => Int32.Parse(x) - 1).ToArray();

for (int j = 0; j < s.Length; ++j)

{

graph[i][s[j]] = 1;

}

}

order = new List<int>();

Sort();

}

private void Sort()

{

var set = new HashSet<int>();

for (int i = 0; i < n; ++i )

Sort(i, set);

Check();

}

private void Sort(int i, HashSet<int> set)

{

if (!set.Contains(i))

{

set.Add(i);

for (int j = 0; j < n; ++j )

{

if (graph[i][j] != 0 && !set.Contains(j))

Sort(j, set);

}

order.Add(i);

}

}

private void Check()

{

for (int i = 0; i < n; ++i)

{

for (int j =0; j < i; ++j)

{

if (graph[order[j]][order[i]] == 1)

throw new CycleException();

}

}

}

public int[] GetPreviousVertexes(int num)

{

int[] colors = new int[n];

Stack<int> stack = new Stack<int>();

stack.Push(num);

colors[num] = 1;

var result = new List<int>();

result.Add(num);

while (stack.Count > 0)

{

int v = stack.Pop();

for (int i = 0; i < n; ++i)

{

if (graph[v][i] == 1 && colors[i] == 0)

{

colors[i] = 1;

stack.Push(i);

result.Add(i);

}

}

}

result = result.OrderBy(x => order.IndexOf(x)).ToList();

return result.ToArray();

}

}

}

using System;

using System.IO;

namespace Boris

{

internal class Program

{

private static void Main(string[] args)

{

var reader = new StreamReader("actions.txt");

var output = new StreamWriter("out.txt");

try

{

IGraph graph = new Graph(reader);

var input = new StreamReader("in.txt");

IPrinter printer = new Printer(output);

while (!input.EndOfStream)

{

int curAct = Int32.Parse(input.ReadLine()) - 1;

printer.Print(graph.GetPreviousVertexes(curAct));

}

} catch (CycleException e)

{

output.WriteLine("Cycle was founded in input graph");

}

output.Close();

}

}

}

Код программы редактирования сценария

using System;

using System.Collections.Generic;

using System.Linq;

using System.Windows.Forms;

using ColoringGraphProblem.Views;

namespace ColoringGraphProblem

{

static class Program

{

/// <summary>

/// The main entry point for the application.

/// </summary>

[STAThread]

static void Main()

{

Application.EnableVisualStyles();

Application.SetCompatibleTextRenderingDefault(false);

Application.Run(new GraphCreatingForm());

}

}

}

using ColoringGraphProblem.Exceptions;

namespace ColoringGraphProblem

{

//Вершины нумеруются с 0

public class Graph

{

//количество вершин - брать значение можем хоть откуда; присваивать только изнутри