Zdravim, mám takový menší problém. Učitel na IKT nám zadal naprogramovat jednoduchou šibenici v C++. Jsem ve fázi kdy uživatel hádá slova, body zapisuje na konec datovýho souboru. Nyní potřebuju ze souboru vypsat prvních 10výsledků s největším počtem bodů. Výsledky zapisuju ve formátu NICKNAME§POČET_BODŮ (Např. exilim§22). Problém je v tom, že vůbec nemam páru, jak ty výsledky takhle vypsat...
Jdou do nějakýho pole uložit celé řetězce? Díky
Aktuální práce: http://gww.cz/Enter.txt
Díky za každou pomoct
Fórum › C / C++
Šibenice -> Výpis výsledků a řazení z .dat souboru
To Jakub Stodůlka : Hledej funkci strtok, tak ti umožní načíst data oddělená oddělovačem. Data bych načetl někam do struktury (jméno; skóre). Buď můžeš při načítání kontrolovat hodnotu skóre a načítat už je seřazené nebo načíst všechny, pak je seřadit a vypsat prvních deset.
liborb napsal:
Co třeba pole stringů?
Pole stringů se dálá jak? Já myslel že pole stringů jsou jednotlivé znaky ?
string c = ahoj;
cout << "string["0"]"; //a
cout << "string["1"]"; //h
cout << "string["2"]"; //o
cout << "string["3"]"; //j
???
protoze prekladac netusi kolik budes chtit pouzit stringu..
tak nealokuje pro jistotu zadnej..
na to uz by byla asi lepsi trida vector a v ni stringy... resp ukazatel na string.. ten pred nactenim alokovat pomoci new a po skonceni zase uvolnit pomoci delete
Nejak nechapu, ted jsme zkusil toto:
radek.open("db.dat", ios::in);
while (!radek.eof())
{
getline (radek,line);
i++;
}
string pole[i];
while (!radek.eof())
{
getline (radek,line);
pole[i] = line;
i++;
}
cout << pole[0].c_str() << endl;
cout << pole[1].c_str() << endl;
cout << pole[2].c_str() << endl;
cout << pole[3].c_str() << endl;
cout << pole[4].c_str() << endl;
radek.close();
//Nejdřív zjistim počet řádků a vytvořím pole, ale mě to píše chybu :o(
protoze string pole[ cislo ] potrebuje znat to cislo uz pri kompilaci.. to je o dost driv nez spoustis program...
ale muzes zkusit string * pole = new string[i];
a nakonci delete [] pole;
v tomto pripade by v tom snad ani nemel byt tolik rozdil
nebo jak se to u zacatecniku dela: reknes ze muze byt maximalne 1000 polozek .. a pri nacitani si akorat pocitas, na ktere pozici si skoncil...
mimochodem i v tom poslednim kodu bys mel vic chyb nez je zdravo:
1. pole[i] = line; pak i++ ; ale nikde si nevynulujes i ... takze bys zapisoval tak jak tak 100% za konec pole
2. nikde se nevratis na zacatek souboru.. takze bys nic nezapsal (tim by se neprojevila predchozi chyba :))
jeste do getline muzes hodit rovnou prvek z pole.. tj pole[i] a nemusis to nacitat pres pomocnou promennou
ja to obvykle resil prochazenim od konce dokud sem nenarazil na '.' (zalezi na tom jestli tam muze byt jen jedna samotna..)
pak uz neni problem zkopirovat retezec od pozice za . do konce nekam jinam
u c stringu se dalo nahradit delici znak znakem '\0' a ukladat si ukazatele na jednotlive tokeny.. (ale fungovalo jen pro jeden znak)
pak jeste existuje metoda stringu rfind nebo find .. rfind vraci pozici kde se naleza nejaky podretezec.. napriklad ty ".."
pak bys je musel preskocit a zkopirovat zbytek
Udelal sem fci:
string vycuc(string name)
{
string d;
int p=0;
for(int x=0; x < name.length();x++)
{
if(name[x] == '§')
{
p = 1;
x += 2;
}
if(p==1) {
d += name[x];
}
}
cout << "Body:" << d;
return d;
}
a pak
string hh;
hh = pole[0].c_str();
cout << hh << endl;
hh = vycuc(hh);
cout << hh << endl;
Vše funguje ale ta funkce vycuc mi nevrací to číslo ale když udelam tohle:
string vycuc(string name)
{
name = "nick§22"; // přeuložim to ručně
string d;
int p=0;
for(int x=0; x < name.length();x++)
tak mi to normálně vrátí 22 jak má...
ono kdyz uz tam mas stavovej automat .. a ses na pozici oddelovace.. neni zrovna dobrej napad posunout se o dalsi dve pozice..
v tomdle pripade by stacilo o 1.. abys byl na znaku hned za oddelovacem
Už to válí díky... ještě se zeptám... Potřebuju převést číslo ze stringu na int, našel jsem todle:
int GetIntVal(string strConvert) {
int intReturn;
intReturn = atoi(strConvert.c_str());
return(intReturn);
}
ale mě to vrací úplný kraviny (čísla vůbec)
projizdis retezec.. "neco$22"
na pozici 4 mas $
nastavis ze se ma uz pridavat do vystupniho retezce
a pripoctes +2.. ted budes na pozici 6, kde je ale uz druha '2'
no a pak se jeste ve for pricte 1, to uz ses za koncem pole a tim ti ve vystupu zbyde jen "2"
kdyz by tam bylo "neco$1234" tak bys tam mel cca "234"
+ ted testuju a evidentne v UTF je § vicebajtovej.. tj nemuzes ho poradne pouzit.. zkus treba ; nebo $
int GetIntVal (const string &str) {
stringstream ss(str);
int n;
ss >> n;
return n;
}
int vycuc(string name)
{
string d;
int p=0;
for(int x=0; x < name.length();x++)
{
if(name[x] == '§')
{
p = 1;
x += 1;
}
if(p==1) {
d += name[x];
}
}
int num;
num = GetIntVal(d);
return num;
}
num vrací smajlíka o.O
bool vysledky()
{
fstream radek;
fstream radek2;
string line;
int i=0;
int j=0;
string gf;
string hh;
radek.open("db.dat", ios::in);
while (!radek.eof())
{
getline (radek,line);
i++;
}
radek.close();
string * pole = new string[i];
radek2.open("db.dat", ios::in);
while (!radek2.eof())
{
getline (radek2,line);
hh = vycuc(line); // zde mame vycucnuti
pole[j] = hh;
j++;
}
radek2.close();
cout << "Vysledek:" << pole[6] << endl; //jen test jetli to ukazuje to, co má
delete [] pole;
return true;
}
libovolnym radicim algoritmem .. nejsnadnejsi je treba bubble sort nebo select sort.. nejrychlejsi byva quick sort.. ale je uz trochu narocnejsi.. myslim ze i nejaky razeni sou v knihovnach.. musel bys ale pohledat..
mohlo by.. akorat nezapomen ze budes asi chtit prohazet i ty jmena co k tomu patri..
coz uz je trochu tezsi .. ale naznak reseni tam je tez.. ikdyz to zase bude znamenat docela prekopat to cele
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Výpis dat ze souboru — založil Pavel
Čtení z binárního souboru a následný výpis dat — založil avalagne
Sibenice-nacitani ze souboru — založil Tom
Výpis výsledku — založil Michal93
PHP Mysql výpis výsledku — založil Anonymní uživatel
Moderátoři diskuze