Oppure

Loading
20/11/12 20:29
Mi sembra che ti abbia scritto la linea che devi correggere (anche se ha messo j al posto di i) ...

Cosa ti deve dire di più ?
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 :)


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 :
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

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:
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