- •1. Рабочая программа курса “методы программирования ”
- •Литература
- •2. Разветвляющиеся алгоритмы.
- •Циклические алгоритмы
- •Одномерные массивы (векторы)
- •Функции с одним результатом
- •Функции типа void.
- •7. Введение в объектно-ориентированное программирование
- •8. Простые типы данных
- •9. Матрицы (двухмерные массивы)
- •Сборник задач по программированию
- •Учебно-методическое пособие для студентов специальностей g 31 03 01 “Математика”, g 31 03 03 “Механика”
- •220050, Минск, проспект Франциска Скорины, 4.
- •220030, Минск, ул. Красноармейская, 6.
8. Простые типы данных
-
Пусть b1, b2, b3 – переменные логического типа. Записать оператор if и операторы присваивания, которые выполняют те же действия, что и оператор b1= b2 || b3.
Решение: if (b2) b1=true;
else b1=b3;
-
Нарисовать область плоскости, в которой и только которой для вещественных 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.
-
Не используя логические операции, записать выражение, принимающее значение true тогда и только тогда, когда точка с координатами (x, y) принадлежит первой четверти, включая и оси координат, или третьей четверти, не включая оси координат.
Решение. (x>=0) = = (y>=0).
-
Пусть 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 была единица.
-
Определить результат.
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");
} }
-
Пусть 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. Записать следующее логическое выражение, используя логические операции и не используя сравнение логических величин:
-
!((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, хранится следующая двоичная последовательность:
-
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.
