Seznam jmen vytvořený polem – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Seznam jmen vytvořený polem – C / C++ – Fórum – Programujte.comSeznam jmen vytvořený polem – C / C++ – Fórum – Programujte.com

 

peaceman
~ Anonymní uživatel
8 příspěvků
23. 10. 2012   #1
-
0
-

Zdravím potřeboval bych poradit s přidávání, vyhledáváním a mazáním slov v poli (je to adresář jmen).  Mám udělané dvě pole. Jedno na jména a jedno na přijmení. Pustím program zadám jméno, ale nevím pomocí čeho ho mám uložit do pole. V pole už jména jsou takže aby se to uložilo k nim. To samé s mazáním.

Vyhledávání mám takhle

#include <iostream>
#include <string>
using namespace std;
int main( ){
int x;
string b;
string a[100]={"honza", "pepa"};
string s[100]={"novak", "novotny"};
cout << "Napiste hledane slovo ";
	cin >> b;

	for(x=0; x<1; x++)
	
if (b==a[x])
	
	cout << a[x] <<endl;
	
	else if (b==s[x])
cout << s[x] << endl;

	else
		cout<< "Hledane slovo neni v adresari"<< endl;

return(0);
}

U vyhledávání bych chtěl abych dal třeba jen Honza a ono mi to vypíše Honza Novak. Dejme tomu že žádné jmeno tam nebude dvakrát. Jen dodám že programuji chvilku. Děkuji.

Nahlásit jako SPAM
IP: 188.120.217.–
TheOndrap+2
Super člen
23. 10. 2012   #2
-
0
-

to je poměrně častá chyba´ .. v C/C++ se řetězce neporovnávají pomocí ==, ale je na to funkce:

int strcmp(const char *s1, const char *s2);

Dál je otázka, proč máš ten cyklus od 0 do 1 ?
A navíc ty podmínky můžeš mít normálně za sebou, nemusíš mít else .. přece když tam budeš mít "Petr Novotný", a "Ondřej Petr", tak bys rád, aby se ti vypsali oba, ne?

Nahlásit jako SPAM
IP: 147.228.209.–
ZČU v Plzni je mnohem víc, než jenom právnická fakulta !!
Fakulta aplikovaných věd www.fav.zcu.cz
"Když nedokážete říci věci jednoduše, pak jim dostatečně nerozumíte"
KIIV
~ Moderátor
+43
God of flame
23. 10. 2012   #3
-
0
-

#2 TheOndrap
vsak pouziva string.. ten se porovnavat da.. pretezuje operator ==

ja spis obdivuju nahodnost toho odsazovani ... v tom se vyznat musi byt umeni...

a k dotazu - proc nepouzit strukturu a jako pole napriklad vector.. 

pokud trvas na tomdle tak neni od veci mit aspon nejakou promennou, ktera drzi pocet jmen

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
TheOndrap+2
Super člen
23. 10. 2012   #4
-
0
-

