21/11/12 9:17
Poggi Marco
Postato originariamente da tantocibo:
Perdona l'ignoranza, non ho ben capito come potrei formalizzare la tua soluzione, se puoi mi correggeresti il programma secondo il tuo suggerimento? Scusa
Perdona l'ignoranza, non ho ben capito come potrei formalizzare la tua soluzione, se puoi mi correggeresti il programma secondo il tuo suggerimento? Scusa
Le funzioni exp( ) e ln( ) restituiscono un valore di tipo real, e rispettivamente l' esponenziale e i logaritmo dell' argomento ricevuto.
Ora, la variabile temp, è stata dichiarata integer, quindi anche l' espressione di assegnamento deve essere in formato integer. A tale scopo ho utilizzato la funzione trunc (freepascal.org/docs-html/rtl/system/…).
Ultima modifica effettuata da Poggi Marco 21/11/12 9:19
aaa
29/11/12 18:14
Phi
Ma se devi moltiplicare/dividere per una potenza di 2 basta che usi gli shift (ovvero "posti" la scrittura binaria del numero).
Se per esempio vuoi moltiplicare per 2^k sposti la scrittura a sinistra con :
se invece vuoi dividere per 2^k(attento: considererà solo la parte intera) shifti a destra :
Se ad esempio numero=9 e k=2 allora nel primo caso avrai 36, nel secondo caso 2
Se per esempio vuoi moltiplicare per 2^k sposti la scrittura a sinistra con :
numero:=numero shl k; //shl sta per shift-left
se invece vuoi dividere per 2^k(attento: considererà solo la parte intera) shifti a destra :
numero:=numero shr k;//shr -> shift-right
Se ad esempio numero=9 e k=2 allora nel primo caso avrai 36, nel secondo caso 2
Ultima modifica effettuata da Phi 29/11/12 18:17
aaa
06/12/12 15:47
tantocibo
Postato originariamente da tantocibo:
ho provato il metodo di 'nessuno' (XD) con la funzione exp, ma ecco che il compilatore segnala un nuovo errore:
56 / 3 superm~1.pas
Fatal: Syntax error, ; expected but UNTIL found
ho provato il metodo di 'nessuno' (XD) con la funzione exp, ma ecco che il compilatore segnala un nuovo errore:
56 / 3 superm~1.pas
Fatal: Syntax error, ; expected but UNTIL found
program supermercato; uses crt; const p1=0.80; // prezzo unitario di ciascun prodotto p2=3.60; p3=1.80; p4=4.20; p5=0.46; p6=1.20; p7=3.50; p8=3.80; p9=1.25; p10=1.80; p11=1.20; p12=1.15; p13=1.25; p14=8.50; p15=0.80; var sprod:string[4]; nprod:array[1..4] of integer; i,k,nprod2,m,temp:integer; scelta:char; nprod3,qntprod:array[1..1000] of integer; par,tot:real; begin textcolor(white); repeat begin m:=m+1; write('Inserisci codice prodotto: '); readln(sprod); clrscr; write('Inserisci quantita'' prodotto inserito: '); readln(qntprod[m]); clrscr; write('Inserire altri prodotti? S/N: '); readln(scelta); clrscr; for i:=1 to 4 do //trasforma la stringa del prodotto (es '0101') begin //in vettore per distinguere le singole cifre binarie e trasformare case sprod[i] of //il numero prodotto in da binario a decimale (1-15) '1': nprod[i]:=1; '0': nprod[i]:=0; end; k:=4; for i:=1 to 4 do begin temp:=exp(ln(2)*k)*nprod[i]; nprod2:=nprod2+temp; k:=k-1; end; nprod3[m]:=nprod2; end; until (scelta='n') or (scelta='N'); gotoxy(3,1); write('Prodotto'); gotoxy(30,1); write('Quantita'''); gotoxy(45,1); write('Prezzo'); for i:=1 to m do begin case nprod3[i] of 1 : begin par:=qntprod[i]*p1; gotoxy(3,i+1); write('Latte'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 2 : begin par:=qntprod[i]*p2; gotoxy(3,i+1); write('Nutella'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 3 : begin par:=qntprod[i]*p3; gotoxy(3,i+1); write('Gelato'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 4 : begin par:=qntprod[i]*p4; gotoxy(3,i+1); write('Carne'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 5 : begin par:=qntprod[i]*p5; gotoxy(3,i+1); write('Farina'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 6 : begin par:=qntprod[i]*p6; gotoxy(3,i+1); write('Biscotti'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 7 : begin par:=qntprod[i]*p7; gotoxy(3,i+1); write('Torta'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 8 : begin par:=qntprod[i]*p8; gotoxy(3,i+1); write('Pane'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 9 : begin par:=qntprod[i]*p9; gotoxy(3,i+1); write('Panna'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 10 : begin par:=qntprod[i]*p10; gotoxy(3,i+1); write('Fragole'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 11 : begin par:=qntprod[i]*p11; gotoxy(3,i+1); write('Pasta'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 12 : begin par:=qntprod[i]*p12; gotoxy(3,i+1); write('Caramelle'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 13 : begin par:=qntprod[i]*p13; gotoxy(3,i+1); write('Succo'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 14 : begin par:=qntprod[i]*p14; gotoxy(3,i+1); write('Vino'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 15 : begin par:=qntprod[i]*p15; gotoxy(3,i+1); write('The'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; tot:=tot+par; end; write('Totale spesa: ',tot:10:2,' euro'); readkey; end.
program supermercato; uses crt; const p1=0.80; // prezzo unitario di ciascun prodotto p2=3.60; p3=1.80; p4=4.20; p5=0.46; p6=1.20; p7=3.50; p8=3.80; p9=1.25; p10=1.80; p11=1.20; p12=1.15; p13=1.25; p14=8.50; p15=0.80; var sprod:string[4]; nprod:array[1..4] of integer; i,k,nprod2,m,temp:integer; scelta:char; nprod3,qntprod:array[1..1000] of integer; par,tot:real; begin textcolor(white); repeat m:=m+1; write('Inserisci codice prodotto: '); readln(sprod); clrscr; write('Inserisci quantita'' prodotto inserito: '); readln(qntprod[m]); clrscr; write('Inserire altri prodotti? S/N: '); readln(scelta); clrscr; for i:=1 to 4 do //trasforma la stringa del prodotto (es '0101') begin //in vettore per distinguere le singole cifre binarie e trasformare case sprod[i] of //il numero prodotto in da binario a decimale (1-15) '1': nprod[i]:=1; '0': nprod[i]:=0; end; end; k:=4; for i:=1 to 4 do begin temp:=trunc(exp(ln(2)*k))*nprod[i]; nprod2:=nprod2+temp; k:=k-1; end; nprod3[m]:=nprod2; m:=0; nprod2:=0; until (scelta='n') or (scelta='N'); gotoxy(3,1); write('Prodotto'); gotoxy(30,1); write('Quantita'''); gotoxy(45,1); write('Prezzo'); for i:=1 to m do begin case nprod3[i] of 1 : begin par:=qntprod[i]*p1; gotoxy(3,i+1); write('Latte'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 2 : begin par:=qntprod[i]*p2; gotoxy(3,i+1); write('Nutella'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 3 : begin par:=qntprod[i]*p3; gotoxy(3,i+1); write('Gelato'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 4 : begin par:=qntprod[i]*p4; gotoxy(3,i+1); write('Carne'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 5 : begin par:=qntprod[i]*p5; gotoxy(3,i+1); write('Farina'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 6 : begin par:=qntprod[i]*p6; gotoxy(3,i+1); write('Biscotti'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 7 : begin par:=qntprod[i]*p7; gotoxy(3,i+1); write('Torta'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 8 : begin par:=qntprod[i]*p8; gotoxy(3,i+1); write('Pane'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 9 : begin par:=qntprod[i]*p9; gotoxy(3,i+1); write('Panna'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 10 : begin par:=qntprod[i]*p10; gotoxy(3,i+1); write('Fragole'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 11 : begin par:=qntprod[i]*p11; gotoxy(3,i+1); write('Pasta'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 12 : begin par:=qntprod[i]*p12; gotoxy(3,i+1); write('Caramelle'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 13 : begin par:=qntprod[i]*p13; gotoxy(3,i+1); write('Succo'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 14 : begin par:=qntprod[i]*p14; gotoxy(3,i+1); write('Vino'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; 15 : begin par:=qntprod[i]*p15; gotoxy(3,i+1); write('The'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par); end; end; end; tot:=tot+par; writeln; writeln; writeln; write(' Totale spesa: ',tot:10:2,' euro'); readkey; end.
Ho seguito le tue dritte ma temo di aver sbagliato qualcosa nel farlo, oppure logicamente il programma contiene errori, perché non funziona. Sapreste aiutarmi?
aaa
06/12/12 18:03
Poggi Marco
Il programma non funziona perché calcola in modo errato il codice del prodotto.
Le potenze in una qualsiasi base numerica devono partire da 0, mentre tu consideri le potenze da 1 a 4.
Inoltre le variabili m e nprod2, non sono correttamente azzerate.
Posto il programma corretto:
Ps.: perché non usi i file per registrare i dati dei relativi prodotti, e una funzione per stamparli a video?
Le potenze in una qualsiasi base numerica devono partire da 0, mentre tu consideri le potenze da 1 a 4.
Inoltre le variabili m e nprod2, non sono correttamente azzerate.
Posto il programma corretto:
program supermercato; uses crt; const p1=0.80; // prezzo unitario di ciascun prodotto p2=3.60; p3=1.80; p4=4.20; p5=0.46; p6=1.20; p7=3.50; p8=3.80; p9=1.25; p10=1.80; p11=1.20; p12=1.15; p13=1.25; p14=8.50; p15=0.80; var sprod:string[4]; nprod:array[1..4] of integer; i,k,nprod2,m,temp:integer; scelta:char; nprod3,qntprod:array[1..1000] of integer; par,tot:real; begin textcolor(white); m:=0; // azzeramento repeat m:=m+1; write('Inserisci codice prodotto: '); readln(sprod); clrscr; write('Inserisci quantita'' prodotto inserito: '); readln(qntprod[m]); clrscr; write('Inserire altri prodotti? S/N: '); readln(scelta); clrscr; for i:=1 to 4 do //trasforma la stringa del prodotto (es '0101') begin //in vettore per distinguere le singole cifre binarie e trasformare case sprod[i] of //il numero prodotto in da binario a decimale (1-15) '1': nprod[i]:=1; '0': nprod[i]:=0; end; end; k:=3; // la potenza meno significativa, deve essere 0 nprod2:=0; // azzeramento for i:=1 to 4 do begin temp:=trunc(exp(ln(2)*k))*nprod[i]; nprod2:=nprod2+temp; k:=k-1; end; nprod3[m]:=nprod2; nprod2:=0; until (scelta='n') or (scelta='N'); gotoxy(3,1); write('Prodotto'); gotoxy(30,1); write('Quantita'''); gotoxy(45,1); write('Prezzo'); for i:=1 to m do begin case nprod3[i] of 1 : begin par:=qntprod[i]*p1; gotoxy(3,i+1); write('Latte'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par:8:2); end; 2 : begin par:=qntprod[i]*p2; gotoxy(3,i+1); write('Nutella'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par:8:2); end; 3 : begin par:=qntprod[i]*p3; gotoxy(3,i+1); write('Gelato'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par:8:2); end; 4 : begin par:=qntprod[i]*p4; gotoxy(3,i+1); write('Carne'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par:8:2); end; 5 : begin par:=qntprod[i]*p5; gotoxy(3,i+1); write('Farina'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par:8:2); end; 6 : begin par:=qntprod[i]*p6; gotoxy(3,i+1); write('Biscotti'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par:8:2); end; 7 : begin par:=qntprod[i]*p7; gotoxy(3,i+1); write('Torta'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par:8:2); end; 8 : begin par:=qntprod[i]*p8; gotoxy(3,i+1); write('Pane'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par:8:2); end; 9 : begin par:=qntprod[i]*p9; gotoxy(3,i+1); write('Panna'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par:8:2); end; 10 : begin par:=qntprod[i]*p10; gotoxy(3,i+1); write('Fragole'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par:8:2); end; 11 : begin par:=qntprod[i]*p11; gotoxy(3,i+1); write('Pasta'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par:8:2); end; 12 : begin par:=qntprod[i]*p12; gotoxy(3,i+1); write('Caramelle'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par:8:2); end; 13 : begin par:=qntprod[i]*p13; gotoxy(3,i+1); write('Succo'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par:8:2); end; 14 : begin par:=qntprod[i]*p14; gotoxy(3,i+1); write('Vino'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par:8:2); end; 15 : begin par:=qntprod[i]*p15; gotoxy(3,i+1); write('The'); gotoxy(30,i+1); write(qntprod[i]); gotoxy(45,i+1); write(par:8:2); end; end; tot:=tot+par; // somma il totale all' interno del ciclo end; writeln; writeln; writeln; write(' Totale spesa: ',tot:10:2,' euro'); readkey; end.
Ps.: perché non usi i file per registrare i dati dei relativi prodotti, e una funzione per stamparli a video?
Ultima modifica effettuata da Poggi Marco 06/12/12 18:05
aaa
06/12/12 19:39
tantocibo
Ti ringrazio molto marco, lascio perdere il discorso dei file perché devo ancora affrontarlo
aaa