Алгоритм, описывающий табл. 1., представлен в приложении 3.
Блок 2 описывает ввод данных:
· n – разрядность МКП;
· k – количество отбрасываемых разрядов.
В блоке 3,4 и 5 представлены ключевые данные:
· d1 = первое значение в таблице 1, которое соответствует разрядности МКП;
· d2 = 4*n – k + 5 – номер выхода первого сумматора по модулю три в схеме.
· d3 = n/2+3 – количество столбцов в таблице 1.
· L = n – k – Количество разрядов в усеченном результате.
· as1 = (n/4 +n % 2) – Количество сумматоров в первом ряду.
· as2 = as1 + L – Количество сумматоров во втором ряду.
· as3 = (as2+as2% 2) /2 – Количество сумматоров в третьем ряду.
· as4 = (as3+as3% 2) /2 – Количество сумматоров в четвертом ряду.
Блоки 10,6 определяет данные последнего столбца элементоа первого ряда табл. 1.
В блоках 7 – 9 задан цикл по столбцам, начиная со второго и заканчивая последним столбцом. В цикле определяют данные последних двух строк таблицы. Номер выхода в строке увеличивается на 2 для каждого последующего столбца.
В блоках 11 – 15 заданы циклы по строкам 1: 4 и по столбцам 1: as1. В цикле определяются входы сумматоров по модулю три, определяющих вычисляемые контрольные коды.
Блок 16,17 определяет данные первого столбца элементоа первого ряда табл. 1.
Блок 18,19,23 – подпрограмма заполняющая массив х. В подпрограмму передаем следующие параметры imin, imax, iinc, jmin, jmax, jinc,
В блоке 20–22, задаются номера входов разрядов контрольного кода КА16 {1,2}, а также номер выхода первого в таблице сумматора по модулю три, который подается на вход следующего сумматора.
В блоке 27–29, задаются номера входов разрядов контрольного кода КА12 {1,2}, а также номер выхода первого в таблице сумматора по модулю три, который подается на вход следующего сумматора.
В блоке 24–26, заполним столбцы таблицы, первый столбец в четвертом ряду
В блоке 30, задаются номера входов разрядов контрольного кода КА32 {1,2}, а также номер выхода первого в таблице сумматора по модулю три, который подается на вход следующего сумматора.
Блок 31 вычитаем из свернутого операнда А его ККА, получаем признак корректности результата.
В блоке 32 производится вывод данных.
Алгоритм, описывающий табл. 2., представлен в приложении 3.
Блок 2 описывает ввод данных:
· n – разрядность МКП;
· k – количество отбрасываемых разрядов.
В блоке 3 представлены ключевые данные:
· d1 = (n-k)* 2 – первое значение в таблице 1;
· d2 = 8*n – 5*k -3 – номер выхода первого сумматора в таблице. 2.
· d3 = n – k – 3 – количество столбцов в таблице 2.
· as1 = n/4–2 – Количество сумматоров в первом ряду.
· Tail, head – переменые(указатели) хранят номер опорного и «заполняемого» элемента
Блоки 56,62 определяют данные первого столбца таблицы 2.
В блоках 63 – 65 задан цикл по столбцам, начиная со второго и заканчивая последним столбцом. В цикле определяют данные последних двух строк таблицы, а также первых двух строк. Номер выхода в строке увеличивается на 2 для каждого последующего столбца.
В блоках 57 – 61 заданы циклы по строкам 1: 4 и по столбцам 1: as1. В цикле определяются входы сумматоров по модулю три, определяющих вычисляемые контрольные коды.
В блоках 66 – 68 заполняются первый два столбца таблицы.
Заполнением данными столбцы 9,11,13,15,17; 10,12,14,16.
Установим указатели tail и head, на опорный элемент, тот элемент откуда берутся данные, и тот, который заполняется.
В блоках 72 – 76 заполним данными 10,12,14,16 элементы. Инициализируем tail, head, затем вызываем подпрограмму, увеличиваем tail, head. В цикле определяются входы сумматоров по модулю три, определяющих вычисляемые контрольные коды. Определим КВ22, КВ24, КВ26, КВ28, КВ30.
В блоках 77 – 85 заполним 11,13,15,17 данными элементы. В цикле вызываем подпрограмму, увеличиваем tail, head. Определим КВ4, КВ8, КВ12, КВ16.
В блоке 86–88, задаются номера входов разрядов контрольного кода КВ32 {1,2}, а также номер выхода первого в таблице сумматора по модулю три, который подается на вход следующего сумматора.
Блок 89–91 вычитаем из свернутого операнда А его ККА, получаем признак корректности результата
В блоке 92 производится вывод данных.
7. Листинг программы, реализующей алгоритмы
1) Текст программы, реализующей описание схемы блока контроля БКА.БКв
void __fastcall TForm1: Button1Click (TObject *Sender)
{
int d3b, d3a;
n = StrToInt (Edit1->Text);
k = StrToInt (Edit2->Text);
d3a = n/2 + 3;
d3b = (n – n % 2)/2;
StringGrid1->ColCount = d3a;
StringGrid2->ColCount = d3b;
for (int i=1; i<StringGrid1->ColCount; i++)
StringGrid1->Cells[i] [0]=i;
for (int i=1; i<StringGrid2->ColCount; i++)
StringGrid2->Cells[i] [0]=i;
String stroca1 [7]={«», «Âõ1», «Âõ2», «Âõ3», «Âõ4», «Âûõ1», «Âûõ2»};
for (int i=0; i<=7; i++)
{
StringGrid1->Cells[0] [i]=stroca1 [i].c_str();
StringGrid2->Cells[0] [i]=stroca1 [i].c_str();
}
StrGr1 ();
StrGr2 ();
}
// –
void __fastcall TForm1: Cycle (TStringGrid *tab, int imin, int imax, int iinc, int jmin, int jmax, int jinc)
{
for (int i=imin; i<imax; i=i+iinc) {
for (int j = jmin; j<jmax; j=j+jinc) {
if (n % 2 == 1) {
tab->Cells[i] [1] = tab->Cells [j-1] [6];
tab->Cells[i] [2] = tab->Cells [j-1] [5];
tab->Cells[i] [3] = tab->Cells[j] [6];
tab->Cells[i] [4] = tab->Cells[j] [5];
}
else {
tab->Cells[i] [1] = tab->Cells [j-1] [5];
tab->Cells[i] [2] = tab->Cells [j-1] [6];
tab->Cells[i] [3] = tab->Cells[j] [5];
tab->Cells[i] [4] = tab->Cells[j] [6];
}
}}}
// –
void __fastcall TForm1:IF1 (TStringGrid *tab, int head, int tail, int m)
{
if (n % 2 == 1) {
StringGrid1->Cells[head] [1] = StringGrid1->Cells[tail] [5];
StringGrid1->Cells[head] [2] = StringGrid1->Cells[tail] [6];
StringGrid1->Cells[head] [3] = StringGrid1->Cells[m] [5];
StringGrid1->Cells[head] [4] = StringGrid1->Cells[m] [6];
}
else
{
StringGrid1->Cells[head] [1] = StringGrid1->Cells[tail] [6];
StringGrid1->Cells[head] [2] = StringGrid1->Cells[tail] [5];
StringGrid1->Cells[head] [3] = StringGrid1->Cells[m] [6];
StringGrid1->Cells[head] [4] = StringGrid1->Cells[m] [5];
}}
// –
void __fastcall TForm1:IF2 (TStringGrid *tab, int head, int tail, int m, int m1)
{
if (n % 2 == 1) {
StringGrid1->Cells[head] [1] = StringGrid1->Cells[tail] [5];
StringGrid1->Cells[head] [2] = StringGrid1->Cells[tail] [6];
StringGrid1->Cells[head] [3] = StringGrid1->Cells[m] [5];
StringGrid1->Cells[head] [4] = StringGrid1->Cells[m] [6];
}
else
{
StringGrid1->Cells[head] [1] = StringGrid1->Cells[tail] [6];
StringGrid1->Cells[head] [2] = StringGrid1->Cells[tail] [5];
StringGrid1->Cells[head] [3] = m;
StringGrid1->Cells[head] [4] = m1;
}}
// –
void __fastcall TForm1: StrGr1 ()
{
int L, as1, as2, as3, as4, as5, d2a;
as1 = n/4 + n % 2;
as2 = as1 + L;
as3 = as2/2 + as2% 2;
as4 = as3/2 + as3% 2;
d2a = 4*n-k +5;
L = n-k;
StringGrid1->Cells[1] [5] = d2a;
StringGrid1->Cells[1] [6] = d2a+1;
for (int i=2; i<StringGrid1->ColCount; i++) {
StringGrid1->Cells[i] [5] = StringGrid1->Cells [i-1] [5]+2;
StringGrid1->Cells[i] [6] = StringGrid1->Cells[i] [6]+2;
}
StringGrid1->Cells[as1] [1] = n – 3;
StringGrid1->Cells[as1] [2] = n – 2;
StringGrid1->Cells[as1] [3] = n – 1;
StringGrid1->Cells[as1] [4] = n;
for (int i=(as1–1); i>=0; i–)
for (int j=4; j<=0; j–)
StringGrid1->Cells[i] [j] = StringGrid1->Cells [i+1] [j] – 4;
if (n % 2 == 1) {
StringGrid1->Cells[1] [1] = 0;
StringGrid1->Cells[1] [2] = 0;
StringGrid1->Cells[1] [3] = 0;
StringGrid1->Cells[1] [4] = 1;
}
Cycle (StringGrid1, as2, (as2-L/2), – 1, as1,0, – 2);
Cycle (StringGrid1, as3, (as3-L/4), – 1, as2,0, – 2);
Cycle (StringGrid1, (as1+1), (as2-L/2–1), 1,0,4,2);
IF1 (StringGrid1, as3+1, as2+1, as2+2);
IF1 (StringGrid1, as5, as3+1, as3+2);
IF2 (StringGrid1, as5+1, as5, n+2, n+1);
}
// –
void __fastcall TForm1: StrGr2 ()
{
int d2b, d1, d3, bs1, tail, head, m, m1;
d2b = 8*n-5*k-3;
d1 = (n-k)*2;
d3 = n-k-3;
bs1= n/4–2;
StringGrid2->Cells[1] [5] = d2b;
StringGrid2->Cells[1] [6] = d2b+1;
for (int i=2; i<StringGrid2->ColCount; i++) {
StringGrid2->Cells[i] [5] = StringGrid2->Cells [i-1] [5]+2;
StringGrid2->Cells[i] [6] = StringGrid2->Cells[i] [6]+2;
}
StringGrid2->Cells[bs1] [1] = n – 3;
StringGrid2->Cells[bs1] [2] = n – 2;
StringGrid2->Cells[bs1] [3] = n – 1;
StringGrid2->Cells[bs1] [4] = n;
for (int i=(bs1–1); i>d2b; i–)
for (int j=0; j<4; j++)
StringGrid2->Cells[i] [j] = StringGrid2->Cells [i+1] [j] – 4;
IF1 (StringGrid2, d1+2, d1, d3–2);
tail+=2;
head+=2;
IF1 (StringGrid2, d1+2, d1, d3–2);
if (n % 2 == 1) {
StringGrid2->Cells [head+2] [1] = StringGrid2->Cells[head] [6];
StringGrid2->Cells [head+2] [2] = StringGrid2->Cells[head] [5];
StringGrid2->Cells [head+2] [3] = StringGrid2->Cells [d3+1] [6];
StringGrid2->Cells [head+2] [4] = StringGrid2->Cells [d3+1] [5];
}
tail= d3;
m= 4*(k-1);
head = bs1+2;
for (int i=1; i<n-k; i++)
{
IF2 (StringGrid2, head, tail, m, m-1);
tail+=2;
head+=2;
}
IF1 (StringGrid2, head, d1, d1+1);
IF1 (StringGrid2, head, tail, n/4–2);
IF2 (StringGrid2, head, tail, 2*n+4,2*n+3);
}
8. Результаты работы программы
В программе была задана разрядность n = 36 и количество отбрасываемых разрядов k = 31. Разбиение МКП представлено на рис. 2.
Блоки контроля БКА и БКБ представлены в приложении 4.
Описание схемы блока контроля БКА приведено в табл. 4.
Таблица 4
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |
Вх1 | 1 | 5 | 9 | 13 | 17 | 21 | 25 | 29 | 33 | 118 | 122 | 126 | 128 | 132 | 136 |
Вх2 | 2 | 6 | 10 | 14 | 18 | 22 | 26 | 30 | 34 | 119 | 123 | 127 | 129 | 133 | 137 |
Вх1 | 3 | 7 | 11 | 15 | 19 | 23 | 27 | 31 | 35 | 120 | 124 | 0 | 130 | 134 | 138 |
Вх2 | 4 | 8 | 12 | 16 | 20 | 24 | 28 | 32 | 36 | 121 | 125 | 0 | 131 | 135 | 139 |
Вых1 | 118 | 120 | 122 | 124 | 126 | 128 | 130 | 132 | 134 | 136 | 138 | 140 | 142 | 144 | 146 |
Вых2 | 119 | 121 | 123 | 125 | 127 | 129 | 131 | 133 | 135 | 137 | 139 | 141 | 143 | 145 | 147 |
Таблица 4 продолжение
16 | 17 | 18 | 19 | 20 | 21 | |
Вх1 | 140 | 142 | 146 | 150 | 152 | 38 |
Вх2 | 141 | 143 | 147 | 151 | 153 | 37 |
Вх1 | 0 | 144 | 148 | 0 | 154 | 157 |
Вх2 | 0 | 145 | 149 | 0 | 155 | 158 |
Вых1 | 148 | 150 | 152 | 153 | 156 | 159 |
Вых2 | 149 | 151 | 153 | 154 | 157 | 160 |
Описание схемы блока контроля БКБ приведено в табл. 5.
Таблица 5
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |
Вх1 | 39 | 43 | 55 | 59 | 63 | 67 | 71 | 161 | 165 | 171 | 177 | 169 | 177 | 167 | 185 |
Вх2 | 40 | 44 | 56 | 60 | 64 | 68 | 72 | 162 | 166 | 172 | 178 | 170 | 178 | 168 | 186 |
Вх1 | 41 | 0 | 57 | 61 | 65 | 69 | 73 | 163 | 53 | 173 | 51 | 179 | 49 | 183 | 47 |
Вх2 | 42 | 0 | 58 | 62 | 66 | 70 | 74 | 164 | 54 | 174 | 52 | 180 | 50 | 184 | 48 |
Вых1 | 161 | 163 | 165 | 167 | 169 | 171 | 173 | 175 | 177 | 179 | 181 | 183 | 185 | 187 | 189 |
Вых2 | 162 | 164 | 166 | 168 | 170 | 172 | 174 | 176 | 178 | 180 | 182 | 184 | 186 | 188 | 190 |
Таблица 5 продолжение
16 | 17 | 18 | 19 | |
Вх1 | 175 | 189 | 191 | 76 |
Вх2 | 176 | 190 | 192 | 75 |
Вх1 | 187 | 45 | 193 | 195 |
Вх2 | 188 | 46 | 197 | 196 |
Вых1 | 191 | 193 | 195 | 197 |
Вых2 | 192 | 194 | 196 | 198 |
Список литературы
1. Рабинович З.Л., Раманаускас В.А. Типовые операции в вычислительных машинах. – Киев: Техника, 1980.
2. Савельев А.Я. Прикладная теория цифровых автоматов. – М.: Высш. шк. 1987.