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

C++ POLE – C / C++ – Fórum – Programujte.comC++ POLE – C / C++ – Fórum – Programujte.com

 

Nom
~ Anonymní uživatel
1 příspěvek
29. 4. 2012   #1
-
0
-

Zdravím Vás.
Potreboval by som pomoc s programom, ktorý som dostal ako zadanie v škole. Mám ho viac-menej hotový, ale mám tam jeden problém s polom. Keď som v ňom použil príkaz char, tak program funguje, ale nie celkom tak ako by mal, pri použití string, mi celý program padne. Na tomto odkaze http://www.ulozisko.sk/513546/Prog.rar sa program aj s podrobnejším vysvetlením nachádza. 
Ďakujem za pomoc.

Nahlásit jako SPAM
IP: 195.91.111.–
KIIV
~ Moderátor
+43
God of flame
29. 4. 2012   #2
-
0
-

minimalne michas  iostream se stdio.h (pro jistotu jedes na implicitni deklarace funkce getchar())

pak si nepochopil princip indexu u c/c++ ... indexuje se od 0 !!!!!!!!!!!!!!!!!!!!!!!!  string je objekt takze kdyz se pokusis o pristup na nesmyslny adrese, tak to prirozene spadne...

u retezcu char * to vubec nevadi.. ty si klidne prepisujou pamet kolem dokola az kam jim to dovoli system

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Doomista+1
Stálý člen
30. 4. 2012   #3
-
0
-

Bez urážky, ale on nefunguje ani ten program  s charem, hlavně proto, že tam nemažeš prázdný znaky po čtení cinovýho inputu, holt takový c++ sračičky který mi na něm trochu vadí. Jak zmínil KIIV nepochopils filozofii pole - počítá se od nuly, navíc si fakt nejsem jistej, zda jde v c++ vůbec 2D pole charových řetězců, spíš si myslím, žes udělal pole čtyř charů o délce 3, jestli mě neklame paměť. Chtělo by to pole struktur, navíc nejde porovnávat charový řetězec v ifu, alespoň mě to bez zkopnutí do stringu nikdy nefachalo.

Tento kód mi fungoval, ale nevím, zda jste se učili věci, co jsem tam použil, kdybys potřeboval něco vysvětlit, napiš

#include <iostream>

using namespace std;

#define MAX_DRUZ 2
#define MAX_VOJ 2

typedef struct Druzstvo{
char jmeno[MAX_VOJ][20];
} DRUZSTVO;

Druzstvo druzstvo[MAX_DRUZ];

string jm, jm2;

int main(){
for(int a=0; a<MAX_DRUZ; a++)
  for(int b=0; b<MAX_VOJ; b++){
  cout << "Vloz " << b+1 << " vojaka z " << a+1 << " druzstva: ";
  cin.getline(druzstvo[a].jmeno[b], 20);
  }

cout << "\n1. druzstvo\t2. druzstvo\n"; //edit podle poctu
for(int a=0; a<MAX_VOJ; a++){
  for(int b=0; b<MAX_DRUZ; b++)
  cout << druzstvo[b].jmeno[a] << "\t";
cout << endl;
}
cout << "Napis jmeno hledaneho vojaka: ";
cin >> jm;
cin.get();
bool found=false;
for(int a=0; a<MAX_DRUZ; a++)
  for(int b=0; b<MAX_VOJ; b++){
  jm2=druzstvo[a].jmeno[b];
   if(jm==jm2){
   cout << "Hledany vojak je v " << b+1 << ". v " << a+1 << ". druzstvu";
   found=true;
   }

}
if(!found)
cout << "Bud jste zadali spatne jmeno nebo se vojak nenachazi v zadnem druzstvu";
cin.get();
return 0;
}



Nahlásit jako SPAM
IP: 195.113.191.–
Na vše stačí iostream...
ingiraxo+15
Grafoman
30. 4. 2012   #4
-
0
-

Takže jestli jsem dobře pochopil, máš udělat matici 4x4 a jako prvky mají být "Vojak XY", kde to XY bude náhodný číslo od 1-99 a po naplnění matice zkoušet zadat "Vojak XY" a zkoušet ho vyhledat v matici a když tam bude, vypsat jeho pozici ?

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Doomista+1
Stálý člen
30. 4. 2012   #5
-
0
-

#4 ingiraxo
nemusí to být číslo. obecně znak, jinak by nemusel používat char, ale stačil by int a situace by byla mnohonásobně jednodušší

Nahlásit jako SPAM
IP: 195.113.191.–
Na vše stačí iostream...
ingiraxo+15
Grafoman
30. 4. 2012   #6
-
0
-

#5 Doomista
kdyby si četl pořádně tak jsem napsal "Vojak XY" v uvozovkách, čili konstanta + náhodný číslo

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
ingiraxo+15
Grafoman
30. 4. 2012   #7
-
0
-

Takto nějak?

#include <iostream>
#include <ctime>

#define SIRKA 4
#define VYSKA 3

using namespace std;

// slouzi jako parametr funkci
struct Army { char* vojaci[SIRKA][VYSKA]; };

// uchovava pozici [x,y]
struct Point
{
	int x, y;
	Point() : x(0), y(0) { }
	Point(int x, int y) : x(x), y(y) { }
};

// vytvori armadu vojaku [4x3], kde jim prideli nahodne cislo 1-99
void createArmy(Army& army)
{
	for (int x = 0; x < SIRKA; x++)
	{
		for (int y = 0; y < VYSKA; y++)
		{
			*(*(army.vojaci + x) + y) = new char[8];
			char jmeno[8] = "Vojak";
			char num[2];
			itoa(1 + rand() % 99, num, 10);
			strcat(jmeno, num);
			strcpy(*(*(army.vojaci + x) + y), jmeno);
		}
	}
}

// dealokuje vojaky (jejich jmena)
void destroyArmy(Army& army)
{
	for (int x = 0; x < SIRKA; x++)
	{
		for (int y = 0; y < VYSKA; y++)
		{
			delete[] *(*(army.vojaci + x) + y);
		}
	}
}

// vypise armadu vojaku (matici)
void printArmy(const Army army)
{
	for (int x = 0; x < SIRKA; x++)
	{
		for (int y = 0; y < VYSKA; y++)
		{
			cout << *(*(army.vojaci + x) + y) << "\t\t";
		}
		cout << endl;
	}
}

// hleda vojaka a vraci jeho pozici, pokud tam existuje
bool findSoldier(const Army army, const char* soldier, Point& point)
{
	for (int x = 0; x < SIRKA; x++)
	{
		for (int y = 0; y < VYSKA; y++)
		{
			if (!strcmp(*(*(army.vojaci + x) + y), soldier))
			{
				point = Point(x, y);
				return true;
			}
		}
	}
	return false;
}

int main()
{
	srand((unsigned int)time(0));
	Army army;

	createArmy(army); // alokuje vojaky
	printArmy(army); // vypise vojaky

	char* find = "Vojak52"; // hledany vojak
	Point point; // pozice, na ktere se nachazi hledany vojak

	// vypise hledaneho vojaka
	if (findSoldier(army, find, point))
	{
		cout << find << " = [" << point.x << "," << point.y << "]";
	}
	else cout << find << " nebyl nalezen";

	destroyArmy(army); // dealokuje vojaky

	cin.get();
	return 0;
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Doomista+1
Stálý člen
30. 4. 2012   #8
-
0
-

Testoval si to? Mě ten program neudělal nic, akorát slušně zamrznul. Navíc by mě zajímala jedna věc. Když uděláš pole charů třeba char pole[2][20]; znamená to, že jsem udělal pole dvou řetězců o maximální délce 20 nebo že jsem udělal 2 řádky po dvaceti neomezeně dlouhých řetězcích?

Nahlásit jako SPAM
IP: 195.113.191.–
Na vše stačí iostream...
ingiraxo+15
Grafoman
30. 4. 2012   #9
-
0
-

#8 Doomista
mě to jede bez problému teda... jinak char[2][20]; je POLE o 2 slovech a 19+1 znacích

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Doomista+1
Stálý člen
30. 4. 2012   #10
-
0
-

#9 ingiraxo
potom bys ale vzhledem k zadání měl alokovat pole struktur, viz můj kód

Nahlásit jako SPAM
IP: 195.113.191.–
Na vše stačí iostream...
ingiraxo+15
Grafoman
30. 4. 2012   #11
-
0
-

#10 Doomista
a proč bych to měl dělat a žrát tak paměť když to jde bez alokace? nikde v zadání neni, že je podmínka použít struktůru a hlavně se jedná o matici, nikoli pole a už vůbec ne cokoli lineárního

resp. jediný co alokuju je jméno, který je tak trochu nezbytný (je dynamický)

mám tam vše co je potřeba, pokud se tam voják nachází, tak vrací jeho pozici [x,y], kde Y je právě družstvo a X je jeho pozice v něm (1 až 3) ;)

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Doomista+1
Stálý člen
30. 4. 2012   #12
-
0
-

#11 ingiraxo
jo sorry, s maticema jsem nikdy nedělal, takže mi to nedošlo, zkusil jsem rekompilnout program a už funguje

Nahlásit jako SPAM
IP: 195.113.191.–
Na vše stačí iostream...
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, 11 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ý