[zap] 19.1., 14:00

gASK
Admin(ka) level I
Příspěvky: 635
Registrován: 9. 6. 2005 12:33
Typ studia: Informatika Mgr.
Bydliště: Konečně Vinohrady:)
Kontaktovat uživatele:

[zap] 19.1., 14:00

Příspěvek od gASK »

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 308 x
Uživatelský avatar
snail
Matfyz(ák|ačka) level III
Příspěvky: 144
Registrován: 23. 5. 2005 22:31
Typ studia: Informatika Mgr.
Kontaktovat uživatele:

Příspěvek od snail »

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.
Uživatelský avatar
Lada
Donátor
Donátor
Příspěvky: 165
Registrován: 9. 1. 2005 10:17
Typ studia: Informatika Bc.
Bydliště: Slaný / zácpa na Evropské

Příspěvek od Lada »

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:
Hail to you, champion:o)
Návštěvník

Příspěvek od Návštěvník »

Jasne, a kam dal ten tucnak zdrojak, nejak ho nemuzu najit? :(
Uživatelský avatar
twoflower
Supermatfyz(ák|ačka)
Příspěvky: 445
Registrován: 22. 9. 2004 21:07
Typ studia: Informatika Ph.D.
Kontaktovat uživatele:

Příspěvek od twoflower »

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)
Uživatelský avatar
tutchek
Site Admin
Příspěvky: 795
Registrován: 21. 9. 2004 00:40
Typ studia: Informatika Mgr.
Bydliště: Praha, Bohnice
Kontaktovat uživatele:

Příspěvek od tutchek »

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:
exAdmin. Magistr přes umělou inteligenci. Právník přes daně.
Uživatelský avatar
Almer
Site Admin
Příspěvky: 686
Registrován: 12. 10. 2004 10:58
Typ studia: Informatika Ph.D.
Bydliště: Mala Strana - 203
Kontaktovat uživatele:

Příspěvek od Almer »

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:)))
Zakládající člen klubu Ortodoxních Matfyzáků :-D

Jsem LAMER ale neumim se ani podepsat ]:-)
Návštěvník

Příspěvek od Návštěvník »

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 :)
Uživatelský avatar
tutchek
Site Admin
Příspěvky: 795
Registrován: 21. 9. 2004 00:40
Typ studia: Informatika Mgr.
Bydliště: Praha, Bohnice
Kontaktovat uživatele:

Příspěvek od tutchek »

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
exAdmin. Magistr přes umělou inteligenci. Právník přes daně.
joseph-blue-pulasky
Matfyz(ák|ačka) level I
Příspěvky: 6
Registrován: 30. 1. 2006 22:43

dalsie riesenie

Příspěvek od joseph-blue-pulasky »

/*
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;

	
}
Odpovědět

Zpět na „2005“