Структуры

Пример 1:

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

фамилия, имя отчество студента или школьника (вводим);

массив оценок фиксированной размерности, который также вводим;

средний балл (вычисляем).

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

Решение от преподавателя:

const m=4;          

 // Количество оценок  у одного студента.

    struct tstr                          // Объявляем тип структуры.

       {   char   name[20] ;     // Фамилия, имя , отчество.   

          int    a[m]          ;       // Массив оценок . 

          float  s               ;        // Средний балл.

       }  ;

// Ввод массива структур

    void   MyInp   ( tstr x[], int,int );

  // Вывод массива структур

    void   MyOut   ( tstr x[], int );

// Сортировка массива структур   

    void   MySort  ( tstr x[], int );

/* Нахождение среднего значения в числовом массиве z (в целочисленном  одномерном массиве, а не в массиве структур)   */   

    float  MyAver  ( int  z[], int );    

int main()

{   const n=3;  

/*  Количество студентов, т.е. количество элементов  массива   структур. */

    tstr ars[n];   //  Статический массив  структур (n — константа).

    int i,j;

    clrscr();    MyInp(ars,n,2);

/* Для каждого студента находим средний балл, т. е. для i-й структуры ars[i] вычисляем поле s. Для этого используем функцию MyAver.*/

    for (i=0;i          

       ars[i].s=MyAver( ars[i].a,m);

    cout<<" \n Before of sorting\n";

    MyOut(ars,n);                            MySort(ars,n);

    cout<<"\nAfter of sorting\n";   MyOut(ars,n);

    getch();                                      return 0;

  };

/* Ввод массива структур, т.е. фамилий и оценок всех (size) студентов. Ввод начинается со строки  экрана с номером y0.  */

  void MyInp(tstr x[],int size, int y0)

  { int i,j, y,

   coord1;         // Номер позиции в строке

    y=y0;

    for (i=0;i 

/*  i – номер элемента массива структур (номер студента). */

     { gotoxy(2,y);

       cout<<"Name   ";

       cin>> (x[i].name);

       cout<<"Ocenki "<

       y++;

       for (j=0, coord1=8;  j 

      // j – номер оценки одного студента

// Цикл для ввода одной j - й оценки  i – го студента с контролем ввода.

           {  while(1)                               

             {    gotoxy(coord1,y);

                    cin>>x[i].a[j];

                    if (x[i].a[j]>0 && x[i].a[j]<=10)

                            break;

                      else    {    gotoxy(coord1,y);

                       // “Стираем” неверно введённую оценку

                                        cout<<"            ";   

                                   }

             }

           }

       y++;

     }

  };

/* Сортировка массива структур. Подробный анализ алгоритма смотри в 1-м семестре ([1]). */

  void MySort ( tstr x[], int size)

   { int i,j,k,flag;  tstr T;  

     k=size;

     do      { k--;

                  flag=0;

                  for (i=0;  i

                    if (x[i].s < x[i+1].s)

                       {

         /* Перестановка i- го и (i+1) – го элемента массива структур.  */

                              T=x[i];                          

                           x[i]=x[i+1];

                           x[i+1]=T;

                            flag=1;

                      }

             }

     while (flag);

  } ;

/* Вывод массива структур, т. е. выводим информацию обо всех студентах. */

  void MyOut (tstr x[], int size)

  { int i,j,coord1;    cout<< endl;

    for (i=0;i

     { cout<

       for (j=0,coord1=25;  j

           { gotoxy(coord1,wherey());

             cout<

           }

       gotoxy(coord1,wherey());

       textcolor(10);

       cprintf("%5.2f",x[i].s);

       cout<

     }

   cout<

  }           ;

  float MyAver (int z[],int M)

  { float S=0;  int j;

    for (j=0; 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

   Len+= sqrt((P[j].x-P[j+1].x)*(P[j].x-P[j+1].x)+

            (P[j].y-P[j+1].y)*(P[j].y-P[j+1].y) );

/* Вне цикла добавляем длину стороны, соединяющей 0-ю точку с (size-1) – й точкой. */

 return Len+sqrt((P[0].x-P[size-1].x)*(P[0].x-P[size-1].x)+

            (P[0].y-P[size-1].y)*(P[0].y-P[size-1].y) );;

 }

/* Функция получает поля одной структуры типа ttr, т. е. информацию об одном многоугольнике, кроме периметра. Периметр будет найден вызовом из main функции MyPer. Так как структура является результатом функции, то в качестве параметра объявлен указатель на неё.*/

 void MyDef (ttr *Str, int size)

 {   cout<

     char t[40];  

 /* t — вспомогательная строка для названия многоугольника. В зависимости от количества вершин (size) формируем русско-латинское название многоугольника. При этом предусмотрены четыре варианта. */

     switch (size)

     {case 3: strcpy(t,"Triangle"); break;

      case 4: strcpy(t,"Chetirexygolnic");break;

      case 5: strcpy(t,"Pjatyygolnic");   break;

      default: strcpy(t,"Other");

     }

/* Динамически создаём строку type, длина которой берётся из вспомогательной строки t. Используем операцию “->”(стрелка), потому что Str — указатель на структуру, а не потому, что type и Points — указатели. */

     Str->type=new char [strlen(t)];

     strcpy(Str->type, t);

/* Создаём динамический массив структур внутри структуры Str. То есть определяем массив точек одного многоугольника размером  size. */

     Str->Points=new Point1[size];

     for (int i=0; i

     {  Str->Points[i].x= float(random (5)-2);

        Str->Points[i].y= float(random (5)-2);

     }

/* Использовали операцию “->”, потому что Str — указатель, а операция “.”, потому что Points[i] — это не указатель, а i – й элемент вложенного динамического массива структур. Указателем является Points, в котором хранится адрес начала этого массива.*/

 }

/* Функция для вывода полей одной структуры, то есть информации об одном многоугольнике. Для экономии памяти в качестве параметра используем указатель на структуру, несмотря на то, что в этой функции структуру мы не меняем. */

 void MyShow (ttr *Str, int size)

 {Str->n=size;

  cout<<"\n  m="<< Str->n<<"  ";

  for (int i=0; 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

     {  cout<<"\n i="<

Не нашли нужного вам решения? Оставьте заявку и наши авторы быстро и качественно помогут вам с решением.
Оставить заявку
Работа вам нужна срочно. Не волнуйтесь, уложимся!

Заполните, пожалуйста, данные для автора:

  • 22423 авторов готовы помочь тебе.
  • 2402 онлайн