Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб2Сем.doc
Скачиваний:
14
Добавлен:
29.02.2016
Размер:
603.65 Кб
Скачать
  1. Задачи второго, среднего уровня

Можно использовать любой алгоритм сортировки.

  1. Рассортировать строки динамической матрицы с одинаковым количеством элементов в каждой строке по i-му наименьшему элементу строки, где i – номер строки.

  2. Рассортировать строки динамической матрицы с одинаковым количеством элементов в каждой строке по количеству простых чисел.

  3. Среди наименьших элементов динамической матрицы с одинаковым количеством элементов в каждой строке найти наибольший.

  4. Сколько различных чисел в каждой строке динамической матрицы с одинаковым количеством элементов в каждой строке?

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

  6. Создать нижний относительно главной диагонали треугольник динамической квадратной матрицы. Рассортировать строки матрицы по возрастанию наибольших элементов строк.

  7. Создать верхний относительно главной диагонали треугольник динамической квадратной матрицы. Рассортировать строки матрицы по возрастанию последних элементов строк.

  8. Создать нижний относительно побочной диагонали треугольник динамической квадратной матрицы. Рассортировать строки матрицы по возрастанию первых элементов строк.

  9. Создать верхний относительно побочной диагонали треугольник динамической квадратной матрицы. Рассортировать строки матрицы по возрастанию их средних значений.

  10. Строки динамической матрицы с разным количеством элементов в строках рассортировать по возрастанию их сумм, а если суммы одинаковы, то сортировать по убыванию их средних значений.

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

  12. Создать динамическую матрицу с разным количеством текущих оценок в строках. Рассортировать строки следующим образом: сначала должны быть строки с оценками отличников (9, 10), затем те, в которых наименьшая оценка >=6 (хорошисты) и т.д.

  13. Найти поэлементную сумму двух симметрических относительно главной диагонали квадратных матриц. Для каждой симметричной матрицы в памяти создать её верхний или нижний относительно главной диагонали треугольник.

  14. Найти поэлементную разность двух симметрических относительно побочной диагонали квадратных матриц. Для каждой симметрической матрицы в памяти создать её верхний или нижний относительно побочной диагонали треугольник.

С. Задачи повышенной сложности

Численные методы линейной алгебры.

  1. Найти произведение двух симметрических относительно главной диагонали квадратных матриц. Для каждой симметрической матрицы в памяти создать её верхний или нижний относительно главной диагонали треугольник.

  2. Найти поэлементную разность двух симметрических относительно побочной диагонали квадратных матриц. Для каждой симметрической матрицы в памяти создать её верхний или нижний относительно побочной диагонали треугольник.

  3. Создать динамическую матрицу с разным количеством текущих оценок в строках. Рассортировать строки, в которых нет 1, 2, или 3, по их среднему значению. Строки, в которых есть плохие оценки, в сортировке не должны участвовать.

  4. Методом Гаусса решить систему n линейных алгебраических уравнений c n неизвестными. Создать и использовать динамическую матрицу и динамический одномерный массив.

  5. Методом Гаусса, используя схему выбора главного элемента, решить систему n линейных алгебраических уравнений c n неизвестными. Создать и использовать динамическую матрицу и динамический одномерный массив.

  6. Обратить динамическую квадратную матрицу по схеме единственного деления.

  7. Вычислить определитель динамической квадратной матрицы, используя метод Гаусса.

  8. Методом простой итерации решить систему n линейных алгебраических уравнений c n неизвестными. Создать и использовать динамическую матрицу и динамический одномерный массив.

  9. Методом Зейделя решить систему n линейных алгебраических уравнений c n неизвестными. Создать и использовать динамическую матрицу и динамический одномерный массив.

  10. Найти собственные числа и собственные векторы матрицы методом непосредственного вычисления определителя.

  11. Методом итераций найти наибольшее по модулю собственное значение и соответствующий ему собственный вектор динамической матрицы.

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

