Proposta de exercício utilizando biblioteca com funções prontas

O seguinte exercício é uma proposta a ser aplicada utilizando o Laboratório Virtual de Programação (LVP) do Moodle. Nesse exercício é disponibilizada uma biblioteca já com algumas funções prontas. A ideia é que o aluno avalie essas funções para saber como utilizá-la. Isso permitirá ao aluno perceber benefícios da modularização e que uma função é algo abstrato ao problema. Algumas funções não funcionarão para resolver o problema e precisarão ser alteradas, ou utilizadas para basear a criação de outra função. Esse exercício foi preparado apenas a linguagem de programação C. Vamos a questão.

Enunciado: Tendo uma matriz 5×5, elabore um algoritmo que recebe um valor que corresponde a uma linha da matriz e (1) mostra esses valores ordenados em ordem decrescente. Mostre os valores em uma única linha, separados por um espaço.

Gere também uma nova matriz que são os valores da primeira divididos pelo menor valor positivo da matriz. Dessa matriz (2) mostre o fatorial do maior valor. Em seguida, (3) mostre quantos valores estão acima da média. Finalize (4) mostrando o somatório da diagonal secundária da matriz. Mostre os valores na ordem, em uma nova e única linha e separados por um espaço.

Existe uma biblioteca com diversas funções que podem ser úteis. As funções dela podem ser utilizadas.

Biblioteca com funções prontas para disponibilizar

A biblioteca possui uma série de funções para o exercício, mas algumas das funções não tem utilidade no exercício e outras precisarão ser ajustadas para poderem ser utilizadas.

#include <stdlib.h>
#include <time.h>

//retorna o menor valor de uma matriz
int menorDaMatriz(int tam, int mat[tam][tam]) {
    int i, j, menor = mat[0][0];
    for (i = 0; i < tam; i++) {
        for (j = 0; j <  tam; j++) {
            if (mat[i][j] < menor) {
                menor = mat[i][j];
            }
        }
    }
    return menor;
}

//retorna o maior valor de uma matriz
int maiorDaMatriz(int tam, int mat[tam][tam]) {
    int i, j;
    int maior = mat[0][0];
    for (i = 0; i < tam; i++) {
        for (j = 0; j <  tam; j++) {
            if (mat[i][j] > maior) {
                maior = mat[i][j];
            }
        }
    }
    return maior;
}

//retorna a soma dos valores de uma matriz
int somaMatriz(int tam, int mat[tam][tam]) {
    int i, j;
    int soma = 0;
    for (i = 0; i < tam; i++) {
        for (j = 0; j <  tam; j++) {
            soma+=mat[i][j];
        }
    }
    return soma;
}

//retorna a media dos valores de uma matriz
float mediaMatriz(int tam, int mat[tam][tam]) {
    return somaMatriz(tam, mat)/((float)(tam*tam));
}

//retorna quandos valores iguais ao informados existem na matriz
int contaValorMatriz(int tam, int mat[tam][tam], int valor) {
    int i, j, cont = 0;
    for (i = 0; i < tam; i++) {
        for (j = 0; j <  tam; j++) {
            if (mat[i][j] == valor) {
                cont++;
            }
        }
    }
    return cont;
}


//calcula o fatorial de um número
int fatorial(int n) {
	if (n) {
  	  return n * fatorial(n-1);
	} else {
	    return 1;
	}
}

//preenche uma matriz com números aleatórios entre 0 e 9
void preencheMatriz(int tam, int mat[tam][tam]) {
    srand(time(NULL));
    int i, j;
    for (i = 0; i < tam; i++) {
        for (j = 0; j <  tam; j++) {
            mat[i][j] = rand()%10;
        }
    }
}

//mostra os valores de uma matriz de inteiros
void mostraMatrizInt(int tam, int mat[tam][tam]) {
    int i, j;
    for (i = 0; i < tam; i++) {
        for (j = 0; j <  tam; j++) {
            printf("%i ", mat[i][j]);
        }
        printf("\n");
    }
}

//mostra os valores de uma matriz de floats
void mostraMatrizFloat(int tam, float mat[tam][tam]) {
    int i, j;
    for (i = 0; i < tam; i++) {
        for (j = 0; j <  tam; j++) {
            printf("%f ", mat[i][j]);
        }
        printf("\n");
    }
}

