Esercizio sugli array a due dimensioni
l'esercizio dice:
Scrivere una funzione C++ che, dato un array a due dimensioni N x N di interi a ed un intero positivo k>=2, restituisce true se esiste un numero intero n che occorre almeno k volte in esattamente k righe di a, e false altrimenti.
ecco il mio programma, non dà errori ma all'esecuzione qualsiasi k metto mi dice sempre che la condizione è verificata
io praticamente ho creato due funzioni, di cui una mi calcola le occorrenze in una singola riga e vede se sono almeno k, la seconda mi va a vedere se le occorrenze si ripetono in esattamente k righe di a.
potreste aiutarmi?
Scrivere una funzione C++ che, dato un array a due dimensioni N x N di interi a ed un intero positivo k>=2, restituisce true se esiste un numero intero n che occorre almeno k volte in esattamente k righe di a, e false altrimenti.
ecco il mio programma, non dà errori ma all'esecuzione qualsiasi k metto mi dice sempre che la condizione è verificata
io praticamente ho creato due funzioni, di cui una mi calcola le occorrenze in una singola riga e vede se sono almeno k, la seconda mi va a vedere se le occorrenze si ripetono in esattamente k righe di a.
potreste aiutarmi?
#include<iostream> #include<string> using namespace std; const int N=7; bool condizione(int [N][N],int ,int ,int ); bool occorrenze(int [N][N],int ,int ); int main() { int n; int a[N][N]={{1,2,3,1,1,5},{4,1,1,2,1,8,8},{4,3,1,9,7,6,1},{7,1,1,1,1,8,8},{3,4,5,6,2,1,8},{2,1,1,9,1,1,7},{1,1,1,1,2,2,3}}; int k; cout<<"Inserire un numero "<<endl; cin>>k; for(int r=0;r<N;r++) { for(int j=0;j<N;j++) { a[r][j]=n; } } if(occorrenze(a,k,n)) cout<<"non "; cout<<" è verificata la condizione dell'esercizio"<<endl; return 0; } bool condizione(int a[N][N],int k,int n,int r) { int j; int count=0; bool trovato=false; j=0; while(j<N && !trovato) { if(a[r][j]==n) { count++; trovato=count>=k; } j++; } return trovato; } bool occorrenze(int a[N][N],int k,int n) { int contatore=0; bool cond=false; for(int i=0;i<N && cond;i++) { if(condizione(a,k,n,i)) contatore++; if(contatore==k) cond=true; } return cond; }
Risposte
Nel main $n$ chi è? Non gli viene dato valore ed inoltre c'è questo:
Vai a riempire tutta la matrice con questo $n$....
Poi
nel for non ci entra mai dato che cond è falsa, inoltre devi verificare che il numero di righe in cui c'è l'occorrenza di riga sia in esattamente $k$ righe, non almeno $k$.
Infine, devi vedere se esiste un elemento $n$ della matrice che verifica questa condizione, quindi dovresti fare questo test per tutti gli elementi distinti della matrice (magari testando solo i valori che si ripetono almeno $k^2$ volte, dato che ci devo essere esattamente $k$ righe e almeno $k$ colonne di queste righe) e vedere se almeno uno di questi lo verifica.
for(int r=0;r<N;r++) { for(int j=0;j<N;j++) { a[r][j]=n; } }
Vai a riempire tutta la matrice con questo $n$....
Poi
bool cond=false; for(int i=0;i<N && cond;i++) { ... }
nel for non ci entra mai dato che cond è falsa, inoltre devi verificare che il numero di righe in cui c'è l'occorrenza di riga sia in esattamente $k$ righe, non almeno $k$.
Infine, devi vedere se esiste un elemento $n$ della matrice che verifica questa condizione, quindi dovresti fare questo test per tutti gli elementi distinti della matrice (magari testando solo i valori che si ripetono almeno $k^2$ volte, dato che ci devo essere esattamente $k$ righe e almeno $k$ colonne di queste righe) e vedere se almeno uno di questi lo verifica.
n è un numero della matrice
Sì, grazie.... te lo chiedevo nel tuo programma, dato che è una variabile dichiarata, senza un valore esplicito ed usata troppo alla leggera... Tu almeno uno di questi $n$ lo devi trovare per dire che la condizione è verificata!
come faccio a trovarlo nella matrice
cos' li ho inzializzati tutti a n e ho capito di aver sbagliato
come posso fare ora?
cos' li ho inzializzati tutti a n e ho capito di aver sbagliato
come posso fare ora?
"Ska":
Infine, devi vedere se esiste un elemento $n$ della matrice che verifica questa condizione, quindi dovresti fare questo test per tutti gli elementi distinti della matrice (magari testando solo i valori che si ripetono almeno $k^2$ volte, dato che ci devo essere esattamente $k$ righe e almeno $k$ colonne di queste righe) e vedere se almeno uno di questi lo verifica.
Prova a pensare a come realizzare in codice questo. Poi altro consiglio ti conviene mettere delle stampe per verificare che le tue funzioni facciano quello che vuoi, verificale provando un po' di valori e facendo stampare i risultati attesi, vedi subito se c'è qualcosa che non va.
non riesco a capire
puoi dirmi dove devo andare a modificare il codice?
puoi dirmi dove devo andare a modificare il codice?
"Ska":bool cond=false; for(int i=0;i<N && cond;i++) { ... }
Inizia a sistemare questo, poi metti delle stampe a video di quello che sta succedendo nelle funzioni 'occorrenze' e 'condizione', tipo stampa per il valore $n$ corrente il numero di occorrenze per ogni riga, poi stampa se il numero di righe in cui l'occorrenza di riga è rispettata è esattamente pari al $k$ inserito. Tutto questo fallo assegnado tu un valore di $n$ nel main, ad esempio mettin $n=1$. Poi prova a vedere modificando la matrice di ingresso se effettivamente restituisce per quel valore di $n$ una sentenza corretta. Quando questo funziona allora puoi applicare questo in primissima analisi per ogni valore della matrice, poi potresti ottimizzare questo andando a fare il test solo su alcuni valori di $n$, anche se non è strettamente necessario.
ok ci provo e stasera ti faccio sapere
scusa ma l'esercizio dice che n è un numero all'interno della matrice
non devo metterlo io
come si fa a vedere se esiste n interno alla matrice
come l'ho scritto io ho solo inizializzato tutti gli elementi uguali a n ed è sbagliato lo so
come si può fare a cercare n?
non devo metterlo io
come si fa a vedere se esiste n interno alla matrice
come l'ho scritto io ho solo inizializzato tutti gli elementi uguali a n ed è sbagliato lo so
come si può fare a cercare n?
Per vedere se le funzioni che hai scritto funzionano, potresti inserirlo tu esplicitamente questo $n$, in questo modo vedi se il valore di $n$ inserito (che deve essere un elemento nella matrice) verifica la condizione per il $k$ specificato. Quando così funziona allora dato che tu questo $n$ non lo conosci a priori, lo cerchi, ovvero provi a testare ogni valore della matrice $a_{ij}$ quando uno di questi dice che la condizione è verificata allora hai verificato che in quella matrice esiste un elemento che la verifica (l'esistenza è implicata dal fatto che tu questo elemento lo trovi).
Alla fine avrai una cosa del tipo
Alla fine avrai una cosa del tipo
bool esiste = false; for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { if (occorrenze(a, k, a[i][j])) { esiste = true; break; } } if (esiste) break; } if (esiste) cout << "Esiste" << endl; else cout << "Non esiste" << endl;
perchè non mi funziona?
provo per n=1 e k=3
provo per n=1 e k=3
#include<iostream> using namespace std; const int N=7; bool condizione(int [N][N],int ,int ,int ); bool occorrenze(int [N][N],int ,int ); int main() { int a[N][N]={{6,2,3,1,1,5,9},{1,1,1,2,1,8,8},{4,3,1,9,7,6,1},{7,1,1,1,1,8,8},{3,4,5,6,2,1,8},{2,1,1,9,1,1,7},{9,5,4,1,2,2,3}}; int n; int k; cout<<"inserisci un numero(interno alla matrice)"<<endl; cin>>n; cout<<endl; cout<<"Inserire un numero maggiore o uguake a 2 "<<endl; cin>>k; cout<<endl; if(!occorrenze(a,n,k)) cout<<"NON "; cout<<" E' VERIFICATA LA CONDIZIONE"<<endl; return 0; } bool condizione(int a[N][N],int n, int k,int row) { row=0; int cont=0; bool trovato=false; for(int j=0;j<N && !trovato;j++) { if(a[row][j]==n) { cont++; trovato=cont>=k; } } return trovato; } bool occorrenze(int a[N][N],int n,int k) { bool verifica=false; int contatore=0; for(int r=0;r<N && !verifica;r++) { if(condizione(a,n,k,r)) contatore++; } if(contatore==k) verifica=true; return verifica; }
@Ska, potresti vedere perchè non funziona
io ho provato a rivedere il codice ma niente non capisco dove risieda l'errore
a me l'algoritmo pare giusto ci dovrà essere qualche imprecisione da qualche parte
io ho provato a rivedere il codice ma niente non capisco dove risieda l'errore
a me l'algoritmo pare giusto ci dovrà essere qualche imprecisione da qualche parte
ho risolto
grazie mille comunque
grazie mille comunque