Тема. Cтруктуры.

Требования и общие указания к заданиям:

Одно и то же задание выполнить двумя способами:

        1. использовать статический массив в структуре и статический массив структур (см. прим. 1). При этом количество структур (в примере количество студентов (n)) и количество элементов массива в структуре (в примере количество оценок для одного студента (m) ) — константы;

        2. задание выполнить с помощью динамических массивов (прим. 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. Задачи первого, простого уровня.

  1. Сформировать массив структур, каждый элемент которого содержит следующие три поля:

  • фамилия, имя, отчество (вводим);

  • массив оценок (вводим);

  • признак.

Для каждого студента получить одно из следующих значений признака: 5 –отличник (только 9 и (или) 10), 4 – хорошист (нет оценок, меньше 6, но не все 9 или 10, а есть 6 и (или) 7 и (или) 8), 3 – троечник (нет оценок, меньше 4, но есть 4 и (или) 5), 2 – неуспеваю­щий (есть 1 и (или) 2 и (или) 3). Рассортировать массив структур по убыванию полученного признака.

  1. Сформировать массив структур, каждый элемент которого содержит следующие че­тыре поля:

  • курс (вводим);

  • фамилия, имя отчество (вводим);

  • массив оценок (вводим);

  • признак.

Для каждого студента получить одно из следующих значений признака: 5 –отличник (только 9 и (или) 10), 4 – хорошист (нет оценок, меньше 6, но не все 9 или 10, а есть 6 и (или) 7 и (или) 8), 3 – троечник (нет оценок, меньше 4, но есть 4 и (или) 5), 2 – неуспеваю­щий (есть 1 и (или) 2 и (или) 3). Рассорти­ровать массив структур по курсам.

  1. Сформировать массив структур, каждый элемент которого содержит следующие четыре поля:

  • группа (вводим);

  • фамилия, имя, отчество (вводим);

  • массив оценок (вводим);

  • материальное положение (вводим, например, 0 — плохое, 1 — обычное, среднее).

Рассортировать массив структур по группам.

  1. Сформировать массив структур, каждый элемент которого содержит следующие поля:

  • координаты вершин треугольника на плоскости (вводим);

  • периметр треугольника.

Для каждого треугольника определить периметр. Рассортировать массив структур по периметру.

  1. Сформировать массив структур, каждый элемент которого содержит следующие поля:

  • координаты вершин треугольника на плоскости (вводим);

  • площадь треугольника.

Для каждого треугольника определить площадь. Рассортировать массив структур по площади.

  1. Сформировать массив структур, каждый элемент которого содержит следующие поля:

  • координаты вершин четырёхугольника на плоскости (вводим);

  • признак четырёхугольника, который принимает одно из следующих значений: 1 – если четырёхугольник находится полностью в первой четверти, 2 – во второй, 3 – в третьей, 4 – в четвёртой четверти, 5 – для всех остальных.

Для каждого четырёхугольника определить этот признак и рассортировать по нему массив структур.

  1. Сформировать массив структур, каждый элемент которого содержит следующие поля:

  • координаты вершин четырёхугольника на плоскости (вводим);

  • площадь многоугольника.

Для каждого четырёхугольника определить площадь. Рассортировать массив структур по площади.

8. Сформировать массив структур, каждый элемент которого содержит следующие поля:

  • координаты вершин четырёхугольника на плоскости (вводим);

  • периметр четырёхугольника.

Для каждого четырёхугольника определить периметр. Рассортировать массив структур по периметру.

  1. Сформировать массив структур, каждый элемент которого содержит следующие поля:

  • координаты вершин отрезка в трёхмерном пространстве (вводим);

  • длина отрезка.

Для каждого отрезка определить длину. Рассортировать массив структур по длине.

  1. Сформировать массив структур, каждый элемент которого содержит следующие поля:

  • координаты центра круга на плоскости (вводим);

  • радиус круга (вводим);

  • площадь круга.

Для каждого круга определить площадь. Рассортировать массив структур по длине.

  1. Сформировать массив структур, каждый элемент которого содержит следующие поля:

  • шифр подразделения, содержащий не более трёх символов (вводим);

  • фамилия, имя отчество (вводим);

  • год рождения (вводим);

Для заданного подразделения, шифр которого вводим, рассортировать сотрудников по возрасту.

B. Задачи второго, среднего уровня

  1. Сформировать массив структур, каждый элемент которого содержит следующие три поля:

  • фамилия, имя отчество (вводим);

  • массив оценок в десятибалльной системе (вводим);

  • признак.

Для каждого студента получить одно из следующих значений признака: 5 –отличник (только 9 и (или) 10), 4 – хорошист (нет оценок, меньше 6, но не все 9 или 10, а есть 6 и (или) 7 и (или) 8), 3 – троечник (нет оценок, меньше 4, но есть 4 и (или) 5), 2 – неуспеваю­щий (есть 1 и (или) 2 и (или) 3). Рассортировать массив структур по этому полученному признаку. Для одинакового признака сортировать по среднему баллу.

  1. Сформировать массив структур, каждый элемент которого содержит следующие че­тыре поля:

  • курс (вводим);

  • фамилия, имя отчество (вводим);

  • массив оценок в десятибалльной системе (вводим);

  • признак.

Для каждого студента получить одно из следующих значений признака: 5 –отличник (только 9 и (или) 10), 4 – хорошист (нет оценок, меньше 6, но не все 9 или 10, а есть 6 и (или) 7 и (или) 8), 3 – троечник (нет оценок, меньше 4, но есть 4 и (или) 5), 2 – неуспеваю­щий (есть 1 и (или) 2 и (или) 3). Рассорти­ровать массив структур по курсам, внутри курса – по этому полученному признаку.

  1. Сформировать массив структур, каждый элемент которого содержит следующие пять полей:

  • курс (вводим);

  • фамилия, имя отчество (вводим);

  • массив оценок в десятибалльной системе (вводим);

  • материальное положение (вводим, например, 0 — плохое, 1 — обычное, среднее);

  • размер стипендии.

Для каждого студента определить размер стипендии, выбрав самостоятельно критерий. Рассортировать массив структур по курсам, внутри курса – по полученной сти­пендии.

  1. Сформировать массив структур, каждый элемент которого содержит следующие поля:

  • координаты вершин треугольника на плоскости (вводим). Использовать предвари­тельно объявленную структуру, содержащую координаты одной точки плоскости;

  • тип треугольника (прямоугольный, остроугольный, тупоугольный);

  • периметр треугольника.

Для каждого треугольника определить тип и периметр. Рассортировать массив структур сначала по типу, а затем по периметру.

  1. Сформировать массив структур, каждый элемент которого содержит следующие поля:

  • координаты вершин треугольника на плоскости (вводим). Использовать предвари­тельно объявленную структуру, содержащую координаты одной точки плоскости;

  • тип треугольника (равнобедренный, разносторонний, равносторонний);

  • площадь треугольника.

Для каждого треугольника определить тип и площадь. Рассортировать массив структур сначала по типу, а затем по площади.

  1. Сформировать массив структур, каждый элемент которого содержит следующие поля:

  • координаты вершин многоугольника на плоскости (вводим). Использовать предвари­тельно объявленную структуру, содержащую координаты одной точки плоскости;

  • признак многоугольника, который принимает одно из следующих значений: 1 – если многоугольник находится полностью в первой четверти, 2 – во второй, 3 – в третьей, 4 – в четвёртой четверти, 5 – для всех остальных.

Для каждого многоугольника определить этот признак и рассортировать по нему массив структур.

  1. Сформировать массив структур, каждый элемент которого содержит следующие поля:

  • координаты вершин многоугольника на плоскости (вводим). Использовать предвари­тельно объявленную структуру, содержащую координаты одной точки плоскости;

  • площадь многоугольника.

Для каждого многоугольника определить площадь. Рассортировать массив структур следующим образом. В начале массива должны находиться многоугольники 1-й четверти по возрастанию найденной площади, а затем — остальные многоугольники в нерассортированном виде, то есть в том же порядке, что и в исходном массиве.

  1. Сформировать массив структур, каждый элемент которого содержит следующие поля:

  • координаты вершин многоугольника на плоскости (вводим). Использовать предвари­тельно объявленную структуру, содержащую координаты одной точки плоскости;

  • периметр многоугольника.

Для каждого многоугольника определить периметр. Рассортировать массив структур следующим образом. В начале массива должны находиться многоугольники к-й четверти (к вводим) по возрастанию найденного периметра, а затем — остальные многоугольники в нерассортированном виде, то есть в том же порядке, что и в исходном массиве.

  1. Сформировать массив структур, каждый элемент которого содержит следующие поля:

  • координаты вершин отрезка в трёхмерном пространстве (вводим). Использовать пред­варительно объявленную структуру, содержащую координаты одной точки трёхмерного пространства;

  • длина отрезка.

Для каждого отрезка определить длину. Рассортировать массив структур следующим образом. В начале массива должна находиться рассортированная по возрастанию длины информация об отрезках, для которых все коорди­наты обоих вершин положительны, а затем — об остальных отрезках в нерассортированном виде, то есть в том же порядке, что и в исходном массиве.

  1. Сформировать массив структур, каждый элемент которого содержит следующие поля:

  • координаты центра круга на плоскости (вводим). Использовать предварительно объ­явленную структуру, содержащую координаты одной точки плоскости;

  • радиус круга (вводим);

  • площадь круга.

Для каждого круга определить площадь. Рассортировать массив структур следующим образом. В начале массива должна находиться рассортированная по площади информация о тех кругах, которые находятся выше оси OX, а затем — об остальных кругах в нерассортированном виде, то есть в том же порядке, что и в исходном массиве.

  1. Сформировать массив структур, каждый элемент которого содержит следующие поля:

  • шифр подразделения, содержащий не более трёх символов (вводим);

  • фамилия, имя, отчество (вводим);

  • год рождения (вводим);

  • образование, например, 0 – неоконченное базовое, 1 – базовое, 2 – общее среднее и т. д. (вводим).

Для заданного подразделения, шифр которого вводим, рассортировать сотрудников сна­чала по образованию, а затем по возрасту. Информация об остальных сотрудниках должна следовать в том же порядке, что и в исходном массиве.

  1. Сформировать массив структур, каждый элемент которого содержит следующие поля:

  • шифр подразделения, содержащий не более трёх символов (вводим);

  • план выпуска продукции по кварталам одного года в виде массива (вводим);

  • фактическое выполнение плана по кварталам одного года в виде массива (вводим).

Рассортировать массив структур следующим образом: сначала должна быть информация о тех подразделениях, которые выполнили план во всех кварталах, затем о тех, кто выпол­нил план в трёх кварталах, и т. д.

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

Темы: Объединения, поля битов, перечисления.

Требования и общие указания к заданиям:

  • кроме выполнения индивидуальных заданий, выполнить компьютерный эксперимент с примерами, приведёнными в §§ 5, 6, 7.

  • в вариантах 1—8 выполнить одно и то же задание двумя из предложенных способов: обязательно третий и на выбор один из остальных в качестве повторения.

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

  1. Перевести целое положительное двухбайтное число из десятичной в двоичную систему счисления:

    1. (повторение) используя алгоритм деления на 2 (см. первый семестр);

    2. (повторение) используя битовые операции (см. первый семестр);

    3. используя объединение и поля битов.

  2. Перевести целое отрицательное двухбайтное число из десятичной в двоичную систему счисления:

    1. (повторение) используя алгоритм деления на 2 (см. первый семестр);

    2. (повторение) используя битовые операции (см. первый семестр);

    3. используя объединение и поля битов.

  3. Перевести целое положительное четырёхбайтное число из десятичной в двоичную систему счисления:

    1. (повторение) используя алгоритм деления на 2 (см. первый семестр);

    2. (повторение) используя битовые операции (см. первый семестр);

    3. используя объединение и поля битов.

  4. Перевести целое отрицательное четырёхбайтное число из десятичной в двоичную систему счисления:

    1. (повторение) используя алгоритм деления на 2 (см. первый семестр);

    2. (повторение) используя битовые операции (см. первый семестр);

    3. используя объединение и поля битов.

  5. Перевести целое положительное двухбайтное число из десятичной в шестнадцатеричную систему счисления:

    1. (повторение) используя алгоритм деления на 16 (см. первый семестр);

    2. (повторение) используя битовые операции (см. первый семестр);

    3. используя объединение и поля битов.

  6. Перевести целое отрицательное двухбайтное число из десятичной в шестнадцатеричную систему счисления:

    1. (повторение) используя алгоритм деления на 2 (см. первый семестр);

    2. (повторение) используя битовые операции (см. первый семестр);

    3. используя объединение и поля битов.

  7. Перевести целое положительное четырёхбайтное число из десятичной в шестнадцатеричную систему счисления:

    1. (повторение) используя алгоритм деления на 16 (см. первый семестр);

    2. (повторение) используя битовые операции (см. первый семестр);

    3. используя объединение и поля битов.

  8. Перевести целое отрицательное четырёхбайтное число из десятичной в шестнадцатеричную систему счисления:

    1. (повторение) используя алгоритм деления на 2 (см. первый семестр);

    2. (повторение) используя битовые операции (см. первый семестр);

    3. используя объединение и поля битов.

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

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

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

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

Лабораторная работа 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; }

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

    1. Задачи первого, простого уровня.

      1. Создать список вещественных чисел. Найти разность между наибольшим и наименьшим элементами.

      2. Создать список, в информационной части элементов которого находятся координаты вершин многоугольника плоскости. Найти периметр многоугольника.

      3. Создать список, в информационной части элементов которого находятся координаты вершин многоугольника плоскости. Определить, находится ли точка с заданными координатами на одной из сторон многоугольника.

      4. Создать список, в информационной части элементов которого находятся длины сторон треугольника плоскости. Найти треугольник максимальной площади.

      5. Создать список, в информационной части элементов которого находятся координаты одной точки плоскости. Найти количество точек каждой из четвертей плоскости.

      6. Создать список, в информационной части элементов которого находятся координаты одной точки плоскости. Найти одну, любую точку, расстояние от которой до заданной точки наименьшее.

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

  1. Создать список целых чисел. Есть ли среди них общий делитель? Есть ли среди них общее кратное?

  2. Создать список слов. Найти количество слов, начинающихся и заканчивающихся одинаковой буквой.

  3. Создать список слов. Найти и вывести слова, у которых гласных больше половины.

  4. Создать список слов. Найти и вывести слова, длина которых меньше средней длины всех слов.

  5. Создать список, в информационной части элемента которого одномерный массив фиксированной размерности, т. е. в виде списка представить матрицу, количество строк (элементов списка) которой произвольное, а количество чисел в каждой строке одинаковое и задано в виде константы. Найти количество строк, в которых больше половины чисел имеют значение, меньшее чем среднеарифметическое данной строки.

  6. Создать список, в информационной части элемента которого одномерный массив оценок одного студента фиксированной размерности, т. е. в виде списка представить матрицу, количество строк (элементов списка) которой произвольное, а количество оценок в каждой строке одинаковое и задано в виде константы. Найти количество отличников.