Алгоритми для виконання операцій з довгими числами

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
ІКТА
Факультет:
Не вказано
Кафедра:
Не вказано

Інформація про роботу

Рік:
2016
Тип роботи:
Звіт до лабораторної роботи
Предмет:
Алгоритмічні основи криптології
Група:
БІ 21

Частина тексту файла (без зображень, графіків і формул):

МІНІСТЕРСТВО ОСВІТИ ТА НАУКИ УКРАЇНИ НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА” ІКТА кафедра БІТ  Звіт до лабораторної роботи № 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. Результати роботи програм / /
Антиботан аватар за замовчуванням

11.05.2016 16:05-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!