Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

zadachi

.pdf
Скачиваний:
14
Добавлен:
31.05.2015
Размер:
694.99 Кб
Скачать

void 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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]