Tome Almeida Posted January 4, 2023 at 08:04 PM Report Share #629440 Posted January 4, 2023 at 08:04 PM (edited) Eu estou a fazer um menú e quando seleciono algo que não está inserido no escopo do programa gostava que informasse o utilizador e inserisse a opção de voltar atrás com uma label. Quando fiz isso sempre que executo o exercício escolhido aparece no final sempre a mensagem do exercício não válido. Se alguém me conseguisse ajudar, agradecia. Em anexo, vai o código em questão: Program MenuFicha4 ; label inicio; label inicioseccao1; label inicioseccao2; label inicioseccao3; label fim; label inicioex2_6; label fimex2_6; var seccao:integer; var labelseccao:char; var seccao1,seccao2,seccao3:string; var respseccao1,respseccao2,respseccao3:char; var a:real; var b:real; var c,d,e:real; var g,h,f,i:real; var j,k,l:real; var m,n,o:real; var p,q:real; var a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11:real; var b1:integer; var b2,b3:integer; var b4:integer; var b5,b6,b7:real; var b8,b9,b10:real; var c1,c2,c3:real; var c4:char; var c5,c6,c7,c8,c9,c10:real; var d1,d2,d3:real; var d4:integer; var d5,d6,d7,d8:real; var d9,d10:integer; var e1,e2:integer; var e3,e4,e5,e6:integer; var e7,e8,e9:integer; var t1, t2, t3, t4, t5, t6, t7, max, min: real; var fernando,fernando1,fernando2,fernando3:char; const pi = 3.1416; Begin textcolor(white); inicio: clrscr; textcolor(lightred); writeln('********************************************'); writeln('* *'); writeln('* Bem-Vindo ao menú da Ficha 4! *'); writeln('* *'); writeln('* Feito por: Tomé Almeida *'); writeln('* *'); writeln('********************************************'); writeln(); writeln(); textcolor(white); writeln('A ficha 4 está dividida em 3 secções:'); writeln(); writeln(); writeln('> Secção 1'); writeln(); writeln('> Secção 2'); writeln(); writeln('> Secção 3'); writeln(); writeln(); writeln('Insira a secção que deseja abrir'); write('> '); readln(seccao); clrscr; case seccao of 1: begin inicioseccao1: clrscr; writeln('Selecionou a secção 1!'); writeln(); writeln(); writeln(' 1.1 -> Área do quadrado '); writeln(' 1.2 -> Perímetro da cirncunferência '); writeln(' 1.3 -> Gasolina gasta '); writeln(' 1.4 -> Latas de tinta '); writeln(' 1.5 -> Hipotenusa do triângulo '); writeln(' 1.6 -> Tempo gasto '); writeln(' 1.7 -> Conversão para polegadas '); writeln(' 1.8 -> Conversão para Fahrenheit '); writeln(' 1.9 -> Forrar com a carpete '); writeln(' 1.10 -> Distância entre dois pontos '); writeln(); writeln(); writeln('Insira o exercício que deseja executar!'); write('> '); readln(seccao1); clrscr; if (seccao1='1.1')then begin writeln('Insira os lados do quadrado'); readln(a); clrscr; writeln('A área do quadrado é ',(a*a):0:2); readkey; end; if (seccao1='1.2')then begin writeln('Insira o raio da circunferência'); readln(b); clrscr; writeln('O perímetro da circunferência é ',(2*pi*b):0:2); readkey; end; if (seccao1='1.3')then begin writeln('Indica a distância percorrida em km e os litros de gasolina gastos'); readln(c,e); d:=c/e; clrscr; writeln('Fez uma média de ',d:0:1 ,' litros por kilómetro!'); readkey; end; if (seccao1='1.4')then begin writeln('Insira a altura e a largura da parede'); readln(f,g); h:=f*g; i:=h/3; clrscr; writeln('São necessárias ',i:0:1,' latas de tinta para cobrir toda a parede'); readkey; end; if (seccao1='1.5')then begin writeln('Indique os valores dos catetos'); readln(j,k); l:=sqrt((j*j)+(k*k)); writeln('A hipotenusa do triângulo é ',l:0:1); readkey; end; if (seccao1='1.6')then begin writeln('Indica a distância percorrida em km e o tempo gasto'); readln(m,n); o:=m/n; clrscr; writeln('Fez uma média de ',o:0:2 ,' minutos por kilómetro!'); readkey; end; if (seccao1='1.7')then begin writeln('Indique a medida em centímetros'); readln(q); p:=q/2.54; clrscr; writeln('A sua medida dá ',p:0:1, ' polegadas!'); readkey; end; if (seccao1='1.8')then begin writeln('Insira a temperatura em graus Celsius'); readln(a6); a7:=(9/5)*a6+32; clrscr; writeln('A temperatura inserida dá ',a7:0:1, ' graus Fahrenheit!'); readkey; end; if (seccao1='1.9')then begin writeln('Insira o comprimento e a largura da carpete'); readln(a8,a9); a10:=a8*a9; a11:=a10*35; clrscr; writeln('Vão ser necessários ',a11:0:1,' euros para forrar todo o piso com a carpete'); readkey; end; if(seccao1='1.10')then begin writeln('Insira o X e o Y do ponto P'); readln(a1,a2); clrscr; writeln('Insira o X e o Y do ponto Q'); readln(a3,a4); a5:=((a3-a1)*(a3-a1))+((a4-a2)*(a4-a2)); writeln('Os pontos estão a ',sqrt (a5):0:1, ' valores de distância'); readkey; end else writeln('Exercício não válido! Pretende escolher outro?'); readln(fernando1); if(fernando1='S') or (fernando1='s')then goto inicioseccao1 else clrscr; write('> Se pretender voltar ao menú principal prima '); begin textcolor(lightred); write('[1]'); textcolor(white); write('.'); end; writeln(); write('> Se pretender voltar a escolher um exercício da secção 1 prima '); begin textcolor(lightred); write('[2]'); textcolor(white); write('.'); end; writeln(); write('> Se pretender encerrar o programa prima '); textcolor(lightred); write('[3]'); textcolor(white); write('.'); writeln(); readln(respseccao1); if(respseccao1='1')then goto inicio; if(respseccao1='2')then goto inicioseccao1 else goto fim end; 2:begin inicioseccao2: clrscr; writeln('Selecionou a secção 2!'); writeln(); writeln(); writeln(' 2.1 -> Par ou Ímpar '); writeln(' 2.2 -> Maior e menor '); writeln(' 2.3 -> Permissão para a carta '); writeln(' 2.4 -> IMC '); writeln(' 2.5 -> Salário total '); writeln(' 2.6 -> Média do aluno '); writeln(' 2.7 -> Equação de raízes completas '); writeln(' 2.8 -> Classificação de triângulos '); writeln(); writeln(); writeln('Insira o exercício que deseja executar!'); write('> '); readln(seccao2); clrscr; if(seccao2='2.1')then begin writeln('Introduza um valor inteiro'); readln(b1); if ( b1 mod 2 = 0) then begin writeln('O valor introduzido ', b1,' é par') end else begin writeln('O valor introduzido ', b1,' é impar'); end; readkey; end; if(seccao2='2.2')then begin writeln('Introduza dois valores inteiros'); readln(b2,b3); if ( b2 > b3 ) then writeln('O maior valor é ', b2, ' e o menor valor é ', b3 ) else writeln('O maior valor é ', b3, ' e o menor valor é ', b2); readkey; end; if(seccao2='2.3')then begin writeln('Introduza uma idade e descubre se já podes ter carta de motorista'); read(b4); if ( b4 >= 18) then writeln('Tu já podes ter a carta!'); if ( b4 < 18) then writeln('Tu ainda não tens permissão para ter a carta.'); readkey; end; if(seccao2='2.4')then begin writeln ('Insira o seu peso(em kg) e altura(metros)'); readln(b5, b6); b7:= b5 / sqr(b6); writeln('Seu imc corresponde a ', b7:0:2); readkey; end; if(seccao2='2.5')then begin writeln('Introduza o total de horas trabalhadas.'); readln(b8); b9 := b8 * 14.50; if ( b9 >= 1200) then begin b10 := b9 - ( b9 * 0.15); writeln('O seu salário corresponde a ', b9:0:2 ,'; e após a redução de 15%, passou a ser ', b10:0:2); end else writeln('O seu salário total corresponde ? ', b9:0:2); readkey; end; if(seccao2='2.6')then begin inicioex2_6: clrscr; textcolor(white); writeln( 'Introduza duas notas.'); readln( c1 , c2 ); c3 := (c1 + c2)/2; if ( c1 < 0 ) or ( c1 > 20) or ( c2 < 0 ) or ( c2 > 20) then begin writeln('A nota introduzida não pode ser lida. Deseja recomeçar? S|N'); readln(c4); if ( c4 = 's') or ( c4 = 'S') then goto inicioex2_6; if ( c4 = 'n') or ( c4 = 'N') then goto fimex2_6; end else if ( c3 >= 7 ) then begin textcolor (lightblue); writeln('O aluno(a) está aprovado! A sua média correspondente é ', c3:0:1); end; if ( c3 < 3 ) then begin textcolor (red); writeln('O aluno(a) está reprovado. A sua média correspondente é ', c3:0:1); end; if ( c3 >= 3 ) and ( c3 <= 6 ) then begin textcolor (yellow); writeln('O aluno(a) está em recuperação. A sua média correspondente é ', c3:0:1); end; fimex2_6: readkey; end; if(seccao2='2.7')then begin writeln('Insira o valor de a,b e c.'); readln(c5, c6, c7); c8 := (sqr( c6 )) - ( 4 * c5 * c7 ); if (c8 > 0) then begin writeln('A equação tem duas raizes reais diferentes.'); c9 := ( -c6 + sqrt(c8))/2 * c5; c10 := ( -c6 - sqrt(c8))/2 * c5; writeln; writeln('A 1ª raiz é ', c9:0:2); writeln('A 2ª raiz é ', c10:0:2); end; if (c8 = 0) then begin writeln('A equação tem uma raíz dupla.'); c9:= ( -c6 + sqrt(c8))/2 * c5; writeln; writeln('A 1ª raiz é ', c9:0:2); end; if ( c8 < 0) then writeln('A equação tem duas raízes complexas.'); readkey; end; if(seccao2='2.8')then begin writeln('Introduz três valores'); readln(d1, d2, d3); if ( d1 > ( d2 + d3 )) or ( d2 > (d1 + d3)) or ( d3 > ( d1 + d2)) then begin writeln('Os valores introduzidos não formam um triângulo'); end else if ( d1 = d2 ) and ( d2 = d3 ) then begin writeln('O triângulo é equilátero'); end else if ( d1 = d2 ) or ( d1 = d3 ) or ( d2 = d3) then begin writeln('O triângulo é isósceles'); end else begin writeln('O triângulo é escaleno'); end; readkey; end else writeln('Exercício não válido! Pretende escolher outro?'); readln(fernando2); if(fernando2='S') or (fernando2='s')then goto inicioseccao2 else clrscr; write('> Se pretender voltar ao menú principal prima '); begin textcolor(lightred); write('[1]'); textcolor(white); write('.'); end; writeln(); write('> Se pretender voltar a escolher um exercício da secção 2 prima '); begin textcolor(lightred); write('[2]'); textcolor(white); write('.'); end; writeln(); write('> Se pretender encerrar o programa prima '); textcolor(lightred); write('[3]'); textcolor(white); write('.'); writeln(); readln(respseccao2); if(respseccao2='1')then goto inicio; if(respseccao2='2')then goto inicioseccao2 else goto fim end; 3:begin inicioseccao3: clrscr; writeln('Selecionou a secção 3!'); writeln(); writeln(); writeln(' 3.1 -> Média '); writeln(' 3.2 -> Soma de números naturais '); writeln(' 3.3 -> Quadrado ( mod <> 0 ) '); writeln(' 3.4 -> Pares e ímpares '); writeln(' 3.5 -> Fatorial '); writeln(' 3.6 -> Temperaturas '); writeln(); writeln(); writeln('Insira o exercício que deseja executar!'); write('> '); readln(seccao3); clrscr; if(seccao3='3.1')then begin d5 := 0; for d4 := 1 to 10 do begin writeln('Introduz um valor.'); readln(d6); d7 := d5 + d6; d8 := d7 /2; end; writeln('A média dos valores é ', d8:0:2); readkey; end; if(seccao3='3.2')then begin writeln('Introduz um valor inteiro.'); readln (d9); for d9 := d9 downto 1 do begin d10:= d10 + d9; end; delay(300); writeln('A soma dos primeiros números naturais corresponde a ', d10:0:0); readkey; end; if(seccao3='3.3')then begin writeln('Insira um número que deseja ver o quadrado'); readln(e1); for e2:=1 to e1 do begin if(e2 mod 2<>0)then writeln(e2); end; readkey; end; if(seccao3='3.4')then begin randomize; while ( e3 < 1000 ) do begin e4 := random(100); delay(10); writeln(e4); if ( e4 mod 2 = 0 ) then begin e5 := e5 + 1; end else begin e6 := e6 + 1; end; e3 := e3 + 1; end; delay(500); writeln; writeln('Foram inseridos ', e5, ' números pares.'); writeln('Foram inseridos ', e6, ' números impares.'); readkey; end; if(seccao3='3.5')then begin writeln('Introduz um valor'); readln(e7); e9:= 1; for e8:= e7 downto 1 do begin e9 := e9 * e8; end; writeln('O resultado do fatorial é ', e9:0:2); readkey; end; if(seccao3='3.6')then begin max := 0; min := 100; writeln('Introduza a temperatura de segunda-feira.'); readln( t1 ); clrscr; writeln('Introduza a temperatura de terça-feira.'); readln( t2 ); clrscr; writeln('Introduza a temperatura de quarta-feira.'); readln( t3 ); clrscr; writeln('Introduza a temperatura de quinta-feira.'); readln( t4 ); clrscr; writeln('Introduza a temperatura de sexta-feira.'); readln( t5 ); clrscr; writeln('Introduza a temperatura de sábado.'); readln( t6 ); clrscr; writeln('Introduza a temperatura de domingo.'); readln( t7 ); clrscr; if (t1>t2) and (t1>t3) and ( t1 > t4 ) and ( t1 > t5 ) and ( t1 > t6 ) and ( t1 > t7 ) then max:= t1 else min:= t1; if (t2>t1) and (t2>t3) and ( t2 > t4 ) and ( t2 > t5 ) and ( t2 > t6 ) and ( t2 > t7 ) then max:= t2 else min:= t2; if (t3>t1) and (t3>t2) and ( t3 > t4 ) and ( t3 > t5 ) and ( t3 > t6 ) and ( t3 > t7 ) then max:= t3 else min:= t3; if (t4>t1) and (t4>t2) and ( t4 > t3 ) and ( t4 > t5 ) and ( t4 > t6 ) and ( t4 > t7 ) then max:= t4 else min:= t4; if (t5>t1) and (t5>t2) and ( t5 > t3 ) and ( t5 > t4 ) and ( t5 > t6 ) and ( t5 > t7 ) then max:= t5 else min:= t5; if (t6>t1) and (t6>t2) and ( t6 > t3 ) and ( t6 > t4 ) and ( t6 > t5 ) and ( t3 > t7 ) then max:= t6 else min:= t6; if (t7>t1) and (t7>t2) and ( t7 > t3 ) and ( t7 > t4 ) and ( t7 > t5 ) and ( t7 > t6 ) then max:= t7 else min:= t7; writeln; writeln('A temperatura mais quente é ', max:0:1, 'ºC e a mais fria é ', min:0:1, 'ºC'); readkey; end else writeln('Exercício não válido! Pretende escolher outro?'); readln(fernando3); if(fernando3='S') or (fernando3='s')then goto inicioseccao3 else clrscr; write('> Se pretender voltar ao menú principal prima '); begin textcolor(lightred); write('[1]'); textcolor(white); write('.'); end; writeln(); write('> Se pretender voltar a escolher um exercício da secção 1 prima '); begin textcolor(lightred); write('[2]'); textcolor(white); write('.'); end; writeln(); write('> Se pretender encerrar o programa prima '); textcolor(lightred); write('[3]'); textcolor(white); write('.'); writeln(); readln(respseccao3); if(respseccao3='1')then goto inicio; if(respseccao3='2')then goto inicioseccao3 else goto fim end; else writeln('Opção não válida! Pretende voltar atrás?'); readln(fernando); if(fernando='S') or (fernando='s')then goto inicio else fim: clrscr; writeln('Prima novamente para encerrar!'); end; readkey; End. Edited January 5, 2023 at 09:37 AM by nunopicado Syntax Highlight Tomé Link to comment Share on other sites More sharing options...
nunopicado Posted January 5, 2023 at 10:46 AM Report Share #629446 Posted January 5, 2023 at 10:46 AM É assim, antes de mais nada, deixa-me só dizer-te, sem querer desmerecer o teu trabalho, que olhar para esse código é um pesadelo, tal é a quantidade de labels, vars e indentação estranha num mesmo bloco de código. Não é esse o problema de que te queixas, mas é algo a pensares no futuro. Dito isto, estás a validar a opção apenas no ELSE do CASE, ou seja, na opção principal 1, 2 ou 3. Dentro de cada uma delas, não estás a validar nada, e como tal, o utilizador pode meter qualquer coisa. Tens de fazer a validação a cada pergunta que fazes ao utilizador, e com a estrutura de IFs que tens isso significa ou usar IFs encadeados ou criar um IF adicional que preveja todos os casos que não aqueles que geres individualmente. Trabalheira à vista, mas tem de ser. Algumas dicas: Não sei em que nível de aprendizado estás, nem em que contexto (escola, auto-didata, etc.). Mas tenta estudar um pouco como funcionam procedimentos e funções. Faziam o teu código muito mais legível e fácil de encontrares problemas que aconteçam. Ciclos: Todos os labels que usas podem ser substituídos por ciclos e procedimentos, sem os riscos das labels. Para teres uma ideia, há pessoas que não só não usam labels, ainda desativam essa funcionalidade do compilador. Para teres uma ideia ainda melhor, o compilador permite desativar essa funcionalidade. É esse o nível de "mau" que usar labels representa. "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...
Tome Almeida Posted January 5, 2023 at 12:03 PM Author Report Share #629450 Posted January 5, 2023 at 12:03 PM Em 05/01/2023 às 10:46, nunopicado disse: É assim, antes de mais nada, deixa-me só dizer-te, sem querer desmerecer o teu trabalho, que olhar para esse código é um pesadelo, tal é a quantidade de labels, vars e indentação estranha num mesmo bloco de código. Não é esse o problema de que te queixas, mas é algo a pensares no futuro. Dito isto, estás a validar a opção apenas no ELSE do CASE, ou seja, na opção principal 1, 2 ou 3. Dentro de cada uma delas, não estás a validar nada, e como tal, o utilizador pode meter qualquer coisa. Tens de fazer a validação a cada pergunta que fazes ao utilizador, e com a estrutura de IFs que tens isso significa ou usar IFs encadeados ou criar um IF adicional que preveja todos os casos que não aqueles que geres individualmente. Trabalheira à vista, mas tem de ser. Algumas dicas: Não sei em que nível de aprendizado estás, nem em que contexto (escola, auto-didata, etc.). Mas tenta estudar um pouco como funcionam procedimentos e funções. Faziam o teu código muito mais legível e fácil de encontrares problemas que aconteçam. Ciclos: Todos os labels que usas podem ser substituídos por ciclos e procedimentos, sem os riscos das labels. Para teres uma ideia, há pessoas que não só não usam labels, ainda desativam essa funcionalidade do compilador. Para teres uma ideia ainda melhor, o compilador permite desativar essa funcionalidade. É esse o nível de "mau" que usar labels representa. Boa tarde Nuno. Antes de mais, muito obrigado pela atenção dada. Eu estou numa escola, mas entrei mesmo há pouco tempo. Eu estava em Ciências Socioeconómicas e por volta de um mês atrás mudei para este curso. Eu só uso as labels porque o professor assim o exige, porque eu cá também não sou grande fã. Assim que consiga, tentarei mudar isto e organizar o código e as variáveis especialmente. Quando acabar eu reenvio se não se importar, para me dar a sua opinião. Com os melhores cumprimentos, Tomé Tomé Link to comment Share on other sites More sharing options...
nunopicado Posted January 5, 2023 at 03:14 PM Report Share #629459 Posted January 5, 2023 at 03:14 PM Em 05/01/2023 às 12:03, Tome Almeida disse: Eu só uso as labels porque o professor assim o exige, porque eu cá também não sou grande fã. Espero que o teu professor esteja só a mostrar um exemplo do que não se deve fazer, caso contrário a minha fé na humanidade perdeu mais um bocadinho de consideração... 😂 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...
Tome Almeida Posted January 5, 2023 at 09:53 PM Author Report Share #629505 Posted January 5, 2023 at 09:53 PM Em 05/01/2023 às 15:14, nunopicado disse: Espero que o teu professor esteja só a mostrar um exemplo do que não se deve fazer, caso contrário a minha fé na humanidade perdeu mais um bocadinho de consideração... 😂 Pois, mas tenho mesmo que usar fora isso não me servia de nada estar a fazer este exercício porque ia ter 0. Tomé Link to comment Share on other sites More sharing options...
nunopicado Posted January 6, 2023 at 11:49 AM Report Share #629523 Posted January 6, 2023 at 11:49 AM Em 05/01/2023 às 21:53, Tome Almeida disse: Pois, mas tenho mesmo que usar fora isso não me servia de nada estar a fazer este exercício porque ia ter 0. Tive um professor que veio com essa mania de ter de fazer tal qual ele dizia... Não dos labels, até ele sabia que isso não se devia usar, nunca chegou a falar delas, mas de não querer que usássemos nada que ele não tivesse ensinado. Perguntei-lhe na aula à frente de todos se, havendo várias maneiras de fazer alguma coisa, umas melhores do que as outras, qual era o problema de fazer melhor em vez de pior? Qual era o benefício de aprender a fazer mal quando se pode fazer bem? Se estamos na escola para aprender a programar, porque motivo teríamos de fazer de uma forma que nenhum programador profissional alguma vez ousaria fazer? Não respondeu. A partir daí entreguei sempre os trabalhos como eu achava que devia. Logo que o resultado final fosse produzido de acordo com o pedido no enunciado, ele não me podia tirar nota por fazer diferente do que ele imaginava que devia ser feito. Se fores para o mercado de trabalho e arranjares uma entrevista de emprego para programador, e eles te pedirem para fazer um programa para demonstrar os teus conhecimentos (muito comum fazerem isso), e apresentares um programa num bloco único, estás automaticamente desqualificado. Eu entendo os professores começarem por ensinar assim, para que quem não sabe possa aprender aos poucos. Mas quem já sabe não pode nunca ser obrigado a andar para trás no seu conhecimento. Isto falando do não uso de procedimentos e funções, porque a nível de labels, não só ele não pode exigir o seu uso, ele nem deveria ter falado delas mais do que para dizer: "Não usem". Os riscos são muitos, os benefícios, nenhum. São uma representação de um passado distante em que não era possível melhor. É absurdo o seu uso hoje em dia, especialmente por que se está a iniciar e ainda não consegue entender os seus riscos. "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 January 6, 2023 at 03:22 PM Report Share #629550 Posted January 6, 2023 at 03:22 PM (edited) Sei que isto não vai acrescentar nada ao tópico inicial, mas partilho do sentimento do @nunopicadoacerca do código carregado de labels/gotos. Não faz sentido nem ensinar assim nem programar assim. Sendo de facto requisito do professor, @Tome Almeida, permite-me sugerir que refaças depois este exercício com o devido recurso a funções e procedimentos. Edited January 6, 2023 at 03:22 PM by thoga31 Português Knowledge is free! 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