Newsgroup: it.comp.lang.c++
Titolo: ||||||||Compito di programmazione|||||||||

Messaggio a più sezioni in formato MIME.
------=_NextPart_000_01BC872C.7AB93480
Content-Type: multipart/alternative; boundary="----=_NextPart_001_01BC872C.7AB93480"
Content-Transfer-Encoding: 7bit
------=_NextPart_001_01BC872C.7AB93480
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
Ed ora ecco a voi un problema tratto dal compito di fondamenti di
informatca (ingegneria gestionale) del politecnico di Torino.
Si desidera realizzare un programma che calcoli il costo totale in Lire
Italiane di una serie di prodotti il cui costo e' espresso in varie valute
estere.
Un file ( il cui nome e' specificato come primo parametro sulla linea di
comando) contiene per ogni riga il costo di un prodotto, secondo il
seguente formato:
                        costo         valuta       nome 
ove "costo" e' il costo del prodotto (che puo' contenere una parte
frazionaria), "valuta"
e' l'indice della valuta in cui e' espresso il costo ( ossia valuta n°1,
valuta n°2 ......).
L'indice delle valute fa riferimento al file dei cambi ( il cui nome e'
specificato come secondo parametro sulla linea di comando) che contiene per
ogni riga il valore di una valuta estera espresso in Lire Italiane ( ossia
nella prima riga c'e' il valore della valuta n°1, nella seconda riga il
valore della valuta n°2 e cosi' via). Ovviamente i valori delle varie
valute sono numeri frazionari.
Nel file dei cambi sono presenti al massimo 10 valute mentre non e' noto (
e non e' lecito fare ipotesi al riguardo) il numero di prodotti presenti
nel file dei costi.
Si desidera realizzare un programma che fornisca sull'unita' di output
standard le seguenti informazioni:
il numero di prodotti presenti nel file ( si noti che ogni prodotto e'
presente una sola volta)
il costo totale dei prodotti, espresso in lire italiane 
Ad esempio, supponendo che il programma si chiami lire, il file PRODOTTI 
contenga i seguenti dati :
(vedi file allegato)
ed il file CAMBI contenga i seguenti dati:
(vedi file allegato)
allora eseguendo il programma su questi dati (tramite il comando : lire
PRODOTTI CAMBI)
si dovrebbe generare sull'unita' di output standard il seguente risultato:
Prodotti: 4
Costo totale: 53352016.465
P.S. = spero che qualcuno abbia voglia di risolvere il problema. Insieme a
questo messaggio
c'e' anche il mio programma che nonostante in fase di compilazione e
linking non dia errori, dopo
essere stato lanciato da dei risultati non corretti e PIANTA IL
SISTEMA!!!!!!!
Se qualche ANIMA PIA ha voglia e tempo di dargli un occhiata per vedere
cosa c'e' che non va mi 
FAREBBE UN GROSSO PIACERE!!!!
Spero di non avervi annoiato troppo
ciao 
Davide
------=_NextPart_001_01BC872C.7AB93480
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
<html><head></head><BODY bgcolor=3D"#D8D0C8"><p><font size=3D2 =
color=3D"#000000" face=3D"Arial">Ed ora ecco a voi un problema tratto =
dal compito di fondamenti di informatca (ingegneria gestionale) del =
politecnico di Torino.<br><br>Si desidera realizzare un programma che =
calcoli il costo totale in Lire Italiane di una serie di prodotti il cui =
costo e' espresso in varie valute estere.<br>Un file ( il cui nome e' =
specificato come primo parametro sulla linea di comando) contiene per =
ogni riga il costo di un prodotto, secondo il seguente formato:<br><br> =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&=
nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;costo =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;valuta =
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nome <br><br>ove &quot;costo&quot; =
e' il costo del prodotto (che puo' contenere una parte frazionaria), =
&quot;valuta&quot;<br>e' l'indice della valuta in cui e' espresso il =
costo ( ossia valuta n=B01, valuta n=B02 ......).<br>L'indice delle =
valute fa riferimento al file dei cambi ( il cui nome e' specificato =
come secondo parametro sulla linea di comando) che contiene per ogni =
riga il valore di una valuta estera espresso in Lire Italiane ( ossia =
nella prima riga c'e' il valore della valuta n=B01, nella seconda riga =
il valore della valuta n=B02 e cosi' via). Ovviamente i valori delle =
varie valute sono numeri frazionari.<br>Nel file dei cambi sono presenti =
al massimo 10 valute mentre non e' noto ( e non e' lecito fare ipotesi =
al riguardo) il numero di prodotti presenti nel file dei costi.<br>Si =
desidera realizzare un programma che fornisca sull'unita' di output =
standard le seguenti informazioni:<br><br>il numero di prodotti presenti =
nel file ( si noti che ogni prodotto e' presente una sola =
volta)<br><br>il costo totale dei prodotti, espresso in lire italiane =
<br><br>Ad esempio, supponendo che il programma si chiami lire, il file =
PRODOTTI <br>contenga i seguenti dati :<br><br>(vedi file =
allegato)<br><br>ed il file CAMBI contenga i seguenti dati:<br><br>(vedi =
file allegato)<br><br>allora eseguendo il programma su questi dati =
(tramite il comando : lire PRODOTTI CAMBI)<br>si dovrebbe generare =
sull'unita' di output standard il seguente risultato:<br><br>Prodotti: =
4<br>Costo totale: 53352016.465<br><br>P.S. =3D spero che qualcuno abbia =
voglia di risolvere il problema. Insieme a questo messaggio<br>c'e' =
anche il mio programma che nonostante in fase di compilazione e linking =
non dia errori, dopo<br>essere stato lanciato da dei risultati non =
corretti e PIANTA IL SISTEMA!!!!!!!<br>Se qualche ANIMA PIA ha voglia e =
tempo di dargli un occhiata per vedere cosa c'e' che non va mi =
<br>FAREBBE UN GROSSO PIACERE!!!!<br>Spero di non avervi annoiato =
troppo<br>ciao <br>Davide<br><br><br></p>
</font></body></html>
------=_NextPart_001_01BC872C.7AB93480--
------=_NextPart_000_01BC872C.7AB93480
Content-Type: application/octet-stream; name="Lira.c"
Content-Transfer-Encoding: 7bit
Content-Description: Lira (C File)
Content-Disposition: attachment; filename="Lira.c"
#include <stdio.h>
main(int argc, char *argv[])
{
 FILE
     *prodotti,
     *cambi;
 int valuta,i;
 float costo,cambio, costo_totale=0;
 long totprod=0;
 char nome;
  if (argc!=3)
   {
    fprintf(stderr,"errore mancano dei parametri\n");
    return 1;
   }
  if ((prodotti= fopen(argv[1],"r"))== NULL)
   {
    fprintf(stderr,"errore apertura file %s\n",argv[1]);
    return 1;
   }
  if ((cambi= fopen(argv[2],"r")) == NULL)
   {
    fprintf(stderr, "errore apertura file %s\n",argv[2]);
    return 1;
   }
  while (fscanf(prodotti,"%f%d%s", &costo , &valuta , &nome) != EOF)
   {
    totprod++;
     for (i=0 ; i<=valuta ; i++)
      {
       fscanf(cambi, "%f", &cambio);
      }
     costo_totale+= costo*cambio;
   }
 printf("il numero di prodotti e': %d\n", totprod);
 printf("il costo totale in lire e': %f\n", costo_totale);
}
 
