[zap] 19.1., 14:00

Odeslat odpověď

Smajlíci
:D :) :( :o :shock: :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen:

BBCode je zapnutý
[img] je zapnutý
[flash] je vypnutý
[url] je zapnuté
Smajlíci jsou zapnutí

Přehled tématu
   

Rozšířit náhled Přehled tématu: [zap] 19.1., 14:00

dalsie riesenie

od joseph-blue-pulasky » 11. 2. 2006 02:58

/*
Toto je moje riesenie, zobral to hned na prvy krat.. myslim ze ten kod je celkom zrozumitelny
*/

Kód: Vybrat vše

#include <string>
#include <iostream>
#include <sstream>
#include <stdlib.h>

using namespace std;


typedef string::iterator strIter;


class Vyraz{
private:
	string strVyr;
	
	bool  checkVyraz();
	bool  dosadPremenne( int * n );

public:
	Vyraz( char * s );
	int vyhodnot( int * n );

	int cntSimpleExp( strIter & begin, strIter & end );

	string GetVyraz();
};


Vyraz::Vyraz( char * s )
{
	//odstran medzery
	string tmpVyraz( s );
	stringstream	novy;
	novy << tmpVyraz;
	string _tmpVb;
	while( novy >> _tmpVb )
		strVyr += _tmpVb;
	//----------------odstran medzery
	strVyr = "(" + strVyr + ")";
}

bool
Vyraz::checkVyraz()
{
	int zat=0;
	bool ok = true;

	bool dolar, oper, minus;
	dolar = oper = minus = false;

	for( string::iterator i = strVyr.begin(); i != strVyr.end(); i++ )
	{
		if( *i == '(' )
			zat++;
		if( *i == ')' )
			zat--;
		
		if( *i == '$' ){
			if( dolar )
				return false;
			dolar = true;
			oper = false;
		} else

		if( *i == '-' ){
			minus = true;
			dolar = false;
			oper  = false;
		} else

		if( (*i == '+') || (*i == '*') || (*i == '/') )
		{
			if( oper )
				return false;
			oper = true;
			dolar = false;
		} else {
			oper = false;
		}



	}



	if( zat )
			return false;
		
		return true;
}

string
Vyraz::GetVyraz()
{
	return strVyr;
}

int
Vyraz::vyhodnot( int * n )
{
	int	zacZatPos,konZatPos;
	int vyslPodVyr;
	strIter beg,end;
	char	cVyslPodVyr[1024];

	if( !checkVyraz() ){
		cerr << "Zle zadany vyraz" << endl;
		return 0;
	}

	dosadPremenne( n );

	while( ( zacZatPos = strVyr.find_last_of('(') ) != string::npos )
	{
		konZatPos = strVyr.find_first_of(')',zacZatPos);
		beg = &strVyr[zacZatPos+1];
		end	= &strVyr[konZatPos];
		vyslPodVyr = cntSimpleExp(beg,end);

		itoa( vyslPodVyr, cVyslPodVyr, 10 );

		strVyr.replace( zacZatPos, (konZatPos - zacZatPos) + 1, cVyslPodVyr );
	}

	return vyslPodVyr;
}

bool
Vyraz::dosadPremenne( int * n )
{
	int dolarPos, dolarVal;
	char dolarCharVal;
	string dolarRealVal;
	char		dRV[1024];


	while( (dolarPos = strVyr.find_first_of('$')) != string::npos )
	{
			dolarCharVal = strVyr[dolarPos+1];
			dolarVal = atoi( &dolarCharVal );
			itoa( n[dolarVal], dRV, 10 );
			dolarRealVal.assign( dRV );

			strVyr.replace( dolarPos, 2, dolarRealVal );

	}

	return true;
}


int 
Vyraz::cntSimpleExp( strIter & begin, strIter & end )
{
	string partStr;
	bool unarneMin = true;
	int	 unarneMinStart = 0;
	for( strIter i = begin; i != end; i++ )
	{
		partStr += *i;
	}

	size_t opPos;
	if( (opPos = partStr.find_first_of('+')) != string::npos )
	{
		//cout << opPos << endl;
		strIter l = &partStr[opPos];
		return ( cntSimpleExp( partStr.begin(), l ) + cntSimpleExp( l+1, partStr.end() ) );
	}

  while( unarneMin )
	{
		if( (opPos = partStr.find_first_of('-', unarneMinStart)) != string::npos )
		{
			//cout << opPos << endl;

			//tu poriesit unarne minus
			if( (opPos == 0) || ( partStr[opPos - 1] == '+' ) || ( partStr[opPos - 1] == '*' ) || ( partStr[opPos - 1] == '/' ) )
			{
				unarneMinStart++;
			} else {
				strIter l = &partStr[opPos];
				return ( cntSimpleExp( partStr.begin(), l ) - cntSimpleExp( l+1, partStr.end() ) );
			}
		} else {
			unarneMin = false;
		}
	}


	if( (opPos = partStr.find_first_of('*')) != string::npos )
	{
		//cout << opPos << endl;
		strIter l = &partStr[opPos];
		return ( cntSimpleExp( partStr.begin(), l ) * cntSimpleExp( l+1, partStr.end() ) );
	}
	if( (opPos = partStr.find_first_of('/')) != string::npos )
	{
		//cout << opPos << endl;
		strIter l = &partStr[opPos];
		int lava = cntSimpleExp( partStr.begin(), l );
		int prava = cntSimpleExp( l+1, partStr.end() );
		if( prava != 0 )
			return lava/prava;
		else
			cerr << "Delenie nulou!!!" << endl;
		return 0;
	}



	stringstream ret;
	ret << partStr;

	int intRet;
	ret >> intRet;
	return intRet;

	//return 0;
}

int main(int argc, char ** argv){
//	Vyraz x( "1		+   1   *   (   2    -    -     $2   + $0)" );
	Vyraz x( "4" );
	cout << x.GetVyraz() << endl;

	int pole[9];

	pole[0] = 54321;
	pole[2] = 12345;

	x.vyhodnot( pole );
	cout << x.GetVyraz() << endl;

	
}

od tutchek » 20. 1. 2006 14:24

Anonymous píše:Jo toho tucnaka muzes brat osobne, i kdyz puvodne tak myslenej nebyl :)
(zaleze na tobe)

