Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Pascal - Gestione archivio libri
Forum - Pascal - Gestione archivio libri

Avatar
thedifferent (Normal User)
Newbie


Messaggi: 2
Iscritto: 02/08/2006

Segnala al moderatore
Postato alle 19:43
Mercoledì, 02/08/2006
Salve a tutti

Devo svolgere un programma pascal che mi permetta di inserire,eliminare e stampare la lista di vari libri dati da tastiera.
Per ogni libro deve essere inoltre inserito:
-il titolo
-l'autore
-la casa editrice
-il prezzo
...che devono essere poi stampate.
Fino ad ora sono riuscito a realizzare solo un programma che aggiunge,elimina e stampa solo i libri a cui però riesco a dare solamente il titolo.Se provo a inserire le altre caratteristiche il programma mi restituisce o caratteri incomprensibili o inverte a caso l'ordine delle caratteristiche(es.sotto la voce titolo viene inserito il prezzo e così via).
Ecco il programma che aggiunge,elimina e stampa libri provvisti solo di titolo

Codice sorgente - presumibilmente Delphi

  1. program libreria;
  2. uses crt;
  3.  
  4. type
  5. dati=string;
  6. pnodi=^nodi;
  7. nodi=record
  8.       dato,dato2: dati;
  9.       pros: pnodi
  10.      end;
  11. var
  12.    primo,secondo:pnodi;
  13.    scelta:char;
  14.    finito:boolean;
  15. procedure init;
  16. begin
  17.    primo:=nil;
  18. end;
  19. function listavuota:boolean;
  20. begin
  21.    listavuota:=primo=nil
  22. end;
  23. procedure creanuovo(var punt:pnodi;info:dati);
  24. begin
  25.    new(punt);
  26.    punt^.dato:=info;
  27.    punt^.pros:=nil
  28. end;
  29. procedure inserisci;
  30. var nuovo,temp,precedente:pnodi;
  31.     datoinput,datoinput2:dati;
  32. begin
  33.     write('Inserisci il titolo del libro: ');
  34.     readln(datoinput);
  35.     creanuovo(nuovo,datoinput);
  36.     if listavuota then
  37.       primo:=nuovo
  38.     else
  39.     if primo^.dato>nuovo^.dato then
  40.       begin
  41.          temp:=primo;
  42.          primo:=nuovo;
  43.          primo^.pros:=temp
  44.       end
  45.     else
  46.       begin
  47.          temp:=primo;
  48.          while (temp<>nil)and(nuovo^.dato>temp^.dato) do
  49.           begin
  50.              precedente:=temp;
  51.              temp:=temp^.pros
  52.           end;
  53.          nuovo^.pros := temp;
  54.          precedente^.pros:=nuovo
  55.     end;
  56. end;
  57. procedure elimina;
  58. var temp,precedente:pnodi;
  59.     datoinput:dati;
  60.     trovato:boolean;
  61. begin
  62.     write('Inserisci il nome del libro da cancellare: ');
  63.     readln(datoinput);
  64.     if listavuota then
  65.        writeln('Non Š possibile cancellare alcun libro in quanto la lista Š vuota')
  66.     else
  67.         begin
  68.              trovato:=false;
  69.              precedente:=nil;
  70.              temp:=primo;
  71.              if primo^.dato=datoinput then
  72.                 begin
  73.                      primo:=primo^.pros;
  74.                      dispose(temp);
  75.                      trovato:=true
  76.                 end
  77.              else
  78.                  while(not trovato)and(temp<>nil)do
  79.                     if temp^.dato=datoinput then
  80.                       begin
  81.                            trovato:=true;
  82.                            precedente^.pros:=temp^.pros;
  83.                            dispose(temp)
  84.                       end
  85.                     else
  86.                       begin
  87.                            precedente:=temp;
  88.                            temp:=temp^.pros
  89.                       end;
  90.              if not trovato then
  91.                 begin
  92.                      writeln('Il libro inserito non esiste');
  93.                      readln
  94.                 end
  95.     end
  96. end;
  97. procedure stampa;
  98. var temp:pnodi;
  99. begin
  100.      clrscr;
  101.      writeln;
  102.      writeln('-- ELENCO COMPLETO --');
  103.      writeln;
  104.      temp:=primo;
  105.      while temp<>nil do
  106.        begin
  107.           writeln('TITOLO: ',temp^.dato);
  108.           temp:=temp^.pros;
  109.        end;
  110.      writeln('-------------------------');
  111.      readln
  112. end;
  113.  
  114. begin
  115.      init;
  116.      finito:=false;
  117.      repeat
  118.            clrscr;
  119.            gotoxy(1,50);
  120.            textbackground(blue);
  121.            textcolor(yellow);write(' Premi 0 ');
  122.            textcolor(white);write('per uscire');
  123.            gotoxy(1,1);
  124.            writeln;
  125.            writeln;
  126.            writeln;
  127.            writeln;
  128.            writeln('               ----------BENVENUTO NELL''ARCHIVIO LIBRI----------');
  129.            writeln;
  130.            writeln('               1: Inserisci un libro');
  131.            writeln('               2: Cancella un libro');
  132.            writeln('               3: Visualizza la lista completa dei libri');
  133.            writeln;
  134.            repeat
  135.                  write('Scelta: ');
  136.                  readln(scelta)
  137.            until(scelta>='0')and(scelta<='3');
  138.            case scelta of
  139.                '0':finito:=true;
  140.                '1':inserisci;
  141.                '2':elimina;
  142.                '3':stampa;
  143.            end;
  144.      until finito
  145. end.




Come faccio a far visualizzare anche le altre voci?(autore,casa e prezzo)
Spero possiate aiutarmi :k:

Ultima modifica effettuata da thedifferent il 02/08/2006 alle 19:53
PM Quote
Avatar
AndRyu™ (Member)
Rookie


Messaggi: 41
Iscritto: 03/05/2006

Segnala al moderatore
Postato alle 10:43
Sabato, 05/08/2006
ho dato solo un'occhiata al codice ma se non sbaglio non è possibile fare un confronto fra stringhe con > o <...

prova a cambiare quello, se ancora non funziona dimmelo che lo guardo + attentamente ;)

PM Quote
Avatar
thedifferent (Normal User)
Newbie


Messaggi: 2
Iscritto: 02/08/2006

Segnala al moderatore
Postato alle 13:18
Sabato, 05/08/2006
Il programma che ho postato sopra è quello funzionante in quanto aggiunge,elimina e stampa libri provvisti di solo titolo.
Ora posto il programma in cui ho tentato di fargli aggiungere,oltre al titolo, anche autore,casa editrice,prezzo,ecc.
Ecco cosa sono riuscito a fare
Codice sorgente - presumibilmente Delphi

  1. uses crt;
  2.  
  3. type
  4. stringacorta=string[30];
  5. stringalunga=string[50];
  6. dati=string;
  7. pnodi=^nodi;
  8. nodi = record
  9.          titolo:stringalunga;
  10.          autore:stringacorta;
  11.          ediz:real;
  12.          cased:stringacorta;
  13.          prezzo:real;
  14.          pros:pnodi
  15.         end;
  16. var testo:nodi;
  17.     biblioteca:array[1..100] of nodi;
  18.     primo:pnodi;
  19.     scelta:char;
  20.     finito:boolean;
  21. procedure init;
  22. begin
  23.    primo:=nil;
  24. end;
  25. function listavuota:boolean;
  26. begin
  27.    listavuota:=primo=nil
  28. end;
  29. procedure creanuovotit(var punt:pnodi;info:stringalunga);
  30. begin
  31.    new(punt);
  32.    punt^.titolo:=info;
  33.    punt^.pros:=nil
  34. end;
  35.  
  36. procedure creanuovoaut(var punt:pnodi;info:stringacorta);
  37. begin
  38.    new(punt);
  39.    punt^.autore:=info;
  40.    punt^.pros:=nil
  41. end;
  42.  
  43. procedure creanuovoediz(var punt:pnodi;info:real);
  44. begin
  45.    new(punt);
  46.    punt^.ediz:=info;
  47.    punt^.pros:=nil
  48. end;
  49.  
  50.  
  51. procedure creanuovocased(var punt:pnodi;info:stringalunga);
  52. begin
  53.    new(punt);
  54.    punt^.cased:=info;
  55.    punt^.pros:=nil
  56. end;
  57.  
  58.  
  59. procedure creanuovoprez(var punt:pnodi;info:real);
  60. begin
  61.    new(punt);
  62.    punt^.prezzo:=info;
  63.    punt^.pros:=nil
  64. end;
  65.  
  66. procedure inserisci;
  67. var nuovo,temp,precedente:pnodi;
  68.     datoinput,datoinput2:stringalunga;
  69.     datoinput3,datoinput5:real;
  70.     datoinput4:stringacorta;
  71. begin
  72.     write('Inserisci il titolo del libro: ');
  73.     readln(datoinput2);
  74.     creanuovotit(nuovo,datoinput2);
  75.     if listavuota then
  76.       primo:=nuovo
  77.     else
  78.     if primo^.titolo>nuovo^.titolo then
  79.       begin
  80.          temp:=primo;
  81.          primo:=nuovo;
  82.          primo^.pros:=temp
  83.       end
  84.     else
  85.       begin
  86.          temp:=primo;
  87.          while (temp<>nil)and(nuovo^.titolo>temp^.titolo) do
  88.           begin
  89.              precedente:=temp;
  90.              temp:=temp^.pros
  91.           end;
  92.          nuovo^.pros := temp;
  93.          precedente^.pros:=nuovo
  94.       end;
  95.     write('Inserisci l''autore del libro: ');
  96.     readln(datoinput);
  97.     creanuovoaut(nuovo,datoinput);
  98.     if listavuota then
  99.       primo:=nuovo
  100.     else
  101.     if primo^.autore>nuovo^.autore then
  102.       begin
  103.          temp:=primo;
  104.          primo:=nuovo;
  105.          primo^.pros:=temp
  106.       end
  107.     else
  108.       begin
  109.          temp:=primo;
  110.          while (temp<>nil)and(nuovo^.autore>temp^.autore) do
  111.           begin
  112.              precedente:=temp;
  113.              temp:=temp^.pros
  114.           end;
  115.          nuovo^.pros := temp;
  116.          precedente^.pros:=nuovo
  117.       end;
  118.     write('Inserisci l''edizione del libro: ');
  119.     readln(datoinput3);
  120.     creanuovoediz(nuovo,datoinput3);
  121.     if listavuota then
  122.       primo:=nuovo
  123.     else
  124.     if primo^.ediz>nuovo^.ediz then
  125.       begin
  126.          temp:=primo;
  127.          primo:=nuovo;
  128.          primo^.pros:=temp
  129.       end
  130.     else
  131.       begin
  132.          temp:=primo;
  133.          while (temp<>nil)and(nuovo^.ediz>temp^.ediz) do
  134.           begin
  135.              precedente:=temp;
  136.              temp:=temp^.pros
  137.           end;
  138.          nuovo^.pros := temp;
  139.          precedente^.pros:=nuovo
  140.       end;
  141.     write('Inserisci la casa editrice del libro: ');
  142.     readln(datoinput4);
  143.     creanuovocased(nuovo,datoinput4);
  144.     if listavuota then
  145.       primo:=nuovo
  146.     else
  147.     if primo^.cased>nuovo^.cased then
  148.       begin
  149.          temp:=primo;
  150.          primo:=nuovo;
  151.          primo^.pros:=temp
  152.       end
  153.     else
  154.       begin
  155.          temp:=primo;
  156.          while (temp<>nil)and(nuovo^.cased>temp^.cased) do
  157.           begin
  158.              precedente:=temp;
  159.              temp:=temp^.pros
  160.           end;
  161.          nuovo^.pros := temp;
  162.          precedente^.pros:=nuovo
  163.       end;
  164.     write('Inserisci il prezzo del libro: ');
  165.     readln(datoinput5);
  166.     creanuovoprez(nuovo,datoinput5);
  167.     if listavuota then
  168.       primo:=nuovo
  169.     else
  170.     if primo^.prezzo>nuovo^.prezzo then
  171.       begin
  172.          temp:=primo;
  173.          primo:=nuovo;
  174.          primo^.pros:=temp
  175.       end
  176.     else
  177.       begin
  178.          temp:=primo;
  179.          while (temp<>nil)and(nuovo^.prezzo>temp^.prezzo) do
  180.           begin
  181.              precedente:=temp;
  182.              temp:=temp^.pros
  183.           end;
  184.          nuovo^.pros := temp;
  185.          precedente^.pros:=nuovo
  186.       end;
  187. end;
  188. procedure elimina;
  189. var temp,precedente:pnodi;
  190.     datoinput:stringalunga;
  191.     datoinput2,datoinput4:stringacorta;
  192.     datoinput3,datoinput5:real;
  193.     trovato:boolean;
  194. begin
  195.     write('Dato da cancellare');
  196.     readln(datoinput);
  197.     if listavuota then
  198.        writeln('La lista Š vuota')
  199.     else
  200.         begin
  201.              trovato:=false;
  202.              precedente:=nil;
  203.              temp:=primo;
  204.              if primo^.titolo=datoinput then
  205.                 begin
  206.                      temp:=temp^.pros;
  207.                      dispose(temp);
  208.                      trovato:=true
  209.                 end
  210.              else
  211.                  while(not trovato)and(temp<>nil)do
  212.                     if temp^.titolo=datoinput then
  213.                       begin
  214.                            trovato:=true;
  215.                            precedente^.pros:=temp^.pros;
  216.                            dispose(temp)
  217.                       end
  218.                     else
  219.                       begin
  220.                            precedente:=temp;
  221.                            temp:=temp^.pros
  222.                       end;
  223.              if not trovato then
  224.                 begin
  225.                      writeln('Il dato richiesto non esiste');
  226.                      readln
  227.                 end;
  228.     end;
  229. end;
  230.  
  231. procedure stampa;
  232. var temp:pnodi;
  233. begin
  234.      clrscr;
  235.      writeln;
  236.      writeln('²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²');
  237.      writeln;
  238.      writeln('-- ELENCO COMPLETO --');
  239.      writeln;
  240.      temp:=primo;
  241.      while temp<>nil do
  242.        begin
  243.           writeln('TITOLO: ',temp^.titolo);
  244.           temp:=temp^.pros;
  245.           writeln('AUTORE: ',temp^.autore);
  246.           temp:=temp^.pros;
  247.           writeln('EDIZIONE: ',temp^.ediz);
  248.           temp:=temp^.pros;
  249.           writeln('CASA EDITRICE: ',temp^.cased);
  250.           temp:=temp^.pros;
  251.           writeln('PREZZO: ',temp^.prezzo);
  252.           temp:=temp^.pros;
  253.        writeln('-------------------------.')
  254.        end;
  255.  
  256.      writeln('²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²²');
  257.      readln
  258. end;
  259.  
  260.  
  261. begin
  262.      init;
  263.      finito:=false;
  264.      repeat
  265.            clrscr;
  266.            gotoxy(1,50);
  267.            textbackground(blue);
  268.            textcolor(yellow);write(' Premi 0 ');
  269.            textcolor(white);write('per uscire');
  270.            gotoxy(1,1);
  271.            writeln;
  272.            writeln;
  273.            writeln;
  274.            writeln;
  275.            writeln('               ----------BENVENUTO NELL''ARCHIVIO LIBRI----------');
  276.            writeln;
  277.            writeln('               1: Inserisci un libro');
  278.            writeln('               2: Cancella un libro');
  279.            writeln('               3: Visualizza la lista completa dei libri');
  280.            writeln;
  281.            repeat
  282.                  write('Scelta: ');
  283.                  readln(scelta)
  284.            until(scelta>='0')and(scelta<='3');
  285.            case scelta of
  286.                '0':finito:=true;
  287.                '1':inserisci;
  288.                '2':elimina;
  289.                '3':stampa;
  290.            end;
  291.      until finito
  292. end.


Con turbo pascal il programma viene eseguito ma ,quando immetto più di 1 libro,le caratteristiche si mischiano(es. al posto del titolo il prezzo e così via).
Con ipcute,invece, me lo esegue fino all'immissione del titolo e,quando inserisco l'autore, mi da un errore alla riga(senza virgolette):

"while (temp<>nil)and(nuovo^.autore>temp^.autore) do"
(per la precisione tra "temp^." e la parola "autore"

l'errore è:referencement not allowed on a pointer outside the heap

Grazie in anticipo:k:

PM Quote