Jump to content

maior número


necrolord
 Share

Recommended Posts

Boas a todos.

Tenho um programa para fazer que tem de fazer o seguinte:

-pede o nome, ano, turma, numero do aluno e guarda num vector de registos.

-pede a nota de todas as disciplinas e calcula a média e guarda no mesmo vector de registos.

E agora vem a parte em que eu preciso de ajuda:

Temos de mostrar os dados por ordem crescente do número, o que com 4 alunos era fácil de fazer com um ciclo de if's mas se aumentarmos o alunos para 30 já fica um pouco mais confuso 😛

A minha professora disse para procurar por listas, por isso peço a alguém mais experiente no pascal do que eu que me dê umas luzes.

program new;
uses crt;
type r=record
      nome:string[40];
      nu:integer;
      turma:char;
      ano:integer;
      media:real;
    end;
var
 b:^r;
 a:array [1..4] of r;
 c,maior,menor:integer;
procedure media;
var
 port,mat,ef,fq,ai,arq,tic,psi,ing:integer;
begin
 write('Introduza a sua nota de Portuguˆs: ');
 readln(port);
 write('Introduza a sua nota de Matem tica: ');
 readln(Mat);
 write('Introduza a sua nota de Fisica e Quimica: ');
 Readln(fq);
 write('Introduza a sua nota de Area de Integra‡Æo: ');
 readln(ai);
 write('Introduza a sua nota de Arquitectura de Computadores: ');
 readln(arq);
 write('Introduza a sua nota de Tecnologias da Informa‡Æo e Comunica‡Æo: ');
 readln(tic);
 write('Introduza a sua nota de Programa‡Æo de Sistemas Inform ticos: ');
 readln(psi);
 write('Introduza a sua nota de Inglˆs: ');
 readln(ing);
 write('Introduza a sua nota de Educa‡Æo F¡sica: ');
 readln(EF);
 b^.media:=(Port+mat+ef+fq+ai+arq+tic+psi+ing)/9;
end;
begin
 clrscr;
 new(b);
 for c:=1 to 4 do
 begin
   write('Introduza o nome: ');
   readln(b^.nome);
   write('Introduza o ano: ');
   readln(b^.ano);
   write('Introduza a sua turma: ');
   readln(b^.turma);
   Write('Introduza o seu n£mero: ');
   readln(b^.nu);
   media;
   a[c]:=b^;
   Clrscr;
 end;
 maior:=0;
 menor:=30;
 for c:=1 to 4 do
 begin
   b^:=a[c];
   Writeln('Aluno ',b^.nome);
   Writeln('N£mero ',b^.ano);
   Writeln('Turma ',b^.turma);
   Writeln('N£mero ',b^.nu);
   Writeln('Com uma m‚dia de ',b^.media:6:2,' valores');
   Readln;
   Clrscr;
 end;
 readln;
 dispose(b);
end.

Falta apenas ordenar os dados por ordem crescente do número.

Já agora.. está-me a dar erro no new, pois pede-me um ponto final à frente do New, o que eu acho muito estranho

Bem agradeço a quem me conseguir ajudar.

Link to comment
Share on other sites

boas...

como isso é trabalho de escola, não te vou dar código...mas dou-te esta dica

para ordenar vectores, existem procedimentos já inventados para isso. um deles, fácil de entender, é o bubblesort, que é o que eu uso.

procedure BOLHA (V:vetor; N:integer);      //   vector=vector a ordenar; n= comprimento do vector

var I, AUX, FIM : integer;     
    TROCOU : boolean;

begin
   FIM := N;      //   definir o fim da procura
   repeat
      TROCOU := false;                                 //re-marca-se a posicao da flag como false
      for I:=1 to FIM-1 do                               //procurar no vector ate a penultima posicao
         if V > V[i+1] then                                 //se a posicao actual for maior que a seguinte
            begin                                                                  //  Troca-se
            AUX := V;                                                           //  os
            V := V[i+1];                                                      //  valores
            V[i+1] := AUX;                                                  // das posicoes
            TROCOU := true;                              //  Marca-se a flag como True
            end; 
      FIM := FIM-1;                                          //   re-define-se o fim da procura
   until not TROCOU;                                    //   se nao houve troca, e porque ja esta tudo organizado 
