Sortowanie danych typu string bez użycia tablic

0

Cześć wszystkim,
Jestem kompletnie początkującym jeśli chodzi o C++, dlatego pytanie może być głupie i oczywiste, jednak nie znalazłem na nie odpowiedzi.
Mianowicie, mam za zadanie w przykładowym programie stworzyć funkcję, która posortuje mi stringi z innego pliku, względem ich długości, jednak zabronione jest używanie tablic, jak i używanie dodatkowych bibliotek. I właśnie z tym wiąże się problem, dalsza część zadania jest stosunkowo prosta, jednak nie mam pomysłu jak poruszać się po stringach bez tablic.
Z góry dziękuję za wszystkie rady.

1

Użyj std::vector. Chyba że chodzi o działanie na pliku bez angażowania pamięci podręcznej w ogóle, wtedy dochodzi zabawa z mmap, ale jeśli jesteś początkujący to raczej nie o to chodzi

0
kq napisał(a):

Użyj std::vector. Chyba że chodzi o działanie na pliku bez angażowania pamięci podręcznej w ogóle, wtedy dochodzi zabawa z mmap, ale jeśli jesteś początkujący to raczej nie o to chodzi

Nie mogę użyć std::vector, ponieważ wymaga to użycia dodatkowej biblioteki. Myślałem już o tym, no ale właśnie takie są ograniczenia.

0
Falqon napisał(a):
kq napisał(a):

Użyj std::vector. Chyba że chodzi o działanie na pliku bez angażowania pamięci podręcznej w ogóle, wtedy dochodzi zabawa z mmap, ale jeśli jesteś początkujący to raczej nie o to chodzi

Nie mogę użyć std::vector, ponieważ wymaga to użycia dodatkowej biblioteki. Myślałem już o tym, no ale właśnie takie są ograniczenia.

jest to bliotekla STANDARDOWA
Tak std::cin - tego też nie wolno ?

Właściwie nie da się napisać użytecznego komunikującego się z otoczeniem programu, zupełnie bez.

0

Olej tablice, używaj plików , rób ich duże ilości i w nich przechowuj dane. To nie tablice tylko strumienie he he he I potem odczytywanie rozmiarów plików i sortowanie bąbelkowe he he he A struktury dozwolone czy ma byc primitve level max? Bo możesz potworzyć struktury w nich wskaźniki do plików i ich rozmiar he he he Ale to dawno nie robiłem, tylko się domyślam, ale ja bym tak kombinował. ALBO chodzi o sortowanie wraz z regularnym zapisem plików na zmianę z wstawkami aktualnego stringu w miejsce docelowe w nowym pliku. Robisz pętle z sortowaniem i szukasz w które miejsce wpisać string. I tak generujesz na zmiane dwa pliki zamiennie.

0

Polecenie:
Zadaniem jest zaimplementować poniższe procedury o podanych nazwach i określonych typach argumentów.

  • void SortCount (string, string, string)
    Podprogram odczytuje dane o podanej strukturze z pliku o nazwie przekazanej pierwszym argumentem, zaś efektem działania będą odczytane dane zapisane w pliku o nazwie przekazanej pierwszym argumentem zgodnie z relacją:
    • Dane ze składową typu int o większej liczności są umieszczone przed danymi o mniejszej liczności wystąpień składowej typu int.
    • [...]
      W rozwiązaniu nie wolno używać znaków kwadatowych nawiasów lub ich zastępników, oznaczając zakaz używania tablic.
      Zabronione jest używanie typów wskaźnikowych i referencyjnych oraz dynamicznego przydziału pamięci.
      Zabronione jest używanie słowa class
      Zabronione jest własne włączanie plików nagłówkowych, ale można założyć dostępność plików fstream, iostream oraz string
0

W sumie rozumiem cel tego ćwiczenie, chyba ktoś planuje zrobienie spisu nazwisk wszystkich obywateli świata. Wtedy to by miało sens. W pamięci by nie było jednocześnie wielu danych, nic co mogłoby wzbudzić niepokój operatorów. Falqon - uczysz się u jakiegoś profesorka co ma zapędy dyktatorskie?

1
infinityhost napisał(a):

W sumie rozumiem cel tego ćwiczenie, chyba ktoś planuje zrobienie spisu nazwisk wszystkich obywateli świata. Wtedy to by miało sens. W pamięci by nie było jednocześnie wielu danych, nic co mogłoby wzbudzić niepokój operatorów. Falqon - uczysz się u jakiegoś profesorka co ma zapędy dyktatorskie?

Zdecydowanie tak bym to określił, jak i zapędy psychopatyczne.

1

Zawsze możesz użyć merge sort i sortować używając dwóch ifstream do odczytu oraz jednego ofstream do zapisu.

0
_13th_Dragon napisał(a):

Zawsze możesz użyć merge sort i sortować używając dwóch ifstream do odczytu oraz jednego ofstream do zapisu.

Merge sort nie będzie wymagać użycia nawiasu kwadratowego?

0
Falqon napisał(a):

Merge sort nie będzie wymagać użycia nawiasu kwadratowego?

Jak masz jedynie problem z użyciem nawiasów kwadratowych to spokojnie jedziesz bąbelkowym, używając:

type *tb=(type *)malloc(N*sizeof(type)); // pamięć
*(tb+i)=value; //indeksacja

Nie ma nawiasów klamrowych, ale tablica jest.
lub:

vector<type> tb(N); // pamięć
tb.at(i)=value; // indeksacja

Nie ma nawiasów klamrowych, ale tablica jest.

Natomiast jak nie może być tablic to znaczy że tylko i wyłącznie merge sort.

0

Dzięki wszystkim za pomoc, postaram się coś z tego zrobić

1

Pomysł durny (tak jak i zadanie), ale w zasadzie możesz to zrobic przez bubble sort - wykorzystując to, że zamieniane są tam tylko elementy leżące koło siebie (zatem w pliku otwartym w trybie RW jeśli uznasz że musisz zamienić miejscami dwa wiersze - wystarczy seek i zapisanie ich w odwrotnej kolejności - liczba bajtów się zgadza więc nie ma potrzeby modyfikowania reszty zawartości).

Coś w tym stylu

1. Policz wszystkie wiersze w pliku --> nlines
2. Wykonaj nlines razy:
  1. seek na poczatek
  2. ustaw pos1 na zero
  3. wczytaj str1
  4 Wykonaj nlines-1 razy:
    1. zapamietaj aktualną pozycję jako pos2 i wczytaj str2
    2. jeśli trzeba zamienić str1 i str2, to
       1. seek na pos1 
       2. piszesz str2 
       3. zapamiętujesz aktualną pozycję jako pos1
       4. piszesz str1
    3. jeśli nie trzeba było zamieniać - ustaw pos1 na pos2
    4. ustaw str1 na str2

1 użytkowników online, w tym zalogowanych: 0, gości: 1