Ir ao conteúdo
  • Cadastre-se
furlantx500 tx

RESOLVIDO Ajuda em exercícios pascal!

Recommended Posts

Galera, estou no primeiro ano de engenharia e programação tem sido uma matéria dificl de pegar o jeito, estava tentando fazer o seguinte exercício:  

 

2. Deseja-se obter estatísticas de sexo e idade dos alunos . Para tanto, você deve elaborar um programa em Pascal que permita ao usuário digitar:  nome do aluno;  idade (não pode ser menor que 15 anos);  sexo (só podem ser aceitos caracteres 'M' ou 'F'). Para os campos idade e sexo, é necessário realizar a validação dos dados digitados. Não se sabe, a princípio, quantos alunos serão entrevistados, portanto, a cada nova entrevista, o usuário deve informar ao programa que deseja inserir informações de mais um entrevistado. Ao final, o programa deve exibir a porcentagem de alunas com idade maior ou igual a 25 anos.

 

bom, eu consegui desenvolver pouca coisa do programa, e nem sei se está certo, preciso de uma luz pra resolver isso, obrigado!

 

prevejo dp de programação haha

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde.

Cadê o código?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

opa, acabei conseguindo resolver, mas valeu a atenção

program medmulh;var  nomedoaluno:string;  sexo,continuar:char;  idade,cont,soma:integer;  media:real;begincont:=0;soma:=0;  repeat     repeat    writeln('Digite seu nome');    readln(nomedoaluno);    writeln('Digite a idade. Apenas idade maior igual a 15');    readln(idade);    until idade>=15;    writeln('Digite seu sexo M ou F');    readln(sexo);    sexo:= upcase(sexo);    if sexo='F' then    begin     cont:=cont+1;     soma:=soma+idade;     end     else begin     cont:=cont+0;    soma:=soma+0;     end;    writeln(nomedoaluno,' e do sexo ',sexo,' e tem ',idade,' anos');    writeln('Deseja continuar? S ou N');    readln(continuar);    continuar:= upcase(continuar);     until    continuar= ('N');     Writeln('O numero de mulheres entrevistadas e ',cont);     Writeln('A soma das idades e ',soma);     media:= soma/cont;     Writeln('A media de idade das mulheres entrevistadas e ',media:10:2);  readln;end.

mas ja q postei aqui, sera que teria como resolver esse exercicio com um programa mais simples e menor?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá furlantx500 tx.
 
Alguns pontos que podem ser revisados:

PROGRAMA medmulh;var  nomedoaluno    :string;  sexo,continuar :char;  idade,cont,soma:integer;  media          :real;BEGINcont:=0;soma:=0;repeat  repeat    writeln('Digite seu nome'); //O NOME DO ALUNO NÃO PRECISA SER RELIDO! APENAS A IDADE    readln(nomedoaluno);    writeln('Digite a idade. Apenas idade maior igual a 15');    readln(idade);  until idade>=15;  writeln('Digite seu sexo M ou F'); //O SEXO TAMBÉM DEVE SER VERIFICADO, ASSIM COMO A IDADE!!!  readln(sexo);  sexo:= upcase(sexo);  if sexo='F' then    begin    cont:=cont+1;    soma:=soma+idade;    end  else  //NÃO PRECISA DESSE ELSE, SIMPLESMENTE APAGUE!    begin    cont:=cont+0; //0 é o elementro neutro da adição, logo, não tem nenhum efeito    soma:=soma+0;    end;  writeln(nomedoaluno,' e do sexo ',sexo,' e tem ',idade,' anos'); //isso não é pedido*  writeln('Deseja continuar? S ou N');  readln(continuar);  continuar:= upcase(continuar);until continuar=('N');writeln('O numero de mulheres entrevistadas e ',cont);  //isso não é pedido*writeln('A soma das idades e ',soma); //isso não é pedido*media:= soma/cont; //cuidado, se cont for igual a 0, vai da problema!Writeln('A media de idade das mulheres entrevistadas e ',media:10:2); //isso não é pedido*readln;END.

