@Nemovok
Учусь в школе =)

Как заставить работать std :: sort?

Не сортируется вектор, что делать?
Условие:

На вход про­грам­ме по­да­ют­ся све­де­ния о сдаче эк­за­ме­нов уче­ни­ка­ми 9-х клас­сов не­ко­то­рой сред­ней школы. В пер­вой стро­ке со­об­ща­ет­ся ко­ли­че­ство уче­ни­ков N, ко­то­рое не мень­ше 10, но не пре­вос­хо­дит 100, каж­дая из сле­ду­ю­щих N строк имеет сле­ду­ю­щий фор­мат: <Фа­ми­лия> <Имя> <оцен­ки>, где <Фа­ми­лия> - стро­ка, со­сто­я­щая не более чем из 20 сим­во­лов, <Имя> — стро­ка, со­сто­я­щая не более чем из 15 сим­во­лов, <оцен­ки> - через про­бел три целых числа, со­от­вет­ству­ю­щие оцен­кам по пя­ти­балль­ной си­сте­ме. <Фа­ми­лия> и <Имя>, а также <Имя> и <оцен­ки> раз­де­ле­ны одним про­бе­лом. При­мер вход­ной стро­ки:
Ива­нов Петр 4 2 4

Тре­бу­ет­ся на­пи­сать как можно более эф­фек­тив­ную про­грам­му (ука­жи­те ис­поль­зу­е­мую вер­сию языка про­грам­ми­ро­ва­ния, на­при­мер, Borland Pascal 7.0), ко­то­рая будет вы­во­дить на экран фа­ми­лии и имена не­успе­ва­ю­щих уче­ни­ков (име­ю­щих по ре­зуль­та­там эк­за­ме­нов хотя бы одну двой­ку), рас­по­ла­гая их в по­ряд­ке умень­ше­ния числа двоек.

#include <iostream>
#include <string>
#include <vector>
#include <iomanip>
#include <algorithm>



class Losers
{
  public:
    std :: string name, lastname;
    int priority;
 
    Losers () : priority ( 0 ) {  }
 
    void error () 
    {
      std :: cout << "Error!" << std :: endl;
    }  
};



int main ( void )
{
  int numbers;
  std :: string name, lastname;
  int one, two, three;

  Losers error;
  std :: vector <Losers> losNL ( 0 );

  std :: cin >> numbers;

  if ( numbers > 2 && numbers < 100 )
  {
    for ( int i = 0; i < numbers; ++i )
    {
      std :: cin >> std :: setw ( 15 ) >> name; 
      std :: cin >> std :: setw ( 20 ) >> lastname;
      std :: cin >> one >> two >> three;

      bool protectOne = one == 2  || one == 3 || one == 4 || one == 5; 
      bool protectTwo = two == 2  || two == 3 || two == 4 || two == 5; 
      bool protectThree = three == 2  || three == 3 || three == 4 || three == 5; 

      if ( protectOne && protectTwo && protectThree )
      {
        if ( one == 2 || two == 2 || three == 2 )
        {
          losNL.resize ( losNL.size () + 1 ); 
         
          losNL[ i ].name = name;
          losNL[ i ].lastname = lastname;
 
          if ( one == 2 && two == 2 && three == 2 ) 
          {
            losNL[ i ].priority = 3;
          } 

          if ( one == 2 && two == 2 || one == 2 && three == 2 || two == 2 && three == 2 ) 
          { 
            losNL[ i ].priority = 2;
          }

          if ( one == 2 || two == 2 || three == 2 ) 
          { 
            losNL[ i ].priority = 1;
          }
        }
        else 
        {
          --i; --numbers;
        }
      }
      else 
      {
        error.error ();
      }
    }   
  }
  else 
  {
    error.error (); 
  }

  std::sort ( losNL.begin (), losNL.end (), []( const Losers & a, const Losers & b ) 
  {
    return ( a.priority < b.priority );
  });

  for ( int i = 0; i < losNL.size (); ++i )
  {
    std :: cout << losNL[ i ].name << " " << losNL[ i ].lastname << std :: endl;
  }

  return 0;
}
  • Вопрос задан
  • 178 просмотров
Решения вопроса 1
zagayevskiy
@zagayevskiy
Android developer at Yandex
Тут ошибка
if ( one == 2 && two == 2 && three == 2 ) 
          {
            losNL[ i ].priority = 3;
          } 

          if ( one == 2 && two == 2 || one == 2 && three == 2 || two == 2 && three == 2 ) 
          { 
            losNL[ i ].priority = 2;
          }

          if ( one == 2 || two == 2 || three == 2 ) 
          { 
            losNL[ i ].priority = 1;
          }

Если есть хоть одна двойка, то приоритет будет 1. Заметьте, не "ровно одна", а хотя бы одна. Нужно else вставить после if'oв.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы