СПбГУАП
Кафедра № 46
Отчёт защищён:
Преподаватель:
«Операции над многословными операндами».
Отчёт по лабораторной работе № 5 по курсу «ПЯВУ».
Работу выполнил
студент группы № 4568: Вихров Игорь.
Санкт-Петербург. 2006 год.
1.Постановка задачи
Написать функцию алгебраического сложения двух целых чисел, каждое из которых представлено массивом байтов. Первый байт массива содержит код знака числа: 0 - ‘+’, 255 - ‘-‘, а остальные байты- значащие двоичные цифры числа.
2.Описание входных и выходных данных
bool lab5 (unsigned char *m1, unsigned char *m2, unsigned char *m3, int n) - оператор прототипа функции, которая возвращает true, если сумма поместилась в n-элементах массива m3.
Входные данные:
unsigned char *m1 – указатель на первое слагаемое;
unsigned char *m2 – указатель на второе слагаемое;
Выходные данные:
unsigned char *m3 – указатель на алгебраическую сумму двух введённых чисел.
3.Набор тестов.
Входные данные:
Первое слагаемое: 00 CC 4F A3 D7 95
второе слагаемое: 00 E4 7D C6 BB 3A
Первое слагаемое: 00 23 CB 92 C9 6E
второе слагаемое: 00 12 B5 61 D3 E5
Выходные данные:
Функция возвратит false
Функция возвратит true, сумма = 00 36 80 F4 9D 53
4.Описание алгоритма
Если числа отрицательные (первый байт = 0xFF), переведём их в дополнительный код. С помощью цикла по байтам будем складывать эти числа, фиксируя при этом переполнение (0x01) и добавляя его к следующей сумме.
5.Текст программы
#include <iostream>
#include <string.h>
using namespace std;
void dopcod(unsigned char *d,int n)
{
int j;
int i;
bool f=true;
for(i=n-1;i>=0;i--)
{
if ((d[i]!=0x00)&&(f))
{
d[i]=0x100-d[i];
f=false;
j=i;
}
if ((!f)&&(i!=j))
d[i]=0xFF-d[i];
}
}
bool summa(unsigned char *s1,unsigned char *s2,unsigned char *s3,int n)
{
if (s1[0]==0xFF)dopcod (s1,n);
if (s2[0]==0xFF)dopcod (s2,n);
int i;
unsigned char y=0x00;
for(i =(n-1);i>=0 ; i--)
{
s3[i]=s1[i]+s2[i]+y;
if ((s1[i]+s2[i]+y)>255) y=0x01;
else y=0x00;
}
if (s3[0]==0xFF) dopcod (s3,n);
if ((s3[0]==0x00)||(s3[0]==0xFF)) return true;else return false;
}
void main()
{ //unsigned char m1[6]={0x00,0xCC,0x4F,0xA3,0xD7,0x95};
//unsigned char m2[6]={0x00,0xE4,0x7D,0xC6,0xBB,0x3A};
unsigned char m1[6]={0xFF,0xF0,0x00,0x00,0x00,0x00};
unsigned char m2[6]={0x00,0x00,0x00,0x00,0x00,0x01};
// unsigned char m1[6]={0x00,0x23,0xCB,0x92,0xC9,0x6E};
//unsigned char m2[6]={0x00,0x12,0xB5,0x61,0xD3,0xE5};
unsigned char result[6];
int k=6;
bool H=summa(m1,m2,result,k);
if (H==true&&result[0]==0xFF) dopcod (result,k);
cout<<result;
}
Объем разработанной программы алгебраического сложения двух целых чисел, каждое из которых представлено массивом байтов, вместе с технологической частью, выполняющей ввод исходных данных и вывод результатов, составляет 1,6 Мбайт. Время работы программы в количестве операций алгебраического сложения при учёте переполнений и при условии, что количество разрядов исходных чисел равно n в лучшем случае равняется 2n, а в худшем 5n-1.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.