A requisição do enunciado é:
 

Ao final, o programa deve exibir a porcentagem de alunas com idade maior ou igual a 25 anos.

 

E isso não foi respondido...

 

* talvez não tenha problema inserir detalhes a mais (que já estão no programa), mas devem-se no mínimo fazer o que se pediu, ou seja, o "foco" é fazer o que se pede, e a depender da proposta, poderá fazer algo a mais... (eu por exemplo quando estava na faculdade, quando não sabia exatamente o que poderia fazer a mais, eu entregada duas versões diferentes para não ter desculpa, rs)

 

 

Por ai vai.

No aguardo.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá furlantx500 tx.

 

Alguns pontos que podem ser revisados:


A requisição do enunciado é:

 

 

E isso não foi respondido...

 

* talvez não tenha problema inserir detalhes a mais (que já estão no programa), mas devem-se no mínimo fazer o que se pediu, ou seja, o "foco" é fazer o que se pede, e a depender da proposta, poderá fazer algo a mais... (eu por exemplo quando estava na faculdade, quando não sabia exatamente o que poderia fazer a mais, eu entregada duas versões diferentes para não ter desculpa, rs)

 

 

Por ai vai.

No aguardo.

 

então, eu pensei assim, se a pessoa nao tem a idade necessaria, deveria ser repetido o nome para q outra pessoa seja entrevistada, ja q a anterior nao tem a idade suficiente, nao achei muito sentido repetir só a idade, mesma coisa o sexo, caso seja do sexo masculino acho necessario pedir o nome novamente. E sobre fazer o que o exercicio pedia, eu nem tinha percebido q nao tinha feito isso, provavelmente interpretei errado o que ele queria. Por fim, segue novamente o programa, o que você acha?

PROGRAM medmulh;var  nomedoaluno     :string;  sexo,continuar  :char;  idade,cont,cont2:integer;  porcentagem     :real;BEGINcont:=0;cont2:=0;repeat  repeat     repeat    writeln('Digite seu nome');    readln(nomedoaluno);    writeln('Digite a idade. Apenas idade maior igual a 15');    readln(idade);  until idade>=15;  writeln('Digite seu sexo M ou F');  readln(sexo);  sexo:= upcase(sexo);  until sexo='F'; if sexo='F' then    begin    cont:=cont+1;    end; if idade>=25 then    begin    cont2:=cont2+1;    end;  writeln('Deseja continuar? S ou N');  readln(continuar);  continuar:= upcase(continuar);until continuar=('N');writeln('O numero de mulheres entrevistadas acima de 25 anos e ',cont2);porcentagem:=(cont2*100/cont);Writeln('A % de mulheres acima de 25anos e ',porcentagem:10:2);readln;END.                               

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

 

Então, eu pensei assim, se a pessoa nao tem a idade necessaria, deveria ser repetido o nome para q outra pessoa seja entrevistada, ja q a anterior nao tem a idade suficiente, nao achei muito sentido repetir só a idade

Faz sentido. Mas tem um porém, pois existem duas validações: a) se a idade é válida, algo como como "maior igual a zero" (e menor que 100, 150? sem máxima?) B) se é a "esperada", ou seja, se é maior que 15.

 

O seu código estará se comportando como "se digitou algo errado, vai ter que tudo do início". Daí tem que ver se deixa assim mesmo, ou se modifica para "se digitou algo errado, ler apenas o que está errado". Percebe a diferença?

Veja o enunciado:
 

Para os campos idade e sexo, é necessário realizar a validação dos dados digitados
sexo (só podem ser aceitos caracteres 'M' ou 'F')

 

Ou seja, precisa garantir que seja "M" ou "F". Sendo que OS DOIS SÃO VÁLIDOS, logo, o repeat deverá aceitar os dois. Mas o programa só vai "calcular" para o "F".

 

Obs.: Na hora de calcular a porcentagem, tem que verificar antes se "cont" é diferente de zero!!! (mesmo que venha a "ter certeza" que não vai ser).

 

No aguardo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.

 

Faz sentido. Mas tem um porém, pois existem duas validações: a) se a idade é válida, algo como como "maior igual a zero" (e menor que 100, 150? sem máxima?) B) se é a "esperada", ou seja, se é maior que 15.

 

O seu código estará se comportando como "se digitou algo errado, vai ter que tudo do início". Daí tem que ver se deixa assim mesmo, ou se modifica para "se digitou algo errado, ler apenas o que está errado". Percebe a diferença?

Veja o enunciado:

 

 

Ou seja, precisa garantir que seja "M" ou "F". Sendo que OS DOIS SÃO VÁLIDOS, logo, o repeat deverá aceitar os dois. Mas o programa só vai "calcular" para o "F".

 

Obs.: Na hora de calcular a porcentagem, tem que verificar antes se "cont" é diferente de zero!!! (mesmo que venha a "ter certeza" que não vai ser).

 

No aguardo.

Então, fiz algumas mudanças pensando que a  pessoa errou ao digitar, nao forçando ela a reiniciar o programa. também fiz algumas outras mudanças conforme você falou.

 

  1. PROGRAM medmulh;var  nomedoaluno     :string;  sexo,continuar  :char;  idade,cont,cont2:integer;  porcentagem     :real;BEGINcont:=0;cont2:=0;repeat    writeln('Digite seu nome');    readln(nomedoaluno);    repeat    writeln('Digite a idade. Apenas idade maior igual a 15');    readln(idade);  until (idade>=15) and (idade<=120);  repeat  writeln('Digite seu sexo M ou F');  readln(sexo);  sexo:= upcase(sexo);  until (sexo='F') or (sexo='M'); if sexo='F' then    cont:=cont+1; if idade>=25 then    cont2:=cont2+1;  writeln('Deseja continuar? S ou N');  readln(continuar);  continuar:= upcase(continuar);until continuar=('N');if cont=0 then   writeln('Nenhuma mulher entrevistada')elsebeginwriteln('O numero de mulheres entrevistadas acima de 25 anos e ',cont2);porcentagem:=(cont2*100/cont);Writeln('A % de mulheres acima de 25anos e ',porcentagem:10:2,'%');end;readln;END.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.
 

PROGRAM medmulh;var  nomedoaluno     :string;  sexo,continuar  :char;  idade,cont,cont2:integer;  porcentagem     :real;BEGINcont:=0;cont2:=0;repeat  writeln('Digite seu nome');  readln(nomedoaluno);  repeat    writeln('Digite a idade. Apenas idade maior igual a 15');    readln(idade);  until (idade>=15) and (idade<=120);  repeat    writeln('Digite seu sexo M ou F');    readln(sexo);    sexo:= upcase(sexo);  until (sexo='F') or (sexo='M');  if sexo='F' then    cont:=cont+1;  if idade>=25 then //aqui está contando mesmo se não for feminino    cont2:=cont2+1;  writeln('Deseja continuar? S ou N');  readln(continuar);  continuar:= upcase(continuar);until continuar=('N');if cont=0 then  writeln('Nenhuma mulher entrevistada')else  begin  writeln('O numero de mulheres entrevistadas acima de 25 anos e ',cont2);  porcentagem:=(cont2*100/cont);  writeln('A % de mulheres acima de 25anos e ',porcentagem:10:2,'%'); //sugiro formatar com :0:2 (para que 10 espaços?)  end;readln;END.

No aguardo.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
PROGRAM medmulh;var  nomedoaluno     :string;  sexo,continuar  :char;  idade,cont,cont2:integer;  porcentagem     :real;BEGINcont:=0;cont2:=0;repeat  writeln('Digite seu nome');  readln(nomedoaluno);  repeat    writeln('Digite a idade. Apenas idade maior igual a 15');    readln(idade);  until (idade>=15) and (idade<=120);  repeat    writeln('Digite seu sexo M ou F');    readln(sexo);    sexo:= upcase(sexo);  until (sexo='F') or (sexo='M');  if sexo='F' then    cont:=cont+1;  if (idade>=25) and (sexo='F') then    cont2:=cont2+1;  writeln('Deseja continuar? S ou N');  readln(continuar);  continuar:= upcase(continuar);until continuar=('N');if cont=0 then  writeln('Nenhuma mulher entrevistada')else  begin  writeln('O numero de mulheres entrevistadas acima de 25 anos e ',cont2);  porcentagem:=(cont2*100/cont);  writeln('A % de mulheres acima de 25anos e ',porcentagem:0:2,'%');   end;readln;END.

Ae, concertei

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá.
 
Show! Por mim tá ótimo! daí em diante só para "melhorias". :)
 
 
 
 
Para complementar, alguns outros ponto extras:
 
1) Poderia utilizar nomenclaturas de variáveis mais sugestivas, ex.:
 
De cont para contF:
De cont2 para contF25.
 
 
2) A título de curiosidade, dá para fazer o cálculo direto no wirte, ex.:
 

  writeln('A % de mulheres acima de 25anos e ',cont2*100/cont:0:2,'%');

ou para ficar mais "formal", com os parênteses:

  writeln('A % de mulheres acima de 25anos e ',(cont2*100/cont):0:2,'%');

Obs.: Talvez não seja preciso essa % no final, pois já está sendo informado no texto... ou seja, "a porcentagem de mulheres é 30", e não "30%". Veja, foco isso como detalhe linguístico (como opinião, é claro). Apenas para refletir...
 
 
 
3) Parei para analisar e acabei criando algumas sugestões.
Abaixo fiz umas modificações no seu código APENAS PARA DEMONSTRAR OUTROS CONCEITOS. A ideia é para analisar e quem sabe assimilar e aproveitar. (seu código está bom. Aproveitei para demonstrar que dá para ir evoluindo - ir além)
 



