Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПрограммированиеРГР_Матюшков.docx
Скачиваний:
3
Добавлен:
21.09.2019
Размер:
58.39 Кб
Скачать

Задача 4(№161)

Постановка задачи: Напишите функцию setbits(x, p, n, y), возвращающую значение x, в котором n бит, начиная с р-ой позиции справа, заменены на n правых разрядов из y.

Алгоритм: Создается переменная onebit, имеющая вначале одну единичку в самом правом разделе. Эта величина сравнивается с аргументом n с помощью оператора & и сдвигается после каждого сравнения влево. Если результат сравнения не 0, значит в соответсвующем разделе n и onebit единичка, а в противном случае 0. В строчку s заносится соответсвующий символ, затем строчка ревенсируется библиотечной функией.

Текст программы:

# include <string.h>

typedef char Typei; // Typei целый тип

char*itobin (Typei n, char*s)

{

int i,d;

int size = sizeof(Typei)*8; // Размер целого типа в битах

Typei onebit =1; // Заполнение S двоичными цифрами, начиная с последней

for (i=0; i<size; i++, onebit <<=1)

s[i]= n& onebit ? '1':'0';

s[i]='\0';

strrev(s);

return s;

}

# include <iostream>

# include <conio.h>

using namespace std;

int main()

{

char s[32]; // Массив для дфоичных цифр

cout <<"\nPa6ota s 6ezznakovimi \n";

unsigned char p =100,q=200,sum,diff,q1;

cout <<"p="<< int(p)<<"="<<itobin(p,s)<<endl;

cout <<"q="<< int(q)<<"="<<itobin(q,s)<<endl;

sum=p+q;diff=p-q;

cout <<"p+q="<<int(sum)<<",p-q="<<int(diff)<<endl;

q1=q>>2;

cout << "q>>2="<<int(q1)<<"="<<itobin(q1,s)<<endl;

cout<<"Pa6ota so znakovimi \n";

char z=127,z1=z+1;

cout<<"z="<<int(z)<<"="<<itobin(z,s);

cout<<",z+1="<<int(z1)<<"="<<itobin(z1,s)<<endl;

char x=-59,y;

cout<<"x="<<int(x)<<"="<<itobin(x,s)<<endl;

y=x | 017;

cout<<"x | 017 ="<<int(y)<<"="<<itobin(y,s)<<endl;

y= x&017;

cout<<"x$017 ="<<int(y)<<"="<<itobin(y,s)<<endl;

y=x^017;

cout<<"x^017 ="<<int(y)<<"="<<itobin(y,s)<<endl;

y=~x;

cout<<"~x ="<<int(y)<<"="<<itobin(y,s)<<endl;

y=x<<2;

cout<<"x<<2 ="<<int(y)<<"="<<itobin(y,s)<<endl;

y=x>>2;

cout<<"x>>2 ="<<int(y)<<"="<<itobin(y,s)<<endl;

getch();

return 0;

}

Задача 5(№172)

Постановка задачи: Напишите программу для анализа внутреннего представления величин типа double. Предусмотрите возможность задания различных значний переменной типа double путем записи в отведенный под нее байты некоторых значений. Исследуйте, как выглядт внутреннее представление наибольшего и наименьшего положительного значения типа double.

Текст программы:

ypedef union{ // Объединение можно рассматривать

double f; // как float

char str[sizeof(double)]; // или как массив символов

unsigned long l[2]; // или как long

}float_chars_long;

#include <iostream>

#include <conio.h>

using namespace std;

void prn_long_bin( unsigned long x )

{

int i,

n = sizeof( unsigned long ) * 8; // n- число двоичных разрядов в long

unsigned long h;

h= 1L << n - 1; //В Старшем разряде у h 1 и 0 в остальных

for ( i=1 ; i<= n;i++){

cout << ((x & h)!=0)<<(1 % 8 ?"":"");

x <<=1;

}

}

void main()

{

float_chars_long var;

char c,i;

cout<<"\n Vvedite chislo s plaf . \n";

cout<<"\n chislo as hex as bin\n";

while((cin>>var.f)!=NULL){

cout<<var.f<<'\t';

for(i=1;i<=sizeof(double);i++){

c=var.str[sizeof(double)-i];

cout<<hex<<((c & 0Xf0)>>4)<< (c & 0X0f)<<' ';

}

cout.put('\t');

prn_long_bin(var.l[1]);

prn_long_bin(var.l[0]);

cout<<endl;

}

getch();

}