|
|
|
![]() |
|
Strumenti |
![]() |
#61 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Goldorack e Daniele,
occhio che lo facciamo si per divertimento ma, alla fine, chi perde dovrà indossare il sambenito per un mese intero ![]() |
![]() |
![]() |
![]() |
#62 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
|
![]() |
![]() |
![]() |
#63 | |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
Sarebbe un minicompilatore(io so come si costruisce l'albero di parsing ma non ne capisco un tubo di assembly ![]() |
|
![]() |
![]() |
![]() |
#64 | |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Vabbe'.
Io proseguo a postare il primo quesito. Voglio almeno il premio originalita' Ovviamente non metto i tempi perche' in fondo con questa soluzione non ci sono mai arrivato.(E mai ci arrivero'... prima di essere bannato da google) Ho addirittura messo uno sleep, per non sovraccaricare troppo e risultare un brutto Worm. Comunque ecco (Occorre la System.Net) Codice:
class Program { static void Main(string[] args) { string[] strs = File.ReadAllLines(@"C:\temp\espressioni1.txt"); foreach (string clc in strs.Skip(2)) { string res = Eva3.Calc(clc); Thread.Sleep(1000); Console.WriteLine("{0} = {1}", clc, res); } Console.ReadKey(); } } public static class Eva3 { public static string Calc(string inp) { string enc = GoogleEnc(inp); //string enc = System.Web.HttpUtility.UrlEncode(inp); string ret; string req = string.Format("http://www.google.it/search?hl=it&q={0}&meta=",enc); using (WebClient wdc = new WebClient()) { // Cosi' lo frego un pochino in piu' wdc.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"); // GetHttpResponse string str = wdc.DownloadString(req); // Result string sqp = Regex.Match(str, "<h2 class=r>.*</h2>").Value; if (string.IsNullOrEmpty(sqp)) return "Generic Error"; // Detag string topr = Regex.Replace(sqp, "<[^>]+>", ""); // Destra dell'uguale string res = topr.Substring(topr.IndexOf('=') + 1); // Nospazi in risultato ret = res.Replace(" ", ""); // Se c'e' altro rispetto a - . 0-9 allora Error2 if (Regex.Replace(ret, @"[\.\-0-9]+", "").Length != 0) return "Generic Error2"; } return ret; } private static string GoogleEnc(string inp) { StringWriter sw=new StringWriter(); foreach (char ch in inp) { switch (ch) { case '(': sw.Write("%28"); break; case ')': sw.Write("%29"); break; case '+': sw.Write("%2B"); break; case '^': sw.Write("%5E"); break; case ' ': break; default: sw.Write(ch); break; } } return sw.ToString(); } } Quote:
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. Ultima modifica di gugoXX : 27-10-2008 alle 20:10. |
|
![]() |
![]() |
![]() |
#65 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Questi sono i miei tempi per il problema 2:
file piccolo: ![]() file grosso: ![]() Il codice in C può essere scaricato da QUI La mia macchina è questa: Codice:
AMD Athlon(tm) 64 X2 Dual Core Processor 4800+ 2.50 GHz 896 MB di RAM Microsoft Windows XP Professional (32 bit) Service Pack 3 file piccolo ![]() file grosso: ![]() |
![]() |
![]() |
![]() |
#66 |
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
Sbaglio o ci sono delle divisioni per zero?
Per ora i miei tempi sono: ![]() Prima di postare il programma voglio migliorare qualcosina e ridurre l'immenso numero di parentesi nel file di output. ![]() |
![]() |
![]() |
![]() |
#67 |
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
Vincenzo...
il tuo programma mi da il seguente risultato: ((-65.78 * 52.31) / (1 + 66.31) - 5) / (-4.3 + 18.49^(1 / 2)) = 12940612268343702000.000000 Solo che: 18.49^(1 / 2) = 4.3 quindi: (-4.3 + 18.49^(1 / 2)) = (-4.3 + 4.3) = 0 Sbaglio o il programma dovrebbe lamentarsi della divisione per zero? |
![]() |
![]() |
![]() |
#68 | |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
dammi il tempo di controllare e correggere l'errore. Mi dai i tempi dei miei programmi sulla tua macchina? |
|
![]() |
![]() |
![]() |
#69 | |
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
Quote:
(xxx-1 = primo esercizio, xxx-2 = secondo esercizio) ![]() Gli output del primo esercizio sono identici (a parte la precisione dei risultati). Gli output del secondo esercizio invece sono quasi identici, ma il tuo ha un solo errore di divisione per zero, il mio ne ha di più. |
|
![]() |
![]() |
![]() |
#70 | |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
![]() Il messaggio di errore c'è anche se manca il segno di uguale tra l'espressione e il messaggio. Quale compilatore hai utilizzato? (io Visual C++ 2008) Dammi due minuti e posto il link per scaricare i file di output. Ultima modifica di Vincenzo1968 : 27-10-2008 alle 21:43. |
|
![]() |
![]() |
![]() |
#71 | |
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
Quote:
Ora provo con Visual Studio. Edit: Provato con VS e funziona bene. Azzo fa GCC? ![]() In che modo gestisci le divisioni per zero? Ri-Edit: Codice:
if ( dblRight == 0 ) Ultima modifica di ||ElChE||88 : 27-10-2008 alle 21:43. |
|
![]() |
![]() |
![]() |
#72 | |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
Aggiusto il codice in modo da farlo funzionare anche con GCC. Intanto questo è il link per scaricare i file di output del mio programma per il secondo problema. Ultima modifica di Vincenzo1968 : 27-10-2008 alle 21:58. |
|
![]() |
![]() |
![]() |
#73 |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Ok,
ho aggiornato il link al sorgente. Ho messo anche il segno di uguale tra il messaggio di errore e l'espressione. Codice:
if ( dblRight == 0.0 ) { sprintf(szError, "Errore: divisione per zero!"); return 0.0; } else { return dblLeft / dblRight; } ![]() ![]() |
![]() |
![]() |
![]() |
#74 |
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
Veramente mi diverto.
![]() Fatto... e non funziona VS: ((-65.78 * 52.31) / (1 + 66.31) - 5) / (-4.3 + 18.49^(1 / 2)) = Errore: divisione per zero! GCC: ((-65.78 * 52.31) / (1 + 66.31) - 5) / (-4.3 + 18.49^(1 / 2)) = 12940612268343702000.000000 Adesso provo a mettere dei messaggi di debug nel codice per vedere i valori delle variabili... |
![]() |
![]() |
![]() |
#75 |
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
Ma che azzo fa?
![]() Se assegno EvalTree(pTree->left, szError) a dblLeft ed EvalTree(pTree->right, szError) a dblRight per ogni operazione(PLUS,MINUS,MULT,ecc) e poi uso le due variabili, funziona tutto perfettamente. Se invece uso direttamente EvalTree(pTree->left, szError) ed EvalTree(pTree->right, szError) il risultato è sballato. |
![]() |
![]() |
![]() |
#76 | |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
![]() prova a mettere il suffisso L: Codice:
case DIV: dblLeft = EvalTree(pTree->left, szError); dblRight = EvalTree(pTree->right, szError); if ( dblRight == 0.0L ) { sprintf(szError, "Errore: divisione per zero!"); return 0.0; } else { return dblLeft / dblRight; } |
|
![]() |
![]() |
![]() |
#77 |
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
Ultima modifica di ||ElChE||88 : 27-10-2008 alle 22:51. |
![]() |
![]() |
![]() |
#78 | |
Bannato
Iscritto dal: Mar 2008
Città: Villabate(PA)
Messaggi: 2515
|
Quote:
![]() |
|
![]() |
![]() |
![]() |
#79 |
Senior Member
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
|
Propongo di stampare anche, alla fine, la somma di tutti i risultati che non sono infinito (o comunque che non sono valori tipo NaN, etc., nel caso in cui ci fossero)
Cosi' possiamo controllare la correttezza anche quando non si stampa tutto. Il problema e' che ci sono risultati che sono molto grandi, e quelli piccoli, se sbagliati, annegano.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto. E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test. |
![]() |
![]() |
![]() |
#80 |
Senior Member
Iscritto dal: Dec 2003
Messaggi: 4907
|
Ho usato printf per mostrare le operazioni fatte dal programma (espressione 65.78 ~ 52.31 * 1 66.31 + / 5 - 4.3 ~ 18.49 1 2 / ^ + / )
VS: Codice:
UMINUS 65.780000 MULT -65.780000 52.310000 UMINUS 65.780000 PLUS 1.000000 66.310000 DIV -3440.951800 67.310000 MINUS -51.120960 5.000000 UMINUS 65.780000 MULT -65.780000 52.310000 UMINUS 65.780000 PLUS 1.000000 66.310000 DIV -3440.951800 67.310000 DIV 1.000000 2.000000 POW 18.490000 0.500000 DIV 1.000000 2.000000 UMINUS 4.300000 PLUS -4.300000 4.300000 DIV 1.000000 2.000000 POW 18.490000 0.500000 DIV 1.000000 2.000000 UMINUS 4.300000 DIV -56.120960 0.000000 ERROR#DIVBY0! RESULT 0.000000 Codice:
UMINUS 65.780000 MULT -65.780000 52.310000 UMINUS 65.780000 PLUS 1.000000 66.310000 DIV -3440.951800 67.310000 MINUS -51.120960 5.000000 UMINUS 65.780000 MULT -65.780000 52.310000 UMINUS 65.780000 PLUS 1.000000 66.310000 DIV -3440.951800 67.310000 DIV 1.000000 2.000000 POW 18.490000 0.500000 DIV 1.000000 2.000000 UMINUS 4.300000 PLUS -4.300000 4.300000 UMINUS 4.300000 DIV 1.000000 2.000000 POW 18.490000 0.500000 DIV 1.000000 2.000000 DIV -56.120960 -0.000000 RESULT 12940612268343702000.000000 |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 20:49.