PROGRAM medMulh;uses  CRT; //biblioteca com comandos/funções/etc extrasvar  //DADOS DO ALUNO  nome  :string;  //nome do aluno  sexo  :char;    //sexo  idade :integer; //idade    //DADOS PARA APURAÇÃO  contT,              //total de alunos cadastrados  contF,             //contador de mulheres  contF25  :integer; //contador de mulheres com mais de 25 anos  porcF25  :real;    //porcentagem de mulheres com mais de 25 anos (em relação as mulheres com mais de 15 anos)    //AUXILIARES  continuar :char;   //usado para confirmações  IOR :byte; //armazenar Resultado da operação de entrada e saida (I/O = Input/Output)  / byte=0 a 255 (que pode ser usado na idade)(*Obs.: Essa estrutura abaixo é relativamente avançada. Não precisa se preocupar em enteder ou mesmo colocar em uso (tipo, o professor tem que autorizar). É bem simples. Onde for chamado o comando, será executado tudo que tem dentro dele. Seria o mesmo que copiar essas linhas de dentro, e colocar no lugar... Dentro do programa tem os exemplos...*)   //PROCEDIMENTO PARA LIMPAR MENSAGEM APÓS ERRO (E DEIXAR A RELEITURA LIMPA) procedure LimpaMensagem;  begin  ReadKey; //function que retorna a tecla pressionada (usado aqui para servi como um "pause"  GotoXY(1,WhereY-1); //posiciona na linha anterior (mensagem)  ClrEol; //apaga a linha a partir do cursor (já que está na coluna 1, apaga a linha toda)  GotoXY(1,WhereY-1); //posicionada mais uma linha acima, linha da "pergunta"  ClrEol; //apaga a linha a partir do cursor (no caso servindo para limpar a linha toda, antes de ser reescrita. Sem isso, a resposta ficará escrita no lado  end;               BEGINTextColor(White);  //cor do texto. White=15, que representa o branco. (acho que as cores vão de 0 a 15)TextBackGround(1); //cor do fundo ao escrever. Blue=1, representa o azul.ClrScr; //limpar a tela  (pertece a CRT)contF:=0; //de certo modo não precisa, pois no Begin principal, o Pascal já zera as variáveis, mas é bom acostumar, pois em "procedimentos" não ocorre isso. (outras linguagens obriga zerar tb, etc)contF25:=0; repeat  ClrScr;  writeln;  writeln(' *** BEM VINDO  ***');  writeln;  writeln;  write('NOME DO ALUNO : '); readln(nome);   //não precisa fica no lado, apenas subi o readln para ficar visualmente mais claro que vai ficar no lado a leitura  repeat    write('IDADE         : '); {$I-}readln(idade);{$I-} //$I = diretiva de I/O. O "-" desativa, o "+" ativa (mais ou menos isso);  (ativo = travar quando dá erro)    IOR:=IOResult; //function que retorna o código do resultado da última operação de I/O.     if IOR<>0 then //0 = "tudo certo", logo, se for diferente, deu alguma ***** no processo...      begin      writeln('ERRO ',IOR,' - idade invalida. Digite apenas numeros');              //de certo modo, poderia remover esse if todo... apenas usado para "tratar o possível erro", ou seja, além de não travar, avisa que tem algo errado.             //cada código representa um erro, ao digitar letras deu aqui 106 (acho que é Type Mismatch" - tipo incompatível). Isso travaria o programa!             LimpaMensagem; //chama a procedure que foi criada      end    else       if (idade<15) then        begin        TextColor(Yellow); //Yellow=14        writeln('Estrando, alunos sao maiores de 15 anos. Cadastra isso direito!');        TextColor(White);        {LimpaMensagem;} //aqui tb chamo o comando. Mas apenas deixe o conteúdo dela abaixo para exemplificar que seria a mesma coisa, ou seja, em vez desses comandos todos, poderia deixar só o comando. Entende?        ReadKey; //function que retorna a tecla pressionada (usado aqui para servi como um "pause")        GotoXY(1,WhereY-1);        ClrEol;        GotoXY(1,WhereY-1);        ClrEol;        end      else        if (idade>120) then          writeln('Leva essa coroa pro Guinness, rs');  until (idade>=15) and (idade<=120);  repeat    write('SEXO  (M ou F): '); readln(sexo);    sexo:=UpCase(sexo);    //aqui deixei sem aquele efeito de "exibir mensagem e apagar depois", veja a diferença na execução  until (sexo in ['F','M']);  contT:=contT+1;    if sexo='F' then    contF:=contF+1;  if (idade>=25) and (sexo='F') then    inc(contF25); //acho que dá para deduzir o que a procedure inc() faz... existe tb o comando "dec()".    writeln('Deseja continuar? S ou N');  readln(continuar);  continuar:= UpCase(continuar);until continuar=('N');TextColor(Yellow);writeln('Pressione qualquer tecla para exibir o resultado final');TextColor(White);ReadKey;ClrScr;writeln;if contF=0 then  writeln('Nenhuma mulher entrevistada')else  begin  writeln('O numero de mulheres entrevistadas acima de 25 anos e ',contF25);  writeln('A % de mulheres acima de 25 anos é ',contF25*100/contF:0:2);   end;readln;END.

4) Lembrando, o código é apenas para exemplificar conceitos... Mas se tiver interesse, podemos ir passar maiores explicações e tentar também outras ideias... um exemplo legal seria exibir as todas as "perguntas" e depois ir lendo... ex.:

 

 

 *** BEM VINDO  ***


NOME DO ALUNO :
IDADE         :
SEXO  (M ou F):   
 

 

Ai o "cursor" pularia para onde ficaria o nome... ao digitar, ficaria algo assim:

 *** BEM VINDO  ***NOME DO ALUNO : Maria JoaquinaIDADE         :     <--após o ENTER, ir para aqui!SEXO  (M ou F): 

Tá entendo?

 

 

