zadachi
.pdfvoid clCoord::ArrPoint() |
|
|
|
{ for(int i=0; i<n; i++) |
|
|
|
MyPoint (x[i],y[i],d[i],b[i]); |
|
||
}; |
|
|
|
void clCoord::MySORT() |
|
|
|
{ int k; |
bool flag; |
k=n; |
|
do { |
k--; |
flag=false; |
|
for(int i=0; i<k; i++) |
|
||
|
if ( d[i]>d[i+1] |
|| d[i]==d[i+1] && b[i]>b[i+1]) |
|
|
{ flag=true; |
RR(x[i],x[i+1]); |
|
|
RR(y[i],y[i+1]); |
RR(d[i],d[i+1]); |
|
|
RR(b[i],b[i+1]); |
|
|
|
} |
|
|
}while (flag);
};
void clCoord::MyOut() |
|
|
|
|
|
|
|
|||
{ |
cout<< " |
|
|
|
\n"; |
|
|
|
|
|
|
cout<< " |
|
T A B L E |
|
\n"; |
|
|
|
|
|
|
cout<< " |
x |
y |
d |
b \n"; |
|
|
|
|
|
|
cout<< " |
|
|
|
\n"; |
|
|
|
|
|
|
for ( int i=0; i<n; i++) |
|
|
|
|
|
|
|
||
|
printf (" %7.2f |
%7.2f |
%8.3f |
%1d \n", |
|
|
|
|
||
|
x[i], |
y[i], |
d[i], |
b[i]); |
|
|
|
|
|
|
} |
; |
|
|
|
|
|
|
|
|
|
int main() |
|
|
|
|
|
|
|
|
|
|
{ const N=8; |
float X[N]={ 1.1, |
-0.6, |
-3.3, |
0.45, |
-0.45, |
0.6, |
0.7, -0.8}, |
|||
|
|
|
Y[N]={-1.0, |
-0.7, |
3.2 , |
0.45, |
-0.45, |
0.7 , |
-0.6, 8.1}; |
|
clCoord OBJ (N,X, Y); |
OBJ.ArrPoint (); |
|
|
|
|
|||||
clrscr(); |
|
|
OBJ.MyOut(); |
|
|
|
|
|||
OBJ.MySORT(); |
|
cout<<"\n Continue --- press any key\n"; |
||||||||
getch(); |
|
|
OBJ.MyOut(); |
|
|
|
|
|||
getch(); |
|
|
return 0; |
|
|
|
|
|
||
} |
|
|
|
|
|
|
|
|
|
|
Функции MyPoint и RR имеют атрибут доступа private по умолчанию. Они доступны, как и поля, только в функциях этого класса и недоступны в других функциях. Например, из функции main их вызвать нельзя.
Массивы передаются с помощью конструктора через параметры. Определяются массивы в головной функции во время объявления. Здесь их можно ввести или задать с помощью датчика случайных чисел.
6. В предложенном варианте программы 4 цвета передаются в качестве параметров функций out и show. Можно предложить второй вариант: включаем цвета в класс в качестве двух дополнительных полей наряду с массивом и его размерностью. Тогда функции out и show будут
33
без параметров, а конкретные цвета передаются c помощью конструктора, как это сделано для размерности массива. Изменить программу 4.
6. Составить класс для работы с одним целым числом. Кроме конструктора предусмотреть следующие методы:
вывод числа в разреженном виде, т. е. между каждой десятичной цифрой должен быть один пробел;
вывод числа в двоичной системе счисления;вывод числа в 16-й системе счисления.
В функции main проверить эти методы.
7. Составить класс для работы с комплексными числами, включив в него два вещественных числа, которые определяют вещественную и мнимую части. Предусмотреть конструктор с двумя параметрами, метод для вывода комплексного числа в общепринятом виде, метод для сложения двух комплексных чисел, метод для умножения двух комплексных чисел. В последних двух методах один операнд берется из класса, а второй передается как два параметра метода.
Замечание. Методы типа сложение двух комплексных чисел профессионально программируются с помощью перегрузки операций, которая изучается в 3-м семестре.
8. Составить класс для работы с рациональными дробями. Класс содержит в качестве полей два целых числа: числитель и знаменатель. В конструкторе с двумя параметрами предусмотреть проверку знаменате-
ля на нуль. Разработать следующие методы: вывод дроби в виде a ; со- b
кращение дроби, например 24 2 ; сложение двух дробей; деление двух
36 3
дробей. В последних двух методах один операнд берется из класса, а второй передается как два параметра метода.
10. Составить класс для работы с моментами времени внутри одних суток. Класс содержит в качестве полей три целых числа: час, минута и секунда. В конструкторе с тремя параметрами выполнить проверку корректности момента времени. Предусмотреть некоторые из следующих методов:
вывод момента времени, который будет через S секунд, если S передается как параметр метода. Величина S меньше количества оставшихся до конца суток секунд;
определение количества секунд, прошедших с начала суток:
вывод момента времени, который был на S секунд раньше, если S передается как параметр метода. Величина S меньше количества прошедших после начала суток секунд;
34
определение количества секунд между двумя моментами времени. Один из них берется из класса, а второй передается как три параметра метода.
11.Составить класс для работы с датами внутри одного года. Класс содержит в качестве полей два целых числа: число и номер месяца. В конструкторе с двумя параметрами выполнить проверку корректности даты. Предусмотреть некоторые из следующих методов:
вывод даты следующего дня;
получение номера дня недели для заданной даты и вывод его названия (понедельник, вторник …). Считать, что задано, в какой день недели было первое число указанного месяца;
вывод даты предыдущего дня;
определение количества дней, прошедших с начала года;
определение даты, которая будет через D дней, если D передается как параметр метода. Величина D меньше количества оставшихся до конца года дней;
определение количества дней между двумя датами. Одна из них берется из класса, а вторая дата передается как два параметра метода.
12.Решить задачу 11, учитывая и год, т. е. класс должен содержать три целых числа: число, номер месяца и год.
13.Составить класс для работы с большими целыми числами, для которых вещественный тип неприемлем, а типа long недостаточно. Для хранения такого числа предлагается использовать одномерный массив, каждый элемент которого представляет собой одну десятичную цифру числа. Поэтому класс содержит массив и его размерность, т. е. количество цифр числа. Во всех вариантах предусмотреть конструктор, ввод и вывод массива цифр и следующие методы в зависимости от вариантов:
a) увеличение числа на единицу; вычитание двух больших чисел, т. е. вычитание двух массивов по правилу вычитания “в столбик”;
б) уменьшение числа на единицу; сложение двух больших чисел, т. е. сложение двух массивов по правилу сложения “в столбик”;
в) умножение двух больших чисел по правилу умножения “в столбик”;
г) сравнение двух больших чисел;
Замечание В методах для реализации операций вычитания, сложения, умножения и сравнения двух больших чисел один массив (число) берется из класса, а другой массив (число) передается через параметр метода.
д) е) ж) сложение (вычитание, умножение) большого числа (массива) с обычным целым числом. Большое число (массив) берем из класса, а
35
обычное, представленное как число типа long, передается как параметр метода. В алгоритме реализации таких методов необходимо предусмотреть выделение из обычного числа типа long цифр и их использование.
14. Решить задачи из раздела 6, составив и используя соответствующие классы.
8. ПРОСТЫЕ ТИПЫ ДАННЫХ
1. Пусть b1, b2, b3 – переменные логического типа. Записать оператор if и операторы присваивания, которые выполняют те же действия, что и оператор b1= b2 || b3.
Решение: |
if (b2) b1=true; |
|
else b1=b3; |
2. Нарисовать область плоскости, в которой и только которой для вещественных 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.
36
4.Не используя логические операции, записать выражение, принимающее значение true тогда и только тогда, когда точка с координатами (x, y) принадлежит первой четверти, включая и оси координат, или третьей четверти, не включая оси координат.
Решение. (x>=0) = = (y>=0).
5.Пусть 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 была единица.
6. Определить результат. 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 таких чисел понадобится мас-
37
сив из 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);
38
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"); |
}}
9.Пусть 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.Записать следующее логическое выражение, используя логические операции и не используя сравнение логических величин:
a)!((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.
39
Нарисовать область плоскости, в которой и только в которой записанное логическое выражение истинно.
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, хранится следующая двоичная последовательность:
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.
40
25. Решить задачу распаковки информации, обратную задаче упаковки (см. 7), т. е. вывести на экран исходные числа массива из указанного диапазона в предположении, что они были упакованы. Варианты диапа-
зона чисел: a) 0, 1; б) 0, 1, 2, 3; в) 0, 1, 2, ..., 7; г) 0, 1, 2, …, 15.
9.МАТРИЦЫ (ДВУХМЕРНЫЕ МАССИВЫ)
1.Составить следующие функции для работы с матрицей: ввод матрицы; вывод; сортировка строк матрицы по возрастанию значений k-го столбца; транспонирование матрицы с сохранением результата на новом месте; умножение исходной рассортированной матрицы на транспонированную; головную функцию для проверки этих функций.
const int n2=3;
void INP1(double x[][n2] , int ); void OUT1(double x[][n2], int ); void SORT1(double x[][n2], int , int );
void TRANS(double x[][n2], double y[][n2], int );
void MULT(double x[][n2], double y[][n2], double z[][n2], int );
int main() |
|
|
|
|
{ const int size=3; |
int k; |
|
|
|
double a[size][n2],b[size][n2],c[size][n2]; |
INP1(a,size); |
|
||
cout<<"\nOld matrix\n"; |
OUT1(a,size); |
|
||
cout <<"\nInput the number of collumn for sorting =>"; |
|
|||
while(1) |
|
// Ввод номера столбца с проверкой правильности ввода |
||
{ cin>>k; |
|
|
|
|
if (k>=0 && k<n2) break; |
|
|
||
cout<<"k>=0 && k<"<<n2<<" Repeat "; |
|
|||
} |
|
|
|
|
SORT1(a,size,k); |
cout<<"\nMatrix after sorting\n"; |
OUT1(a,size); |
||
TRANS(a,b,size); |
cout<<"\nTrans matrix \n"; |
OUT1(b,size); |
||
MULT(a,b,c,size); |
cout<<"\nMultiplication \n"; |
OUT1(c,size); |
||
getch(); |
return 0; |
|
|
}
void TRANS(double x[][n2], double y[][n2], int n)
{for(int i=0; i<n; i++) for(int j=0; j<n2; j++)
y[i][j]=x[j][i];
}
void MULT(double x[][n2], double y[][n2], double z[][n2], int n) { int l, i, j, s;
for (i=0; i<n; i++) for ( j=0; j<n2; j++) { s=0;
for (l=0; l<n2; l++)
41
s+=x[i][l]*y[l][j];
z[i][j]=s;
}
}
void SORT1(double x[][n2], int n, int k) { int i,j,m,mn,N;
for (m=0;m<n-1;m++)
{ mn=x[m][k]; N=m; for (i=m+1;i<n;i++) if (x[i][k]<mn)
{ mn=x[i][k]; N=i;
}
for(j=0;j<n2;j++)
{ double t; t=x[m][j]; x[m][j]=x[N][j]; x[N][j]=t;
}
}
}
void OUT1(double x[][n2], int n)
{int X,j,Y=wherey();
for (int i=0; i<n; i++, Y++)
for (X=1, j=0; j<n2; j++, X+=7) { gotoxy(X,Y);
cout<<x[i][j];
}
cout<<endl;
}
void INP1(double x[][n2],int n)
{ int Y=1,X; |
|
for (int i=0; i<n; |
i++) |
{ Y++; |
X=-14; |
for (int j=0; j<n2; j++) |
|
{ X+=16; |
gotoxy(X,Y); |
cout<<"a["<<i<<","<<j<<"]"<<" "; cin>>x[i][j];
}
}
}
2. Составить класс для работы с целочисленной матрицей, включив в него матрицу, конкретные текущие размерности и следующие методы: конструктор для ввода и проверки текущих размерностей матрицы; ввод матрицы; вывод матрицы; поиск наибольшего и наименьшего значений матрицы и номеров строк, где они находятся; перестановка двух строк
42