PROGRAMAÇÃO FUNÇÕES NA LINGUAGEM C 1
Implementações básicas: a) Implementar o procedimento LerMatriz que preenche uma matriz de L linhas por C colunas de inteiros (L, C 1); b) Implementar o procedimento EscreverMatriz que escreve uma matriz de L linhas por C colunas de inteiros (L, C 1) no écran; a) Implementar a função LerValorValido que verifica se um valor introduzido pelo utilizador pertence ao conjunto limitado por dois dados valores inteiros, devolvendo o primeiro valor que pertença àquele intervalo; 2
Procedimento: LerMatriz Parâmetros: Uma matriz X vazia (sem valores) Dois números inteiros L e C (L, C 1 é a dimensão de X) Saída: A matriz X preenchida (com valores) 3
Algoritmo: Para i com valores desde 0 até L-1 Fazer Mostrar a mensagem Inserir a linha i da matriz Para j com valores desde 0 até C-1 Fazer Mostrar a mensagem Inserir um valor inteiro Introduzir um valor inteiro para X[i][j] 4
void LerMatriz (int X[][], int L, int C) { int i, j; for (i = 0; i <= L-1; i++) { printf ( Inserir a linha %d da matriz.\n, i); for (j = 0; j <= C-1; j++) { printf ( Inserir um valor inteiro: ); scanf ( %d, &X[i][j]); } } } 5
Procedimento: EscreverMatriz Parâmetros: Uma matriz X preenchida Dois números inteiros L e C (L, C 1 é a dimensão de X) Saída: Apresenta no écran os elementos da matriz X 6
Algoritmo: Para i com valores desde 0 até L-1 Fazer Mostrar a mensagem Linha i da matriz: Para j com valores desde 0 até C-1 Fazer Mostrar o valor de X[i][j] 7
void EscreverMatriz (int X[][], int L, int C) { int i, j; for (i = 0; i <= L-1; i++) { printf ( Linha %d da matriz:, i); for (j = 0; j <= C-1; j++) printf ( %d, X[i][j]); printf ( \n ); } } 8
Função: LerValorValido Parâmetros: Dois valores inteiros, inf e sup, correspondentes aos limites inferior e superior do intervalo válido Retorno: Um número inteiro pertencente ao conjunto {inf,..., sup} 9
Algoritmo: Fazer Mostrar a mensagem Inserir um inteiro entre inf e sup Introduzir um valor inteiro para Dim Enquanto 'Dim < inf ou Dim > sup' é verdadeira Devolver (Dim) 10
int LerValorValido (int inf, int sup) { } int Dim; do { printf ( Insira um inteiro entre %d e %d:, inf, sup); scanf ( %d, &Dim); } while (Dim < inf Dim > sup); return (Dim); 11
Enunciado: a) Implementar a função NumNulosMatriz para calcular a quantidade de elementos nulos de uma matriz de inteiros de L linhas por C colunas; a) Implementar o procedimento MatrizTransposta que constrói a transposta de uma matriz quadrada de ordem N (N linhas por N colunas) X; b) Construir um programa em C que leia uma matriz quadrada Mat de ordem N (1 N 10), determine e escreva no écran a quantidade de nulos de Mat e, calcule e escreva a matriz transposta de Mat, usando as funções anteriores. 12
Procedimento: NumNulosMatriz Parâmetros: Uma matriz X preenchida Dois números inteiros L e C (L, C 1 é a dimensão de X) Saída: Um valor inteiro correspondente à quantidade de nulos que estão na matriz X 13
Algoritmo: Atribuir a Nulos o valor inteiro 0 Para i com valores desde 0 até L-1 Fazer Para j com valores desde 0 até C-1 Fazer Se 'Mat[i][j] = 0' é verdadeira Fazer Atribuir a Nulos o valor inteiro Nulos+1 Devolver (Nulos) 14
int NumNulosMatriz (int X[][], int L, int C) { } int i, j, Nulos; Nulos = 0; for (i = 0; i <= L-1; i++) for (j = 0; j <= C-1; j++) if (X[i][j] == 0) Nulos++; return (Nulos); 15
Procedimento: MatrizTransposta Parâmetros: Uma matriz quadrada preenchida, X Uma matriz quadrada vazia, XT Um número inteiro N (N 1 é a ordem de X e XT) Saída: A matriz transposta de X, XT (a linha k da matriz X corresponde à coluna k da matriz XT) 16
Algoritmo: Para i com valores desde 0 até N-1 Fazer Para j com valores desde 0 até N-1 Fazer Atribuir a XT[j][i] o valor inteiro X[i][j] 17
void MatrizTransposta (int X[][], int XT[][], int N) { int i, j; for (i = 0; i <= N-1; i++) for (j = 0; j <= N-1; j++) XT[j][i] = X[i][j]; } 18
Algoritmo (principal): Atribuir a N o valor inteiro LerValorValido(1, 10) LerMatriz(X, N, N) Atribuir a Nulos o valor inteiro NumNulosMatriz(X, N, N) Mostrar a mensagem Quantidade de nulos da matriz: Mostrar o valor de Nulos MatrizTransposta(X, XT, N) Mostrar a mensagem Matriz transposta EscreverMatriz(XT, N, N) 19
#include <stdio.h> void LerMatriz (int X[][], int L, int C); void EscreverMatriz (int X[][], int L, int C); int LerValorValido (int inf, int sup); int NumNulosMatriz (int X[][], int L, int C); void MatrizTransposta (int X[][], int XT[][], int N); 20
main ( ) { int X[10][10], XT[10][10], N, Nulos; N = LerValorValido(1, 10); LerMatriz(X, N, N); Nulos = NumNulosMatriz(X, N, N); printf ( A quantidade de nulos da matriz é: %d.\n, Nulos); MatrizTransposta(X, XT, N); printf( Matriz transposta\n ); EscreverMatriz(XT, N, N); } 21
Enunciado: a) Implementar o procedimento MatrizProduto que calcula o produto de duas matrizes de inteiros, X (de L1 linhas por C1 colunas) e Y (de L2 linhas por C2 colunas); b) Construir um programa em C que leia duas matrizes de inteiros, A (de M1 linhas por N1 colunas) e B (de M2 linhas por N2 colunas) (com N1 = M2), determine a matriz produto entre A e B, e escreva a matriz resultante, usando as funções anteriores. 22
Procedimento: MatrizProduto Parâmetros: Uma matriz preenchida de inteiros X Uma matriz preenchida de inteiros Y Uma matriz vazia de inteiros XY Um número inteiro associado ao número de linhas de X, M1 Um número inteiro associado ao número de colunas de X, N1 Um número inteiro associado ao número de linhas de Y, M2 Um número inteiro associado ao número de colunas de Y, N2 Saída: A matriz produto de X por Y, XY (de M1 linhas por N2 colunas) 23
Algoritmo: Para i com valores desde 0 até M1-1 Fazer Para j com valores desde 0 até N2-1 Fazer Atribuir a S o valor inteiro 0 Para k com valores desde 0 até N1-1 Fazer Atribuir a S o valor inteiro (S + X[i][k]*Y[k][j]) Atribuir a XY[i][j] o valor inteiro S 24
void MatrizProduto (int X[][], int Y[][], int XY[][], int M1, int N1, int M2, int N2) { } int i, j, k, S; for (i = 0; i <= M1-1; i++) for (j = 0; j <= N2-1; j++) { S = 0; for (k = 0; k <= N1-1; j++) S = S + X[i][k] * Y[k][j]; XY[i][j] = S; } 25
Algoritmo (principal): Atribuir a M1 o valor inteiro LerValorValido(1, 15) Atribuir a N1 o valor inteiro LerValorValido(1, 10) Mostrar a mensagem Matriz A: LerMatriz (A, M1, N1) Atribuir a M2 o valor inteiro N1 Atribuir a N2 o valor inteiro LerValorValido(1, 20) Mostrar a mensagem Matriz B: LerMatriz (B, M2, N2) MatrizProduto (A, B, PROD, M1, N1, M2, N2) Mostrar a mensagem Matriz produto obtida : EscreverMatriz (PROD, M1, N2) 26
#include <stdio.h> void LerMatriz (int Mat[][], int L, int C); void EscreverMatriz (int Mat[][], int L, int C); int LerValorValido (int inf, int sup); void MatrizProduto (int X[][], int Y[][], int XY[][], int M1, int N1, int M2, int N2); main ( ) { int A[15][10], B[10][20], PROD[15][20]; int M1, N1, M2, N2; 27
} M1 = LerValorValido (1, 15); N1 = LerValorValido (1, 10); printf ( Matriz A:\n ); LerMatriz (A, M1, N1); M2 = N1; N2 = LerValorValido (1, 20); printf ( Matriz B:\n ); LerMatriz (B, M2, N2); MatrizProduto (A, B, PROD, M1, N1, M2, N2); printf ( Matriz produto obtida :\n ); EscreverMatriz (PROD, M1, N2); 28