Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    27

    Ricerca binaria e !trovato

    ragazzi vorrei chiedervi delle spiegazioni su questonon posto tutto il codice altrimenti diventa infinito)

    codice:
    bool Cerca_Prodotto(const Magazzino  M, const int n, const char * C, int & pos){
        
        bool trovato=false;
        int i=0;
        pos=-1;
        
        cout <<"Trovato intermedio: "<<trovato<<endl;
        cout <<"i vale: "<<i<<endl;
        while(i<n && !trovato)
        
          if(!strcmp(M[i].Codice,C)) {
           cout <<"Trovato prima: "<<trovato<<endl;
           pos=i;
           trovato=true;
          cout <<"Trovato dopo: "<<trovato<<endl;
          }     
          else i++;
    return trovato;   
    }
    questo il main.cpp

    codice:
    #include <cstdlib>
    #include <iostream>
    
    #include "Prodotti1.h"
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        // Test delle funzioni sul tipo prodotto
      Prodotto P1;
      Inserisci_DatiProdotto(P1);
      Visualizza_DatiProdotto(P1);
      // ********** FINE *********************
      
      // Inizio programma 
      Magazzino M;
      int n;
    
      // PARTE 1
      Crea_Magazzino(M,n);
      Visualizza_Magazzino(M,n);
      system("PAUSE");
      
       // PARTE 2
       char C[DIM];
       int pos=-1;
       cout << "\n Ricerca Prodotto.";
       cout << "\n Inserire il Codice: ";
       cin.ignore();
       cin.getline(C,DIM);
       if(Cerca_Prodotto(M,n,C,pos)) cout << "\n Prodotto presente. Posizione: " << pos;
       else  cout << "\n Prodotto NON presente." ;
       system("PAUSE");
    vorrei sapere nella specifica della funzione Cerca_Prodotto, !trovato che significa(io penserei trovato==false) e perchè usa !strcmp per fare il confronto, cioè lui dovrebbe fare il confronto se strcmp torna 0 dovrebbe entrare nel ciclo if, ho molti dubbi nel capirlo.
    Aspetto il vostro aiuto. Grazie

  2. #2
    E' codice C++ usato come se fosse C.
    In C non esistono i bool, vengono invece usati i valori numerici dove 0 = false e tutto il resto è uguale true.

    strcmp restituisce 0 se le stringhe sono uguali, altrimenti un numero maggiore o minore di 0. Tenendo presente quanto detto sopra, strcmp ritorna falso quando le stringhe sono uguali, e vero quando sono diverse e pertanto è stato usato l'operatore ! per invertire il senso booleano del predicato.
    ...

  3. #3
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    ! -> Not

    quindi
    Not 0 -> 1 -> true
    Nella strcmp: !strcmp(str1, str2) è equivalente a strcmp(str1, str2) == 0
    Not false -> true
    è una negazione logica che serve a far continuare il ciclo.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    27

    grazie mille

    allora if per continuare ha bisogno di 1, dato che se le stringhe sono uguali esce 0, allora l'if non andrebbe avanti, giusto?

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Appunto esce 0 quindi il ! serve per trasformarlo in true...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    A prescindere da tutto, se incrementi i ad ogni iterazione non è ricerca binaria è ricerca sequenziale. Al posto della tua funzione cerca_prodotto suggerirei l'uso della funzione di libreria bsearch , a patto che l'array in input sia ordinato.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    27
    raga tramite questo codice ho cercato di confrontare l'indirizzo del parametro formale e quello dell'argomento, per vedere che effettivamente fossero identici:

    codice:
    void Crea_Magazzino(Magazzino & M, int & n){
        
        Prodotto P;
        cout <<"indirizzo magazzino parametro formale: "<<&M<<endl;
        cout << "\n Quanti Prodotti diversi contiene il magazzino?: ";
        cout <<"indirizzo n parametro formale: "<<&n<<endl;
        cin >> n;
        
        
        cout << "\n Inserimento Dati Prodotti.";
         
        for (int i=0; i<n; i++) {
            cin.ignore();
            Inserisci_DatiProdotto(M[i]);
        }  
        cout << "\n Fatto!";      
    }
    quindi il passaggio per riferimento copia l'indirizzo dell'argomento all'interno del parametro formale, facendo quindi cambiare indirizzo a quest'ultimo? quindi senza creare una copia, perchè non riesco a capire la differenza tra questo passaggio e il passagio per indirizzo con i puntatori.

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,282

    Moderazione

    Originariamente inviato da ar146
    raga tramite questo codice ho cercato di confrontare l'indirizzo del parametro formale e quello dell'argomento, per vedere che effettivamente fossero identici:
    [...]

    quindi il passaggio per riferimento copia l'indirizzo dell'argomento all'interno del parametro formale, facendo quindi cambiare indirizzo a quest'ultimo? quindi senza creare una copia, perchè non riesco a capire la differenza tra questo passaggio e il passagio per indirizzo con i puntatori.
    Per un nuovo problema, apri una nuova discussione (seguendo le indicazioni del Regolamento).
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    27

    ok

    grazie mille non lo sapevo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.