Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Lesya_13
0 / 0 / 0
Регистрация: 25.09.2013
Сообщений: 6
#1

сортировка структур массива - C++

25.09.2013, 20:56. Просмотров 937. Ответов 4
Метки нет (Все метки)

Помогите пожалуйста с сортировкой по алфавиту на С++. Нужно создать типа массив, где будут хранится отсортированые значение, но функция qsort не катит, потому что сортируются только фамилии, а значения остаются. Как можно реализовать?
Вот условие: відомість абітурієнтів, що здали вступні іспити в університеті, містить ПІБ, адресу, оцінки з трьох предметів. Визначити кількість абітурієнтів, які проживають в місті Києві, та здали іспит з середнім балом не нижче 4,5, вивести їх прізвища в алфавітному порядку.
Вот мой код, все, кроме сортировки по алфавиту:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include<conio.h>
#include<iostream>
#include<string>
#include <locale.h>
 
using namespace std;
 
struct exam
{
    string name;
    string city;
    float mark1;
    float mark2;
    float mark3;
};
 
 
 
void getStudents(exam *students, const int size)
{
    string needCity = "Киев";
    float needMark = 4.5;   
        for(int i = 0; i < size; i++)
        {
                if (students[i].city == needCity && 
                    ((students[i].mark1 + students[i].mark2 + students[i].mark3)/3) > needMark)
                {   
                        cout << students[i].name << endl;
                }
        }
 
}
 
