Witam. Pytanie jak w temacie. Dodam ze chodzi o C++ i biblioteke MFC. Srodowisko visual studio .net 2003. Prosze o pomoc.
stwórz sobie tablice rekordów
struct znaki{
char znak;
char waga;
}
znaki tablica[300];
będziesz musiał wyznaczyć sobie wagi, ale potem będzie już gicior :d
Tak czy inaczej będziesz musiał napisać funkcje sortującą - parę if'ów w tą czy w tamtą
Ok, tak tez myslalem. Moze podpowiesz mi cos wiecej jak to zrobic? Uzywam ogolnie typu string z STL'a do operacji na strongach, tam chyba mzna jakos podpiac swoja funkcje porownujaca litery, nie wiem tylko jak. Dzieki za odpowiedz!
Ehmm, to się robi przez ustawienie locale, dokładnie sposobu porównywania łańcuchów, czyli collate.
W C: setlocale(), strcoll(), itp.
W C++: std::locale, std::collate<>, itp.
Zamieszcze mały przykładzik, z tym że pomieszane jest C i C++, bo nie mogę zmusić C++ do włączenia locale PL [?ktoś ma pomysł? żadne pl_PL polish, itp. nie działa, MinGW/Windows2k]:
#include <string>
#include <cstdlib>
#include <locale>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool comp(const string& s1, const string& s2)
{
return (strcoll( s1.c_str(), s2.c_str() )==-1) ? true : false;
}
int main()
{
// "polish_poland.1250" albo "polish_poland.852"
// tylko collate nam potrzebne ale mozna tez LC_ALL
if (!setlocale(LC_COLLATE, "polish_poland.852"))
{
fprintf(stderr, "Can't set the specified locale! "
"Check LANG, LC_CTYPE, LC_ALL.\n");
return 1;
}
vector<string> vv;
string s;
while ( getline( cin, s ) )
{
if (s=="!") break; // koniec wczytywania
vv.push_back( s );
}
sort( vv.begin(), vv.end(), comp );
for ( int i=0; i<vv.size(); i++ )
cout << vv[i] << endl;
}
Przy okazji jest przykład funkcji sortującej dla std::sort().
Ale jest mały problem z działaniem, TRZEBA dobrze trafić z prawdziwym kodowaniem łańcucha znaków, tzn. jeżeli strona kodowa jest 852 w setlocale() to stringi MUSZĄ być w CP852 :)
Tu może być trudność jeżeli program ma działać na innym kompie (np. z CP1250) ale to pozostawiam dla zioma :]
Na moim win2000 (CP852) program daje kolejność:
a
ą
c
ć
e
ę
l
ł
n
ń
o
ó
s
ś
x
z
ź
ż
Powodzenia!