Programação de Computadores Instituto Politécnico de Viseu Escola Superior de Tecnologia Engenharia Electrotécnica 1º Ano - 1º Semestre Ficha de Trabalho N.º5 Soluções Propostas 1 - Elabore um programa que leia um vector de n elementos inteiros (em que n é um valor inteiro entre 2 e 9 especificado pelo utilizador) e apresente no monitor os elementos pela ordem inversa. program Ordem_Inversa; {apresenta no monitor os elementos pela ordem inversa} uses crt; type vector=array[1..9] of integer; var i,n: integer; numeros:vector; begin clrscr; write(' Quantos elementos tem o vector (2 a 9)?'); readln(n); for i := 1 to n do begin write('Digite o elemento ', i,' : '); readln(numeros[i]); end; writeln('Elementos por ordem inversa:'); for i := 1 to n do write(' ',numeros[n+1-i]); writeln; writeln; end. 2 - Elabore um programa que, dado um array de 8 elementos, calcule a soma desses elementos. Os elementos devem ser inteiros dados pelo utilizador. program somaValoresArray; {Determina a soma de um vector com 8 elementos} uses crt; var i, soma: integer; numeros: array [1..8] of integer; begin clrscr; for i := 1 to 8 do begin write('Digite o ',i,'º elemento: '); readln(numeros[i]); end ; soma := 0; for i := 1 to 8 do soma := soma + numeros[i]; writeln(' end. A soma dos 8 elementos é ',soma); 3 - Elabore um programa que, considerando um vector com 6 inteiros, determine a soma dos elementos de ordem par. program somaValoresArray; {Determina a soma dos elementos de ordem par de um vector com 6 elementos} uses crt; var i, soma: integer; numeros: array [1..6] of integer; begin clrscr; for i := 1 to 6 do begin write('Digite o ',i,'º elemento: '); readln(numeros[i]); end; soma := 0; for i := 1 to 6 do { ou for i := 1 to 3 do } if (i mod 2 = 0) then { soma := soma + numeros[2*i];} soma := soma + numeros[i]; writeln('A soma dos elementos de ordem par é ',soma); end. 4 - Elabore um programa que peça um array com n elementos inteiros e determine o valor máximo, o valor mínimo e as respectivas posições. program maxMinArray; {Determina o maximo e o minimo de um vector com N elementos} uses crt; const maximo=100; var i, n, imax, imin, max, min: integer; numeros: array [1..maximo] of integer; begin clrscr; write('Quantos elementos tem o array? '); readln(n); for i := 1 to n do begin write('Digite o ',i,'º elemento: '); readln(numeros[i]) end; imax := 1; { inicialização das variáveis } imin := 1; max := numeros[imax]; min := numeros[imin]; for i := 2 to n do if numeros[i] > max then begin imax := i; max := numeros[imax] end else if numeros[i] < min then begin imin := i; min := numeros[imin] end; writeln('O maximo do vector é ',max, ' ocorre na posição ',imax); writeln('O minimo do vector é ',min, ' e ocorre na posição ',imin); end. 2/12 { Outra forma de fazer o mesmo...} program maxMinArray2; { Versão Alternativa } uses crt; const maximo=100; var i, n, imax, imin, max, min: integer; numeros: array [1..maximo] of integer; begin clrscr; write('Quantos elementos tem o array? '); readln(n); for i := 1 to n do begin write('Digite o elemento ', i, ': '); readln(numeros[i]) end; { inicialização das variáveis } imax := 1; imin := 1; for i := 2 to n do if numeros[i] > numeros[imax] then imax := i; else if numeros[i] < numeros[imin] then imin := i; writeln('O maximo writeln('O minimo readln ',numeros[imax], ' e a sua posição ',numeros[imin], ' e a sua posição ',imax); ',imin); end.} 5 - Elabore um programa que determine o produto interno entre dois vectores de n componentes. program ProdutoInterno; {Determina o produto interno entre dois vectores de n componentes} uses crt; const maximo=50; var i, n, prod: integer; v1,v2: array [1..maximo] of integer; begin clrscr; write('Quantos elementos tem cada array? '); readln(n); for i := 1 to n do begin write(i,'º elemento de v1, v1[',i,']= '); readln(v1[i]) end; for i := 1 to n do begin write(i,'º elemento de v2, v1[',i,']= '); readln(v2[i]) end; prod:=0; for i := 1 to n do prod:=prod+v1[i]*v2[i]; writeln('O produto interno entre os dois vectores é ',prod); writeln; end. 3/12 6 - Elabore um programa que leia dois vectores de n elementos cada (inteiros) e determine um terceiro com 2n elementos que contenha os elementos do primeiro vector intercalados com os do segundo vector, mas estes pela ordem inversa da original. Mostre o vector final no monitor. Considere n = 4 elementos, por exemplo: vector x = [1 3 5 7] => vector final = [1 8 3 6 5 4 7 2] vector y = [2 4 6 8] program Intercala; {Intercala os elementos de 2 vectores, o 2º por ordem inversa} uses crt; const maximo=50; var i, n: integer; v1,v2: array [1..maximo] of integer; v: array [1..2*maximo] of integer; begin clrscr; write('Quantos elementos tem cada array? '); readln(n); for i := 1 to n do begin write(i,'º elemento de v1, v1[',i,']= '); readln(v1[i]) end; for i := 1 to n do begin write(i,'º elemento de v2, v1[',i,']= '); readln(v2[i]) end; for i := 1 to n do begin v[2*i-1]:=v1[i]; v[2*i]:=v2[n+1-i]; end; writeln('Vectores iniciais:'); write('v1: '); for i := 1 to n do write(v1[i],' '); write(' v2: '); for i := 1 to n do write(v2[i],' '); writeln; writeln('Vector final:'); write('v: '); for i := 1 to 2*n do write(v[i],' '); writeln; end. 7 - Faça um programa que, a partir de um vector de dimensão N, determine o número que aparece mais vezes bem como as posições no vector onde ele aparece. program ProcuraRep; {Determina o número queaparece mais vezes bem como as posições no vector onde ele aparece} uses crt; const n=8; var i,j,maisrep,rep,num: integer; t: array [1..n] of integer; 4/12 begin clrscr; for i := 1 to n do begin write('Introduza o ',i,'º elemento do vector: '); readln(t[i]) end; maisrep:=0; for i := 1 to n do begin rep:=0; for j:=i+1 to n do if (t[j]=t[i]) then rep:=rep+1; if (rep>maisrep) then begin maisrep:=rep; num:=t[i]; end; end; if (maisrep>0) then begin writeln('O elemento mais repetido é o nº ',num); writeln(' e ocorre ',maisrep+1,' vezes,'); write('nas posições:'); for i := 1 to n do if (t[i]=num) then write(' ',i); end else writeln('Não há números repetidos!'); writeln; end. 8 - Dado um vector com N elementos, calcular a maior diferença existente entre os seus elementos. Ex: A[1] A[2] A[3] A[4] A[5] 1 6 3 2 10 maior diferença = 9 PROGRAM maior_dif; const N = 8; var a : array[1..N] of integer; i,max,min,dif : integer; begin writeln('Introduza os ',N,' elementos dos array:'); for i:=1 to N do begin write('A[',i,'] = '); readln(a[i]); end; max:=a[1]; min:=a[1]; for i:=2 to N do begin if a[i] > max then max:=a[i]; if a[i] < min then min:=a[i]; end; dif:=max-min; writeln('A maior diferença é ',dif); end. 5/12 9 - Dado um vector não ordenado de números inteiros positivos, mostrar a menor diferença entre 2 elementos, bem como os respectivos números de ordem no vector. A[1] A[2] A[3] A[4] A[5] 1 6 3 2 10 menor diferença = 1 posições 1 e 4 Ex: PROGRAM menor_dif; const n = 5; var a : array[1..n] of integer; i,j,men_dif : integer; begin writeln('Introduza os ',n,' elementos dos array:'); for i:=1 to n do begin write('A[',i,'] = '); readln(a[i]); end; men_dif:=abs(a[2]-a[1]); for i:=1 to n-1 do begin for j:=i+1 to n do if abs(a[i]-a[j]) < men_dif then men_dif:=abs(a[i]-a[j]); end; writeln('Menor diferença= ',men_dif); for i:=1 to n-1 do for j:=i+1 to n do if abs(a[i]-a[j])=men_dif then writeln(' Entre ',i,' e ',j); end. 10 - Numa lista de N valores determinar os valores maiores que os valores adjacentes, isto é, v[i-1] <v[i] > v[i+1]. 11 - Ler um vector A não ordenado de N inteiros e mostrar o vector na mesma sequência, ignorando os valores em duplicado. O número de elementos restantes (M) é também mostrado. Ex: A[1] 15 O vector resultante seria: 15 M=6 A[2] 31 A[3] 23 A[4] 15 A[5] 75 A[6] 23 31 23 75 41 85 A[7] 41 A[8] 15 A[9] 31 A[10] 85 12 - Dada uma matriz NxM de elementos inteiros, determinar o valor médio dos seus elementos, o valor máximo e o valor mínimo. program operacoesMatriz; { Determina media, maximo e minimo de uma matriz} uses crt; const lin=50; col=50; var i,j,n,m,max,min:integer; med:real; matriz: array[1..lin,1..col] of real; begin clrscr; write('N: '); readln(n); write('M: '); readln(m); max := -MAXINT; min := MAXINT; 6/12 med := 0; for i := 1 to n do for j := 1 to m do begin write('Elemento (',i,',',j,'): '); readln(matriz[i,j]); med := med + matriz[i,j]; if matriz[i,j] > max then max := matriz[i,j]; if matriz[i,j] < min then min := matriz[i,j]; end; writeln('Valor médio : ', med/(n*m):4:4); writeln('Valor máximo : ', max:4:4); writeln('Valor mínimo : ', min:4:4); readln; end. 13 - Modifique o programa anterior para uma matriz tri-dimensional NxMxP. program operacoesMatriz3D; {Determina media, maximo e minimo de uma matriz tridimensional} uses crt; const lin=15; col=15; profundidade=15; var i,j,k,n,m,p:integer; med,max,min:real; matriz: array[1..lin,1..col,1..profundidade] of real; begin clrscr; write('N: '); readln(n); write('M: '); readln(m); write('P: '); readln(p); max := -MAXINT; min := MAXINT; med := 0; for i := 1 to n do for j := 1 to m do for k := 1 to p do begin write('Elemento (',i,',',j,',',k,'): '); readln(matriz[i,j,k]); med := med + matriz[i,j,k]; if matriz[i,j,k] > max then max := matriz[i,j,k]; if matriz[i,j,k] < min then min := matriz[i,j,k]; end; writeln('A m‚dia ‚: ', med/(n*m*p):4:4); writeln('O m ximo ‚: ', max:4:4); writeln('O m¡nimo ‚: ', min:4:4); readln; end. 7/12 14 - Escreva um programa em Pascal que leia um array bi-dimensional de valores inteiros com N linhas e M colulas e troque as linhas e colunas do array. program TranspoeMatriz; {Troca as linhas pelas colunas de uma matriz de inteiros} uses crt; const lin=100; col=100; var i,j,n,m,temp:integer; matriz: array[1..lin,1..col] of integer; begin clrscr; write('Número de linhas : '); readln(n); write('Número de colunas: '); readln(m); for i := 1 to n do for j := 1 to m do begin write('Elemento (',i,',',j,'): '); readln(matriz[i,j]); end; writeln('Matriz Original:'); for i := 1 to n do begin for j := 1 to m do write(matriz[i,j]:4); writeln; end; writeln('Matriz Transposta:'); for j := 1 to m do begin for i := 1 to n do write(matriz[i,j]:4); writeln; end; end. 15 - Faça um programa que efectue o produto entre duas matrizes: A[m x n] e B[n x p]. Considere que m, n e p são variáveis globais com os valores 3, 2 e 2, respectivamente. 8/12 16 - Melhore o programa anterior por forma a que efectue o produto de duas matrizes de dimensão arbitrária, fornecida pelo utilizador. program MultiplicaMatriz; {Multiplicação de matrizes de inteiros} uses crt; const MM=50;NN=50;PP=50; var m,n,p,i,j,k:integer; A: array[1..MM,1..NN] of integer; B: array[1..NN,1..PP] of integer; C: array[1..MM,1..PP] of integer; begin clrscr; writeln('Cálculo do produto de duas matrizes, C=AxB'); write('Número de linhas da matriz A: '); readln(m); write('Número de colunas da matriz A: '); readln(n); write('Número de colunas da matriz B: '); readln(p); writeln('Introduza os elementos da matriz A: '); for i := 1 to m do for j := 1 to n do begin write(' Elemento (',i,',',j,'): '); readln(A[i,j]); end; writeln('Introduza os elementos da matriz B: '); for i := 1 to n do for j := 1 to p do begin write(' Elemento (',i,',',j,'): '); readln(B[i,j]); end; for i := 1 to m do for j := 1 to p do begin C[i,j]:=0; for k := 1 to n do C[i,j]:=C[i,j]+A[i,k]*B[k,j]; end; writeln('Matriz Produto C=AxB:'); for i := 1 to m do begin for j := 1 to p do write(C[i,j]:4); writeln; end; end. 9/12 17 - Escreva um programa que leia uma frase dada pelo utilizador e a escreva pela ordem inversa. program inverteString; {Inverte texto escrito pelo utilizador.} uses crt; const maximo=100; type texto = array[1..maximo] of char; var i, j: integer; frase: texto; a: char; begin clrscr; write('Escreva uma frase: '); i := 0; while not eoln do begin i := i + 1; read(frase[i]) end; readln; for j:= i downto 1 do write(frase[j]); readln end. 18 - Escreva um programa que leia uma string e escreva o número de vogais nela existentes. Por exemplo: Escreva uma frase: Quantas vogais tem esta frase? Número de vogais: 11 program contaVogais; uses crt; const maximo=100; var i, numeroVogais: integer; frase: string; {Conta o número de vogais numa frase.} begin write('Escreva uma frase: '); readln(frase); numeroVogais := 0; for i:= 1 to length(frase) do case frase[i] of 'a', 'e', 'i', 'o', 'u', 'y', 'A', 'E', 'I', 'O', 'U', 'Y': inc(numeroVogais); end; writeln('A frase tem ', numeroVogais,' vogais.'); readln; end. 19 - Escreva um programa que dadas duas string's, str1 e str2, como parâmetros de entrada faça a sua concatenação, devolvendo a string resultante em str1. Por exemplo, se str1 for "Aula" e str2 for "pratica" a função deverá devolver "Aulapratica" em str1. 10/12 20 - Preparar um programa que determine se uma palavra ou frase é palíndromo, isto é, uma cadeia de caracteres que seja idêntica nos dois sentidos. Ex.: ARARA PROGRAM palindromo; var palavra,inversa,caracter : string; i,lp : integer; begin write('Palavra: ');readln(palavra); inversa:=''; lp := ord(palavra[0]);{ ou lp:=length(palavra); } for i:=1 to lp do begin caracter:=palavra[i]; { ou caracter:=copy(palavra,i,1); } inversa:=caracter+inversa; end; if palavra = inversa then write(palavra,' é palíndromo') else write(palavra,' não é palíndromo'); end. 21 - Elabore um programa que retire todos os A e mostre no monitor o texto depois de modificado. Ex.: Ontem ja era tarde => Ontem j er trde PROGRAM tira_car; var texto,saida,carac : string; lp,indice : integer; begin write('Texto: ');readln(texto); lp:=ord(texto[0]);{ ou lp:=length(texto); } saida:=''; for indice:=1 to lp do begin carac:=texto[Indice];{ ou carac:=copy(texto,indice,1); } if (carac <> 'A') and (carac <> 'a') then saida:=saida+carac; end; writeln(‘A string sem As é : ’,saida); end. 22 - Elabore um programa que calcule e mostre o número de vezes que a string AB aparece num texto. PROGRAM pesquisa_AB; var texto,carac : string; indice,lp,contador : integer; begin write('Introduza um texto: '); readln(texto); lp:=ord(texto[0]); { ou lp:=length(texto); } indice:=1;contador:=0; while indice <= lp-1 do begin carac:=texto[Indice] + texto [Indice+1]; { ou carac:=copy(texto,indice,2); } if carac='AB' then begin contador:=contador+1; indice:=indice+2; end else indice:=indice+1; end; writeln('AB apareceu ',contador,' vezes'); 11/12 end. 23 - Dado um texto, faça um programa que calcule e mostre no monitor o número de vezes que aparece cada uma das letras do alfabeto nesse texto. PROGRAM freq_car; var i,c,j,l : integer; a : array[1..26] of integer; texto : string; ca : char; begin write(‘Escreva um texto: ‘); readln(texto); l:=texto[0]; for i:=1 to 26 do a[I]:=0; for i:=1 to l do begin ca:=texto[i]; c:=ord(ca); if ((c >= 65) and (c <= 90)) or ((c>=97) and (c <= 122)) then begin if c >= 97 then c:=c-32; j:=c-64; a[j]:=a[j]+1; end; end; for i:=1 to 26 do writeln(chr(i+64),a[i]); end. 12/12