Jump to content
NEMESISaka

Variavel Automática

Recommended Posts

NEMESISaka

Boas...

Alguém sabe como fazer umas variáveis automáticas?

Por exemplo...

Eu tenho de fazer um programa que repita 15 vezes e que recolha a informação de 15 pessoas diferentes e após isso terei que fazer uns cálculos, por isso queria saber se existe alguma maneira de que o programa adicione variáveis sozinho, por exemplo, 1ª pessoa a variável para a idade seria idade1, para a segunda idade2, etc...

No entanto, se alguém souber fazer o GUI do pascal, também poderá ajudar, pois isto e só um trabalho para a escola, senão faria em C# que era mais fácil^^

PS: o programa ainda esta incompleto, pois antes de continuar gostaria de fazer as variáveis para ser mais fácil de racionar e concluir o programa, desde já, muito obrigado...

Program trab2 (input,output);

var
cont: integer;

uses crt;

begin
        clrscr;
        writeln('Bem-Vindo');
        writeln('Este programa irá  fazer alguns calculos para si, no entanto será  preciso a informação de 15 pessoas, em que ‚ necessario a idade, o peso, a altura e a cor dos olhos');
        cont:=0
                while cont<15 do
                begin
                        cont:=cont+1;
                        writeln('',cont,'ª Pessoa, por favor intruduza:');
                        writeln('Idade');
                        readln
                        writeln('Peso (Kg)');
                        readln
                        writeln('Altura (Cm)');
                        readln
                        writeln('Cor dos olhos');
                        readln
                        writeln('Cor do cabelo');
                        readln

Share this post


Link to post
Share on other sites
Vinícius.

Pode utilizar um array. Como são vários dados, com record fica mais organizado.

Declaração:

const
  num_pessoas = 15;
type
  t_dados = array[1..num_pessoas] of record
    idade: integer;
    massa: real;
    cor_olhos, cor_cabelo: string;
    end;
var
  pessoa: t_dados;

Para utilizar:

// para a pessoa número 2
readln(pessoa[2].idade);
readln(pessoa[2].massa);
{...}

ou:

// para a pessoa número "cont"
readln(pessoa[cont].idade);
readln(pessoa[cont].massa);
{...}

Share this post


Link to post
Share on other sites
NEMESISaka

Obrigado...

Vou experimentar, se tiver mais alguma duvida volto a postar^^

Edit:

Uma pergunta, como e que uso o "uses crt;"...

sempre que tento usar isso para limpar o ecrã o programa não corre...

E já agora, como posso saber os dados de uma certa pessoa após usar o array?

Por exemplo, escrever o peso da pessoa numero 5 ou por exemplo as pessoas que tem menos de 60kg...

Para saber como usas as variáveis...

Obrigado pela a ajuda desde já...

Share this post


Link to post
Share on other sites
Vinícius.

Uma pergunta, como e que uso o "uses crt;"...

sempre que tento usar isso para limpar o ecrã o programa não corre...

Coloque após o nome do programa:

uses
  crt;

Para limpar a tela:

clrscr;

Isto deve funcionar.

Qual compilador está usando?

E já agora, como posso saber os dados de uma certa pessoa após usar o array?

Por exemplo, escrever o peso da pessoa numero 5 ou por exemplo as pessoas que tem menos de 60kg...

// escrever a massa da pessoa 5
writeln(pessoa[5].massa:0:2);

// escrever as massas das pessoas com menos de 60kg
for cont := 1 to num_pessoas do
  if pessoa[cont].massa < 60 then
    writeln('Pessoa ',cont:0,':  massa = ',pessoa[cont].massa:0:2, 'kg');

Lembrando que "peso" é a força gravitacional, medida em Newtons. A "medida da inércia" chama-se massa.

Share this post


Link to post
Share on other sites
NEMESISaka

Hehe, ok...

Mas neste caso, massa ou peso, é apenas o nome de uma variável...

É o free pascal, isto é para as aulas de informática de 12º ano...

Mas agora acho que já consigo fazer o resto, o problema com o uses crt; era o sitio onde estava...

Eu estava a introduzi-lo depois do das variáveis (var) e antes de begin, por isso não trabalhava...

Agora já bomba, muito obrigado por tudo^^

Share this post


Link to post
Share on other sites
Vinícius.

De nada, se tiver mais dúvidas pode perguntar.

Caso já tenha solucionado, marque o tópico como resolvido.

Share this post


Link to post
Share on other sites
NEMESISaka

Ok, então vou perguntar, pois a medida que vou escrevendo vai aparecendo duvidas...

Porque agora estava a fazer comparações, por exemplo:

for cont:= 1 to Npessoas do
                if (pessoa[cont].idade>50) and (pessoa[cont].peso<60) then
                writeln('Existem ',cont, 'pessoas com idade superior a 50 e com peso inferior a 60');
                readln();

Mas vi que isto ia mandar varias mensagens em vez de 1, pois enquanto procura no cont para as 15 pessoas e vai achando escreve cada pessoa e vai dizendo o numero da pessoa...

No entanto, não sei bem como fazer para dizer apenas o numero de pessoas dentro dessas características...

Eu estava a pensar em adicionar mais uma variável, e por cada pessoa que entra-se nessas características adicionava +1 a variável e depois trocar o "cont" dentro do "writeln" por essa variável...

