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:
HP Notebook Portatile 250 G9 N4500 Fino 2,8GHz Display 15.6" Hd,Ssd M.2 256Gb,Ram 8Gb Ddr4,Hdmi,Wifi,Bluetooth,Usb3.0,Windows 11,Garanzia 2 Anni
284,00 € (a partire da 18 Marzo 2024 14:37 GMT +01:00 - Altre informazioniProduct prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on [relevant Amazon Site(s), as applicable] at the time of purchase will apply to the purchase of this product.)(Ricondizionato) TP-Link TL-WPA4220 KIT Powerline Kit AV600Mbps e WiFi 300Mbps, 2 Pezzi, Homeplug AV2, Porte Ethernet, Plug & Play, Tecnologia Powerline Avanzata, Espandi la Portata WiFi
39,99 € (a partire da 18 Marzo 2024 14:59 GMT +01:00 - Altre informazioniProduct prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on [relevant Amazon Site(s), as applicable] at the time of purchase will apply to the purchase of this product.)HP Laptop 15s-eq1005sl, AMD Ryzen 3 3250U, RAM 8GB DDR4, SSD 256GB, AMD Radeon Integrated, Display 15,6" FHD, Antiriflesso, Wi-Fi, BLE, Webcam HD, Lettore di Schede, Windows 11 Modalità S, Argento
379,99 € (a partire da 18 Marzo 2024 14:37 GMT +01:00 - Altre informazioniProduct prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on [relevant Amazon Site(s), as applicable] at the time of purchase will apply to the purchase of this product.)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
Hp Pc desktop i7 pronto all'uso,16 Gb Ram, ssd 512 Gb, DVD,Wi Fi, Office 2021 Windows 11 PRO,Computer fisso Pc i7
229,00 € (a partire da 18 Marzo 2024 14:59 GMT +01:00 - Altre informazioniProduct prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on [relevant Amazon Site(s), as applicable] at the time of purchase will apply to the purchase of this product.)Apple iPad Mini 4 128GB 4G - Grigio Siderale - Sbloccato (Ricondizionato)
139,99 € (a partire da 18 Marzo 2024 15:18 GMT +01:00 - Altre informazioniProduct prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on [relevant Amazon Site(s), as applicable] at the time of purchase will apply to the purchase of this product.)ASUS Chromebook CX1 CX1400CKA, Notebook 14" Anti-Glare, Intel Celeron N4500, RAM 4GB, 64GB eMMC, Intel UHD Graphics 600, ChromeOS, Argento
229,00 € (a partire da 18 Marzo 2024 14:37 GMT +01:00 - Altre informazioniProduct prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on [relevant Amazon Site(s), as applicable] at the time of purchase will apply to the purchase of this product.)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:
Somma elementi diagonale principale di una matrice
Esempio sulla somma degli elementi cornice esterna
Somma dei numeri di una matrice
Array o vettori in linguaggio C
Media dei numeri in un array in linguaggio C
Esempio di array con numeri random in C