String v podmínce – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

String v podmínce – C / C++ – Fórum – Programujte.comString v podmínce – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
delicacyy
~ Anonymní uživatel
51 příspěvků
25. 8. 2012   #1
-
0
-

Zdravím. Mám za úkol vytvořit program, který bude v cyklu od uživatele požadovat zadání slov, dokud uživatel nezadá slovo END. Potom vypíše všechna dosud zadaná slova oddělená mezerou (kromě slova END).

O něco jsem se pokusila, ale jelikož stavím na svých znalostí z Cčka, tak nevím, jestli je to v C++ dobře.

Kompilátor hlásí chyby warning: ISO C++ forbids variable length array ‘letters’ [-Wvla] a variable-sized object ‘letters’ may not be initialized, ale neumím si s nimi nějak poradit. Jsem začátečník..

#include <string>
using namespace std;

int main() 
{
 int i = 0;
 string letters[i] = "";
 cout << "Zadejte jakakoli slova a vypisi je, skoncim s nacitanim, az napisete END" << endl;
 for (i = 0; i < 200000; i++)
  {
   cin >> letters[i];
    if (letters[i] == "END")
     {
      //nejaka podminka?
      break;
     }
    else 
     {
      cout << letters[i];
     }
  }
return 0;
}
Nahlásit jako SPAM
IP: 88.100.79.–
Reklama
Reklama
vitamin+8
Grafoman
25. 8. 2012   #2
-
+1
-
Zajímavé

Máš to relatívne dobre, tu máš trochu upravený kód:

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

#define MAX_POCET_SLOV 100
int main() {
	unsigned i;
	string letters[MAX_POCET_SLOV];		//pole o velkosi 0 nedava zmysel
	
	cout << "Zadejte jakakoli slova a vypisi je, skoncim s nacitanim, az napisete END" << endl;
	for (i = 0; i < MAX_POCET_SLOV; i++){
		cin >> letters[i];
		if (letters[i] == "END")break;
	}
	
	//sem treba dat cyklus co vypise slova od 0 po i (i reprezentuje pocet nacitanych slov)
	
	return 0;
}
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. "
Atheo+4
Stálý člen
25. 8. 2012   #3
-
0
-

#1 delicacyy
Udělej si pole do kterého budeš ukládat ty slova z cecka

scanf("%s", prikaz)
for(x = 0; x < 500; x++)
{
	if(!strcmp("end",prikaz))
	{
		return 0;
	}
	else
	{
		pole[x] = strdup("%s",prikaz)
	}
}

a pak když to budeš chtít vypisovat tak takhle

for (x = 0; x < 500; x++)
{
	if(pole[x] == 0)
	{
	}
	else
	printf("%s", pole[x]);
}

a hlavně na začátku programu to pole musíš vypsat aby byly všechny hodnoty v poli nulové tzn 

for(x = 0; x < 500; x++)
{
	pole[x] = 0;
}
Nahlásit jako SPAM
IP: 188.175.140.–
Atheo+4
Stálý člen
25. 8. 2012   #4
-
0
-

#1 delicacyy
btw na to je lepší nekonečná smyčka než nejaky 

for(i = 0; i < 99999999; i++) 

ale 

while(1)
{
	i++
	prikazy/podminky atd
}
Nahlásit jako SPAM
IP: 188.175.140.–
vitamin+8
Grafoman
25. 8. 2012   #5
-
0
-

#4 Atheo

Programuje v C++ a používa string, takže sa nemusí babrať s C stringami.

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. "
Oplis
~ Anonymní uživatel
6 příspěvků
25. 8. 2012   #6
-
0
-

#4 Atheo
Nebo

for(;;)

{

...

}

Nahlásit jako SPAM
IP: 188.167.145.–
Atheo+4
Stálý člen
25. 8. 2012   #7
-
0
-

#5 vitamin
pokud neumíš číst říká že umí C to znamená že když ví jak se to dělá v C nemá problém to převést do Cpp

Nahlásit jako SPAM
IP: 188.175.140.–
ingiraxo+15
Grafoman
25. 8. 2012   #8
-
0
-

 Nebo přes vektor a nemusí se starat kolik bude slov...

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

int main()
{
	vector<string> letters;

	cout << "Zadejte libovolna slova do pole (ukoncite slovem END)." << endl;

	while (true)
	{
		string word;

		cout << "Slovo: ";
		getline(cin, word);

		if (word.compare("END"))
		{
			letters.push_back(word);
		}
		else break;
	}

	cout << "Pocet nactenych slov: " << letters.size() << endl;

	vector<string>::const_iterator it = letters.begin();
	for (; it != letters.end(); it++)
	{
		cout << *it << endl;
	}
	cin.get();
	return 0;
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Atheo+4
Stálý člen
25. 8. 2012   #9
-
0
-

#6 Oplis
těžko pač tam nemáš proměnnou++ takže by to bylo k ho*nu

Nahlásit jako SPAM
IP: 188.175.140.–
Tom
~ Anonymní uživatel
419 příspěvků
25. 8. 2012   #10
-
0
-

#9 Atheo
to byl zrejme priklad nekonecne smycky....

Nahlásit jako SPAM
IP: 88.83.187.–
Atheo+4
Stálý člen
25. 8. 2012   #11
-
0
-

#10 Tom
u dont say :)

Nahlásit jako SPAM
IP: 188.175.140.–
ingiraxo+15
Grafoman
25. 8. 2012   #12
-
0
-

