Какие из строк (//1 – //9) правильные?
11. Дан код:
union TU2 { struct { unsigned short lo;
unsigned short hi;
} w;
int k;
} N;
N.k=0´12345678; cout<<hex<<N<<endl;
cout<<hex<<N.lo<<endl; cout<<hex<<N.hi<<endl;
Что будет выведено? Варианты ответа:
1) 12345678, в следующей строке 1234 и ещё ниже 5678
2) 12345678, в следующей строке 5678 и ещё ниже 1234
3) Ошибка компиляции при объявлении объединения.
4) Ошибка компиляции в “командах” вывода.
12. Дан код:
struct tst { int l; float * coord; float per; } s1;
tst s2=s1; //1
tst *s2= new tst; //2
tst *s2=&s1; //3
tst &s2=s1 //4
tst &s2=*s1; //5
В каких вариантах правильно объявлена переменная ссылочного типа для структуры?
13. Дан код:
struct tb { unsigned b1:1; //1
unsigned *b2:1=&b1; //2
unsigned &b3:1=b1; //3
unsigned :5; //4
unsigned b4:1; }; //5
В каких строках (//1—//5) есть ошибки?
Лабораторная работа 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). Рассортировать массив структур по убыванию полученного признака.
2. Сформировать массив структур, каждый элемент которого содержит следующие четыре поля:
курс (вводим);
фамилия, имя отчество (вводим);
массив оценок в десятибалльной системе (вводим);
признак.
Для каждого студента получить одно из следующих значений признака: 5 –отличник (только 9 и (или) 10), 4 – хорошист (нет оценок, меньше 6, но не все 9 или 10, а есть 6 и (или) 7 и (или) 8), 3 – троечник (нет оценок, меньше 4, но есть 4 и (или) 5), 2 – неуспевающий (есть 1 и (или) 2 и (или) 3). Рассортировать массив структур по курсам.
3. Сформировать массив структур, каждый элемент которого содержит следующие пять полей:
группа (вводим);
фамилия, имя отчество (вводим);
массив оценок в десятибалльной системе (вводим);
материальное положение (вводим, например, 0 — плохое, 1 — обычное, среднее).
Рассортировать массив структур по группам.
4. Сформировать массив структур, каждый элемент которого содержит следующие поля:
координаты вершин треугольника на плоскости (вводим);
периметр треугольника;
Для каждого треугольника определить периметр. Рассортировать массив структур по периметру.
5. Сформировать массив структур, каждый элемент которого содержит следующие поля:
координаты вершин треугольника на плоскости (вводим).
площадь треугольника;
Для каждого треугольника определить площадь. Рассортировать массив структур по площади.
6. Сформировать массив структур, каждый элемент которого содержит следующие поля:
координаты вершин четырёхугольника на плоскости (вводим).
признак четырёхугольника, который принимает одно из следующих значений: 1 – если четырёхугольник находится полностью в первой четверти, 2 – во второй, 3 – в третьей, 4 – в четвёртой четверти, 5 – для всех остальных.
Для каждого четырёхугольника определить этот признак и рассортировать по нему массив структур.
7. Сформировать массив структур, каждый элемент которого содержит следующие поля:
координаты вершин четырёхугольника на плоскости (вводим);
площадь многоугольника.
Для каждого четырёхугольника определить площадь. Рассортировать массив структур по площади.
8. Сформировать массив структур, каждый элемент которого содержит следующие поля:
координаты вершин четырёхугольника на плоскости (вводим);
периметр четырёхугольника.
Для каждого четырёхугольника определить периметр. Рассортировать массив структур по периметру.
9. Сформировать массив структур, каждый элемент которого содержит следующие поля:
координаты вершин отрезка в 3-хмерном пространстве (вводим);
длина отрезка.
Для каждого отрезка определить длину. Рассортировать массив структур по длине.
10. Сформировать массив структур, каждый элемент которого содержит следующие поля:
координаты центра круга на плоскости (вводим);
радиус круга (вводим);
площадь круга.
Для каждого круга определить площадь. Рассортировать массив структур по длине.
11. Сформировать массив структур, каждый элемент которого содержит следующие поля:
шифр подразделения, содержащий не более трёх символов (вводим);
фамилия, имя отчество (вводим);
год рождения (вводим);
Для заданного подразделения, шифр которого вводим, рассортировать сотрудников по возрасту.
B. Задачи второго среднего уровня.
1. Сформировать массив структур, каждый элемент которого содержит следующие три поля:
фамилия, имя отчество (вводим);
массив оценок в десятибалльной системе (вводим);
признак.
Для каждого студента получить одно из следующих значений признака: 5 –отличник (только 9 и (или) 10), 4 – хорошист (нет оценок, меньше 6, но не все 9 или 10, а есть 6 и (или) 7 и (или) 8), 3 – троечник (нет оценок, меньше 4, но есть 4 и (или) 5), 2 – неуспевающий (есть 1 и (или) 2 и (или) 3). Рассортировать массив структур по этому полученному признаку. Для одинакового признака сортировать по среднему баллу.
2. Сформировать массив структур, каждый элемент которого содержит следующие четыре поля:
курс (вводим);
фамилия, имя отчество (вводим);
массив оценок в десятибалльной системе (вводим);
признак.
Для каждого студента получить одно из следующих значений признака: 5 –отличник (только 9 и (или) 10), 4 – хорошист (нет оценок, меньше 6, но не все 9 или 10, а есть 6 и (или) 7 и (или) 8), 3 – троечник (нет оценок, меньше 4, но есть 4 и (или) 5), 2 – неуспевающий (есть 1 и (или) 2 и (или) 3). Рассортировать массив структур по курсам, внутри курса – по этому полученному признаку.
3. Сформировать массив структур, каждый элемент которого содержит следующие пять полей:
курс (вводим);
фамилия, имя отчество (вводим);
массив оценок в десятибалльной системе (вводим);
материальное положение (вводим, например, 0 — плохое, 1 — обычное, среднее).
размер стипендии.
Для каждого студента определить размер стипендии, выбрав самостоятельно критерий. Рассортировать массив структур по курсам, внутри курса – по полученной стипендии.
4. Сформировать массив структур, каждый элемент которого содержит следующие поля:
координаты вершин треугольника на плоскости (вводим). Использовать предварительно объявленную структуру, содержащую координаты одной точки плоскости;
тип треугольника (прямоугольный, остроугольный, тупоугольный);
периметр треугольника;
Для каждого треугольника определить тип и периметр. Рассортировать массив структур сначала по типу, а затем по периметру.
5. Сформировать массив структур, каждый элемент которого содержит следующие поля:
координаты вершин треугольника на плоскости (вводим). Использовать предварительно объявленную структуру, содержащую координаты одной точки плоскости;
тип треугольника (равнобедренный, разносторонний, равносторонний);
площадь треугольника;
Для каждого треугольника определить тип и площадь. Рассортировать массив структур сначала по типу, а затем по площади.
6. Сформировать массив структур, каждый элемент которого содержит следующие поля:
координаты вершин многоугольника на плоскости (вводим). Использовать предварительно объявленную структуру, содержащую координаты одной точки плоскости;
признак многоугольника, который принимает одно из следующих значений: 1 – если многоугольник находится полностью в первой четверти, 2 – во второй, 3 – в третьей, 4 – в четвёртой четверти, 5 – для всех остальных.
Для каждого многоугольника определить этот признак и рассортировать по нему массив структур.
7. Сформировать массив структур, каждый элемент которого содержит следующие поля:
координаты вершин многоугольника на плоскости (вводим). Использовать предварительно объявленную структуру, содержащую координаты одной точки плоскости;
площадь многоугольника.
Для каждого многоугольника определить площадь. Рассортировать массив структур следующим образом. В начале массива должны находиться многоугольники 1-й четверти по возрастанию найденной площади, а затем — остальные многоугольники в нерассортированном виде, то есть в том же порядке, что и в исходном массиве.
8. Сформировать массив структур, каждый элемент которого содержит следующие поля:
координаты вершин многоугольника на плоскости (вводим). Использовать предварительно объявленную структуру, содержащую координаты одной точки плоскости;
периметр многоугольника;
Для каждого многоугольника определить периметр. Рассортировать массив структур следующим образом. В начале массива должны находиться многоугольники к-й четверти (к вводим) по возрастанию найденного периметра, а затем — остальные многоугольники в нерассортированном виде, то есть в том же порядке, что и в исходном массиве.
9. Сформировать массив структур, каждый элемент которого содержит следующие поля:
координаты вершин отрезка в 3-хмерном пространстве (вводим). Использовать предварительно объявленную структуру, содержащую координаты одной точки 3-хмерного пространства;
длина отрезка.
Для каждого отрезка определить длину. Рассортировать массив структур следующим образом. В начале массива должна находиться рассортированная по возрастанию длины информация об отрезках, для которых все координаты обоих вершин положительны, а затем —об остальных отрезках в нерассортированном виде, то есть в том же порядке, что и в исходном массиве.
10. Сформировать массив структур, каждый элемент которого содержит следующие поля:
координаты центра круга на плоскости (вводим). Использовать предварительно объявленную структуру, содержащую координаты одной точки плоскости;
радиус круга (вводим);
площадь круга;
Для каждого круга определить площадь. Рассортировать массив структур следующим образом. В начале массива должна находиться рассортированная по площади информация о тех кругах, которые находятся выше оси OX, а затем — об остальных кругах в нерассортированном виде, то есть в том же порядке, что и в исходном массиве.
11. Сформировать массив структур, каждый элемент которого содержит следующие поля:
шифр подразделения, содержащий не более трёх символов (вводим);
фамилия, имя отчество (вводим);
год рождения (вводим);
образование, например, 0 – неоконченное базовое, 1 – базовое, 2 – общее среднее и т. д. (вводим);
Для заданного подразделения, шифр которого вводим, рассортировать сотрудников сначала по образованию, а затем по возрасту. Информация об остальных сотрудниках должна следовать в том же порядке, что и в исходном массиве.
12. Сформировать массив структур, каждый элемент которого содержит следующие поля:
шифр подразделения, содержащий не более трёх символов (вводим);
план выпуска продукции по кварталам одного года в виде массива (вводим);
фактическое выполнение плана по кварталам одного года в виде массива (вводим);
Рассортировать массив структур следующим образом: сначала должна быть информация о тех подразделениях, которые выполнили план во всех кварталах, затем о тех, кто выполнил план в трёх кварталах, и т. д.