Firewall Posted August 27, 2012 at 02:48 PM Report Share #473668 Posted August 27, 2012 at 02:48 PM (edited) Olá a todos estou com um pequeno problema, em um exercício '-' 1) Criar um algoritmo, sem usar o recurso de vetor, aplicando a estrutura de repetição com variável de controle com pre-teste, que cadastre até no máximo 5 nomes de carros e armazene em variáveis. O operador deverá informar quantos carros ele pretende cadastrar. Apos o termino do cadastramento o algoritmo devera limpar a tela e listar somente o primeiro e o ultimo carro cadastrado. Informações Retiradas: -Fazer estrutura de Pré-Teste(no caso usei o while) -Não Precisa usar vetor -Informar quantos carros quer cadastrar -Cadastrar no Maximo 5 Carros -Limpar a tela ao final -Ao termino mostrar o primeiro e o ultimo carro cadastrado ai eu fiz deste modo: Program Exercicio1; Uses crt; var carro1 : String; carro2 : String; carro3 : String; carro4 : String; carro5 : String; operador : integer; contador : integer; Begin clrscr; contador:=1; writeln('Digite Quantos Carros Quer Cadastrar! MAX: 5 Carros'); readln(operador); if (operador > 5) then begin exit; end; while (operador <= 5) do begin if (operador = 1) then begin writeln('Digite o Carro numero 1'); readln(carro1); end; if (operador = 2) then begin writeln('Digite o Carro numero 2'); readln(carro2); end; if (operador = 3) then begin writeln('Digite o Carro numero 3'); readln(carro3); end; if (operador = 4) then begin writeln('Digite o Carro numero 4'); readln(carro4); end; if (operador = 5) then begin writeln('Digite o Carro numero 5'); readln(carro5); end; contador := contador +1; end; End. Agora vem o ponto, se eu quiser cadastrar 3 carros ai aconteçe que, Quando eu entro no while ele invez de ir no if 1, 2 e ai ir pro 3, ele vai direto pro 3. e ai como podemos resolver isto? e tambem quero saber como podemos saber qual foi o primeiro e o ultimo carro cadastrado. @OBS: ta meio desorganizado, porque noa consegui por o CODE em pascal ( caso alguém saiba me explica, não acostumei com o fórum novo =) ) ( ja corrigi, besteira minha) @obs2: sou brasileiro, entao desculpe se por algum acaso nao entenderem oque eu escrevi. @obs3: ta em alguns locais sem edentação(ou edentação errada), eu arrumava e o CODE desarumava --' ah raiva '-' Edited August 27, 2012 at 02:54 PM by Firewall Link to comment Share on other sites More sharing options...
nunopicado Posted August 27, 2012 at 03:51 PM Report Share #473676 Posted August 27, 2012 at 03:51 PM Boa tarde Antes de mais, parabéns por teres tentado resolver por ti, e não vir aqui só despejar o exercicio à espera que outros resolvam. Em segundo, o problema da indentação é conhecido e está a tentar solucionar-se. Enquanto não está resolvido, podes usar o editor simples (botão no canto superior esquerdo do editor), onde a indentação funciona perfeitamente (embora percas outras caracteristicas menos importantes do editor). Em terceiro, o facto de seres brasileiro não me faz diferença (falo por mim 🙂 ) - falamos todos português, com uma ou outra expressão diferente, mas chega-se lá! 😉 Quanto ao teu problema: Leste para a variavel "operador" o numero de carros que o utilizador quer inserir. Ora, esse variável terá de ficar imutável durante todo o programa, para saberes a cada momento quantos carros o programa deve aceitar. No entanto, dentro do while estás a testar essa variável contra o numero 5, que nessa fase já não faz sentido testar. O numero 5 só é preciso testar quando lê o numero de carros, o que estás a fazer bem. A partir daí, deves comparar o contador com o numero de carros. Ficaria algo como while contador<=operador do begin if contador=1 then begin . . . Assim, ele irá ler primeiro o carro 1 (contador = 1), depois o carro 2 (contador = 2), etc. até que o contador seja igual ao numero de carros inserido (operador). Para depois saberes o primeiro e ultimo carro também é simples. O 1º será o Carro1. O último será o carro equivalente ao Operador, ou seja, se a variavel operador for 3, o ultimo carro é o Carro3. Duas dicas para facilitar - Usa o Case ... Of Em vez de todos aqueles if's, podes usar a estrutura case, que ficaria assim: case contador of 1:begin // Codigo se for 1 end; 2:begin // Codigo se for 2 end; . . . - Usa nomes de variaveis mais explicitos: Se em vez de operador lhe chamares por exemplo NumCarros, ao longo do programa nunca te esquecerás o que tem aquela variável, e torna-se mais facil estruturar mentalmente aquilo que tens de fazer. - Usa constantes Em vez de usares o numero 5 perdido ali no meio do codigo, coloca esse valor como uma constante: const MaxCarros=5; . . . if (operador > MaxCarros) then begin exit; end; Isto dá-te duas vantagens: 1. Dá-te o tal nome explicito para ser facilmente reconhecido no meio do programa 2. Se o professor quiser alterar de repente de 5 para 10 (ou outra coisa qualquer), é só ir ao inicio do programa e alterar o valor da constante. 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. Link to comment Share on other sites More sharing options...
thoga31 Posted August 27, 2012 at 07:50 PM Report Share #473698 Posted August 27, 2012 at 07:50 PM Acrescentando àquilo que o @nunopicado já disse, e bem, eu tenho uma sugestão para optimizar o método de introdução dos carros. Em vez de um contador, aconselhava algo assim: contador := 1; while contador <= operador do begin write('Introduza carro numero ', contador, ': '); case contador of 1 : readln(carro1); 2 : readln(carro2); // etc até "carro5"... end; end; Não precisas de ter uma frase diferente para cada valor de contador já que esta pode ser facilmente alterável com o método que utilizei, e evitei um monte de if then que não são nada bons neste caso. @nunopicado, a questão das constantes é muito boa, mas isso seria útil caso o @Firewall pudesse utilizar Arrays e não variáveis distintas. Cumprimentos. 😉 1 Report Knowledge is free! Link to comment Share on other sites More sharing options...
nunopicado Posted August 27, 2012 at 08:48 PM Report Share #473707 Posted August 27, 2012 at 08:48 PM Por acaso lembrei-me disso, mas estava em trabalho e tive uma chamada para a rua que não podia esperar mais! Thoga: Boas práticas de programação são uteis até para imaginar o código... 🙂 Além disso, neste mesmo caso, as vantagens das constantes são válidas independentemente de serem usados ou não arrays! "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. Link to comment Share on other sites More sharing options...
Firewall Posted August 27, 2012 at 11:43 PM Author Report Share #473741 Posted August 27, 2012 at 11:43 PM (edited) Sem palavras... Ai agente percebe o quanto é vasto os métodos utilizáveis para solucionar um problema. Eu fico indignado como coisas como essas que vocês fazem não me vem na cabeça. Mas é assim só treinando para aprimorar e por fim saber metodos mais sucintos. Mais agora o meu código ficou assim Program Programa01; Uses crt; var carro1 : String; carro2 : String; carro3 : String; carro4 : String; carro5 : String; operador : integer; contador : integer; Begin clrscr; contador := 1; writeln('Digite Quantos Carros quer cadastrar! MAX: 5 Carros'); readln(operador); while contador <= operador do begin write('Introduza carro numero ', contador, ': '); case contador of 1 : readln(carro1); 2 : readln(carro2); 3 : readln(carro3); 4 : readln(carro4); 5 : readln(carro5); end; contador:= contador + 1; end; clrscr; writeln('Primeiro Carro Cadastrado: ',carro1,''); writeln('Ultimo Carro Cadastrado: ',operador,''); readln; End. Como podem ver que no ultimo carro cadastrado ele me retorna o operador no caso o ultimo cadastrado, mas como eu posso fazer, para que ao invez de ele me mostrar só qual foi o numero do ultimo carro cadastrado, me mostrar o nome , ? teria algum modo de eu passar o operador valer o ultimo carro? ( no caso eu iria criar outra variável para guardar este novo valor do operador) Edited August 27, 2012 at 11:48 PM by Firewall Link to comment Share on other sites More sharing options...
thoga31 Posted August 28, 2012 at 12:05 AM Report Share #473743 Posted August 28, 2012 at 12:05 AM Para mostrares o nome, é mais um Case Of... troca estes readln pela tua frase num writeln: case contador of 1 : readln(carro1); 2 : readln(carro2); 3 : readln(carro3); 4 : readln(carro4); 5 : readln(carro5); end; 1 Report Knowledge is free! Link to comment Share on other sites More sharing options...
Firewall Posted August 28, 2012 at 12:30 AM Author Report Share #473744 Posted August 28, 2012 at 12:30 AM Para mostrares o nome, é mais um Case Of... troca estes readln pela tua frase num writeln: case contador of 1 : readln(carro1); 2 : readln(carro2); 3 : readln(carro3); 4 : readln(carro4); 5 : readln(carro5); end; Ehehehe 😁 não olhastes bem, mas não é a variável contador e sim operador, mas entendi oque você queria me passar 👍 e obrigado pela resposta Fast Por Fim, vou deichar o programa pronto , para caso alguém queira olhar, porque o fórum não é de um mas de todos Program Programa01; Uses crt; var carro1 : String; carro2 : String; carro3 : String; carro4 : String; carro5 : String; operador : integer; contador : integer; Begin clrscr; contador := 1; writeln('Digite Quantos Carros quer cadastrar! MAX: 5 Carros'); readln(operador); if (operador > 5) then exit; while contador <= operador do begin write('Introduza carro numero ', contador, ': '); case contador of 1 : readln(carro1); 2 : readln(carro2); 3 : readln(carro3); 4 : readln(carro4); 5 : readln(carro5); end; contador:= contador + 1; end; clrscr; writeln('Primeiro Carro Cadastrado: ',carro1,''); write('Ultimo Carro Cadastrado: '); case operador of 1 : write(carro1); 2 : write(carro2); 3 : write(carro3); 4 : write(carro4); 5 : write(carro5); end; readln; End. 1 Report Link to comment Share on other sites More sharing options...
pwseo Posted August 28, 2012 at 09:30 AM Report Share #473765 Posted August 28, 2012 at 09:30 AM (edited) Firewall, Queria apenas colocar uma questão: é obrigatório não utilizar arrays? Este tipo de problemas são representados na perfeição por uma array de objectos (neste caso carros) -- o código não só ficaria mais pequeno como também mais inteligível. Existe uma diferença entre "não precisar de usar" e "não poder usar" arrays. Se for o caso de não poder usar, então realmente não há nada a fazer. Tenho outras observações, estas relativas ao estilo do código: Os nomes das variáveis deveriam ser diferentes... Eu sei que isto é uma questão pessoal, mas operador não dá nenhuma intuição de que o valor armazenado é o número de carros -- num ou num_carros seria visualmente mais intuitivo. Às variáveis utilizadas como contadores é habitual dar-lhes nomes de uma única letra, começando no i, j, k, e por aí em diante. Quanto à declaração de várias variáveis de um mesmo tipo de dados (como carro1, carro2, ... carro5), podes fazer assim: var carro1, carro2, carro3, carro4, carro5: string; c1, c2, c3, c4, c5: string; { esta versão é mais rápida para se escrever } E por fim, para incrementar uma variável, podes utilizar o procedimento inc assim: contador := contador + 1; inc(contador); { esta linha faz o mesmo que a de cima } inc(contador, 3); { aqui, adicionamos 3 à variável contador } Além disso, a tua variável contador pode ser inicializada directamente no local onde a declaraste, não precisas de o fazer depois no bloco principal. Os programadores têm tendência a adoptar estas convenções e a marcá-las fundo na mente (por exemplo, é mais intuitivo um contador chamar-se i do que contador). Com a prática aperceber-te-ás disto mesmo também. Não estou a criticar o teu estilo de código, e espero que não me leves a mal estas dicas, mas acho que é sempre vantajoso quando alguém nos ajuda a dar menos ênfase ao código acessório (declaração de variáveis, incremento de variáveis, etc) e mais ênfase ao corpo do código principal, criando assim um aspecto visual intuitivo do programa. De resto, nada tenho a apontar contra a lógica do programa em si -- tudo isso foi já discutido pelos outros membros do fórum. Edited August 28, 2012 at 09:38 AM by pwseo Link to comment Share on other sites More sharing options...
Firewall Posted August 28, 2012 at 10:53 AM Author Report Share #473774 Posted August 28, 2012 at 10:53 AM (edited) pwseo, Bem na questão do exercício, é obrigatório não usar array (infelizmente). Mas fico feliz por me dar opções de caso eu necessite de fazer com vetor, já teria uma base solida para isso. Como eu já programo em java(ou melhor estou aprendendo), já li as convenções de códigos da sun(agora é oracle), para o java. A cada dia venho procurando métodos e funções novas para aprimorar meu conhecimento. Obrigado. 😉 Edited August 28, 2012 at 10:55 AM by Firewall Link to comment Share on other sites More sharing options...
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