void main()
{
 
    setlocale(0, "Russian");
 
exam allname []= 
{
{ "Любевич Константин Анатольевич" , "Ровно" , 5, 5, 5 },
{ "Смекалов Дмитрий Валерьевич" , "Киев" , 5, 4, 5 },
{ "Девагин Федор Арсентийович" , "Днепропетровск" , 4, 2, 3 },
{ "Бевада Алла Леонидовна" , "Киев" , 3, 5, 5 },
{ "Бабенко Анастасия Константиновна" , "Черкассы" , 4, 4, 3 },
{ "Аванушкина Катерина Олеговна" , "Киев" , 5, 5, 4 },
{ "Щербина Мария Олександровна", "Севастополь" , 3, 3, 3 },
{ "Борисова Елизавета Олександровна" , "Харьков" , 4, 4, 5 },
{ "Гасимова Лейла Владимировна" , "Одесса" , 5, 5, 4},
{ "Босенко Ольга Владимировна" , "Киев" , 4, 5, 5 }
};
 
getStudents(allname, 10);
 
getch();
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.09.2013, 20:56     сортировка структур массива
Посмотрите здесь:

Сортировка массива структур C++
C++ Сортировка массива структур
C++ Сортировка массива структур
C++ Сортировка массива структур...
Сортировка массива структур C++
Сортировка массива структур C++
Сортировка массива структур C++
C++ Сортировка массива структур
Сортировка массива структур C++
Сортировка массива структур через сортировку массива указателей C++
Сортировка массива структур C++
Сортировка массива структур C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6366 / 3013 / 297
Регистрация: 04.12.2011
Сообщений: 8,107
Записей в блоге: 3
25.09.2013, 21:17     сортировка структур массива #2
Lesya_13, вот пример сортирующий по двум полям структурку из 2-х полей. Он сыроват, но как направление которое катит:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct Man{
string name;
int age;
Man(string name_, int age_)
:name(name_), age(age_)
{}
static bool compareByName(Man tocmp, Man tocmpto);
static bool compareByAge(Man tocmp, Man tocmpto);
void show(){
cout<<name<<" "<<age<<endl;
}
};
bool compareByAge(Man tocmp, Man tocmpto){
return tocmp.age>=tocmpto.age ? false : true;
}
bool compareByName(Man tocmp, Man tocmpto){
return (tocmp.name.compare(tocmpto.name))<0;
}
 
int main()
{
setlocale(0,"rus");
vector<string>name;
vector<int>age;
int tolpa(0);
cout<<"Сколько люде введём? ";
cin>>tolpa;
cout<<endl;
cout<<"Введите имя и фамилию людей"<<endl;
string s_inp;
int i_inp;
for(int i=0; i<tolpa; ++i){
cout<<endl;
cout<<i<<" Имя ";
cin>>s_inp;
cout<<i<<" Возраст ";
cin>>i_inp;
name.push_back(s_inp);
age.push_back(i_inp);
}
vector<Man> people;
for(int i=0; i<tolpa; ++i){
people.push_back(Man(name[i], age[i]));
}
sort(people.begin(), people.end(), &compareByName);
cout<<"\nПо имени:"<<endl;
for(int i=0; i<tolpa; ++i)people[i].show();
sort(people.begin(), people.end(), &compareByAge);
cout<<"\nПо возрасту:"<<endl;
for(int i=0; i<tolpa; ++i)people[i].show();
cout<<endl;
cout<<endl;
system( "pause");
  return 0;
}
Lesya_13
0 / 0 / 0
Регистрация: 25.09.2013
Сообщений: 6
25.09.2013, 21:24  [ТС]     сортировка структур массива #3
как-то сильно сложно, можно что то по проще, мы такого не учили еще
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6366 / 3013 / 297
Регистрация: 04.12.2011
Сообщений: 8,107
Записей в блоге: 3
25.09.2013, 21:35     сортировка структур массива #4
Цитата Сообщение от Lesya_13 Посмотреть сообщение
как-то сильно сложно, можно что то по проще, мы такого не учили еще
Если просят сортировку по 2-м полям должны были и дать что-то. Если писать вручную, только сложнее будет. Вот нашел пример, где сортировка по 2-м полям умнее, но чуть сложнее. Функция сравнения позволяет при совпадении значений параметра сортировки сортировать по второму параметру. То есть если номера совпали, то по имени, а если имена совпали то номеру:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <windows.h>
using namespace std;
struct Student
{   
    string name;
    int month;    
    Student();
    Student(const string n, int month_);
    
     void show(){cout<<name<<" "<<month<<endl;};
     ~Student(){};
static  int Compirer(Student *one, Student *two);
};
 
int Student::Compirer(Student *one, Student *two){//тут смотрите
    if(one->month == two->month)
        return (one->name.compare(two->name.c_str())>0)? 0:1;
    else
        return (one->month > two->month)? 0 : 1;
}
 
Student::Student()
{}
Student::Student(const string n, int id_):name(n), month(id_)
{}
 
int main(){
SetConsoleCP (1251); SetConsoleOutputCP (1251);
Student st("Vasya", 1);
Student st1("Basya", 2);
Student st2("Basya", 3);
Student st3("Alice", 3);
Student st4("Sonya", 4);
Student st5("Sonya", 2);
vector<Student*> stvec;
stvec.push_back(&st);
stvec.push_back(&st1);
stvec.push_back(&st2);
stvec.push_back(&st3);
stvec.push_back(&st4);
stvec.push_back(&st5);
size_t sz = stvec.size();
cout<<"\nВведено в порядке:"<<endl;
//---------------------------
for(size_t i = 0; i < sz; ++i) {
    stvec[i]->show();
}
sort(stvec.begin(), stvec.end(), &Student::Compirer);
cout<<"\nОтсортировано в порядке:"<<endl;
//---------------------------
for(size_t i = 0; i < sz; ++i) {
    stvec[i]->show();
}
 
cin.get();   
return 0;
}
Смелее, тут ничего нет особенного. Тем более, что если от Вас требуют такое задание, то это для Вас пустяки.
DiffEreD
1427 / 764 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
25.09.2013, 21:41     сортировка структур массива #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>
#include <windows.h>
 
//відомість абітурієнтів, що здали вступні іспити в університеті, містить ПІБ,
//адресу, оцінки з трьох предметів. Визначити кількість абітурієнтів, які
//проживають в місті Києві, та здали іспит з середнім балом не нижче 4,5,
//вивести їх прізвища в алфавітному порядку.
 
struct exam
{
   std::string name;
   std::string city;
   float mark1;
   float mark2;
   float mark3;
};
 
bool passed(const exam& ex)
{
   static std::string compare_city = "Киев";
   if(ex.city != compare_city || (ex.mark1 + ex.mark2 + ex.mark3)/3 <= 4.5)
      return false;
   else
      return true;
}
 
void print(const exam& ex)
{
   std::cout << std::setw(30) << std::left << ex.name << " " << ex.city;
   std::cout << " Scores: " << ex.mark1 << " " << ex.mark2 << " " << ex.mark3;
   std::cout << std::endl;
}
 
int main()
{
   SetConsoleCP (1251); SetConsoleOutputCP (1251);
 
   exam allname [] =
   {
   { "Любевич Константин Анатольевич" , "Ровно" , 5, 5, 5 },
   { "Смекалов Дмитрий Валерьевич" , "Киев" , 5, 4, 5 },
   { "Девагин Федор Арсентийович" , "Днепропетровск" , 4, 2, 3 },
   { "Бевада Алла Леонидовна" , "Киев" , 3, 5, 5 },
   { "Бабенко Анастасия Константиновна" , "Черкассы" , 4, 4, 3 },
   { "Аванушкина Катерина Олеговна" , "Киев" , 5, 5, 4 },
   { "Щербина Мария Олександровна", "Севастополь" , 3, 3, 3 },
   { "Борисова Елизавета Олександровна" , "Харьков" , 4, 4, 5 },
   { "Гасимова Лейла Владимировна" , "Одесса" , 5, 5, 4},
   { "Босенко Ольга Владимировна" , "Киев" , 4, 5, 5 }
   };
 
   std::vector<exam> passed_students;
   std::copy_if(allname, allname + sizeof(allname)/sizeof(allname[0]),
         std::back_inserter(passed_students), passed);
 
   std::sort(passed_students.begin(), passed_students.end(), [](const exam& ex1, const exam& ex2){return ex1.name < ex2.name;});
 
   //for(auto& i : passed_students) std::cout << std::setw(30) << std::left << i.name << " " << i.city << std::endl;
 
   std::for_each(passed_students.begin(), passed_students.end(), print);
 
 
   std::cout << "\nDone." << std::endl;
   return 0;
}
Yandex
Объявления
25.09.2013, 21:41     сортировка структур массива
Ответ Создать тему
Опции темы

Текущее время: 07:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru