allancarlos123 Posted March 2, 2014 at 05:58 PM Report #547276 Posted March 2, 2014 at 05:58 PM 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.
nunopicado Posted March 2, 2014 at 06:01 PM Report #547277 Posted March 2, 2014 at 06:01 PM 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.
allancarlos123 Posted March 2, 2014 at 07:20 PM Author Report #547283 Posted March 2, 2014 at 07:20 PM (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 March 2, 2014 at 07:21 PM by allancarlos123
nunopicado Posted March 2, 2014 at 07:25 PM Report #547284 Posted March 2, 2014 at 07:25 PM 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). 1 Report "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.
allancarlos123 Posted March 2, 2014 at 07:37 PM Author Report #547285 Posted March 2, 2014 at 07:37 PM (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 March 2, 2014 at 07:45 PM by allancarlos123
allancarlos123 Posted March 2, 2014 at 08:42 PM Author Report #547288 Posted March 2, 2014 at 08:42 PM (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;Beginid_velho:=0;no_velho:=''; For cont:=1 to 2 doBegin Write('',cont,' - Qual o nome: '); Readln(Nome); Write('',cont,' - Qual a idade: '); Readln(Idade); If (Idade>Id_velho) ThenBegin 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 March 2, 2014 at 08:43 PM by allancarlos123
nunopicado Posted March 2, 2014 at 08:44 PM Report #547290 Posted March 2, 2014 at 08:44 PM 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.
allancarlos123 Posted March 2, 2014 at 08:45 PM Author Report #547291 Posted March 2, 2014 at 08:45 PM Ainda não Nuno.
nunopicado Posted March 2, 2014 at 09:25 PM Report #547292 Posted March 2, 2014 at 09:25 PM 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.
allancarlos123 Posted March 2, 2014 at 10:21 PM Author Report #547295 Posted March 2, 2014 at 10:21 PM :/ Vou tentar... Qualquer coisa volto a postar no mesmo tópico.
nunopicado Posted March 2, 2014 at 10:41 PM Report #547297 Posted March 2, 2014 at 10:41 PM 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... 1 Report "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.
zzyxz Posted March 9, 2014 at 06:36 PM Report #547990 Posted March 9, 2014 at 06:36 PM (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 March 9, 2014 at 11:33 PM by thoga31 GeSHi
thoga31 Posted March 9, 2014 at 11:50 PM Report #548014 Posted March 9, 2014 at 11:50 PM @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. 1 Report Knowledge is free!
zzyxz Posted March 10, 2014 at 12:35 PM Report #548057 Posted March 10, 2014 at 12:35 PM @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 👍 1 Report
thoga31 Posted March 10, 2014 at 02:35 PM Report #548070 Posted March 10, 2014 at 02:35 PM 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? 1 Report Knowledge is free!
zzyxz Posted March 10, 2014 at 07:36 PM Report #548120 Posted March 10, 2014 at 07:36 PM 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 😁
nunopicado Posted March 10, 2014 at 08:37 PM Report #548121 Posted March 10, 2014 at 08:37 PM 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.
zzyxz Posted March 10, 2014 at 09:04 PM Report #548123 Posted March 10, 2014 at 09:04 PM 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..
nunopicado Posted March 10, 2014 at 09:07 PM Report #548125 Posted March 10, 2014 at 09:07 PM É 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. 1 Report "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.
thoga31 Posted March 11, 2014 at 12:42 PM Report #548202 Posted March 11, 2014 at 12:42 PM Bom, o @nunopicado já explicou tudo, creio não ser necessário acrescentar mais nada 😄 1 Report Knowledge is free!
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now