5, 7, 8Гр. 1-го курса ммф, у которых выч. Практика проводится не по программированию.
Лабораторные занятия (34/34 час, экзамен).
1-е задание: 1-я (например, для студентов с нечётными номерами в списке) или 3-я (для студентов с чётными номерами в списке) лабораторные работы.
2-е задание: 2-я + 9-я лабораторные работы. То есть сначала делаем без файлов (2-я лаб. раб.), а затем это же задание выполняем с текстовым файлом (9-я лаб раб.).
3-е задание: 4-я (например, для студентов с нечётными номерами в списке) или 5-я (для студентов с чётными номерами в списке) лабораторные работы.
4-е задание: 6-я + 10-я лабораторные работы. То есть сначала делаем без файлов(6-я лаб. раб.), а затем это же задание из 6-й лаб. раб. с файлом (см. требования к 10-й лаб. раб.).
5-е задание: 7-я лабораторная работа.
6-е задание: 8-я лабораторная работа.
7-е задание: 11-я лабораторная работа.
8-е задание: 12-я лабораторная работа.
9-е задание: 13-я лабораторная работа.
Вычислительную практику проводят кафедра дифференциальных уравнений (5 гр.) и кафедра теоретической и прикладной механики (7 гр.)
4 ,7, 8 гр. 1-го курса ММФ, у которых выч. практика проводится по программированию на языке С++.
Лабораторные занятия (34 час, зачёт)
1-е задание: 1-я лаб. работа. Связь указателей и одномерных массивов. Динамический одномерный массив.
2-е задание: 2-я лаб. работа. Работа со строками.
3-е задание: 5-я лаб. работа. Динамические матрицы.
4-е задание: 6-я лаб. работа. Структуры.
5-е задание: 7-я лаб. работа. Объединения, поля битов.
6-е задание: 8-я лаб. работа. Списки.
7-е задание: 11-я лаб. работа. Файлы в математических задачах.
8-е задание: 12-я лаб. работа. Указатели на функции.
9-е задание: 13-я лаб. работа. Рекурсия.
Вычислительная практика (18час в первом семестре + 18 час 2-й сем, общий диф. зачёт с оценкой)
1-е задание: 3-я лаб. работа. Связь указателей и статических матриц.
2-е задание: 4-я лаб. работа. Массив указателей на строки.
3-е задание: 9-я лаб. работа. Текстовые файлы.
4-е задание: 10-я лаб. работа. Файлы в экономических задачах.
Лабораторная работа 1
Темы. Связь указателей и одномерных массивов. Динамический одномерный массив.
Требования и общие указания к заданиям:
-
разработать класс для работы с одним или несколькими одномерными динамическими массивами, предусмотрев конструктор, деструктор, методы для ввода, вывода массива и в зависимости от варианта один или несколько методов для обработки массивов. По усмотрению преподавателя в класс можно включить методы, реализующие задачи из нескольких вариантов;
-
предусмотреть цветной вывод результатов. Например, в задаче B.2 все пары точек с одинаковым максимальным расстоянием между ними вывести другим цветом;
-
при работе с массивами использовать указатели. При этом должны быть приведены различные (не менее трёх) способы организации циклов с использованием указателей (см. 4.1, 4.2, 4.3);
-
результаты из функций возвращать с помощью указателей;
-
множество точек плоскости задать своими координатами в виде двух динамических массивов x[n] и y[n], где (xi, yi ) — координаты iй точки. Аналогично множество точек в пространстве задать своими координатами в виде трёх динамических массивов x[n] , y[n] и z[n], где (xi, yi, zi ) — координаты iй точки. Напомним, что n — не обязательно константа, а может быть и переменной, являющейся полем класса.
П р и м е р.
const Nmax=20;
/* Наибольшая размерность массива, которая используется в конструк-торе для контроля передаваемой в класс размерности. */
class DinArr
{
/* Реальная размерность массива в виде переменной, а не константы. */
unsigned n;
/*Объявляем указатель на динамический массив. */
float *DA;
/* Метод для перестановки двух чисел. Можно использовать только внутри класса, так как по умолчанию атрибут доступа private. В качестве формальных параметров используем указатели на вещественные числа. (Подробности см. далее в 3.1 гл. 2.) */
void Change(float *x, float* y)
{ float t; t=*x; *x=*y; *y=t;};
public:
DinArr(int size)
{ /* Во время выполнения (а не компиляции) программы при объявле-нии объекта (при его создании) вызывается этот конструктор. С его помощью определяем размерность массива n с элементарным контролем. С помощью операции new резервируем память для n элементов массива и адрес начала этой выделенной области памяти присваиваем переменной-указателю DA. */
if (size<1 || size>Nmax) n=Nmax / 2; else n=size;
DA=new float [n];
}
// Метод для ввода массива.
void MyDef()
{ for(int i=0; i<n; i++)
cin>>(*(DA+i));
}
// Вывод массива.
void Show()
{ cout<<endl;
float *p;
for(p=DA; p<=DA+n-1; p++)
printf("%5.2f ", *p);
cout<<endl; }
/* Булевская функция, возвращающая true или false в зависимости от то-го, является ли массив "симметричным" относительно "центра" */
bool Simm()
{
for (int i=0;i<n/2; i++)
if (DA[i]-DA[n-1-i]) return false;
return true;
}
/* Метод, который "переворачивает" массив, т.е. меняет местами пер-вый элемент с последним, второй с предпоследним и т. д. */
void Rev()
{
for (int i=0;i<n/2; i++)
Change(&DA[i], &DA[n-1-i]);
}
void MyMax(float *M, unsigned *Nm) ;
/* Деструктор освобождает память, выделенную для динамического массива. Вызывается автоматически при удалении объекта ObjArr. В нашем примере это происходит, когда завершается выполнение функции main().*/
~DinArr()
{
/* Выводим текст, чтобы убедиться, что деструктор выполнялся. */
cout<<"\nThe destructor deletes array\n" ;
getch();
/* Освобождаем память, выделенную для динамического массива. */
delete []DA;
}
} ;
void DinArr::MyMax(float *M, unsigned *Nm)
{
*M=*DA; //*M=DA[0];
*Nm=0;
float *p=DA+1; unsigned i;
for( i=1; i<n; i++, p++)
if (*p>*M)
{
*M=*p;
*Nm=i;
}
}
int main(int argc, char* argv[])
{
// randomize; DinArr ObjArr(random(Nmax)); или
// DinArr ObjArr(6); или
unsigned MyN;
cout<<"size="; cin>>MyN;
DinArr ObjArr(MyN);
ObjArr.MyDef();
ObjArr.Show();
/* Если массив симметричный, выводим "Yes !", в противном случае "переворачиваем" массив и выводим изменённый массив. */
if (ObjArr.Simm()) cout<<"Yes !";
else { ObjArr.Rev();
ObjArr.Show();
}
// Variant 1 поиска наибольшего элемента и его номера
float Max; unsigned NMax;
ObjArr.MyMax(&Max, &NMax);
cout<<"\nVariant 1 Max="<<Max<<" -- DA["<< NMax<<"]";
// Variant 2 поиска наибольшего элемента и его номера (с указателями)
float *PMax=new float;
unsigned *PNMax=new unsigned;
ObjArr.MyMax(PMax, PNMax);
cout<<"\nVariant 2 Max="<<(*PMax)<<" -- DA["<< (*PNMax)<<"]";
getch(); return 0;
}
Варианты заданий
A. Задачи первого, простого уровня
-
Даны координаты n заводов потребителей сырья и координаты одного места добычи сырья. Найдите расстояния от места добычи сырья до каждого завода, среднее арифметическое этих расстояний, максимальное расстояние и соответствующие ему номера заводов потребителей.
-
Найдите периметр многоугольника, заданного координатами вершин на плоскости.
-
Многоугольник задан координатами своих вершин. Определите, находится ли точка с заданными координатами на одной из сторон многоугольника.
-
N треугольников плоскости заданы длинами своих сторон. Найдите треугольник максимальной площади.
-
N треугольников плоскости заданы длинами своих сторон. В каждом треугольнике найти наименьшую из трёх сторон. Среди этих наименьших сторон найти наибольшую и длины сторон соответствующего треугольника.
-
В заданном множестве точек плоскости найти количество точек, которые не попали в круг заданного радиуса с заданным центром. Вывести координаты таких точек.
-
В заданном множестве точек плоскости найти количество точек в каждой из четвертей.
-
В заданном множестве точек плоскости найти количество точек, находящихся внутри кольца, ограниченного окружностями с общим центром, радиусы которых r и R (r < R).
-
В заданном множестве точек плоскости найти все точки, расстояние от которых до заданной точки наименьшее.
-
Дан массив A, состоящий из n элементов. Сформируйте «сглаженный» массив, заменив в исходном все элементы, кроме крайних, по формуле:
-
При сглаживании используются лишь старые значения элементов массива. Изменённый массив оставить на старом месте.
-
Дан массив целых чисел. Есть ли среди них общий делитель? Есть ли среди них общее кратное?
B. Задачи второго, среднего уровня
-
На плоскости задано N точек своими координатами. Найти среди них такую, сумма расстояний от которой до остальных минимальна.
-
В множестве точек на плоскости найти все пары точек с одинаковым максимальным расстоянием между ними.
-
Найти расстояние между двумя заданными множествами точек на плоскости, то есть расстояние между наиболее близко расположенными точками этих множеств.
-
Найти площадь многоугольника, заданного перечислением координат вершин в порядке обхода его границы.
-
Среди заданного множества точек в трёхмерном пространстве M найти такую точку, что шар заданного радиуса с центром в этой точке содержит максимальное количество точек из M.
-
В заданном множестве точек на плоскости выбрать такие три различные точки, чтобы была минимальной разность между количествами точек, лежащих внутри и вне треугольника с вершинами в выбранных точках.
-
Выбрать три точки заданного на плоскости множества точек, составляющие треугольник наибольшего периметра.
-
Многоугольник задан координатами своих вершин. Определите, является ли данный многоугольник выпуклым.
-
Многоугольник задан координатами своих вершин. Найдите площадь этого многоугольника.
-
Заданные точки плоскости рассортировать по возрастанию расстояния от начала координат. Для сортировки использовать алгоритм выбора минимального элемента.
-
Найти значение многочлена с заданными в виде массива коэффициентами, вычисляя и суммируя значения одночленов.
-
Найти значение многочлена с заданными в виде массива коэффициентами, используя схему Горнера.
-
Сложить два многочлена заданных различных степеней, если коэффициенты хранятся в массивах. Все три полинома вывести на экран в удобном для просмотра виде (коэффициенты, равные 1 или –1, не выводить; не выводить одночлен с нулевым коэффициентом и т. п.).
-
В одномерном массиве найти количество различных элементов.
-
Известно, что в массиве размерности N могут быть только целые числа из диапазона 1..31. Рассортировать эти числа по частоте встречаемости, используя алгоритм обмена.
-
Сложить два больших целых числа по правилу сложения “в столбик”. Для таких чисел вещественный тип неприемлем, а типа long int недостаточно, так как в числе больше 10 цифр. Для хранения такого числа предлагается использовать одномерный массив, каждый элемент которого представляет собой одну десятичную цифру числа.
C. Задачи повышенной сложности
-
На плоскости заданы множество точек P и множество прямых L. Найти две такие различные точки из P, что проходящая через них прямая параллельна наибольшему количеству прямых из L.
-
Среди треугольников с вершинами в заданном множестве точек на плоскости найти такой, стороны которого содержат максимальное количество точек заданного множества.
-
Из заданного множества точек на плоскости выбрать две различные точки так, чтобы разность между количествами точек, лежащих по разные стороны прямой, проходящей через эти две точки, была наименьшей.
-
Задано множество прямых на плоскости (коэффициентами своих уравнений). Найти координаты и количество точек пересечения этих прямых. Если в точке пересекается более двух прямых, такую точку считать как одну.
-
Заданы два множества точек на плоскости. Построить пересечение и разность этих множеств.
-
На плоскости заданы множество точек P и множество окружностей S. Найти две такие различные точки из P, что проходящая через них прямая пересекается с максимальным количеством окружностей из S.
-
На плоскости заданы множество точек P и точка d вне его. Найти количество различных троек точек a, b, c из P таких, что четырёхугольник abcd является параллелограмом.
-
Умножить два полинома заданных различных степеней (не обязательно одинаковых), если коэффициенты хранятся в массивах. Все три полинома вывести на экран в удобном для просмотра виде (коэффициенты, равные 1 или –1, не выводить; не выводить одночлен с нулевым коэффициентом и т. п.).
-
На плоскости задано множество из N точек. Найти такой выпуклый многоугольник, построенный на вершинах из заданного множества, чтобы все точки лежали внутри этого многоугольника. Вывести соответствующее сообщение, если такой многоугольник построить невозможно.
-
На плоскости задано множество точек. Выделить из этих точек вершины квадрата, на сторонах которого лежит наибольшее количество заданных точек.
-
Все элементы целочисленного массива, представляющие собой совершенные числа (равные сумме своих делителей), переписать в начало массива, сохраняя их порядок, а остальные элементы — в конец. Новый массив не формировать.
-
Изменить заданный одномерный массив, чтобы в начале стояли все нулевые элементы, затем – отрицательные, а в конце – положительные элементы последовательности. При этом начальный порядок отрицательных (аналогично и положительных) элементов должен быть сохранён. Новый массив не формировать.
-
Из двух заданных упорядоченных числовых массивов размерности n и m получить новый упорядоченный массив размерности n+m, не используя алгоритма сортировки.
-
В одномерном массиве найти k-й максимальный элемент. Предусмотреть случай, когда такого элемента не существует.
-
Умножить два больших целых числа по правилу умножения “в столбик”. Для таких чисел вещественный тип неприемлем, а типа long int недостаточно, так как в числе больше 10 цифр. Для хранения такого числа предлагается использовать одномерный массив, каждый элемент которого представляет собой одну десятичную цифру числа.
Лабораторная работа 2
Тема. Работа со строками.
Требования и общие указания к заданиям:
1) Обрабатываемый в программе текст должен содержать несколько строк. Но массив строк не формировать, то есть в оперативной памяти хранить одну обрабатываемую строку. Оперативную память резервируем для одной строки. Вводим строку, анализируем её и на её место вводим новую строку (см. прим. 3).
2) В задачах выделения и анализа слов возможны следующие уровни сложности:
-
первый, самый простой уровень, предполагает, что слова разделены одним пробелом (6 баллов);
-
задачи незначительно усложняются, если предположить, что между словами может быть несколько пробелов (7 баллов);
-
в задачах следующего уровня предполагается, что между словами может быть любое количество не обязательно одинаковых разделителей. Например, слова могут быть разделены тремя точками (многоточием), после которых следует пробел, или скобкой, запятой и пробелом, как это имеет место в нашем предложении, и т. п. (9 баллов);
-
и, наконец, алгоритм и программа ещё более усложняются, если предположить, что слова могут переноситься с одной строки текста на другую строку (10 баллов).
В скобках указано наибольшее количество баллов, на которое можно оценить своевременно выполненное задание среднего уровня сложности (B), в зависимости от требований к тексту.
3) Предусмотреть цветной вывод исходного или преобразованного текста. Например, в задаче B10 слова максимальной длины вывести другим цветом.
4) Cложность задач и их оценка зависят также от того, учитывать ли то, что записано в квадратных скобках условия задачи. Рекомендуется вначале написать и отладить программу для более простого условия, а затем её усложнить.
Варианты заданий
A. Задачи первого, простого уровня
-
В английском тексте найти общее количество гласных букв.
-
В тексте найти общее количество символов-разделителей.
-
В тексте найти общее количество цифр.
-
Найти номер строки, в которой больше всего цифр.
-
Сколько раз в каждой строке встречается заданная десятичная цифра?
-
Из заданного текста выбрать те символы, которые встречаются в нём ровно один раз. Вывести их в том же порядке, как они были в тексте.
-
Из текста удалить заданный символ, каждый раз сдвигая оставшуюся часть каждой строки “влево”.
-
Сколько в тексте вопросительных, восклицательных и утвердительных предложений?
B. Задачи второго, среднего уровня
Посимвольный анализ текста.
-
Проверить, соблюдается ли в тексте баланс круглых скобок. Для каждой открывающей скобки ‘(‘ должна быть найдена соответствующая закрывающая ‘)’.
-
Проверить наличие в тексте одного из знаков разделителей (‘.’ , ‘?’, ‘!’) перед каждой большой русской буквой.
-
В тексте найти символ (один, любой), который встречается чаще других.
-
В каждой строке текста найти символ[ы], который встречается наименьшее количество раз.
-
В строке найти все английские буквы, которые встречаются чаще других. [Различия между прописными и строчными буквами не делать]. Другие символы (русские буквы, разделители, цифры и т. д.) не учитываются. Результат вывести в виде строчных букв. Например, в строке “ABCD abc 123123123111 xyz ABCDEFaB x” такими символами являются ‘a’, ‘b’, ‘c’, которые без учёта регистра повторяются три раза.
-
Символы строки вывести по возрастанию частоты их встречаемости в строке. [Символы, встречающиеся одинаковое количество раз, должны располагаться по возрастанию их кодов].
-
Найти и вывести номера строк текста, в которых встречается заданная подстрока и количество её повторений.
Выделение и анализ слов. Как и в предыдущих задачах, массив строк не формируем.
-
Напечатать квитанцию об оплате за телеграмму, если стоимость одного слова задана.
-
В тексте найти количество слов, начинающихся и заканчивающихся гласной русской буквой.
-
В тексте найти и вывести [без повторений] все слова максимальной длины, не формируя массива слов.
-
Какие из букв встречаются в одном слове строки? [Какие из букв встречаются в К словах?]
-
Есть ли символ, который встречается во всех словах строки?
-
Сколько раз повторяется в тексте каждое слово, которое встречается в нём?
-
В тексте найти одну пару [все пары] слов, из которых одно является обращением другого (например, “abcd” и “dcba”).
-
В тексте найти все слова палиндромы, которые одинаково читаются слева направо и справа налево (шалаш, поп и т. п.).
Преобразование текста.
-
В тексте одно введённое слово заменить другим словом, которое также вводится с экрана. При выводе исходной и изменённой строки старое и новое слово выделить другим цветом.
-
Первую букву каждого слова поменять на прописную букву. При выводе выделить её другим цветом.
-
После каждого слова текста, заканчивающегося заданной подстрокой, вставить указанный символ.
-
Из текста удалить все слова заданной длины.
-
Из каждой строки текста удалить всю оставшуюся после символов “//” часть.
С. Задачи повышенной сложности.
Обработка элементов текста программы на языке С++ как последовательности строк символов.
-
Определить, является ли заданная последовательность символов идентификатором.
-
Если заданная последовательность символов является константой целого типа, присвоить её значение переменной такого же типа. Учесть, что константу можно записать как в десятичной, так и в шестнадцатеричной системах счисления.
-
Если заданная последовательность символов является константой вещественного типа, присвоить её значение переменной такого же типа. Учесть, что константу можно записать как в форме с фиксированной точкой (25.01), так и в экспоненциальной форме (2.3E-5).
-
Найти и вывести переменные в следующем порядке: сначала типа int, затем float и, наконец, char.
-
Правильно ли объявлен одномерный числовой массив фиксированной размерности? Учесть, что в качестве размерности может быть явно записанная или определённая предварительно с помощью ключевого слова const целочисленная константа.
-
Правильно ли объявлен двумерный массив?
-
Пусть в выражении используются простые переменные, явно записанные константы целого типа и одна из арифметических операций ( +, -, * или /). Есть ли синтаксические ошибки в выражении?
-
Пусть одной простой переменной присваивается значение другой простой переменной. Есть ли ошибки?
-
Проверить, есть ли синтаксические ошибки в “операторе” вывода cout, который выводит текст и значения простых переменных.
-
Проверить, есть ли синтаксические ошибки в “операторе” ввода cin, который вводит значения элементов одномерного массива.
-
Есть ли синтаксические ошибки в заголовке оператора цикла for?
-
В синтаксически правильной программе найти номера строк, в которых встречается заданный идентификатор. В комментариях после символов “//” [и между символами “/*” и “*/” ] идентификатор не учитывается.
-
В синтаксически правильной программе найти номера строк, в которых встречается заданный оператор. В комментариях после символов “//” [и между символами “/*” и “*/” ] оператор не учитывается.
-
Пусть в сокращённой форме оператора if в случае истинности выполняется простое присваивание одной целочисленной переменной значения другой такой переменной. В логическом выражении после if используется только одна операция сравнения. Есть ли ошибки в таком операторе if?
-
Проверить правильность расстановки скобок “{” и ”}”. Считать, что в комментариях и в строковых константах эти символы не используются.
-
Проверить правильность расстановки символов “/*” и “*/” для комментариев в фрагменте программы на языке С++.
Лабораторная работа 3
Тема. Связь указателей и статических матриц.
Требования и общие указания к заданиям:
-
разработать класс для работы с одной или несколькими матрицами, размерности которых — константы, предусмотрев конструктор, методы для ввода, вывода массива и в зависимости от варианта один или несколько методов для обработки матриц. По усмотрению преподавателя в класс можно включить методы, реализующие задачи из нескольких вариантов;
-
предусмотреть цветной вывод результатов. Например, в задачах А.6 — А.9 элементы матрицы из заштрихованной области вывести другим цветом;
-
при работе с матрицами надо обязательно использовать указатели. При этом должны быть приведены различные (не менее трёх) способы организации циклов с использованием указателей (см. 4.1, 4.2, 4.3);
-
результаты из функций необходимо возвращать с помощью указателей, а не с помощью ссылочного типа. Функции, отличные от типа void, не использовать;
-
для перестановки строк матрицы, если их надо выполнять по условию задачи, использовать указатели.
П р и м е р (+). Составить класс для работы с целочисленной матрицей, включив в него матрицу, конкретные текущие размерности и следующие методы: конструктор для ввода и проверки текущих размерностей матрицы; ввод матрицы; вывод матрицы; поиск наибольшего и наименьшего значений матрицы, номера одной строки, где находится максимальный и номера одной строки, где находится минимальный элементы всей матрицы; цветной вывод матрицы, в результате которого все элементы найденных в предыдущей функции строк при выводе выделяются другими цветами. В функции main ввести размерности матрицы, создать объект и проверить составленные методы.
const n1max=10, n2max=10;
class ClMatr
{ int a[n1max][n2max], n1, n2;
public:
ClMatr(int size1=5, int size2=3)
{ if (size1>0 && size1<n1max)
n1=size1; else n1=5;
if (size2>0 && size2<n2max)
n2=size2; else n2=3;
}
void MyInp();
void MyOut();
void MaxMin(int *, int *, int *, int *);
void MyColorOut(unsigned, unsigned,unsigned, unsigned, unsigned);
};
void ClMatr::MyInp()
{ int x, y=1;
for (int i=0; i<n1; i++)
{ y++; x=-14;
for (int j=0; j<n2; j++)
{ x+=16; gotoxy(x,y);
cout<<"a["<<i<<","<<j<<"]"<<" ";
scanf("%d", a[i]+j);
} } };
void ClMatr::MyOut()
{ int x, y=wherey()+1; int *p1, *p2 ;
for (p1=a[0]; p1<=a[n1-1]; p1+=n2max, y++)
for (x=1, p2=p1; p2<p1+n2; p2++, x+=5)
{
gotoxy(x,y);
printf("%5d", *p2);
}
cout<<endl;
}
void ClMatr::MyColorOut(unsigned i1, unsigned i2,
unsigned col1, unsigned col2, unsigned col3)
{ int x,i=0, y=wherey()+1; int *p1, *p2 ;
for (p1=a[0]; p1<=a[n1-1]; p1+=n2max, y++, i++)
{ if (i==i1) textcolor( col1); else if (i==i2) textcolor(col2);
else textcolor(col3);
for (x=1, p2=p1; p2<p1+n2; p2++, x+=5)
{ gotoxy(x,y); cprintf("%5d", *p2);
}
}
cout<<endl;
}
void ClMatr::MaxMin(int *max, int *Nmax, int *min, int *Nmin)
{ *max=*min=a[0][0]; *Nmax=*Nmin=0;
for (int i=0;i<n1;i++)
for (int j=0;j<n2;j++)
{ int el=*(a[0]+n2max*i+j);
if (*max<el) { *max=el; *Nmax=i; }
else if (*min>el)
{ *min=el; *Nmin=i;
} } }
int main()
{ int n1, n2, Nmax, Nmin, max, min; clrscr();
cout<<"\nn1="; cin>>n1; cout<<" n2="; cin>>n2;
ClMatr ob(n1,n2); clrscr();
ob.MyInp(); cout<<endl; ob.MyOut();
ob.MaxMin(&max,&Nmax,&min,&Nmin);
textcolor(10);
cprintf("Max element=%d in %d row\r\n",max , Nmax+1 );
textcolor(11);
cprintf("Min element=%d in %d row\r\n",min , Nmin+1 );
if (Nmax!=Nmin)
ob.MyColorOut(Nmax, Nmin, 10,11, 15);
getch(); return 0; }
Варианты заданий.