#3 KIIV
Já jsem si toho právě nebyl jist, jestli je to přetížený :(( tak sry.

Ale tak jak tak, možná mu to funguje dobře, ale ten cyklus nestačí projet celým polem

Nahlásit jako SPAM
IP: 147.228.209.–
ZČU v Plzni je mnohem víc, než jenom právnická fakulta !!
Fakulta aplikovaných věd www.fav.zcu.cz
"Když nedokážete říci věci jednoduše, pak jim dostatečně nerozumíte"
KIIV
~ Moderátor
+43
God of flame
23. 10. 2012   #5
-
0
-

#4 TheOndrap
no cyklus projede samozrejme jen prvni polozku.. dal se nedostane

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
TheOndrap+2
Super člen
23. 10. 2012   #6
-
0
-

#5 KIIV
jojo, tak jak máš v podpisu :)

Nahlásit jako SPAM
IP: 147.228.209.–
ZČU v Plzni je mnohem víc, než jenom právnická fakulta !!
Fakulta aplikovaných věd www.fav.zcu.cz
"Když nedokážete říci věci jednoduše, pak jim dostatečně nerozumíte"
KIIV
~ Moderátor
+43
God of flame
23. 10. 2012   #7
-
0
-

(formalne je to cyklus od 0 do 0 :D)

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
peaceman
~ Anonymní uživatel
8 příspěvků
24. 10. 2012   #8
-
0
-

Říkal jsem vám že to dělám chvíli. jinak už jsem to udělal jinak.Jen pomocí if a podmínku jsem taky změnil.

Potřeboval bych, ale jak přidám slovo do pole. Dejme tomu že jenom jméno, příjmení pak bude stejný. Mám to zatím takhle, ale to mi tam neuloží. Mám určitě špatně to přiřazení.

cout << " Napiste slovo cesky ";
			cin >> b;

			for (int i=0; i<100; i++)
				if(a[i] == "") {
					b==a[i];
				}
Nahlásit jako SPAM
IP: 160.217.134.–
peaceman
~ Anonymní uživatel
8 příspěvků
24. 10. 2012   #9
-
0
-

Místo slovo česká má být jméno.

Nahlásit jako SPAM
IP: 160.217.134.–
KIIV
~ Moderátor
+43
God of flame
24. 10. 2012   #10
-
0
-

prirazeni je  =  ....  == je porovnani

Nahlásit jako SPAM
IP: 62.216.147.–
Program vždy dělá to co naprogramujete, ne to co chcete...
peaceman
~ Anonymní uživatel
8 příspěvků
24. 10. 2012   #11
-
0
-

když tam dám jen jedno rovnáse, tak to taky nejde

Nahlásit jako SPAM
IP: 160.217.135.–
KIIV
~ Moderátor
+43
God of flame
24. 10. 2012   #12
-
0
-

a pak se prirazuje doleva - co je nalevo, to se prepise tim, co je napravo

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
ingiraxo+15
Grafoman
24. 10. 2012   #13
-
0
-

pokud nechceš/nemůžeš používat kontejnéry z std (krom stringu), tak můžeš místo nějakýho pole použí linkedList, resp. zřetězený osoby... doufám že mě  neukamenujou, že jsem "opět" dávám skoro hotrový řešení, ale měl jsem chvilku čas :) 

#include <iostream>
#include <string>

using namespace std;

typedef struct OSOBA
{
    string jmeno;
    string prijmeni;
    OSOBA* dalsi;

    OSOBA() { }
    OSOBA(const string jmeno, const string prijmeni)
        : jmeno(jmeno), prijmeni(prijmeni), dalsi(nullptr) { }
} Osoba;

static Osoba* posledni = nullptr;

void pridej(Osoba*& osoby, const string jmeno, const string prijmeni)
{
    Osoba* os = new Osoba(jmeno, prijmeni);

    if (!osoby) osoby = os;
    else posledni->dalsi = os;
    posledni = os;
}

bool odeber(Osoba*& osoby, const string jmeno)
{
    Osoba* tmp = osoby;
    Osoba* predchozi = nullptr;

    while (tmp)
    {
        if (tmp->jmeno == jmeno)
        {
            if (!predchozi)
                osoby = osoby->dalsi;

            if (predchozi)
                predchozi->dalsi = tmp->dalsi;

            delete tmp;
            return true;
        }
        predchozi = tmp;
        tmp = tmp->dalsi;
    }
    return false;
}

Osoba* vyhledej(Osoba* osoby, const string jmeno)
{
    Osoba* tmp = osoby;

    while (tmp)
    {
        if (tmp->jmeno == jmeno)
            return tmp;

        tmp = tmp->dalsi;
    }
}

