Oppure

Loading
24/11/07 19:05
TheCrow
Scusate per il titolo non molto kiaro, ma a scuola ci hanno assegnato un programma ke utilizza la struttura RECORD.

Dopo aver realizzato il programma, ho notato ke non passa a una procedura.

Praticamente dopo aver caricato il record ed aver effettuato la media (tramite procedure) si blocca.
Vi posto il sorgente :

Program Table;

Uses
Crt;

Const
Max = 30;

Type
Stringa = string [20] ;
Stringa2 = string [10] ;
Alunni = record
Nome : Stringa ;
Cognome : Stringa ;
Data : Stringa2 ;
Voti : Array [1..5] of real ;
Media : Real ;
End;

Var

N_Alunni,I,J : integer;
Lista : array [1..Max] of alunni ;
Tot : real;
Temp : string;
Cont : integer;
Name,Surname : String [40] ;

Procedure Dim ;

Begin
Repeat
Write('Inserire il numero degli alunni [ max 30 ] : ');ReadLn(N_Alunni);
Until (N_Alunni>0) and (N_Alunni<=30)
End;

Procedure Load ;

Begin
I:=1;
repeat
WriteLn('Alunno #',I);
Write('Insrire il nome : ');ReadLn(Lista[I].nome);
Write('Inserire il cognome : ');ReadLn(Lista[I].cognome);
Write('Inserire la data di nascita : ');ReadLn(Lista[I].data);
J:=1;
Repeat
Write('Inserire il ',J,' voto : ');ReadLn(Lista[I].Voti[J]);
J:=J+1;
Until J>5;
I:=I+1;
Until I>N_Alunni
End;

Procedure Media_V ;

Begin
For I:=1 to N_Alunni do
Begin
Tot:=0;
For J:=1 to 5 do
Begin
Tot:=Tot+Lista[I].Voti[J];
End;
Lista[I].Media:=Tot/5;
End;

End;

Procedure Scambia_C;

Begin
Temp := Lista[I].cognome;
Lista[I].cognome :=Lista[J].cognome;
Lista[J].cognome :=Temp;
End;

Procedure Scambia_N;

Begin
Temp := Lista[J].nome;
Lista[I].nome :=Lista[J].nome;
Lista[J].nome :=Temp;
End;

Procedure Ordina ;

Begin
I:=1;
Repeat
J:=I+1;
Repeat
IF (Lista[I].cognome>Lista[J].cognome) Then
Scambia_C
Else if
(Lista[I].nome>Lista[J].nome) Then
Scambia_N;
J:=J+1;
Until J<N_Alunni;
I:=I+1;
Until I<(N_Alunni-1);

End;

Procedure Stampa ;

Begin
For I:=1 to N_Alunni do
Begin
WriteLn(Lista[I].cognome);
WriteLn(Lista[I].nome);
WriteLn(Lista[I].data);
WriteLn(Lista[I].media);
End;
End;

Procedure Upper ;

Begin
For Cont:=1 to Length(Name) do
Begin
Name[Cont] := UPCASE (Name[Cont]);
End;
WriteLn(Name);
For I:=1 to Length(Surname) do
Begin
Surname[I] := UPCASE (surname[I])
End;
WriteLn(Surname);
Delay(1000);
End;

Procedure Print ;

Begin
I:=1;
repeat
IF (Lista[I].nome=name) and (Lista[I].cognome=surname) then
Begin
WriteLn(Lista[I].Media);
End;
I:=I+1;
until I<N_Alunni
End;

Begin
ClrScr;
Dim;
Load;
Media_V;
Ordina;
Stampa;
WriteLn('Chiave di ricerca');
Write('Inserire il nome : ');ReadLn(name);
Write('Inserire il cognome : ');ReadLn(surname);
Upper;
Print;
End.
aaa
29/11/07 14:42
TheCrow
Piccola revisione (non funziona lo stesso)

Program Studenti;

Uses
    Crt;

Const
     Max = 30;

Type
    Stringa  = string [20] ;
    Stringa2 = string [10] ;
    Alunni = record
          Nome    : Stringa ;
          Cognome : Stringa ;
          Data    : Stringa2 ;
          Voti    : Array [1..5] of real ;
          Media   : Real ;
    End;

Var

N_Alunni,I,J : integer;
Lista        : array [1..Max] of alunni ;
Tot          : real;
Temp         : string;
Cont         : integer;
Name,Surname : String [40] ;
carattere,c : char;

Procedure Dim ;

