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

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

Восстановить пароль Регистрация
 
Kasl
1 / 1 / 0
Регистрация: 20.02.2013
Сообщений: 7
20.02.2013, 17:49     Сортировка массива #1
Отсортировать время по возрастанию. пожалуйста помогите.
Часы(hours) - от 0 до 23
Минуты (minutes) - от 0 до 60
секунды (seconds) - от 0 до 60

Пример
Входные данные

10 20 30
7 30 00
23 59 59
13 30 30

Выходные данные:
7 30 0
10 20 30
13 30 30
23 59 59
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
20.02.2013, 19:00     Сортировка массива #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
#include <iostream>
int main()
{
     int time[30][3]={0};
     int n = 4; // êîëè÷åñòâî ââîäèìûõ Г¤Г*Г*Г*ûõ
     for (int i=0; i<n; ++i) 
          std::cin>>time[i][0]>>time[i][1]>>time[i][2];
    std::cout<<std::endl; 
    for (int i=0; i<n; ++i)
          for (int j=0; j<3; ++j)
                if (time[i][0]+time[i][1]+time[i][2] < time[j][0]+time[j][1]+time[j][2])
                {
                     std::swap(time[i][0], time[j][0]);
                     std::swap(time[i][1], time[j][1]);
                     std::swap(time[i][2], time[j][2]);
                }
    for (int i=0; i<n; ++i)
    {
          for (int j=0; j<3; ++j)
                std::cout<<time[i][j]<<' ';
          std::cout<<std::endl;
    }           
     return 0;
}
Kasl
1 / 1 / 0
Регистрация: 20.02.2013
Сообщений: 7
20.02.2013, 19:46  [ТС]     Сортировка массива #3
spasibo
Issues
20.02.2013, 20:32
  #4

Не по теме:

Понимаю что не совсем по теме , но:

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
71
72
73
74
75
76
#include <algorithm>
#include <iostream>
#include <vector>
 
class Time
{
    int h;
    int m;
    int s;
 
public:
    Time() : h(0), m(0), s(0) { }
    Time (int, int, int);
 
    ~Time() { }
 
    bool operator< (const Time& rhs);
    friend std::ostream& operator<< (std::ostream&, const Time&); 
};
 
Time::Time(int _h, int _m, int _s)
{
    if (_h >= 0 && _h < 24) h = _h;  else h = 0;
 
    if (_m >= 0 && _m < 60) m = _m;  else m = 0;
 
    if (_s >= 0 && _s < 60) s = _s;  else s = 0;
 
}
 
bool Time::operator< (const Time& rhs)
{
    if (this->h != rhs.h)
        return this->h < rhs.h;
 
    else if (this->m != rhs.m)
        return this->m < rhs.m;
 
    else if (this->s != rhs.s)
        return this->s < rhs.s;
}
 
std::ostream& operator<< (std::ostream& os, const Time& obj)
{
    os << obj.h << ':' << obj.m << ':' << obj.s << std::endl;
    return os;
}
 
 
int main()
{
    std::vector<Time> tm;
 
    tm.push_back(Time(5, 55, 10));
    tm.push_back(Time(5, 60, 59));
    tm.push_back(Time(7, 20, 10));
    tm.push_back(Time(4, 21, 45));
    tm.push_back(Time(7, 20, 11));
    tm.push_back(Time(11, 11, 60));
 
    std::cout << "NOT SORT: \n\n";
    
    for (auto i = tm.begin(); i != tm.end(); ++i) 
        std::cout << *i;
 
    std::sort(tm.begin(), tm.end());
 
    std::cout << "\nSORT: \n\n";
 
    for (auto i = tm.begin(); i != tm.end(); ++i) 
        std::cout << *i;
 
 
    system("PAUSE");
    return 0;
}

Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5816 / 1214 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
20.02.2013, 20:49     Сортировка массива #5
BumerangSP, если вместо 7 30 00 написать 7 59 59 то программа работает совершенно не верно. В прочем это не удивительно от изобилия ошибок.

Цитата Сообщение от BumerangSP Посмотреть сообщение
if (time[i][0]+time[i][1]+time[i][2] < time[j][0]+time[j][1]+time[j][2])
Чем обусловлена эта проверка?

Цитата Сообщение от BumerangSP Посмотреть сообщение
std::swap
Для использования std::swap необходимо подключить <utility> (С++ 11) или же <algorithm> (C++ 03)

Цитата Сообщение от BumerangSP Посмотреть сообщение
for (int j=0; j<3; ++j)
Почему здесь от 0 до 3, если это второй цикл по строкам матрицы?
Цитата Сообщение от BumerangSP Посмотреть сообщение
int time[30][3]={0};
time ключевое слово, называть им имя переменной не хорошо.

Цитата Сообщение от BumerangSP Посмотреть сообщение
int time[30][3]={0};
int n = 4;
Для таких случаев придуманы динамические массивы.
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
20.02.2013, 21:44     Сортировка массива #6
Dekio, мне из примера почему-то показалось, что нужно просто их суммы сравнивать. Т.ч весь алгоритм настроен на это. А вместо тройки в цикле должен n, видимо, не заметил, когда менял.
А с инклюдами, типами массивов и т.д. ТС пусть сам разбирается. Тут по сути главное - алгоритм.
Dekio
Фрилансер
Эксперт C++
 Аватар для Dekio
