Jump to content
speedofthesea

Duvidas de Iniciante, Média de 6 numeros

Recommended Posts

speedofthesea

Boas , recentemente tenho estado a ler umas coisas, a ver se gostava de programar e decidi aprender pascal.

Já exprimentei programar em BASIC e gostei e por isso decidi avançar para pascal já que, segundo li por ai é uma linguagem que é ensinada nas universidades como introdução á programação.

Isto tudo porque queria ver se é programação(Eng Informática) que quero seguir.

Ora, comecei por ler alguns pdf e assim para alem de alguns exercícios de algoritmos e dai fiz o meu primeiro programa em pascal.

A media de 6 numeros.

Program media;
Var
N1,N2,N3,N4,N5,N6 :Real;
M : Real;
Begin
     Writeln('Escreva o primeiro valor');
     Readln(N1);
     Writeln('Escreva o segundo valor');
     Readln(N2);
     Writeln('Escreva o terceiro valor');
     Readln(N3);
     Writeln('Escreva o quarto valor');
     Readln(N4);
     Writeln('Escreva o quinto valor');
     Readln(N5);
     Writeln('Escreva o sexto valor');
     Readln(N6);
     M:=(N1+N2+N3+N4+N5+N6)/6;
     Writeln('A media e de:');
     Writeln(M);
     Readln();
End.

A minha duvida é como torno o resultado em numeros decimais (3.5) em vez de notação cientifica.

Obrigado.

Share this post


Link to post
Share on other sites
Lfscoutinho

Boas,

Não tenho a certeza, já estudei disso à muito tempo, mas acho que é o seguinte que queres:

Writeln(M:2:2);

Share this post


Link to post
Share on other sites
thoga31

O método indicado é o correcto.

Para arredondar, precisas de indicar dois parâmetros: o espaço mínimo ocupado e o arredondamento.

valor:espaço_mínimo:arredondamento

Por exemplo,

writeln(M:10:1);

Vai devolver algo como -------3.8, sendo os "-" espaços. Ou seja, o valor M ocupa no mínimo 10 "espaços", os não necessários ficam ao início como espaços em branco, e o arredondamento é de 1 casa decimal.

Contudo, se não quiseres espaço mínimo, defines esse parâmetro a zero, isto porque, no caso de o espaço definido não for suficiente para albergar o valor numérico resultante, o programa toma a "liberdade" de "criar" espaços "extra".

Por isso, uma formatação básica para arredondamento é:

valor:0:arredondamento

No teu caso:

writeln(M:0:1);

O output resultante será algo como, por exemplo, 3.6 (como zero espaços não chegam para albergar o valor numérico M, o programa "criou" os espaços "extra" necessários - três).

Espero ter ajudado. :D

Cumpz, Thoga31.

P.S. - és iniciante? se quiseres um tutorial do P@P: http://wiki.portugal-a-programar.org/pascal:tutorial_2010:indice

sobre o assunto que tratei agora: http://wiki.portugal-a-programar.org/pascal:tutorial_2010:parte_1#arredondamentos

:thumbsup:


Knowledge is free!

Share this post


Link to post
Share on other sites
thoga31

Obrigadissimo, ja consegui.

Azelhisse de iniciante.

Iniciante de programação não é azelha, é aventureiro! :D

Ainda bem que já conseguiste.

Cumpz. :thumbsup:


Knowledge is free!

Share this post


Link to post
Share on other sites
amando96

Usando um for loop dava para diminuir o número de linhas consideravelmente.


FACEPALMMOVLW PALMMOVWF FACE

Share this post


Link to post
Share on other sites
thoga31

Usando um for loop dava para diminuir o número de linhas consideravelmente.

Ok, dava. Mas para um iniciante, fazer o que ele fez sem um ciclo for é normal. :D

Já agora, a solução com ciclo for, deixo-a de livre vontade: :thumbsup:

program media;
uses crt;
var n : array[1..6] of real;
    media : real;
    i : 0..6;

begin
     for i:=1 to 6 do begin
         write('Escreva ',i,'o valor: ');
         readln(n[i]);
         media:=media+n[i];
     end;
     media:=media/6;
     writeln;
     writeln('A media e: ',media:0:1);
     readln;
end.


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

         media+=n[i];

Thoga, em que compilador é que andas a trabalhar pá?

Ou eu ando muito desactualizado, ou então andamos os dois a beber uns canecos a mais... :thumbsup:

Não seria mais:

         inc(media,n[i]);

Há algum de pascal que permita usar a expressão '+='?


"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.

Share this post


Link to post
Share on other sites
thoga31

Thoga, em que compilador é que andas a trabalhar pá?

Ou eu ando muito desactualizado, ou então andamos os dois a beber uns canecos a mais... :D

Não seria mais:

         inc(media,n[i]);

Há algum de pascal que permita usar a expressão '+='?

Eu utilizo o Dev-Pascal. Em Compiler Options > Pascal compiler, tens uma que diz assim:

Support operators like C (*=, +=, ...)

Se escolheres o Free Pascal como Current Compiler, nem será necessária essa opção seleccionada! :D

Eu nem conhecia o procedimento inc(). :thumbsup:

Cumpz. :thumbsup:

EDIT:

vou editar o código para o colocar segundo o "modelo tradicional": media := media+n; :D


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

LOLOL

Eu bem me parecia que aquilo vinha do C... Não sabia que o DEV tinha essa possibilidade.  :thumbsup:


"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.

Share this post


Link to post
Share on other sites
thoga31

LOLOL

Eu bem me parecia que aquilo vinha do C... Não sabia que o DEV tinha essa possibilidade.  :thumbsup:

Por algumas razões adoro o Dev ao invés de outros. Além de operadores tipo C, pode-se alterar a variável de controlo dentro de um ciclo FOR, coisa que o Free Pascal começa logo a apontar... :D


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

Pessoalmente não gosto do Dev, mas não há duvida que essas características são intessantes...

Mas, a nível de programação, quem me tinha o delphi... lol


"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.

Share this post


Link to post
Share on other sites
thoga31

Mas, a nível de programação, quem me tinha o delphi... lol

Lol, estou curioso quanto ao delphi, mas nunca o instalei. Também é pago :thumbsup: , e eu não sou a favor da pirataria. :nono:


Knowledge is free!

Share this post


Link to post
Share on other sites
Lfscoutinho

Boas,

Curiosamente, eu também nunca tinha ouvido falar no inc(). Isso é mesmo o quê ? Incrementar !?

Share this post


Link to post
Share on other sites
thoga31

Boas,

Curiosamente, eu também nunca tinha ouvido falar no inc(). Isso é mesmo o quê ? Incrementar !?

Yah! De certeza que é inspirado no inc do assembly.


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

Lol, estou curioso quanto ao delphi, mas nunca o instalei. Também é pago :thumbsup: , e eu não sou a favor da pirataria. :nono:

Procura o Delphi 7 PE.

É gratuito, e embora já acuse um pouco os anos e seja uma versão limitada a nível de componentes já incluidos, continua a ser a versão do Delphi mais usada até hoje...

É muito bom!


"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.

Share this post


Link to post
Share on other sites
nunopicado

Boas,

Curiosamente, eu também nunca tinha ouvido falar no inc(). Isso é mesmo o quê ? Incrementar !?

Sim. Há dois procedimentos:

INC

inc(x);  // incrementa a variável X em 1, ou seja, x:=x+1;
inc(x,7); // incrementa a variável X com o valor passado no segundo parâmetro, neste caso, x:=x+7;

e o DEC, que é exactamente igual no uso, mas em vez de + é -


"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.

Share this post


Link to post
Share on other sites
speedofthesea

Surgiu-me duas duvidas se me poderem esclarecer.

1. é possivel usar dois ou mais procedure no mesmo programa , correcto?

2. Queria tambem saber o porque do user thoga usar :

 readln(n[i]);
         media:=media+n[i];

Mais própriamente o porque do n[1].

Cumps

Share this post


Link to post
Share on other sites
Lfscoutinho

Boas,

Porque ele usou um array. O "i" é a chave do array (1, 2, 3...).

Se bem que neste caso, não era necessário utilizar um array...

Share this post


Link to post
Share on other sites
nunopicado

Sim, neste caso, visto que os números só são precisos mesmo para fazer a média, e nenhum deles vai ser usado depois, pode-se fazer simplesmente assim:

program media;
var 
   Valor,Resultado:real;
    i:1..6;
begin
     Resultado:=0;
     for i:=1 to 6 do 
     begin
         write('Escreva ',i,'o valor: ');
         readln(Valor);
         Resultado:=Resultado+valor;
     end;
     Resultado:=Resultado/6;
     writeln;
     writeln('A media e: ',Resultado:0:1);
     readln;
end.


"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.

Share this post


Link to post
Share on other sites
thoga31

Boas!

Eu decidi fazer o "caso geral" próprio de iniciante: fazer os "passinhos" todos, e aproveitei para introduzir a conjugação ciclo for - array :confused:


Knowledge is free!

Share this post


Link to post
Share on other sites
nunopicado

E fizeste bem, é melhor prática de programação do que não o usar... :D Mas resolvi mostrar como se faria no caso mencionado pelo Lfscoutinho...

:confused:


"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.

Share this post


Link to post
Share on other sites
speedofthesea

Bem, não sei se deveria criar um novo tópico mas aqui vai:

tenho seguido o tutorial que me recomendaram e fiz um exercício que era criar um programa no qual era pedido por meio de um formulário o nome, nota de português e nota de matemática dos alunos de uma turma dando no fim a media de notas da turma e o nome das pessoas que eram admitidas a exame. Fiz o programa  e a coisa até correu bem. Quando estava a fazer o programa por acaso adicionei mais um campo ao formulário, o numero de cada aluno.

Ora a questão que surgiu  foi como impedir que o utilizador insira um numero de aluno repetido.

aqui fica o código :

program exame;
type reg = record
     Numero : 1..30;
     Nome : String;
     NPT : Real;
     NMAT : Real;
     end;
var
F : Array [1..30] of reg;
i : integer;
p : integer;
mM : real;
mP : real;
nM : real;
nP : real;
begin
     i:=1;
     nP:=0;
     nM:=0;
     Repeat
     Writeln('Quantos alunos tem a turma? Maximo de 30 alunos');
     Readln(p);
     //Verificação do numero de alunos
     If p>30 then writeln('Erro no numero de alunos.');
     If p<0 then Writeln('O numero de alunos não pode ser negativo.');
     Until (p<=30) and (p>=0);
     // formulário  com ciclo for
     for i:=1 to p do begin
     Writeln('A fazer o ',i,'º registo');
     Writeln;
     Write('Numero:');Readln(F[i].Numero);
     Writeln;
     Write('Nome:');Readln(F[i].Nome);
     Writeln;
     Repeat
     Write('Nota Protuguês:');Readln(F[i].NPT);
     Writeln;
     If  (F[i].NPT>20) or (F[i].NPT<0) then Writeln('Erro de classificação');
     Until (F[i].NPT>=0) and (F[i].NPT<=20);
     Repeat
     Write('Nota de Matemática:');Readln(F[i].NMAT);
     If  (F[i].NMAT>20) or (F[i].NMAT<0) then Writeln('Erro de classificação');
     Until (F[i].NMAT>=0) and (F[i].NMAT<=20);
     //Condições
     If F[i].NPT>9.5 then writeln('Admitido a exame de Portugês.') else
     writeln('Não Admitido a exame de Português.');
     Writeln('e');
     If F[i].NMAT>9.5 then writeln('Admitido a exame de Matemática.') else
     writeln('Não admitido a exame de Matemática');
     mP:=nP+F[i].NPT;
     mM:=nM+F[i].NMAT;
     end;
     // média
     Writeln('Média de Portuges: ',mP/p :0:2);
     Writeln('Média de Matemática: ',mM/p :0:2);
     Writeln;
     // Alunos admitdos
     Writeln('Nome dos alunos admitidos a exame de Portugues:');
     for i:=1 to p do begin
     If F[i].NPT>9.5 then Writeln(F[i].Nome);
     end;
     Writeln('Nome dos alunos admitidos a exame de Matematica:');
     for i:=1 to p do begin
      If F[i].NMAT>9.5 then Writeln(F[i].Nome);
     end;
     Readln;
end.

 

E ja agora se não for pedir muito como optimizar este código.

Cumps e Obrigado

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.