Міністерство освіти і науки України
Національний університет «Львівська Політехніка»
Інститут комп’ютерних технологій автоматики та метрології
Кафедра захисту інформації
Звіт
Про виконання лабораторної роботи № 1
з дисципліни
«Алгоритмічні основи криптології»
(Варіант2)
Мета роботи: – вивчити способи представлення та алгоритми для виконання операцій введення-виведення, порівняння, підсумовування, віднімання довгих чисел та навчитися розробляти програмне забезпечення для реалізації перерахованих алгоритмів на комп’ютері.
2. ЗАВДАННЯ
2.1. Домашня підготовка до роботи
1) Вивчити основні способи представлення довгих чисел та алгоритми для реалізації операцій введення, виведення, порівняння, а також арифметичних операцій додавання-віднімання довгих чисел.
2) Скласти блок-схеми алгоритмів та підпрограми для реалізації операцій введення та виведення довгих чисел. Варіанти представлення довгих чисел та способи заповнення невикористаних розрядів беруться за вказівкою викладача з таблиці 5.
3) Скласти блок-схеми алгоритмів, підпрограми та програму для реалізації адитивних операцій та операцій порівняння для роботи з довгими числами.
2.2. Робота в лабораторії
1) Ввести в комп'ютер програми згідно з отриманим завданням.
2) Відлагодити програми. При необхідності скоригувати блок-схеми алгоритмів та програми у відповідності з виявленими логічними та синтаксичними помилками.
3) Остаточні версії блок-схем, програм та отримані результати занести у звіт з лабораторної роботи.
№
з/п
Варіант представлення числа
Заповнення невикористаних розрядів
Операції з довгими числами
2
2
-1
Віднімання, менше
Список ідентифікаторів, змінних використаних у програмі:
go() – метод класу Syst, який викликає початок роботи програми.
less() – метод класу Syst, який забезпечує порівняння довгих чисел на «менше»
sub() – метод класу Syst, який забезпечує віднімання другого числа від першого з визначенням знаку результата.
read() – метод класу Syst, який реалізує зчитування чисел з текстових файлів і запис їх у масиви для подальшої обробки.
WriteLine() – метод класу Console, який забезпечує вивід з переходом на новий рядок.
Write() – метод класу Console який забезпечує вивід без переходу на новий рядок.
ReadLine() – метод класу Console, який забезпечує зчитування даних з клавіатури.
ToInt32() – метод класу Convert, який забезпечує приведення даних до типу int.
ToString() – метод класу Convert, який забезпечує приведення даних до рядкового типу.
Main() – метод класу Program, з якого починається робота програми.
Clear() – метод класу Console, який забезпечує очищення екрану.
Exists() – метод класу File, який перевіряє чи існує файл за поданою у дужках адресою.
OpenText() – метод класу File, який забезпечує відкриття файлу за поданою у
дужках адресою.
Блок-схеми:
Блок-схема до методу less():
Блок-схема до методу Sub()
Остаточна версія програми:
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
namespace AOK_1
{
class Syst
{
const int maxDig = 1000;
int[] a = new int[maxDig];
int[] b = new int[maxDig];
string longNum1;
string longNum2;
public bool e;
public bool z;
public int minus;
public const int osn = 10000;
bool read()
{
#region//початкове заповнення масивів а та b
a[0] = 0;
for (int i = 1; i < a.Length; i++)
{
a[i] = -1;
}
b[0] = 0;
for (int i = 1; i < b.Length; i++)
{
b[i] = -1;
}
#endregion
Console.WriteLine("введiть шлях до файлiв 1 та 2:");
longNum1 = Console.ReadLine();
longNum2 = Console.ReadLine();
#region//перевірка існування файлів
if (!File.Exists(longNum1))
{
Console.WriteLine("файл {0} не iснує!", longNum1);
Console.WriteLine("щоб продовжити натисніть 1");
string s = Console.ReadLine();
if (s == "1")
{
read();
}
else
{
return false;
}
return false;
}
if (!File.Exists(longNum2))
{
Console.WriteLine("файл {0} не iснує!", longNum2);
Console.WriteLine("щоб продовжити натисніть 1");
string s = Console.ReadLine();
if (s == "1")
{
read();
}
else
{
return false;
}
return false;
}
#endregion
Console.ReadLine();
Console.Clear();
#region //зчитування першого файла
StreamReader sr1 = File.OpenText(longNum1);
try
{
Console.WriteLine();
char[] c = new char[1];
//int k = 0;
while (sr1.Peek() >= 0)
{
sr1.Read(c, 0, c.Length);
Console.Write(c[0]);
a[0] += 1;
#region //додавання зчитаного символу до масиву
int i = maxDig - 1;
while (a[i] != -1 && i > 0)
{
if (a[i - 1] != -1)
{
i--;
}
else
{
if (a[i] * 10 + Convert.ToInt32(Convert.ToString(c[0])) >= osn)
{
int j = i;
a[j - 1] = Convert.ToInt32(Convert.ToString(c[0]));
for (j = i; j < maxDig; j++)
{
a[j - 1] += (a[j] * 10) % osn;
a[j] = (a[j] * 10) / osn;
}
}
else
{
a[i - 1] = (a[i] * 10 + Convert.ToInt32(Convert.ToString(c[0]))) % osn;
a[i] = (a[i] * 10 + Convert.ToInt32(Convert.ToString(c[0]))) / osn;
}
break;
}
}
if (a[maxDig - 1] == -1)
{
a[maxDig - 1] = Convert.ToInt32(Convert.ToString(c[0]));
}
#endregion
}
nenulA();
#region //виведення отриманого масиву на екран
Console.WriteLine();
for (int i = maxDig - 1; i >= (maxDig - a[0] - 1); i--)
{
Console.WriteLine("a[{0}]={1}", i, a[i]);
}
Console.WriteLine();
Console.WriteLine("a[0]=" + a[0]);
#endregion
FileInfo f = new FileInfo(longNum1);
Console.WriteLine("\nlength={0}, k={1}", f.Length, a[0]);
}
catch (Exception e)
{
Console.WriteLine("The process failed: {0}", e.ToString());
}
sr1.Close();
#endregion
Console.ReadLine();
Console.Clear();
#region //зчитування другого файла
StreamReader sr2 = File.OpenText(longNum2);
try
{
Console.WriteLine();
char[] c;
int k;
while (sr2.Peek() >= 0)
{
k = 0;
c = new char[1];
sr2.Read(c, k, c.Length);
Console.Write(c[0]);
b[0] += 1;
#region ///додавання зчитаного символа до масиву
int i = maxDig - 1;
while (b[i] != -1 && i > 0)
{
if (b[i - 1] != -1)
{
i--;
}
else
{
if (b[i] * 10 + Convert.ToInt32(Convert.ToString(c[0])) >= osn)
{
int j = i;
b[j - 1] = Convert.ToInt32(Convert.ToString(c[0]));
for (j = i; j < maxDig; j++)
{
b[j - 1] += (b[j] * 10) % osn;
b[j] = (b[j] * 10) / osn;
}
}
else
{
b[i - 1] = (b[i] * 10 + Convert.ToInt32(Convert.ToString(c[0]))) % osn;
b[i] = (b[i] * 10 + Convert.ToInt32(Convert.ToString(c[0]))) / osn;
}
break;
}
}
if (b[maxDig - 1] == -1)
{
b[maxDig - 1] = Convert.ToInt32(Convert.ToString(c[0]));
}
#endregion
}
nenulB();
#region //виведення отриманого масиву на екран
Console.WriteLine();
for (int i = maxDig - 1; i >= (maxDig - b[0] - 1); i--)
{
Console.WriteLine("b[{0}]={1}", i, b[i]);
}
Console.WriteLine();
Console.WriteLine("b[0]=" + b[0]);
#endregion
FileInfo f = new FileInfo(longNum2);
Console.WriteLine("\nlength={0}, k={1}", f.Length, b[0]);
}
catch (Exception e)
{
Console.WriteLine("The process failed: {0}", e.ToString());
}
sr2.Close();
Console.WriteLine();
Console.ReadLine();
Console.Clear();
return true;
#endregion
}
#region//ліквідація нульових елементів(зсув при заповненні)
void nenulA()
{
while (a[maxDig-1]==0)
{
{
for (int i = maxDig - 1; i > 0; i--)
{
a[i] = a[i - 1];
a[1] = -1;
}
}
}
}
void nenulB()
{
while (b[maxDig - 1] == 0)
{
{
for (int i = maxDig - 1; i > 0; i--)
{
b[i] = b[i - 1];
b[1] = -1;
}
}
}
}
#endregion
public void go()
{
read();
less();
sub();
}
#region//порівняння менше - робоче:)
bool less()
{
if (a[0] < b[0])
{
Console.WriteLine("число а менше числа b: a<b");
e=true;
}
else
{
Console.WriteLine("число а не менше числа b: a NOT<b");
e = false ;
}
for (int i = a[0]; i > 0; i--)
{
if (a[i] == b[i])
{
continue;
}
else
{
if (a[i] < b[i])
{
Console.WriteLine("a<b");
e = true;
}
else
{
Console.WriteLine("a NOT<b");
e = false;
}
}
}
return e;
}
#endregion
#region//віднімання - робоче
void sub()
{
Console.Clear();
int[] c = new int[maxDig];
int[] c1 = new int[maxDig];
int[] c2 = new int[maxDig];
#region//визначення знаку результата
less();
if (e == true)
{
c1 = b;
c2 = a;
minus = 1;
}
if (e == false)
{
c1 = a;
c2 = b;
minus = 0;
}
else
{
c = c1;
Console.WriteLine("результат вiднiмання c=0 - числа рiвнi");
}
#endregion
for (int i = maxDig - 1; i > 0; i--)
{
if (c1[i] >= c2[i])
{
if (c2[i] == -1)
{
c2[i] = 0;
c1[i] = c1[i] - c2[i];
}
else
{
c1[i] = c1[i] - c2[i];
}
}
else
{
if (c2[i] == -1)
{
c2[i] = 0;
c1[i] = c1[i] + osn;
c1[i - 1] = c1[i - 1] - 1;
c1[i] = c1[i] - c2[i];
}
else
{
c1[i] = c1[i] + osn;
c1[i - 1] = c1[i - 1] - 1;
c1[i] = c1[i] - c2[i];
}
}
}
c = c1;
Console.WriteLine();
#region//виведення отриманого масиву
if (minus == 1)
{
Console.WriteLine("число вiд'ємне:");
}
for (int i = maxDig - 1; i >= (maxDig - c[0] - 1); i--)
{
Console.WriteLine("c[{0}]={1}", i, c[i]);
}
Console.WriteLine("\n c[0]=" + c[0]);
Console.WriteLine();
#endregion
string rez;
rez=Convert.ToString(c[999]);
for (int i = maxDig - 2; i > 0; i--)
{
if (c[i] != -1)
{
rez = rez + Convert.ToString(c[i]);
}
else
{
break;
}
}
Console.WriteLine("отримане число:");
if (minus == 1)
Console.Write("-");
Console.WriteLine(rez);
}
#endregion
}
class Program
{
static void Main(string[] args)
{
DovgiChisla got = new DovgiChisla();
got.go();
}
}
}
Результати роботи програми:
Виведення на екран масивів, що представляє перше та друге довге число:
.
Виведення результату віднімання:
Висновок:
Дана програма виконує зчитування довгих чисел з файлів, адресу яких введено з клавіатури; записує числа у масиви, виконує порівняння на менше і віднімання від першого числа другого.