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 - Dubbio con array e trasformazione tipo di dato
Forum - Pascal - Dubbio con array e trasformazione tipo di dato

Avatar
Tommaso95 (Normal User)
Newbie


Messaggi: 17
Iscritto: 17/10/2012

Segnala al moderatore
Postato alle 19:54
Lunedì, 14/01/2013
Salve a tutti, sto realizzando un programma e mi sono trovato davanti uno scoglio che non riesco proprio a superare.
In pratica devo eliminare da un array di record una "riga" (un singolo record). Sono riuscito a realizzare il tutto iin modo che l'utente indichi il NUMERO della riga da eliminare. Quello che vorrei fare è che l'utente possa eliminare una linea dall'array di record indicando il cognome .

Ecco la procedure per eliminare una linea:
Codice sorgente - presumibilmente Delphi

  1. procedure Elimina(var tabella:TabellaRegistro;var n:byte);
  2. var
  3.         i,riga:byte;
  4. begin
  5.    clrscr;
  6.    Write('Inserisci il cognome dello studente da eliminare: '); Readln(riga);
  7.    for i:=riga to n-1  do
  8.             tabella[i]:=tabella[i+1];
  9.    n:=n-1;
  10.  
  11. end;


Io vorrei che la variabile riga leggesse il cognome dello studente e non il numero della riga come fa adesso. i cognomi sono uno degli elementi del record e sono di tipo string (alcuni sono contenuti in un'array di costanti).

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 22:01
Lunedì, 14/01/2013
Ciao!

Come hai definito il tipo TabellaRegistro ?

Da quello che ho capito, deve essere un array statico di record. In tal caso, non è possibile eliminare un elemento del vettore. In questi casi, definisci un record nullo e utilizzalo per abolire  o confrontare gli elementi del vettore.

PM Quote
Avatar
Tommaso95 (Normal User)
Newbie


Messaggi: 17
Iscritto: 17/10/2012

Segnala al moderatore
Postato alle 22:45
Lunedì, 14/01/2013
Rileggendo devo dire che mi sono espresso proprio male!
In pratica io ho questo array di record cosi definito:
Codice sorgente - presumibilmente Delphi

  1. program registro;
  2. uses crt;
  3. const
  4.      Nmax = 30;    (* Numero studenti massimo *)
  5.      cognome : array[1..5] of string[20] = ('Bla','Bla','Cdhgsdhgs','dsgsdg','dgdgd');
  6.      nome : array[1..5] of string[20] = ('Tommaso','Valentina','Endy','Giulia','Valerio');
  7.      (type
  8.     studente = record
  9.              cognomi : string[20];
  10.              nomi : string[20];
  11.              voti : array[1..5] of byte;
  12.              contatore_voti : byte;
  13.              media : real;
  14.     end;
  15.     Tabellaregistro = array[1..Nmax] of studente;
  16. var
  17.      reg_4a: Tabellaregistro;
  18.      i,j,n,numAlunni:byte;
  19.      scelta: char;


L'elemento cognomi e nomi dell'array di record è riempito in parte da un array di costanti.

Dopo dio che ci sono varie procedure che permettono di fare varie cose tra cui aggiungere uno studente, cercarne uno e modificare le sue informazioni. Ma fin qui non ci sono problemi.

La procedura di elimina anche se funziona, no lo fa come vorrei.
In pratica adesso come adesso l'utente per eliminare uno studente deve indicare LA RIGA IN NUMERO (quindi un tipo byte) corrispondente alle informazioni di quello studente. Quindi se voglio eliminare il primo devo scrivere "1" e cosi via.
Quello che VORREI FARE è dare la possibilità all'utente di eliminare uno studente cercandolo per COGNOME  non per numero di riga.
In pratica non capisco come faccio capire al Pascal che se cerco Bla mi sto riferendo alla riga 1 .


Spero sia più chiaro ;)

PM Quote
Avatar
Poggi Marco (Member)
Guru


Messaggi: 969
Iscritto: 05/01/2010

Segnala al moderatore
Postato alle 0:09
Martedì, 15/01/2013
Basta chiedere quale cognome eliminare, e procedere con un confronto tra gli elementi compresi nel vettore.

Esempio:
Codice sorgente - presumibilmente Delphi

  1. procedure Elimina(var tabella : TabellaRegistro; cognome: string; dimensione:integer; nullo:studente);
  2. (*
  3.     tabella: record da esaminare
  4.     cognome: per l' appunto, il cognome da eliminare
  5.     dimensione: il numero di elementi di tabella
  6.     nullo: il record ti tipo studenti, definito come non valido
  7. *)
  8. var
  9.         i:byte;
  10. begin
  11.    for i:=1 to dimensione  do
  12.         if tabella[i].cognomi=cognome then (* confronto degli elementi nell' array*)
  13.                 tabella[i]:=nullo; (*assegno un record, definito come nullo *)
  14. end;


PM Quote