Newsgroup: it.comp.lang.pascal
Titolo: cosa c'è che non va?

Ciao a tutti, cosa c'è che non va in questo programma? E un programma che
consiste nel caricare un file (contenente un elenco di cd) con il seguente
tracciato record:
titolo
Artista
Canzoni (elenco canzoni contenute nel cd)
Durata (elenco durate delle canzoni)
Casa Discografica
Anno registrazione
Il problema è questo: nella procedura carica mentre carico un cd, dalla
seconda volta in poi che entro nel ciclo di inserimente dell'elenco dei
brani non ho lo spazio per inserirli, è come se mi saltasse la read....così
avviene anche per il caricamento della casa discografica...
program musica;
uses crt;
type a=array[1..20] of string[15];
     b=record
        min:integer;
        sec:integer;
       end;
     lung=array[1..20] of b;
     cd=record
         titolo:string[10];
         artista:string[15];
         canzoni:a;
         durate:lung;
         casa:string[10];
         anno:integer;
        end;
     f=file of cd;
var lista:f;
    risp:char;
procedure carica(var lista:f);
var rec:cd;
    i,n:integer;
begin
 while not eof(lista) do
  read(lista,rec);
 writeln('Inserisci il titolo del cd');
 readln(rec.titolo);
 writeln('Inserisci l''artista del cd');
 readln(rec.artista);
 repeat
  writeln('Di quante canzoni si compone il cd?');
  readln(n);
 until (n>0) and (n<21);
 for i:=1 to n do
  begin
   writeln('Inserisci il titolo della ',i,'ø canzone');
   readln(rec.canzoni[i]);
   writeln('Inserisci la sua durata:');
   repeat
    write('min: ');
    read(rec.durate[i].min);
   until (rec.durate[i].min>0) and (rec.durate[i].min<10);
   repeat
    write('sec: ');
    read(rec.durate[i].sec);
   until (rec.durate[i].sec>=0) and (rec.durate[i].sec<60);
  end;
 writeln('Inserisci la casa discografica del cd');
 readln(rec.casa);
 repeat
  writeln('Inserisci l''anno di registrazione');
  readln(rec.anno);
 until (rec.anno>1950) and (rec.anno<=2003);
 write(lista,rec);
end;
function esiste(var lista:f):boolean;
begin
 {$I-}
 reset(lista);
 {$I+}
 if ioresult=0 then
  esiste:=true
 else
  esiste:=false;
end;
{------------------PROGRAMMA PRINCIPALE------------------}
begin
 clrscr;
 assign(lista,'c:\windows\desktop\archivio.dat');
 if not esiste(lista) then
  rewrite(lista);
 repeat
  clrscr;
  writeln('1- Caricamento');
  writeln('2- Ricerca per canzone');
  writeln('3- Calcolo della durata del cd');
  writeln('4- Ricerca per artista');
  writeln('5- Fine');
  readln(risp);
  case risp of
   '1': carica(lista);
   '2': ;
   '3': ;
   '4': ;
   '5': writeln('Hai selezionato fine, arrivederci.');
  else
   writeln('Scelta errata');
  end;
 until risp='5';
 readln
end.
grazie
--
L'importante della vita sono le scelte...
...c'è sempre un futuro alternativo
membro: 
www.alground.com
FORZA MANCHESTER UNITED!!!
Per scrivere in pvt togliere i "nospam"

   end;
[cut]
Il problema sono i due read che non eliminano dal buffer l'invio,
sostituiscili con readln
Ciao ReDiCuori
-- 
L'informatica č un arte
---------------------------------------------------------
 
www.pascallike.too.it
 
http://utenti.lycos.it/pascallike
 il sito sulla programmazione pascal
 sorgenti, tutorial ed utility
---------------------------------------------------------

 tracciato record:
 [ total-snip ]
il problema sono le read al posto delle readln. La read aspetta l'input
in fila, non su righe separate, mentre quando premi invio dopo aver
inserito i minuti, questo non viene preso, ma rimane nel buffer di input.
La prima readln che arriva (quella della canzone successiva o della casa
se hai finito le canzoni) si mangia l'invio e ritorna stringa vuota,
e quindi e' come se la saltasse. metti readln ovunque e sei tranquillo :-)
-- 
Dreadnaut
(Life would be easier if I had nntp access...)

> il problema sono le read al posto delle readln. La read aspetta l'input
[snip]
la domanda e' profonda, non superficiale come puo' sembrare a prima vista:
ero ubriaco quando ho scritto il precedente messaggio, oppure ho bisogno
di essere ubriaco per capire che non so' scrivere in italiano ?
Traducendo quello che ho scritto nel precedente messaggio, sotto l'effetto
di non so' quale stupefacente:
la read semplice legge dall'input e cerca di mettere nella variabile
passata come parametro quello che legge. Readln invece legge fino alla
fine della riga (cioe' al primo Invio/ritorno a capo che trova) e
con cerca di tradurre _tutta_ la riga in qualcosa che puo' essere messo
nella variabile. Nel tuo programma ci sono due read semplici per i minuti
e i secondi: quando inserisci il valore e premi invio, il numero finisce
nella variabile (il campo di rec) mentre l'invio rimane nel buffer di
input (non e' un numero !). La prima readln che viene eseguita (quella
del titolo della canzone successiva o quella della casa discografica)
prende quest'invio che e' in attesa nel buffer e dice "to', l'utente
ha inserito una stringa vuota -aka ha premuto subito invio- e quindi
e' come se venisse saltata. Solo mettendo readln ovunque puoi fare in
modo che gli "invii" vengano tolti dal buffer di input e quindi non
diano fastidio.
Mmmmh se la spiegazione e' ancora oscura me ne accorgero' domani ad
un'ora piu' normale... e in ogni caso, e' colpa della birra !
saluti,
Let's-party-Dreadnaut
-- 
Dreadnaut
(Life would be easier if I had the source code)

David Beckham trasformava una punizione quando Blackangaroo disse:
grazie ad entrambi ora funziona.
