-
Задачи второго, среднего уровня
Можно использовать любой алгоритм сортировки.
-
Рассортировать строки динамической матрицы с одинаковым количеством элементов в каждой строке по 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<n;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<size;i++)
/* i – номер элемента массива структур (номер студента). */
{ gotoxy(2,y);
cout<<"Name ";
cin>> (x[i].name);
cout<<"Ocenki "<<endl;
y++;
for (j=0, coord1=8; j<m; j++,coord1+=3)
// 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<k; 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<size;i++)
{ cout<<x[i].name<<" ";
for (j=0,coord1=25; j<m; j++, coord1+=3)
{ gotoxy(coord1,wherey());
cout<<x[i].a[j];
}
gotoxy(coord1,wherey());
textcolor(10);
cprintf("%5.2f",x[i].s);
cout<<endl;
}
cout<<endl;
} ;
float MyAver (int z[],int M)
{ float S=0; int j;
for (j=0; j<M; j++)
S+=z[j];
S/=M;
return S; };
П р и м е р 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<size-1; 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<<endl;
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<size; 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, int size)
{Str->n=size;
cout<<"\n m="<< Str->n<<" ";
for (int i=0; i<size; i++)
printf(" x=%4.1f y=%4.1f", Str->Points[i].x, Str->Points[i].y);
printf("\n type %s",Str->type);
printf(" perimetr %10.2f",Str->per );
}
int main()
{ int m=3; // Количество вершин многоугольника.
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<n;i++)
{ cout<<"\n i="<<i<< " m=";
cin>>m;
/* Так как в функциях MyDef и MyShow в качестве формального параметра используется указатель на структуру (ttr *Str) и эти функции работают с одной структурой, то в качестве фактического параметра передаём адрес i–го элемента динамического массива. Так как arrs[i] не является адресом, то при вызове функции используем операцию “&” (взятие адреса). */
MyDef ( &arrs[i], m);
/* В функцию MyPer передаём адрес динамического массива точек размерности m для i–го многоугольника, созданный в функции MyDef. */
arrs[i].per=MyPer(arrs[i].Points, m);
MyShow(&arrs[i],m);
}
getch(); return 0;
}
Варианты заданий
A. Задачи первого, простого уровня.
-
Сформировать массив структур, каждый элемент которого содержит следующие три поля:
-
фамилия, имя, отчество (вводим);
-
массив оценок (вводим);
-
признак.
Для каждого студента получить одно из следующих значений признака: 5 –отличник (только 9 и (или) 10), 4 – хорошист (нет оценок, меньше 6, но не все 9 или 10, а есть 6 и (или) 7 и (или) 8), 3 – троечник (нет оценок, меньше 4, но есть 4 и (или) 5), 2 – неуспевающий (есть 1 и (или) 2 и (или) 3). Рассортировать массив структур по убыванию полученного признака.
-
Сформировать массив структур, каждый элемент которого содержит следующие четыре поля:
-
курс (вводим);
-
фамилия, имя отчество (вводим);
-
массив оценок (вводим);
-
признак.
Для каждого студента получить одно из следующих значений признака: 5 –отличник (только 9 и (или) 10), 4 – хорошист (нет оценок, меньше 6, но не все 9 или 10, а есть 6 и (или) 7 и (или) 8), 3 – троечник (нет оценок, меньше 4, но есть 4 и (или) 5), 2 – неуспевающий (есть 1 и (или) 2 и (или) 3). Рассортировать массив структур по курсам.
-
Сформировать массив структур, каждый элемент которого содержит следующие четыре поля:
-
группа (вводим);
-
фамилия, имя, отчество (вводим);
-
массив оценок (вводим);
-
материальное положение (вводим, например, 0 — плохое, 1 — обычное, среднее).
Рассортировать массив структур по группам.
-
Сформировать массив структур, каждый элемент которого содержит следующие поля:
-
координаты вершин треугольника на плоскости (вводим);
-
периметр треугольника.
Для каждого треугольника определить периметр. Рассортировать массив структур по периметру.
-
Сформировать массив структур, каждый элемент которого содержит следующие поля:
-
координаты вершин треугольника на плоскости (вводим);
-
площадь треугольника.
Для каждого треугольника определить площадь. Рассортировать массив структур по площади.
-
Сформировать массив структур, каждый элемент которого содержит следующие поля:
-
координаты вершин четырёхугольника на плоскости (вводим);
-
признак четырёхугольника, который принимает одно из следующих значений: 1 – если четырёхугольник находится полностью в первой четверти, 2 – во второй, 3 – в третьей, 4 – в четвёртой четверти, 5 – для всех остальных.
Для каждого четырёхугольника определить этот признак и рассортировать по нему массив структур.
-
Сформировать массив структур, каждый элемент которого содержит следующие поля:
-
координаты вершин четырёхугольника на плоскости (вводим);
-
площадь многоугольника.
Для каждого четырёхугольника определить площадь. Рассортировать массив структур по площади.
8. Сформировать массив структур, каждый элемент которого содержит следующие поля:
-
координаты вершин четырёхугольника на плоскости (вводим);
-
периметр четырёхугольника.
Для каждого четырёхугольника определить периметр. Рассортировать массив структур по периметру.
-
Сформировать массив структур, каждый элемент которого содержит следующие поля:
-
координаты вершин отрезка в трёхмерном пространстве (вводим);
-
длина отрезка.
Для каждого отрезка определить длину. Рассортировать массив структур по длине.
-
Сформировать массив структур, каждый элемент которого содержит следующие поля:
-
координаты центра круга на плоскости (вводим);
-
радиус круга (вводим);
-
площадь круга.
Для каждого круга определить площадь. Рассортировать массив структур по длине.
-
Сформировать массив структур, каждый элемент которого содержит следующие поля:
-
шифр подразделения, содержащий не более трёх символов (вводим);
-
фамилия, имя отчество (вводим);
-
год рождения (вводим);
Для заданного подразделения, шифр которого вводим, рассортировать сотрудников по возрасту.
B. Задачи второго, среднего уровня
-
Сформировать массив структур, каждый элемент которого содержит следующие три поля:
-
фамилия, имя отчество (вводим);
-
массив оценок в десятибалльной системе (вводим);
-
признак.
Для каждого студента получить одно из следующих значений признака: 5 –отличник (только 9 и (или) 10), 4 – хорошист (нет оценок, меньше 6, но не все 9 или 10, а есть 6 и (или) 7 и (или) 8), 3 – троечник (нет оценок, меньше 4, но есть 4 и (или) 5), 2 – неуспевающий (есть 1 и (или) 2 и (или) 3). Рассортировать массив структур по этому полученному признаку. Для одинакового признака сортировать по среднему баллу.
-
Сформировать массив структур, каждый элемент которого содержит следующие четыре поля:
-
курс (вводим);
-
фамилия, имя отчество (вводим);
-
массив оценок в десятибалльной системе (вводим);
-
признак.
Для каждого студента получить одно из следующих значений признака: 5 –отличник (только 9 и (или) 10), 4 – хорошист (нет оценок, меньше 6, но не все 9 или 10, а есть 6 и (или) 7 и (или) 8), 3 – троечник (нет оценок, меньше 4, но есть 4 и (или) 5), 2 – неуспевающий (есть 1 и (или) 2 и (или) 3). Рассортировать массив структур по курсам, внутри курса – по этому полученному признаку.
-
Сформировать массив структур, каждый элемент которого содержит следующие пять полей:
-
курс (вводим);
-
фамилия, имя отчество (вводим);
-
массив оценок в десятибалльной системе (вводим);
-
материальное положение (вводим, например, 0 — плохое, 1 — обычное, среднее);
-
размер стипендии.
Для каждого студента определить размер стипендии, выбрав самостоятельно критерий. Рассортировать массив структур по курсам, внутри курса – по полученной стипендии.
-
Сформировать массив структур, каждый элемент которого содержит следующие поля:
-
координаты вершин треугольника на плоскости (вводим). Использовать предварительно объявленную структуру, содержащую координаты одной точки плоскости;
-
тип треугольника (прямоугольный, остроугольный, тупоугольный);
-
периметр треугольника.
Для каждого треугольника определить тип и периметр. Рассортировать массив структур сначала по типу, а затем по периметру.
-
Сформировать массив структур, каждый элемент которого содержит следующие поля:
-
координаты вершин треугольника на плоскости (вводим). Использовать предварительно объявленную структуру, содержащую координаты одной точки плоскости;
-
тип треугольника (равнобедренный, разносторонний, равносторонний);
-
площадь треугольника.
Для каждого треугольника определить тип и площадь. Рассортировать массив структур сначала по типу, а затем по площади.
-
Сформировать массив структур, каждый элемент которого содержит следующие поля:
-
координаты вершин многоугольника на плоскости (вводим). Использовать предварительно объявленную структуру, содержащую координаты одной точки плоскости;
-
признак многоугольника, который принимает одно из следующих значений: 1 – если многоугольник находится полностью в первой четверти, 2 – во второй, 3 – в третьей, 4 – в четвёртой четверти, 5 – для всех остальных.
Для каждого многоугольника определить этот признак и рассортировать по нему массив структур.
-
Сформировать массив структур, каждый элемент которого содержит следующие поля:
-
координаты вершин многоугольника на плоскости (вводим). Использовать предварительно объявленную структуру, содержащую координаты одной точки плоскости;
-
площадь многоугольника.
Для каждого многоугольника определить площадь. Рассортировать массив структур следующим образом. В начале массива должны находиться многоугольники 1-й четверти по возрастанию найденной площади, а затем — остальные многоугольники в нерассортированном виде, то есть в том же порядке, что и в исходном массиве.
-
Сформировать массив структур, каждый элемент которого содержит следующие поля:
-
координаты вершин многоугольника на плоскости (вводим). Использовать предварительно объявленную структуру, содержащую координаты одной точки плоскости;
-
периметр многоугольника.
Для каждого многоугольника определить периметр. Рассортировать массив структур следующим образом. В начале массива должны находиться многоугольники к-й четверти (к вводим) по возрастанию найденного периметра, а затем — остальные многоугольники в нерассортированном виде, то есть в том же порядке, что и в исходном массиве.
-
Сформировать массив структур, каждый элемент которого содержит следующие поля:
-
координаты вершин отрезка в трёхмерном пространстве (вводим). Использовать предварительно объявленную структуру, содержащую координаты одной точки трёхмерного пространства;
-
длина отрезка.
Для каждого отрезка определить длину. Рассортировать массив структур следующим образом. В начале массива должна находиться рассортированная по возрастанию длины информация об отрезках, для которых все координаты обоих вершин положительны, а затем — об остальных отрезках в нерассортированном виде, то есть в том же порядке, что и в исходном массиве.
-
Сформировать массив структур, каждый элемент которого содержит следующие поля:
-
координаты центра круга на плоскости (вводим). Использовать предварительно объявленную структуру, содержащую координаты одной точки плоскости;
-
радиус круга (вводим);
-
площадь круга.
Для каждого круга определить площадь. Рассортировать массив структур следующим образом. В начале массива должна находиться рассортированная по площади информация о тех кругах, которые находятся выше оси OX, а затем — об остальных кругах в нерассортированном виде, то есть в том же порядке, что и в исходном массиве.
-
Сформировать массив структур, каждый элемент которого содержит следующие поля:
-
шифр подразделения, содержащий не более трёх символов (вводим);
-
фамилия, имя, отчество (вводим);
-
год рождения (вводим);
-
образование, например, 0 – неоконченное базовое, 1 – базовое, 2 – общее среднее и т. д. (вводим).
Для заданного подразделения, шифр которого вводим, рассортировать сотрудников сначала по образованию, а затем по возрасту. Информация об остальных сотрудниках должна следовать в том же порядке, что и в исходном массиве.
-
Сформировать массив структур, каждый элемент которого содержит следующие поля:
-
шифр подразделения, содержащий не более трёх символов (вводим);
-
план выпуска продукции по кварталам одного года в виде массива (вводим);
-
фактическое выполнение плана по кварталам одного года в виде массива (вводим).
Рассортировать массив структур следующим образом: сначала должна быть информация о тех подразделениях, которые выполнили план во всех кварталах, затем о тех, кто выполнил план в трёх кварталах, и т. д.
Лабораторная работа 7
Темы: Объединения, поля битов, перечисления.
Требования и общие указания к заданиям:
-
кроме выполнения индивидуальных заданий, выполнить компьютерный эксперимент с примерами, приведёнными в §§ 5, 6, 7.
-
в вариантах 1—8 выполнить одно и то же задание двумя из предложенных способов: обязательно третий и на выбор один из остальных в качестве повторения.
Варианты заданий:
-
Перевести целое положительное двухбайтное число из десятичной в двоичную систему счисления:
-
(повторение) используя алгоритм деления на 2 (см. первый семестр);
-
(повторение) используя битовые операции (см. первый семестр);
-
используя объединение и поля битов.
-
-
Перевести целое отрицательное двухбайтное число из десятичной в двоичную систему счисления:
-
(повторение) используя алгоритм деления на 2 (см. первый семестр);
-
(повторение) используя битовые операции (см. первый семестр);
-
используя объединение и поля битов.
-
-
Перевести целое положительное четырёхбайтное число из десятичной в двоичную систему счисления:
-
(повторение) используя алгоритм деления на 2 (см. первый семестр);
-
(повторение) используя битовые операции (см. первый семестр);
-
используя объединение и поля битов.
-
-
Перевести целое отрицательное четырёхбайтное число из десятичной в двоичную систему счисления:
-
(повторение) используя алгоритм деления на 2 (см. первый семестр);
-
(повторение) используя битовые операции (см. первый семестр);
-
используя объединение и поля битов.
-
-
Перевести целое положительное двухбайтное число из десятичной в шестнадцатеричную систему счисления:
-
(повторение) используя алгоритм деления на 16 (см. первый семестр);
-
(повторение) используя битовые операции (см. первый семестр);
-
используя объединение и поля битов.
-
-
Перевести целое отрицательное двухбайтное число из десятичной в шестнадцатеричную систему счисления:
-
(повторение) используя алгоритм деления на 2 (см. первый семестр);
-
(повторение) используя битовые операции (см. первый семестр);
-
используя объединение и поля битов.
-
-
Перевести целое положительное четырёхбайтное число из десятичной в шестнадцатеричную систему счисления:
-
(повторение) используя алгоритм деления на 16 (см. первый семестр);
-
(повторение) используя битовые операции (см. первый семестр);
-
используя объединение и поля битов.
-
-
Перевести целое отрицательное четырёхбайтное число из десятичной в шестнадцатеричную систему счисления:
-
(повторение) используя алгоритм деления на 2 (см. первый семестр);
-
(повторение) используя битовые операции (см. первый семестр);
-
используя объединение и поля битов.
-
-
Запрограммировать калькулятор на четыре арифметические действия: сложение, вычитание, умножение, деление. С помощью перечисляемого типа предусмотреть следующие возможные ошибки: неверная операция, которая должна вводиться с экрана; деление на нуль и другие; отсутствие ошибок. Вывести соответствующие сообщения.
-
Запрограммировать калькулятор на битовые операции. С помощью перечисляемого типа предусмотреть следующие возможные ошибки: неверная операция, которая должна вводиться с экрана; операнды в операциях имеют не целый тип и другие; отсутствие ошибок. Вывести соответствующие сообщения.
-
Запрограммировать калькулятор для перевода целых чисел из десятичной в двоичную систему счисления, из десятичной в шестнадцатеричную и из шестнадцатеричной в двоичную систему счисления. С помощью перечисляемого типа предусмотреть следующие возможные ошибки: операнды в операциях имеют не целый тип; операнд записан не в требуемой системе счисления и другие; отсутствие ошибок. Вывести соответствующие сообщения.
-
Запрограммировать калькулятор для перевода целых чисел из двоичной в десятичную систему счисления, из шестнадцатеричной в десятичную и из двоичной в шестнадцатеричную систему счисления. С помощью перечисляемого типа предусмотреть следующие возможные ошибки: операнды в операциях имеют не целый тип; операнд записан не в требуемой системе счисления и другие; отсутствие ошибок. Вывести соответствующие сообщения.
Лабораторная работа 8
Тема. Списки.
Требования и общие указания к заданиям:
разработать класс для работы со списком, включив в него конструктор, деструктор и методы для создания и просмотра элементов списка, а также методы, реализующие основную часть в зависимости от варианта задания.
П р и м е р 1. Работа со списком целых чисел в классе.
struct tsp
{ /* Информационная часть, состоящая из одного поля. */
int num;
tsp * next; /* Адресная часть, состоящая из одного поля. */
};
class clsp
{ tsp *P; // Адрес начала списка.
int n; // Количество элементов списка.
public:
// Конструктор для задания количества элементов списка.
clsp(int k) { n=k;}
// Метод для создания списка.
void CREATE1();
/* Метод для просмотра элементов списка (вывод на экран). */
void LOOK();
/* Метод DEL удаляет все элементы списка, информационная часть которых содержит отрицательные числа (дальше будем писать просто “… отрицательные числа”). Возвращает количество удалённых элементов. */
void DEL (int &);
/* Метод, который после каждого чётного числа вставляет это же число, увеличенное в 10 раз.*/
void INS ();
/* Метод для сортировки списка методом нахождения наименьшего числа. */
void SORT();
};
void clsp::CREATE1()
{ tsp *T, *Q;
/* Создаём фиктивный элемент списка, который никогда не удаляем и перед которым ничего не вставляем. Используется, чтобы вставка в начало списка и удаление первого элемента выполнялись с помощью одинаковых алгоритмов. */
T=new tsp;
T->num=0;
P=T;
for (int i=1; i<=n;i++)
{ // Резервируем память для одного элемента списка.
Q=new tsp;
// Определяем информационную часть нового элемента.
cin>>Q->num;
// “Cоединяем” его с предыдущим элементом.
T->next=Q;
T=Q;
}
/*Последний элемент должен содержать адрес NULL. */
Q->next=NULL;
};
void clsp::LOOK()
{ tsp *Q;
/* Вывод количества элементов, которое после вставки или удаления будет меняться. */
cout<<"\nn="<<n<<endl;
/* Так как в начале списка размещается фиктивный элемент, то переходим на второй, то есть на первый реальный элемент. Фиктивный элемент не выводим. */
Q=P->next;
while ( Q) // или while (Q!=NULL)
{ cout<<Q->num<<" "; // Вывод информационной части.
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->num<Qmin->num)
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 <<endl<< "number of elements n="; cin>>n2;
clsp OBSP(n2); // Создание объекта
OBSP.CREATE1();
cout << endl<<"Looking of elements"; OBSP.LOOK();
flag=1; while (flag)
{ cout << "1 -- DELETE"<<endl<< "2 -- INSERT"<<endl<<
"3 -- LOOK"<<endl<< "4 -- SORT"<<endl<<
"0 -- EXIT"<<endl;
cin>>flag; switch (flag)
{ case 1: OBSP.DEL(ndel);
cout << endl<<" After deleting"<<endl;
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<<endl<<"Error!!!!! Repeat!!!!"<<endl;
}
}
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; j<T->num; 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; j<Q->num; j++)
cin>>Q->arr1[j];
/* “Cцепляем” с предыдущим элементом, т. е. “присоединяем” новый элемент в конец списка.*/
T->next=Q;
T=Q; }
Q->next=NULL; };
// Функция выводит матрицу на экран (см. прим. 1).
void clsp::LOOK()
{ tsp *Q;
cout<<"\nn="<<n<<endl;
Q=P->next;
while ( Q)
{ cout<<" Number="<<Q->num<<" ";
for(int j=0; j<Q->num; j++)
cout<<Q->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<<endl;
/* Выводим удалённый из списка элемент, т. е. одну строку. */
for(int j=0; j<T->num; j++)
cout<<T->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 <n0)
{ n++;
// Резервируем память для нового элемента списка.
T=new tsp;
T->num=Q->num;
// Выделяем память для одной строки матрицы.
T->arr1=new int[T->num];
cout<<"\nInput "<< Q->num <<" elements\n";
// Вводим новую строку матрицы.
for(int j=0; j<T->num; 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 <<endl<< "Number of elements n="; cin>>n2;
clsp OBSP(n2); OBSP.CREATE1();
cout << endl<<"Looking of elements";
OBSP.LOOK(); flag=1;
while (flag)
{ cout << "1 -- DELETE"<<endl<< "2 -- INSERT"<<endl<<
"3 -- LOOK"<<endl<< "0 -- EXIT"<<endl;
cin>>flag;
switch (flag)
{ case 1: cout<<"Max0= "; cin>>Max0;
OBSP.DEL(Max0, ndel);
cout << endl<<" After deleting"<<endl;
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<<endl<<"Error!!!!! Repeat!!!!"<<endl; } }
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<<endl;
/* Переходим в вершину стека. */
Q=P;
for (int i=0;i<k && Q;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"<<endl<< "2 -- DELETE"<<endl<<
"3 -- NUMBER"<<endl<< "4 -- LOOK2"<<endl<<
"0 -- EXIT"<<endl;
cin>>flag;
switch (flag)
{ case 1: STECK.INS(); break;
case 2: STECK.DEL(); break;
case 3: cout<<"\nThere are "
<<STECK.NUMBER()<<" elements\n";
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 "<<n0<<" elements. Repeat! \n";
} break;
case 0: flag=0; break;
default: cout<<endl<<"Error!!!!! Repeat!!!!"<<endl;
} }
return 0; }
Варианты заданий.
-
Задачи первого, простого уровня.
-
Создать список вещественных чисел. Найти разность между наибольшим и наименьшим элементами.
-
Создать список, в информационной части элементов которого находятся координаты вершин многоугольника плоскости. Найти периметр многоугольника.
-
Создать список, в информационной части элементов которого находятся координаты вершин многоугольника плоскости. Определить, находится ли точка с заданными координатами на одной из сторон многоугольника.
-
Создать список, в информационной части элементов которого находятся длины сторон треугольника плоскости. Найти треугольник максимальной площади.
-
Создать список, в информационной части элементов которого находятся координаты одной точки плоскости. Найти количество точек каждой из четвертей плоскости.
-
Создать список, в информационной части элементов которого находятся координаты одной точки плоскости. Найти одну, любую точку, расстояние от которой до заданной точки наименьшее.
-
Создать список, в информационной части элементов которого находятся координаты одной точки плоскости. Найти количество точек, находящихся внутри кольца, ограниченного окружностями с общим центром, радиусы которых r и R (r < R).
-
-
Создать список целых чисел. Есть ли среди них общий делитель? Есть ли среди них общее кратное?
-
Создать список слов. Найти количество слов, начинающихся и заканчивающихся одинаковой буквой.
-
Создать список слов. Найти и вывести слова, у которых гласных больше половины.
-
Создать список слов. Найти и вывести слова, длина которых меньше средней длины всех слов.
-
Создать список, в информационной части элемента которого одномерный массив фиксированной размерности, т. е. в виде списка представить матрицу, количество строк (элементов списка) которой произвольное, а количество чисел в каждой строке одинаковое и задано в виде константы. Найти количество строк, в которых больше половины чисел имеют значение, меньшее чем среднеарифметическое данной строки.
-
Создать список, в информационной части элемента которого одномерный массив оценок одного студента фиксированной размерности, т. е. в виде списка представить матрицу, количество строк (элементов списка) которой произвольное, а количество оценок в каждой строке одинаковое и задано в виде константы. Найти количество отличников.