int main()
{
    Osoba* osoby = nullptr;

    pridej(osoby, "Karel", "Novak");
    pridej(osoby, "Petr", "Cool");

    Osoba* vysledek = vyhledej(osoby, "Petr");

    pridej(osoby, "Lucie", "Hulala");

    if (odeber(osoby, "Petr"))
    {
        cout << "Petr se odebral z listu!";
    }
    return 0;
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
vitamin+8
Grafoman
24. 10. 2012   #14
-
0
-

Riesit zoznam osob pomocou pola s pevne danou velkostou nie je dobry napad. Lepsie je pouzit daky kontainer ktory sa dokaze sam zvecsovat podla poctu prvkov (ak nemozes pouzit stl tak bude asi nejjednoduhsie pouzit postup od ingiraxo-a). Ak mozes (a vies:) ) pouzit stl, tak vysledny program moze vyzerat ovela jednoduhsie a prehladnejsie:

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

int main(){
	vector<pair<string, string>>  osoby;
	//edit: tu by sa dal pouzit aj inicialization list
	osoby.push_back({"Karel", "Novak"});
	osoby.push_back({"Petr", "Cool"});
	osoby.push_back({"Karel", "Cool"});
	
	string hladane_meno("Cool");
	
	for(auto &o : osoby)
		if(o.first == hladane_meno || o.second == hladane_meno){
			cout << "nasla sa osoba: " << o.first << " " << o.second << endl;
		}
	
    return EXIT_SUCCESS;
}

Pripadne vektor zabalit do triedy a dorobyt tam vyhladavacie a vkladacie funkcie.

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
peaceman
~ Anonymní uživatel
8 příspěvků
24. 10. 2012   #15
-
0
-

Moc děkuju všem za rady. Já už to mam celé napsané pomocí těch polí. Už mi jde i to přidávání jmen, ale vyplní mi to celé pole. Jak udělám, aby se to napsalo pouze jednou?

			cout << " Napiste jmeno ";
			cin >> b;

			for (int i=0; i<100; i++)
				if(c[i] == "") {
					c[i]=b;
				}
Nahlásit jako SPAM
IP: 188.120.217.–
vitamin+8
Grafoman
24. 10. 2012   #16
-
0
-

za c[i]=b;  napises  break;

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
peaceman
~ Anonymní uživatel
8 příspěvků
24. 10. 2012   #17
-
0
-

Děkuji vyřešeno. Poslední dotaz. Jak to jmeno smažu? Děkuji.

			cout << " vymazte slovo ";
			cin >> b;
			for (int i=0; i<100; i++)
				if(a[i] == b)
				//tak vymaž jmeno
Nahlásit jako SPAM
IP: 188.120.217.–
ingiraxo+15
Grafoman
24. 10. 2012   #18
-
0
-

nastaví hodnotu v tom indexu na null, případně ""... ale aby to nebylo jak zuby, tak ho budeš muset přeuspořádat (aby tam nevznikla mezera mezi dvěma jmenama)

prostě pak posuneš všechny jména za smazaným o -1

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
peaceman
~ Anonymní uživatel
8 příspěvků
24. 10. 2012   #19
-
0
-

Když tam budou zuby tak to nevadí. Vím že nastavím hodnatu na "", ale nevím jak to napsat.

Nahlásit jako SPAM
IP: 188.120.217.–
vitamin+8
Grafoman
24. 10. 2012   #20
-
0
-

Kedze pracuje s tym polom dost nemotorne (vzdy ho prechadza cele), tak tie zuby vobec nevadia.

string moze "zmazat" napr takto:

a[i] = "";
a[i] = string();
a[i].clear();
//urcite nepouziva toto:
a[i] = nullptr;	//robi to daco uplne ine ako predchadzajuce moznosti;
Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
ingiraxo+15
Grafoman
24. 10. 2012   #21
-
0
-

#20 vitamin
to je vlastně pravda.. ale mohl by to aspoň breaknout kdyby to narazilo na prazdnej string a neprocházet tak celý pole

a když už jsme u toho, tak ten cyklus můžeš nahradit foreachem 

for each(string& str in c)
{
    if (str == "")
        str = b;
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
peaceman
~ Anonymní uživatel
8 příspěvků
24. 10. 2012   #22
-
0
-

Všem děkuji za pomoc.

Nahlásit jako SPAM
IP: 188.120.217.–
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, 21 hostů

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ý