Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Аленский. лекции по проге.doc
Скачиваний:
19
Добавлен:
11.11.2018
Размер:
1.35 Mб
Скачать

Задачи и упражнения.

1. Составить класс для работы с двумя целыми числами. Предусмотреть конструктор, методы для вывода двух чисел, вычисления их суммы, вычисления произведения этих же чисел. В головной функции ввести два числа, создать объект, вычислить и вывести их сумму и произведение. Все методы оформить как внешние.

class firstB

{ int a, b; // поля класса с атрибутом доступа private (частный)

public: // атрибут доступа public для методов

firstB(int, int ); // заголовок конструктора с двумя параметрами

void show(); // заголовки остальных функций

long sum();

long mult();

};

firstB:: firstB(int u, int v)

{ a=u; b=v; // текст конструктора

};

// тексты остальных функций, оформленных как внешние

void firstB:: show()

{ cout<<"\nThe first number= "; cout<<a;

cout<<", the second number= "; cout<<b; cout<<endl;

};

long firstB:: sum()

{return a+b;

} ;

long firstB:: mult()

{ return a*b;

};

int main()

{ int A, B; cout<<"A= "; cin>>A; cout<<"B="; cin>>B;

firstB ob (A, B); // создание объекта и передача ему введенных A и B,

// или можно в объект передать константы: firstB ob(5,4);

ob.show(); // вызов метода show

/* Вариант 1: полученные с помощью методов результаты (сумму и произведение), как и для обычных функций, сохраняем в переменных, а затем используем, т. е. выводим.*/

long S, M; S=ob.sum(); M=ob.mult();

cout<<" \nВариант 1: сумма= "<<S<< " произведение= "<<M<<endl;

/* Вариант 2: результаты методов сразу выводим, не сохраняя их в переменных */

cout<<"\nВариант2 :сумма= "<<ob.sum()<<

" произведение= "<<ob.mult();

getch(); return 0;

};

2. Составить класс для работы с двумя целыми числами, предусмотрев вычисление и вывод их суммы и произведения со следующими отличиями, по сравнению с предыдущей программой:

  • один и тот же метод и вычисляет, и выводит сумму двух чисел с определенной, указанной в методе, позиции окна. Поэтому этот метод не имеет параметров;

  • метод вычисляет и выводит произведение, но позиция вывода передается как параметр метода при ее вызове;

  • вывод осуществляется разными цветами, которые, как и исходные числа, являются полями класса. Числа и цвета передаются с помощью конструктора, который поэтому имеет четыре поля;

  • все методы встроенные.

class first

{ int a, b, c1, c2;

public:

first(int x, int y, int s1, int s2)

{ a=x; b=y;

c1=s1; c2=s2;

};

void sum()

{textcolor(c1); gotoxy(5,2);

printf("x=%d y=%d sum=%d\n", a, b, a+b);

} ;

void mult(int x, int y)

{ textcolor(c2); gotoxy(x,y);

cprintf("x=%d y=%d mult=%d\n", a, b, a*b);

};

};

int main()

{ first ob (4,5,4,2); ob.sum();

ob.mult(10,6); getch(); return 0;

};

3. Составить класс для работы с одномерным массивом максимальной размерности 10, предусмотрев следующие методы:

  • конструктор для проверки и задания размерности массива. Если размерность массива неположительная или больше 10, то работаем с массивом размерности 10;

  • ввод массива;

  • поиск первого по порядку положительного числа и его индекса.

const nmax=10;

class clarray1

{ int x[nmax]; int n;

public:

clarray1(int v=7)

{ n=v; if (n<1 || n>nmax) n=nmax; };

void myinput()

{ cout<<"Input the array"<<endl;

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

cin>>x[i];

};

void myfun (int &first, int &ind)

{ for (int i=0; i<n;i++)

if (x[i]>0) { first=x[i]; ind=i;

return;

}

first=-10; ind=-1;

};

};

int main()

{ clrscr(); clarray1 OBJ;

OBJ.myinput(); int F2,I2; OBJ.myfun( F2,I2);

if (F2!=-10)

cout<<" The first positive number= "<<F2<<

" , his index= "<<I2<<endl;

else cout<<" There is not positive number\n";

getch(); return 0;

}

В методе MyInput массив вводим с экрана. Его можно было бы определить и другим способом, например, с помощью датчика случайных чисел.

Размерность массива в конструкторе является параметром по умолчанию. Это означает следующее. При создании объекта можно не передавать размерность, тогда она останется равной 7, т. е. той, которая указана в заголовке функции. Если в головной функции записать, например, clarray OBJ(5), то в объекте, как и раньше, будем работать с массивом размерности 5, которую передали, т. е. параметр по умолчанию 7 изменится.

4. Рассортировать заданный массив точек по возрастанию расстояния до начала координат. Если расстояния одинаковы, то вначале должны быть точки заданной области, а затем — точки, не принадлежащие области. Область ограничена параболой y = x2 и прямой y=2.

Составим следующие методы:

  • MyInp для ввода координат точек;

        • MyPoint для определения расстояния от точки до начала координат и принадлежности точки указанной области;

        • ArrPoint для построения массива расстояний и логического массива, определяющего принадлежность каждой точки области;

        • RR для перестановки двух величин. Эта функция дважды перегружена для вещественного и логического типов;

        • MySort для сортировки массива с использованием функций RR;

        • MyOut для вывода координат точек.

const nmax=10;

class clCoord

{ float x[nmax], y[nmax], d[nmax]; bool b[nmax]; int n;

void MyPoint(float x1, float y1, float &d1, bool &b1)

{ d1=sqrt(x1*x1 + y1*y1); b1= y1>=x1*x1 && y1<2;

};

void RR(float &u, float &v)

{ float t; t=u; u=v; v=t; } ;

void RR(bool &u, bool &v)

{ bool t; t=u; u=v; v=t; };

public:

clCoord (int , float [], float []); void ArrPoint();

void MySORT(); void MyOut();

};

clCoord::clCoord (int m, float u[], float v[])

{ n=m; if (n>nmax || n<1) n=nmax;

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

{ x[i]=u[i]; y[i]=v[i];

}

} ;

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 Press any key\n";

getch(); OBJ.MyOut();

getch(); return 0;

}

Функции MyPoint и RR имеют атрибут доступа private по умолчанию. Они доступны, как и поля, только в функциях этого класса и недоступны в других функциях. Например, из функции main их вызвать нельзя.

Массивы передаются с помощью конструктора через параметры. Определяются массивы в головной функции во время объявления. Здесь их можно ввести или задать с помощью датчика случайных чисел.

5. В предложенном варианте программы четыре цвета передаются в качестве параметров функций out и show. Можно предложить второй вариант: включаем цвета в класс в качестве двух дополнительных полей наряду с массивом и его размерностью. Тогда функции out и show будут без параметров, а конкретные цвета передаются c помощью конструктора, как это сделано для размерности массива. Изменить программу 4.

6. Составить класс для работы с одним целым числом. Кроме конструктора предусмотреть следующие методы:

  1. вывод числа в разреженном виде, т. е. между каждой десятичной цифрой должен быть один пробел;

  2. вывод числа в двоичной системе счисления;

  3. вывод числа в шестнадцатеричной системе счисления.

В функции main проверить эти методы.

  1. Составить класс для работы с рациональными дробями. Класс содержит в качестве полей два целых числа: числитель и знаменатель. В конструкторе с двумя параметрами предусмотреть проверку знаменателя на нуль. Разработать следующие методы: вывод дроби в виде ; сокращение дроби, например, ; сложение двух дробей; деление двух дробей. В последних двух методах один операнд берется из класса, а второй передается как два параметра метода.

  2. Составить класс для работы с моментами времени внутри одних суток. Класс содержит в качестве полей три целых числа: час, минута и секунда. В конструкторе с тремя параметрами выполнить проверку корректности момента времени. Предусмотреть некоторые из следующих методов:

  1. вывод момента времени, который будет через S секунд, если S передается как параметр метода. Величина S меньше количества оставшихся до конца суток секунд;

  2. определение количества секунд, прошедших с начала суток:

  3. вывод момента времени, который был на S секунд раньше, если S передается как параметр метода. Величина S меньше количества прошедших после начала суток секунд;

  4. определение количества секунд между двумя моментами времени. Один из них берется из класса, а второй передается как три параметра метода.

9. Составить класс для работы с датами внутри одного года. Класс содержит в качестве полей два целых числа: число и номер месяца. В конструкторе с двумя параметрами выполнить проверку корректности даты. Предусмотреть некоторые из следующих методов:

  1. вывод даты следующего дня;

  2. получение номера дня недели для заданной даты и вывод его названия (понедельник, вторник …). Считать, что задано, в какой день недели было первое число указанного месяца;

  3. вывод даты предыдущего дня;

  4. определение количества дней, прошедших с начала года;

  5. определение даты, которая будет через D дней, если D передается как параметр метода. Величина D меньше количества оставшихся до конца года дней;

  6. определение количества дней между двумя датами. Одна из них берется из класса, а вторая дата передается как два параметра метода.

10. Решить задачу 9, учитывая и год, т. е. класс должен содержать три целых числа: число, номер месяца и год.

11. Составить класс для работы с большими целыми числами, для которых вещественный тип неприемлем, а типа long недостаточно. Для хранения такого числа предлагается использовать одномерный массив, каждый элемент которого представляет собой одну десятичную цифру числа. Поэтому класс содержит массив и его размерность, т. е. количество цифр числа. Во всех вариантах предусмотреть конструктор, ввод и вывод массива цифр и следующие методы в зависимости от вариантов:

    1. увеличение числа на единицу; вычитание двух больших чисел, т. е. вычитание двух массивов по правилу вычитания “в столбик”;

    2. уменьшение числа на единицу; сложение двух больших чисел, т. е. сложение двух массивов по правилу сложения “в столбик”;

    3. умножение двух больших чисел по правилу умножения “в столбик”;

    4. сравнение двух больших чисел;

Замечание. В методах для реализации операций вычитания, сложения, умножения и сравнения двух больших чисел один массив (число) берется из класса, а другой массив (число) передается через параметр метода.

5), 6), 7) сложение (вычитание, умножение) большого числа (массива) с обычным целым числом. Большое число (массив) берем из класса, а обычное, представленное как число типа long, передается как параметр метода. В алгоритме реализации таких методов необходимо предусмотреть выделение из обычного числа типа long цифр и их использование.

12. Решить задачи из гл. 2, составив и используя соответствующие классы.