Edit:

Já consegui, obrigado...

Ficou:

   pes:=0;
        for cont:= 1 to Npessoas do
                if (pessoa[cont].idade>50) and (pessoa[cont].peso<60) then
                pes:=pes+1;
                writeln('Existem ',pes, 'pessoas com idade superior a 50 e com peso inferior a 60');
                readln();

Share this post


Link to post
Share on other sites
Vinícius.

Em vez de:

pes:=pes+1;

pode-se escrever simplesmente:

inc(pes);

Já que está utilizando a biblioteca crt, pode trocar:

readln();

por:

readkey;

sempre que a intenção for aguardar o usuário pressionar qualquer tecla.

Share this post


Link to post
Share on other sites
NEMESISaka

o inc significa increase?

isso era adicionar mais 1 pessoa?

é que agora preciso de fazer uma media e o resultado esta sempre a dar errado...

o código que tenho é este...

 pes5060:=0;
                alt:=0;
                med_idade:=0;
        for cont:= 1 to Npessoas do
                if (pessoa[cont].idade>50) and (pessoa[cont].peso<60) then
                pes5060:=pes5060+1;
                writeln('Existem ',pes5060, ' pessoas com idade superior a 50 e com peso inferior a 60');
                if pessoa[cont].altura<150 then
                alt:=alt+1;
                med_idade:=(med_idade+pessoa[cont].idade)/cont;
                writeln('Existem ',alt,' pessoas com menos de 1.50m e a media das suas idades é: ',med_idade:0:2);
        readkey;

mas a media nunca da correcta...

Share this post


Link to post
Share on other sites
Vinícius.

Inc(x,y);  é o mesmo que  x:=x+y;

Inc(x)      é o mesmo que  x:=x+1;

Quanto ao seu código, lembre-se de que só o primeiro if está dentro do for. Para pôr tudo -- conforme a identação -- no for, use begin/end.

Seu código na verdade está assim:

pes5060:=0;
alt:=0;
med_idade:=0;
for cont:= 1 to Npessoas do
  if (pessoa[cont].idade>50) and (pessoa[cont].peso<60) then
    pes5060:=pes5060+1;
writeln('Existem ',pes5060, ' pessoas com idade superior a 50 e com peso inferior a 60');
if pessoa[cont].altura<150 then
  alt:=alt+1;
med_idade:=(med_idade+pessoa[cont].idade)/cont;
writeln('Existem ',alt,' pessoas com menos de 1.50m e a media das suas idades é: ',med_idade:0:2);
readkey;

Share this post


Link to post
Share on other sites
NEMESISaka

Ok, muito obrigado...

Só mais uma questão, para usar o "Inc" é necessário alguma condição?

Por exemplo, "Uses crt;"...

Share this post


Link to post
Share on other sites
NEMESISaka

Ok, muito obrigado^^

Voltarei a postar se precisar de algo^^

Edit:

A media continua a trabalhar mal... eu acho que o programa esta a somar as idades de todas as pessoas e depois dividir pelas pessoas que estão dentro da condição if...

A variável "alt" esta correcta, pois na frase para o utilizador aparece la o numero certo...

Acho que o problema esta na variável "med_idade" que deve de estar a somar os valores mesmo das pessoas que não entram na condição if...

Se alguém tiver alguma sugestão agradeço^^

Obrigado por tudo...

    pes5060:=0;
                alt:=0;
                med_idade:=0;
        for cont:= 1 to Npessoas do
                begin
                                if (pessoa[cont].idade>50) and (pessoa[cont].peso<60) then
                                inc(pes5060);
                                if pessoa[cont].altura<150 then
                                inc(alt);
                                inc(med_idade,pessoa[cont].idade);
                                medtotal:=med_idade/alt;
                end;
         writeln('Existem ',pes5060, ' pessoas com idade superior a 50 e com peso inferior a 60');
         writeln('Existem ',alt,' pessoas com menos de 1.50m e a media das suas idades é: ',medtotal:0:2);
        readkey;
        end.

Share this post


Link to post
Share on other sites
Vinícius.

Para pôr mais de um comando no if, novamente use begin/end.

Pelo que entendi, a linha medtotal:=med_idade/alt; deveria estar fora do for, isto é, após o end.

Share this post


Link to post
Share on other sites
NEMESISaka

Ya, já trabalha, acho que o problema era mesmo ter 2 acontecimentos para 1 if sem ter o begin e o end...

O código ficou assim:

for cont:= 1 to Npessoas do
                begin
                                if (pessoa[cont].idade>50) and (pessoa[cont].peso<60) then
                                inc(pes5060);
                                if pessoa[cont].altura<150 then
                                        begin
                                         inc(alt);
                                         inc(med_idade,pessoa[cont].idade);
                                        end;
               end;
        medtotal:=med_idade/alt;
        writeln('Existem ',pes5060, ' pessoas com idade superior a 50 e com peso inferior a 60');
        writeln('Existem ',alt,' pessoas com menos de 1.50m e a media das suas idades ‚: ',medtotal:0:2);
        readkey;
        end.

Obrigado por me ajudar a resolver estes problema e por me ensinar mais umas condições no pascal^^

Se surgir mais alguma duvida volto a postar e meto o tópico como não resolvido...

Mas por enquanto, esta resolvido...

Share this post


Link to post
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

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