Lab2Sem

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 cin>>(*(DA+i));
}
// Вывод массива.
void Show()
{ cout< float *p;
for(p=DA; p<=DA+n-1; p++)
printf("%5.2f ", *p);
cout</* Булевская функция, возвращающая true или false в зависимости от то-го, является ли массив "симметричным" относительно "центра" */
bool Simm()
{
for (int i=0;i if (DA[i]-DA[n-1-i]) return false;
return true;
}
/* Метод, который "переворачивает" массив, т.е. меняет местами пер-вый элемент с последним, второй с предпоследним и т. д. */
void Rev()
{
for (int i=0;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 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="< // 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 элементов. Сформируйте «сглаженный» массив, заменив в исходном все элементы, кроме крайних, по формуле:
13EMBED Equation.31415
При сглаживании используются лишь старые значения элементов массива. Изменённый массив оставить на старом месте.
Дан массив целых чисел. Есть ли среди них общий делитель? Есть ли среди них общее кратное?

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(in
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·Варианты заданий.
Задачи первого, простого уровня
Найти произведение вектор-строки (одномерного массива) на матрицу.
Найти норму заданной матрицы следующим образом. В каждой строке находим сумму модулей всех элементов. Среди этих сумм определяем максимальную сумму.
Определить, является ли матрица симметричной относительно главной диагонали.
Определить, есть ли в матрице хотя бы одна строка, состоящая только из нулевых элементов. Если есть, найти номер последней такой строки.
Даны две действительные квадратные матрицы одинакового порядка n. Получить новую матрицу путем умножения элементов каждой строки первой матрицы на наибольшее из значений элементов соответствующей строки второй матрицы.
Найти минимальное значение элементов квадратной матрицы, расположенных в закрашенной части, включая и диагональные элементы, на рис.1.
Найти сумму положительных элементов, расположенных в закрашенной части матрицы, не включая диагональные элементы, на рис. 2.
Найти произведение ненулевых элементов, расположенных в закрашенной части матрицы, включая диагональные элементы, на рис. 3.
Найти количество ненулевых элементов, расположенных в закрашенной части матрицы, не включая диагональные элементы, на рис. 4.





Рис. 1. Рис. 2. Рис. 3. Рис. 4.
В квадратной матрице найти разность между наибольшим и наименьшим значениями побочной диагонали.
Найти номера всех максимальных элементов главной диагонали квадратной матрицы.

В. Задачи второго, среднего уровня
Найти максимальное из чисел, встречающихся в матрице более одного раза.
Седловой точкой матрицы назовём такой элемент, который является одновременно максимальным в столбце и минимальным в строке. Найти одну, любую седловую точку заданной матрицы.
Для заданной квадратной матрицы найти такие k, что к-я строка совпадает с к-м столбцом.
Найти максимальный среди всех элементов тех строк заданной матрицы, которые упорядочены (либо по возрастанию, либо по убыванию).
Элемент матрицы называется локальным минимумом, если он строго меньше всех имеющихся у него соседей. Найти количество локальных минимумов заданной матрицы.
Выполнить операцию сглаживания для заданной матрицы, в результате которой получается новая матрица того же размера, каждый элемент которой вычисляется как среднеарифметическое имеющихся соседей соответствующего элемента исходной матрицы.
Если в заданной матрице нет нулей, то заменить повторяющиеся элементы матрицы нулями и найти количество ненулевых, то есть неповторяющихся элементов. В противном случае матрицу оставить без изменения. Память для новой матрицы не резервировать.
Расстояние между k-й и m-й строками матрицы a определяется как 13 EMBED Equation.3 1415, где n2 количество элементов в строке матрицы. Указать номер строки, максимально удаленной от первой строки заданной матрицы.
Найти строку заданной матрицы, в которой длина максимальной серии упорядоченных по возрастанию элементов минимальна.
Взаимно однозначное отображение элементов матрицы на себя можно задать с помощью двух целочисленных матриц: в первой указываем номер строки, куда переходит данный элемент, а во второй – номер столбца. Построить две матрицы, задающие отражение каждого элемента исходной матрицы на симметричный ему элемент относительно главной диагонали.
Изменяя порядок следования строк, рассортировать матрицу по возрастанию первых элементов строк. Элементы каждой строки должны остаться без изменений в том же порядке, в котором были до сортировки. Использовать сортировку выбором.
Изменяя порядок следования строк, рассортировать матрицу по возрастанию количества нулей в строках. Элементы каждой строки должны остаться без изменений в том же порядке, в котором были до сортировки. Использовать сортировку выбором.
Изменяя порядок следования строк, рассортировать матрицу по возрастанию суммы модулей элементов строк. Элементы каждой строки должны остаться без изменений в том же порядке, в котором были до сортировки. Использовать сортировку обменом (алгоритм “пузырька”).
Изменяя порядок следования строк, рассортировать матрицу по возрастанию наименьших элементов строк. Элементы каждой строки должны остаться без изменений в том же порядке, в котором были до сортировки. Использовать сортировку обменом (алгоритм “пузырька”).
Получить действительную матрицу B, каждый элемент bij  которой равен сумме элементов исходной матрицы, расположенных в закрашенной области, определяемой индексами i, j, на рис. 5.
Получить действительную матрицу В, каждый элемент bij  которой равен сумме элементов исходной матрицы, расположенных в закрашенной области, определяемой индексами i, j, на рис. 6.
Получить действительную матрицу В, каждый элемент bij  которой равен сумме элементов исходной матрицы, расположенных в закрашенной области, определяемой индексами i, j, на рис. 7.



Рис. 5. Рис. 6. Рис. 7.
C. Задачи повышенной сложности
Для заданной квадратной целочисленной матрицы найти максимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы.
Для заданной квадратной целочисленной матрицы найти максимум среди сумм элементов диагоналей, параллельных побочной диагонали.
Две строки целочисленной матрицы назовём похожими, если совпадают множества чисел, встречающихся в этих строках. Найти количество строк в максимальном множестве попарно непохожих строк заданной матрицы, расположенных подряд.
Найти количество строк заданной матрицы размерности 5*10, являющихся перестановкой чисел 1, 2, ..., 10.
Изменяя порядок следования строк, рассортировать целочисленную матрицу по возрастанию количества симметричных чисел в строке. Элементы каждой строки должны остаться без изменений в том же порядке, в котором были до сортировки. Использовать сортировку вставками.
Изменяя порядок следования строк, рассортировать целочисленную матрицу по возрастанию максимальной длины серии упорядоченных по возрастанию элементов строки. Элементы каждой строки должны остаться без изменений в том же порядке, в котором были до сортировки. Использовать сортировку слиянием.
По матрице A построить матрицу B того же размера, где элемент bij определяется следующим образом. Через aij проведем в A линии, параллельные сторонам прямоугольника до пересечения с побочной диагональю; bij определяется как максимум среди элементов треугольника в А (рис. 8).
По матрице А построить матрицу В того же размера, где bij определяется следующим образом. Через aij проведем в A диагонали, параллельные главной и побочной диагоналям; bij определяется как максимум в закрашенной части матрицы А (рис. 9).



Рис. 8. Рис. 9.
Найти сумму элементов, расположенных в закрашенной части квадратной матрицы на рис. 10.
Найти произведение ненулевых элементов, расположенных в закрашенной части квадратной матрицы на рис. 11.




Рис. 10. Рис. 11.
Начиная с центра, обойти по спирали по часовой стрелке все элементы квадратной матрицы, распечатывая их в порядке обхода.
Начиная с центра, обойти по спирали против часовой стрелки все элементы квадратной матрицы, распечатывая их в порядке обхода.
Заполнить квадратную матрицу размерности n*n по спирали по часовой стрелке числами 1, 2, 3, ,n*n, начиная с элемента, находящегося в верхнем левом углу.
Получить квадратную матрицу порядка n, элементами которой являются заданные действительные числа а1, ..., аnn, расположенные в ней по схеме, которая приведена на рис. 12.



Рис. 12.

Лабораторная работа 4

Тема. Массив указателей на строки.
Требования и общие указания к заданиям:
задания выполнить двумя способами:
создать статический массив строк как статический массив указателей на строки (см. § 3);
создать динамический массив строк как динамический массив указателей на строки (см. § 5).

Варианты заданий

B. Задачи второго, среднего уровня
В вариантах с чётными номерами использовать сортировку обменом, в вариантах с нечётными номерами сортировку выбором.
Рассортировать слова русского текста по возрастанию отношения количества гласных букв к общему количеству букв в слове.
Вывести слова русского текста в алфавитном порядке по первой букве. Слова, начинающиеся с новой буквы, выводить с красной строки.
Слова английского текста, начинающиеся с гласных букв, рассортировать в алфавитном порядке по первой согласной букве слова. Остальные слова в сортировке не должны участвовать.
Слова английского текста рассортировать по возрастанию количества заданной буквы в слове. Слова с одинаковым количеством такой буквы расположить в алфавитном порядке.
Слова английского текста рассортировать по возрастанию количества гласных букв в слове. Слова с одинаковым количеством таких букв расположить в алфавитном порядке первой по порядку гласной буквы.
Ввести текст и список слов. Для каждого слова из заданного списка найти, сколько раз оно встречается в тексте. Рассортировать эти слова по возрастанию найденного количества.
Список студентов (фамилия, имя, отчество) рассортировать в алфавитном порядке сначала по первой букве фамилии, затем, если они совпадают, по первой букве имени и, наконец, по первой букве отчества.
Список студентов (фамилия, имя, отчество) рассортировать в алфавитном порядке сначала по первой букве имени, затем по возрастанию количества букв в имени.
Все имена из заданного списка студентов рассортировать по частоте их встречаемости в этом списке.
Список студентов (фамилия, имя, отчество) рассортировать в алфавитном порядке сначала по первой букве имени, затем, если они совпадают, по возрастанию количества букв в фамилии.
Список студентов (фамилия, имя, отчество) рассортировать в алфавитном порядке сначала по двум первым буквам фамилии, затем, если первые две буквы фамилии одинаковы, по возрастанию количества букв в фамилии.
Создать массив строк и соответствующий ему массив числовых параметров. Рассортировать строки по числовому параметру. Для одинаковых числовых параметров сортировать по алфавиту.

С. Задачи повышенной сложности
Решить те же (см уровень B) задачи, используя в вариантах с чётными номерами сортировку вставками, а в вариантах с нечётными номерами сортировку простым слиянием.

Лабораторная работа 5

Тема. Динамические матрицы.
Требования и общие указания к заданиям:
разработать класс для работы с одной или несколькими матрицами, размерности которых являются полями класса (см. лаб. работу 1). В конструкторе создать динамическую матрицу, а в деструкторе освободить память. Предусмотреть методы для ввода, вывода динамической матрицы и в зависимости от варианта один или несколько методов для её обработки. По усмотрению преподавателя в класс можно включить методы, реализующие задачи из нескольких вариантов;
предусмотреть цветной вывод результатов;
там, где это можно, желательно использовать указатели для организации циклов. Но при этом надо учитывать, что строки динамической матрицы в памяти располагаются не рядом;
перестановки строк матрицы выполнять с помощью указателей.

П р и м е р 1 (+). Сортировка строк целочисленной динамической матрицы по возрастанию максимальных элементов строк. Порядок чисел в каждой строке не меняется.
/* Прототип функции для вывода матрицы D и вектора максимальных элементов строк S. */
void Myprint (int **D, int *S, int, int);
int main()
{
// 1) Объявление и создание динамической матрицы.
int n, m; int **d; randomize();
n=random(5)+2; m=random(5)+2;
d=new int*[n];
for(int i=0;i /* 2) Получение элементов динамической матрицы случайным образом. */
for(int i=0;i for(int j=0;j d[i][j]=random(15)-6;
/* 3) Построение динамического одномерного массива максимальных элементов строк s. Его размерность соответствует количеству строк матрицы. */
int *s,Mymax,Mymin,nmin;
s=new int[n];
for(int i=0;i { Mymax=d[i][0];
for(int j=0;j if (d[i][j]>Mymax) Mymax=d[i][j];
s[i]=Mymax;
}
// 4) Вывод нерассортированной матрицы и вектора.
Myprint(d,s,n,m) ;
// 5) Сортировка.
for(int start=0;start<=n-2;start++)
{
/* Начиная с элемента s[start], находим наименьший элемент Mymin и его номер nmin */
Mymin=s[start]; nmin=start;
for(int i=start;i if(s[i] { Mymin=s[i]; nmin=i; }
/* Переставляем адреса строк матрицы с номерами start и nmin. Эле менты этих строк остаются на старых местах. */
int *p; p=d[start]; d[start]=d[nmin]; d[nmin]=p;
/* Переставляем элементы одномерного массива с номерами start и nmin. */
int t; t=s[start]; s[start]=s[nmin]; s[nmin]=t;
}
// 6) Вывод рассортированной матрицы и вектора.
Myprint(d,s,n,m) ;
getch(); return 0;
}
/* Функция для вывода матрицы D и вектора S. */
void Myprint (int **D, int *S, int N, int M)
{for(int i=0;i { printf("\n");
for(int j=0;j printf("%5d",D[i][j]);
printf(" => %5d",S[i]);
}
printf("\n");
}

П р и м е р 2(+). Создание динамической ”матрицы”. В первой строке резервируем память для одного элемента, во второй строке – для двух и т. д. Другими словами, создаём в памяти нижний треугольник квадратной “матрицы” относительно главной диагонали.
int main()
{
/* Объявляем и вводим только одну размерность квадратной “матрицы”. */
int n1; cout<<"Size1=>";
cin>>n1;
int **arr;
arr= new int*[n1];
for (int i=0;i arr[i]=new int[i+1];
/* В i-й строке резервируем память для (i+1) элемента. Дальше работаем, как с обычной матрицей. Например, в каждой строке находим среднее значение элементов, находящихся “левее ” главной диагонали. */
float s;
for (int i=0; i { s=0;
/* Внутренний цикл с помощью указателя и номера элемента (см. § 6 гл. 2). */
for (int *q=arr[i], j=0; q< arr[i]+i+1; q++, j++)
{ *q=(i+1)*(j+1);
s+=*q;
cout.width(6);
cout<< (*q);
}
/* или внутренний цикл с помощью индекса
for (int j=0;j { arr[i][j]=(i+1)*(j+1);
s+=arr[i][j];
cout.width(6);
cout< } */
/* В этой же строке экрана курсор переводим в позицию с номером (n1+1)*6. */
gotoxy((n1+1)*6, wherey());
cout<<"Average=> "< }
/* Удаляем динамическую матрицу так, как в предыдущем примере: */
for (int i=0;i delete[]arr[i];
delete[]arr;
getch(); return 0;
}

П р и м е р 3 (+). Создание динамической “матрицы” с различным количеством элементов в строках. В каждой строке резервируем память для количества элементов, которое вводим с экрана.
int main()
{ int n1; cout<<"Size1=>"; cin>>n1; // Количество строк
/*Объявление и создание динамического одномерного массива, в котором будут храниться количество элементов в каждой строке. */
int *arr_of_size;
arr_of_size=new int[n1];
cout<<"Input the size of each row";
for (int i=0;i>arr_of_size[i];
// Объявление и создание динамической матрицы.
int **arr;
arr= new int*[n1];
for (int i=0;i arr[i]=new int[arr_of_size[i]];
/* Количество элементов каждой строки берём из одномерного динамического массива. */
float s;
for (int i=0; i { s=0;
for (int j=0;j {
arr[i][j]=(i+1)*(j+1);
s+=arr[i][j];
cout.width(6);
cout< }
gotoxy((arr_of_size[i]+1)*6, wherey());
if (arr_of_size[i]==0)
cout<<"No elements";
else
cout<<"Average=> "< }
//Удаляем матрицу.
for (int i=0;i delete[]arr[i];
delete[]arr;
// Удаляем динамический одномерный массив.
delete []arr_of_size;
getch(); return 0;
}



Варианты заданий

A. Задачи первого, простого уровня
Можно использовать любой алгоритм сортировки.
Рассортировать строки динамической матрицы с одинаковым количеством элементов в каждой строке по наибольшему элементу строки.
Рассортировать строки динамической матрицы с одинаковым количеством элементов в каждой строке по убыванию количества чисел, принадлежащих отрезку [a, b], где a, b – одинаковые для каждой строки, a<=b.
Из динамической квадратной матрицы размерности n*n получить одномерный динамический массив, который содержит наименьшие элементы строк.
В динамической матрице с одинаковым количеством элементов в каждой строке получить номера строк, элементы каждой из которых образуют монотонно убывающую последовательность.
В динамической матрице с одинаковым количеством элементов в каждой строке получить номера строк, все элементы которых четны.
В динамической матрице с одинаковым количеством элементов в каждой строке есть только единицы и нули. Найти количество нулевых строк, то есть строк, в которых все нули.
В динамической матрице с одинаковым количеством элементов в каждой строке есть только единицы и нули. Найти количество строк, в которых есть хотя бы один нуль.
Найти норму заданной динамической матрицы А с одинаковым количеством элементов в каждой строке, определенную как 13 EMBED Equation.3 1415.
Создать нижний относительно главной диагонали треугольник динамической квадратной матрицы. Найти наибольший и наименьший элементы этого треугольника.
Создать верхний относительно главной диагонали треугольник динамической квадратной матрицы. Найти сумму всех элементов этого треугольника.

Задачи второго, среднего уровня
Можно использовать любой алгоритм сортировки.
Рассортировать строки динамической матрицы с одинаковым количеством элементов в каждой строке по i-му наименьшему элементу строки, где i – номер строки.
Рассортировать строки динамической матрицы с одинаковым количеством элементов в каждой строке по количеству простых чисел.
Среди наименьших элементов динамической матрицы с одинаковым количеством элементов в каждой строке найти наибольший.
Сколько различных чисел в каждой строке динамической матрицы с одинаковым количеством элементов в каждой строке?
Пусть строки динамической матрицы с одинаковым количеством элементов в каждой строке рассортированы по возрастанию. Найти числа, которые встречаются во всех строках.
Создать нижний относительно главной диагонали треугольник динамической квадратной матрицы. Рассортировать строки матрицы по возрастанию наибольших элементов строк.
Создать верхний относительно главной диагонали треугольник динамической квадратной матрицы. Рассортировать строки матрицы по возрастанию последних элементов строк.
Создать нижний относительно побочной диагонали треугольник динамической квадратной матрицы. Рассортировать строки матрицы по возрастанию первых элементов строк.
Создать верхний относительно побочной диагонали треугольник динамической квадратной матрицы. Рассортировать строки матрицы по возрастанию их средних значений.
Строки динамической матрицы с разным количеством элементов в строках рассортировать по возрастанию их сумм, а если суммы одинаковы, то сортировать по убыванию их средних значений.
Строки динамической матрицы с разным количеством элементов в строках рассортировать по возрастанию наибольшего элемента строки, который не повторяется.
Создать динамическую матрицу с разным количеством текущих оценок в строках. Рассортировать строки следующим образом: сначала должны быть строки с оценками отличников (9, 10), затем те, в которых наименьшая оценка >=6 (хорошисты) и т.д.
Найти поэлементную сумму двух симметрических относительно главной диагонали квадратных матриц. Для каждой симметричной матрицы в памяти создать её верхний или нижний относительно главной диагонали треугольник.
Найти поэлементную разность двух симметрических относительно побочной диагонали квадратных матриц. Для каждой симметрической матрицы в памяти создать её верхний или нижний относительно побочной диагонали треугольник.

С. Задачи повышенной сложности
Численные методы линейной алгебры.
Найти произведение двух симметрических относительно главной диагонали квадратных матриц. Для каждой симметрической матрицы в памяти создать её верхний или нижний относительно главной диагонали треугольник.
Найти поэлементную разность двух симметрических относительно побочной диагонали квадратных матриц. Для каждой симметрической матрицы в памяти создать её верхний или нижний относительно побочной диагонали треугольник.
Создать динамическую матрицу с разным количеством текущих оценок в строках. Рассортировать строки, в которых нет 1, 2, или 3, по их среднему значению. Строки, в которых есть плохие оценки, в сортировке не должны участвовать.
Методом Гаусса решить систему n линейных алгебраических уравнений c n неизвестными. Создать и использовать динамическую матрицу и динамический одномерный массив.
Методом Гаусса, используя схему выбора главного элемента, решить систему n линейных алгебраических уравнений c n неизвестными. Создать и использовать динамическую матрицу и динамический одномерный массив.
Обратить динамическую квадратную матрицу по схеме единственного деления.
Вычислить определитель динамической квадратной матрицы, используя метод Гаусса.
Методом простой итерации решить систему n линейных алгебраических уравнений c n неизвестными. Создать и использовать динамическую матрицу и динамический одномерный массив.
Методом Зейделя решить систему n линейных алгебраических уравнений c n неизвестными. Создать и использовать динамическую матрицу и динамический одномерный массив.
Найти собственные числа и собственные векторы матрицы методом непосредственного вычисления определителя.
Методом итераций найти наибольшее по модулю собственное значение и соответствующий ему собственный вектор динамической матрицы.


Лабораторная работа 6

Тема. Cтруктуры.
Требования и общие указания к заданиям:
Одно и то же задание выполнить двумя способами:
использовать статический массив в структуре и статический массив структур (см. прим. 1). При этом количество структур (в примере количество студентов (n)) и количество элементов массива в структуре (в примере количество оценок для одного студента (m) ) константы;
задание выполнить с помощью динамических массивов (прим. 2). Для этого:
в структуре объявить и создать динамический массив (в примере 2 Points);
размерность этого массива включить в структуру в качестве одного из полей (в примере 2 переменная n);
создать динамический массив структур (в примере 2 arrs);
Как в первом, так и во втором вариантах составить и использовать функции, параметром которых является указатель на структуру или ссылка на структуру.

П р и м е р 1 (+). Сформировать статический массив структур, каждый элемент которого (каждая структура) содержит следующие три поля:
фамилия, имя отчество (вводим);
массив оценок фиксированной размерности, который также вводим;
средний балл (вычисляем).
Для каждого студента найти средний балл и рассортировать массив структур по этому полю.
const m=4;
// Количество оценок у одного студента.
struct tstr // Объявляем тип структуры.
{ char name[20] ; // Фамилия, имя , отчество.
int a[m] ; // Массив оценок.
float s ; // Средний балл.
} ;
// Ввод массива структур.
void MyInp ( tstr x[], int,int );
// Вывод массива структур.
void MyOut ( tstr x[], int );
// Сортировка массива структур.
void MySort ( tstr x[], int );
/* Нахождение среднего значения в числовом массиве z (в целочисленном одномерном массиве, а не в массиве структур). */
float MyAver ( int z[], int );
int main()
{ const n=3;
/* Количество студентов, т. е. количество элементов массива структур. */
tstr ars[n]; // Статический массив структур (n константа).
int i,j;
clrscr(); MyInp(ars,n,2);
/* Для каждого студента находим средний балл, т. е. для i–й структуры ars[i] вычисляем поле s. Для этого используем функцию MyAver.*/
for (i=0;i ars[i].s=MyAver( ars[i].a,m);
cout<<" \n Before of sorting\n";
MyOut(ars,n); MySort(ars,n);
cout<<"\nAfter of sorting\n"; MyOut(ars,n);
getch(); return 0;
};
/* Ввод массива структур, т. е. фамилий и оценок всех (size) студентов. Ввод начинается со строки экрана с номером y0. */
void MyInp(tstr x[],int size, int y0)
{ int i,j, y,
coord1; // Номер позиции в строке.
y=y0;
for (i=0;i /* i – номер элемента массива структур (номер студента). */
{ gotoxy(2,y);
cout<<"Name ";
cin>> (x[i].name);
cout<<"Ocenki "< y++;
for (j=0, coord1=8; j // j – номер оценки одного студента.
// Цикл для ввода одной j–й оценки i–го студента с контролем ввода.
{ while(1)
{ gotoxy(coord1,y);
cin>>x[i].a[j];
if (x[i].a[j]>0 && x[i].a[j]<=10)
break;
else { gotoxy(coord1,y);
// “Стираем” неверно введённую оценку.
cout<<" ";
}
}
}
y++;
}
};
/* Сортировка массива структур. Подробный анализ алгоритма смотри в 1-м семестре [1]. */
void MySort ( tstr x[], int size)
{ int i,j,k,flag; tstr T;
k=size;
do { k--;
flag=0;
for (i=0; i if (x[i].s < x[i+1].s)
{
/* Перестановка i–го и (i+1)–го элемента массива структур. */
T=x[i];
x[i]=x[i+1];
x[i+1]=T;
flag=1;
}
}
while (flag);
} ;
/* Вывод массива структур, т. е. выводим информацию обо всех студентах. */
void MyOut (tstr x[], int size)
{ int i,j,coord1; cout<< endl;
for (i=0;i·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·П р и м е р 2(+). Показано, как работать с динамическим массивом структур и динамическим массивом в структуре. Сформировать динамический массив многоугольников на плоскости. Количество сторон каждого из них различно и является полем структуры. Для каждого из многоугольников найти периметр и определить его тип в зависимости от количества сторон (треугольник, четырёхугольник, пятиугольник и остальные).
/*Структурный тип для определения декартовых координат одной точки плоскости. */
struct Point1
{float x,y;
};
/*Структурный тип для определения одного многоугольника плоскости. */
struct ttr
{
char *type; // Строка для названия.
unsigned n; // Количество вершин.
/* Указатель на динамический массив структур, т. е. массив точек одного многоугольника. Каждая точка имеет две координаты. Поэтому используется вложенная структура Point1, содержащая эти две координаты. */
Point1 *Points;
float per; // Периметр многоугольника.
};
/* Функция вычисляет периметр одного многоугольника, имеющего size вершин. В неё передаём указатель на динамический массив структур, т.е. массив точек одного многоугольника. Каждый элемент этого массива имеет тип Point1, т. е. содержит два числа (две координаты точки). */
float MyPer(Point1 *P, int size)
{ float Len=0;
/*В цикле находим сумму длин сторон, соединяющих 0–ю точку с 1–й, 1–ю со 2–й и т. д., (size-2)–ю точку с (size-1)–й. */
for(int j=0; j Len+= sqrt((P[j].x-P[j+1].x)*(P[j].x-P[j+1].x)+
(P[j].y-P[j+1].y)*(P[j].y-P[j+1].y) );
/* Вне цикла добавляем длину стороны, соединяющей 0–ю точку с (size-1)–й точкой. */
return Len+sqrt((P[0].x-P[size-1].x)*(P[0].x-P[size-1].x)+
(P[0].y-P[size-1].y)*(P[0].y-P[size-1].y) );
}
/* Функция получает поля одной структуры типа ttr, т. е. информацию об одном многоугольнике, кроме периметра. Периметр будет найден вызовом из main функции MyPer. Так как структура является результатом функции, то в качестве параметра объявлен указатель на неё.*/
void MyDef (ttr *Str, int size)
{ cout< char t[40];
/* t вспомогательная строка для названия многоугольника. В зависимости от количества вершин (size) формируем русско-латинское название многоугольника. При этом предусмотрены четыре варианта. */
switch (size)
{case 3: strcpy(t,"Triangle"); break;
case 4: strcpy(t,"Chetirexygolnic");break;
case 5: strcpy(t,"Pjatyygolnic"); break;
default: strcpy(t,"Other");
}
/* Динамически создаём строку type, длина которой берётся из вспомогательной строки t. Используем операцию “->”(стрелка), потому что Str указатель на структуру, а не потому, что type и Points указатели. */
Str->type=new char [strlen(t)];
strcpy(Str->type, t);
/* Создаём динамический массив структур внутри структуры Str. То есть определяем массив точек одного многоугольника размером size. */
Str->Points=new Point1[size];
for (int i=0; i { Str->Points[i].x= float(random (5)-2);
Str->Points[i].y= float(random (5)-2);
}
/* Использовали операцию “–>”, потому что Str указатель, а операцию “.”, потому что Points[i] это не указатель, а i–й элемент вложенного динамического массива структур. Указателем является Points, в котором хранится адрес начала этого массива.*/
}
/* Функция для вывода полей одной структуры, то есть информации об одном многоугольнике. Для экономии памяти в качестве параметра используем указатель на структуру, несмотря на то, что в этой функции структуру мы не меняем. */
void MyShow (ttr *Str,
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·// Количество вершин многоугольника.
clrscr();
/* Объявляем и создаём указатель на одну структуру типа ttr, в котором будет храниться информация об одном многоугольнике. */
ttr *S; S=new ttr;
MyDef ( S, m);
/* Так как в функциях MyDef и MyShow в качестве формального параметра используется указатель на структуру (ttr *Str), то в качестве фактического параметра передаём указатель на структуру такого же типа. Так как объявлен указатель (ttr*S;), а не просто структура (ttr S;), то при вызове функции в скобках записали просто S. */
S->per=MyPer(S->Points, m);
/* Так как в функции MyPer в качестве формального параметра используется указатель на структуру типа Point1 (Point1 *P), то в качестве фактического параметра передаём указатель на структуру такого же типа. После выполнения функции MyDef в структуре, адрес которой в S, будет создан динамический массив Points. Адрес начала этого массива S->Points и передаём в функцию. */
MyShow(S, m);
/* Вывели сформированную с помощью функций MyDef и MyPer структуру, адрес которой в S.*/
int n=4,i;
/*Создаём динамичечский массив структур типа ttr размерности n, то есть n m–угольников. */
ttr *arrs=new ttr[n];
for(i=0;i { cout<<"\n i="< Q=Q->next; // Переход на следующий элемент.
}
cout << endl;
};
void clsp::DEL(int &numdel)
{ tsp *T, *Q; numdel=0;
// Запоминаем количество элементов до удаления
int n2; n2=n;
/* При удалении должны ссылаться на элемент, предшествующий тому, который сначала проверяем на предмет удаления, а затем, возможно, удаляем. */
Q=P;
cout << " Deleted elements : "<< endl;
while ( Q->next )
if (Q->next->num < 0)
{ n--;
numdel++;
// Удаление элемента.
T=Q->next;
Q->next=Q->next->next;
T->next=NULL;
cout << T->num << " " ;
// Освобождаем память удалённого элемента.
delete T;
}
else
/* На следующий элемент списка переходим только в случае, если элемент не удаляли. Если бы перешли на следующий элемент и после удаления, то элемент, находящийся после удалённого, не проверялся бы и, значит, никогда не удалялся бы. */
Q=Q->next;
if (numdel==n2) cout <<"\n We deleted all elements" ;
};
void clsp::INS()
{ tsp *Q, *T;
/* Так как в начале списка размещается фиктивный элемент, то переходим на второй, то есть на первый реальный элемент. После фиктивного элемента никогда не вставляем. */
Q=P->next;
while (Q)
if (! (Q->num % 2))
{ n++;
// Выделяем память для вставляемого элемента.
T=new tsp;
/* Получаем информационную часть вставляемого элемента. */
T->num=Q->num*10;
/* Вставляем его, то есть “соединяем ” со следующим */
T->next=Q->next;
/* и предыдущим элементом. */
Q->next=T;
/* “Обходим” элемент, который вставили, чтобы после него ничего никогда не вставлять. */
Q=Q->next->next; }
else
// Если не вставляли, переходим на следующий элемент.
Q=Q->next;
};
void clsp::SORT()
{ tsp *Q1, *Q2, *Qmin;
Q1=P->next;
while (Q1)
{
/* Находим элемент с минимальной информационной частью, т. е. наименьшее число, начиная с Q1. */
Q2=Q1->next;
Qmin=Q1;
while (Q2)
{ if (Q2->numnum)
Qmin=Q2;
// Продолжаем находить минимальное число.
Q2=Q2->next; }
// Переставляем Q1->num и Qmin->num
int temp;
temp=Q1->num;
Q1->num=Qmin->num;
Qmin->num=temp;
// Меняем начало нахождения наименьшего элемента.
Q1=Q1->next; } };
int main()
{ int n2, ndel, flag;
cout < flag=1; while (flag)
{ cout << "1 -- DELETE"< "3 -- LOOK"< "0 -- EXIT"< cin>>flag; switch (flag)
{ case 1: OBSP.DEL(ndel);
cout << endl<<" After deleting"< if ( !ndel) cout << " We did not change spisok ";
OBSP.LOOK(); break;
case 2: OBSP.INS(); cout << endl<<" After inserting";
OBSP.LOOK(); break;
case 3: OBSP.LOOK(); break;
case 4: cout << endl<<" Before sorting";
OBSP.LOOK(); OBSP.SORT();
cout << endl<<" After sorting"; OBSP.LOOK();
break;
case 0: flag=0; break;
default: cout< }
}
return 0; }

П р и м е р 2 (+). Работа с “матрицей” с разным количеством элементов в строках и хранящейся в виде списка. В информационной части матрицы хранится одна её строка и количество элементов в ней.
struct tsp
{ int num; // Количество чисел в строке матрицы.
/* Одномерный динамический массив для одной строки матрицы. */
int *arr1;
struct tsp *next;
};
class clsp
{ tsp *P;
/* Количество строк матрицы, т. е. количество элементов списка. */
int n;
public:
clsp(int k)
{ n=k; };
void CREATE1(); // Создание списка.
void LOOK(); // Просмотр списка (матрицы).
void DEL (int, int &);
void INS (int);
};

void clsp::CREATE1()
{ tsp *T, *Q;
// Создаём фиктивный элемент (см. прим. 1).
T=new tsp;
T->num=2;
T->arr1=new int[T->num];
for(int j=0; jnum; j++)
T->arr1[j]=0;
P=T; // Начало списка.
for (int i=1; i<=n;i++)
{
// Выделяем память для одного элемента списка.
Q=new tsp;
cout<<"Number (>0)=";
// Вводим количество элементов строки.
cin>>Q->num;
// Выделяем память для одной строки матрицы.
Q->arr1=new int[Q->num];
// Вводим одну строку матрицы.
for(int j=0; jnum; j++)
cin>>Q->arr1[j];
/* “Cцепляем” с предыдущим элементом, т. е. “присоединяем” новый элемент в конец списка.*/
T->next=Q;
T=Q; }
Q->next=NULL; };
// Функция выводит матрицу на экран (см. прим. 1).
void clsp::LOOK()
{ tsp *Q;
cout<<"\nn="< Q=P->next;
while ( Q)
{ cout<<" Number="<num<<" ";
for(int j=0; jnum; j++)
cout<arr1[j]<<" ";
Q=Q->next;
cout << endl; }
cout << endl; };
/* Функция удаляет те строки матрицы, у которых наибольший элемент < max0, и возвращает количество таких удалённых строк. */
void clsp::DEL(int max0,int &numdel)
{ tsp *T, *Q;
int n2, MyMax;
n2=n; /* Запомнили “старое” количество строк, чтобы затем сравнить его с количеством удалённых строк. */
numdel=0;
Q=P;
cout << " Deleted elements : "<< endl;
while ( Q->next )
/*Цикл для просмотра списка, анализа каждого элемента и, возможно, его удаления. */
{
// Находим наибольший элемент (MyMax) в одной строке матрицы.
MyMax= Q->next->arr1[0];
for (int j=1; j< Q->next->num; j++)
if (Q->next->arr1[j]>MyMax)
MyMax= Q->next->arr1[j];
// Проверяем условие удаления.
if (MyMax < max0)
{ n--; numdel++;
// Удаляем один элемент списка, т. е. одну строку.
T=Q->next;
Q->next=Q->next->next;
T->next=NULL;
cout< /* Выводим удалённый из списка элемент, т. е. одну строку. */
for(int j=0; jnum; j++)
cout<arr1[j]<<" ";
// Освобождаем память для удалённого элемента.
delete T; }
else
// Переходим на следующий элемент, если не удаляли.
Q=Q->next; }
// Если удалили все элементы
if (numdel==n2) cout <<"\n We deleted all elements" ;
};
/* После строк матрицы, у которых количество элементов < n0, функция вставляет новую введённую с экрана строку с таким же количеством элементов. */
void clsp::INS(int n0=2)
{ tsp *Q, *T;
Q=P->next;
while (Q) /* Цикл для проверки всех элементов списка и вставки новых строк матрицы. */
if (Q->num { n++;
// Резервируем память для нового элемента списка.
T=new tsp;
T->num=Q->num;
// Выделяем память для одной строки матрицы.
T->arr1=new int[T->num];
cout<<"\nInput "<< Q->num <<" elements\n";
// Вводим новую строку матрицы.
for(int j=0; jnum; j++)
cin>>T->arr1[j];
// “Cцепляем” новый элемент со следующим
T->next=Q->next;
// и предыдущим элементом.
Q->next=T;
/* “Обходим” элемент, который вставили, чтобы после него ничего никогда не вставлять. */
Q=Q->next->next; }
else
// Если не вставляли, переходим на следующий элемент.
Q=Q->next; };
int main()
{ int n2, ndel, flag, Max0, Num0;
cout < OBSP.LOOK(); flag=1;
while (flag)
{ cout << "1 -- DELETE"< "3 -- LOOK"< cin>>flag;
switch (flag)
{ case 1: cout<<"Max0= "; cin>>Max0;
OBSP.DEL(Max0, ndel);
cout << endl<<" After deleting"< if ( !ndel) cout << " We did not change spisok ";
OBSP.LOOK(); break;
case 2: cout<<"Num0= "; cin>>Num0;
OBSP.INS(Num0);
cout << endl<<" After inserting";
OBSP.LOOK(); break;
case 3: OBSP.LOOK(); break;
case 0: flag=0; break;
default: cout< return 0; }

П р и м е р 3. Работа со стеком строк (+).
struct tsp
{ char *s; struct tsp *next; };
class spisok
{ struct tsp *P; int n;
public:
spisok();
void FORM(); // Создание стека.
void LOOK(int k=5); // Просмотр стека.
/* Получение количества элементов стека. */
int NUMBER();
/* Вставка одного элемента в начало стека. */
void INS();
/* Удаление одного элемента с вершины стека. */
void DEL(); };
spisok::spisok()
{ P=NULL; };
void spisok::FORM()
{ char *Str; tsp *Q;
Str=new char[80];
cout<<"### - exit\n"; n=0;
while(1)
{ gets(Str);
if (strstr(Str,"###"))break;
/* Резервируем память для одного элемента стека. */
Q=new tsp;
// Резервируем память для строки.
Q->s=new char[strlen(Str)];
strcpy(Q->s, Str);
/* “Присоединяем” новый элемент к вершине стека. */
Q->next=P;
/* Новый элемент делаем вершиной стека. */
P=Q;
n++; };
/* Освобождаем память для введённой строки. */
delete [] Str; };
int spisok::NUMBER()
{ return n; };
/* Просмотр указанного (k) количества или всех элементов стека. */
void spisok::LOOK(int k)
{ tsp *Q;
cout</* Переходим в вершину стека. */
Q=P;
for (int i=0;i { puts(Q->s);
/* Переходим на следующий элемент стека. */
Q=Q->next; }
cout << endl; };
void spisok::INS()
// Аналогично FORM, только без цикла.
{ tsp *Q; char *Str;
Str=new char[80];
scanf("%s",Str);
Q=new tsp;
Q->s=new char[strlen(Str)];
strcpy(Q->s, Str);
Q->next=P;
P=Q; n++;
delete [] Str; };
void spisok::DEL()
{ tsp *Q;
// ”Переходим ” на второй элемент стека.
Q=P->next;
// Удаляем первый элемент.
delete P;
/* Второй элемент делаем первым, т. е. вершиной стека. */
P=Q; n--; };
int main()
{ int n2, flag; spisok STECK;
// Создание объекта.
STECK.FORM(); STECK.LOOK();
flag=1; while (flag)
{ cout << "1 -- INSERT"< "3 -- NUMBER"< "0 -- EXIT"< cin>>flag;
switch (flag)
{ case 1: STECK.INS(); break;
case 2: STECK.DEL(); break;
case 3: cout<<"\nThere are "
< break;
case 4: while(1)
{ int n0; n0=STECK.NUMBER();
cout<<"The number of elements for looking<="<< n0<<" ";
cin>>n2;
if(n2<=n0 && n2>0)
{ STECK.LOOK(n2); break; }
else cout<<"There are only "< } break;
case 0: flag=0; break;
default: cout< } }
return 0; }


Варианты заданий.

Задачи первого, простого уровня.
Создать список вещественных чисел. Найти разность между наибольшим и наименьшим элементами.
Создать список, в информационной части элементов которого находятся координаты вершин многоугольника плоскости. Найти периметр многоугольника.
Создать список, в информационной части элементов которого находятся координаты вершин многоугольника плоскости. Определить, находится ли точка с заданными координатами на одной из сторон многоугольника.
Создать список, в информационной части элементов которого находятся длины сторон треугольника плоскости. Найти треугольник максимальной площади.
Создать список, в информационной части элементов которого находятся координаты одной точки плоскости. Найти количество точек каждой из четвертей плоскости.
Создать список, в информационной части элементов которого находятся координаты одной точки плоскости. Найти одну, любую точку, расстояние от которой до заданной точки наименьшее.
Создать список, в информационной части элементов которого находятся координаты одной точки плоскости. Найти количество точек, находящихся внутри кольца, ограниченного окружностями с общим центром, радиусы которых r и R (r < R).
Создать список целых чисел. Есть ли среди них общий делитель? Есть ли среди них общее кратное?
Создать список слов. Найти количество слов, начинающихся и заканчивающихся одинаковой буквой.
Создать список слов. Найти и вывести слова, у которых гласных больше половины.
Создать список слов. Найти и вывести слова, длина которых меньше средней длины всех слов.
Создать список, в информационной части элемента которого одномерный массив фиксированной размерности, т. е. в виде списка представить матрицу, количество строк (элементов списка) которой произвольное, а количество чисел в каждой строке одинаковое и задано в виде константы. Найти количество строк, в которых больше половины чисел имеют значение, меньшее чем среднеарифметическое данной строки.
Создать список, в информационной части элемента которого одномерный массив оценок одного студента фиксированной размерности, т. е. в виде списка представить матрицу, количество строк (элементов списка) которой произвольное, а количество оценок в каждой строке одинаковое и задано в виде константы. Найти количество отличников.

Задачи второго, среднего уровня
Из нерассортированного списка целых чисел удалить все наибольшие элементы, оставив первый из них.
Из рассортированного списка целых чисел удалить все наибольшие элементы, кроме одного.
Из рассортированного списка целых чисел удалить повторяющиеся числа, оставив их по одному разу.
В нерассортированный список целых чисел после каждого положительного числа вставить его номер в исходном списке.
В нерассортированный список вещественных чисел после каждого максимального числа вставить номер в списке и номер среди максимальных элементов этого же списка.
В нерассортированный список вещественных чисел после каждой тройки чисел вставить их среднеарифметическое значение. Если в конце списка осталось меньше трёх чисел, вставить среднеарифметическое значение из двух чисел или вставить последнее число.
Создать список, информационная часть каждого элемента которого содержит фамилию и массив из 10 оценок. Из списка удалить двоечников, то есть те элементы, в которых есть хотя бы одна единица, двойка или тройка.
Создать список, элементом которого является прямая плоскости y=k*x +b, т. е. два числа k и b. Удалить все прямые, перпендикулярные оси OX.
Создать список, элементом которого является прямая плоскости y=k*x +b, т. е. два числа k и b. Удалить все прямые, параллельные первой прямой этого же списка.
Создать список, элементом которого являются координаты вершин треугольников на плоскости. Удалить все треугольники с одинаковым наименьшим периметром.
Создать список, элементом которого являются координаты вершин треугольников на плоскости. После каждого треугольника, вершины которых находятся в разных четвертях, вставить треугольник, симметричный относительно оси OY.
Создать список, элементом которого являются координаты центра и радиус окружности на плоскости. После каждой окружности первой четверти вставить окружность, центр которой сдвинут на r (радиус) величин вправо.
Создать список, элементом которого являются координаты вершин четырёхугольников на плоскости. После каждого квадрата со сторонами, параллельными осям координат, вставить квадрат с тем же центром, стороны которого параллельны осям координат и в два раза меньше.
Создать список, в информационной части элемента которого одномерный массив фиксированной размерности, т. е. в виде списка представить матрицу, количество строк (элементов списка) которой произвольное, а количество чисел в каждой строке одинаковое и задано в виде константы. Из матрицы удалить все строки, в которых одни нули.
Пусть матрица записана в оперативной памяти в виде списка (см. прим. 14). Из матрицы удалить строки, у которых первый ненулевой элемент положительный, а последний ненулевой элемент – отрицательный.
Пусть матрица записана в оперативной памяти в виде списка (см. прим. 14). После каждой строки, содержащей только отрицательные числа, вставить новую строку, которая получается умножением каждого элемента этой строки на -1.
Пусть матрица записана в оперативной памяти в виде списка (см. прим. 14). Поменять местами первую строку с той, в которой находится наибольший элемент всей матрицы.
Пусть матрица записана в оперативной памяти в виде списка (см. прим. 14). Поменять местами строку с наибольшим элементом со строкой с наименьшим элементом матрицы. Если таких строк несколько, т. е. наибольших (наименьших) элементов матрицы несколько и они находятся в разных строках, то переставить любые такие строки.
Создать список слов. Из списка удалить слова наименьшей длины, кроме первого.
Создать список слов. Из списка удалить слова, у которых гласных больше половины и которые начинаются с гласной буквы.
Из введённого текста создать список слов. Из списка удалить те слова, которые начинаются на заданную букву.
Создать стек слов. Удалить все слова, пока не встретится слово заданной длины.

С. Задачи повышенной сложности
Из нерассортированного списка целых чисел удалить повторяющиеся числа, оставив их по одному разу.
Создать список вещественных чисел. После серии подряд идущих повторяющихся чисел вставить количество их повторений.
Создать два списка целых чисел. Рассортировать каждый из них, используя алгоритм обмена. Из двух рассортированных списков путём их слияния получить новый рассортированный список, не используя третий раз алгоритм сортировки.
Создать список, информационная часть каждого элемента которого содержит фамилию и инициалы студента и массив из пяти оценок. Рассортировать список по категориям (отличники, хорошисты, троечники, двоечники). Внутри каждой категории часть списка должна быть рассортирована в алфавитном порядке фамилий.
Создать список, информационная часть каждого элемента которого содержит фамилию и имя студента и массив из пяти оценок. Рассортировать список по среднему баллу. Вставить новые введённые фамилии и их оценки в нужное место списка так, чтобы изменённый список оставался рассортированным.
Создать список, в информационной части элемента которого одномерный массив фиксированной размерности, т. е. в виде списка представить матрицу, количество строк (элементов списка) которой произвольное, а количество чисел в каждой строке одинаковое и задано в виде константы. Рассортировать строки матрицы по возрастанию их первых элементов. Для сортировки использовать алгоритм выбора.
Создать список слов. Рассортировать список (слова) по их длине. Слова с одинаковой длиной сортировать по двум первым буквам.
Построить два списка слов и рассортировать каждый из них. На основе полученных двух рассортированных списков построить третий рассортированный в том же порядке список, содержащий неповторяющиеся элементы.

Лабораторная работа 9

Тема. Работа с текстовым файлом.
Требования и общие указания к заданиям:
Необходимо разработать и проверить функции для реализации следующих действий с текстовым файлом:
создание файла;
просмотр файла, т. е. вывод его содержимого на экран;
добавление текста в файл;
реализация функциональной части, указанной в варианте, и запись полученного результата во второй текстовый файл.
При этом можно работать с текстовым файлом как посимвольно, так и построчно на усмотрение преподавателя или студента. В качестве дополнительного задания (например, если кроме лабораторных работ есть вычислительная практика) можно запрограммировать и второй вариант.

Варианты заданий

B. Задачи второго среднего уровня
Каждую букву заменить её номером в алфавите. В одной строке экрана одним цветом вывести символы строки с двумя пробелами между ними, а ниже другим цветом номера символов.
В тексте одну введённую подстроку, не обязательно являющуюся словом, заменить другой введённой подстрокой. При выводе исходной и изменённой строки старую и новую подстроку выделить другим цветом.
В каждом слове текста k-ю букву заменить заданным символом. Если k больше длины слова, корректировку не выполнять.
Слова заданной длины заменить указанной подстрокой, не обязательно словом. Как использовать этот алгоритм замены для удаления слов заданной длины?
После каждого слова текста вставить указанную подстроку.
После k-го символа слова вставить указанную подстроку. Если k больше длины слова, вставку не выполнять.
После одного слова текста вставить другое слово.
Удалить все символы (кроме пробелов), не являющиеся буквами. Между последовательностями подряд идущих букв оставить хотя бы один пробел.
Удалить все слова заданной длины.
Удалить все слова-палиндромы.
Удалить из текста его часть, заключённую между двумя вводимыми с экрана символами (например, между скобками “{“ и “}”, между звёздочками и т. п.). Считать, что эти символы могут быть только в одной строке.
Обработка текста программы на языке С++ как последовательности строк символов. В качестве входной информации разрабатываемой программы задан некоторый элемент языка или небольшой фрагмент программы. Необходимо записать его в файл и найти количество всех символов (длину) каждого комментария, записанного после символов “//”. Для других целей эти символы не используются. В строке может быть записан только один комментарий.
Из текста программы (см. 12) удалить комментарии, ограниченные символами “/*” и “*/”. Для других целей эти символы не используются. Считать, что эти символы могут быть только в одной строке.
Сколько раз в тексте программы (см. 12) используется вывод с помощью cout ? Предусмотреть, что это ключевое слово может быть в текстовой константе.
Сколько раз в тексте программы (см. 12) используется ввод с помощью cin ? Предусмотреть, что это ключевое слово может быть в комментариях после символов //.
Предполагается, что предложения текста разделяются одним из следующих трёх символов: точка, восклицательный или вопросительный знаки. Кроме них, рядом с этими могут быть другие символы (пробел (пробелы), несколько точек, скобки и т. п.). Найти количество повествовательных, вопросительных и восклицательных предложений.

С. Задачи повышенной сложности
Найти и вывести те предложения (см. 16), в которых есть одинаковые слова.
Найти одно любое слово в каждом предложении (см. 16), которое есть в следующем предложении. Последнее предложение не анализируется.
В каждом вопросительном предложении текста (см. 16) найти и вывести без повторений слова заданной длины.
В каждом предложении текста (см. 16) поменять местами первое слово с последним словом.
Удалить из текста его часть, заключённую между двумя вводимыми с экрана символами (например, между скобками “{“ и “}”, между звёздочками и т. п.) или между двумя парами символов (например, между “/*” и “*/”, то есть комментарии из текста программы). Считать, что эти символы могут быть в разных строках.
Текст шифруется по следующему правилу: из исходного текста выбирается 1-й, 4-й, 7-й, 10-й и т. д. символы, затем 2-й, 5-й, 8, 11-й и т. д. символы, затем 3-й, 6-й, 9-й, 12-й и т. д. символы. Зашифровать заданный текст, то есть на основании исходного текстового файла получить новый файл по указанному выше правилу.
Пусть зашифрован текст по правилу, описанному в предыдущем примере, то есть в файле хранится зашифрованный текст. Расшифровать заданный текст, то есть получить второй новый файл.
Обработка текста программы на языке С++ как последовательности строк символов. В качестве входной информации разрабатываемой программы задан некоторый элемент языка или небольшой фрагмент программы. Необходимо записать его в файл и проанализировать в зависимости от варианта. Найти все вложенные операторы if.
Задана полная форма оператора if (см 8). Пусть в каждой его ветви записан простой оператор, присваивающий целой переменной значение константы. В качестве логического выражения в скобках if записано сравнение двух простых переменных с помощью операций сравнения. Определить правильность записи оператора if.
Задан заголовок оператора for (см. 8). Есть ли в нём синтаксические ошибки? Предполагается, что каждое из трёх выражений имеет простой вид. В первом из них одной переменной присваивается значение константы. Во втором выражении используются только операции сравнения перменной с целой константой типа n<10 и нет логических операций. В третьем выражении используются только операции ++, - - (например, i++) , +=, - = (типа x+=2), где слева переменная, а справа константа целого типа.
Определить, правильно ли расставлены фигурные скобки в операторах for (см. 8). Предполагается, что фигурные скобки записываются всегда, независимо от количества операторов в теле цикла. Для других целей они не используются. Предусмотреть случай вложенности операторов for.
Найти количество операторов в теле цикла каждого оператора while (см. 8). Независимо от количества операторов тела цикла фигурные скобки всегда записываются. В теле цикла отсутствуют операторы, которые требуют фигурных скобок.
Найти количество операторов в теле цикла каждого оператора do while (см. 8). Независимо от количества операторов тела цикла фигурные скобки всегда записываются. В теле цикла отсутствуют операторы, которые требуют фигурных скобок.
Проанализировать баланс фигурных скобок при условии, что они используются только для объединения нескольких простых операторов в один блок (см. 8).

Лабораторная работа 10
Тема. Файлы в экономических задачах.
Требования и общие указания к заданиям:
Необходимо разработать и проверить функции для реализации следующих действий с файлами:
создание файла, записи которого имеют указанную структуру;
просмотр файла, т. е. “чистый” вывод его содержимого на экран в удобном для анализа виде без никакой обработки и анализа;
добавление записей в конец файла (аналогично созданию, только файл открываем с режимом “a”);
реализация функциональной части, указанной в варианте. При этом необходимо предусмотреть создание и просмотр второго файла с результатом.
Замечание. Кроме предложенных здесь вариантов заданий можно использовать задачи из лабораторной работы 6 этого второго семестра.

Варианты заданий

A. Задачи первого, простого уровня
Структура записей файла: отделение; фамилия, имя, отчество; массив из пяти оценок. Для заданного отделения вывести фамилии, имена, отчества “двоечников”.
Структура записей файла: курс; фамилия, имя, отчество; массив из пяти оценок по десятибалльной системе. Для заданного курса вывести фамилии, имена, отчества “отличников”, у которых только оценки “9” и (или) “10”.
Структура записей файла: отделение; фамилия, имя, отчество; массив оценок; признак. Для каждого студента получить одно из следующих значений признака: 5 – отличник с оценками “9”, “10”; 4 – хорошист, у которого есть хотя бы одна хорошая оценка (“6”, “7”, “8”), но нет оценок, меньше “6”; 3 – троечник, у которого есть хотя бы одна удовлетворительная оценка ( “4”, “5”), но нет оценок, меньше “4”; 2 – неуспевающий, у которого есть хотя бы одна неудовлетворительная оценка (“1”, “2”, или “3”).
Структура записей файла: курс; фамилия, имя, отчество; массив оценок; материальное положение (например: 0, 1, 2); размер стипендии. Для каждого студента определить размер стипендии, выбрав самостоятельно критерий.
Структура записей файла: отделение; фамилия, имя, отчество; массив оценок. Вывести список (фамилия, инициалы; массив оценок) неуспевающих студентов.
Структура записей файла: шифр подразделения; фамилия, имя, отчество; год рождения; образование (например: 0 – неоконченное базовое, 1 – базовое, 2 – общее среднее и т. д.). Для заданного подразделения, шифр которого вводим, вывести фамилии и инициалы сотрудников с неоконченным базовым и базовым образованием.
Структура записей файла: шифр подразделения; фамилия, имя, отчество; пол, год рождения. Найти общее количество и процент работников пенсионного возраста, вывести их фамилии и инициалы.
Структура записей файла: шифр подразделения; фамилия, имя, отчество сотрудника; год поступления на работу. Найти количество и процент работников со стажем работы до пяти лет и вывести их фамилии и инициалы.
Структура записей файла: шифр темы; шифр книги; фамилия, имя, отчество автора; название книги; издательство; год издания. Вывести список книг по заданной теме, изданных позже указанного года.
Структура записей файла: шифр темы; шифр книги; фамилия, имя, отчество автора; название книги; издательство; год издания. Ввести с экрана фамилию, имя, отчество автора и название нескольких книг. Для каждой книги из этого списка найти значения остальных полей или вывести сообщение, что такой книги в файле нет.
Структура записей файла: шифр подразделения; план выпуска продукции по кварталам одного года в виде массива; фактическое выполнение плана по кварталам одного года в виде массива; процент выполнения плана по кварталам одного года в виде массива. Для каждого подразделения получить процент выполнения плана по кварталам.
Структура записей файла: фамилия, имя, отчество; результат соревнований по некоторому виду спорта. Найти три лучших результата и соответствующие три фамилии участников. Предполагается, что абсолютно одинаковые результаты несколько участников показать не могли.
Структура записей файла: номер телефона; фамилия, имя, отчество абонента; адрес (улица, дом, квартира). По введённому номеру телефона вывести фамилию, инициалы и адрес абонента или сообщение, что такого телефона в файле нет.
Структура записей файла: номер телефона; фамилия, имя отчество абонента; адрес (улица, дом, квартира). Скорректировать файл после установки новых телефонов, информация о которых (см. структуру записей) вводится с экрана.
Структура записей файла: шифр сбербанка; номер счёта; размер вклада. Найти и вывести номера счетов и шифры сбербанков с максимальным размером вклада.

B. Задачи второго, среднего уровня
Структура записей файла: отделение; фамилия, имя, отчество; массив из пяти оценок. Для заданного отделения вывести фамилии и инициалы “двоечников” по убыванию общего количества плохих оценок (“1”, “2”, “3”).
Структура записей файла: курс; фамилия, имя, отчество; массив из пяти оценок по десятибалльной системе. Для заданного курса вывести фамилии и инициалы “отличников” с оценками “9” и “10” по убыванию среднего бала.
Структура записей файла: отделение; фамилия, имя, отчество; массив оценок; признак. Для каждого студента получить одно из следующих значений признака: 5 – отличник с оценками “9”, “10”; 4 – хорошист, у которого есть хотя бы одна хорошая оценка (“6”, “7”, “8”), но нет оценок, меньше “6”; 3 – троечник, у которого есть хотя бы одна удовлетворительная оценка (“4”, “5”), но нет оценок, меньше “4”; 2 – неуспевающий, у которого есть хотя бы одна неудовлетворительная оценка (“1”, “2”, или “3”). Студентов заданного отделения рассортировать по этому полученному признаку. Для одинакового признака сортировать по среднему баллу.
Структура записей файла: курс; фамилия, имя, отчество; массив оценок в десятибалльной системе; материальное положение (например: 0, 1); размер стипендии. Для каждого студента определить размер стипендии, выбрав самостоятельно критерий. Рассортировать студентов по курсам, внутри курса – по полученной стипендии.
Структура записей файла: отделение; фамилия, имя, отчество; массив оценок. Для каждого отделения вывести список (фамилия, инициалы) успевающих студентов по убыванию их среднего балла.
Структура записей файла: шифр подразделения; фамилия, имя, отчество; год рождения; образование (например, 0 – неоконченное базовое, 1 – базовое, 2 – общее среднее и т. д.). Для заданного подразделения, шифр которого вводим, вывести информацию о сотрудниках сначала по образованию, а затем для одинакового образования по возрасту.
Структура записей файла: шифр подразделения; фамилия, имя, отчество; пол, год рождения. Для каждого подразделения найти количество и процент работников пенсионного возраста, вывести их фамилии и инициалы по убыванию возраста.
Структура записей файла: шифр подразделения; фамилия, имя, отчество сотрудника; год поступления на работу. Для каждого подразделения найти количество и процент работников со стажем работы до 5 лет, от 6 до 10 лет, от 11 до 15лет и т. д.
Структура записей файла: шифр темы; шифр книги; фамилия, имя, отчество автора; название книги; издательство; год издания. Вывести список книг по заданной теме указанного издательства по убыванию года издания.
Структура записей файла: шифр темы; шифр книги; фамилия, имя, отчество автора; название книги; издательство; год издания. Вывести список книг, изданных в заданном издательстве, по возрастанию шифра темы.
Структура записей файла: шифр подразделения; план выпуска продукции по кварталам одного года в виде массива; фактическое выполнение плана по кварталам одного года в виде массива. Рассортировать информацию о работе подразделений следующим образом: сначала должна быть информация о тех подразделениях, которые выполнили план во всех четырёх кварталах, затем о тех, кто выполнил план в трёх кварталах, и т. д.
Структура записей файла: фамилия, имя, отчество; результат соревнований по некоторому виду спорта. Найти три лучших результата и соответствующие фамилии участников. Таких победителей может быть больше трёх, так как одинаковые результаты могли показать несколько участников.
Структура записей файла: фамилия, имя, отчество; пол; результат соревнований по некоторому виду спорта. Найти лучший результат среди женщин и соответствующие фамилии участников (не обязательно одна) и лучший результат среди мужчин и соответствующие фамилии участников (также не обязательно одна).
Структура записей файла: шифр сбербанка; номер счёта; размер вклада. Для каждого сбербанка найти общее количество вкладчиков и средний размер вклада.
Структура записей файла: шифр сбербанка; номер счёта; размер вклада. Ввести информацию о поступлении денег на счета и об их снятии со счетов. Выполнить корректировку файла.
Вывести ведомость на выдачу премии за квартал, если зарплата и процент премии за каждый месяц хранятся в файле. Процент удержания из премии, одинаковый для всех работников, ввести с экрана.
Структура записей файла: шифр подразделения; шифр сотрудника; фамилия, имя, отчество; год поступления на работу. С экрана вводим следующие данные об уволенных сотрудниках: шифр подразделения и шифр сотрудника. Выполнить удаление соответствующих записей
В следующих задачах (18 – 26) предварительно необходимо определить, какая информация (поля структуры) должна храниться в файле.
В файле хранится информация о ходе выполнения лабораторных работ всеми студентами одного преподавателя. Рассортировать студентов по убыванию количества не выполненных в срок заданий. Для сортировки использовать метод вставки.
В файле хранится информация о ходе выполнения лабораторных работ всеми студентами одного преподавателя. Методом слияния рассортировать номера заданий по убыванию количества студентов, выполнивших задания вовремя. После занятия выполнить корректировку файла.
Составить программу планирования и учёта нагрузки одного преподавателя.
В файле хранится расписание занятий студентов одного курса некоторого факультета. Вывести расписание для заданной подгруппы.
В файле хранится расписание занятий студентов одного курса некоторого факультета. Вывести номера тех подгрупп (и дни), у которых есть “форточки”.
В файле хранится расписание занятий студентов одного курса некоторого факультета. Вывести номера тех подгрупп, у которых более одного дня в неделю есть занятия позже введённого времени (например, позже 19 час.).
В файле хранится расписание аудиторных занятий преподавателей кафедры. В какие дни у преподавателя нет занятий?
В файле хранится расписание аудиторных занятий преподавателей кафедры. Для заданного преподавателя вывести расписание его занятий.
В файле хранится расписание аудиторных занятий одного преподавателя. Вывести преподавателей с наибольшим количеством аудиторных занятий в неделю.


Лабораторная работа 11

Тема: Файлы в математических задачах.
Требования и общие указания к заданиям:
Необходимо разработать и проверить функции для реализации следующих действий с файлами:
создание файла;
просмотр файла, т. е. “чистый” вывод его содержимого на экран в удобном для анализа виде без никакой обработки и анализа;
добавление записей в конец файла (аналогично созданию, только файл открываем с режимом “a”);
реализация функциональной части, указанной в варианте. При этом необходимо предусмотреть создание и просмотр второго файла с результатом.
При работе с матрицей оперативную память резервировать не более чем для одной (в некоторых вариантах для двух) строк матрицы. Всю матрицу в оперативной памяти не хранить.

Варианты заданий

A. Задачи первого, простого уровня.
В файл записать координаты точек трёхмерного пространства. Найти количество точек, принадлежащих шару, координаты центра и радиус которого заданы и вводятся с экрана.
Из заданного множества точек на плоскости, координаты которых должны храниться в файле, найти точки с максимальным расстоянием от заданной точки, координаты которой вводятся с экрана.
В файл записать коэффициенты уравнений прямых на плоскости. Посчитать количество прямых, параллельных оси ОХ и количество прямых, параллельных оси ОY.
В файл записать координаты вершин выпуклых четырёхугольников на плоскости. Вывести на экран координаты вершин квадратов и найти их количество.
В файл записать координаты точек плоскости. Вывести на экран координаты точек, расположенных на прямой, коэффициенты уравнения которой заданы и вводятся с экрана. Найти количество таких точек.
В файл записать координаты точек плоскости. Ввести с экрана координаты центра и радиусы двух окружностей с общим центром. Вывести на экран координаты точек, расположенных между этими окружностями, и найти количество таких точек.
В файл записать построчно вещественную матрицу. Найти строку (одномерный массив из файла) с наибольшим количеством положительных чисел.
В файл записать построчно целочисленную матрицу, у которой в каждой строке хранятся оценки одного студента на всех экзаменах. Найти количество отличников.
В каждой строке целочисленной матрицы, элементы которой должны храниться в файле, найти разность между средним значением положительных и средним значением отрицательных элементов.
В файл записать построчно вещественную матрицу. Найти и вывести строки, в которых нет отрицательных чисел.
В файл записать построчно вещественную матрицу. Найти наибольшее среди всех чисел тех строк матрицы, которые начинаются с положительного числа.
В файл записать вещественную матрицу A. С экрана ввести k номер строки матрицы. Получить и вывести на экран скалярное произведение k-й строки матрицы на её первую строку.

B. Задачи второго, среднего уровня.
В файл записать координаты точек трёхмерного пространства. Найти такую точку, что шар заданного радиуса с центром в этой точке содержит наибольшее количество точек.
Из заданного множества точек на плоскости, координаты которых должны храниться в файле, выбрать две такие различные точки, чтобы окружности заданного радиуса с центром в этих точках содержали внутри себя одинаковое количество точек.
В файл записать коэффициенты уравнений прямых на плоскости. Посчитать количество различных точек пересечения этих прямых и найти их координаты. Для каждой точки пересечения определить, какое количество прямых пересекается в этой точке.
В файл записать координаты вершин выпуклых четырёхугольников на плоскости. Создать два файла, первый из которых должен содержать координаты вершин параллелограммов по возрастанию их площадей, а второй – трапеций в том порядке, в котором они были в исходном файле.
В один файл записать координаты множества точек плоскости A, а в другой коэффициенты уравнений прямых B этой же плоскости. Найти две такие различные точки из A, что проходящая через них прямая параллельна наибольшему количеству прямых из B.
В один файл записать координаты конечного множества точек плоскости, а в другой координаты центра и радиусы m концентрических окружностей. Между какими окружностями (первой и второй, второй и третьей и т. д., (m-1)-й и m-й) больше всего точек заданного множества?
В файл записать построчно вещественную матрицу. Найти такие две различные строки матрицы, что их скалярное произведение наибольшее.
В файл записать построчно целочисленную матрицу, у которой в строке хранятся оценки одного студента на всех экзаменах. Найти номера строк отличников с оценками “9”, “10”; хорошистов, у которых есть хотя бы одна хорошая оценка (“6”, “7”, “8”), но нет оценок, меньше “6”; троечников, у которых есть хотя бы одна удовлетворительная оценка (“4”, “5”), но нет оценок, меньше “4”; неуспевающих, у которых есть хотя бы одна неудовлетворительная оценка (“1”, “2”, или “3”).
В каждой строке целочисленной матрицы, элементы которой должны храниться в файле, найти наибольшее количество одинаковых подряд идущих элементов.
В файл записать построчно целочисленную матрицу. Найти наибольшее из чисел, встречающихся в матрице более одного раза.
В файл записать построчно вещественную матрицу. Найти наибольшее среди всех чисел тех строк матрицы, которые упорядочены либо по возрастанию, либо по убыванию.
В файл записать вещественную матрицу A. Получить и записать в файл вектор B, i-й элемент которого равен скалярному произведению i-й строки матрицы на её первую строку. Матрицу и полученный вектор вывести на экран.

С. Задачи повышенной сложности
В один файл записать матрицу, а в другой вектор. Найти произведение матрицы на вектор и записать полученный вектор в третий файл.
В один файл записать вектор, а в другой матрицу. Найти произведение вектора на матрицу и записать полученный вектор в третий файл.
Найти произведение двух матриц, одна из которых хранится в одном файле, а вторая – в другом. Полученную матрицу записать в третий файл. Содержимое всех трёх файлов вывести на экран.
Методом Гаусса решить систему n линейных алгебраических уравнений c n неизвестными. Матрица коэффициентов системы и вектор свободных членов хранятся в двух файлах.
Методом Гаусса, используя схему выбора главного элемента, решить систему n линейных алгебраических уравнений c n неизвестными. Матрица коэффициентов системы и вектор свободных членов хранятся в двух файлах.
В файл записать построчно вещественную квадратную матрицу. Обратить её по схеме единственного деления.
Вычислить определитель записанной в файле квадратной матрицы, используя метод Гаусса.
Методом простой итерации решить систему n линейных алгебраических уравнений c n неизвестными. Матрица коэффициентов системы и вектор свободных членов хранятся в двух файлах.
Методом Зейделя решить систему n линейных алгебраических уравнений c n неизвестными. Матрица коэффициентов системы и вектор свободных членов хранятся в двух файлах.
Найти собственные числа и собственные векторы записанной в файл матрицы методом непосредственного вычисления определителя.
Методом итераций найти наибольшее по модулю собственное значение и соответствующий ему собственный вектор записанной в файл матрицы.
В файл записать построчно вещественную матрицу A. Найти все такие i и j, что скалярное произведение i-й строки на j-ю наибольшее.

Лабораторная работа 12

Тема. Указатели на функции.
Требования и общие указания к заданиям:
составить функцию, которая по заданной формуле (Симпсона, трапеций, прямоугольников и др.) вычисляет значение определённого интеграла от произвольной функции одной переменной или решает произвольное нелинейное уравнение f(x)=0 с помощью заданного численного метода;
в качестве одного из параметров этой функции использовать указатель на подынтегральную функцию или указатель на функцию левой части уравнения f(x)=0;
функцию для вычисления определённого интеграла проверить, используя аналитическое выражение для первообразной или с помощью какой-нибудь системы компьютерной математики (Mathcad, Mathematica и др.);
при решении нелинейных уравнений корни отделить графически или другим способом. Отрезок, на котором находится корень, для функции предполагается известным;
предусмотреть программную проверку найденных решений нелинейных уравнений.

Варианты заданий

В. Задачи второго, среднего уровня
Составить функцию, которая вычисляет значение определённого интеграла 13 EMBED Equation.3 1415 от произвольной функции одной переменной по формуле правых прямоугольников
13 EMBED Equation.3 1415,
где n фиксировано, 13 EMBED Equation.3 1415. Составленную функцию проверить для вычисления интеграла 13 EMBED Equation.3 1415. Значение функции y=sin(t) вычислять с заданной точностью (., используя разложение в ряд Тейлора: 13 EMBED Equation.3 1415

Составить функцию, которая вычисляет значение определённого интеграла 13 EMBED Equation.3 1415 от произвольной функции одной переменной. по формуле левых прямоугольников
13 EMBED Equation.3 1415,
где n фиксировано, 13 EMBED Equation.3 1415. Составленную функцию проверить для вычисления интеграла 13 EMBED Equation.3 1415. Значение функции y=cos(t) вычислять с заданной точностью (, используя разложение в ряд Тейлора:
13 EMBED Equation.3 1415
.
Составить функцию, которая вычисляет значение определённого интеграла 13 EMBED Equation.3 1415 от произвольной функции одной переменной по формуле средних прямоугольников
13 EMBED Equation.3 1415,
где n фиксировано, 13 EMBED Equation.3 1415 Составленную функцию проверить для вычисления интеграла13 EMBED Equation.3 1415 Значение функции y=et , где t= 1/x, вычислять с заданной точностью (, используя разложение в ряд Тейлора:
13 EMBED Equation.3 1415

Составить функцию, которая вычисляет значение определённого интеграла 13 EMBED Equation.3 1415 от произвольной функции одной переменной с помощью составной формулы трапеций
13 EMBED Equation.3 1415
где n фиксировано, 13 EMBED Equation.3 1415. С помощью составленной функции вычислить значение интеграла 13 EMBED Equation.3 1415 для n=3, 6, 9. Для вычисления y = 13 EMBED Equation.3 1415, где t=13 EMBED Equation.3 1415, составить и использовать функцию, которая реализует следующий итерационный алгоритм: 13 EMBED Equation.3 1415 Вычисления продолжаются до тех пор, пока не выполнится условие 13 EMBED Equation.3 1415. Массив y не формируется, достаточно двух переменных для старого и нового значений y.
Составить функцию, которая вычисляет значение определённого интеграла 13 EMBED Equation.3 1415 от произвольной функции одной переменной, используя составную формулу трапеций
13 EMBED Equation.3 1415
где n фиксировано, 13 EMBED Equation.3 1415. С помощью составленной функции вычислить значения интеграла 13 EMBED Equation.3 1415 для с = 1, 1.2, 1.4, , 2.8, 3. Для вычисления y = 13 EMBED Equation.3 1415можно использовать стандартную встроенную функцию или вычислять по итерационной формуле, приведенной в варианте 4.
Составить функцию, которая вычисляет значение определённого интеграла 13 EMBED Equation.3 1415 от произвольной функции одной переменной, используя составную формулу Симпсона
13 EMBED Equation.3 1415
где n фиксировано, 13 EMBED Equation.3 1415. С помощью составленной функции вычислить значение интеграла 13 EMBED Equation.3 1415. Значение функции y=et , где t= -x2, вычислять с заданной точностью (, используя разложение в ряд Тейлора: 13 EMBED Equation.3 1415

Составить функцию, которая вычисляет значение определённого интеграла 13 EMBED Equation.3 1415 от произвольной функции одной переменной, используя составную формулу Симпсона
13 EMBED Equation.3 1415
где n фиксировано, 13 EMBED Equation.3 1415. С помощью составленной функции вычислить значение интеграла 13 EMBED Equation.3 1415 для n=6. Значение функции y=ln(1+t), где t=x2, вычислять с заданной точностью (, используя разложение в ряд Тейлора: 13 EMBED Equation.3 1415.
Составить функцию для вычисления определённого интеграла 13 EMBED Equation.3 1415 от произвольной функции одной переменной по следующей формуле:
I13 EMBED Equation.3 1415,
где n фиксировано и кратно трём, 13 EMBED Equation.3 1415, 13 EMBED Equation.3 1415, С помощью составленной функции вычислить значения интегралов 13 EMBED Equation.3 1415 для k = 1/4, 1/2, 1, 2, 4.
Составить функцию для приближённого решения произвольного нелинейного уравнения f(x)=0 методом деления отрезка пополам с точностью (. Используя эту функцию, решить уравнения
13 EMBED Equation.DSMT4 1415
для a = 0.5+0.1k, k=0,1,2,3,4,5 с точностью (1=0.1.
Составить функцию для приближённого решения произвольного нелинейного уравнения f(x)=0 методом простой итерации с точностью (. Используя эту функцию, решить уравнения 13 EMBED Equation.DSMT4 1415 с точностью (1=0.0001.
Указание. В методе простой итерации исходное уравнение приводится к виду x=((x). Начиная с некоторого заданного начального значения 13 EMBED Equation.DSMT4 1415, строим последовательность по правилу13 EMBED Equation.DSMT4 1415. Вычисления прекращаем, если на некотором шаге получим 13 EMBED Equation.DSMT4 1415, где 13 EMBED Equation.DSMT4 1415 заданная точность решения уравнения.
Составить функцию для приближённого решения произвольного нелинейного уравнения f(x)=0 методом Ньютона с точностью (. Используя эту функцию, решить уравнения 3x-ekx = 0 для k = 1, 2, 3, 4, 5 с точностью (1=10-5. Значение et вычислять с заданной точностью (2 = 10-6 с помощью разложения в ряд Тейлора:
et=1+t+13 EMBED Equation.3 1415 .
Указание. В методе Ньютона по заданному начальному приближению xо строим последовательность по правилу
13 EMBED Equation.3 1415; n=0,1, 2, 3,
Вычисления продолжаются до тех пор, пока не выполнится условие 13 EMBED Equation.3 1415. Массив x не формируется, достаточно двух переменных для старого и нового значений x.
Составить функцию для приближённого решения нелинейного уравнения f(x)=0 с точностью ( методом секущих. Используя эту функцию, решить уравнения 13 EMBED Equation.3 1415 для 13 EMBED Equation.3 1415 = 2(0.1)3 с точностью (1=10-5.
Указание. В методе секущих по двум начальным приближениям 13 EMBED Equation.DSMT4 1415 строим последовательность по правилу
13 EMBED Equation.3 1415; n= 1,2, 3,
Вычисления продолжаются до тех пор, пока не выполнится условие 13 EMBED Equation.3 1415. Массив x не формируется, достаточно двух переменных для старого и нового значений x.
Составить функцию для решения произвольного нелинейного уравнения f(x) модифицированным методом секущих с точностью (. Используя эту функцию, решить уравнение 13 EMBED Equation.3 1415 для 13 EMBED Equation.3 1415=3(0.5)7 с точностью (=13 EMBED Equation.DSMT4 1415.
Указание. В модифицированном методе секущих по двум начальным приближениям 13 EMBED Equation.DSMT4 1415 строим последовательность по правилу
13 EMBED Equation.3 1415 для n=1, 2, , 13 EMBED Equation.3 1415 при 13 EMBED Equation.3 1415. Вычисления прекращаем, если на некотором шаге получим 13 EMBED Equation.DSMT4 1415, где 13 EMBED Equation.DSMT4 1415 заданная точность решения уравнения.
Составить функцию, которая находит приближенно, с точностью 0,001, минимум произвольной функции от одной переменной на отрезке [u, v]. С помощью составленной функции найти минимум функции y=13 EMBED Equation.3 1415+sin(x) на отрезке [-0.9, 0.9]. Значение функции y= sin (x) вычислять с заданной точностью (, используя разложение в ряд Тейлора:
13 EMBED Equation.3 1415
Составить функцию, которая выводит таблицу значений произвольной функции от одной переменной на отрезке [u, v] с шагом h. С помощью составленной функции построить таблицу значений функции y=arctg(x) на отрезке [-1, 1] с шагом h=0.1. Значение функции y=arctg(x) вычислять с заданной точностью (, используя разложение в ряд Тейлора: 13 EMBED Equation.3 1415


С. Задачи повышенной сложности.
18. Найти приближённое значение определённого интеграла
13 EMBED Equation.3 1415
с заданной точностью (, используя соответствующие (см. уровень В) квадратурные формулы. Это означает, что значение интеграла вычисляем не для одного фиксированного количества (n) разбиений отрезка [a, b], а используем двойной пересчёт. Сначала интеграл вычисляем для n разбиений, затем для 2n, 4n и т. д. Вычисления прекращаем, если на некотором шаге получим 13 EMBED Equation.3 1415значение интеграла, полученное на предыдущем шаге, а 13 EMBED Equation.3 1415 – значение интеграла, полученное на данном текущем шаге.

Лабораторная работа 13

Тема: Рекурсивные функции.
Требования и общие указания к заданиям.
Выполнить задания двумя способами:
1) используя механизм рекурсии;
разработав нерекурсивный алгоритм и запрограммировав его с помощью обычного цикла.
Оба варианта включить в один проект в виде отдельных функций.
B. Задачи второго, среднего уровня.
1. Вычислить для заданного натурального n:
13 EMBED Equation.3 1415.
2. Найти n-й член числовой последовательности, которая определяется рекуррентной формулой
a1 = 1, a2 = 2, a3 = 3, an+1 = 3an + 2an– + an–2.
Для заданных вещественного x и натурального n найти значение полинома Чебышева Тn(x) по рекуррентной формуле
T0(x) = 1, T1(x) = x, Tn+1(x) = 2xTn(x) – Tn–1(x).
Найти значение функции С(m,n), где 0 < m < n, если:
13 EMBED Equation.3 1415 13 EMBED Equation.3 1415.
С помощью признака делимости на три проверить, кратно ли данное натуральное число трём.
Найти n-ю степень (n – натуральное число) числа а.
Найти n-й член арифметической прогрессии с заданными первым членом а и разностью прогрессии d.
Найти n-й член геометрической прогрессии с заданными первым членом b и знаменателем прогрессии q.
Методом половинного деления уточнить корень уравнения f(х) = 0.
Найти максимальный элемент массива а1, а2, , аn.
В одномерном массиве найти i и j такие, что подпоследовательность аi, аi+1, , аj является перевертышем.
В одномерном числовом массиве найти подпоследовательность подряд идущих элементов, сумма которых максимальна.
Рассортировать одномерный массив методом простого выбора.
В одномерном числовом массиве найти заданное число, используя алгоритм двоичного поиска.
Найти значение функции Аккермана, которая определяется для всех неотрицательных целых аргументов m и n следующим образом:
А(0, n) = n + 1;
A(m, 0) = A(m – 1, 1), если (m > 0);
A(m, n) = A(m – 1, A(m, n – 1)), если (m, n > 0).

С. Задачи повышенной сложности.
С помощью рекурсивной функции найти с заданной точностью квадратный корень 13 EMBED Equation.3 1415, воспользовавшись итерационной формулой Ньютона:
Y0=1, 13 EMBED Equation.3 1415
Вычисления продолжать пока |Yi – Yi-1| не станет меньше заданного (. Используя эту функцию, составить другую рекурсивную функцию, которая для заданного а вычисляет
13 EMBED Equation.3 1415.
Разработать рекурсивную функцию нахождения наибольшего общего делителя двух чисел m и n, используя алгоритм Евклида. Например, для нахождения НОД(96, 36) число 96 представляем как 2 · 36 + 24. Затем число 36 = 1 · 24 +12 и, наконец, 24 = 2 · 12 + 0. Следовательно, НОД(96, 36) = 12. Используя эту функцию, составить вторую рекурсивную функцию для нахождения наибольшего общего делителя натуральных чисел одномерного массива.
НОД(n0, n1, ... nл-1) = НОД (НОД (n0, n1, ... nл–2), nл-1).
Найти количество n-значных чисел в m-ичной системе счисления, у каждого из которых сумма цифр равна k. При этом в качестве n-значного числа мы допускаем и числа, начинающиеся с одного или нескольких нулей.
Вычислить количество различных представлений заданного натурального числа n в виде суммы не менее двух попарно различных натуральных слагаемых. Представления, отличающиеся лишь порядком слагаемых, различными не считаются.
В матрице, состоящей из нулей и единиц, найти прямоугольную подматрицу из одних единиц максимального размера (т. е. с максимальным произведением высоты на длину).
В матрице найти прямоугольную подматрицу, сумма элементов которой максимальна.
В матрице A найти путь от элемента A[i1, j1] до элемента A[i2, j2] с максимальной суммой. “Ходить” можно по горизонталям и вертикалям. Каждый элемент матрицы может входить в путь не более одного раза.
В матрице найти путь от элемента первой строки матрицы до элемента последней строки с максимальной суммой. “Ходить” можно вниз по вертикали или диагоналям.
Вычислить определитель заданной матрицы, пользуясь формулой разложения по первой строке:
13 EMBED Equation.3 1415
где матрица Вk получается из матрицы А вычеркиванием первой строки и k-го столбца.
Лабиринт задан матрицей a(m, n), состоящей из нулей и единиц, причем а[0, 0] = 0 и a[m-1, n-1] = 0. Разработайте рекурсивную процедуру нахождения пути из клетки а[0, 0] в a[m-1, n-1]. Путь должен состоять из элементов, равных нулю. “Ходить” можно только по вертикалям и горизонталям.
Задано число А и два вектора b[n] и c[n]. Найти множество I, являющееся подмножеством множества {0, ..., n-1}, такое, что 13 EMBED Equation.3 1415, а 13 EMBED Equation.3 1415является максимальной из всех возможных.
Найти сумму двух натуральных чисел, заданных массивами своих цифр а0, а1, , аn-1 и b0, b1, , bm-1.
Рассортировать одномерный массив методом слияния.
Найти все перестановки заданных n различных натуральных чисел..
Для заданных двух натуральных числа m и n найти НОД(m, n) и натуральные x и y такие, что mx + ny = НОД(m, n).
Даны три натуральных числа m, n и k, причем k делится на НОД(m, n). Найти какое-нибудь целочисленное решение уравнения mx + ny = k.
Имеется n населенных пунктов, пронумерованных от 1 до n. Некоторые пары пунктов соединены дорогами. Разработайте рекурсивную процедуру определения, можно ли попасть по этим дорогам из 1-го пункта в n-й.
Вводятся три неотрицательных числа d, i, c и две строки X и Y. Найдите преобразование строки X в Y минимальной стоимости. Допустимы следующие три операции:
удалить любой символ из X (стоимость операции d);
вставить любой символ в X (стоимость операции i);
заменить символ в X на произвольный (стоимость операции с).
Преобразовать строку символов, состоящую из букв А’, В’ и С’,
используя следующие три операции:
удалить четыре подряд идущие буквы А;
удалить из последовательности ВАВА одну пару ВА;
удалить комбинацию АВС.
Преобразования выполнять до тех пор, пока ни одной из перечисленных комбинаций не останется.
Даны две строки x и y. Строка x состоит из нулей и единиц, строка y – из символов A’ и B’. Можно ли строку x преобразовать в строку y по следующему правилу: цифра 0 преобразуется в непустую последовательность букв A, а цифра 1 – либо в непустую последовательность букв A, либо в непустую последовательность букв B?
Задано конечное множество жителей некоего города, причем для каждого из жителей перечислены имена его детей. Жители X и Y считаются родственниками, если:
либо Х – ребенок Y,
либо Y – ребенок X,
либо существует некий Z такой, что Х является родственником Z, а Z является родственником Y.
Перечислите все пары жителей города, которые являются родственниками.
На шахматной доске расставьте 8 ферзей так, чтобы они не «били» друг друга.
Имеется полоска клетчатой бумаги шириной в одну клетку и длиной в n клеток. На первой клетке установлена шашка. Одним ходом шашку можно передвигать на одну или две клетки. Разработайте рекурсивную функцию, определяющую количество способов продвижения шашки на n-ю клетку.










13PAGE 15


13PAGE 146415















Root EntryEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation NativeEquation Native

Приложенные файлы

  • doc 25860
    Размер файла: 590 kB Загрузок: 0

Добавить комментарий