(3) Escreva um programa para ler uma matriz de inteiros m, um valor digitado pelo usuário e verifique se esse valor encontra-se na matriz.
O programa deve ler os índices n, A, a matriz e um valor a ser procurado. O programa deve imprimir se encontrou o valor na matriz (“Valor encontrado!”) ou não (“Valor não encontrado!”).
As matrizes devem ser armazenadas utilizando-se alocação dinâmica.

Exemplo de entrada:

Digite o valor de m e n: 32
Digite a matriz:
13
26
-5 0
Digite o valor a ser procurado: -5

Exemplo de saída:

Valor encontrado!

Outro exemplo de entrada:

Digite o valor de men: 44
Digite a matriz:
1234
5678
9101112
13141516
Digite o valor a ser procurado: - 5

Exemplo de saída:

Valor não encontrado!

Passo 1

Beleza, aqui a ideia é escrever um programa em C que:
  • Leia dois valores inteiros e (por exemplo “3 2” indica 3 linhas e 2 colunas).
  • Aloque dinamicamente uma matriz .
  • Preencha essa matriz com inteiros digitados.
  • Leia mais um inteiro “x” a ser procurado na matriz.
  • Varra a matriz e diga “Valor encontrado!” se achar “x”, ou “Valor não encontrado!” caso contrário.
    O conteúdo envolvido é alocação dinâmica (malloc/free), laços de repetição (for) e condicionais (if).

Passo 2

Primeiro, a gente declara as variáveis
int m, n, i, j, x;
int **A;
int encontrado = 0;
m, n são dimensões;
A vai ser ponteiro para ponteiro (matriz);
encontrado é uma flag (0 = não achou, 1 = achou).
Depois, alocamos A como vetor de m ponteiros para int:
A = (int**) malloc(m * sizeof(int*));
for (i = 0; i < m; i++) {
    A[i] = (int*) malloc(n * sizeof(int));
}
Isso cria m linhas e cada linha tem n colunas.

Passo 3

Agora, lemos os valores de m e n, e logo em seguida a matriz completa:
printf("Digite o valor de m e n: ");
scanf("%d %d", &m, &n);

printf("Digite a matriz:\n");
for (i = 0; i < m; i++) {
    for (j = 0; j < n; j++) {
        scanf("%d", &A[i][j]);
    }
}
Aqui usamos dois loops for aninhados: o externo percorre as linhas, o interno as colunas, e scanf coloca cada número no lugar certo.

Passo 4

Lemos o valor x que queremos achar e aqui já começamos a busca:
printf("Digite o valor a ser procurado: ");
scanf("%d", &x);

for (i = 0; i < m && !encontrado; i++) {
    for (j = 0; j < n; j++) {
        if (A[i][j] == x) {
            encontrado = 1;  // achou!
            break;           // sai do loop das colunas
        }
    }
}
A gente para a busca assim que encontrar (encontrado = 1 e break).

Passo 5

É só imprimir o resultado e liberar a memória:
if (encontrado)
    printf("Valor encontrado!\n");
else
    printf("Valor não encontrado!\n");

for (i = 0; i < m; i++)
    free(A[i]);
free(A);

Resposta

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

int main() {
    int m, n, i, j, x;
    int **A;
    int encontrado = 0;

    printf("Digite o valor de m e n: ");
    scanf("%d %d", &m, &n);

    // alocação dinâmica da matriz
    A = (int**) malloc(m * sizeof(int*));
    for (i = 0; i < m; i++) {
        A[i] = (int*) malloc(n * sizeof(int));
    }

    // leitura da matriz
    printf("Digite a matriz:\n");
    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++) {
            scanf("%d", &A[i][j]);
        }
    }

    // leitura do valor a procurar
    printf("Digite o valor a ser procurado: ");
    scanf("%d", &x);

    // busca do valor na matriz
    for (i = 0; i < m && !encontrado; i++) {
        for (j = 0; j < n; j++) {
            if (A[i][j] == x) {
                encontrado = 1;
                break;
            }
        }
    }

    // resultado
    if (encontrado)
        printf("Valor encontrado!\n");
    else
        printf("Valor não encontrado!\n");

    // libera memória
    for (i = 0; i < m; i++)
        free(A[i]);
    free(A);

    return 0;
}

Exercícios relacionados