Лабораторная работа №2

 

Постановка задачи

 

Реализовать 16-разрядный сумматор чисел со знаком на основе разработанных в первой лабораторной работе функций. Используя тот же язык программирования, что и в первой лабораторной работе. Суммирование разрядов выполнить в порядке LSF. Сформировать признак переполнения по рассмотренным на лекциях правилам.

 

Реализация

 

В соответствии с условиями задачи:

1. реализованы переводы в двоичную и десятичную системы;

2. реализованы базовые логические операции (конъюнкция, дизъюнкция, сложение по модулю два);

3. разработан шестнадцати разрядный сумматор и функция, отслеживающая переполнение.

 

Исходный код

//LABA#2
//Неверовская В.А; Группа 6О-209Б; Вариант №20

#include <stdio.h>

#include <math.h>

#include<stdlib.h>

 

short int otrizanie(short int key);

short int diz(short int key, short int key2);

short int con(short int key, short int key2);

short int slozh(short int key, short int key2);

 // перевод в двоичную систему

short int perevod_v_2(short int a, short int *b);

 // перевод в десятичную систему

short int perevod_v_10(short int s, short int b[]);

 // однорозрядный сумматор

short int summator1(short int slagaemoe1,short int slagaemoe2,short int perenos[]);

 // шестнадцатиразрядный сумматор

short int summator16(short int *b, short int *c, short int *x);

 // функция отслеживающая переполнение

short int Perepolnenie(short int *b, short int *c, short int v);

 

int main()

{

 

// массивы в которых будут храниться записи

// двух чисел и их суммы

short int b[16];

short int c[16];

short int x[16];

 

 

short int per;

 // переменные a,z - два числа поступающих на вход,

 // s - для возвращения из двоичной системы в десятичную чисел

short int a,z,i,s;

s=0;

 // инициализируем первое число

a=2000;

// инициализируем второе число

z=-25000;

 

 perevod_v_2(a,b);

for (i=0; i!=16; i++)

printf("%d", b[i]);

printf("\n");

 

s=perevod_v_10(s,b);

printf("%d\n", s);

printf("+\n");

 

perevod_v_2(z,c);

for (i=0; i!=16; i++)

printf("%d", c[i]);

printf("\n");

 

s=perevod_v_10(s,c);

printf("%d\n", s);

printf("_______________________\n");

 

// складываем шестнадцатиразрядным сумматором данные числа

per=summator16(b,c,x);

for (i=0; i!=16; i++)

printf("%d", x[i]);

s=perevod_v_10(s,x);

printf("\n");

printf("%d\n", s);

 

              

// отслеживаем было ли переполнение

Perepolnenie(b,c,per);  

}

 

 

//Создание функции отрицания

short int otrizanie(short int key){

if ((key%2)!=0){

return 0;}

else{

return 1;}

}

//Создание функции дизъюнкции

short int diz(short int key,short int key2){

short int s;

s=0;

if ((key%2)!=0){

s=1;

goto exit1;}

else{

s=0;}

 

if ((key2%2)!=0){

s=1;

goto exit1;}

else{

s=0;}

 

 

exit1:

return s; }

// Создание функции конъюнкции

short int con(short int key,short int key2){

short int s;

s=0;

if ((key%2)!=0){

s=1;}

else{

s=0;

goto exit1;}

 

if ((key2%2)!=0){

s=1;

}

else{

s=0;

goto exit1;}

 

exit1:

return s; }

 

//Создание функции сложения по модулю два

short int slozh(short int key, short int key2){

int d=0;

if (key%2!=0){

d++;}

 

if (key2%2!=0){

d++;}

 

 

if (d==1){

return 1;}

else{

return 0;}

}

 

short int perevod_v_2(short int a, short int *b)

{

 short int m[16];

 int i,z,v1,v,p;

 

// возводим 2 в 15 степень

p=1<<15;

// если число отрицательно то знаковый разряд равен 1

if (a<0)

{

b[0]=1;

a=p+a;

}

else

b[0]=0;

// переводим число из 10 в 2

for (i=0;a!=0;i++)

{

m[i]=a%2;

  if (m[i]==1)

           a=(a-1)/2;

  else

           a=a/2;

}

z=1;

v=i;

 

 

  

v1=16-i;

// заполняем массив до 16 символов

while (z!=v1)

     b[z++]=0;

// делаем так чтобы начало массива было началом числа    

   for (z=v1;z!=16;z++)

   b[z]=m[--v];     

}

 

short int perevod_v_10(short int s, short int b[])

{

  int r,i,p,q,qq;

int h[16];

short int ww[16];

p=1<<15;

r=1;

i=15;

s=0;

q=0;

qq=0;

ww[0]=0;

for (i=0; i!=16; i++)

h[i]=b[i];

// переводим число в десятичную систему

i=15;

while (i!=0)

  {

   s=h[i]*r+s;

   r=r*2;

   i--;

  }

 

 

if (b[0]==1){

s=s-p;}

return s;

}

 

 // суммируем все 16 разрядов
short int summator16(short int *b, short int *c, short int *x)
{
short int perenos;
perenos=0;
int i;

for (i=15; i>=0; i--)
x[i]=summator1(b[i],c[i],&perenos);

return x[0];
}

// суммируем по схеме сумматора
short int summator1(short int slagaemoe1, short int slagaemoe2, short int perenos[])
{
short int w;
short int r;
short int t;
short int summa;

w = slozh(slagaemoe1,slagaemoe2);


summa = slozh(*perenos,w);

r = con(slagaemoe1,slagaemoe2);
t = con(*perenos,w);

* perenos = diz(r,t);
return summa;
}

// функция отслеживающая переполнение

short int Perepolnenie(short int *b, short int *c, short int perenos1)

{

 

if ((b[0]==c[0])&&(perenos1!=b[0]))

 printf("\nPerepolnenie - YES\n\n");

else

 printf("\nPerepolnenie - NO\n\n");

}

 

 

Тестирование

 

 

 

 

         

 

Выводы

В соответствии условиям задачи был разработан 16-разрядный сумматор чисел со знаком на основе разработанных в первой лабораторной работе функций. Так же была реализована функция переполнения. Добавлены базовые логические операции с первой работы. Результатом данной работы можно назвать получившиеся в ходе суммирования в двоичной системе различные/одинаковые по знаку числа.

 

 




















Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: