- •1. Рабочая программа курса “методы программирования ”
- •Литература
- •2. Разветвляющиеся алгоритмы.
- •Циклические алгоритмы
- •Одномерные массивы (векторы)
- •Функции с одним результатом
- •Функции типа void.
- •7. Введение в объектно-ориентированное программирование
- •8. Простые типы данных
- •9. Матрицы (двухмерные массивы)
- •Сборник задач по программированию
- •Учебно-методическое пособие для студентов специальностей g 31 03 01 “Математика”, g 31 03 03 “Механика”
- •220050, Минск, проспект Франциска Скорины, 4.
- •220030, Минск, ул. Красноармейская, 6.
7. Введение в объектно-ориентированное программирование
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. Составить класс для работы с одномерным массивом максимальной размерности 20, предусмотрев следующие функции (методы):
-
конструктор для проверки и задания размерности массива и определения с помощью датчика случайных чисел элементов массива. Если размерность массива неположительная или больше 20, то работаем с массивом размерности 10.
Замечание: эффективнее формировать динамический массив, который будет рассмотрен во второй части пособия (во втором семестре);
-
вывод массива разным цветом для положительных и отрицательных чисел;
-
отображение чисел с помощью символа ‘*’ на числовой оси;
-
сортировка массива с использованием упрощенного варианта алгоритма. Замечание: в пункте 5 приведен другой, более эффективный алгоритм;
-
вычисление среднеарифметического значения среди отрицательных и среди положительных чисел массива.
class clarr
{ int a[20];
int n;
public:
clarr (int);
void out(int ,int );
void show(int ,int );
void aver(double &,double &);
void sort();
};
clarr::clarr(int size)
{ if (size>20 || size<1) size=10;
n=size; randomize();
for(int i=0; i<n; i++)
a[i]=150-random(300);
};
void clarr::out(int c1,int c2)
{ cout<<endl;
for(int i=0; i<n; i++)
{ if(a[i]<0) textcolor(c1);
else textcolor(c2);
cprintf(" %d ",a[i]);
}
cout<<endl;
};
void clarr::show(int c1,int c2)
{ int k; textcolor(3);
for(int i=1;i<80;i++)
{ gotoxy(i,12);
if (i!=40)
cprintf("%c", 196);
else printf("%c", 197);
}
for(int i=0;i<n;i++)
{ k=40+a[i]/4;
gotoxy ( k,12);
if(a[i]<0)
textcolor(c1);
else textcolor(c2);
cprintf("*");
};
};
void clarr::aver(double &r1,
double &r2)
{ int k1=0, k2=0, s1=0, s2=0;
for (int i=0; i<n; i++)
if(a[i]>0)
{ k1++;
s1=s1+a[i];
} else
if(a[i]<0)
{ k2++;
s2=s2+a[i];
} ;
if (k1) r1=s1/k1;
else r1=0;
if (k2) r2=s2/k2;
else r2=0;
};
void clarr::sort()
{ for(int i=0; i<n-1; i++)
for(int j=i+1; j<n; j++)
if(a[i]>a[j])
{ int r;
r=a[i];
a[i]=a[j];
a[j]=r;
}
};
// (продолжение вверху правого столбца)
int main()
{ int k, col1=4,col2=2; clrscr();
cout<< "Size of array "; cin>>k;
clrscr(); clarr ob(k);
cout<<" Array is not sorted";
ob.out(4,2);
ob.sort(); cout<<"\n Sorted array";
ob.out(4,2); ob.show( col1, col2); //or ob.show(4,2);
double sr1,sr2; ob.aver(sr1,sr2);
textcolor(col1);
if (sr2) cprintf("\n\r\n\r Average of negative = %10.3f",sr2);
else cprintf("\n\r\n\r There are not negative elements");
textcolor(col2);
if (sr1) cprintf(" Average of positive =%10.3f\n",sr1);
else cprintf(" There are not positive elements");
getch(); return 0;
};
5. Рассортировать заданный массив точек по возрастанию расстояния до начала координат. Если расстояния одинаковы, то вначале должны быть точки заданной области, а затем – точки, не принадлежащие области. Область ограничена параболой 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 Continue --- press any key\n";
getch(); OBJ.MyOut();
getch(); return 0;
}
Функции MyPoint и RR имеют атрибут доступа private по умолчанию. Они доступны, как и поля, только в функциях этого класса и недоступны в других функциях. Например, из функции main их вызвать нельзя.
Массивы передаются с помощью конструктора через параметры. Определяются массивы в головной функции во время объявления. Здесь их можно ввести или задать с помощью датчика случайных чисел.
6. В предложенном варианте программы 4 цвета передаются в качестве параметров функций out и show. Можно предложить второй вариант: включаем цвета в класс в качестве двух дополнительных полей наряду с массивом и его размерностью. Тогда функции out и show будут без параметров, а конкретные цвета передаются c помощью конструктора, как это сделано для размерности массива. Изменить программу 4.
-
Составить класс для работы с одним целым числом. Кроме конструктора предусмотреть следующие методы:
-
вывод числа в разреженном виде, т. е. между каждой десятичной цифрой должен быть один пробел;
-
вывод числа в двоичной системе счисления;
-
вывод числа в 16-й системе счисления.
В функции main проверить эти методы.
-
Составить класс для работы с комплексными числами, включив в него два вещественных числа, которые определяют вещественную и мнимую части. Предусмотреть конструктор с двумя параметрами, метод для вывода комплексного числа в общепринятом виде, метод для сложения двух комплексных чисел, метод для умножения двух комплексных чисел. В последних двух методах один операнд берется из класса, а второй передается как два параметра метода.
Замечание. Методы типа сложение двух комплексных чисел профессионально программируются с помощью перегрузки операций, которая изучается в 3-м семестре.
-
Составить класс для работы с рациональными дробями. Класс содержит в качестве полей два целых числа: числитель и знаменатель. В конструкторе с двумя параметрами предусмотреть проверку знаменателя на нуль. Разработать следующие методы: вывод дроби в виде ; сокращение дроби, например ; сложение двух дробей; деление двух дробей. В последних двух методах один операнд берется из класса, а второй передается как два параметра метода.
10. Составить класс для работы с моментами времени внутри одних суток. Класс содержит в качестве полей три целых числа: час, минута и секунда. В конструкторе с тремя параметрами выполнить проверку корректности момента времени. Предусмотреть некоторые из следующих методов:
-
вывод момента времени, который будет через S секунд, если S передается как параметр метода. Величина S меньше количества оставшихся до конца суток секунд;
-
определение количества секунд, прошедших с начала суток:
-
вывод момента времени, который был на S секунд раньше, если S передается как параметр метода. Величина S меньше количества прошедших после начала суток секунд;
-
определение количества секунд между двумя моментами времени. Один из них берется из класса, а второй передается как три параметра метода.
11. Составить класс для работы с датами внутри одного года. Класс содержит в качестве полей два целых числа: число и номер месяца. В конструкторе с двумя параметрами выполнить проверку корректности даты. Предусмотреть некоторые из следующих методов:
-
вывод даты следующего дня;
-
получение номера дня недели для заданной даты и вывод его названия (понедельник, вторник …). Считать, что задано, в какой день недели было первое число указанного месяца;
-
вывод даты предыдущего дня;
-
определение количества дней, прошедших с начала года;
-
определение даты, которая будет через D дней, если D передается как параметр метода. Величина D меньше количества оставшихся до конца года дней;
-
определение количества дней между двумя датами. Одна из них берется из класса, а вторая дата передается как два параметра метода.
12. Решить задачу 11, учитывая и год, т. е. класс должен содержать три целых числа: число, номер месяца и год.
13. Составить класс для работы с большими целыми числами, для которых вещественный тип неприемлем, а типа long недостаточно. Для хранения такого числа предлагается использовать одномерный массив, каждый элемент которого представляет собой одну десятичную цифру числа. Поэтому класс содержит массив и его размерность, т. е. количество цифр числа. Во всех вариантах предусмотреть конструктор, ввод и вывод массива цифр и следующие методы в зависимости от вариантов:
a) увеличение числа на единицу; вычитание двух больших чисел, т. е. вычитание двух массивов по правилу вычитания “в столбик”;
б) уменьшение числа на единицу; сложение двух больших чисел, т. е. сложение двух массивов по правилу сложения “в столбик”;
в) умножение двух больших чисел по правилу умножения “в столбик”;
г) сравнение двух больших чисел;
Замечание В методах для реализации операций вычитания, сложения, умножения и сравнения двух больших чисел один массив (число) берется из класса, а другой массив (число) передается через параметр метода.
д) е) ж) сложение (вычитание, умножение) большого числа (массива) с обычным целым числом. Большое число (массив) берем из класса, а обычное, представленное как число типа long, передается как параметр метода. В алгоритме реализации таких методов необходимо предусмотреть выделение из обычного числа типа long цифр и их использование.
14. Решить задачи из раздела 6, составив и используя соответствующие классы.