Programação de Computadores Instituto Politécnico de Viseu Escola Superior de Tecnologia Engenharia Electrotécnica 1º Ano - 1º Semestre Ficha de Trabalho N.º6 Soluções Propostas 1 - Escreva o algoritmo de um procedimento que permita limpar o ecrã. Implemente o procedimento em linguagem Pascal e teste-o num pequeno programa para o efeito. program limpar(input,output); procedure limpa; var i:integer; begin for i:=1 to 50 do writeln; end; begin writeln('Prima uma tecla para limpar o ecrã!'); readln; limpa; writeln('Esta Frase foi escrita num ecrã limpo!'); end. 2 - Elabore o algoritmo de um procedimento que determine e apresente no monitor os n primeiros múltiplos de um número inteiro m (n e m devem ser parâmetros de entrada do procedimento). program p_multiplos(input,output); procedure multiplos(mult,n_mult:integer); var i:integer; begin for i:=1 to n_mult do writeln('O ',i,'º múltiplo é ',i*mult); end; var n,m: integer; begin write(' Introduza o valor de m: '); readln(m); write(' Quantos múltiplos quer calcular? '); readln(n); multiplos(m,n); end. 3 - Faça o algoritmo de um procedimento que, sendo dado como parâmetro de entrada um número inteiro, calcule e apresente no monitor todos os seus múltiplos inferiores a 100. Implemente o algoritmo em linguagem Pascal. program multiplos_inferiores(input,output); procedure multiplos100(num:integer); var mult:integer; begin writeln('Os múltiplos de ',num,' inferiores a 100 são:'); mult:=num; while (mult<100) do begin writeln(mult); mult:=mult+num; end; end; var n: integer; begin write(' Introduza o valor de n: '); readln(n); multiplos100(n); end. 4 - Elabore um procedimento que apresente no monitor todos os números pares entre dois números inteiros n e m (n<m). Os valores de n e m devem ser passados como parâmetros para o procedimento e no caso de (m<n) deve ser apresentada a mensagem “Valores Inválidos!”. program pares_entre_dois_numeros(input,output); procedure pares(n,m:integer); var par:integer; begin if (n>=m) then writeln('Valores Inválidos!') else begin if (n mod 2 = 0) then par:=n else par:=n+1; writeln('Os múmeros pares entre n e m são:'); while (par<m) do begin writeln(' ',par); par:=par+2; end; end; end; var n,m: integer; begin write(' Introduza o valor de n: '); readln(n); write(' Introduza o valor de m (m>',n,'): '); readln(m); pares(n,m); end. 5 - Analise o seguinte programa e verifique a diferença existente entre a passagem de parâmetros por valor e por referência. program exemplo(input,output); procedure proc1(x,y:integer); begin writeln(' x = ',x,' x:=100; y:=200; end; y = ',y); procedure proc2(var x,y:integer); begin writeln(' x = ',x,' y = ',y); x:=100; y:=200; end; var a,b: integer; begin a:=1; b:=2; proc1(a,b); writeln(' a = ',a,' b = ',b); proc2(a,b); writeln(' a = ',a,' b = ',b); end. 2/8 6 - Implemente um procedimento que permita trocar o valor de duas variáveis. Teste-o num pequeno programa para o efeito. program trocar_vars(input,output); procedure troca(var x,y:integer); var aux:integer; begin aux:=x; x:=y; y:=aux; end; var a,b: integer; begin write(' Qual o valor de a? '); readln(a); write(' Qual o valor de b? '); readln(b); writeln('Os valores introduzidos for am a = ',a,' b = ',b); troca(a,b); writeln('Os valores após a troca são a = ',a,' b = ',b); end. 7 - Escreva um procedimento que, sendo dados como parâmetros as medidas dos dois catetos de um triângulo rectângulo, calcule e mostre no monitor a medida da hipotenusa. program catetos_hipotenusa(input,output); procedure hipotenusa(c1,c2:real); var hip:real; begin hip:=sqrt(sqr(c1)+sqr(c2)); writeln(' A hipotenusa mede ',hip:6:3); end; var a,b: real; begin write(' Qual a medida do primeiro cateto?'); readln (a); write(' Qual a medida do segundo cateto?'); readln (b); hipotenusa(a,b); end. 8 - Escreva uma nova versão do procedimento anterior que calcule a medida da hipotenusa mas não a mostre no monitor. Em vez disso a medida da hipotenusa deve ser enviada para o exterior por forma a ser utilizada no exterior do procedimento. program procedimento_hipotenusa(input,output); procedure hipotenusa(c1,c2:real;var hip:real); begin hip:=sqrt(sqr(c1)+sqr(c2)); end; var a,b,c: real; begin write(' Qual a medida do primeiro cateto?'); readln (a); write(' Qual a medida do segundo cateto?'); readln (b); hipotenusa(a,b,c); writeln(' A hipotenusa mede ',c:6:3); end. 3/8 9 - Use uma função para fazer o cálculo do exercício anterior. Compare as duas soluções para o problema. program funcao_hipotenusa(input,output); function hipotenusa(c1,c2:real):real; var hip:real; begin hip:=sqrt(sqr(c1)+sqr(c2)); hipotenusa:=hip; end; var a,b: real; begin write(' Qual a medida do primeiro cateto?'); readln (a); write(' Qual a medida do segundo cateto?'); readln (b); writeln(' A hipotenusa mede ',hipotenusa(a,b):6:3); end. 10 - Elabore um programa em Pascal que determine o quadrado de um número inteiro n. O número n deve ser pedido ao utilizador através de uma função e o seu quadrado deve ser calculado através de outra função. program quadrado_inteiro(input,output); function leitura:integer; var x:integer; begin write('Introduza um numero: '); readln(x); leitura:=x; end; function quadrado(x:integer):integer; begin quadrado:=x*x; end; var a,qa: integer; begin a:=leitura(); qa:=quadrado(a); writeln(' O quadrado de ',a,' é ',qa); end. 11 - Escreva um programa em Pascal que permita a conversão de temperaturas em graus Centígrados para graus Fahrenheit e vice versa. Para tal deverá escrever dois procedimentos, um para realizar a conversão para Celsius e outro para realizar a conversão para Fahreneit. Cada um destes procedimentos deverá receber como parâmetro o valor da temperatura a converter e mostrar no monitor a temperatura convertida (C = 5(F – 32)/9; F = (9C/5)+32). program converter_escalas(input,output); procedure Conv_CF(tC:real); var tF:real; begin tF:=9*tC/5+32; writeln(tC:2:1,'ºC correspondem a ',tF:2:1,'ºF'); end; procedure Conv_FC(tF:real); var tC:real; begin tC:=5*(tF-32)/9; writeln(tF:2:1,'ºF correspondem a ',tC:2:1,'ºC'); end; var conv: integer; t1:real; begin writeln(' Conversões de temperaturas:'); writeln(' Celius -> Fahreneit ---> 1'); writeln(' Fahreneit -> Celius ---> 2'); 4/8 write(' Qual a conversão que pretende? '); readln(conv); write(' Qual o valor da temperatura a converter? '); readln(t1); if (conv=1) then Conv_CF(t1) else Conv_FC(t1); end. 12 - Use funções para efectuar as conversões de temperaturas do exercício anterior. program funcoes_converter(input,output); function Conv_CF(tC:real):real; begin Conv_CF:=9*tC/5+32; end; function Conv_FC(tF:real):real; begin Conv_FC:=5*(tF-32)/9; end; var conv: integer; t1,t2:real; begin writeln(' Conversões de temperaturas:'); writeln(' Celius -> Fahreneit ---> 1'); writeln(' Fahreneit -> Celius ---> 2'); write(' Qual a conversão que pretende? '); readln(conv); write(' Qual o valor da temperatura a converter? '); readln(t1); if (conv=1) then begin t2:=Conv_CF(t1); writeln(t1:2:1,'ºC correspondem a ',t2:2:1,'ºF'); end else begin t2:=Conv_FC(t1); writeln(t1:2:1,'ºC correspondem a ',t2:2:1,'ºF'); end end. 13 - Escreva um programa em Pascal que utilize uma função chamada multiplo que receba dois valores inteiros e devolva true se um dos valores é múltiplo do outro. Por exemplo: multiplo(2, 4) = true multiplo(4, 2) = true multiplo(3, 2) = false program funcao_multiplo(input,output); function multiplo(a,b:integer):boolean; begin if ((a mod b = 0) OR (b mod a = 0)) then multiplo:=TRUE else multiplo:=FALSE; end; var mult: boolean; x,y:integer; 5/8 begin x:=2; y:=4; if (multiplo(x,y)) then writeln(x,' e ',y,' são else writeln(x,' e ',y,' não x:=4; y:=2; if (multiplo(x,y)) then writeln(x,' e ',y,' são else writeln(x,' e ',y,' não x:=3; y:=2; if (multiplo(x,y)) then writeln(x,' e ',y,' são else writeln(x,' e ',y,' não end. multiplos') são multiplos'); multiplos') são multiplos'); multiplos') são multiplos'); 14 - Implemente uma função chamada factorial que calcule n! (factorial de n em que n é um inteiro positivo). O valor de n deve ser um parâmetro da função e o valor calculado deve ser enviado para o exterior. 15 - Escreva um programa em Pascal que inclua uma função chamada potencia que permita calcular xn (x real, n inteiro positivo). 16 - Considere a função f(x). Escreva um programa que utilize funções Pascal para calcular o valor de f(x) para um x e n dados pelo utilizador. Sugestão: utilize as funções factorial e potencia dos exercícios14 e 15). n xi xi f ( x) = ∑ f ( x) = ∑ i =1 i! i =1 2i n 17 - Faça o cálculo da função anterior usando uma única função por forma a que o resultado seja obtido mais eficientemente. 18 - Elabore um subprograma que, considerando um vector com N inteiros, determine a soma dos elementos de ordem par P (N deve ser parâmetro do subprograma e o inteiro P deve ser enviado para o exterior do subprograma). program somaValoresArray; {Determina a soma dos elementos de ordem par de um vector com 12 elementos} uses crt; const maximo=50; type vector=array [1..maximo] of integer; function somapares(vec:vector;num:integer):integer; var i,soma:integer; begin soma := 0; for i := 1 to num do if (i mod 2 = 0) then soma := soma + vec[i]; somapares:=soma; end; var i, N,P: integer; t: vector; begin clrscr; write('Quantos elementos tem o array? '); readln(N); for i := 1 to N do begin write(' Introduza o ',i,'º elemento do vector: '); readln(t[i]) end; P:=somapares(t,N); writeln(' A soma dos elementos de ordem par é ',P); writeln; 6/8 end. 19 - Implemente um subprograma em Pascal que, dado um array contendo N valores reais desordenados, determine o valor máximo, o valor mínimo e as respectivas posições. Estes 4 valores devem ser devolvidos ao programa principal que os mostrará no monitor. Faça um programa para testar o subprograma. program MAX_MIN; {Determina o valor máximo, o valor mínimo e as respectivas posições num vector com n elementos reais} uses crt; const tamanho=50; type vector=array [1..tamanho] of real; procedure MaxMin(vec:vector;num:integer; pmax,pmin:integer); var i:integer; begin max:=vec[1]; min:=vec[1]; pmax:=1; pmin:=1; for i := 1 to num do if (vec[i]>max) then begin max:=vec[i]; pmax:=i; end else if (vec[i]<min) then begin min:=vec[i]; pmin:=i; end end; var i,N,posmax,posmin: integer; maximo,minimo:real; t: vector; begin clrscr; write('Quantos elementos tem o array? '); readln(N); for var max,min:real; var i := 1 to N do begin write(' Introduza o ',i,'º elemento do vector: '); readln(t[i]) end; MaxMin(t,N,maximo,minimo,posmax,posmin); writeln(' O máximo do vector é o elemento ',maximo:2:2,' e ocorre na posição ',posmax); writeln(' O mínimo do vector é o elemento ',minimo:2:2,' e ocorre na posição ',posmin); writeln; end. 20 - Considere o exercício anterior mas faça a leitura dos elementos do vector através de um subprograma. Os valores máximo e mínimo e as respectivas posições deverão ser determinados pelo subprograma devolvido no exercício anterior. program MAX_MIN; { Determina o valor máximo, o valor mínimo e as respectivas posições num vector com n elementos reais} uses crt; const tamanho=50; type vector=array [1..tamanho] of real; 7/8 procedure leVec(var vec:vector;num:integer); var i:integer; begin for i := 1 to num do begin write(' Introduza o ',i,'º elemento do vector: '); readln(vec[i]) end; end; procedure MaxMin(vec:vector;num:integer; pmax,pmin:integer); var i:integer; begin max:=vec[1]; min:=vec[1]; pmax:=1; pmin:=1; for i := 1 to num do if (vec[i]>max) then begin max:=vec[i]; pmax:=i; end else if (vec[i]<min) then begin min:=vec[i]; pmin:=i; end end; var N,posmax,posmin: integer; maximo,minimo:real; t: vector; begin clrscr; write('Quantos elementos tem o array? '); readln(N); var max,min:real; var leVec(t,N); MaxMin(t,N,maximo,minimo,posmax,posmin); write(' O máximo do vector é o elemento ',maximo:2:2); writeln(' e ocorre na posição ',posmax); write(' O mínimo do vector é o elemento ',minimo:2:2); writeln(' e ocorre na posição ',posmin); writeln; end. 21 - Aumente a funcionalidade do programa anterior implementando funções adicionais que permitam executar as seguintes tarefas: - Determine a média dos elementos do vector. - Determine quantos elementos do vector são superiores à média e quantos são inferiores. - Duplique para outra variável os valores lidos. 22 - Implemente um programa em Pascal que faça a leitura das notas de uma turma de IP e, com base nelas, calcule: - A média - As notas mínima e máxima - O número de positivas e negativas Use subprogramas para tornar o seu código mais estruturado. 8/8