Jo a jinak bych rad pozadal admina, zda by mohl prispevky toho tytu smazet, prototoze bych nerad degradoval kolikrat velmi uzitecnou debatu o studiu na zasilani takto debilnich pripominek :)
zadat muzes.. ale proste je sem neposilej

od Návštěvník » 20. 1. 2006 12:36

Jo toho tucnaka muzes brat osobne, i kdyz puvodne tak myslenej nebyl :)
(zaleze na tobe)

Jo a jinak bych rad pozadal admina, zda by mohl prispevky toho tytu smazet, prototoze bych nerad degradoval kolikrat velmi uzitecnou debatu o studiu na zasilani takto debilnich pripominek :)

od Almer » 19. 1. 2006 19:19

tutchek píše:
Anonymous píše:Jasne, a kam dal ten tucnak zdrojak, nejak ho nemuzu najit? :(
A toho tučňáka si mám brát osobně? :evil:
:twisted: :twisted: Ja to sice nerekl..ale solidni hlod:)))

od tutchek » 19. 1. 2006 18:33

Anonymous píše:Jasne, a kam dal ten tucnak zdrojak, nejak ho nemuzu najit? :(
A toho tučňáka si mám brát osobně? :evil:

od twoflower » 19. 1. 2006 18:07

Anonymous píše:Jasne, a kam dal ten tucnak zdrojak, nejak ho nemuzu najit? :(
Prihlas se.

Po hodine mi pripadalo ze uz to skoro mam a zbyvaly doresit detaily, ale pak ten cas zacal ubihat nejak rychleji a na konci jsem mel hruzu z toho, ze tam objevim nejakou vaznejsi chybu, kterou bych samozrejme opravit nestihnul. Ale konec dobry, vsechno dobre 8)

od Návštěvník » 19. 1. 2006 17:46

Jasne, a kam dal ten tucnak zdrojak, nejak ho nemuzu najit? :(

od Lada » 19. 1. 2006 17:22

hmm, tak ja budu asi tak jedinej co to neda (teda jeste asi 3 lidi jsou vevnitr, ale nevypada to ze by nevedeli kudy kam)
nejak mi proste dneska stavkoval mozek... :roll:

od snail » 19. 1. 2006 17:10

Ja jsem si rikal, kdo byl ten blazen co odesel po pul hodce :shock:
Ja jsem se s tim mordoval skoro 3 hodky, ale nakonec jsem to dal :D
Kdyz jsem odchazel tak tam bylo asi jeste 5 lidi, ti co odesli to snad vsichni dali.

[zap] 19.1., 14:00

od gASK » 19. 1. 2006 15:02

Zdravím.

Tak to mám úspěšně za sebou a to v čase přímo rekordním :twisted:

Zadání:

Máte třídu

Kód: Vybrat vše

class Vyraz{
public:
Vyraz(char * s);
int vypocitej(int * n);
}
kde konstruktor dostane jako parametr výraz v infixové notaci s povolenými operacemi +,-,*,/ a unární -. Dále tam můžou být závorky a čísla (pouze celá) a proměnné a to ve tvaru $N, kde N je číslice 0,1,..,9. Můžete si ji dopnit o pomocné funkce či datové struktury.

Funkce vypocitej(int * n) dostane jako parametr pole integerů, kde n = $i a má vrátit výsledek výrazu.

Jinak požadavek co do kvality zpracování či užitých struktur veškerý žádný, mělo to poznat neplatný výraz a hodit chybu. Čas dvě a půl hodiny jako vždy. Úspěšnost musí doplnit někdo, kdo tam byl dýl. Já jsem odešel po půl hodině, jediný, co můj program nezvládal, bylo dělení nulou :twisted:
Přílohy
prazdrojak.cpp
Můj zdroják. Není to moc hezký, ale funguje to.
(2.89 KiB) Staženo 315 x

Nahoru