Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 09.01.2016
Сообщений: 19

Сортировка массива структур по заданному полю

09.01.2016, 16:42. Показов 3244. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Нужна помощь в сортировке.

Вот само задание:
Составить таблицу, содержащую следующие сведения о сотрудниках кафедры:
  • ФИО
  • должность
  • оклад
  • домашний телефон
  • рабочий телефон
  • среднее время, проводимое в компьютерном классе (час)
  • надбавка к зарплате для тех, кто проводит более 3часов в компьютерном классе каждый день (12%от оклада)
  • общая сумма заработка

Вывести:
  • список сотрудников (10), отсортированный по алфавиту
  • список сотрудников,отсортированный по общей сумме заработка

Собственно, вот что я смог сделать:
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
#include<iostream>
#include<string>
#include<math.h>
using namespace std;
struct depatment{ string fio; string post; int homephone; int workphone; int pay; int meantime; }dep[10];
int main()
    string text1, text2;
}
int i, n, k, s, j;
for (i = 0; i < 10; i++)
    cout << "Enter fio of fellow:" << i + 1 << endl;
getline(cin, dep[i].fio, '$');
cout << "Enter post of fellow:" << i + 1 << endl;
getline(cin, dep[i].post, '$');
cout << "Enter homephone of fellow:" << i + 1 << endl;
cin >> dep[i].homephone;
cout << "Enter workphone of fellow:" << i + 1 << endl;
cin >> dep[i].workphone;
cout << "Enter meantime of fellow:" << i + 1 << endl;
cin >> dep[i].meantime;
cout << "Enter pay of fellow:" << i + 1 << endl;
cin >> dep[i].pay;
if (dep[i].meantime > 3);
dep[i].pay * 0.12;
string alph = "ABCDEFGHIKLMNOPQRSTUVWXYZ";
for (i = 0; i < 25; i++);
for (j = 0; j <19; j++);
{text1 = text1.append(dep[i].fio, 0, 1);
 
text2 = alph[i];
n = text1.compare(text2)
if (n == 0){
    cout << "dep[i].fio" << endl;
}
text2.erase();
Text1.erase();
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.01.2016, 16:42
Ответы с готовыми решениями:

Сортировка массива структур по заданному полю
Задание под вариантом такое : Упорядочить список студентов по предмету физика, и вывести весь список. С 1 пунктом я вроде справился, а...

Сортировка массива (вектора) структур по заданному полю
Нужно отсортировать массив по полю структуры. Все поля типа string. struct DatabaseData{ std::string aPointOfDeparture;//Пункт...

Сортировка "пузырьком" массива структур по заданному полю
Нужно отсортировать структуру по фамилии доктора, но что то он не сортирует. void sortDoc(Doctor doctor) { int size; ...

36
505 / 317 / 236
Регистрация: 18.02.2013
Сообщений: 754
10.01.2016, 21:23
Студворк — интернет-сервис помощи студентам
Кан Дмитрий, именно
0
0 / 0 / 0
Регистрация: 09.01.2016
Сообщений: 19
10.01.2016, 22:18  [ТС]
и ещё, можно ли написать так??
C++
1
2
3
4
5
cin >> dep[i].pay;
        if (dep[i].meantime > 3)
            dep[i].pay +=dep[i].salary*0.12;
    
    }
Тем самым я хочу чтобы если время проводимое в комп.классе превышало больше 3 часов то к зарплате прибавляется дополнительно ещё 12% от оклада, если же меньше 3 часов то зарплата оставалась такой же как и была.

Добавлено через 18 минут
Изменил
C++
1
2
3
4
5
struct depatment{
    string fio; string post; int homephone; int workphone; int meantime; int
    salary; double pay;
}dep[10];
int main(){
Результат остался прежним.
0
505 / 317 / 236
Регистрация: 18.02.2013
Сообщений: 754
10.01.2016, 22:40
Цитата Сообщение от Кан Дмитрий Посмотреть сообщение
dep[i].salary
это еще одно поле?
0
0 / 0 / 0
Регистрация: 09.01.2016
Сообщений: 19
10.01.2016, 22:46  [ТС]
это оклад, по заданию берется 12% от оклада и прибавляются к зарплате
0
505 / 317 / 236
Регистрация: 18.02.2013
Сообщений: 754
10.01.2016, 23:04
Кан Дмитрий, но он не описан в структуре
0
0 / 0 / 0
Регистрация: 09.01.2016
Сообщений: 19
11.01.2016, 11:03  [ТС]
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
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
struct depatment{
    string fio; string post; int homephone; int workphone; int meantime; int
    salary; double pay;
}dep[10];
int main(){
    int i, n = 2, j, z; string text1, text2;
    for (i = 0; i < n; i++){
        cout << "Enter fio of fellow:" << i + 1 << endl;
        getline(cin, dep[i].fio, '$');
        cout << "Enter post of fellow:" << i + 1 << endl;
        getline(cin, dep[i].post, '$');
        cout << "Enter homephone of fellow:" << i + 1 << endl;
        cin >> dep[i].homephone;
        cout << "Enter workphone of fellow:" << i + 1 << endl;
        cin >> dep[i].workphone;
        cout << "Enter meantime of fellow:" << i + 1 << endl;
        cin >> dep[i].meantime;
        cout << "Enter salary of fellow:" << i + 1 << endl;
        cin >> dep[i].salary;
        cout << "Enter pay of fellow:" << i + 1 << endl;
        cin >> dep[i].pay;
        if (dep[i].meantime > 3)
            dep[i].pay +=dep[i].salary *0.12;
    
    }
 
 
    for (i = 0; i < n; i++)
    for (j = 0; j < n - 1; j++)
    {
        if (dep[j].fio>dep[j + 1].fio)
        {
            depatment buf = dep[j];
            dep[j] = dep[j + 1];
            dep[j + 1] = buf;
        }
 
 
    }
    for (int i = 0; i < n; i++)
        cout << dep[i].fio << endl;
    text2.erase();
    text1.erase();
 
    for (int i = 0; i < n; i++)
    for (int k = 0; k < n - 1; k++)
    if (dep[k].pay < dep[k + 1].pay)
    {
        z = dep[k].pay;
        dep[k].pay = dep[k + 1].pay;
        dep[k + 1].pay = z;
    }
    cout << dep[i].fio << dep[i].pay << endl;
    return 0;
}
Добавлено через 8 часов 10 минут
Я описал его в структуре,только у меня вопрос, его тоже вводить как double??

Добавлено через 3 часа 46 минут
olya7, и еще либо я не неправильно что-то делаю либо сортировка по алфавиту немного не корректна:
Enter fio of fellow:1
Jin Tut$
Enter post of fellow:1
prepod$
Enter homephone of fellow:1
5555
Enter workphone of fellow:1
6666
Enter meantime of fellow:1
4
Enter pay of fellow:1
14000
Enter fio of fellow:2
Zeta Nur$
Enter post of fellow:2
prepod$
Enter homephone of fellow:2
222
Enter workphone of fellow:2
1111
Enter meantime of fellow:2
2
Enter pay of fellow:2
20000

Zeta Nur
Jin Tut

Zeta Nur20000
0
505 / 317 / 236
Регистрация: 18.02.2013
Сообщений: 754
11.01.2016, 17:44
Кан Дмитрий,
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
//#include "stdafx.h"
#include<iostream>
#include<cstring>
using namespace std;
struct depatment{
    string fio; string post; int homephone; int workphone; int meantime; int
    salary; double pay;
}dep[10];
int main(){
    int i, n = 2, j, z; string text1, text2;
    for (i = 0; i < n; i++){
        cout << "Enter fio of fellow:" << i + 1 << endl;
        getline(cin, dep[i].fio, '$');
        /*cout << "Enter post of fellow:" << i + 1 << endl;
        getline(cin, dep[i].post, '$');
        cout << "Enter homephone of fellow:" << i + 1 << endl;
        cin >> dep[i].homephone;
        cout << "Enter workphone of fellow:" << i + 1 << endl;
        cin >> dep[i].workphone;
        cout << "Enter meantime of fellow:" << i + 1 << endl;
        cin >> dep[i].meantime;
        cout << "Enter salary of fellow:" << i + 1 << endl;
        cin >> dep[i].salary;
        cout << "Enter pay of fellow:" << i + 1 << endl;
        cin >> dep[i].pay;
        if (dep[i].meantime > 3)
            dep[i].pay +=dep[i].salary *0.12;*/
    
    }
 
 
    for (i = 0; i < n; i++)
    for (j = 0; j < n - 1; j++)
    {
        if (!strcmp((dep[j].fio).c_str(),(dep[j + 1].fio).c_str()))
        {
            depatment buf = dep[j];
            dep[j] = dep[j + 1];
            dep[j + 1] = buf;
        }
 
 
    }
    for (int i = 0; i < n; i++)
        cout << dep[i].fio << endl;
    
    return 0;
}
vot

 Комментарий модератора 
olya7, ссылка на песочницу может дополнять ответ, но не заменять его.
Код должен быть размещён в сообщении.
0
0 / 0 / 0
Регистрация: 09.01.2016
Сообщений: 19
11.01.2016, 18:31  [ТС]
Спасибо, я так понял он сравнивает полностью сроку? а можно сделать так чтобы он сравнивал только первую заглавную букву строки, т.е. первую букву фамилии и сортировал их по алфавиту?
0
505 / 317 / 236
Регистрация: 18.02.2013
Сообщений: 754
11.01.2016, 19:19
можно, только это не будет алфавитной сортировкой
0
0 / 0 / 0
Регистрация: 09.01.2016
Сообщений: 19
11.01.2016, 19:29  [ТС]
Просто эта сортировка не сортирует так как надо, вот опять Enter fio of fellow:1
Kan$
Enter fio of fellow:2
Kim$
Enter fio of fellow:3
Abakarov$
Enter fio of fellow:4
Hun$
Enter fio of fellow:5
Zak$
Kan

Kim

Abakarov

Hun

Zak
0
0 / 0 / 0
Регистрация: 09.01.2016
Сообщений: 19
12.01.2016, 11:17  [ТС]
Вот в чем проблема, нужно сделать две сортировки:
1) сортировка сотрудников по алфавиту;
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
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
struct depatment{ string fio; string post; int homephone; int workphone; double pay; int meantime; }dep[4];
int main(){
    int i, n,t=4, j, z; string text1, text2;
    for (i = 0; i < t; i++){
        cout << "Enter fio of fellow:" << i + 1 << endl;
        getline(cin, dep[i].fio, '$');
 
        cout << "Enter post of fellow:" << i + 1 << endl;
        getline(cin, dep[i].post, '$');
        cout << "Enter homephone of fellow:" << i + 1 << endl;
        cin >> dep[i].homephone;
        cout << "Enter workphone of fellow:" << i + 1 << endl;
        cin >> dep[i].workphone;
        cout << "Enter meantime of fellow:" << i + 1 << endl;
        cin >> dep[i].meantime;
        cout << "Enter pay of fellow:" << i + 1 << endl;
        cin >> dep[i].pay;
    }
 
    for (i = 0; i < t; i++){
        if (dep[i].meantime > 3)
            dep[i].pay = dep[i].pay +dep[i].pay* 0.12;
    }
    string alph = "ABCDEFGHIKLMNOPQRSTUVWXYZ";
    for (i = 0; i < 25; i++)
    for (j = 0; j < t; j++)
    {
        text1 = text1.append(dep[j].fio, 0, 1);
        text2 = alph[i];
        n = text1.compare(text2);
        if (n == 0){
            cout << dep[j].fio << endl;
        }
        text2.erase();
        text1.erase();
    }
 
    for (int i = 0; i < t - 1; i++)
    for (int k = 0; k < t - 1 - i; k++){
 
        if (dep[k].pay < dep[k + 1].pay)
 
            swap(dep[k], dep[k + 1]);
 
        cout << dep[i].fio << dep[i].pay << endl;
        return 0;
    }
}
 Комментарий модератора 

П. 4.3. Создавайте темы с осмысленными и понятными названиями - это серьезно повышает шансы, что на Ваш вопрос ответят.
П. 5.5. Запрещено размещать тему в нескольких подразделах одного раздела одновременно (кросспостинг), а также дублировать тему в одном разделе.
0
38 / 1 / 0
Регистрация: 09.08.2012
Сообщений: 44
12.01.2016, 11:50
А сколько должно выводится?
Ты return 0; в теле цикла поставил - она и завершается на первом проходе
0
0 / 0 / 0
Регистрация: 09.01.2016
Сообщений: 19
12.01.2016, 11:59  [ТС]
в данном коде я ввел 4 фамилии, а так должно 10 фамилий выводиться.
0
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
12.01.2016, 12:14
Лучший ответ Сообщение было отмечено Кан Дмитрий как решение

Решение

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
#include<iostream>
#include<string>
 
using namespace std;
 
struct depatment 
{ 
    string fio; 
    string post; 
    int homephone; 
    int workphone; 
    double pay; 
    int meantime; 
}dep[4];
 
int main() 
{
    for (int i = 0; i < 4; i++) 
    {
        cout << "Enter fio of fellow " << i + 1 << ": ";
        getline(cin, dep[i].fio);
        //cout << "Enter post of fellow " << i + 1 << ": ";
        //getline(cin, dep[i].post);
        //cout << "Enter homephone of fellow " << i + 1 << ": ";
        //cin >> dep[i].homephone;
        //cout << "Enter workphone of fellow " << i + 1 << ": ";
        //cin >> dep[i].workphone;
        //cout << "Enter meantime of fellow " << i + 1 << ": ";
        //cin >> dep[i].meantime;
        cout << "Enter pay of fellow " << i + 1 << ": ";
        cin >> dep[i].pay;
        cin.get();
    }
    cout << "\n\nSort alph:" << endl;
    for (int i = 0; i < 3; i++)
        for (int j = i + 1; j < 4; j++)
        if (dep[i].fio > dep[j].fio)
            swap(dep[i], dep[j]);
 
    for (int i = 0; i < 4; i++)
        cout << dep[i].fio << endl;
 
    cout << "\n\nSort pay:" << endl;
    for (int i = 0; i < 3; i++)
        for (int j = i + 1; j < 4; j++)
            if (dep[i].pay < dep[j].pay)
                swap(dep[i], dep[j]);
 
    for (int i = 0; i < 4; i++)
        cout << dep[i].fio << " " << dep[i].pay << endl;
    system("pause");
    return 0;
}
0
0 / 0 / 0
Регистрация: 09.01.2016
Сообщений: 19
12.01.2016, 12:24  [ТС]
Спасибо,а куда можно вставить
C++
1
2
 if (dep[i].meantime > 3)
            dep[i].pay = dep[i].pay +dep[i].pay* 0.12;
?? если среднее время больше 3 часов то идет прибавка 12%.
0
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
12.01.2016, 12:39
Кан Дмитрий, да хоть после ввода. Это уже твои причуды)
1
0 / 0 / 0
Регистрация: 09.01.2016
Сообщений: 19
12.01.2016, 12:56  [ТС]
Уже разобрался). Большое спасибо за помощь!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.01.2016, 12:56
Помогаю со студенческими работами здесь

Std::min_element по заданному полю массива структур
Есть структура Point{double x,y}. Есть вектор vector&lt;Point&gt;. Как правильно определить функцию сравнения точек по заданной координате...

Реализовать сортировку массива структур по заданному полю
Помогите правильно отсортировать структуры по среднему балу и записать их в файл структура: struct student { char name; int...

Сортировка массива структур по полю
Дана структура: struct elecHelp1 { char fio, name, sname, nameElection, constituensy; double help_percent; int numVotes; }; ...

Сортировка массива структур по одному полю
Приветствую. Задача: отсортировать по возрастанию структуру по одному полю. Вчера поднимал тему:...

Сортировка массива структур по полю lastname
имеется структура struct { char lastname, firstname; unsigned int math, inf, phys; }rat, temp; необходимо отсортировать...


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

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru