Quantcast

C++ problem :)

bega

Početnik
Poruka
6
imam jedan problem s jednim programom,nikako da ga riješim,radi se o programu koji treba da ispituje tačnost zagrada ... primjer:

kad upišemo ovo {2+[2(3-1)]-2} da ispiše ispravno a
kad upišemo ovo {2+[2(3-1)]-2 da ispiše neispravno jer fali jedna zagrada , a to bi morao uraditi preko funkcija ,,, hvala!!!!
 

opi

Primećen član
Poruka
642
malo konkretnije: da li se ovo cita iz konzole, iz fajla , ....?
treba ovo da prebacis u string i da napravis funkciju koja ispituje char po char i registruje pojavljivanje zagrada.............
 

bega

Početnik
Poruka
6
trebali bi da upisemo neke brojeve na kojima se vrše bilo koje matematicke operacije ali da se oni nalaze u zagradama,i onda da na kraju ispise ako je redoslijed zagrada { , [ , ( , ) , ] , } da je ispravno , a ako se slucajno nalazi velika zagrada u maloj ili velika u srednjoj , il mozda fali neka zagrada da ispise na je ne ispravno ...
 

juznivetar

Ističe se
Poruka
2.045
Dakle provjeravas svaki znak (character) i ako naleti na otvorenu zagradu, da neki bool postane TRUE, i kada naidje na zatvorenu tu istu zagradu bool postaje FALSE, na kraju ako je taj bool TRUE, hvali zagrada.
Ovo je dakle primjer sa jednom zagradom, a ti samo povecaj broj bool-ova kako bi mogao do najsitnijeg detalja da pronadjes gresku
 

RiSK

Primećen član
Poruka
681
Bas me je opustilo ovo... Nisam ga bas testirao ali valjda radi.
snaci ces se vec...

Happy hackin'

Kod:
/*

::Algoritam::

Proveravacemo ispravnost izraza znak po znak.

Usvojimo redosled zagrada tako da je najvece tezine
viticasta {,} druga po redu srednja [,] i treca
obicna zagrada (,).

=========================================================

Gresku u izrazu smo otkrili ako:

--1-- pronadjemo zagradu vece tezine od tezine
zadnje otvorene zagrade. Sta hocu da kazem:

Ako imamo do sada ovaj redosled: { [ ] ( ) (
Zadnja otvorena zagrada je (. Ako je sledeca otorena
zagrada vece tezine, znaci [, {, ] ili } imamo gresku u izrazu.


--2-- pronadjemo zatvorenu zagradu koja predhodno
nije otvorena

--3-- dodjemo do kraja izraza pri cemu neka od zagrada 
nije zatvorena

==========================================================

Koristimo tri promenljive tipa int, svaku za po jedan tip
zagrada, na sledeci nacin. Na pocetku ispitivanja inicijalizujemo
ih na 0. Zatim, ako nadjemo na otvorenu zagradu nekog tipa
povecavamo odgovarajucu promenljivu za 1, a kada naidjemo na 
zatvorenu zagradu tog tipa smanjujemo njenu vrednost za 1.

Greska -3- se detektuje tako sto nakon pregledanog citavog niza
neka od promanjljivih nije 0, t.j. veca je od nule.

Greska -2- se detektuje tako sto odgovarajuca promenjljiva uzima vrednost
manju od 0 (t.j. -1)

Greska -1- se detektuje tako sto pri povecavanju vrednosti odgovarajucoj
promenjljivoj, promenljive koje kontrolisu zagrade vece tezine nisu 0
(vec su vece od 0).

==========================================================

Valjda si razumeo :)


*/

#include "iostream.h"
using namespace std;


int proveriIzraz(char* izr){
//vraca 0 ako je izraz ispravan, u suprotnom vraca poziciju na kojoj je prva greska
	int
 	zag1 = 0, //{}
	zag2 = 0, //[]
	zag3 = 0, //()
	pozicija = 1;

	char* current = izr;

	while ( (*current) != 0 )	{

		switch ( *current ) {

		case '{' :
		if ( (zag2 != 0) || (zag3 != 0) ) {
				cout << "Greska na poziciji " <<pozicija <<": nedozvoljena zagrada {\n" ;
		return pozicija;}
		zag1++;
		break;

		case '}' :
		if ( (zag2 != 0) || (zag3 != 0) ) {
			cout << "Greska na poziciji " <<pozicija <<" : nedozvoljena zagrada }\n" ;
			return pozicija;
		}
		zag1--;
		if ( zag1<0 ) {
			cout << "Greska na poziciji " <<pozicija <<" : ne postoji odgovarajuca otvorena zagrada za }.\n";
			return pozicija;
		};
		break;

	
		case '[' :
		if ( zag3 != 0) {
			cout << "Greska na poziciji " <<pozicija <<": nedozvoljena zagrada [\n" ;
			return pozicija;}
		zag2++;
		break;

		case ']' :
		if ( zag3 != 0) {
			cout << "Greska na poziciji " <<pozicija <<" : nedozvoljena zagrada ]\n" ;
			return pozicija;
		}
		zag2--;
		if ( zag2<0 ) {
			cout << "Greska na poziciji " <<pozicija <<" : ne postoji odgovarajuca otvorena zagrada za ].\n";
			return pozicija;
		}
		break;

		case '(' :		
		zag3++;
		break;

		case ')' :		
		zag3--;
		if ( zag3<0 ) {
			cout << "Greska na poziciji " <<pozicija <<" : ne postoji odgovarajuca otvorena zagrada za ).\n";
			return pozicija;
		}
		break;

		} //switch

		pozicija++;
		current++;

	} //while

	if ( (zag1+zag2+zag3) != 0 ) {
		cout << "Nisu sve zagrade zatvorene!\n" ;
		return pozicija+1;
	}

return 0;}


int main(int paramCnt, char** paramStr){
	
	if ( paramCnt == 1 ) {
		cout << "Koristi sa: " <<paramStr[0] <<" izraz1 [ izraz2 [ izraz3 [...] ] ] \n" ;
		return 1;
	}

	int i;
	for (i=1; i<paramCnt; i++) {
		cout << "\nProveravam izraz '" <<paramStr[i] <<"' :\n" ;
		if ( proveriIzraz(paramStr[i]) == 0 ) cout << "Izaraz je ispravan. \n";
	}

return 0;}
 

bega

Početnik
Poruka
6
skontao sam to ,ali kad ga kompajliram nece da ga pokrene,ali otvorim ga preko command prompt i pishe mi " Koristi sa : C:\c++\sem.exe izraz1 [ izraz2 [ izraz3 [...] ] ]" a ovoj C:\c++\sem.exeizraz1 folder na C disku je folder gdje kompajler pravi exe fajl od ovog programa ... u cemu je problem ?
 

juznivetar

Ističe se
Poruka
2.045
Evo ti kod, ali samo sa obicnim zagradama '(' i ')', znaci sablonski samo dodas zagrade koje nedostaju, [] i {}, ako hoces naravno.
Dakle program ne provjerava samo da hvali zagrada, nego i dali su pozicije ispravne, tako da nece biti tacno ovo recimo ())(


#include <iostream>
using namespace std;
int main()
{
char text[100];
int oz[100], oz1[100], oz2[100];
int n1 = 0, n2 = 0, n11 = 0, n22 = 0;
bool tacan = true;
// ISPIS ZADATKA
cin.getline(text, 100);
// DODJELJIVANJE VRIJEDNOSTI KOJE ODREDJUJU OTVORENOST-ZATVORENOST ZAGRADA
for(int i = 0; i < 100; i++)
{
oz1 = 1000;
oz2 = 1000;
}
// PROVJERA I PAMCENJE POJAVLJIVANJA ZAGRADE
for(int i = 0; i < 100; i++)
{
if(text == '(')
oz = 1;
else if(text == ')')
oz = 2;
else
oz = 0;
}
// DODJELJIVANJE POZICIJE NA KOJIMA SE POJAVLJUJU ZAGRADE
for(int i = 0; i < 100; i++)
{
if(oz == 1)
{
n1++;
oz1[n11] = i;
n11++;
}
if(oz == 2)
{
n2++;
oz2[n22] = i;
n22++;
}
}
// PROVJERA ISPRAVNOSTI POLOZAJA ZAGRADA
for(int i = 0; i < 100; i++)
{
if(oz1 > oz2)
{
cout << "\nNemoze biti prva ')' zagrada!";
cout << "\nOna se nalazi na poziciji " << oz2 + 1 << ".";
tacan = false;
}
}
// FINALNA PROVJERA DALI JE ILI NIJE TACAN ZADATAK
if(n1 != n2)
tacan = false;
if(tacan == false)
cout << "\nZadatak je NETACAN!";
if(tacan == true)
cout << "\nZadatak je TACAN!";
}
 

RiSK

Primećen član
Poruka
681
@bega: Pokreni ga sa

c:\c++\sem.exe "(a+b)-[c/d+(e+f)*p]"

znaci iz terminala sa: ime_programa izaraz_koji_proveravas

Daj malo detalja - kada ne radi. Je l za bilo koje argumente sa komandne linije pise isto ono?
Koji je kompajler? Mozda je moguce da drugacije prosledjuje crednosti u funkciju main(), mada bi ovo treblao da bude standard.....

Kod mene radi odlicno.... Na ovome: gcc 4.0, GNU bash 3.0, linux 2.6.10.
 

Top