Šibenice -> Výpis výsledků a řazení z .dat souboru – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Šibenice -> Výpis výsledků a řazení z .dat souboru – C / C++ – Fórum – Programujte.comŠibenice -> Výpis výsledků a řazení z .dat souboru – C / C++ – Fórum – Programujte.com

 

Jakub Stodůlka
~ Anonymní uživatel
2 příspěvky
28. 4. 2010   #1
-
0
-

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

Nahlásit jako SPAM
IP: 195.113.159.–
liborb
~ Redaktor
+18
Guru
28. 4. 2010   #2
-
0
-

Co třeba pole stringů?

Nahlásit jako SPAM
IP: 85.207.166.–
Bald3rr0
Super člen
28. 4. 2010   #3
-
0
-

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.

Nahlásit jako SPAM
IP: 82.100.0.–
Jakub Stodůlka
~ Anonymní uživatel
2 příspěvky
28. 4. 2010   #4
-
0
-

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

???

Nahlásit jako SPAM
IP: 82.113.52.–
SeraphCZ0
Stálý člen
28. 4. 2010   #5
-
0
-

To, co jsi napsal je strašnej nesmysl.
Pole stringu se pise takhle:



string pole[] = {"Koko","Dement"};
cout<<pole[0].c_str();
cout<<"\n*************\n";
cout<<pole[1].c_str();

Nahlásit jako SPAM
IP: 85.71.98.–
liborb
~ Redaktor
+18
Guru
29. 4. 2010   #6
-
0
-

Jenom doplním, že string (řetězec) je pole znaků.

Nahlásit jako SPAM
IP: 85.207.166.–
eXilim
~ Anonymní uživatel
28 příspěvků
4. 5. 2010   #7
-
0
-

string pole[];

radek.open("db.dat", ios::in);
while (!radek.eof())
{
getline (radek,line);
pole[i] = line;
i++;
}

cout << pole[2];
radek.close();



Proč mi tohle nefunguje?? :o(

Nahlásit jako SPAM
IP: 195.113.159.–
KIIV
~ Moderátor
+43
God of flame
4. 5. 2010   #8
-
0
-

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

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
eXilim
~ Anonymní uživatel
28 příspěvků
4. 5. 2010   #9
-
0
-

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(

Nahlásit jako SPAM
IP: 195.113.159.–
KIIV
~ Moderátor
+43
God of flame
4. 5. 2010   #10
-
0
-

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

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+43
God of flame
4. 5. 2010   #11
-
0
-

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

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
eXilim
~ Anonymní uživatel
28 příspěvků
4. 5. 2010   #12
-
0
-

Díky moc už mi to jede :)

Ještě se zeptám když mám

string name = "neco..2";

jak mám vytáhnout jen to, co je za těma dvouma tečkama? (V tomto příapdě 2)

Nahlásit jako SPAM
IP: 195.113.159.–
KIIV
~ Moderátor
+43
God of flame
4. 5. 2010   #13
-
0
-

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

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
eXilim
~ Anonymní uživatel
28 příspěvků
4. 5. 2010   #14
-
0
-

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á...

Nahlásit jako SPAM
IP: 195.113.159.–
KIIV
~ Moderátor
+43
God of flame
4. 5. 2010   #15
-
0
-

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

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
eXilim
~ Anonymní uživatel
28 příspěvků
4. 5. 2010   #16
-
0
-

To KIIV : nechapu

Nahlásit jako SPAM
IP: 195.113.159.–
eXilim
~ Anonymní uživatel
28 příspěvků
4. 5. 2010   #17
-
0
-

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)

Nahlásit jako SPAM
IP: 195.113.159.–
KIIV
~ Moderátor
+43
God of flame
4. 5. 2010   #18
-
0
-

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 $

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
KIIV
~ Moderátor
+43
God of flame
4. 5. 2010   #19
-
0
-

To eXilim : mas tam spravnej include? cstdlib ?

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
eXilim
~ Anonymní uživatel
28 příspěvků
4. 5. 2010   #20
-
0
-

#include "stdafx.h"
#include <iostream>
#include <string>
#include <cstring>
#include <fstream>
#include <sstream>
#include <cstdlib>

Nahlásit jako SPAM
IP: 195.113.159.–
eXilim
~ Anonymní uživatel
28 příspěvků
4. 5. 2010   #21
-
0
-

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

Nahlásit jako SPAM
IP: 195.113.159.–
KIIV
~ Moderátor
+43
God of flame
4. 5. 2010   #22
-
0
-

a jak zpracovavas vystup z te funkce vycuc?

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
eXilim
~ Anonymní uživatel
28 příspěvků
4. 5. 2010   #23
-
0
-

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;
}

Nahlásit jako SPAM
IP: 195.113.159.–
eXilim
~ Anonymní uživatel
28 příspěvků
4. 5. 2010   #24
-
0
-

uz to vidim mam tam stringy misti int :o)

Nahlásit jako SPAM
IP: 195.113.159.–
KIIV
~ Moderátor
+43
God of flame
4. 5. 2010   #25
-
0
-

presne to sem si myslel :)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
eXilim
~ Anonymní uživatel
28 příspěvků
4. 5. 2010   #26
-
0
-

Mohu tě ještě využít? když už mám poel v intu, jdou nějak seřadit uložený hodnoty od největšího po nejmenší? (Prvních 10)

Nahlásit jako SPAM
IP: 195.113.159.–
KIIV
~ Moderátor
+43
God of flame
4. 5. 2010   #27
-
0
-

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..

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
eXilim
~ Anonymní uživatel
28 příspěvků
4. 5. 2010   #28
-
0
-

http://www.builder.cz/art/cpp/sortalg.html půjde to přes todle? :o)

Nahlásit jako SPAM
IP: 195.113.159.–
KIIV
~ Moderátor
+43
God of flame
4. 5. 2010   #29
-
0
-

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

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
exilim
~ Anonymní uživatel
28 příspěvků
4. 5. 2010   #30
-
0
-

No ted už jen poslední věc je seřadit ty výsledky pole od největšího po nejmenší a k tomu přiřadit ty jména

Nahlásit jako SPAM
IP: 82.113.52.–
pain0
Duch
5. 5. 2010   #31
-
0
-

To Jakub Stodůlka :
Hoď sem pak prosimtě odkaz až ti to bude fungovat vše tak jak má, jestli je to možné. Díky, zajímá mě to..

Nahlásit jako SPAM
IP: 82.99.141.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 37 hostů

Podobná vlákna

Výpis dat ze souboru — založil Pavel

Výpis výsledku — založil Michal93

PHP Mysql výpis výsledku — založil Anonymní uživatel

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý