Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ADV, ma con molti più pulsanti
Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ADV, ma con molti più pulsanti
Con 22 tasti, il pulsante 5D, lo Shift Mode e il sensore PixArt 3395 da 26.000 DPI, il nuovo mouse wireless di Mad Catz si rivolge in modo preciso ai giocatori di MMO e RPG. Ma chi conosce già il R.A.T. 8+ ADV si accorgerà subito di quanto i due prodotti condividano, e di dove invece divergono
Radeon RX 9070 GRE, AMD la porta in tutto il mondo | Recensione Gigabyte Gaming OC
Radeon RX 9070 GRE, AMD la porta in tutto il mondo | Recensione Gigabyte Gaming OC
Abbiamo provato la Gigabyte Radeon RX 9070 GRE Gaming OC, nuova proposta RDNA 4 che si inserisce tra GeForce RTX 5060 Ti e RTX 5070. Prestazioni solide in rasterizzazione e ray tracing, frequenze elevate grazie all'overclock di fabbrica e raffreddamento efficace: ecco come si comporta nei nostri test.
Reolink OMVI 3i WiFi: videosorveglianza più intelligente e facile da usare
Reolink OMVI 3i WiFi: videosorveglianza più intelligente e facile da usare
Con tripla lente, tracking sincronizzato, visione notturna a colori e controllo locale senza abbonamenti, la OMVI 3i WiFi porta la sicurezza domestica a un livello molto più moderno, ma senza trasformarla in un sistema complicato da installare o usare
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-03-2004, 15:42   #1
Gervasoni
Senior Member
 
L'Avatar di Gervasoni
 
Iscritto dal: Oct 2000
Messaggi: 417
[c++] Problema con funzione ricorsiva

Devo scrivere un programma che calcoli il determinante di una matrice al max 6*6 mediante una funzione ricorsiva.

Il codice della funzione che calcola il determinante che ho scritto è questo:

Codice:
float determinante(float x[IMAX][IMAX], int n_rig)
   {
     float min_estratto[IMAX][IMAX];
     float det;
     int h=n_rig-1;

     if (n_rig>2)
         {

            for (int n_col=0; n_col<IMAX; n_col++)
              {
               matrice_minore(x,min_estratto,n_col,h+1);
               det=det+(x[n_rig][n_col]*pow(-1,n_col+n_rig)*determinante(min_estratto,h));
               printf("\t\t%d\n",h);
              }
            h=h-1;
         }
     if (n_rig==2) return (x[0][0]*x[1][1]-x[0][1]*x[1][0]);
     return det;
   }
matrice_minore è il nome della funzione che calcola la matrice ottenuta cancellando una determinata riga e colonna.

Il problema non è della funzione matrice_minore che mediante dei printf ho visto che funziona correttamente quanto della funzione determinante che mi restituisce sempre e comunque un valore del determinante uguale a zero.

Cosa c'è che non va?
Gervasoni è offline   Rispondi citando il messaggio o parte di esso
Old 21-03-2004, 18:20   #2
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
attento che non inizializzi det a zero.
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 21-03-2004, 19:07   #3
Gervasoni
Senior Member
 
L'Avatar di Gervasoni
 
Iscritto dal: Oct 2000
Messaggi: 417
Una variabile locale viene automaticamente inizializzata a zero.
Il problema è che non funge proprio la ricorsione...

Perchè a det non viene assegnato questo valore?

Codice:
det=det+(x[n_rig][n_col]*pow(-1,n_col+n_rig)*determinante(min_estratto,h));
Help please!
Gervasoni è offline   Rispondi citando il messaggio o parte di esso
Old 21-03-2004, 19:49   #4
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da Gervasoni
Una variabile locale viene automaticamente inizializzata a zero.
Questo non è assoultamente vero...
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 21-03-2004, 20:25   #5
ri
Senior Member
 
L'Avatar di ri
 
Iscritto dal: Feb 2003
Città: fra casa e lavoro
Messaggi: 1061
Quote:
Originariamente inviato da Gervasoni
Una variabile locale viene automaticamente inizializzata a zero.


ommiodio

scusa sa rotflo ma l'hai detto troppo convinto per non farmi ridere
ri è offline   Rispondi citando il messaggio o parte di esso
Old 21-03-2004, 20:56   #6
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Quote:
Originariamente inviato da Gervasoni
Una variabile locale viene automaticamente inizializzata a zero.
Il problema è che non funge proprio la ricorsione...
non e' garantito, anche se probabilmente alcuni compilatori permettono di impostare tale opzione.
Infatti il seguente codice
Codice:
void foo()
{
    float f;
    cout << f;
}
stampa
Codice:
1.#QNAN
sul mio compilatore.
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 21-03-2004, 21:10   #7
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Re: [c++] Problema con funzione ricorsiva

Quote:
if (n_rig>2)
{
for (int n_col=0; n_col<IMAX; n_col++)
{
matrice_minore(x,min_estratto,n_col,h+1);
det=det+(x[n_rig][n_col]*pow(-1,n_col+n_rig)*determinante(min_estratto,h));
printf("\t\t%d\n",h);
}
h=h-1;
}
h a cosa serve ? Non dovrebbe bastarti n_col e n_rig ?
Ancora piu' dubbio quel pow(-1,...) , dovrebbe bastare qualcosa del tipo
Codice:
det = det + x[n_rig][n_col]*determinante(min_estratto);
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 21-03-2004, 21:41   #8
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Quote:
Originariamente inviato da /\/\@®¢Ø
non e' garantito, anche se probabilmente alcuni compilatori permettono di impostare tale opzione.
Infatti il seguente codice
Codice:
void foo()
{
    float f;
    cout << f;
}
stampa
Codice:
1.#QNAN
sul mio compilatore.
Dimenticavo di dire che invece sono le variabili globali quelle che vengono inizializzate a 0.
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 22-03-2004, 15:16   #9
Gervasoni
Senior Member
 
L'Avatar di Gervasoni
 
Iscritto dal: Oct 2000
Messaggi: 417
l'h la passo a n_rig

Il pow serve perchè x[n_rig][n_col] deve essere alternativamente positiva e negativa.

Cmq Marco grazie per l'aiuto.
Gervasoni è offline   Rispondi citando il messaggio o parte di esso
Old 22-03-2004, 16:55   #10
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Al posto di pow(-1,n_col+n_rig) metti:
Codice:
inline float pow_minus1(const int riga, const int colonna)
{
    return (float)((riga+colonna)&0x1)?-1:1;
}
Direi 5 o 6 volte + veloce... Pensa che il pow era l'operazione + lenta del tuo programma
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 22-03-2004, 18:44   #11
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Quote:
Originariamente inviato da Gervasoni
l'h la passo a n_rig
Ok, ma allora che serve decrementarlo dopo il ciclo for visto che non lo usi piu' ?

Quote:
Il pow serve perchè x[n_rig][n_col] deve essere alternativamente positiva e negativa.

Cmq Marco grazie per l'aiuto.
Hai ragione avevo l'avevo letto come x^-1 invece che -1^x
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 22-03-2004, 22:34   #12
Gervasoni
Senior Member
 
L'Avatar di Gervasoni
 
Iscritto dal: Oct 2000
Messaggi: 417
Quote:
Ok, ma allora che serve decrementarlo dopo il ciclo for visto che non lo usi piu' ?
Già! Sarebbe quindi giusto levare

Codice:
int h=n_rig-1;
e
Codice:
h=h-1;
e chiamare la funzione direttamente come
determinante(min_estratto,n_rig-1)?
Gervasoni è offline   Rispondi citando il messaggio o parte di esso
Old 23-03-2004, 13:29   #13
angelica
Member
 
Iscritto dal: Nov 2003
Messaggi: 42
Quote:
Originariamente inviato da cionci
Direi 5 o 6 volte + veloce... Pensa che il pow era l'operazione + lenta del tuo programma
Mi son sempre chiesta come si faccia a sapere quanto più veloce giri il proprio prog post-modifiche, e la velocità/lentezza delle singole operazioni...
__________________
ANGI
angelica è offline   Rispondi citando il messaggio o parte di esso
Old 23-03-2004, 13:58   #14
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Quote:
Originariamente inviato da cionci
Al posto di pow(-1,n_col+n_rig) metti:
Codice:
inline float pow_minus1(const int riga, const int colonna)
{
    return (float)((riga+colonna)&0x1)?-1:1;
}
Direi 5 o 6 volte + veloce... Pensa che il pow era l'operazione + lenta del tuo programma
In teoria trasformando l'if in operazioni artimetiche ne dovrebbe trar giovamento la pipeline giusto ?
(pensavo a qualcosa del tipo ((riga+colonna)&0x1)*2-1))
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 23-03-2004, 17:10   #15
verloc
Senior Member
 
L'Avatar di verloc
 
Iscritto dal: Jan 2000
Messaggi: 551
Quote:
Originariamente inviato da angelica
Mi son sempre chiesta come si faccia a sapere quanto più veloce giri il proprio prog post-modifiche, e la velocità/lentezza delle singole operazioni...

Con un "profiler".


Mi ricordo che ne esisteva uno gratise.
verloc è offline   Rispondi citando il messaggio o parte di esso
Old 23-03-2004, 17:33   #16
cionci
Senior Member
 
L'Avatar di cionci
 
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
Quote:
Originariamente inviato da /\/\@®¢Ø
In teoria trasformando l'if in operazioni artimetiche ne dovrebbe trar giovamento la pipeline giusto ?
(pensavo a qualcosa del tipo ((riga+colonna)&0x1)*2-1))
Certo....ma ti sei dimenticato un - davanti (dispari: 1*2-1 dovrebbe rendere -1; pari: 0*2-1, ma dovrebbe rendere 1)... Non avevo pensato a farlo in questo modo Anche se allora sarebbe più veloce così: -((riga+colonna)&0x1)<<1 - 1)

Ultima modifica di cionci : 23-03-2004 alle 17:36.
cionci è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2004, 20:55   #17
Gervasoni
Senior Member
 
L'Avatar di Gervasoni
 
Iscritto dal: Oct 2000
Messaggi: 417
C'è l'ho fatta!!!

Grazie per l'aiuto!
Gervasoni è offline   Rispondi citando il messaggio o parte di esso
Old 27-03-2004, 21:26   #18
/\/\@®¢Ø
Bannato
 
L'Avatar di /\/\@®¢Ø
 
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
Quote:
Originariamente inviato da Gervasoni
C'è l'ho fatta!!!

Grazie per l'aiuto!
Eh, ma adesso devi dirci come, altrimenti non vale
/\/\@®¢Ø è offline   Rispondi citando il messaggio o parte di esso
Old 29-03-2004, 23:43   #19
Gervasoni
Senior Member
 
L'Avatar di Gervasoni
 
Iscritto dal: Oct 2000
Messaggi: 417
Ho riscritto il programma da zero.
C'erano vari errori cmq non grossolani...

Ti allego il file .cpp così mi dai un parere
Gervasoni è offline   Rispondi citando il messaggio o parte di esso
Old 29-03-2004, 23:45   #20
Gervasoni
Senior Member
 
L'Avatar di Gervasoni
 
Iscritto dal: Oct 2000
Messaggi: 417
Ecco il file
Allegati
File Type: zip determinante2.zip (1.6 KB, 9 visite)
Gervasoni è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ADV, ma con molti più pulsanti Mad Catz M.M.O. 7+: lo stesso DNA del R.A.T. 8+ ...
Radeon RX 9070 GRE, AMD la porta in tutto il mondo | Recensione Gigabyte Gaming OC Radeon RX 9070 GRE, AMD la porta in tutto il mon...
Reolink OMVI 3i WiFi: videosorveglianza più intelligente e facile da usare Reolink OMVI 3i WiFi: videosorveglianza pi&ugrav...
Recensione Vivo X300 Ultra: fotocamera eccezionale, ma prezzo proibitivo Recensione Vivo X300 Ultra: fotocamera ecceziona...
Xiaomi 17T Pro recensione: zoom Leica 5x e batteria silicio-carbonio per l'alternativa ai top Xiaomi 17T Pro recensione: zoom Leica 5x e batte...
Altro passo dei cinesi in Europa: Chery ...
AMD FSR 4.1: l'architettura RDNA 3.5 pot...
L'Economist dice di non dare la colpa al...
Meta frena sul tracciamento dei dipenden...
Falla zero-click su Android, anche Linux...
AMD ha nascosto il vero segreto di EXPO ...
TRYX porta la personalizzazione a un nuo...
Designer di auto cinesi all'attacco di F...
Oltre 3.000 posti di lavoro a rischio: l...
Uber taglia il 23% del personale HR, ma ...
Amazon TOP 7 rinnovata: in posizione 2 u...
HTTP/2 Bomb: il nuovo attacco DoS che ab...
Assetto Corsa Evo v0.7: arrivano finalme...
2 portatili tuttofare Vivobook e Acer a ...
È stato acceso il più gran...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 13:17.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v