Операции над многословными операндами (Отчёт по лабораторной работе № 5)

Страницы работы

Содержание работы

СПбГУАП

Кафедра № 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;

}

6.Анализ результатов и выводы

Объем разработанной программы алгебраического сложения двух целых чисел, каждое из которых представлено массивом байтов, вместе с технологической частью, выполняющей ввод исходных данных и вывод результатов, составляет  1,6 Мбайт. Время работы программы в количестве операций алгебраического сложения при учёте переполнений и при условии, что количество разрядов исходных чисел равно n в лучшем случае равняется 2n, а в худшем 5n-1.

Похожие материалы

Информация о работе