Solicitação de algoritmo 5

Nessa solicitação de algoritmo feita por Neidson Jr, o enunciado é simples, embora a solução nem tanto.

Enunciado: desenvolver um algoritmo que receba valores aleatórios entre -20 até 20 e através de uma função preencha uma matriz de inteiros 8×3. Retorne quantas vezes aparecer o número dois.

O algoritmo que ele me enviou segue a seguir. Veja que while iniciado na linha 14 é desnecessário, uma vez que, desde o primeiro teste efetuado, o resultado será false e o laço de repetição nunca executará (20 nunca será menor do que -20).

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int k, l, i, j, min, max,intervalo;
    k=8;
    l=3;
    float mat[k][l];

    //preenche a matriz em um intervalo de -20 ate 20
    printf("Com intervalo de -20 ate 20. \n");
    min=-20;
    max=20;
    while (max < min) {
        printf("Intervalo invalido. Digite novos valores: \n");
        scanf("%i%i", &min, &max);
    }

    intervalo = max - min;
    printf("O tamanho do intervalo e de: %i \n", intervalo);

    //registra o valor do intervalo aleatorio
    for (i = 0; i < k; i++) {
        for (j = 0; j < l; j++) {
            mat[i][j] = rand()%intervalo + min;
        }
    }

    //mostra a matriz
    for (i = 0; i < k; i++) {
        for (j = 0; j < l; j++) {
            printf("%.1f ", mat[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Na linha 25 a matriz é preenchida com os valores aleatórios. O valor da variável intervalo é definido na linha 19 e terá o valor 40. Com isso, rand()%intervalo gerará valores entre 0 e 39. A soma com -20 transformará o intervalo de valores para entre -20 e 19. Veja que não atende realmente o enunciado, por isso é preciso ajuste na linha 19 (existem 41 valores no intervalo [-20,20]: 20 valores positivos + 20 valores negativos + o zero).

Outro detalhe importante é que a matriz estará sendo preenchida com valores aleatórios, mas se o algoritmo executar várias vezes consecutivas, os valores sempre serão os mesmo. Com isso é importante plantar a semente para gerar novos números aleatórios. Isso é feito com a função srand().

Abaixo segue o código com os ajustes comentados. Também aproveitei e fiz a atribuição de alguns valores já na declaração das variáveis (apenas para economizar algumas linhas). O enunciado também pedia uma matriz de inteiros, então alterei também o código nessa questão.

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

int main(void) {
    srand(time(NULL));
    int k=8, l=3, i, j, min=-20, max=20,intervalo;
    int mat[k][l];

    intervalo = max - min + 1;
    printf("O tamanho do intervalo e de: %i \n", intervalo);

    //registra o valor do intervalo aleatorio
    for (i = 0; i < k; i++) {
        for (j = 0; j < l; j++) {
            mat[i][j] = rand()%intervalo + min;
        }
    }

    //mostra a matriz
    for (i = 0; i < k; i++) {
        for (j = 0; j < l; j++) {
            printf("%i ", mat[i][j]);
        }
        printf("\n");
    }

    return 0;
}

Veja que o Neidson conseguiu fazer a primeira parte do algoritmo. Vou fazer outra parte, para identificar quantas vezes aparece o número 2 na matriz.

Essa parte é bastante simples e o trecho de código a seguir deve ser adicionado depois de ter mostrado a matriz (antes do return 0).

    //conta quantos 2
    int cont=0;
    for (i = 0; i < k; i++) {
        for (j = 0; j < l; j++) {
            if (mat[i][j] == 2) {
                cont++;
            }
        }
    }
    printf("Qtde de dois: %i", cont);

Outro detalhe importante no enunciado é que ele pediu para a solução ser feita utilizando funções. O preenchimento da matriz por uma função está explícito, enquanto a contagem está implícito pelo pedido de retornar a quantidade de números dois. O código alterado para o uso da funções é mostrado abaixo.

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

#define LIN 3
#define COL 5

//preenche a matriz
void preencheMatriz(int mat[LIN][COL]) {
    srand(time(NULL));
    int i, j, min=-20, max=20;
    int intervalo = max - min + 1;
    printf("O tamanho do intervalo e de: %i \n", intervalo);

    //registra o valor do intervalo aleatorio
    for (i = 0; i < LIN; i++) {
        for (j = 0; j < COL; j++) {
            mat[i][j] = rand()%intervalo + min;
        }
    }
}

//conta numeros dois
int contaRepeticao(int lin, int col, int mat[lin][col], int num) {
    int i, j, cont=0;
    for (i = 0; i < lin; i++) {
        for (j = 0; j < col; j++) {
            if (mat[i][j] == num) {
                cont++;
            }
        }
    }
    return cont;
}

int main(void) {

    int k=COL, l=LIN, i, j;
    int mat[k][l];

    preencheMatriz(mat);

    //mostra a matriz
    for (i = 0; i < k; i++) {
        for (j = 0; j < l; j++) {
            printf("%i ", mat[i][j]);
        }
        printf("\n");
    }

    printf("Qtde de dois: %i", contaRepeticao(LIN,COL,mat,2));

    return 0;
}

Na função para preenchimento da matriz fiquei com um pouco de preguiça e não fiz bons ajustes, mas no de contagem de repetição me dediquei um pouco mais. Veja que a função contaRepeticao() está genérica e funcionará para qualquer tamanho de matriz e para contar qualquer valor passado por parâmetro. Por conta de deixar a função contaRepeticao() genérica, a quantidade de parâmetros ficou extensa (preciso dizer inicialmente o tamanho da matriz com a quantidade de linhas e colunas, e também preciso dizer ao final qual o valor que deve ser contado), não bastando apenas dizer qual a matriz, como fiz no caso da função preencheMatriz().

Share

Deixe um comentário

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

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.