//mostra os valores de um vetor
void mostraVetor(int tam, float vet[]) {
    int i;
    for (i = 0; i < tam; i++) {
        printf("%i ", vet[i]);
    } 
}

//implementação do método bolha que ordena um vetor
void bubble(int v[], int qtd) {
  int i;
  int j;
  int aux;
  int k = qtd - 1 ;

  for(i = 0; i < qtd; i++) {
     for(j = 0; j < k; j++) {
        if(v[j] > v[j+1]) {
            aux = v[j];
            v[j] = v[j+1];
            v[j+1]=aux;
        }
     }
     k--;
  }
}

//mostra os valores de um vetor
void mostraVetor(int tam, float vet[]) {
    int i;
    for (i = 0; i < tam; i++) {
        printf("%f ", vet[i]);
    } 
}

Casos de teste para o Laboratório Virtual de Programação

case = teste1
input = 8 6 3 4 5
6 7 8 20 10
9 -5 -4 6 8
-5 -4 -3 4 24
10 5 4 5 6
2
output= 9 8 6 -4 -5
40320 1.826667 13 1.666667 6.666667 -1.333333 -1.333333 3.333333

case = teste2
input = 8 6 3 4 5
6 7 8 20 10
9 -5 -4 6 8
-5 -4 -3 4 21
10 5 4 5 6
0
output= 8 6 5 4 3
5040 1.786667 13 1.666667 6.666667 -1.333333 -1.333333 3.333333

Solução em linguagem C

A solução é apresentada com o código da função principal e as funções adicionadas e modificadas na biblioteca.

#include <stdio.h>
#include "funcoesUteis.h" //considerando que a biblioteca tem esse nome

void main() {
    int mat[5][5];
    int linha, i, j, vet[5];
    
    for (i=0; i<5;i++) {
        for(j=0;j<5;j++) {
            scanf("%i", &mat[i][j]);
        }
    }
    
    scanf("%i", &linha);
    for (i = 0; i < 5; i++) {
        vet[i] = mat[linha][i];
    }
    bubble(vet, 5);
    for (i = 0; i < 5; i++) {
        printf("%i ", vet[i]);
    }
    
    float mat2[5][5];
    for (i = 0; i < 5; i++) {
        for (j = 0; j < 5; j++) {
            mat2[i][j] = mat[i][j] / (float) menorDaMatrizPositivo(5, mat);
        }
    }
    //mostraMatrizInt(5,mat);
    //mostraMatrizFloat(5,mat2);
    //printf("\n Maior %f", maiorDaMatriz(5,mat2));
    printf("\n%i ", fatorial(maiorDaMatriz(5,mat2)));
    printf("%f ", mediaMatriz(5,mat2));
    printf("%i ", acimaValorMatriz(5,mat2,mediaMatriz(5,mat2)));
    
    float vet2[5];
    for (i = 0; i < 5; i++) {
        vet2[i] = mat2[i][4-i];
    }
    mostraVetor(5, vet2);
}

Funções diferentes da biblioteca

//função foi criada baseada na menorDaMatriz(), com uma condição a mais
int menorDaMatrizPositivo(int tam, int mat[tam][tam]) {
    int i, j, menor = mat[0][0];
    for (i = 0; i < tam; i++) {
        for (j = 0; j <  tam; j++) {
            if (mat[i][j] < menor && mat[i][j] > 0) {
                menor = mat[i][j];
            }
        }
    }
    return menor;
}

//função adicionada baseada na contaValorMatriz() com apenas uma mudança no if
int acimaValorMatriz(int tam, float mat[tam][tam], float valor) {
    int i, j, cont = 0;
    for (i = 0; i < tam; i++) {
        for (j = 0; j <  tam; j++) {
            if (mat[i][j] > valor) {
                cont++;
            }
        }
    }
    return cont;
}

//Função buble() alterada para ordem decrescente. A alteração foi no if
void bubble(int v[], int qtd) {
  int i;
  int j;
  int aux;
  int k = qtd - 1 ;

  for(i = 0; i < qtd; i++) {
     for(j = 0; j < k; j++) {
        if(v[j] < v[j+1]) {
            aux = v[j];
            v[j] = v[j+1];
            v[j+1]=aux;
        }
     }
     k--;
  }
}

Utilizando a avaliação mais simples do LVP (apenas a comparação da entrada com a saída esperada), essa foi a melhor forma que encontrei para utilizar funções em biblioteca e as vantagens da modularização.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.