nebo mě napadla ještě jedna možnost, trochu více C++ like a jak bych to asi řašil já :)

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

int main()
{
	vector<string> words;
	string word;

	while (word.compare("end"))
	{
		getline(cin, word);
		words.push_back(word);
		transform(word.begin(), word.end(),word.begin(), tolower);
	}
	for_each(words.begin(), words.end() - 1, [&] (string word) {
		cout << word << endl;
	});
	cin.get();
	return 0;
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
vitamin+8
Grafoman
25. 8. 2012   #13
-
0
-

#12 ingiraxo
Vypísanie slov by sa dalo aj takto:

	letters.pop_back();	//alebo letters.back().clear();
	
	for(auto &i : letters )cout << i << endl;	//a netreba vytvárať lambda funkcie :)

Ja by som radšej použil list lebo náhodný prístup nie je potrebný a kontajneru sa bude meniť veľkosť.

Ďalej by som použil   cin >> word;   miesto     getline(cin, word);    zabráni to tomu aby uživateľ zadal vetu miesto slova.

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. "
ondra.holub+1
Stálý člen
25. 8. 2012   #14
-
0
-

#13 vitamin
Souhlas s vitaminem. Plus ještě další připomínky:

  • poslední slovo END se zbytečně strká do kontejneru, což pak vede k nehezké věci, kdy horní mez vypisovaných hodnot je end() - 1 (tady je to OK, protože v kontejneru bude vždy aspoň jeden prvek, ale čitelnost programu se tím rozhodně nezlepší)
  • připadá mi poněkud zbytečné zadané slovo nejdříve převádět na lowercase a pak ho porovnávat s "end". Není jednodušší to rovnou porovnat s "END"?
  • endl ve výpisu bych zaměnil za " ", protože v zadání bylo, že se slova mají vypsat oddělená mezerou
#include <iostream>
#include <string>
#include <list>

using namespace std;

int main()
{
    list<string> words;
    string word;

    for (;;)
    {
        cin >> word;
        if (word == "END")
            break;

        words.push_back(word);
    }

    // A nejak to vypisu
    for (list<string>::const_iterator i = words.begin(); i != words.end(); ++i)
        cout << *i << ' ';
    cout << '\n';
}
Nahlásit jako SPAM
IP: 212.96.189.–
ingiraxo+15
Grafoman
25. 8. 2012   #15
-
0
-

#14 ondra.holub
1) ten "END" cpu do vektoru abych tam nemusel mít další podmínku, když je tam podmínka ve while, a mít na koncí -1 je imho detail

2) nevim proč ti to přijde zbytečný... takto můžu zadat jak END tak i end a ukončí se cyklus pro načítání... ten převod na lower musí být logicky jako poslední

3) jak měl být výpis jsem nečet a tohle je detail už :)

jinak ten getline místo cin jsem použil právě kvůli tomu, aby tam nemuseli být jen slova, ale i věty nebo dvoj-slova oddělený mezerou

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
vitamin+8
Grafoman
25. 8. 2012   #16
-
0
-

#14 ondra.holub
Keď už jeden string na konci listu-vektoru pre teba zbytočný, čo je potom toto: 

cin >> word;
if (word == "END")break;
words.push_back(word);		//každý string sa musí prekopírovať

//miesto toho:

words.push_back(const string());
cin >> words.back();		//string sa rovno vloží do containeru
if (words.back() == "END")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. "
ondra.holub+1
Stálý člen
25. 8. 2012   #17
-
0
-

#15 ingiraxo
Jo, 1 a 3 je detail. Ale 2 detail není. Je to změna zadání. Může to být přidaná hodnota, ale stejně tak může být chyba, že když zadám end, tak program skončí. A přitom jsem nezadal ukončovač uvedený v zadání.

Nahlásit jako SPAM
IP: 212.96.189.–
ondra.holub+1
Stálý člen
25. 8. 2012   #18
-
0
-

#16 vitamin
Ano, obecně bude vložení prázdného stringu efektivnější. I když v praxi má std::string v sobě obvykle reference counting, takže se kopíruje, až když dojde ke změně, takže bych se toho nebál. Ale obecně u jiných tříd to může být lepší. Stejně tu řešíme detaily.

V tom komentáři mně šlo spíš o čitelnost. Pokud vidím, že se někde zadávají meze of begin() do end() - 1, tak je to potenciální problém, protože pokud pak změním to, co je před tímto výpisem tak, že můžu dostat prázdný kontejner, tak se dostanu do problémů. Takže by tam měl být pak v reálném kódu nějaký assert, který popisuje předpoklady. Tady, kde jde o malý příklad, je to jedno.

Nahlásit jako SPAM
IP: 212.96.189.–
ingiraxo+15
Grafoman
25. 8. 2012   #19
-
+1
-
Zajímavé

#17 ondra.holub
teď nějak nechápu co řešíš... já neberu zadání přímo doslova, tak jak to melo být tu už bylo napsáno, teď spíš jsem řešil, aby to bylo více logický a fungovalo jak pro velké, tak malé "END", proto jsem tam přidal, tam jeden řádek do loweru.. ale to je jedno :)

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

Díky vám všem za váš čas a rady, specielně díky patří vitaminovi, nakopl jsi mě ;) už vše běží, jak má :)

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

Podobná vlákna

Znaky v podmínce — založil billtimm

Chyba v podmínce — založil Tomas

Moderátoři diskuze

 

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