Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб1(Книга).doc
Скачиваний:
8
Добавлен:
23.12.2018
Размер:
370 Кб
Скачать
☆

8. Простые типы данных

        1. Пусть b1, b2, b3 – переменные логического типа. Записать оператор if и операторы присваивания, которые выполняют те же действия, что и оператор b1= b2 || b3.

Решение: if (b2) b1=true;

else b1=b3;

        1. Нарисовать область плоскости, в которой и только которой для вещественных x и y следующее логическое выражение истинно:

а) (fabs(x) < 1) > (fabs(y) < 1);

б) ! (fabs(x) < 1 ) = = (fabs(y) < 1);

в) ! (( fabs(x) < 1 ) = = (fabs(y) < 1)).

Указания к решению. Для логических величин следующие выражения истинны: true > false, true = = true, false = = false, ! true = = false, true = = ! false;

a) надо найти область плоскости, в которой и только в которой одновременно первое неравенство истинно, а второе ложно, т. е. такие точки, для которых выражение (fabs(x)<1) && (fabs(y)>=1) истинно;

б) !(fabs(x) < 1) равносильно неравенству (fabs(x) >= 1). Поэтому надо найти область плоскости, в которой и только в которой выражение (fabs(x)>=1) &&( fabs(y)<1) ||( fabs(x)<1) &&( fabs(y)>=1) истинно;

в) сначала определяем область, в которой и только в которой выражение (fabs(x)<1) && ( fabs(y)<1) ||( fabs(x)>=1) && (fabs(y)>=1) истиннo. Это был бы ответ, если бы не было операции отрицания. Операция отрицания в качестве ответа оставит точки, не вошедшие в эту область.

3. Записать следующее логическое выражение, используя операции логического умножения и сложения (&& , || ) и не используя сравнение логических величин.

а) (y>x) = = (x>0) ;

б) (y > x) > !(x > 0).

Решение. a) (y > x) && ( x> 0) || (y <= x) && (x <= 0);

б) y>x && x>0.

  1. Не используя логические операции, записать выражение, принимающее значение true тогда и только тогда, когда точка с координатами (x, y) принадлежит первой четверти, включая и оси координат, или третьей четверти, не включая оси координат.

Решение. (x>=0) = = (y>=0).

  1. Пусть int a=170. Определить результат

a) r = a & 15; б) r = a | 8;

в) if (a & 8 = = 8) cout<<” YES”; else cout<<”NO”;

Решение. Число 170 переводим в 16-ю систему счисления делением на 16. Получим 17010=AA16. Каждую 16-ю цифру запишем в виде двоичной тетрады и добавим необходимое количество незначащих нулей. Получим 00000000000000000000000010101010.

a) 1510 = 11112. Учитывая правила выполнения операции &, получим десятичное число 10 или шестнадцатеричное A, т. е. с помощью этой операции всегда выделяется последняя 16-я цифра числа.

b) Так как 810=10002 и принимая во внимание правила выполнения операции | (битовое или), получим то же число 170.

c) Так как в двоичном представлении числа 8 есть всего одна двоичная единица, то результатом операции a & 8 будет либо 0, либо 8 =10002 в зависимости от того, что находится в 3-м справа бите числа a (нумерация битов с нуля). В нашем примере получим 8 и будет выведено “YES”, что означает, что в 3-м справа бите исходного числа a была единица.

  1. Определить результат.

unsigned short a;

cin>>a;

a=a & 0xFFF7;

cout<<a;

Решение. Введем, например, число 26. Во 2-й системе счисления это 0000000000011010. Так как FFF716=11111111111101112, то операция & (битовое и) оставит без изменения все биты, кроме 3-го справа. Независимо от того, что было в этом бите (0 или 1), получится нуль, т. е. мы “выключили” 3-й справа бит. В результате получим 00000000000100102=18, т. е. будет выведено число 18. Если введем, например, число 23, то это число не изменится, так как в 3-м бите был 0.

7. (Упаковка информации). Пусть по условию задачи известно, что числа массива находятся в диапазоне от 0 до 15, т. е. каждое число занимает четыре бита. Надо обработать 20 таких чисел. Нет типа данных для хранения четырех битов. В каждом элементе массива типа unsigned short размером два байта (16 битов) можно разместить 16/4=4 числа из указанного диапазона. Поэтому для хранения 20 таких чисел понадобится массив из 20/4=5 элементов. 20 введенных чисел из диапазона 0..15 записать в массив типа unsigned short размерности 5.

unsigned short MyINP( unsigned short myMAX);

int main()

{ const int k=4, // размерность числа 0..15 4 бита

n=20, // количество чисел

size=n*k/(sizeof(unsigned short)*8); // размерность массива

unsigned short number, array[size];

for (int i=0;i<size;i++)

for(int j=1;j<=k;j++)

{ number=MyINP(15);

array[i]=(array[i]<<k) | number;

}

for (int i=0; i<size;i++)

printf("%X ",array[i]); // вывод в 16-й системе счисления четырёх 16-х // цифр.

getch(); return 0; }

unsigned short MyINP( unsigned short myMAX)

{ unsigned short x;

while (true)

{ cin>>x; if (x<=myMAX) return x;

textcolor(4); cprintf("ERROR Repeat");

}

}

Функция MyINP вводит целое положительное число, меньшее или равное myMAX. При попытке ввести неположительное или большее myMAX число красным цветом выводится сообщение об ошибке и приглашение повторить ввод.

