SoftCraft
разноликое программирование

Отправная точка
Программирование
Windows API
Автоматы
Нейроинформатика
Парадигмы
Параллелизм
Проектирование
Теория
Техника кодирования
Трансляторы
Прочие вопросы

Разное

Беллетристика
Брюзжалки
Цели и задачи
Об авторе

Сервис

Форум
Подписка на новости


Психология автоматного программирования


[ <<< | 1 | 2 | 3 | Литература | Приложение ]


© Б.П. Кузнецов

Приложение. Программа, реализующая рассматриваемый автомат

Листинг 1 Подпрограмма сличения - collation

// collation.cpp Сличение числовых массивов, завершающихся нулем.
// (Пример автоматного программирования)
// Copyright © Кузнецов Б.П. Санкт-Петербург 06.08.2000 
// boris@actor.ru
#include <stdio.h>

void insert(int s2, int c2, int *m2); // вывод на экран вставки

void collation(int *m1, int *m2) // подпрограмма сличения ==========
                                 // m1, m2 - сличаемые масивы
{ 
  static char state = 'A'; // символ состояния подпрограммы сличения
  int cycle = 1; // 0 - признак окончания цикла
  int s1, s2; // текущие номера элементов двух массивов
  int c1, c2; // запоминаемые номера элементов двух массивов

  while(cycle) // локальный цикл подпрограммы
    switch(state) // распознавание текущего состояния графа переходов
    {
    case 'A': // исходное состояние
        s1 = s2 = -1; // подготовка к счету элементов массивов
        state = 'B'; // переход к состоянию В
        break;

    case 'B': // состояние ожидания неравенства элементов массивов
                // (вставки)
        s1++; s2 ++; // переход к очередной паре элементов массивов
        if(!m2[s2] && m1[s1]) // конец второго массива
        {
          printf("\n Массив М1 надо сличать на удаление\n");
          state = 'A'; // перевод подпрограммы в исходное состояние
          cycle = 0; // обеспечение выхода из цикла
        }
        else if(m1[s1] == m2[s2] && !m1[s1]) // конец обоих массивов
        {
          state = 'A'; // перевод подпрограммы в исходное состояние
          cycle = 0; // обеспечение выхода из цикла
        }
        else if(m1[s1] != m2[s2]) // достигли очередной вставки
        { 
          c1 = s1;
          c2 = s2; // запоминаем текущие номера элементов массивов
          state = 'C'; // переход к состоянию С
        }
        else ; // элементы массивов равны и не нулевые
        // продолжаем цикл в состоянии В
        break;

    case 'C': // состояние ожидания равенства элементов после вставки
        c2++; // переход к очередной строке второго массива
        if(!m2[c2]) // конец второго массива - вставка до его конца
        {
          insert(s2, c2 - 1, m2); // печать вставки
          state = 'A'; // перевод подпрограммы в исходное состояние
          cycle = 0; // обеспечение выхода из цикла
        }
        else if(m1[c1] == m2[c2]) // конец вставки
        {
          insert(s2, c2 - 1, m2); // печать вставки
          s1 = c1;
          s2 = c2; // подготовка к продолжению сравнения массивов
          state = 'B'; // возврат к состоянию В
        }
        else ; // пока еще "продолжается" вставка 
               // продолжаем цикл в состоянии С
        break;
    }
} // collation 06.08.2000 =========================================


void insert(int s2, int c2, int *m2) // вывод на экран вставки ====
{
  int i;
  printf("\ninsert: ");
  for(i = s2; i <= c2; i++)
    printf("%d ",m2[i]);
} // insert 06.08.2000 =============================================

Листинг 2 Вызывающая программа main

// main.cpp - пробная программа сличения на вставку 05.08.2000
// Copyright © Кузнецов Б.П. Санкт-Петербург 2000
#include <stdio.h>
#include <conio.h>

void collation(int *m1, int *m2);
main() //=========================================================
{
  static int M1[] = { 1, 2, 3, 4, 5, 6, 7, 0 };
  static int M2[] = { 28, 1, 2, 3, 4, 5, 6, 7, 0 };
  static int M3[] = { 38, 39, 30, 1, 2, 3, 4, 5, 6, 7, 0 };
  static int M4[] = { 1, 2, 3, 4, 5, 6, 7, 48, 0 };
  static int M5[] = { 1, 2, 3, 4, 5, 6, 7, 58, 59, 50, 0 };
  static int M6[] = { 1, 2, 3, 68, 4, 5, 6, 7, 0 };
  static int M7[] = { 1, 2, 3, 78, 79, 70, 4, 5, 6, 7, 0 };
  static int M8[] =
      { 1, 2, 80, 81, 82, 3, 4, 5, 83, 84, 6, 7,  85, 86, 87,0 };

  printf("\n\n collation M1 & M2");
  collation(M1, M2);
  printf("\n\n collation M1 & M3"); 
  collation(M1, M3);
  printf("\n\n collation M1 & M4");
  collation(M1, M4);
  printf("\n\n collation M1 & M5");
  collation(M1, M5);
  printf("\n\n collation M1 & M6");
  collation(M1, M6);
  printf("\n\n collation M1 & M7");
  collation(M1, M7);
  printf("\n\n collation M1 & M8");
  collation(M1, M8);

  getch();

} // main 05.08.2000 =============================================

[ <<< | 1 | 2 | 3 | Литература | Приложение ]



Статьи



квартиры в санкт-петербурге




Читай о мото. kawasaki vulcan у нас.
Необходимо купить картину? Картинная галерея окажет помощь
Москва продажа Керамический кирпич стоимость цена
крепеж медный