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().