------=_NextPart_000_01BC872C.7AB93480
Content-Type: application/octet-stream; name="prodotti"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="prodotti"
100.3  2 scarpe
24567 1 occhiali
23.2 1 matita
134256.54 3 automobilef
------=_NextPart_000_01BC872C.7AB93480
Content-Type: application/octet-stream; name="cambi"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename="cambi"
2.075
11.42
397
------=_NextPart_000_01BC872C.7AB93480--

Hello Davide,
Il Jul 02 21:11 97, Davide  scrisse:
 D> Ed ora ecco a voi un problema tratto dal compito di fondamenti di
 D> informatca (ingegneria gestionale) del politecnico di Torino.
Vi va anche bene... Quanto tempo davano ? 20 minuti ? ]:-) (scherzo per
sdrammatizzare... lo so che il tempo vola durante l'esame :-) ).
 D> Nel file dei cambi sono presenti al massimo 10 valute mentre non e' noto (
Buuuuuu... Ma cosi' e' troppo facile :-) Potevano essere carogne e non lo sono
stati :-)
 D> e non e' lecito fare ipotesi al riguardo) il numero di prodotti presenti
 D> nel file dei costi.
E' il minimo.
 D> il numero di prodotti presenti nel file ( si noti che ogni prodotto e'
 D> presente una sola volta)