end;

como o nome o indica, isto vai pegar em cada posição do vector, e faze-la "subir" como se fosse uma bolha

é claro que só isto não te serve de nada...agora puxa um bocado pela cabeça....mais não posso fazer 🙂

EDIT

isto não é próprio do Pascal, é um algorítmo universal 😉 guarda isto na cabeça, pois é uma coisa básica para programação

Link to comment
Share on other sites

Muito obrigado. Era mesmo esse tipo de ajuda, que eu pretendia, sem dar o código 🙂

Antes de ver este post andei aqui às voltas e cheguei a uma solução parecida a essa.

O que eu fiz foi o seguinte. Pegando num algoritmo que testava todos os casos, se o que ele testava fosse maior trocava as posições no vector.

Para por isto a funcionar no programa o que fiz foi criar um vector com 2 linhas. Na primeira linha inseria o número do aluno e na segunda a posição onde ele tinha sido escrito.

Depois com a ajuda de um ciclo de for mostrei os números por ordem nas determinadas posições.

código final:

program dfjhsjsg;
uses crt;
type r=record
      nome:string[40];
      nu:integer;
      turma:char;
      ano:integer;
      media:real;
    end;

var
 b:^r;
 a:array [1..4] of r;
 d:array [1..4,1..4] of integer;
 c,l,z,x:integer;

procedure media;
var
 port,mat,ef,fq,ai,arq,tic,psi,ing:integer;
begin
 write('Introduza a sua nota de Inglˆs: ');
 readln(ing);
 write('Introduza a sua nota de Portuguˆs: ');
 readln(port);
 write('Introduza a sua nota de Matem tica: ');
 readln(Mat);
 write('Introduza a sua nota de Educa‡Æo F¡sica: ');
 readln(EF);
 write('Introduza a sua nota de Fisica e Quimica: ');
 Readln(fq);
 write('Introduza a sua nota de Area de Integra‡Æo: ');
 readln(ai);
 write('Introduza a sua nota de Arquitectura de Computadores: ');
 readln(arq);
 write('Introduza a sua nota de Programa‡Æo de Sistemas Inform ticos: ');
 readln(psi);
 write('Introduza a sua nota de Tecnologias da Informa‡Æo e Comunica‡Æo: ');
 readln(tic);
 b^.media:=(Port+mat+ef+fq+ai+arq+tic+psi+ing)/9;
end;

begin
 new(b);
 clrscr;
 for c:=1 to 4 do
  begin
    write('Introduza o nome: ');
    readln(b^.nome);
    write('Introduza o ano: ');
    readln(b^.ano);
    write('Introduza a sua turma: ');
    readln(b^.turma);
    Write('Introduza o seu n£mero: ');
    readln(b^.nu);
    media;
    d[1,c]:=b^.nu;
    d[2,c]:=c;
    a[c]:=b^;
    Clrscr;
  end;
 for c:=1 to 4 do
 for l:=1 to 4 do
  begin
    if d[1,c]<d[1,l] then
     begin
       z:=d[1,c];
       x:=d[2,c];
       d[1,c]:=d[1,l];
       d[2,c]:=d[2,l];
       d[1,l]:=z;
       d[2,l]:=x;
     end;
  end;
 for c:=1 to 4 do
  begin
    b^:=a[d[2,c]];
    Writeln('Aluno ',b^.nome);
    Writeln('Ano ',b^.ano);
    Writeln('Turma ',b^.turma);
    Writeln('N£mero ',b^.nu);
    Writeln('Com uma m‚dia de ',b^.media:6:2,' valores');
    Readln;
    Clrscr;
  end;
 readln;
 dispose(b);
end.

Obrigado pelo algoritmo, é mais uma coisa que fico a saber 😉

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.