Reklama
Pokazuje wyniki od 1 do 8 z 8

Temat: [C++] Sortowanie stringów reprezentujących godzinę

  1. #1
    Avatar Rzulf
    Data rejestracji
    2009
    Posty
    481
    Siła reputacji
    15

    Domyślny [C++] Sortowanie stringów reprezentujących godzinę

    Muszę posortować listę stringów w formacie gg:mm (0-24h). Zupełnie nie wiem jak się do tego zabrać. Jakieś pomysły torgi?

    Jak porównać wybrany element listy z następnym?
    Ostatnio zmieniony przez Rzulf : 25-05-2015, 19:12

  2. #2
    Avatar 2cztery7
    Data rejestracji
    2014
    Posty
    628
    Siła reputacji
    10

    Domyślny

    napisz sobie funkcję, która porównuje dwa stringi i zwraca 1 gdy pierwszy jest większy, 0 gdy są równe i -1 gdy drugi jest większy. potem napisz sobie jakieś proste sortowanie, np. bąbelkowe.
    przy założeniu, że długość argumentów zawsze jest taka sama, to funkcja może wyglądać mniej więcej tak:
    Kod:
    int compare(string s1, string s2)
    {
       for(int i = 0; i < s1.length(); i ++)
       {
          if(s1[i] != s2[i]) return s1[i] > s2[i] ? 1 : -1;
       }
       return 0;
    }

  3. Reklama
  4. #3
    Avatar Absherr
    Data rejestracji
    2008
    Położenie
    Kraków
    Posty
    578
    Siła reputacji
    16

    Domyślny

    No tylko bierz pod uwagę, że jak będziesz porównywał stringi to możesz dostać kolejność 1,10,11,12,13,14,...,2,20,21,22,23,24.
    Ostatnio zmieniony przez Absherr : 25-05-2015, 19:14

  5. #4
    Avatar Rzulf
    Data rejestracji
    2009
    Posty
    481
    Siła reputacji
    15

    Domyślny

    Mam coś takiego, ale nie wychodzi z pętli
    Kod:
    int zamiana;
    wsk = head;
    do
       {
       zamiana = 0;
       while (wsk != NULL)//nie wychodzi z tej petli
       {
           if (compare(wsk->get_godzina_odjazdu(), wsk->nast->get_godzina_odjazdu()))
              {
                  zamiana = zamiana + 1;
                  schowek = wsk;
                  wsk = wsk->nast;
                  wsk->nast = schowek;
              }				
       }
    } while (zamiana != 0);
    Ostatnio zmieniony przez Rzulf : 25-05-2015, 19:26

  6. #5
    Avatar 2cztery7
    Data rejestracji
    2014
    Posty
    628
    Siła reputacji
    10

    Domyślny

    Cytuj Absherr napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    No tylko bierz pod uwagę, że jak będziesz porównywał stringi to możesz dostać kolejność 1,10,11,12,13,14,...,2,20,21,22,23,24.
    napisał gg:mm, co oznacza, że godzinę pięć po szóstej zapisuje jako 06:05, więc nie ma problemu.
    @up

    @Rzulf ;
    no i co się dzieje jak porównasz i wyjdzie zero? nie przesuwasz wskaźnika i znowu porównujesz te same wartości.
    narysuj sobie na kartce jak to ma działać a potem to napisz.
    do tego jakbyś już doszedł do ostatniego elementu, to porównujesz go z nullem.
    Ostatnio zmieniony przez 2cztery7 : 25-05-2015, 19:55

  7. #6
    Avatar Rzulf
    Data rejestracji
    2009
    Posty
    481
    Siła reputacji
    15

    Domyślny

    Kod:
    	do
    	{
    		zamiana = 0;
    		wsk = head;
    		while (wsk->nast != NULL)
    		{
    			if (compare(wsk->get_godzina_odjazdu(), wsk->nast->get_godzina_odjazdu()))
    			{
    				zamiana++;
    				temp = wsk->nast;
    				wsk->nast = wsk;
    				wsk = temp;
    			}
    			wsk = wsk->nast;
    		}
    	} while (zamiana != 0);
    Za pierwszym razem normalnie przechodzi przez pętle, potem nie wchodzi w warunek. Nie mam pojęcia co jest źle.

  8. #7
    konto usunięte

    Domyślny

    Zrob z tego stringa "hh:mm" klase, zdefiniuj operator < i uzyj http://en.cppreference.com/w/cpp/algorithm/sort.

    Kod:
    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    class Foo
    {
    public:
    	Foo(std::string&& str_) :
    		str(std::move(str_))
    	{}
    
    	bool operator<(const Foo& other) const
    	{
    		// to sobie dopisz
                    // np.: godzian * 60 + minuty, i to porownaj do other.
    		return str < other.str;
    	}
    	
    	std::string getString() 
    	{
    		return str;
    	}
    	
    private:
    	std::string str;
    };
    
    int main() {
    	
    	std::vector<Foo> v;
    	v.push_back(Foo("2"));
    	v.push_back(Foo("3"));
    	v.push_back(Foo("1"));
    	
    	std::sort(v.begin(), v.end());
    	for (auto x : v)
    		std::cout << x.getString() << std::endl;
    	return 0;
    }
    Ideone: http://ideone.com/90jgWx
    Ostatnio zmieniony przez szulak : 26-05-2015, 13:28

  9. #8
    Avatar Rzulf
    Data rejestracji
    2009
    Posty
    481
    Siła reputacji
    15

    Domyślny

    W końcu zrobiłem na wskaźnikach bo nie chciałem całego kodu przepisywać na wektory. Dzięki za chęci i podsunięcie paru pomysłów.

Reklama

Informacje o temacie

Użytkownicy przeglądający temat

Aktualnie 1 użytkowników przegląda ten temat. (0 użytkowników i 1 gości)

Podobne tematy

  1. Zarobek Perfect Hash 0,15% na godzinę, 3,6% dziennie
    Przez Pomidorowy w dziale Prawo i finanse
    Odpowiedzi: 4
    Ostatni post: 02-10-2015, 09:59
  2. C++ Sortowanie stringów.
    Przez Kokolik w dziale Programowanie
    Odpowiedzi: 8
    Ostatni post: 24-12-2014, 00:30
  3. Dir 300 rozlacza co godzine
    Przez zizou w dziale Sprzęt i oprogramowanie
    Odpowiedzi: 11
    Ostatni post: 30-03-2013, 18:33
  4. Jak obliczyc ile moj komputer pobiera pradu na godzine?
    Przez Brutalny Rzeznik w dziale Sprzęt i oprogramowanie
    Odpowiedzi: 7
    Ostatni post: 01-11-2011, 17:55

Zakładki

Zakładki

Zasady postowania

  • Nie możesz pisać nowych tematów
  • Nie możesz pisać postów
  • Nie możesz używać załączników
  • Nie możesz edytować swoich postów
  •