Anche qui sono stati buoni... nessuna necessita' di leggere le descrizioni...
sono solo da saltare. Nel prog che ti posto dopo ho ipotizzato che possano
arrivare a 39 caratteri, ma se vuoi te ne faccio una versione senza questa
limitazione...
 D> si dovrebbe generare sull'unita' di output standard il seguente risultato:
 D> Prodotti: 4
 D> Costo totale: 53352016.465
Aumma...
A me viene 53352016.000000 ... sono 7 cifre significative, coi float.
Al limite, usando dei double, sono arrivato a un .471 ...
 D> P.S. = spero che qualcuno abbia voglia di risolvere il problema. Insieme a
 D> questo messaggio c'e' anche il mio programma che nonostante in fase di 
 D> compilazione e linking non dia errori,
Ha resistito anche a gcc -ansi -pedantic ... incredibile :-)
 D> dopo essere stato lanciato da dei risultati non corretti e PIANTA IL
 D> SISTEMA!!!!!!!
C'era qualche errorino, in effetti, anche se il compilatore non lo trovava.
Per esempio nessun bounds checking, la ri-lettura del file cambi per ogni
articolo...
 D> Se qualche ANIMA PIA ha voglia e tempo di dargli un occhiata per vedere
 D> cosa c'e' che non va mi FAREBBE UN GROSSO PIACERE!!!!
Eccoti il codice funzionante (almeno, A ME funziona...).
Ho aggiunto anche qualche linea per il debug...
   ----- lire.c begins -----
#include <stdio.h>
main(int argc, char *argv[])
{
 FILE  *prodotti, /* Perche' usi due file quando ne basterebbe uno ? Mah ! */
       *cambi;
 int   valuta,
       i=0; /* inizializzo qui dato che non ho piu' il for(i=0;...) */
 float costo,
       cambio[10],
       costo_totale=0;
 long  totprod=0;
 char  nome[40]; /* Sarebbe meglio una costante simbolica ... */
 if(argc!=3) {
    fprintf(stderr,"errore mancano dei parametri\n");
    return 1;
 };
 /* Lettura del file dei cambi ... */
 if((cambi= fopen(argv[2],"r")) == NULL) {
    fprintf(stderr, "errore apertura file %s\n",argv[2]);
    return 1;
 };
 while(fscanf(cambi, "%f", &cambio[i]) == 1) { /* "== 1" solo per chiarezza */
    i++;
 };
 fclose(cambi); /* Questo non serve piu' */
 if((prodotti= fopen(argv[1],"r"))== NULL) {
    fprintf(stderr,"errore apertura file %s\n",argv[1]);
    return 1;
 };
 /* scanf ritorna il numero di oggetti correttamente letti */
 while (fscanf(prodotti,"%f%d%s", &costo , &valuta , nome) == 3) {
    printf("\"%s\" a %f lire (%f x %f, valuta %d)\n",
            nome, costo*cambio[valuta-1], costo, cambio[valuta-1], valuta);
    totprod++;
    if(valuta<0 || valuta>i) {
        fprintf(stderr,"errore: valuta %d inesistente all'articolo %s\n",
                valuta, nome);
         return 1;
     };
    costo_totale+= costo*cambio[valuta-1];
 };
 printf("il numero di prodotti e': %d\n", totprod);
 printf("il costo totale in lire e': %f\n", costo_totale);
 /* I FILE SI CHIUDONO ! :-) */
 fclose(prodotti);
}
   ----- lire.c ends -----
 D> Content-Type: text/html; charset=ISO-8859-1
Per favore, potresti evitare la parte html ?
.. Vieni a visitare FidoNet : ti piacera' !
Saluti,
   Diego - No (C) on my words - Togli _NoSpam_ dall'indirizzo per rispondermi
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ CyberSpace Software Labs Internet Gateway - +39-51-781399
+ User email address:   DZ@bo._NoSpam_dada.it
+ User FidoNet address: 2:332/437.1
+ Disclaimer: The views of this user are strictly his own.