5816 / 1214 / 214
Регистрация: 23.11.2010
Сообщений: 3,378
Записей в блоге: 1
20.02.2013, 22:13     Сортировка массива #7
Значит вы имели ввиду что-то вроде функции getCheckSum, просто реализация подкачала
В ней мы получаем некоторую ключевую сумму, с помощью которой сравниваем время

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
#include <iostream>
 
struct Dates
{
    size_t hour;
    size_t minute;
    size_t second;
    unsigned int getCheckSum();
    friend std::ostream &operator << (std::ostream &, Dates);
    friend std::istream &operator >> (std::istream &, Dates &);
};
 
unsigned int Dates::getCheckSum()
{
    return hour * 1000 + minute * 10 + second;
}
 
std::ostream &operator << (std::ostream &stream, Dates currDate)
{
    stream << currDate.hour  << " " << currDate.minute << " " << currDate.second << std::endl;
    return stream;
}
 
std::istream &operator >> (std::istream &stream, Dates &currDate)
{
    stream >> currDate.hour >> currDate.minute >> currDate.second;
    return stream;
}
 
 
int main()
{
    int datesCnt;
    std::cin >> datesCnt;
    Dates *array = new Dates [datesCnt];
    for (int i = 0; i < datesCnt; i++)
        std::cin >> array[i];
    for (int i = 0; i < datesCnt - 1; i++)
        for (int j = 0; j < datesCnt - 1; j++)
            if (array[j].getCheckSum() > array[j + 1].getCheckSum()) {
                Dates buf = array[j];
                array[j] = array[j + 1];
                array[j + 1] = buf;
            }
    for (int i = 0; i < datesCnt; i++)
        std::cout << array[i];   
    delete [] array;
    return 0;
}
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
20.02.2013, 22:15     Сортировка массива #8
Цитата Сообщение от BumerangSP Посмотреть сообщение
if (time[i][0]+time[i][1]+time[i][2] < time[j][0]+time[j][1]+time[j][2])
Разве это верное сравнение???

Добавлено через 36 секунд
Ой, тему не читал, опоздал.
BumerangSP
 Аватар для BumerangSP
4283 / 1405 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
20.02.2013, 22:20     Сортировка массива #9
...или можно продолжить мое издевательство и написать что-то типа:
C++
1
2
3
4
5
6
7
8
if (time[i][0] < time[j][0])
   swp(time,i,j);
else
   if (time[i][0] == time[j][0] && time[i][1] < time [j][1])
      swp(time,i,j);
   else
      if (time[i][1] == time[j][1] && time[i][2] < time [j][2])
         swp(time,i,j);
Вместо того if'а.
swp содержит все свапы. Но Ваш конечно предпочтительней.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2013, 19:48     Сортировка массива
Еще ссылки по теме:

Сортировка массива. Ошибка после ввода размерности массива C++
Сортировка массива C++
C++ Сортировка массива

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

Или воспользуйтесь поиском по форуму:
jurok_85
226 / 209 / 70
Регистрация: 21.02.2013
Сообщений: 494
21.02.2013, 19:48     Сортировка массива #10
Пользуясь кодами Boomeranga, написал такую вот программу. Вроде работает хорошо, только она автоматически генерирует время.
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
#include <iostream>
#include <stdlib.h>
#include <time.h>
 
void generatear(int[][3], const int, const int);
void printar(int[][3], const int, const int);
using namespace std;
int main()
{
    const int num = 4; // kolichestvo vremen kotorie budut sravnivatsa v massive
    const int vremja = 3; // chasi, minuti, secundi
    int arr[num][vremja];
    srand(time(NULL)); // dla avtomaticheskoj generacii massiva
 
generatear(arr, num, vremja);
printar(arr, num, vremja);
 
    for(int i = 0; i < num; ++i)
    for(int j = 0; j < vremja; ++j)
        if (arr[i][0] < arr[j][0])
               swap(arr[i][0], arr[j][0]);
                    else
                        if (arr[i][0] == arr[j][0] && arr[i][1] < arr[j][1])
                        swap(arr[i][1], arr[j][1]);
                    else
                        if (arr[i][1] == arr[j][1] && arr[i][2] < arr[j][2])
                            swap(arr[i][2], arr[j][2]);
 
 
 
 
 
cout << endl << endl;
printar(arr, num, vremja);
}
void generatear(int arr[][3],const int num, const int vremja)
{
    for(int i = 0; i < num; i++)
    {
        for(int j = 0; j < vremja; j++)
        {
            arr[i][0] = rand() % 23; // generacija chasov
            arr[i][1] = rand() % 59; // generacija minut
            arr[i][2] = rand() % 59; // generacija secund
 
 
        }
        cout << endl;
    }
}
void printar(int arr[][3], const int num, const int vremja)
{
    for(int i = 0; i < num; i++)
    {
        for(int j = 0; j < vremja; j++)
        {
 
            cout << "   " << arr[i][j];
 
        }
        cout << endl;
    }
}
Yandex
Объявления
21.02.2013, 19:48     Сортировка массива
Ответ Создать тему
Опции темы

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