Sortowanie łańcuchów string

0

Witam
Mam problem z sortowaniem łańcuchów string.

#include <iostream>
#include <string>
using namespace std;

int main()
{
	int n;
	cout << "Podaj ilość łańcuchów\n";
	cin  >> n;
	string *p;
	p = new string[n]; // dałem tablicę stringów bo nic innego nie przyszło mi do głowy
	
	cout << "Podaj elementy biżuterii\n";
	for (int i = 0; i < n; i++)
	{
		cin >> p[i];
	}
	string min = p[0];
	for (int j = 0; j < n; j++)
	{
		for (int i = j; i < n; i++)
		{
			if (min > p[i])
			{
				min = p[i];
			}	
		}
		p[j] = min;
	}
	cout << "Uporządkowane łańcuchy\n";
	for (int i = 0; i < n; i++)
	{
		cout << p[i] << endl;
	}
	delete [] p;
	return 0;
}
 

Po wpisaniu danych wejściowych na ekranie cztery razy ukazuje się jeden (losowy) z wpisanych łańcuchów. Nie wiecie gdzie popełniłem błąd? korzystam z g++.
PS jest to zadanie ze strony main.edu.pl/pl/archive/oig/1/sor

0

w C++ nie wolno tworzyć tablic.
hę? kto tak powiedział. oczywiście że można.

dałem tablicę stringów bo nic innego nie przyszło mi do głowy
vector<string> byłoby chyba lepsze (dodaj #include <vector>).

i poczytaj o jakimkolwiek algorytmie sortowania.

0

Chyba głównym problemem jest tu to, że chcesz porównywać łańcuchy znaków za pomocą operatora porównania :) No chyba że mnie coś ominęło :)

0

a jak wypełnić wektor z wejścia cin?

string tekst; cin >> tekst; v.push_back(tekst); 

coś takiego?

0

zmieniłem na tablice string na wektor i mam to samo. nie jestem biegly w wektorach wiec dam caly kod jak teraz wyglada:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main()
{
	int n;
	cout << "Podaj ilość łańcuchów\n";
	cin  >> n;
	vector<string> v;
	cout << "Podaj elementy biżuterii\n";
	string tekst;
	for (int i = 0; i < n; i++)
	{//tu jestem prawie pewien ze cos jest nie tak
		cin >> tekst;
		v.push_back(tekst);
		tekst = 'NULL';
	}
	string min = v[0];
	for (int j = 0; j < n; j++)
	{
		for (int i = j; i < n; i++)
		{
			if (min > v[i])
			{
				min = v[i];
			}	
		}
		v[j] = min;
	}
	cout << "Uporządkowane łańcuchy\n";
	for (int i = 0; i < n; i++)
	{
		cout << v[i] << endl;
	}
	return 0;
}

 

jesli widzicie co jest nie tak to prosze, pomagajcie

0

Przy okazji, to błąd nie jest spowodowany użyciem tablicy (choć wektor jest i tak o wiele lepszy), tylko duplikowaniem minimalnego elementu.

0
Zjarek napisał(a)

Przy okazji, to błąd nie jest spowodowany użyciem tablicy (choć wektor jest i tak o wiele lepszy), tylko duplikowaniem minimalnego elementu.

Dziękuję za pomoc, dzięki Tobie znalazłem błąd. Ale niestety nadal jest źle.

string min;
	for (int j = 0; j < n; j++)
	{
		min = v[j];
		for (int i = j; i < n; i++)
		{
			if (min > v[i])
			{
				min = v[i];
			}	
		}
		v[j] = min;
	}
 

za każdym razem program zachowuje się inaczej, za każdym razem niezrozumiale.

0

Nadal go duplikujesz. Wpisujesz na pozycji j minimalny z następnych stringów w tablicy, zostawiając go na tej pozycji na której był, przez co w tablicy masz po tej operacji dwa stringi minimalne..

0

odnajdujesz najmniejszą wartość dla przdziału <j, n-1>, to jest dobrze.
Problem stanowi co robisz z tym minimum. Twoje przypisanie "v[j] = min;" powoduje, że stara wartość v[j] jest zapominana (tracona bezpowrotnie), a odnalezione minimum jest duplikowane (maż dwie kopie tej wartości: w nowej i starej pozycji).
Poprawa to tak, by zamieniać wartości miejscami i będzie dobrze.

0

nadal źle... ale co?

string min;
	int indeks;
	for (int j = 0; j < n; j++)
	{
		min = v[j];
		for (int i = j; i < n; i++)
		{
			if (min > v[i])
			{
				min = v[i];
				indeks = i;
			}	
		}
		v[indeks] = v[j];
		v[j] = min;
	}

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