Então, eu sei que extrapolei a proposta da postagem, tô apenas tentado demonstrar como pode ser ainda mais interessante o desenvolvimento e abrindo a imaginação.

 

Qualquer coisa é só postar!

 

 

No aguardo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Show! Muito bacana como você deixou o programa, ficou bem avançado, muitos comandos ai eu ainda nem vi. 

 

 

Sobre o procedure,  tive aula sobre ele essa semana, os comandos que você usou nele eu nao conheço nenhum hahaha.

Sobre mudar cor do fundo e das letras, eu nao conhecia esse comando também e é bem simples e fácil de usar.

IOR :byte; //armazenar Resultado da operação de entrada e saida (I/O = Input/Output)  / byte=0 a 255 (que pode ser usado na idade)
 write('IDADE         : '); {$I-}readln(idade);{$I-} //$I = diretiva de I/O. O "-" desativa, o "+" ativa (mais ou menos isso);  (ativo = travar quando dá erro)    IOR:=IOResult; //function que retorna o código do resultado da última operação de I/O.                              

byte também n ta no meu repertorio, não entendi muito como usar uma variavel deste tipo. Por padrão o programa ja travaria se eu colocasse letras na variavel de idade, se fosse {$I+} continuaria travando certo? {$I-} usando esse codigo ele nao trava.  IOR:=IOResult , aqui a variavel ta recebendo que o programa travou ou não, logo precisou exibir uma mensagem?

E  se a variavel nao fosse IOR, fosse AAA por ex,  eu nao usaria {$I-}, e sim {$A-}?

inc(contF25)

ele acrescenta +1 na variavel ne? dec acrescentaria 10?

 until (sexo in ['F','M']);

esse in tambem nao conhecia, deu uma boa encurtada no comando q antes tava (sexo='F') or (sexo='M');

 

 

Eu fui rodar seu programa usando o programa simples e deu alguns erros, ai abri como programa e rodou, deve por causa de algumas funçoes + avançadas ne?

 

 

E sobre primeiro dar as perguntas e depois ir colocando todas as respostas, como faria isso?

4) Lembrando, o código é apenas para exemplificar conceitos... Mas se tiver interesse, podemos ir passar maiores explicações e tentar também outras ideias... um exemplo legal seria exibir as todas as "perguntas" e depois ir lendo... ex.:

 

Citar

 

 *** BEM VINDO  ***


NOME DO ALUNO :
IDADE         :
SEXO  (M ou F):   
 

 

Ai o "cursor" pularia para onde ficaria o nome... ao digitar, ficaria algo assim:

*** BEM VINDO ***


NOME DO ALUNO : Maria Joaquina
IDADE : <--após o ENTER, ir para aqui!
SEXO (M ou F):

Tá entendo?

 

 

 

 

valeu pela ajuda, muito show. Terça agora tenho prova de comp, estruturas de repetição, estruturas condicionais, e sub-rotinas, vamo q vamo. So fico um pouco na duvida sobre quando colocar o var no  procedure, com o var usara o valor obitido pro restante da  função , sem o var, ele so fica na procedure ne, 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá
 
 

Sobre o procedure,  tive aula sobre ele essa semana, os comandos que você usou nele eu nao conheço nenhum hahaha.

Os comandos usados em si não tem nada a ver... o uso de procedure foi basicamente para "facilitar o reuso". Um exemplo:

procedure aguardarEnter;  begin  writeln('Pressione ENTER para continuar');  readln;  end;

Daí, no programa chamaria somente o aguardarEnter;, seria o mesmo que essas duas linhas tivessem lá onde o comando foi chamado. Nesse contexto, a procedure facilitará em:
- evitar repetição de texto: posso utilizar o comando quantas vezes quiser, e não precisará colocar linha por linha onde usaria.
- facilidade para edição: basta mudar na procedure. Sem ela, teria que ir no código procurar e mudar linha por linha.
- organização: pode deixar o código fica mais organizado.
- etc
 
***
 

byte também n ta no meu repertorio, não entendi muito como usar uma variavel deste tipo.

