Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

20.02.2013, 17:49. Просмотров 340. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сортировка массива (C++):

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

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

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

Сортировка массива. Ошибка после ввода размерности массива - C++
подскажите почему после ввода размерности массива выдает ошибку #include<iostream> #include<cstdlib> #include<conio> using...

Сортировка массива, вместо массива выводит мусор - C++
Здравствуйте Уважаемые жители форума! Есть рабочий код сортируем массив выбором поиск наименьшего значения, но почему выводит какой то...

Указатели массива и сортировка массива - C++
Доброго времени суток, вот бьюсь над проблемой, нужна программа которая б сортировку динамического массива (ввод с клавиатуры) из 10...

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

0
Dekio
Фрилансер
Эксперт С++
5837 / 1218 / 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;
Для таких случаев придуманы динамические массивы.
0
BumerangSP
4287 / 1409 / 121
Регистрация: 16.12.2010
Сообщений: 2,941
Записей в блоге: 3
20.02.2013, 21:44 #6
Dekio, мне из примера почему-то показалось, что нужно просто их суммы сравнивать. Т.ч весь алгоритм настроен на это. А вместо тройки в цикле должен n, видимо, не заметил, когда менял.
А с инклюдами, типами массивов и т.д. ТС пусть сам разбирается. Тут по сути главное - алгоритм.
0
Dekio
Фрилансер
Эксперт С++
5837 / 1218 / 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;
}
1
Kuzia domovenok
2030 / 1874 / 168
Регистрация: 25.03.2012
Сообщений: 6,451
Записей в блоге: 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
4287 / 1409 / 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 содержит все свапы. Но Ваш конечно предпочтительней.
0
jurok_85
241 / 225 / 78
Регистрация: 21.02.2013
Сообщений: 520
Завершенные тесты: 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
Привет! Вот еще темы с ответами:

Сортировка массива - C++
Нам задан числовой массив А. Нужно построить одномерный массив, в котором числа идут по определенному закону: &gt;-10 и &lt;10; &gt;10; &lt;-10; все...

Сортировка массива - C++
Кто может объяснить 31 строку кода. Почему надо умножать на 30 ? И как строка будет выглядеть, если массив вводить вручную или массив...

Сортировка массива - C++
Задан массив из k чисел. Найти числа, входящие в массив только один раз. Программа в Visual C++ 6. #include &quot;stdafx.h&quot; #include...

Сортировка массива - C++
Помогите пожалуйста. При входных данных 10 -размерность, 2 -1 3 5 0 -6 1 0 8 -3 -сам массив, 2 5 -a,b получается , то есть 2 должно...


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

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

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