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