PROGRAMAÇÃO FUNÇÕES NA LINGUAGEM C 1 Funções em C 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 Funções em C 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 Funções em C 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 Funções em C 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 Funções em C 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 Funções em C 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 Funções em C 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ções em C 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 Funções em C 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 Funções em C 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 Funções em C 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 Funções em C 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 Funções em C 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 Funções em C 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 Funções em C 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 Funções em C 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 Funções em C 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 Funções em C 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 Funções em C #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 Funções em C 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 Funções em C 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 Funções em C 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 Funções em C 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 Funções em C 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 Funções em C 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 Funções em C #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 Funções em C 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