O byte, assim como o integer ou real, é um "tipo de dado". Cada tipo tem suas características.
 
 
Ex.:
 
Integer: aceita valores de -32768 a 32767. Ocupa 2 bytes da memória;
Real: acho que aceita 15 dígitos, incluído número decimal.. Ocupa 8 bytes;
Byte: vai de 0 a 255. Ocupa 1 byte;
Etc
 
Ou seja, um integer abrange o byte. Da mesma forma que o real abrange os dois. Na prática, poderia usar integer mesmo, o byte é apenas mais preciso (menor desperdício). Uma analogia seria usar um String onde poderia se usar um char, ou seja, a String seria desperdício. Mas também funcionaria.
 
obs.: não sei exatamente a capacidade e tamanho de cada um... mais seria mais ou menos isso. E também varia em alguns compiladores... (incluindo entre arquiteturas 16, 32 e 64bits)
 
***
 

Por padrão o programa ja travaria se eu colocasse letras na variavel de idade, se fosse {$I+} continuaria travando certo?

Exatamente!!!
 
 

{$I-} usando esse codigo ele nao trava.  IOR:=IOResult , aqui a variavel ta recebendo que o programa travou ou não, logo precisou exibir uma mensagem?
E  se a variavel nao fosse IOR, fosse AAA por ex,  eu nao usaria {$I-}, e sim {$A-}?

Isso. A "diretiva" {$I-} serve para mudar a configuração, ou seja, passando a deixar de travar caso haja erro de I/O.
IOResult é uma function. O que é um function? Exatamente a mesma coisa que uma procedure, só muda que ela ao mesmo tempo retorna um valor nela mesma, ou seja, como se fosse uma variável.
Exemplos de function:
 
UpCase(); //retorna o "char" correspondente em maiúsculo que foi passado
sqrt(); //raiz do número passado
sqr(); //quadrado do número passado
ReadKey; //tecla digitada
IOResult; //código do resultado da última operação de entrada e saída.
etc
 
Ou seja, "comandos" que além de fazer algo internamente (ou não), retorna algo nela mesma. Como se fosse uma "variável-comando".
 
 

E  se a variavel nao fosse IOR, fosse AAA por ex,  eu nao usaria {$I-}, e sim {$A-}?

Não!! IOR foi uma variável declarada por mim. Nada mais que isso. Como já sugerido, byte poderia ser trocado por integer. Criei como IOR, para deixar a nomenclatura mais sugestível. IO = Input/Output=Entrada/Saída  e  R=Result=Resultado. Mas o nome poderia ser qualquer outro.
 
 
Lembra que o IOResult é uma function? e o que elas fazem? "retornam algo"! Daí, utilizei de uma variável qualquer, que é compatível com o que o IOResult retorna (um byte - valores de 0 a 255), e armazenei nele!
 
Veja o exemplo:

if IOResult<>0 then   writeln('Deu um erro ai meu jovem');

Nesse caso, o IOResult é executado. Ele retorna um valor de 0 a 255 nele... vai se comportar no if como se fosse uma variável. Só que nesse caso, eu perderei o valor que saiu do IOResult, e não poderia usar depois!. Se chamar o IOResult novamente, ele poderá retornar outro valor, logo, no programa foi usado uma variável para armazenar antes...
 
 
***
 

Eu fui rodar seu programa usando o programa simples e deu alguns erros, ai abri como programa e rodou, deve por causa de algumas funçoes + avançadas ne?

Qual o compilador que você usa. A princípio recomendo usar o mesmo usado no curso. Em fim, poderíamos analisar qual erro deu e tentar corrigir...
 
 

E sobre primeiro dar as perguntas e depois ir colocando todas as respostas, como faria isso?

 
 
Primeiro imprime os dados de leitura de uma vez (em vez de perguntar, depois ler, perguntar, depois ler). Depois dá um GotoXY() antes de dar o readln correspondente. Os write vão exibir o layout, certo. daí quando for ler por exemplo o nome, antes de dar o readln(nome); Dá um GotoXY() para posição correspondente onde o texto deve ir saindo quando for digitando. Depois dá um novo GotoXY() para um próximo, readln(idade), ai o texto do teclado vai ser exibido no lugar correspondente... por ai vai..
 
Se for tentar implementar, tente ir testando digitando sempre os valores sem erros. Deixe para tratar os possíveis erros depois!!! Pois, ao digitar errado, pode bagunçar a tela toda. :)
 
PS: para achar a posição,
 

 

So fico um pouco na duvida sobre quando colocar o var no  procedure, com o var usara o valor obitido pro restante da  função , sem o var, ele so fica na procedure ne,

 
com o var = vai como referência
sem o var = vai como valor
 
No primeiro, é como se a própria variável estivesse no programa, ou seja, a variável que está sendo usada no parâmetro do procedimento, meio que vai apontar para a mesma variável que foi passada no parâmetro. Tudo que fiz na variável da procedure, vai mudar na variável que foi passada.
 
Já no segundo, a variável do procedimento vai fazer uma cópia do VALOR que está na variável que está passada, logo a variável de origem fica intacta.
 
Ex.:
No writeln ele vai pegar os textos ou valores que estão no parâmetro e vai jogar na tela. Vai ser alterado alguma coisa nessas variáveis e que precisariam ser salvas? não, logo, a variável* que foi declara na procedure writeln ficam SEM O VAR. O que importa é somente os valores... e não a variável em si. O mesmo vale para o readln, GotoXY, sqrt, sqr, upcase etc.
 
Já no inc() e dec(), por exemplo, eles estão pegando recebendo uma variável e estão alterando o valor dela, ou seja, tem que ter o VAR para "salvar" essa alteração!!!
 
 
OBSERVAÇÃO IMPORTANTE
As variáveis dos procedimentos são independentes das variáveis Globais. Inclusive podem ter o mesmo nome. Ex.;
 

procedure imprime3vezes(texto :string);  begin  writeln(texto);  writeln(texto);  writeln(texto);  end;

Eu poderia ter uma variável de nomenclatura também como texto lá no VAR do início do programa (das variáveis globais). Daí no meio do programa eu uso assim:
 
 

imprime3vezes(texto);

Esse texto ai é da variável do programa!!! que vai passar o seu VALOR (conteúdo) para variável da procedure, que coincidente também tem nomenclatura texto. Não existe correlação entre um nome e outro. São independente.
 
Eu poderia usar assim:

imprime3vezes(meuTexto);imprime3vezes(aaaa);imprime3vezes(texto); //essa variável não é a mesma que foi declarada lá na procedure!!! Muita gente se confunde com isso!!!!!imprime3vezes('Forum do Clube do Hardware');  //aqui passando um texto sem variável

 
Por ai vai.


No aguardo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito bom, entendi sobre o byte,  mesma coisa que o integer, só que com um tamanho diferente.

 

Fui fazer soltando todas as perguntas e depois as respostas, mas acabei nao curtindo muito, preferi  uma pergunta de cada vez, acho q fica melhor.

 

Sobre o IOResult, acho q peguei como funciona, fiz uns testes aqui e deu certo.

 

 

 

furlantx500 tx, em 22 Ago 2015 - 22:26, disse:snapback.png

Eu fui rodar seu programa usando o programa simples e deu alguns erros, ai abri como programa e rodou, deve por causa de algumas funçoes + avançadas ne?

Qual o compilador que você usa. A princípio recomendo usar o mesmo usado no curso. Em fim, poderíamos analisar qual erro deu e tentar corrigir...

 

 

Nas aulas de comp usamos o Delphi XE7 , mas por ser pago , o prefessor recomendou baixar o Lazarus.  Quando abri um projeto no lazarus pela opção 'programa simples' e rodei seu programa, ele acusou erro na função IOResult, mas quando abri um projeto 'programa', e rodei o seu, foi de boa!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×