Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Системный анализ, проектирование и UML > UML с нуля


Автор: DragonFire 17.4.2009, 15:06
День добрый всем.

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

Вот и возник вопрос - а UML ли мне нужен?

Автор: deniva 17.4.2009, 16:03
Диаграмма выбрана верно. Циклы можно по разному показать.

Свою задачу опишите.

Автор: DragonFire 17.4.2009, 16:20
Вот простой пример алгоритма, который необходимо описать:
Алгоритм:
Код

Инициализация параметров
Цикл foreach - перебираем доступные логики
  Задание параметров
  Обновление статус-информации
  Цикл while
     Задание параметров
     Цикл for
        Генерация модели 1
        Получение параметра
        Проверка условия
        Генерация модели 2
        Получение параметра
        Проверка условия
      Два дополнительных условия
      Обновление статус-информации
   Вывод результатов для конкретной логики
Конец алгоритма

А так это выглядит в коде, если необходимо.
Код

            double RealErr,errH1,errH2,cA,QH;
            foreach (TakeEstimate Estimate in Estimates)
            {
                RealErr = 1; errH1 = 0; errH2 = 0; cA = 0.001; QH = 0;
                UpdateStatus("Проверка гипотиз: " + Estimate.GetTitle());
                while (Math.Abs(RealErr - Alpha) > Alpha/10)
                {
                    errH1 = 0;
                    errH2 = 0;
                    pBar.Value=0;
                    pBar.Maximum = N*N-1;
                    for (int i = 0; i < N*N; i++)
                    {                        
                        Model.Generate(H1, E, Sizet);
                        QH = Estimate.Calculate(Model);
                        if (QH - H1 > cA) errH1++;
                        Model.Generate(H2, E, Sizet);
                        QH = Estimate.Calculate(Model);
                        if (QH - H2 > cA) errH2++;
                        pBar.Increment(1);
                        Application.DoEvents();
                    }
                    if (rb1.Checked) RealErr = errH1 / (N * N);
                    if (rb2.Checked) RealErr = errH2 / (N * N);
                    UpdateStatus("Проверка гипотиз: " + Estimate.GetTitle() + " Err=" + RealErr.ToString() + "   dX=" + cA.ToString());

                    if (RealErr > Alpha)
                        cA += (Alpha) * Math.Abs(Math.Abs(RealErr - Alpha) - Alpha / 10);
                    else
                        cA -= (Alpha) * Math.Abs(Math.Abs(RealErr - Alpha) - Alpha / 10);
                }
                dataGridView1.Rows.Add(Estimate.GetTitle(), errH1 / (N * N), errH2 / (N * N));
                pBarAll.Increment(4);
                Application.DoEvents();
            }

Автор: DragonFire 18.4.2009, 17:02
Если по текущему алгоритму ответить однозначно сложно - подскажите как реализовывать простейшие циклы правильно, или хотя бы где про этом почитать...

Автор: ida 22.4.2009, 17:53
Условие прекращения цикла поставьте, и все ОК.
Графически это выглядит следующим образом:
действие
действие
действие
проверка условия (ромбик)

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

На пальцах объяснила, если непонятно, попробую показать пример.

Автор: DragonFire 23.4.2009, 15:46
ida, Более или менее понятно, спасибо ! smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)