• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

necrolord

maior número

3 mensagens neste tópico

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 :P

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.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros 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 ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora