ricerca elementi in una matrice

Costruiamo un algoritmo per la ricerca di un elemento in una matrice in C.

Iniziamo creando una matrice di numeri casuali.

Generare numeri casuali in C

In C abbiamo un generatore di numeri pseudocasuali e per usarlo dobbiamo includere la libreria stdlib.h

Utilizzeremo così le funzioni srand() e rand().

La funzione rand() restituisce un numero ogni volta diverso (vedremo come fare a renderlo effettivamente diverso ogni volta) compreso tra 0 e RAND_MAX.

RAND_MAX è una costante molto grande, circa 231.

La funzione srand() usa il numero passato come seme per inizializzare il generatore di numeri casuali. Chiaramente se si usa lo stesso seme si avrà sempre la stessa sequenza di numeri.

Ad esempio:

srand(10);
numero=rand();

Se provate ad eseguirla più volte vi darà sempre lo stesso numero!

Allora come possiamo fare per ottenere un seme veramente casuale?

Dobbiamo ricorrere all’uso della funzione time() con argomento NULL, questa funzione restituisce il tempo attuale in secondi trascorsi dalla data del 01/01/1970.
Per utilizzare questa funzione dobbiamo includere la librera time.h

Ogni volta che verrà eseguito il programma si avrà un numero diverso, purché non sia passato troppo poco tempo.

Ma i numeri generati sono troppo grandi, in quanto come abbiamo detto prima rand() genera numeri da 0 a RAND_MAX.

Dobbiamo dunque restringere l’intervallo in base alle nostre preferenze.

Cosa utilizzeremo per restringere il range?

Utilizzeremo l’operatore modulo indicato con il simbolo %.

Quindi ad esempio se ho:

rand() % 10
mappa il numero ottenuto nel range [0 , 9]

rand()%100
mappa il numero ottenuto nel range [0 , 99]

Per ottenere invece dei numeri tra un range prestabilito si può scrivere:

10+ rand()%10

mappa i numeri ottenuti nel range [10 , 19]
in pratica aggiunge 10 ad entrambi i numeri dell’intervallo.

Algoritmo per la ricerca di un elemento in una matrice in C generata con numeri casuali

Vediamo adesso come sviluppare l’algoritmo.

Decidiamo di prendere il numero di righe e di colonne in input, ponendo come limite massimo 10 in entrambi i casi.

#define N 10

#define M 10

Controlliamo anche che il numero di righe e di colonne non siano minori di 1.

do {
  printf("Dammi il numero di righe: ");
  scanf("%d", &m);
} while ((m>M) || (m<1)); 
  
 do {
    printf("Dammi il numero di colonne: ");
    scanf("%d", &n);
    } while ((n>N)|| (n<1));

A questo punto, carichiamo la nostra matrice facendo un inserimento per riga di numeri casuali compresi tra 1 e 10.

for (i=0;i<m;i++)
    for(j=0;j<n;j++) 
        a[i][j]=1+rand()%10;

Adesso facciamo inserire un numero da tastiera che sia compreso nell’intervallo [1, 10] e lo memorizzo nella variabile numero.
Vediamo anche in quale o quali posizioni esso compare e quanti numeri maggiori e minori del numero ricercato sono stati inseriti.

Utilizzeremo le variabili:

conta per contare quante volte compare il nostro numero preso in input;

contam per contare quanti numeri sono maggiori del numero preso in input;

contan per contare quanti numeri sono minori del numero preso in input.

for (i=0;i<m;i++) { 
    for(j=0;j<n;j++) 
      if (numero==a[i][j]){  
        conta=conta+1;
        printf("\nL'elemento e' stato trovato: in posizione(%d,%d)\n", i,j);
       }  
       else if (numero<a[i][j])
         contam=contam+1;
       else 
         contan=contan+1;
   }

Allego il codice completo per la ricerca di un elemento in una matrice in C:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10   
#define M 10

main() {
 int a[M][N];
 int n,m,i,j,numero;
 int contan=0,contam=0,conta=0;
 srand(time(NULL));

 do {
    printf("Dammi il numero di colonne: ");
    scanf("%d", &n);
 } while ((n>N)|| (n<1));

 for (i=0;i<m;i++)
    for(j=0;j<n;j++) 
       a[i][j]=1+rand()%10;

 do {
  printf("\nDammi un numero compreso tra 1 e 10 e ti diro' quante volte  compare \n");
  scanf("%d", &numero);
 } while ((numero>10) || (numero<1));

 for (i=0;i<m;i++) { 
  for (j=0;j<n;j++) 
    if (numero==a[i][j]){  
      conta=conta+1;
      printf("\nL'elemento e' stato trovato: in posizione(%d,%d)\n", i,j);
      }  
     else if (numero<a[i][j])
       contam=contam+1;
     else 
        contan=contan+1;
  }   
   
 printf("\nL'elemento %d e' stato trovato: %d volte\n", numero, conta);
 printf("\nCi sono %d numeri maggiori del numero cercato %d\n", contam,numero);
 printf("\nCi sono %d numeri minori del numero cercato %d\n", contan,numero);

 printf("\nStampiamo i dati \n");
 for (i=0;i<m;i++) { 
     printf("\n");
     for(j=0;j<n;j++) 
         printf("\t%d", a[i][j]);                
    }  
}     

Chiaramente si possono trovare tante altre soluzioni, dite la vostra.

Alcuni link utili:

Prodotto tra matrici

Somma elementi diagonale principale di una matrice

Esempio sulla somma degli elementi cornice esterna

Sommare due matrici

Somma dei numeri di una matrice

Matrice trasposta

Array multidimensionali

Tavola pitagorica in C

Array o vettori in linguaggio C

Media dei numeri in un array in linguaggio C

Esempio di array con numeri random in C

Quick sort in C

Selection sort in C

Merge sort in C

Insertion Sort in C


Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *