Oppure

Loading
14/01/13 18:54
Tommaso95
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:
procedure Elimina(var tabella:TabellaRegistro;var n:byte);
var
        i,riga:byte;
begin
   clrscr;
   Write('Inserisci il cognome dello studente da eliminare: '); Readln(riga);
   for i:=riga to n-1  do
            tabella[i]:=tabella[i+1];
   n:=n-1;

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).
aaa
14/01/13 21:01
Poggi Marco
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.
aaa
14/01/13 21:45
Tommaso95
Rileggendo devo dire che mi sono espresso proprio male!
In pratica io ho questo array di record cosi definito:
program registro;
uses crt;
const
     Nmax = 30;    (* Numero studenti massimo *)
     cognome : array[1..5] of string[20] = ('Bla','Bla','Cdhgsdhgs','dsgsdg','dgdgd');
     nome : array[1..5] of string[20] = ('Tommaso','Valentina','Endy','Giulia','Valerio');
     (type
    studente = record
             cognomi : string[20];
             nomi : string[20];
             voti : array[1..5] of byte;
             contatore_voti : byte;
             media : real;
    end;
    Tabellaregistro = array[1..Nmax] of studente;
var
     reg_4a: Tabellaregistro;
     i,j,n,numAlunni:byte;
     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 ;)
aaa
14/01/13 23:09
Poggi Marco
Basta chiedere quale cognome eliminare, e procedere con un confronto tra gli elementi compresi nel vettore.

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

aaa