8. Ввести последовательно двоичные цифры (0 или 1) справа налево, количество которых < = 32. Вывести число, 16-е представление которого определяется введенной последовательностью нулей и единиц. Например, если введем количество признаков 4 и последовательность

1 0 1 1, то получим 16-е число d = 1101. Если введем номер бита для проверки, то выведем ON(1), если в этом бите 1, и OFF(0) в противном случае. Например, если введем 2, то выведем OFF(0).

unsigned input1(unsigned kmax);

int main()

{ unsigned char sign; unsigned short ksign; unsigned bit=0;

cout<<"\nКоличество признаков (<=32)\n "; ksign=input1(32);

for (int i=1; i<=ksign; i++)

{ cout<<"Input "<<i<<"-th sign (0 or 1)\n";

sign=input1(1); bit=bit | (sign<<(i-1));

}

printf(" result in 16 => %x ",bit);

cout<<"\nInput number of bit for testing (>0 && <= "<<ksign<<")=> ";

unsigned char ntest; ntest=input1(ksign);

unsigned t; t=(1<<(ntest-1));

if ((bit & t) == t)

cout<<"ON (1)\n";

else cout<<"OFF (0)\n" ;

getch(); return 0;

}

unsigned input1(unsigned kmax)

{ unsigned short x;

while (true)

{ cin>>x; if (x<= kmax) return x;

textcolor(4); cprintf("ERROR Repeat");

} }

  1. Пусть Bool b1, b2, b3, b4; Записать оператор if и операторы присваивания, которые выполняют те же действия, что и следующий оператор:

а) b1= b2 && b3;

б) b1=b2 || b3 && b4;

в) b1=(b2 || b3) && b4;

г) b1= !(b2 && b3 || b4);

10. Записать с помощью логических операций и оператора присваивания, не используя оператор if:

bool b1, b2, b3,r;

if (!b1) r=false;

else if (!b2) r=false;

else r=b3;

11. Объяснить работу следующей программы:

float x,y; bool lg; cin>>x>>y;

while (!(x==100 && y==100))

{ lg=x>0; cout<<"x>0 "<<lg<<" y>0 "<<(y>0)<<" "<<(lg > (y>0));

if (lg > (y>0)) cout<<" YES ";

else cout<<" NO";

cin>>x>>y;

}

12. Записать следующее логическое выражение, используя логические операции и не используя сравнение логических величин:

      1. !((y > x) > (x>0)); б) (y > x) != (x > 0) ; в) ! (y > x) > (x > 0).

Нарисовать область плоскости, в которой и только в которой записанное логическое выражение истинно.

13. Записать логическое выражение с помощью сравнения логических величин, не используя операций && и ||:

а) x*x+y*y > 1 && y <= x;

б) x*x+y* y> 1 && y <= x || x*x+y*y <= 1 && y > x;

в) x>0 && y > 0 || x <= 0 && y <= 0.

Нарисовать область плоскости, в которой и только в которой записанное логическое выражение истинно.

14. Найти значение переменной r, объявленной как int r, если

а) r= ~(100>>2) & ~(–10) | 0x10;

б) r=162 | 0x10A & 111;

в) r= –10 & 1|4;

г) r=(123<<4)& 123.

15. Найти значение этого же выражения из предыдущего упражнения, если переменная объявлена как unsigned short r.

16. Пусть в ячейке, объявленной short a, хранится следующая двоичная последовательность:

        1. 0000001001001001; б) 1100000000001000;

в) 1111111111111000; г) 1000000000000000;

Что это за число в 10-й системе счисления? В 16-й системе счисления?

17. Выполнить предыдущее упражнение, если переменная объявлена как unsigned short a.

18. Как включить 4-й справа бит, т. е. поместить туда 1 независимо от того, какое там было значение, 0 или 1? Нумерация битов с нуля.

19. Как заменить значение 2-го справа бита на противоположное, т. е. 0 на 1, а 1 на 0? Нумерация битов с нуля.

20. С помощью битовых операций вывести на экран:

а) значение k-го справа бита;

б) i-ю справа шестнадцатеричную цифру;

в) двоичное представление целого числа;

г) шестнадцатеричное представление целого числа.

21. Определить результат.

int x=0, y=5;

cout << (x & y) << (x && y) << (x | y) << (x || y) << (y > x > 0) << ((x < y) < (y < 0)) << endl.

22. Что будет выведено? Ответ объяснить.

a) bool b1, b2; b1=5 > 0xA; b2=100;

cout << (b1 && b2) << " " << (b2 & (b1 = b2)) << endl;

б) short k2; cout<<sizeof(short)<<endl;

k2 = ~(720 & 170); cout << k2 << endl;

в) bool b1, b2, b3; b1=10 < 0x10;

b2=5; b3=b1 | b2 && (b1==b2); cout<<b3.

23. Определить результат:

char a='3', b=5; cout<<a%b<<a/b<<'\n'.

24. Решить задачу упаковки (см. 7), если числа массива могут принимать следующие значения: a) 0, 1; б) 0, 1, 2, 3; в) 0, 1, 2, ..., 7.

25. Решить задачу распаковки информации, обратную задаче упаковки (см. 7), т. е. вывести на экран исходные числа массива из указанного диапазона в предположении, что они были упакованы. Варианты диапазона чисел: a) 0, 1; б) 0, 1, 2, 3; в) 0, 1, 2, ..., 7; г) 0, 1, 2, …, 15.