Jump to content

[Resolvido] Como posso colocar o nome de 2 pessoas como as mais velhas


Recommended Posts

Posted

Quero que esse código me diga qual a pessoa mais velha, entre 5 pessoas.

O problema é que ele só acusa a pessoa mais velha a qual foi a última a digitar no caso a quinta pessoa.

Exemplo:

Nome: Rafael

Idade: 32

Nome: Allan

Idade: 12

- Allan é a pessoa mais velha 😕

Program Pzim ;
var
Nome,No_velho:String;
Idade,Id_velho,Cont:Integer;

Begin
id_velho:=0;
no_velho:='';


 For cont:=1 to 5 do
begin
     Write('',cont,' - Qual o nome: ');
Readln(Nome);
 writeln;
    Write('',cont,' - Qual a idade: ');
     Readln(Idade);
clrscr;
end;

     If (Idade>Id_velho) Then
begin
 Id_velho:=idade;
 No_velho:=nome;
     Writeln('A pessoa mais velha, ',nome,'');

end;

end. 
Posted

Estás a por a comparação fora do ciclo FOR.

Como tens, ele só irá comparar depois de concluir o ciclo, ou seja, com a última pessoa inserida.

A comparação tem de ser feita dentro do FOR.

Depois do FOR, meste só a apresentação do resultado.

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

Tentei assim, como você disse...mas dá o mesmo erro.

Program Pzim ;
var
Nome,No_velho:String;
Idade,Id_velho,Cont:Integer;

Begin
id_velho:=0;
no_velho:='';


 For cont:=1 to 2 do
 begin
     Write('',cont,' - Qual o nome: ');
     Readln(Nome);

     Write('',cont,' - Qual a idade: ');
     Readln(Idade);
clrscr;
 If (Idade>Id_velho) Then
Id_velho:=idade;
No_velho:=nome;
end;

begin
     Writeln('A pessoa mais velha, ',nome,'');
end;

end.
Edited by allancarlos123
Posted

Onde estás a escrever o resultado, estás a por begin e end para uma única instrução.

Não é que não o possas fazer, mas não há um único motivo para o fazeres.

Por outro lado, dentro do FOR, quando fazes a comparação, não estás a meter o begin / end para as duas instruções que tens de executar quando o Idade é maior que o Id_Velho.

Logo, ele apenas te guarda a idade do mais velho (que não estás a mostrar, logo não reparaste), mas não guarda o nome, mantendo portanto o último nome inserido.

Por fim, Quando mostras o resultado, tens de mostrar a variável que guarda o nome do mais velho (No_velho) e não a que usaste para ler os dados (Nome).

  • Vote 1

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

Agora foi 😛 :P 😛 Obrigado cara

Ficou assim...

Program Idade_Velho ;
var
Nome,No_velho:String;
Idade,Id_velho,Cont:Integer;

Begin
id_velho:=0;
no_velho:='';


 For cont:=1 to 2 do

Begin
 Write('',cont,' - Qual o nome: ');
 Readln(Nome);

 Write('',cont,' - Qual a idade: ');
 Readln(Idade);

 If (Idade>Id_velho) Then

Begin
 Id_velho:=idade;
 No_velho:=nome;
end;
end;


  Writeln('A pessoa mais velha, ',no_velho,'');


end.
Edited by allancarlos123
Posted (edited)

Boa noite 🙂

Como eu posso fazer para que o programa escreva o nome das 2 pessoas mais velhas.

A questão é que seja lido 10 idades com seus respectivos nomes e escreva 2 pessoas mais velhas dentre elas.

No entanto, só conseguir escrever o nome de 1 :\


Program Pzim ;
var
Nome,No_velho:String;
Idade,Id_velho,Cont:Integer;

Begin
id_velho:=0;
no_velho:='';


For cont:=1 to 2 do

Begin
Write('',cont,' - Qual o nome: ');
Readln(Nome);

Write('',cont,' - Qual a idade: ');
Readln(Idade);

If (Idade>Id_velho) Then

Begin
Id_velho:=idade;
No_velho:=nome;
end;
end;


Writeln('A pessoa mais velha tem, ',id_velho,' anos e se chama ',no_velho,'');


end.

[/Code]
Edited by allancarlos123
Posted

Allan: Juntei os tópicos, pois estão relacionados...

Antes de avançar-mos para este novo problema, diz-me: Já aprendeste arrays e records?

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

Isso é mais chato...

E estás disposto a aprender, ou tens mesmo de fazer este trabalho sem recurso a programação correcta? 😉

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

Se queres tentar, estuda esses dois tipos...

Em resumo, um Record é um tipo de dados composto. Com ele, podes agrupar numa única variável, dados de tipo diferente.

Por exemplo neste caso, ficarias com o nome e a idade acessível a partir do mesmo nome, o que significa que nunca os trocas... Um nome está "agarrado" a uma idade, e vice-versa.

Exemplo:

type
  TPessoa = Record
     Nome:String;
     Idade:Integer;
  end;
var
  Pessoa: TPessoa;

begin
  Pessoa.Nome := 'Allan';
  Pessoa.Idade := 16; // Atirado ao ar... Acertei? 

Um array por sua vez é uma forma de juntar num só nome várias variáveis do mesmo tipo, e aceder cada valor diferente a partir de um índice numérico.

Exemplo:

var
  Pessoas: Array [1..10] of String;  // 1..10 quer dizer que o array vai ter 10 posições, começando em 1 e terminando em 10. Efectivamente, é como ter 10 variáveis string
begin
  Pessoas[1] := 'Allan';
  Pessoas[2] := 'Nuno';

Ora, juntando os dois conceitos, podes fazer um array de um tipo record, e ficares com 10 posições diferentes, em que cada uma podes guardar nome e idade de cada pessoa:

type
  TPessoa = Record
     Nome:String;
     Idade:Integer;
  end;
var
  Pessoas: Array [1..10] of TPessoa;
  i: Integer;

begin
  for i:=1 to 10 do
     begin
        Write('Insira um nome: ');
        Readln(Pessoas[i].Nome);
        Write('Insira a idade: ');
        Readln(Pessoas[i].Idade);
     end;

Isto permite-te ler o nome e idade de 10 pessoas, sem perigo de perder a ligação entre nome e idade de cada um.

Basicamente, a ideia por trás disto seria leres primeiro tudo para um array.

Uma das características do array é que, como acedes ao conteúdo a partir de um índice, fica fácil aceder-lhe e manipular os dados. Nomeadamente, o que se precisa a seguir é ordenar as posições do array, conforme a idade. (verifica o algoritmo BubbleSort, há exemplos disso no tutorial de pascal cá no forum).

Depois de ordenado, é fácil sabes o maior, o menor, os dois maiores, os dois menores, etc...

  • Vote 1

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted (edited)

nuno, não aprendi records e em exercicios como estes e outros mais dificeis (tinhas usar algoritmos de ordenação, para apresentar tempos de voltas e nomes das equipas) usei vetores "simples" e este também pode ser resolvido assim

Allan, como só tens de apresentar os que são mais velhos (não uma lista ordenada de nomes e idades, pode fazer assim:

Program Idade_Velho ;
var Nome :array[1..10] of String;     //vetor que vai guardar todos os nomes
Idade :array[1..10] of integer; //vetor que vai guardar todas as idades
Id_velho,cont: integer;
Begin
    For cont:=1 to 10 do
        Begin
            Write('Nome: '); Readln(nome[cont]); //les o nome e a idade correspondente à pessoa e guardas-a a no indice do vetor correspondente,
            Write('Idade: '); Readln(Idade[cont]); // à pessoa 1 corresponde o indice 1 em ambos os vetores, à 2 o indice 2 e assim sucessivamente..
            If cont=1 then                             // a idade do mais velho é inicializada à tua primeira idade introduzida
                Id_velho := Idade[cont];
            If Idade[cont] > Id_velho then         // se introduzires uma idade maior do que a definida como máxima, ele guarda-a como a idade do mais velho
                Id_velho:= Idade[cont]
        End;
                                                    //verifica que pessoas tem a mesma idade que a idade da pessoa mais velha e apresenta o seu nome e a idade
    For cont:=1 to 10 do
        If Idade[cont] = Id_velho then
        Writeln('A pessoa mais velha tem, ',id_velho,' anos e se chama ',Nome[cont],'');
    Readln;
End.

Usas dois vetores: um para guardar os nomes das pessoas e outro para guardar as suas idades. Como les na mesma iteração para os dois e não trocas os dados de indice, no indice 1 dos dois vetores, Idade e nome, correspondem ao mesmo individuo, não tens problema em trocar os dados..

No primeiro ciclo for vais descobrir qual é a idade do mais velho e no segundo, percorres todos os indices do vetor que guarda as idades e sempre que a idade de uma das pessoas for igual à do mais velho (o que ocorrerá pelo menos uma vez), é apresentado o texto com o seu nome e com a idade máxima. (Isto só é possível porque não mexeste na informação contida em cada indice dos vetores!, ou seja, não as trocaste)

Penso que é mais ou menos isto que queres allan..

Edited by thoga31
GeSHi
Posted

@zzyxz, supostamente não devemos dar assim um código feito e pronto a compilar pois o membro que tem a dúvida poderá muito bem fazer copy-paste sem, no final, ter aprendido nada.

Posto isto, acerca do @nunopicado ter falado dos records, penso que tens noção que, apesar de funcionar bem, essa tua solução está longe de ser a melhor por vários motivos.

Primeiro, em bom Pascal não se guardam dados relacionados em estruturas/variáveis distintas. Em vez de dois arrays dever-se-ia ter um array of record - dados relacionados vão para "o mesmo saco" e não ficam dispersos.

Em segundo lugar, tendo em conta que utilizaste arrays estáticos e não dinâmicos (não são necessários aqui, apesar de serem parte de uma solução mais elegante), dever-se-á usar uma constante que defina quantas pessoas vão ser introduzidas. Se precisares de mudar o programa para inserir 25 pessoas, tens de mudar isto em 4 sítios diferentes - com uma constante só se muda uma vez.

Para finalizar, e sendo assim, aqui vai a minha solução, a qual o @allan não pode usar.

program olderperson;

type TPerson = record
       name : string;
       age : byte;
    end;
    TRegistry = array of TPerson;

const FINISH = '0';

var reg : TRegistry;
   elem : TPerson;
   older_age : byte = 0;

begin
  repeat
     write('Name? ("0" to finish) ');
     readln(elem.name);

     if elem.name <> FINISH then begin
        repeat
           write('Age? (0-130) ');
           readln(elem.age);
        until elem.age in [0..130];

        if elem.age > older_age then
           older_age := elem.age;

        SetLength(reg, length(reg)+1);
        reg[high(reg)] := elem;
     end;
  until elem.name = FINISH;

  writeln(#13+#10, 'The older people, aged ', older_age, ', are:');
  for elem in reg do
     if elem.age = older_age then
        writeln(elem.name);
end.
  • Vote 1

Knowledge is free!

Posted

@zzyxz, supostamente não devemos dar assim um código feito e pronto a compilar pois o membro que tem a dúvida poderá muito bem fazer copy-paste sem, no final, ter aprendido nada.

Thoga, é muito verdade, peço já desculpa pelo erro, não volta a contecer..

Primeiro, em bom Pascal não se guardam dados relacionados em estruturas/variáveis distintas. Em vez de dois arrays dever-se-ia ter um array of record - dados relacionados vão para "o mesmo saco" e não ficam dispersos.

Eu não aprendi records, mas tenho a noção que um bom programa para este e outros casos precisa de usá-los.. fui-me "desenrascando" assim, não é o que devia ter feito, mas foi o que fiz...

Quando aos arrays dinâmicos, foi por lapso mesmo 😕

Mas obrigado pelas dicas Thoga, estão registadas 👍

  • Vote 1
Posted

O teu código está bom, atenção, até está muito bom tendo em conta o nível de conhecimentos que dizes ter. Ainda bem que registaste as dicas, espero que te tenha incentivado a aprenderes mais umas coisas. 😉

Portanto... aprende records. 😄

São muito simples e tremendamente úteis. Aprendes isso em 30 minutos, se tanto.

Então os records variantes abrem todo um mundo de flexibilidade e possibilidades incrível para algo com um conceito tão simples. 😉

Quando aos arrays dinâmicos, foi por lapso mesmo 😕

Sabes trabalhar com arrays dinâmicos?

  • Vote 1

Knowledge is free!

Posted

O teu código está bom, atenção, até está muito bom tendo em conta o nível de conhecimentos que dizes ter. Ainda bem que registaste as dicas, espero que te tenha incentivado a aprenderes mais umas coisas. 😉

Thoga, o que aprendi foi o básico, tive tres meses de pascal.. váriaveis, instruções de leitura e escrita , ciclos repetitivos, arrays, strings..

Funções e procedimentos, bem como as passagens de argumentos, aprendi sozinho 😁

Sabes trabalhar com arrays dinâmicos?

se calhar não percebi o que querias dizer.., mas pelo que disseste antes (substituir a varíavel em 4 sitios em vez de 1) deu me a ideia de quereres dizer para definir uma constante no inicio e usa-la em vez do seu valor, que seria, neste caso, o número de pessoas e iterações máximas do ciclo for.. não é isso? 😕

Não é isto?

Const PESSOAS = 12

For i:=1 to PESSOAS do
.......

Em relação aos records, resolvi algumas coisas em que pensei muitas vezes que teria de haver uma maneira mais simples de "agrupar" os dados, bem como trabalhar com "arrays" em que o seu comprimento pudesse mudar ao longo do programa e não estivesse à partida "limitado"

Obrigado pelos conselhos e já pus os records como próximo tópico de estudo de pascal 😁

Posted

Funções e procedimentos, bem como as passagens de argumentos, aprendi sozinho 😁

Gosto de ler isto...

se calhar não percebi o que querias dizer.., mas pelo que disseste antes (substituir a varíavel em 4 sitios em vez de 1) deu me a ideia de quereres dizer para definir uma constante no inicio e usa-la em vez do seu valor, que seria, neste caso, o número de pessoas e iterações máximas do ciclo for.. não é isso? 😕

Não é isto?

Const PESSOAS = 12

For i:=1 to PESSOAS do
.......

Quase...

O Thoga referia-se a arrays estáticos, mas com uma constante que indique o valor máximo, a ser usada nos vários pontos do código onde é necessário esse valor.

Por exemplo:

const
  Max=5;
var
  a:Array[1..Max] of Integer;
  i:byte;
begin
  for i:=1 to Max do
     begin
        write('Insira o ',i,'º valor: ');
        readln(a[i]);
     end;

  Writeln('O array tem ',Max,' valores inteiros');
.
.

Este trecho de código, que é tão útil como uma guitarra num enterro, serve para 5 items, mas bastava alterar o valor da constante Max para dar para 500.

Todo o código, sempre que precisa saber o máximo, sabe qual é.

Isto são no entanto ainda arrays estáticos. O seu tamanho é definido em designtime.

(...) bem como trabalhar com "arrays" em que o seu comprimento pudesse mudar ao longo do programa e não estivesse à partida "limitado"

Isso é que são arrays dinâmicos. Na hora de programar não sabes quantos items vai ter, isso vai ser decidido dinâmicamente na hora de executar o programa.

Exemplo:

var
  a:Array of Integer;
  Max,i:byte;
begin
  write('Quantos números quer inserir? ');
  readln(Max);

  SetLength(a,Max); // Esta instrução vai definir o tamanho do array já depois do utilizador indicar quantos quer inserir.

  for i:=Low(a) to High(a) do    // Low(a) e High(a) indica o valor mínimo e máximo do array
     begin
        write('Insira o ',i,'º valor: ');
        readln(a[i]);
     end;

  Writeln('O array tem ',Length(a),' valores inteiros');  // Length(a) indica o tamanho do array naquele momento.
.
.

Note-se que, nos arrays dinâmicos, o valor mínimo é sempre 0. O máximo será o número de items menos 1 (por começar em 0).

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Posted

Isso é que são arrays dinâmicos. Na hora de programar não sabes quantos items vai ter, isso vai ser decidido dinâmicamente na hora de executar o programa.

Entendido! 😁 Acabaste de me simplificar muito a vida 👍

Note-se que, nos arrays dinâmicos, o valor mínimo é sempre 0. O máximo será o número de items menos 1 (por começar em 0).

É como C ou vba, certo? Em que o primeiro valor do array equivale ao seu índice zero e o ultimo elemento encontra-se no índice n-1, em que n é o número de elementos do vetor, não é?

Quanto à declaração de vetores estáticos com constante, já tinha utilizado, mas foi uma das coisas que da "boa programação" que se evaporou e entretanto deixei de usar.. 😕 vou ver se tomo uma nota mental..

Posted

É isso mesmo.

Em Pascal, ao contrário da muitas outras linguagens, podes escolher não só o tamanho do array como também o seu início.

No entanto, em arrays dinâmicos, essa funcionalidade não existe, logo, começa tudo em 0.

  • Vote 1

"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

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
×
×
  • 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.