Baixe o app para aproveitar ainda mais
Prévia do material em texto
Exercícios de Seleções PROGRAM L1EXERC1 c Dados dois valores inteiros A e B, distintos , imprimir o maior. INTEGER A B PRINT*, 'Digite valores para A e B' READ*, A, B PRINT* IF (A .GT. B) THEN PRINT*, A, ' e o maior' ELSE PRINT*, B, ' e o maior' ENDIF STOP END PROGRAM L1EXERC2 c Dados dois valores inteiros A e B, distintos, imprima mensagem c se forem iguais ou nao INTEGER A, B PRINT*, 'Digite valores para A e B' READ*, A, B PRINT* IF (A .EQ. B) THEN PRINT*, 'A=', A, ' e ', 'B= ',B , ' sao iguais' ELSE PRINT*, 'A=', A, ' e ', 'B= ',B , ' sao diferentes' ENDIF STOP END PROGRAM L1EXERC3 c Dados dois valores inteiros A e B, distintos, imprimir A e B c ordenados de forma crescente. INTEGER A, B, Aux PRINT*, 'Digite valores para A e B' READ*, A, B IF (A .GT. B) THEN Aux = A A = B B = Aux ENDIF PRINT* PRINT*, 'A=', A, ' B= ',B STOP END PROGRAM L1EXERC4 c Dado um valor inteiro A, imprimir se 10 <= A <= 20, c ou uma mensagem caso contrario. INTEGER A PRINT*, 'Digite valor para A' READ*, A PRINT* IF ((A .GE. 10) .AND. (A .LE. 20) ) THEN PRINT*, A, ' esta no intervalo entre 10 e 20' ELSE PRINT*, A, ' nao esta no intervalo entre 10 e 20' ENDIF STOP END PROGRAM L1EXERC5 c Dados tres valores inteiros A, B e C, distintos, imprimir o maior. INTEGER A, B, C PRINT*, 'Digite valores para A, B e C' READ*, A, B, C PRINT* PRINT*, 'A=', A, ' B=', B, ' C=', C PRINT* IF ((A .GT. B) .AND. (A .GT. C)) THEN PRINT*, A, ' e o maior' ELSE IF ((B .GT. A) .AND. (B .GT. C)) THEN PRINT*, B, ' e o maior' ELSE PRINT*, C, ' e o maior' ENDIF ENDIF STOP END PROGRAM L1EXERC6 c Dados tres valores inteiros A, B e C, distintos, imprimir o menor. INTEGER A, B, C PRINT*, 'Digite valores para A, B e C' READ*, A, B, C PRINT* PRINT*, 'A=', A, ' B=', B, ' C=', C PRINT* IF ((A .LT. B) .AND. (A .LT. C)) THEN PRINT*, A, ' e o menor' ELSE IF ((B .LT. A) .AND. (B .LT. C)) THEN PRINT*, B, ' e o menor' ELSE PRINT*, C, ' e o menor' ENDIF ENDIF STOP END PROGRAM L1EXERC7 c Dados tres valores inteiros A, B e C, distintos, c imprimir o intermediario. INTEGER A, B, C PRINT*, 'Digite valores para A, B e C' READ*, A, B, C PRINT* PRINT*, 'A=', A, ' B=', B, ' C=', C PRINT* IF ((A .GT. B) .AND. (A .LT. C) .OR. (A .GT. C) .AND. (A .LT. B) *) THEN PRINT*, A, ' e o intermediario' ELSE IF ((B .GT. A) .AND. (B .LT. C) .OR. (B .GT. C) .AND. *(B .LT. A)) THEN PRINT*, B, ' e o intermediario' ELSE PRINT*, C, ' e o intermediario' ENDIF ENDIF STOP END PROGRAM L1EXERC8 c Dados tres valores inteiros A, B e C, verificar se eles podem ser c lados de um triangulo e, se forem, imprimir se formam um triangulo c equilatero,isosceles ou escaleno. Imprimir mensagem se os lados c nao formam um triangulo. INTEGER A, B, C PRINT*, 'Digite valores para A, B e C' READ*, A, B, C PRINT* PRINT*, 'A=', A, ' B=', B, ' C=', C PRINT* IF ((A .GT. B+C) .OR. (B .GT. A+C) .OR. (C .GT. A+B)) THEN PRINT*, ' Os valores lidos nao formam lados de um triangulo' ELSE IF ((A .EQ. B) .AND. (B .EQ. C)) THEN PRINT*, ' Os valores lidos formam um triangulo equilatero' ELSE IF ((A .EQ. B) .OR. (A .EQ. C) .OR. (B .EQ. C)) THEN PRINT*, ' Os valores lidos formam um triangulo isosceles' ELSE PRINT*, ' Os valores lidos formam um triangulo escaleno' ENDIF ENDIF ENDIF STOP END PROGRAM L1EXERC9 c Dados tres valores inteiros A, B e C, distintos, imprimir A, B, C c ordenados de forma crescente. INTEGER A, B, C, Aux PRINT*, 'Digite valores para A, B e C' READ*, A, B, C PRINT* PRINT*, 'A=', A, ' B=', B, ' C=', C PRINT* IF ((A .GT. B) .OR. (A .GT. C)) THEN IF (B .LT. C) THEN Aux = B B = A A = Aux ELSE Aux = C C = A A = Aux ENDIF ENDIF IF (B .GT. C) THEN Aux = B B = C C = Aux ENDIF PRINT* PRINT*, 'Valores ordenados de forma crescente' PRINT*, 'A=', A, ' B=', B, ' C=', C STOP END PROGRAM L1EXERC10 c Dado o nome e o salario bruto de um funcionario, calcular valor c do desconto e o salario liquido do funcionario. Imprimir o nome, c salario bruto, valor do desconto e o salario liquido. O calculo do c valor do desconto sera feito conforme abaixo: c se o salario bruto <= 500,00 estara isento do desconto c caso contrario aplicar desconto de 10% sobre o salario bruto. c valor_do_desconto = salario_bruto * %desc / 100.00 c salario_liquido = salario_bruto - valor_do_desconto REAL SalBr, Perc, ValDesc, Saliq CHARACTER Espaco*3, Nome*30 PARAMETER (Espaco=' ') PRINT*, 'Digite nome do funcionario' READ*, Nome PRINT* PRINT*, 'Digite valor do salario' READ*, SalBr IF (SalBr .LE. 500.0) THEN Perc = 0 ELSE PERC = 0.1 ENDIF ValDesc= SalBr * Perc Saliq = SalBr - ValDesc PRINT* PRINT* PRINT*, 'Nome:', Nome, Espaco, 'Salario:', SalBr PRINT*, 'Desconto:', ValDesc, Espaco, 'Salario Liquido:', Saliq STOP END PROGRAM L1EXERC11 c Dado o nome e o salario bruto de um funcionario, calcular o valor c do desconto e o salario liquido do funcionario. Imprimir o nome, c salario bruto, valor do desconto e o salario liquido. O calculo do c valor do desconto sera feito conforme abaixo: c se o salario bruto <= 500,00 estara isento do desconto c se o 500,00 < salario bruto <= 1000,00 aplicar desconto de 10% c sobre o salario bruto c se o 1000,00 < salario bruto <= 2000,00 aplicar desconto de 15% c sobre o salario bruto c caso contrario aplicar desconto de 20% sobre o salario bruto. REAL SalBr, Perc, ValDesc, Saliq CHARACTER Espaco*3, Nome*20 PARAMETER (Espaco=' ') PRINT*, 'Digite nome do funcionario' PRINT* READ*, Nome PRINT*, 'Digite valor do salario' READ*, SalBr IF (SalBr .LE. 500.0) THEN Perc = 0 ELSE IF (SalBr .LE. 1000.0) THEN Perc = 0.1 ELSE IF (SalBr .LE. 2000.0) THEN Perc = 0.15 ELSE PERC = 0.2 ENDIF ENDIF ENDIF ValDesc= SalBr * Perc Saliq = SalBr - ValDesc PRINT* PRINT*, 'Nome:', Nome, Espaco, 'Salario:', SalBr PRINT*, ' Desconto:', ValDesc, Espaco, 'Salario Liquido:', Saliq STOP END PROGRAM L1EXERC12 cDado o nome, salário bruto e o estado civil de um funcionario, c calcular valor do desconto e o salario liquido do funcionario. c Imprimir nome, salario bruto, valor do desconto e o salario liquido. c O calculo do valor do desconto sera feito conforme abaixo: c se o funcionario for casado estara isento do desconto c se for solteiro aplicar desconto de 10% sobre o salaário bruto c se for viuvo desconto de 15% sobre o salario bruto c caso contrario aplicar desconto de 20% sobre o salario bruto. c estado civil sera assim representado: c 0 - solteiro 1 - casado 2 - separado 3 - divorciado 4 - viuvo REAL SalBr, Perc, ValDesc, Saliq INTEGER EstCiv CHARACTER Espaco*3, Nome*20 PARAMETER (Espaco=' ') PRINT*, 'Digite nome do funcionario' READ*, Nome PRINT* PRINT*, ' Digite opcao do estado civil do funcionario' PRINT*,' 0 - Solteiro' PRINT*,' 1 - Casado' PRINT*,' 2 - Separado' PRINT*,' 3 - Divorciado' PRINT*,' 4 - Viuvo' READ*, EstCiv PRINT* PRINT*, 'Digite valor do salario' READ*, SalBr IF (EstCiv .EQ. 1) THEN Perc = 0 ELSE IF (EstCiv .EQ. 0) THEN Perc = 0.1 ELSE IF (EstCiv .EQ. 4) THEN Perc = 0.15 ELSE PERC = 0.2 ENDIF ENDIF ENDIF ValDesc= SalBr * Perc Saliq = SalBr - ValDesc PRINT* PRINT*, 'Nome:', Nome, Espaco, 'Salario:', SalBr IF (EstCiv .EQ. 0) THEN PRINT*, ' Estado civil: Solteiro' ELSE IF (EstCiv .EQ. 1) THEN PRINT*, ' Estado civil: Casado' ELSE IF (EstCiv .EQ. 2) THEN PRINT*, ' Estado civil: Separado' ELSE IF (EstCiv .EQ. 3) THEN PRINT*, ' Estado civil: Divorciado' ELSE PRINT*, ' Estado civil: Viuvo' ENDIF ENDIF ENDIF ENDIF PRINT*, ' Desconto:', ValDesc, Espaco, 'Salario Liquido:', Saliq STOP END PROGRAM L1EXERC13 c Dado o nome, salário bruto e o estado civil de um funcionario, c calcular valor do desconto e o salario liquido do funcionario. c Imprimir nome, salario bruto, valor do desconto e o salario liquido. c O calculo do valor do desconto sera feito conforme abaixo: c se o funcionario for casado estara isento do desconto caso o salario<=500,0 c senao aplicar desconto de 8% sobre o salario bruto c se for solteiro aplicar desconto de 10% sobre o salario bruto c se for viuvo desconto de 10% sobre o salario bruto se o salario <= 800,0, c senao aplicar desconto de 15% sobre o salario bruto c se for separado ou divorciado aplicar desconto de 15% sobre o salario c bruto se salario <= 700,00, senao aplicar desconto de 20% sobre o salario bruto. c 0 - solteiro 1 - casado 2 - separado 3 - divorciado 4 - viuvo REAL SalBr, Perc, ValDesc, Saliq INTEGER EstCiv CHARACTER Espaco*3, Nome*20 PARAMETER (Espaco=' ') PRINT*, 'Digite nome do funcionario' READ*, Nome PRINT* PRINT*, ' Digite opcao do estado civil do funcionario' PRINT*,' 0 - Solteiro' PRINT*,' 1 - Casado' PRINT*,' 2 - Separado' PRINT*,' 3 - Divorciado' PRINT*,' 4 - Viuvo' READ*, EstCiv PRINT* PRINT*, 'Digite valor do salario' READ*, SalBr IF (EstCiv .EQ. 1) THEN IF (SalBr .LE. 500.0) THEN Perc = 0 ELSE Perc = 0.08 ENDIF ELSE IF (EstCiv .EQ. 0) THEN Perc = 0.1 ELSE IF (EstCiv .EQ. 4) THEN IF (SalBr .LE. 800.0) THEN Perc = 0.1 ELSE Perc = 0.15 ENDIF ELSE IF (SalBr .LE. 700.0) THEN Perc = 0.15 ELSE Perc = 0.2 ENDIF ENDIF ENDIF ENDIF ValDesc= SalBr * Perc Saliq = SalBr - ValDesc PRINT* PRINT*, ' Nome:', Nome, Espaco, 'Salario:', SalBr IF (EstCiv .EQ. 0) THEN PRINT*, ' Estado civil: Solteiro' ELSE IF (EstCiv .EQ. 1) THEN PRINT*, ' Estado civil: Casado' ELSE IF (EstCiv .EQ. 2) THEN PRINT*, ' Estado civil: Separado' ELSE IF (EstCiv .EQ. 3) THEN PRINT*, ' Estado civil: Divorciado' ELSE PRINT*, ' Estado civil: Viuvo' ENDIF ENDIF ENDIF ENDIF PRINT*, ' Desconto:', ValDesc, Espaco, 'Salario Liquido:', Saliq STOP END Exercícios de Repetições Comando DO PROGRAM L2EXERC1 c Ler e imprimir 5 valores reais. Calcular e imprimir a c media aritmetica dos valores lidos. REAL Media, Valor, Soma INTEGER I CHARACTER Espaco*3 PARAMETER (Espaco=' ') Soma = 0 DO I = 1,5 PRINT*, 'Digite valor ', I READ*, Valor Soma = Soma + Valor ENDDO Media = Soma/5 PRINT* PRINT*, 'Media aritmetica dos valores lidos: ', Media STOP END PROGRAM L2EXERC2 c Ler e imprimir N valores reais. Calcular e imprimir a c media aritmetica dos valores lidos. REAL Media, Valor, Soma INTEGER I, N PRINT*, 'Digite numero de valores para obtencao da media.' READ*, N PRINT* Soma = 0 DO I = 1, N PRINT*, 'Digite valor ', I READ*, Valor PRINT*, Valor, 'Valor ', I, ' em ', N Soma = Soma + Valor ENDDO Media = Soma/N PRINT* PRINT*, 'Media aritmetica dos ', N, ' valores lidos: ', Media STOP END PROGRAM L2EXERC3 c Ler 10 valores inteiros. Imprimir, com mensagem, os valores que c estao no intervalo entre 1 e 15 , e os valores que estao c fora do intervalo. INTEGER I, Valor DO I = 1, 10 PRINT*, 'Digite valor ', I READ*, Valor IF ((Valor .GE. 1) .AND. (Valor .LE. 15)) THEN PRINT*, Valor, ' esta no intervalo' ELSE PRINT*, Valor, ' nao esta no intervalo' ENDIF PRINT* ENDDO STOP END PROGRAM L2EXERC4 c Ler N valores inteiros. Imprimir, com mensagem, os valores que c estao no intervalo entre 1 e 15 , e os valores que estao fora c do intervalo. Contar quantos valores foram impressos dentro do c intervalo e quantos foram impressos fora do intervalo. c No fim imprimir os contadores. INTEGER I, Valor, N, Fora PRINT*, 'Digite numero de valores para obtencao da media.' READ*, N PRINT* Fora = 0 DO I = 1, N PRINT*, 'Digite valor ', I, ' em ', N READ*, Valor IF ((Valor .GE. 1) .AND. (Valor .LE. 15)) THEN PRINT*, Valor, ' esta no intervalo' ELSE PRINT*, Valor, ' nao esta no intervalo' Fora = Fora + 1 ENDIF PRINT* ENDDO PRINT*, N - Fora, ' valores lidos no intervalo' PRINT*, Fora, ' valores lidos fora do intervalo' STOP END PROGRAM L2EXERC5 c Ler N valores inteiros. Imprimir, commensagem, os valores lidos c que sao pares , e os valores que nao sao pares. Contar quantos c valores pares foram impressos e quantos impares tambem. c No fim imprimir os contadores. INTEGER I, Valor, N, Pares, Impares PRINT*, 'Digite numero de valores para processar.' READ*, N PRINT* Pares = 0 Impares = 0 DO I = 1, N PRINT*, 'Digite valor ', I, ' em ', N READ*, Valor IF (MOD(Valor,2) .EQ. 0) THEN PRINT*, Valor, ' e numero par' Pares = Pares + 1 ELSE PRINT*, Valor, ' e numero impar' Impares = Impares + 1 ENDIF PRINT* ENDDO PRINT*, Pares, ' valores pares lidos' PRINT*, Impares, ' valores impares lidos' STOP END PROGRAM L2EXERC6 c Ler e imprimir K coeficientes de equações do segundo grau. c Para cada equacao imprima os coeficientes e as raizes reais, c se houverem. Caso nao haja imprimir mensagem. No fim c imprimir o numero de equacoes que nao tiveram raizes reais. REAL A, B, C, Delta, X1, X2 INTEGER K, I, SemRaiz PRINT*, 'Digite numero de equacoes para processar.' READ*, K SemRaiz = 0 DO I = 1, K PRINT* PRINT*, 'Digite coeficientes da equacao ', I, ' em ', K READ*, A, B, C PRINT*, 'A=', A, ' B= ',B, 'C= ', C Delta = B**2 - 4*A*C IF (Delta .GE. 0) THEN X1 = (-B + SQRT(Delta))/(2*A) X2 = (-B - SQRT(Delta))/(2*A) PRINT*, 'X1=', X1, ' X2= ', X2 ELSE PRINT*, 'Nao ha raizes reais para os coeficientes' SemRaiz = SemRaiz + 1 ENDIF PRINT* ENDDO IF (SemRaiz .EQ. 0) THEN PRINT*, 'Todas equacoes tiveram raizes reais' ELSE PRINT*, 'Total de equacoes sem raizes reais: ', SemRaiz ENDIF STOP END PROGRAM L2EXERC7 c Ler e imprimir o nome, salario bruto de N funcionarios. c Calcular o desconto e o salario liquido de todos os funcionarios. c O desconto sera calculado da seguinte maneira: c salario bruto <= 100,00 isento c 100,00 < salario bruto <= 200,00 10% c 200,00 < salario bruto <= 400,00 20% c salario bruto > 400,00 25% c Imprimir : nome, salario bruto, desconto e salario liquido de c cada funcionario. No fim imprimir total de salario bruto, c total dos descontos e total do salario liquido. Imprimir tambem c o numero de funcionarios que nao tiveram desconto e o numero de c funcionarios que tiveram desconto. INTEGER N, I, NFDesc, NFSDesc REAL SalBr, Perc, ValDesc, Saliq, TotSB, TotDesc, TotSLiq CHARACTER Espaco*3, Nome*20 PARAMETER (Espaco=' ') DATA TotSB, TotDesc, TotSLiq /3*0.0/, NFDesc, NFSDesc/2*0/ PRINT*, 'Digite numero de funcionarios.' READ*, N DO I = 1, N PRINT* PRINT*, 'Digite nome do funcionario' READ*, Nome PRINT*, 'Digite valor do salario' READ*, SalBr IF (SalBr .LE. 100.0) THEN NFSDesc = NFSDesc + 1 Perc = 0 ELSE NFDesc = NFDesc + 1 IF (SalBr .LE. 200.0) THEN Perc = 0.1 ELSE IF (SalBr .LE. 400.0) THEN Perc = 0.2 ELSE PERC = 0.25 ENDIF ENDIF ENDIF ValDesc= SalBr * Perc Saliq = SalBr - ValDesc PRINT* PRINT*, ' Nome:', Nome, Espaco, 'Salario:', SalBr PRINT*, ' Desconto:', ValDesc, Espaco, 'Salario Liquido:', Saliq TotSB = TotSB + SalBr TotDesc = TotDesc + ValDesc TotSLiq = TotSLiq + Saliq ENDDO PRINT* PRINT*, ' Total dos Salarios:', TotSB PRINT*, ' Total dos Descontos:', TotDesc PRINT*, ' Total Salarioss Liquidos:', TotSLiq STOP END PROGRAM L2EXERC8 c Dados A1, R e N gerar e imprimir uma PA com N termos. INTEGER A1, N, Razao, Prox, I PRINT*, 'Digite o primeiro termo, razao e num. de termos da PA.' READ*, A1, Razao, N PRINT* PRINT*, 'Razao: ', Razao, ' Num. Termos:', N PRINT* PRINT*, 'PA gerada:' PRINT*, ' ', A1 Prox = A1 DO I = 2, N Prox = Prox + Razao PRINT*, ' ', Prox ENDDO STOP END PROGRAM L2EXERC9 c Gerar e imprimir a serie de Fibonacci com K termos. INTEGER A, B, Prox, K, I PRINT*, 'Digite o num. de termos da serie de Fibonacci.' READ*, K PRINT* PRINT*, ' Num. Termos:', K PRINT* A = 0 B = 1 PRINT*, 'Serie de Fibonacci gerada:' PRINT*, ' ', A PRINT*, ' ', B DO I = 3, K Prox = A + B PRINT*, ' ', Prox A = B B = Prox ENDDO STOP END PROGRAM L2EXERC10 c Dados dois inteiros A e B calcular e imprimir C=A*B, c onde A*B devera ser obtido por somas sucessivas. INTEGER A, B, C, I PRINT*, 'Digite valores para A e B.' READ*, A, B PRINT* PRINT*, 'A= ', A, ' B=', B PRINT* C = 0 DO I = 1, A C = C + B ENDDO PRINT*, 'Produto por somas sucessivas de A * B= ', C STOP END PROGRAM L2EXERC11 c Ler e imprimir um inteiro N. Calcular e imprimir a serie : c Serie = 1/N + 2/(N-1) + 3/(N-2) + ........ + (N-1)/2 + N REAL Soma INTEGER I, N PRINT*, 'Digite numero de valores para obtencao da serie.' READ*, N PRINT* Soma = 0 DO I = 1, N Soma = Soma + FLOAT(I)/FLOAT(N - I + 1) ENDDO PRINT* PRINT*, 'Somatorio dos elementos da serie para N=', N PRINT*, 'Soma=', Soma STOP END PROGRAM L2EXERC12 c Para cada inteiro entre L e M, lidos, imprimir o inteiro que seja c um numero perfeito. Um numero e perfeito se ele e igual a soma de c seus divisores - nao considerando o proprio. INTEGER L, M, Num , Soma, Metade, Div PRINT*, 'Digite valores inicial e final do intervalo.' READ*, L, M PRINT* Soma = 0 DO Num = L, M Metade = Num/2 Soma = 0 DO Div = 1, Metade IF (MOD(Num,Div) .EQ. 0) THEN Soma = Soma + Div ENDIF ENDDO IF (Soma .EQ. Num) THEN PRINT*, Num, ' e numero perfeito' ENDIF ENDDO STOP END PROGRAM L2EXERC13 c Ler e imprimir um inteiro P. Calcular e imprimir fatorial de P. INTEGER I, P, Fat PRINT*, 'Digite valor para calculo do fatorial.' READ*, P PRINT* Fat = 1 DO I = 2, P Fat = Fat * I ENDDO PRINT*, 'Fatorial de P=', P, ' e igual a:', Fat STOP END PROGRAM L2EXERC14 c Para 1<=i<=n, i+1<=j<=n+1 e j<=k<=n+i calcular S = somatorio(i*k+j) c se i*k+j < N + 3. No fim imprimir o valor de S. INTEGER I, J, K, N, Soma PRINT*, 'Digite valor para calculo do somatorio.' READ*, N PRINT* Soma = 0 DO I = 1, N DO J = I+1, N+1 DO K = J, N+I IF (I*K+J .LT. N+3) THEN SOMA = SOMA + (I *K + J) ENDIF ENDDO ENDDO ENDDO PRINT*, 'Somatorio para N=', N, ' e igual a:', Soma STOP END PROGRAM L2EXERC15 c Ler e imprimir N valores reais. Imprimir o maior valor lido. INTEGER I, N REAL Valor, Maior PRINT*, 'Digite numero de valores para processar.' READ*, N PRINT* PRINT*, 'Digite primeiro valor.' READ*, Valor PRINT* PRINT*, 'Valor 1=', Valor Maior = Valor DO I = 2, N PRINT*, 'Digite proximo valor.' READ*, Valor PRINT* PRINT*, 'Valor ', I, '=', Valor IF (Valor .GT. Maior) THEN Maior = Valor ENDIF ENDDO PRINT* PRINT*, 'Maior valor lido foi:', Maior STOP END PROGRAM L2EXERC16 c Ler e imprimir N valores reais. Imprimir o maior e o menor valor lido. INTEGER I, N REAL Valor, Maior, Menor PRINT*, 'Digite numero de valores para processar.' READ*, N PRINT* PRINT*, 'Digite primeiro valor.' READ*, Valor PRINT* PRINT*, 'Valor 1=', Valor Maior = Valor Menor = Valor DO I = 2, N PRINT* PRINT*, 'Digite proximo valor.' READ*, Valor PRINT* PRINT*, 'Valor ', I, '=', Valor IF (Valor .GT. Maior) THEN Maior = Valor ELSE IF (Valor .LT. Menor) THEN Menor = valor ENDIF ENDIF ENDDO PRINT* PRINT*, 'Maior valor lido foi:', Maior PRINT* PRINT*, 'Menor valor lido foi:', Menor STOP END PROGRAM L2EXERC17 c Ler e imprimir valores reais que representem a altura de K pessoas. c Imprimir quais as duas maiores alturas lidas e o numero de pessoas que as possuem. REAL Altura, Maior1, Maior2 INTEGER I, K, NumP1, NumP2 PRINT*, 'Digite numero de pessoas para processar.' READ*, K PRINT* PRINT*, 'Digite primeira altura.' READ*, Altura PRINT* PRINT*, 'Altura 1=', Altura Maior1 = Altura NumP1 = 1 Maior2 = Altura NumP2 = 1 DO I = 2, K PRINT* PRINT*, 'Digite proxima altura.' READ*, Altura PRINT* PRINT*, 'Altura ', I, '=', Altura IF (Altura .GT. Maior1) THEN Maior2 = Maior1 NumP2 = NumP1 Maior1 = Altura NumP1 = 1 ELSE IF (Altura .EQ. Maior1) THEN NumP1 = NumP1 + 1 ELSE IF (Altura .GT. Maior2) THEN Maior2 = Altura NumP2 = 1 ELSE IF (Altura .EQ. Maior2) THEN NumP2 = NumP2 + 1 ENDIF ENDIF ENDIF ENDIF ENDDO PRINT* PRINT*, 'Numero de pessoas:', K PRINT* PRINT*, 'Primeira maior altura:', Maior1 PRINT*, 'Numero de pessoas com maior altura:', NumP1 PRINT* PRINT*, 'Segunda maior altura:', Maior2 PRINT*, 'Numero de pessoas com segunda maior altura:', NumP2 STOP END PROGRAM L2EXERC18 c Ler o sexo ( 0 : masculino ; 1 : feminino) e a altura de M pessoas. c Imprimir a maior e a menor altura; a media da altura das mulheres; c a menor altura dos homens; o numero total de homens que foram lidos. INTEGER I, M, Sexo, TotH, TotF REAL Altura, Maior, Menor, MdAltF, MenorH, Soma PRINT*, 'Digite numero de pessoas para processar.' READ*, M Maior = 0.0 Menor = 3.0 MenorH = 3.0 Soma = 0 TotH = 0 TotF = 0 DO I = 1, M PRINT* PRINT*, 'Digite altura e sexo (0-Masc e 1-Fem).' READ*, Altura, Sexo PRINT* IF (Altura .GT. Maior) THEN Maior = Altura ELSE IF (Altura .LT. Menor) THEN Menor = Altura ENDIF ENDIF IF (Sexo .EQ. 0) THEN TotH = TotH + 1 IF (Altura .LT. MenorH) THEN MenorH = Altura ENDIF ELSE TotF = TotF + 1 Soma = Soma + Altura ENDIF ENDDO IF (TotF .NE. 0) THEN Media = Soma/TotF ENDIF PRINT* PRINT*, 'Numero de pessoas:', M PRINT* PRINT*, 'Maior altura:', Maior PRINT*, 'Menor altura:', Menor PRINT* PRINT*, 'Total de homens:', TotH PRINT* PRINT*, 'Menor altura entre os homens:', MenorH PRINT* PRINT*, 'Total de mulheres:', TotF PRINT* PRINT*, 'Media das alturas das mulheres:', Media STOP END PROGRAM L2EXERC19 c Considere uma pesquisa realizada com pessoas com idade entre 25 e 80 anos de idade, c de uma regiao do pais. Para a pesquisa foram consideradas as seguintes informacoes c para cada pessoa : sexo, idade, nivel de instrucao e se a pessoa tem ou nao emprego. c Escreva um programa para : c Ler o sexo, a idade, o nivel de instrucao e a situacao do emprego de N pessoas. c Para efetuar a leitura dos dados vamos considerar : c Sexo : 0 - masculino 1 - feminino c Idade : inteiro entre 25 e 80 c Nivel de instrucao : 0 - analfabeto 1 - primeiro grau 2 - segundo grau c 3 - superior 4 - pos graduacao c Emprego : 0 - nao 1 - sim c Imprimir as informacoes lidas, e imprimir os seguintes resultados da pesquisa : c a) o numero de pessoas analfabetas do sexo feminino com idade inferior a 50 anos; c b) numero de pessoas com primeiro grau com idade entre 25 e 35 anos e sem emprego; c c) o numero de pessoas do sexo masculino que tem emprego e estao no segundo grau; c d) o numero de pessoas do sexo feminino com idade superior a 40 anos, que tem c curso superior e estao desempregadas; c e) o numero de pessoas do sexo masculino com idade superior a 35 anos, estao c trabalhando e tem pos graduacao; c f) o numero total de pessoas do sexo masculino e total de pessoas do sexo feminino c que foram pesquisadas; c g) o total de pessoas pesquisadas pelo nivel de instrucao. INTEGER I, N, Sexo, Idade, NivIns, Emp, TotA, TotB, TotC, TotD, * TotE, TotFH, TotFM, TotG0, TotG1, TotG2, TotG3, TotG4 DATA TotA, TotB, TotC, TotD, TotE, TotFH, TotFM, TotG0, TotG1, * TotG2, TotG3, TotG4/12*0/ PRINT*, 'Digite numero de pessoas para processar.' READ*, N DO I = 1, N PRINT* PRINT*, 'Digite sexo (0-Masc e 1-Fem).' READ*, Sexo PRINT*, 'Digite idade.' READ*, Idade PRINT*,'Digite escolaridade(0-Ana 1-PG 2-SG 3-Grad 4-PGrad).' READ*, NivEsc PRINT*, 'Digite situacao de emprego (0-Nao e 1-Sim).' READ*, Emp PRINT* c total de pessoas pesquisadas pelo nivel de instrucao(G). IF (NivEsc .EQ. 0) THEN TotG1 = TotG1 + 1 ELSE IF (NivEsc .EQ. 1) THEN TotG2 = TotG2 + 1 ELSE IF (NivEsc .EQ. 2) THEN TotG3 = TotG3 + 1 ELSE IF (NivEsc .EQ. 3) THEN TotG4 = TotG4 + 1 ELSETotG5 = TotG5 + 1 ENDIF ENDIF ENDIF ENDIF c numero de pessoas com primeiro grau com idade c entre 25 e 35 anos e sem emprego (B) IF ((NivIns .EQ. 1) .AND. ((Idade .GE. 25) .AND. * (Idade .LE. 35)) .AND. (Emp .EQ. 0)) THEN TotB = TotB + 1 ENDIF IF (Sexo .EQ. 0) THEN c pessoas pesquisadas sexo masculino TotFH = TotFH + 1 IF (Emp .EQ. 1) THEN IF (NivEsc .EQ. 2) THEN TotC = TotC + 1 ELSE IF ((NivEsc .EQ. 4) .AND. (Idade .GT.35)) THEN TotE = TotE + 1 ENDIF ENDIF ENDIF ELSE c pessoas pesquisadas sexo femenino TotFM = TotFM + 1 c o numero de pessoas analfabetas do sexo feminino com idade c inferior a 50 anos (A) IF ((NivEsc .EQ. 0) .AND. (Idade .LT. 50)) THEN TotA = TotA + 1 ELSE c numero de pessoas do sexo feminino com idade superior a 40 c anos, que tem curso superior e estao desempregadas (D) IF ((Idade .GT. 40) .AND. (NivIns .EQ. 3) .AND. * (Emp .EQ. 0)) THEN TotD = TotD + 1 ENDIF ENDIF ENDIF ENDDO PRINT* PRINT*, 'Numero de pessoas:', N PRINT* PRINT*, 'Pessoas analfabetas sexo fem idade inf 50 anos:',TotA PRINT* PRINT*, 'Pessoas prim grau idade 25/35 anos sem emprego:', TotB PRINT* PRINT*, 'Pessoas sexo masculino empregado e segundo grau:', TotC PRINT* PRINT*, 'Sexo feminino idade sup 40,cur sup e desemp:', TotD PRINT* PRINT*, 'Sexo masculino idade sup 35 anos, trab e pgrad:', TotE PRINT* PRINT*, 'Total de homens:', TotFH PRINT* PRINT*, 'Total de mulheres:', TotFM PRINT* PRINT*, 'Total de analfabetos:', TotG1 PRINT*, 'Total de prim Grau:', TotG2 PRINT*, 'Total de seg Grau:', TotG3 PRINT*, 'Total de graduados:', TotG4 PRINT*, 'Total de pos graduados:', TotG5 STOP END Comando WHILE PROGRAM L3EXERC1 c Ler e imprimir valores reais. Calcular e imprimir a media aritmetica c dos valores lidos. A entrada termina quando for lido o valor -88 . REAL Media, Valor, Soma INTEGER NumVal, Flag PARAMETER(Flag = -88) Soma = 0 NumVal = 0 PRINT*, 'Digite valor 1' READ*, Valor DO WHILE (Valor .NE. Flag) NumVal = NumVal + 1 PRINT* PRINT*, 'Valor ', NumVal, ' lido:', Valor Soma = Soma + Valor PRINT* PRINT*, 'Digite proximo valor' READ*, Valor ENDDO Media = Soma/NumVal PRINT* PRINT*, 'Media aritmetica dos ',NumVal,' valores lidos: ', Media STOP END PROGRAM L3EXERC2 c Ler valores inteiros. Imprimir,com mensagem, os valores lidos que c sao pares , e os valores que nao sao pares. A entrada termina com c a leitura do valor -1. Contar quantos valores pares foram impressos c e quantos impares tambem. No fim imprimir os contadores. INTEGER Valor, Pares, Impares, Flag PARAMETER(Flag = -1) PRINT*, 'Digite valor 1' READ*, Valor Pares = 0 Impares = 0 DO WHILE (Valor .NE. Flag) PRINT* IF (MOD(Valor,2) .EQ. 0) THEN PRINT*, Valor, ' e numero par' Pares = Pares + 1 ELSE PRINT*, Valor, ' e numero impar' Impares = Impares + 1 ENDIF PRINT* PRINT*, 'Digite proximo valor' READ*, Valor ENDDO PRINT* PRINT*, Pares, ' valor(es) par(es) lido(s)' PRINT*, Impares, ' valor(es) impar(es) lido(s)' STOP END PROGRAM L3EXERC3 c Ler os coeficientes de equacoes do segundo grau (A,B,C). c Para cada equacao imprima os coeficientes e as raizes reais, se houverem. c Caso nao haja imprimir mensagem. No fim imprimir o numero de c equacoes que nao tiveram raizes reais. A entrada termina c quando for lido o valor 0(zero) para o coeficiente A. REAL A, B, C, X1, X2, Delta INTEGER SemRaiz SemRaiz = 0 PRINT*, 'Digite coeficientes - A, B, C - da primeira equacao.' READ*, A, B, C DO WHILE (A .NE. 0) PRINT* PRINT*, 'A=', A, ' B=', B, ' C=', C PRINT* Delta = B**2 - 4*A*C IF (Delta .GE. 0) THEN X1 = (-B + SQRT(Delta))/(2*A) X2 = (-B - SQRT(Delta))/(2*A) PRINT*, 'X1=', X1, ' X2=', X2 ELSE PRINT*, 'Para coeficientes lidos nao ha raizes reais.' SemRaiz = SemRaiz + 1 ENDIF PRINT* PRINT*,'A, B, C da proxima equacao (0 para A encerra).' READ*, A, B, C ENDDO PRINT* PRINT*, 'Total de equacoes sem raizes reais:', SemRaiz STOP END PROGRAM L3EXERC4 c Dados A1 e R gerar e imprimir uma PA cujo ultimo termo seja menor c do que 200. Imprimir no fim o numero de termos da PA. INTEGER A1, NTermos, Razao, Prox PRINT*, 'Digite o primeiro termo e a razao da PA.' READ*, A1, Razao PRINT* NTermos = 0 Prox = A1 DO WHILE (Prox .LT. 200) PRINT*, ' ', Prox NTermos = NTermos + 1 Prox = Prox + Razao ENDDO PRINT* PRINT*, ' Razao: ', Razao, ' Num. Termos:', NTermos STOP END PROGRAM L3EXERC5 c Dados dois inteiros A e B, positivos e nao nulos, calcular A/B, c onde A/B devera ser obtido por subtracoes sucessivas. c No fim imprimir, A, B, o quociente e o resto da divisao. INTEGER A, B, Quoc, Resto PRINT*, 'Digite valores para A e B.' READ*, A, B Quoc = 0 Resto = A DO WHILE (Resto .GE. B) Resto = Resto - B Quoc = Quoc + 1 ENDDO PRINT* PRINT*, ' Dividendo: ', A, ' Divisor:', B PRINT*, ' Quociente: ', Quoc, ' Resto:', Resto STOP END PROGRAM L3EXERC6 c Para cada inteiro entre Inicio e Fim, lidos, imprimir o inteiro c que seja um numero primo. INTEGER Num, Div, Metade, Inicio, Fim Logical Primo PRINT*, 'Digite limites do intervalo.' READ*, Inicio, Fim DO Num = Inicio, Fim Div = 2 Metade = Num/2 Primo = .TRUE. DO WHILE ( ( Div .LE. Metade) .AND. (Primo) ) IF (MOD(Num, Div) .EQ. 0) THEN Primo = .FALSE. ELSE Div = Div + 1 ENDIF ENDDO IF (Primo) THEN PRINT* PRINT*, Num, ' e numero primo.' ENDIF ENDDO END PROGRAM L3EXERC7 c Gerar e imprimir a serie de Fibonacci cujo ultimo termo seja c menor do que Ultimo. INTEGER Ultimo, Prox, A, B PRINT*, 'Digite o valor limite da serie de Fibonacci (>2).' READ*, Ultimo PRINT* A = 0 B = 1 PRINT*, ' ', A PRINT*, ' ', B Prox = A + B DO WHILE (Prox .LT. Ultimo) PRINT*, ' ', Prox A = B B = Prox Prox = A + B ENDDO STOP END PROGRAM L3EXERC8 c Para inteiros variando de Inicio a Fim,imprimir os inteiros que c sao iguais a soma dos cubos de seus digitos.ex:153 =1**3+5**3+3**3 INTEGER Num, Inicio, Fim, Soma, Valor PRINT*, 'Digite limites do intervalo.' READ*, Inicio, Fim DO Num = Inicio, Fim Soma = 0 Valor = Num DO WHILE ( Valor .GE. 10 ) Soma = Soma + MOD(Valor,10)**3 Valor = Valor/10 ENDDO Soma = Soma + Valor**3 IF (Soma .EQ. Num) THEN PRINT* PRINT*, Num, ' satisfaz a propriedade estabelecida.' ENDIF ENDDO END PROGRAM L3EXERC9 c Ler e imprimir valores inteiros. A leitura termina com a leitura c do valor -1. No fim imprimir, com mensagem, o maior valor lido. INTEGER Valor, Maior, Flag PARAMETER(Flag = -1) PRINT*, 'Digite primeiro valor.' READ*, Valor Maior = Valor DO WHILE (Valor .NE. Flag) PRINT* PRINT*, 'Valor lido:', Valor IF (Valor .GT. Maior) THEN Maior = Valor ENDIF PRINT* PRINT*, 'Digite proximo valor (-1 encerra).' READ*, Valor ENDDO PRINT* PRINT*, 'Maior valor lido foi:', Maior STOP END Exercícios de Agregados Homogêneos PROGRAM L4EXERC1 c Ler e imprimir um conjunto com N elementos inteiros. c Imprimir o maior elemento do conjunto. Imprimir tambem a posição. INTEGER N, ConjInt(50), MaxElem, Posicao, I PARAMETER (MaxElem=50) c sera lido o num de elementos do conjunto PRINT*, ‘Digite numero de elementos do conjunto (Max:50)’ READ*, N IF (N .GT. MaxElem) THEN PRINT*,'Numero maximo de elementos previsto: ',MaxElem STOP ENDIF PRINT* PRINT*, ‘Digite N elementos para o conjunto.’ READ*, (ConjInt(I), I = 1, N) PRINT*, ' Elementos do conjunto lidos apos digitacao.' WRITE(*,30) (ConjInt(I), I = 1, N) 30 FORMAT(50(I4,2X)) Posicao = 1 DO I = 2, N IF (ConjInt(I) .GT. ConjInt(Posicao)) THEN Posicao = I ENDIF ENDDO PRINT* PRINT*, 'Maior elemento:', ConjInt(Posicao) PRINT*, 'Posicao no conjunto:', Posicao STOP END PROGRAM L3EXERC2 c Ler e imprimir um conjunto com elementos reais. c A leitura termina com o valor -1.Imprimir o menor elemento do c conjunto, sua posicao e o numero de elementos processados. REAL ConjReal(20), ValorLido, Flag INTEGER NElem, I, Posicao PARAMETER(Flag = -1) c Ler conjunto com valores inteiros ate valor lido for -1 NElem = 0 PRINT*, ‘Digite o primeiro valor do conjunto’. READ*, ValorLido DO WHILE (ValorLido .NE. Flag) NElem = NElem + 1 c Defender posicao considerada com respeito ao tamanho do conjunto (20) IF ( NElem .GT. 20) THEN PRINT*,'O numero de elementos deve ser <= a 20. * Programa sera encerrado.' STOP ENDIF ConjReal(NElem) = ValorLido PRINT*, ‘Digite proximo valor do conjunto’. READ*, ValorLido ENDDO PRINT* PRINT*, 'Numero de elementos do conjunto:', NElem PRINT* c Imprimir conjunto com NElem valores WRITE(*,15) (ConjReal(I), I = 1, NElem) 15 FORMAT( 20( F6.2, 2X ) ) Posicao = 1 DO I = 2, NElem IF (ConjReal(I) .LT. ConjReal(Posicao)) THEN Posicao = I ENDIF ENDDO PRINT* PRINT*, 'Menor elemento:', ConjReal(Posicao) PRINT*, 'Posicao no conjunto:', Posicao STOP END PROGRAM L4EXERC3 c Gerar e imprimir a serie de Fibonacci com K termos. INTEGER Fib(50), K, I, MaxElem PARAMETER(MaxElem = 50) PRINT*, ‘Digite o numero de elementos da serie.’ READ*, K IF (K .GT. MaxElem) THEN PRINT*,'Numero maximo de elementos previsto: ',MaxElem STOP ENDIF PRINT*, 'Numero de elementos do conjunto:', K PRINT* Fib(1) = 0 Fib(2) = 1 DO I = 3, K Fib(I) = Fib(I-1) + Fib(I-2) ENDDO PRINT*, 'Serie de Fibonacci gerada:' WRITE(*,11)(Fib(I), I = 1, K) 11 FORMAT(10(I5, 2X)) STOP END PROGRAM L4EXERC4 c Gerar e imprimir a serie de Fibonacci cujo ultimo termo seja c menor do que 100. INTEGER Fib(50), N, MaxElem, I PARAMETER( MaxElem = 50) Fib(1) = 0 Fib(2) = 1 N = 2 DO WHILE (Fib(N) .LT. 100) N = N + 1 IF (N .GT. MaxElem) THEN PRINT*,'Numeros maximo de elementos previsto: ',MaxElem STOP ENDIF Fib(N) = Fib(N-1) + Fib(N-2) ENDDO c descartar ultima posicao que contera valor > ou = a 100 N = N - 1 PRINT*, 'Serie de Fibonacci gerada:' WRITE(*,11)(Fib(I), I = 1, N) 11 FORMAT(5(I3, 2X)) STOP END PROGRAM L4EXERC5 c Ler e imprimir um conjunto de P valores inteiros. A seguir ler 5 c valores inteiros, um a um ,e imprimir com mensagem se o valor lido c pertence ou nao ao conjunto. INTEGER P, Conj (20), I, J, ValorLido LOGICAL Pertence PRINT*, ‘Digite o numero de elementos do conjunto.(Max:20)’ READ*, P IF ( P .GT. 20) THEN PRINT*, 'O numero de elementos deve ser menor ou igual a 20.' PRINT*, 'Programa sera encerrado.' STOP ENDIF PRINT*, 'Numero de elementos do conjunto:', P PRINT* c Ler conjunto com P valores inteiros READ*, (Conj(I), I = 1, P) PRINT*, 'Conjunto lido apos digitação.' WRITE(*,12) (Conj(I), I = 1, P) 12 FORMAT( 20( I4, 2X ) ) c ler 5 valores e verificar se ocorrem no conjunto DO J = 1, 5 PRINT*, ‘Digite valor para verificar ocorrencia.’ READ*, ValorLido c verificar se valor ocorre no conjunto I = 1 Pertence = .FALSE. DO WHILE ( (I .LE. P) .AND. (.NOT. Pertence) ) IF (ValorLido .EQ. Conj(I)) THEN Pertence = .TRUE. ELSE I = I + 1 ENDIF ENDDO PRINT* IF (Pertence) THEN PRINT*, ValorLido, ' pertence ao conjunto.' ELSE PRINT*, ValorLido, ' nao pertence ao conjunto.' ENDIF ENDDO STOP END PROGRAM L4EXERC6 c Dados dois conjuntos A e B com M e N elementos respect/, c ordenados de forma crescente,gerar e imprimir um conjunto C, c ordenado de forma crescente, que sera obtido intercalando-se c os elementos de A com B sem repeticao de elementos. INTEGER A(20), B(20), C(40), M, N, K, I, J, MaxElem PARAMETER (MaxElem = 20) PRINT*, ‘Digite o numero de elementos dos conjuntos A e B (Max:20).’ READ*, M, N c Defender valores lidos com respeito ao tamanho do conjunto (20) IF ( (M .GT. MaxElem) .OR. (N .GT. MaxElem)) THEN PRINT*,'O numero de elementos deve ser menor ou igual a 20' PRINT*, 'Programa sera encerrado.' STOP ENDIF PRINT*, 'Numero de elementos do conjunto A:', M PRINT* PRINT*, 'Numero de elementos do conjunto B:', N PRINT*PRINT*, ‘Digite os ‘ , M, ‘ elementos do conjunto A.’ READ*, (A(I), I = 1, M) PRINT*, ‘Digite os ‘ , N, ‘ elementos do conjunto B.’ READ*, (B(I), I = 1, N) PRINT*, 'Conjunto A lido.' WRITE(*,12) (A(I), I = 1, M) PRINT* PRINT*, 'Conjunto B lido.' WRITE(*,12) (B(I), I = 1, N) 12 FORMAT( 12( I4, 2X ) ) c gerar conjunto C intercalando elementos de A com B I = 1 J = 1 K = 0 DO WHILE ((I .LE. M) .AND. (J .LE. N)) K = K + 1 IF (A(I) .EQ. B(J)) THEN C(K) = A(I) I = I + 1 J = J + 1 ELSE IF (A(I) .LT. B(J)) THEN C(K) = A(I) I = I + 1 ELSE C(K) = B(J) J = J + 1 ENDIF ENDIF ENDDO DO WHILE (I .LE. M) K = K + 1 C(K) = A(I) I = I + 1 ENDDO DO WHILE (J .LE. N) K = K + 1 C(K) = B(J) J = J + 1 ENDDO PRINT* PRINT*, 'Conjunto C gerado pela intercalacao de A com B.' WRITE(*,12) (C(I), I = 1, K) STOP END PROGRAM L4EXERC7 c Ler e imprimir um conjunto com W elementos reais. Ordenar os c elementos do conjunto em ordem crescente e imprimir o conjunto ordenado. REAL Conj(20), Aux INTEGER W, Tam, I, MaxElem LOGICAL Ordenado PARAMETER(MaxElem = 20) PRINT*, ‘Digite o numero de elementos do conjunto (Max:20).’ READ*, W IF (W .GT. MaxElem) THEN PRINT*,'Numeros maximo de elementos previsto: ',MaxElem STOP ENDIF PRINT*, 'Numero de elementos do conjunto:', W PRINT* PRINT*, ‘Digite os ‘ ,W, ‘ elementos do conjunto.’ READ*, (Conj(I), I = 1, W) PRINT*, 'Conjunto lido.' WRITE(*,12)(Conj(I), I = 1, W) 12 FORMAT(20(F6.2, 2X)) c Ordenar elementos do conjunto Tam = W Ordenado = .FALSE. DO WHILE ((Tam .GT. 1) .AND. (.NOT. Ordenado)) Ordenado = .TRUE. DO I = 1, Tam-1 IF ( Conj(I) .GT. Conj(I+1) ) THEN Aux = Conj(I) Conj(I) = Conj(I+1) Conj(I+1) = Aux Ordenado = .FALSE. ENDIF ENDDO Tam = Tam - 1 ENDDO c Imprimir conjunto ordenado PRINT* PRINT*, 'Conjunto ordenado de forma crescente' WRITE(*,12) (Conj(I), I = 1, W) CLOSE (7) STOP END Program L4EXERC8 c Ler e imprimir dois conjuntos ConjA e ConjB com M e N elementos respec. c Gerar e imprimir os seguintes conjuntos:UNIAO=A U B INTER=A^B DIFER = A - B . INTEGER ConjA(20), ConjB(20), AuniB(20), AinterB(20),AdifB(20), * NElemA, NElemB, NAuB, NAiB, NAdB, I, MaxElem LOGICAL Pertence PARAMETER( MaxElem = 20) DATA NAuB, NAiB, NAdB/3*0/ PRINT*, ‘Digite o numero de elementos de ConjA e ConjB (Max:20).’ READ*, NElemA, NElemB c Defender valores lidos com respeito ao tamanho do conjunto (20) IF ( (NElemA .GT. MaxElem) .OR. (NElemB .GT. MaxElem)) THEN PRINT*,'O numero de elementos deve ser <= ', MaxElem PRINT*, 'Programa sera encerrado.' STOP ENDIF PRINT*, 'Numero de elementos do conjunto A:', NElemA PRINT* PRINT*, 'Numero de elementos do conjunto B:', NElemB PRINT* READ*, (ConjA(I), I = 1, NElemA) READ*, (ConjB(I), I = 1, NElemB) PRINT*, 'Conjunto A lido apos digitacao.' WRITE(*,20) (ConjA(I), I = 1, NElemA) PRINT* PRINT*, 'Conjunto B lido apos digitacao.' WRITE(*,5) (ConjB(I), I = 1, NElemB) 5 FORMAT( 20( I4, 2X ) ) c uniao de conjuntos (ConjA, NElemA, ConjB, NElemC, AuniB, c NAuB); c ConjA esta contido na uniao DO I= 1, NElemA AuniB(I) = ConjA(I) ENDDO NAuB = NElemA c elementos de ConjB que nao Pertencem a ConjA DO I = 1, NElemB Pertence = .FALSE. J = 1 DO WHILE ((J .LE. NElemA) .AND. ( .NOT. Pertence)) IF (ConjB(I) .EQ. ConjA(J)) THEN Pertence = .TRUE. ELSE J = J + 1 ENDIF ENDDO IF (.NOT. Pertence) THEN NAuB = NAuB + 1 AuniB(NAuB) = ConjB(I) ENDIF ENDDO c intersecao de conjuntos (ConjA, NElemA, ConjB, NElemB, c AinterB, NAiB) DO I = 1, NElemA Pertence = .FALSE. J = 1 DO WHILE ((J .LE. NElemB) .AND. ( .NOT. Pertence)) IF (ConjA(I) .EQ. ConjB(J)) THEN Pertence = .TRUE. ELSE J = J + 1 ENDIF ENDDO IF (Pertence) THEN NAiB = NAiB + 1 AinterB(NAiB) = ConjA(I) ENDIF ENDDO c diferenca de conjuntos (ConjA, NElemA, ConjB, NElemB, c AdifB, NAdB); DO I = 1, NElemA Pertence = .FALSE. J = 1 DO WHILE ((J .LE. NElembB) .AND. ( .NOT. Pertence)) IF (ConjA(I) .EQ. ConjB(J)) THEN Pertence = .TRUE. ELSE J = J + 1 ENDIF ENDDO IF (.NOT. Pertence) THEN NAdB = NAdB + 1 AdifB(NAdB) = ConjA(I) ENDIF ENDDO c imprimir conjunto AuniB com NAuB elementos PRINT* PRINT*, 'Elementos do Conjunto AvB' WRITE(*,25) (AuniB(I), I = 1, NAuB) c imprimir conjunto AinterB com NAiB elementos; PRINT* PRINT*, 'Elementos do Conjunto A inter B' WRITE(*,25) (AinterB(I), I = 1, NAiB) c imprimir conjunto AdifB com NAdB elementos; PRINT* PRINT*, 'Elementos do Conjunto A-B' WRITE(*,25) (AdifB(I), I = 1, NAdB) 25 FORMAT(3X, 10(I4, 2X ) ) STOP END PROGRAM L4EXERC9 c C Ler e imprimir a matricula, o nome (TabAluno(Matricula,Nome)) c e a nota de uma prova de uma turma (TabProva(Aluno)), c com no maximo, 30 alunos. Calcular, armazenar e imprimir a media c aritmetica da prova. A seguir imprimir matricula, nome e a nota dos c alunos cuja nota seja maior ou igual a media da prova. CHARACTER Matric*5, Nome*30, TabAlunos(30,2)*30 REAL Nota, Media, TabProva(31), Soma INTEGER Mat, Alunos, MaxAlu, I PARAMETER (MaxAlu = 30) DATA Mat, Alunos/2*0/ PRINT*, 'Digite primeira matricula.' READ(*,10) Matric 10 FORMAT(A5) DO WHILE (Matric .NE. ‘00000’) PRINT*,’Digite nome nas primeiras 20 pos e nota nas 5 proxs.’ READ(*, 20) Nome, Nota 20 FORMAT(A30, F5.2) Mat = Mat + 1 IF (Mat .GT. MaxAlu) THEN PRINT*,' Num de alunos ultrapassa ', MaxAlu PRINT*,' Programa sera encerrado.' STOP ENDIF TabAlunos(Mat,1) = Matric TabAlunos(Mat,2) = Nome c as variaveis Mat e Alunos representam um mesmo aluno Alunos = Alunos + 1 TabProva(Alunos) = NotaPRINT*, 'Digite proxima matricula (00000-encerra).' READ(*,10) Matric ENDDO PRINT* PRINT*,' Informacoes dos alunos após digitacao.' DO I = 1, Mat PRINT* WRITE(*,40) TabAlunos(I,1), TabAlunos(I,2), TabProva(I) 40 FORMAT(5X, A5, 2x, A30, 2X, F5.2) ENDDO c calcular media da prova Soma = 0 DO I = 1, Alunos Soma = Soma + TabProva(I) ENDDO Media = Soma/Alunos TabProva(Alunos+1) = Media PRINT* PRINT*,' Total de Provas/Alunos:', Alunos PRINT* WRITE(*,50) TabProva(Alunos+1) 50 FORMAT(3X, 'Media da prova:', F5.2) PRINT* c imprimir dados dos alunos com nota >= a media da prova PRINT*, ' Alunos com nota >= a media da prova.' DO I = 1, Alunos IF (TabProva(I) .GE. TabProva(Alunos+1)) THEN PRINT* WRITE(*,40) TabAlunos(I,1), TabAlunos(I,2), TabProva(I) ENDIF ENDDO STOP END PROGRAM L4EXERC10 c Ler e imprimir um conjunto de valores reais que representam as alturas de várias c pessoas. Encontrar e imprimir as duas maiores alturas lidas e imprima quantas c pessoas cada uma dessas alturas. O conjunto devera ser varrido uma unica vez. REAL Conj(20), Maior1, Maior2, ValorLido INTEGER TotM1, TotM2, I, MaxElem, NElem PARAMETER(MaxElem = 20) NElem = 0 PRINT*, 'Digite primeiro valor do conjunto.' READ*, ValorLido DO WHILE (ValorLido .NE. -5555) NElem = NElem + 1 IF (NElem .GT. MaxElem) THEN PRINT*,' Num de valores lidos ultrapassa ', MaxElem PRINT*,' Programa sera encerrado.' STOP ENDIF Conj(NElem) = ValorLido PRINT*, 'Digite proximo valor do conjunto (-55555-encerra).' READ*, ValorLido ENDDO PRINT*, 'Numero de elementos do conjunto:', NElem PRINT* PRINT*, 'Conjunto lido apos digitacao.' WRITE(*,15) (Conj(I), I = 1, NElem) 15 FORMAT (3X, 10(F5.2, 2X)) PRINT* Maior1 = Conj(1) TotM1 = 1 Maior2 = Conj(1) TotM2 = 1 DO I = 2, NElem IF (Conj(I) .GT. Maior1) THEN Maior2 = Maior1 TotM2 = TotM1 Maior1 = Conj(I) TotM1 = 1 ELSE IF (Conj(I) .EQ. Maior1) THEN TotM1 = TotM1 + 1 ELSE IF (Conj(I) .GT. Maior2) THEN Maior2 = Conj(I) TotM2 = 1 ELSE IF (Conj(I) .EQ. Maior2) THEN TotM2 = TotM2 + 1 ENDIF ENDIF ENDIF ENDIF ENDDO PRINT*, ' Maior valor do conjunto:', Maior1 PRINT*, 'Total de valor(es) lido(s):', TotM1 PRINT* PRINT*, ' Segundo maior valor:', Maior2 PRINT*, 'Total de valor(es) lido(s):', TotM2 STOP END PROGRAM L4EXERC11 c Ler e imprimir as matrizes : A mxn, B pxq e C rxs. c Calcular e imprimir : EXP = A + B * (C * A)T INTEGER A(10,10), B(10,10), C(10,10), CxA(10,10), TCxA(10,10), * BxTCxA(10,10), Exp(10,10), M, N, P, Q, R, S, Lin, Col, * K, MaxInd PARAMETER (MaxInd = 10) PRINT*, ‘Digite numero de linhas e colunas matriz A(Max:10).’ READ*, M, N IF (( M.GT.MaxInd) .OR. ( N.GT.MaxInd)) THEN PRINT*,'Dimensao da matriz invalida. Programa sera cancelado.' STOP ENDIF PRINT*, ‘Digite elementos da matriz A(linha por linha).’ DO Lin = 1, M READ*, (A(Lin, Col), Col = 1, N) ENDDO c ler e defender dimensao da matriz B PRINT*, ‘Digite numero de linhas e colunas matriz B(Max:10).’ READ*, P, Q IF (( P.GT.MaxInd) .OR. ( Q.GT.MaxInd)) THEN PRINT*,'Dimensao da matriz invalida. Programa sera cancelado.' STOP ENDIF PRINT*, ‘Digite elementos da matriz B(linha por linha).’ DO Lin = 1, P READ*, (B(Lin, Col), Col = 1, Q) ENDDO c ler e defender dimensao da matriz C PRINT*, ‘Digite numero de linhas e colunas matriz C(Max:10).’ READ*, R, S IF (( R.GT.MaxInd) .OR. ( S.GT.MaxInd)) THEN PRINT*,'Dimensao da matriz invalida. Programa sera cancelado.' STOP ENDIF PRINT*, ‘Digite elementos da matriz C(linha por linha).’ DO Lin = 1, R READ*, (C(Lin, Col), Col = 1, S) ENDDO PRINT*, 'Linhas e colunas da matriz A:', M, N PRINT*, 'Linhas e colunas da matriz B:', P, Q PRINT*, 'Linhas e colunas da matriz C:', R, S PRINT* PRINT*, ' MATRIZ A' DO Lin = 1, M WRITE(*,15) (A(Lin, Col), Col = 1, N) ENDDO PRINT* PRINT*, ' MATRIZ B' DO Lin = 1, P WRITE(*,15) (B(Lin, Col), Col = 1, Q) ENDDO PRINT* PRINT*, ' MATRIZ C' DO Lin = 1, R WRITE(*,15) (C(Lin, Col), Col = 1, S) ENDDO 5 FORMAT(2I2) 10 FORMAT(10I4) 15 FORMAT (10(I5, 2X)) c Calcular C x A, se s = m ( CxA rxn) IF (S .NE. M) THEN PRINT*, 'Dimensao de C e A incompativeis para operacao.' PRINT*, 'Programa cancelado.' STOP ENDIF DO Lin = 1, R DO Col = 1, N CxA(Lin,Col) = 0 DO K = 1, M CxA(Lin,Col) = CxA(Lin,Col) + C(Lin,K)*A(K,Col) ENDDO ENDDO ENDDO PRINT* PRINT*, ' MATRIZ CxA' DO Lin = 1, R WRITE(*,15) (CxA(Lin, Col), Col = 1, N) ENDDO c transposta de CxA (TCxA nxr) DO Lin = 1, R DO Col = 1, N TCxA(Lin,Col) = CxA(Col,Lin) ENDDO ENDDO PRINT*, ' MATRIZ TCXA' DO Lin = 1, N WRITE(*,15) (TCxA(Lin, Col), Col = 1, R) ENDDO c Calcular B * (C * A)T (B*TCxA pxr) IF (Q .NE. N) THEN PRINT*, 'Dimensao de B e TCxA incompativeis para operacao.' PRINT*, 'Programa cancelado.' STOP ENDIF DO Lin = 1, P DO Col = 1, R BxTCxA(Lin,Col) = 0 DO K = 1, N BxTCxA(Lin,Col) = BxTCxA(Lin,Col) + B(Lin,K)*TCxA(K,Col) ENDDO ENDDO ENDDO PRINT* PRINT*, ' MATRIZ BxTCXA' DO Lin = 1, P WRITE(*,15) (BxTCxA(Lin, Col), Col = 1, R) ENDDO c calcular Exp = A + BxTCxA (Exp mxn) IF ((M .NE. P) .OR. (N .NE. R)) THEN PRINT*, 'Dimensao de A e BxTCxA incompativeis para operacao.' PRINT*, 'Programa cancelado.' ENDIF DO Lin = 1, M DO Col = 1, N Exp(Lin,Col) = A(Lin,Col) + BxTCxA(Lin,Col) ENDDO ENDDO PRINT* PRINT*, ' EXP = A + B * (C * A)T' DO Lin = 1, M WRITE(*,15) (Exp(Lin, Col), Col = 1, N) ENDDO STOP END PROGRAM L4EXERC12 c Ler e imprimir uma matriz de reais nxn. A seguir: c imprimir a soma dos elementos da linha Linha; c imprimir o maior elemento da coluna Coluna; ccalcular e imprimir o produto dos elementos da diagonal principal; c imprimir a soma dos elementos da diagonal secundaria; c imprimir os elementos que estao acima da diagonal principal; REAL MatReal (20,20), SomaLinha, MaiorCol, ProdDP, SomaDS INTEGER Lin, Col, N, MaxInd, Linha, Coluna PARAMETER (MaxInd = 20) c ler e defender dimensao da matriz PRINT*, ‘Digite a dimensao da matriz quadrada(Max:20).’ READ*, N IF (N .GT. MaxInd) THEN PRINT*,'Dimensao da matriz invalida. Programa sera cancelado.' STOP ENDIF PRINT*, ‘Digite elementos da matriz(linha por linha).’ DO Lin = 1, N READ*, (MatReal(Lin, Col), Col = 1, N) ENDDO PRINT*, 'Linhas e colunas da matriz nxn:', N PRINT* PRINT*, ' Matriz Lida' DO Lin = 1, N WRITE(*,15) (MatReal(Lin, Col), Col = 1, N) ENDDO 15 FORMAT (20(F5.2, 2X)) c imprimir a soma dos elementos da linha Linha; READ*, Linha SomaLinha = 0 DO Col = 1, N SomaLinha = SomaLinha + MatReal(Linha,Col) ENDDO PRINT* WRITE(*,20) Linha, SomaLinha 20 FORMAT(' Soma do elementos da linha ', I2, ' :', F7.2) c imprimir o maior elemento da coluna Coluna; READ*, Coluna MaiorCol = MatReal(1,Coluna) DO Lin = 1, N IF (MatReal(Lin,Coluna) .GT. MaiorCol) THEN MaiorCol = MatReal(Lin,Coluna) ENDIF ENDDO PRINT* WRITE(*,25) Coluna, MaiorCol 25 FORMAT(' Maior elemento da coluna ',I2, ':', F5.2) c imprimir o produto dos elementos da diagonal principal; ProdDP = 1 DO Lin = 1, N ProdDP = ProdDP * MatReal(Lin,Lin) ENDDO PRINT* WRITE(*,30) ProdDP 30 FORMAT(' Produto dos elementos da diag. princ:', F7.2) c imprimir a soma dos elementos da diagonal secundaria; SomaDs = 0 DO Lin = 1, N SomaDS = SomaDS + MatReal(Lin,N-Lin+1) ENDDO PRINT* WRITE(*,35) SomaDS 35 FORMAT(' Soma dos elementos da diag. sec.:', F7.2) c imprimir os elementos que estao acima da diagonal principal; PRINT* PRINT*,' Elementos acima da diagonal principal' DO Lin = 1, N-1 DO Col = Lin+1, N Write(*,40) Lin, Col, MatReal(Lin,Col) 40 FORMAT(10X, '(',I2,',',I2,')', 5x, F5.2) ENDDO ENDDO c imprimir os elementos que estao abaixo da diagonal principal; PRINT* PRINT*,' Elementos abaixo da diagonal principal' DO Lin = 2, N DO Col = 1, Lin-1 Write(*,40) Lin, Col, MatReal(Lin,Col) ENDDO ENDDO STOP END PROGRAM L4EXERC13 c Ler e imprimir a matricula, o nome (TabAluno(Mat,Nome)) c e a nota de tres prova de uma turma, com no maximo, 30 alunos. c Calcular e armazenar em TabNotas(Aluno, Nota) a media aritmetica c de cada aluno e de cada prova. Imprimir matricula, nome, as notas c e as medias dos alunos, e a media das provas da turma. CHARACTER Matric*5, Nome*30, TabAlunos(31,2)*30 REAL TabNotas(31,4), Notas(3), MedAluno, MedProva, Soma INTEGER Alunos, MaxAlu, I, J PARAMETER (MaxAlu = 30) DATA Alunos/0/ PRINT*, ‘Digite a mtricula do primeiro aluno.’ READ(*,10) Matric 10 FORMAT(A5) DO WHILE (Matric .NE. ‘00000’) PRINT*, ‘Digite nome nas 30 primeiras pos e as 3 notas c cada uma delas ocupando 5 posicoes.’ READ(*, 20) Nome, (Notas(I), I = 1, 3) 20 FORMAT(A30, 3F5.2) Alunos = Alunos + 1 IF (Alunos .GT. MaxAlu) THEN PRINT*,' Num de alunos ultrapassa ', MaxAlu PRINT*,' Programa sera encerrado.' STOP ENDIF TabAlunos(Alunos,1) = Matric TabAlunos(Alunos,2) = Nome DO J = 1, 3 TabNotas(Alunos,J) = Notas(J) ENDDO PRINT*, ‘Digite a mtricula do proximo aluno(00000-encerra).’ READ(*,10) Matric ENDDO TabAlunos(Alunos+1,1) = ' ' TabAlunos(Alunos+1,2) = 'Medias das provas e geral ' PRINT* PRINT*,'Numero de alunos da turma:', Alunos PRINT* PRINT*,' Informacoes dos alunos lidas do teclado.' DO I = 1, Alunos PRINT* WRITE(*,40) TabAlunos(I,1), TabAlunos(I,2), * (TabNotas(I,J),J=1,3) FORMAT(5X, A5, 2x, A30, 2X, 3(F5.2, 2X)) ENDDO c calcular media dos alunos e armazenar na tabela de notas DO I = 1, Alunos Soma = 0 DO J = 1, 3 Soma = Soma + TabNotas(I,J) ENDDO MedAluno = Soma/3 TabNotas(I,4) = MedAluno ENDDO c calcular medias das provas e armazenar na tabela de notas DO J = 1, 4 Soma = 0 DO I = 1, Alunos Soma = Soma + TabNotas(I,J) ENDDO MedProva = Soma/Alunos TabNotas(Alunos+1,J) = MedProva ENDDO c a saida tera o seguinte formato (layout) c Tabela de alunos: notas e medias c Mat Nome do aluno Nota1 Nota2 Nota3 Media cxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xx.xx xx.xx xx.xx xx.xx PRINT* PRINT* WRITE(*,50) 50 FORMAT(22X, 'Tabela de alunos: notas e medias') PRINT* WRITE(*,60) 60 FORMAT(' Mat Nome do aluno Nota1 Nota2 No *ta3 Media') DO I = 1, Alunos+1 WRITE(*,70) TabAlunos(I,1), TabAlunos(I,2), * (TabNotas(I,J), J = 1, 4) 70 FORMAT(A5, 2X, A30, 2X, 4(F5.2, 2X)) ENDDO STOP END PROGRAM L4EXERC14 c Ler e imprimir a matricula, o nome (TabAluno(Turma, Mat, Nome)) c e a nota de tres prova de duas turmas, cada turma com no maximo c 30 alunos. A leitura dos dados de uma turma termina quando for c lida a matricula 00000. c A leitura dos dados termina quando for lida a matricula $$$$$. c Calcular e armazenar no agregado TabNotas(Turma, Aluno, Nota): c a media aritmetica de cada aluno; c a media aritmetica de cada prova de cada turma; c a media aritmetica de cada turma. c Imprimir as tabelas TabAluno e TabNotas, turma por turma, c com mensagens apropriadas. CHARACTER Matric*5, Nome*30, TabAlunos(2,31,2)*30 REAL TabNotas(2,31,4), Notas(3), MedAluno, MedProva, Soma INTEGER Alunos, MaxAlu, I, J, AluTurma(2) PARAMETER (MaxAlu = 30) READ(*,20) Matric, Nome, (Notas(I), I = 1, 3) 20 FORMAT(A5, A30, 3F5.2) DO WHILE (Matric .NE. '$$$$$') Turma = Turma + 1 Alunos = 0 DO WHILE ((Matric .NE. '00000') Alunos = Alunos + 1 IF (Alunos .GT. MaxAlu) THEN PRINT*,' Num de alunos ultrapassa ', MaxAlu PRINT*,' Programa sera encerrado.' STOP ENDIF TabAlunos(Turma,Alunos,1) = Matric TabAlunos(Turma,Alunos,2) = Nome DO J = 1, 3 TabNotas(Turma,Alunos,J) = Notas(J) ENDDO AluTurma(Turma) = Alunos PRINT*, ‘Digite matricula 00000 para encerrar turma.’ READ(*,20) Matric, Nome, (Notas(I),I = 1, 3) ENDDO PRINT*, ‘Digite matricula $$$$$ para encerrar digitacao.’ READ(*,20) Matric, Nome, (Notas(I), I = 1, 3) ENDDO TabAlunos(Turma,Alunos+1,1) = ' ' TabAlunos(Turma,Alunos+1,2) = 'Medias das provas e geral ' DO K = 1, Turma PRINT* PRINT*,' Numero de alunos da turma ', K, ':',AluTurma(K) PRINT* PRINT*,' Informacoes dos alunos lidas do arquivo.' DO I = 1, AluTurma(K) PRINT* WRITE(*,40) TabAlunos(K,I,1), TabAlunos(K,I,2), * (TabNotas(K,I,J),J=1,3) 40 FORMAT(5X, A5, 2x, A30, 2X, 3(F5.2, 2X)) ENDDO PRINT* ENDDO c calcular media dos alunos e armazenar na tabela de notas DO K = 1, Turma DO I = 1, AluTurma(K) Soma = 0 DO J = 1, 3 Soma = Soma + TabNotas(K,I,J) ENDDO MedAluno = Soma/3 TabNotas(K,I,4) = MedAluno ENDDO ENDDO c calcular medias das provas e armazenar na tabela de notas DO K = 1, Turma DO J = 1, 4 Soma = 0 DO I = 1, AluTurma(K) Soma = Soma + TabNotas(K,I,J) ENDDO MedProva = Soma/AluTurma(K) TabNotas(K,AluTurma(K)+1,J) = MedProva ENDDO ENDDO c a saida tera o seguinte formato (layout) c Tabela de alunos: notas e medias c Turma x c Mat Nome do aluno Nota1 Nota2 Nota3 Media cxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx xx.xx xx.xx xx.xx xx.xx PRINT* PRINT* WRITE(*,50) 50 FORMAT(22X, 'Tabela de alunos: notas e medias') DO K = 1, Turma PRINT* WRITE(*,60) K 60 FORMAT(32X,'Turma ', I2) PRINT* WRITE(*,70) 70 FORMAT(' Mat Nome do aluno Nota1 Nota2 * Nota3 Media') DO I = 1, AluTurma(K)+1 WRITE(*,80) TabAlunos(K,I,1), TabAlunos(K,I,2), * (TabNotas(K,I,J), J = 1, 4) 80 FORMAT(A5, 2X, A30, 2X, 4(F5.2, 2X)) ENDDO ENDDO STOP END Exercícios de Subprogramas PROGRAM L5EXERC1 c Ler e imprimir um conjunto de inteiros. A leitura termina c quando encontrado o flag = -77. Imprimir o conjunto lido c e o numero de componentes. Ordenar os elementos do conjunto em ordem c crescente. A seguir ler 5 valores inteiros, um a um, c e verifique se o valor ocorre ou nao no conjunto. Imprimir os c valores lidos com mensagens se ocorrem ou nao no conjunto e, c caso ocorra, qual sua posicao. INTEGER NElem, Conj(30) CHARACTER Mensa*30 CALL LerConj(Conj, NElem) PRINT*, 'Numero de elementos no conjunto:', NElem PRINT* Mensa = 'Conjunto lido do arquivo' CALL ImpConj(Conj, NElem,Mensa) c ordenar conjunto CALL OrdConj(Conj,NElem) Mensa = 'Conjunto ordenado de forma crescente' CALL ImpConj(Conj, NElem, Mensa) c consultar elementos no conjunto CALL ConsConj(Conj, NElem) STOP END SUBROUTINE LerConj(PConj, PNElem) INTEGER PNElem, PConj(30), MaxElem, ValorLido, Flag PARAMETER(MaxElem = 30, Flag = -77) c Ler conjunto com valores inteiros ate valor lido for -1 PNElem = 0 PRINT*, ‘Digite o primeiro valor do conjunto.’ READ* ,ValorLido DO WHILE (ValorLido .NE. Flag) PNElem = PNElem + 1 c Defender posicao considerada com respeito ao tamanho do conjunto (30) IF ( PNElem .GT. MaxElem) THEN PRINT*,'O numero de elementos deve ser <= a 30. * Programa sera encerrado.' STOP ENDIF PConj(PNElem) = ValorLido PRINT*, ‘Digite o proximo valor do conjunto (-77 encerra).’ READ*,ValorLido ENDDO RETURN END SUBROUTINE ImpConj(PConj, PNElem, Mensag) INTEGER PNElem, PConj(30), I CHARACTER Mensag*30 PRINT* PRINT*, Mensag WRITE(*,12) (PConj(I), I = 1, PNElem) 12 FORMAT( 10( I4, 2X ) ) PRINT* RETURN END SUBROUTINE OrdConj(C, N) INTEGER N, C(30), Tam, I LOGICAL Ordenado Ordenado = .FALSE. Tam = N DO WHILE ((Tam .GT. 1) .AND. (.NOT. Ordenado)) Ordenado = .TRUE. DO I = 1, Tam - 1 IF (C(I) .GT. C(I+1)) THEN CALL Trocar(C(I), C(I+1)) Ordenado = .FALSE. ENDIF ENDDO Tam = Tam - 1 ENDDO RETURN END SUBROUTINE Trocar(A, B) INTEGER A ,B, AUX AUX = A A = B B = Aux RETURN END SUBROUTINE ConsConj(C, N) INTEGER N, C(30), ValorLido, Posicao, Pos c ler 5 valores e verificar se ocorrem no conjunto e em qual posicao DO J = 1, 5 PRINT*, ‘Digite valor ‘, J , ‘ para verificar ocorrencia.’ READ*, ValorLido Pos = Posicao(ValorLido, C, N) PRINT* IF ( Pos .NE. 0) THEN PRINT*, ValorLido, ' pertence ao conjunto,',' na posicao *', Pos ELSE PRINT*, ValorLido, ' nao pertence ao conjunto.' ENDIF ENDDO STOP END INTEGER FUNCTION Posicao(Valor, Conj, N) INTEGER Valor, N, Conj(30), Meio, Inicio, Fim, Pos c busca em conjunto ordenado: pesquisa binaria Pos = 0 Inicio = 1 Fim = N DO WHILE ((Inicio .LE. Fim) .AND. (Pos .EQ. 0)) Meio = (Inicio + Fim)/2 IF (Valor .EQ. Conj(Meio)) THEN Pos = Meio ELSE IF (Valor .GT. Conj(Meio)) THEN Inicio = Meio + 1 ELSE Fim = Meio - 1 ENDIF ENDIF ENDDO Posicao = Pos RETURN END PROGRAM L5EXERC2 c Ler e imprimir as matrizes : A mxn, B pxq e C rxs. c Calcular e imprimir : EXP = A + B * (C * A)T INTEGER A(10,10), B(10,10), C(10,10), CxA(10,10), TCxA(10,10), * BxTCxA(10,10), Exp(10,10), M, N, P, Q, R, S, LCxA, CCxA, * LBxT, CBxT CHARACTER Mensa1*20, Mensa2*30 CALL LerMat(A, M, N) CALL LerMat(B, P, Q) CALL LerMat(C, R, S) Mensa1 = 'Linhas e colunas da ' Mensa2 = 'Matriz A' CALL ImpMat(A, M, N, Mensa1, Mensa2) Mensa2 = 'Matriz B' CALL ImpMat(B, P, Q, Mensa1, Mensa2) Mensa2 = 'Matriz C' CALL ImpMat(C, R, S, Mensa1, Mensa2) CALL MultMat(C, R, S, A, M, N, CxA, LCxA, CCxA) Mensa2 = 'Matriz CxA' CALL ImpMat(CxA, LCxA, CCxA, Mensa1, Mensa2) CALL Transp(CxA, LCxA, CCxA, TCxA) Mensa2 = 'Matriz Transposta de CxA' CALL ImpMat(TCxA, CCxA, LCxA, Mensa1, Mensa2) c Calcular B * (C * A)T (BxTCxA pxr) CALL MultMat(B, P, Q, TCxA, CCxA, LCxA, BxTCxA, LBxT, CBxT) Mensa2 = 'Matriz B x TCXA' CALL ImpMat(BxTCxA, LBxT, CBxT, Mensa1, Mensa2) c calcular Exp = A + BxTCxA (Exp mxn) CALl SomaMat(A, M, N, BxTCxA, LBxT, CBxT, Exp) Mensa2 = ' Matrix EXP = A + B *
Compartilhar