Begin
     Repeat
           Write('Inserire il numero degli alunni [ max 30 ] : ');ReadLn(N_Alunni);
     Until (N_Alunni>0) and (N_Alunni<=30)
End;

Procedure Load ;

Begin
     I:=1;
     repeat
         WriteLn('Alunno #',I);
         GoToXY(1,WhereY+1);Write('Insrire il nome : ');
         repeat
         carattere :=readkey;
         c := UpCase(carattere);
         Lista[J].Nome[I] := C ;
         Write(Lista[J].Nome[I]);
         until carattere=chr(13);
         GoToXY(1,WhereY+1);Write('Inserire il cognome : ');
         repeat
         carattere :=readkey;
         c := UpCase(carattere);
         Lista[J].Cognome[I] := C ;
         Write(Lista[J].Cognome[I]);
         until carattere=chr(13);
         GoToXY(1,WhereY+1);Write('Inserire la data di nascita : ');ReadLn(Lista[I].data);
         J:=1;
         Repeat
             Write('Inserire il ',J,' voto : ');ReadLn(Lista[I].Voti[J]);
             J:=J+1;
         Until J>5;
         I:=I+1;
     Until I>N_Alunni
End;

Procedure Media_V ;

Begin
     For I:=1 to N_Alunni do
         Begin
              Tot:=0;
              For J:=1 to 5 do
                  Begin
                       Tot:=Tot+Lista[I].Voti[J];
                  End;
              Lista[I].Media:=Tot/5;
         End;

End;

Procedure Scambia_C;

Begin
    Temp := Lista[I].cognome;
    Lista[I].cognome :=Lista[J].cognome;
    Lista[J].cognome :=Temp;
End;

Procedure Scambia_N;

Begin
     Temp := Lista[J].nome;
     Lista[I].nome :=Lista[J].nome;
     Lista[J].nome :=Temp;
End;

Procedure Ordina ;

Begin
     I:=1;
     Repeat
          J:=I+1;
          Repeat
                IF (Lista[I].cognome>Lista[J].cognome) Then
                   Scambia_C
                Else if
                     (Lista[I].nome>Lista[J].nome) Then
                     Scambia_N;
                J:=J+1;
          Until J<N_Alunni;
          I:=I+1;
     Until I<(N_Alunni-1);

End;

Procedure Stampa ;

Begin
     For I:=1 to N_Alunni do
         Begin
              WriteLn(Lista[I].cognome);
              WriteLn(Lista[I].nome);
              WriteLn(Lista[I].data);
              WriteLn(Lista[I].media);
         End;
	readln;
End;

Procedure Print ;

Begin
     I:=1;
     repeat
           IF (Lista[I].nome=name) and (Lista[I].cognome=surname) then
           Begin
              WriteLn(Lista[I].Media);
           End;
           I:=I+1;
     until I<N_Alunni
End;

Begin
     ClrScr;
     Dim;
     Load;
     Media_V;
     Ordina;
     Stampa;
     WriteLn('Chiave di ricerca');
     Write('Inserire il nome : ');
     I:=1; 
     repeat
		carattere := readkey;
		c := upcase (carattere);
		name[I]:=c;
		Write(name[I]);
		I:=I+1;
     until c = chr(13);
     Write('Inserire il cognome : ');
     I:=1;
     repeat
		carattere := readkey;
		c := upcase (carattere);
		surname[I] := c;
		Write(surname[I]);
		I:=I+1;
     until c = chr(13);
     Print;
     readln;

End.
aaa
29/11/07 17:18
WARRIOR
Pierpaolo nella dichiarazione del tipo, dichiari i campi del record, senza dichiararlo davvero.

qualcosa = record
----
----
----
end;


:k:
aaa
29/11/07 17:39
TheCrow
Non ho capito dove è l'errore.:(
aaa
29/11/07 23:01
WARRIOR
Ah no scusa errore mio :), il codice è scritto tutto compatto, quindi mi sono perso un' istruzione :D. Quando ho tempo provo il codice e ti dico. :k:
aaa
30/11/07 15:30
TheCrow
Grazie Luca.

Io non lo riesco proprio a trovare.
aaa
30/11/07 19:08
WARRIOR
In effetti non passa oltre la procedura media, c'è qualche errore fatale di mezzo.
Non penso sia questo il problema, ma cmq prova a dichiarare la variabile Temp, anzichè string, Stringa.
Ultima modifica effettuata da WARRIOR 30/11/07 19:14
aaa
30/11/07 19:15
sange_90
Penso cmq che il programma sarebbe più compatto se avesse procedure con passaggio di parametri facendo a meno di usare variabili globali al loro interno... ;)
aaa