С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Kasl
1 / 1 / 0
Регистрация: 20.02.2013
Сообщений: 7
1

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

20.02.2013, 17:49. Просмотров 364. Ответов 9
Метки нет (Все метки)

Отсортировать время по возрастанию. пожалуйста помогите.
Часы(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
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.02.2013, 17:49
Ответы с готовыми решениями:

Быстрая сортировка(сортировка Хоара). Отсортировать фрагмент массива
Мне нужно отсортировать фрагмент массива, расположенный между первым и...

Сортировка массива: перенести положительные числа в начало, а отрицательные - в конец массива
Дан вещественный массив A(N). Отсортировать его таким образом, чтобы все...

Сортировка массива. Ошибка после ввода размерности массива
подскажите почему после ввода размерности массива выдает ошибку...

Сортировка массива структур через сортировку массива указателей
Ошибка возникает в функции void sort(student **ppStud, int k, char ch). Кто...

Сортировка массива, вместо массива выводит мусор
Здравствуйте Уважаемые жители форума! Есть рабочий код сортируем массив...

9
BumerangSP
4288 / 1410 / 463
Регистрация: 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;
}
1
Kasl
1 / 1 / 0
Регистрация: 20.02.2013
Сообщений: 7
20.02.2013, 19:46  [ТС] 3
spasibo
0
Issues
20.02.2013, 20:32
  #4

Не по теме:

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

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;
}

0
Dekio
Фрилансер
Эксперт С++
5838 / 1219 / 499
Регистрация: 23.11.2010
Сообщений: 3,377
Записей в блоге: 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;
Для таких случаев придуманы динамические массивы.
0
BumerangSP
4288 / 1410 / 463
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
20.02.2013, 21:44 6
Dekio, мне из примера почему-то показалось, что нужно просто их суммы сравнивать. Т.ч весь алгоритм настроен на это. А вместо тройки в цикле должен n, видимо, не заметил, когда менял.
А с инклюдами, типами массивов и т.д. ТС пусть сам разбирается. Тут по сути главное - алгоритм.
0
Dekio
Фрилансер
Эксперт С++
5838 / 1219 / 499
Регистрация: 23.11.2010
Сообщений: 3,377
Записей в блоге: 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;
}
1
Kuzia domovenok
2421 / 2151 / 525
Регистрация: 25.03.2012
Сообщений: 7,756
Записей в блоге: 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 секунд
Ой, тему не читал, опоздал.
0
BumerangSP
4288 / 1410 / 463
Регистрация: 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 содержит все свапы. Но Ваш конечно предпочтительней.
0
jurok_85
275 / 258 / 190
Регистрация: 21.02.2013
Сообщений: 617
Завершенные тесты: 1
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;
    }
}
0
21.02.2013, 19:48
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.02.2013, 19:48

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

Сортировка массива
Всем привет...вот завтра надо сдавать, а что то мой мозг подкипает. В общем...

Сортировка массива
Написать и отладить программу сортировки вводимых с клавиатуры n элементов...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru