МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
ІКТА
кафедра БІТ
Звіт
до лабораторної роботи № 1
з дисципліни "Алгоритмічні основи криптології"
по темі : "Алгоритми для виконання операцій з довгими числами"
Варіант 13
Мета роботи - вивчити способи представлення та алгоритми для виконання операцій введення-виведення, порівняння, підсумовування, віднімання довгих чисел та навчитися розробляти програмне забезпеченнядля реалізації перерахованих алгоритмів на комп’ютері.
1. ЗАВДАННЯ
1) Вивчити основні способи представлення довгих чисел та алгоритми для реалізації операцій введення, виведення, порівняння, а також арифметичних операцій додавання-віднімання довгих чисел.
2) Скласти блок-схеми алгоритмів та підпрограми для реалізації операцій введення та виведення довгих чисел. Варіанти представлення довгих чисел та способи заповнення невикористаних розрядів беруться за вказівкою викладача.
3) Скласти блок-схеми алгоритмів, підпрограми та програму для реалізації адитивних операцій та операцій порівняння для роботи з довгими числами. Дані для роботи беруться з таблиці 5 за вказівкою викладача.
№
з/п
Варіант представлення числа
Заповнення невикористаних розрядів
Операції з довгими числами
13
1
0
Віднімання, більше
2. Блок-схеми алгоритмів
/
Рис.1. Блок-схема алгоритму введення довгого числа.
/
Рис.2. Алгоритм виведення довгого числа.
/Рис.3. Блок-схеми алгоритмів порівняння довгих чисел.
/
Рис.5. Блок-схема алгоритму віднімання довгих чисел.
3. Список ідентифікаторів констант, змінних, процедур і функцій, використаних у блок-схемах алгоритмів і програм, та їх пояснення
i, ind - змінна цілого типу, індекс масиву
r_size - змінна цілого типу, різниця к-сті цифр більшого числа від меншого
size - змінна цілого типу, загальний розмір чисел
n - змінна цілого типу, розмір першого числа
m - змінна цілого типу, розмір другого числа
m1 - змінна логічного типу, від'ємність першого числа
m2 - змінна логічного типу, від'ємність другого числа
ch1 - масив символьного типу, перше число зі знаком
ch2 - масив символьного типу, друге число зі знаком
temp1 - масив символьного типу, перше число без знаку
temp2 - масив символьного типу, друге число без знаку
res_sign - змінна символьного типу, знак результату
c1 - масив цілого типу, перше число без знаку
c2 - масив цілого типу, друге число без знаку
result - масив цілого типу, результат операції
r - масив цілого типу, результат віднімання
res - змінна цілого типу, цифра результат віднімання
st - змінна цілого типу, перехід в старший розряд
a - масив цілого типу, результат додавання
res - змінна цілого типу, цифра результат додавання
st - змінна цілого типу, перехід в старший розряд
test_tia - масив цілого типу, конвертований з масиву символьного типу
tid - змінна цілого типу, конвертована з змінної символьного типу
test - масив символьного типу, конвертований з текстової стрічки
q, k - змінні цілого типу, розміри першого і другого числа
str1 - змінна текстового типу, стрічка з першим числом
str2 - змінна текстового типу, стрічка з другим числом
ln - обєкт з доступом до класу LongNumbers
Crypto_Lab1 - простір імен
LongNumbers - клас, котрий реалізує операції з довгими числами
Program - клас, котрий контролює програму
LongNumbers() - конструктор, котрий перероблює дані для подальшого виконання операції з числами
Actions() - функція, котра виконує операцію над довгими числами
Substract() - функція повертає масив цілого типу, котра реалізує операцію віднімання довгих чисел
Add() - функція повертає масив цілого типу, котра реалізує операцію додавання довгих чисел
ShowResult() - функція, виводить на екран остаточний результат операцій з довгими числами
ToIntArray() - функція повертає масив цілого типу, котра конвертує значення з символьного масиву в цілочисельний масив
ToIntDigit() - функція повертає значення цілого типу, котра конвертує символьне значення змінної в цілочисельне
ToChar() - функція повертає масив символьного типу, котра реалізує перетворення з текстової стрічки в масив символьних елементів
Over() - функція повертає значення логічного типу, котра реалізує порівняння двох довгих чисел, чи одне більше за друге
Equally() - функція повертає значення логічного типу, котра реалізує порівняння двох довгих чисел на рівність одне одному
Main() - головна функція
Console.Write() - функція, виводить на екран текст
Console.WriteLine() - функція, виводить на екран текстову стрічку
Console.ReadLine() - функція зчитує з клавіатури текст
Array.Copy() - функція, котра копіює значення з одного масиву в інший
4. Текст програми
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Crypto_Lab1
{
class LongNumbers
{
int i = 0, ind = 0;
int r_size;
int size = 0;
int n, m;
bool m1 = false, m2 = false;
char[] ch1, temp1;
char[] ch2, temp2;
char res_sign = ' ';
int[] c1;
int[] c2;
int[] result;
public LongNumbers(string str1, string str2)
{
n = str1.Length;
m = str2.Length;
ch1 = new char[n];
ch2 = new char[m];
ch1 = ToChar(str1);
ch2 = ToChar(str2);
if (ch1[0] == '-' && ch2[0] == '-')
{
m1 = true;
m2 = true;
}
else
if (ch1[0] == '-')
m1 = true;
else if (ch2[0] == '-')
m2 = true;
else
{
m1 = false;
m2 = false;
}
if (m1 && !m2)
{
temp1 = new char[ch1.Length - 1];
for (i = 0; i < temp1.Length; i++)
temp1[i] = ch1[i + 1];
temp2 = new char[ch2.Length];
Array.Copy(ch2, temp2, ch2.Length);
}
else if (m2 && !m1)
{
temp2 = new char[ch2.Length - 1];
for (i = 0; i < temp2.Length; i++)
temp2[i] = ch2[i + 1];
temp1 = new char[ch1.Length];
Array.Copy(ch1, temp1, ch1.Length);
}
else if (m1 && m2)
{
temp1 = new char[ch1.Length - 1];
for (i = 0; i < temp1.Length; i++)
temp1[i] = ch1[i + 1];
temp2 = new char[ch2.Length - 1];
for (i = 0; i < temp2.Length; i++)
temp2[i] = ch2[i + 1];
}
else if (!m1 && !m2)
{
temp1 = new char[ch1.Length];
temp2 = new char[ch2.Length];
Array.Copy(ch1, temp1, ch1.Length);
Array.Copy(ch2, temp2, ch2.Length);
}
n = temp1.Length;
m = temp2.Length;
if (n > m)
{
ind = 0;
r_size = 0;
c1 = new int[n];
c1 = ToIntArray(temp1);
c2 = new int[n];
result = new int[n + 1];
r_size = n - m;
for (i = 0; i < r_size; i++)
c2[i] = 0;
ind = r_size;
foreach (char c in str2)
{
c2[ind] = ToIntDigit(c);
ind++;
}
size = n;
}
else if (n < m)
{
ind = 0;
r_size = 0;
c1 = new int[m];
c2 = new int[m];
c2 = ToIntArray(temp2);
result = new int[m + 1];
r_size = m - n;
for (i = 0; i < r_size; i++)
c1[i] = 0;
ind = r_size;
foreach (char c in str1)
{
c1[ind] = ToIntDigit(c);
ind++;
}
size = m;
}
else
{
c1 = new int[n];
c2 = new int[m];
result = new int[n + 1];
c1 = ToIntArray(temp1);
c2 = ToIntArray(temp2);
size = n;
}
Actions(result, c1, c2, m1, m2, size);
}
void Actions(int[] result, int[] c1, int[] c2, bool m1, bool m2, int size)
{
int[] n = new int[c1.Length];
Array.Copy(c1, n, c1.Length);
int[] m = new int[c2.Length];
Array.Copy(c2, m, c2.Length);
if (Equally(c1, c2, m1, m2))
{
Console.Write("Результат : {0}", 0);
}
else if (!m1 && !m2 && Over(n, m, m1, m2))
{
result = Subtract(n, m, size);
ShowResult(result, res_sign);
}
else if (!m1 && !m2 && Over(m, n, m1, m2))
{
result = Subtract(m, n, size);
res_sign = '-';
ShowResult(result, res_sign);
}
else if (m1 && !m2 && !Over(n, m, m1, m2))
{
result = Add(m, n, size);
res_sign = '-';
ShowResult(result, res_sign);
}
else if (!m1 && m2 && Over(n, m, m1, m2))
{
result = Add(n, m, size);
res_sign = ' ';
ShowResult(result, res_sign);
}
else if (m1 && m2 && !Over(n, m, m1, m2))
{
result = Subtract(n, m, size);
res_sign = ' ';
ShowResult(result, res_sign);
}
else if (m1 && m2 && Over(n, m, m1, m2))
{
result = Subtract(m, n, size);
res_sign = '-';
ShowResult(result, res_sign);
}
Console.WriteLine("\nc1 != c2 - {0}", !Equally(c1, c2, m1, m2));
}
int[] Subtract(int[] c1, int[] c2, int size)
{
int[] r = new int[size];
int st = 0;
int res;
for (int k = size - 1; k >= 0; k--)
{
c1[k] += st;
if ((c1[k] - c2[k]) < 0)
{
res = 10 + (c1[k] - c2[k]);
st = -1;
}
else
{
res = (c1[k] - c2[k]);
st = 0;
}
r[k] = res;
}
return r;
}
int[] Add(int[] c1, int[] c2, int size)
{
int[] a = new int[size + 1];
int st = 0;
int res;
for (int k = size - 1; k >= 0; k--)
{
res = 0;
c1[k] += st;
if ((c1[k] + c2[k]) >= 10)
{
res = (c1[k] + c2[k]) - 10;
st = 1;
}
else
{
res = (c1[k] + c2[k]);
st = 0;
}
a[k + 1] = res;
}
a[0] += st;
return a;
}
public void ShowResult(int[] r, char sign)
{
int ide = 0;
Console.Write("Результат : {0}", sign);
if (r[ide] == 0) ide = 1;
else ide = 0;
for (i = ide; i < r.Length; i++)
Console.Write(r[i]);
}
static int[] ToIntArray(char[] s)
{
int[] test_tia = new int[s.Length];
for (int k = 0; k < test_tia.Length; k++)
switch (s[k])
{
case '0':
test_tia[k] = 0;
break;
case '1':
test_tia[k] = 1;
break;
case '2':
test_tia[k] = 2;
break;
case '3':
test_tia[k] = 3;
break;
case '4':
test_tia[k] = 4;
break;
case '5':
test_tia[k] = 5;
break;
case '6':
test_tia[k] = 6;
break;
case '7':
test_tia[k] = 7;
break;
case '8':
test_tia[k] = 8;
break;
case '9':
test_tia[k] = 9;
break;
default:
break;
}
return test_tia;
}
static int ToIntDigit(char s)
{
int tid = 0;
switch (s)
{
case '0':
tid = 0;
break;
case '1':
tid = 1;
break;
case '2':
tid = 2;
break;
case '3':
tid = 3;
break;
case '4':
tid = 4;
break;
case '5':
tid = 5;
break;
case '6':
tid = 6;
break;
case '7':
tid = 7;
break;
case '8':
tid = 8;
break;
case '9':
tid = 9;
break;
default:
break;
}
return tid;
}
static char[] ToChar(string s)
{
int i = 0;
char[] test = new char[s.Length];
foreach (char c in s)
{
test[i] = c;
i++;
}
return test;
}
bool Over(int[] c1, int[] c2, bool m1, bool m2)
{
int q, k;
q = c1.Length;
k = c2.Length;
if (m1 && !m2)
return false;
else if (m2 && !m1)
return true;
if (q > k && !m1)
return true;
if (q < k && !m2)
return false;
else if (q == k && (!m1 && !m2))
{
for (int uq = 0; uq < q; uq++)
if (c1[uq] > c2[uq])
return true;
else return false;
}
else if (q == k && (m1 && m2))
{
for (int iq = 0; iq < q; iq++)
if (c1[iq] < c2[iq])
return true;
else return false;
}
return false;
}
bool Equally(int[] c1, int[] c2, bool m1, bool m2)
{
if (m1 && !m2)
return false;
else if (m2 && !m1)
return false;
if (c1[0] != c2[0]) return false;
if ((c1.Length > c2.Length) || (c1.Length < c2.Length))
return false;
for (int i = 1; i < c1.Length; i++)
if (c1[i] == c2[i]) continue;
else return false;
return true;
}
}
class Program
{
static void Main(string[] args)
{
string str1 = String.Empty;
string str2 = String.Empty;
LongNumbers ln;
Console.Write("Введiть 1 число : ");
str1 = Console.ReadLine();
Console.Write("Введiть 2 число : ");
str2 = Console.ReadLine();
ln = new LongNumbers(str1, str2);
Console.ReadLine();
}
}
5. Результати роботи програм
/
/