Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - funzione 2 stringhe max e min
Forum - C/C++ - funzione 2 stringhe max e min

Avatar
bose (Normal User)
Newbie


Messaggi: 4
Iscritto: 04/02/2010

Segnala al moderatore
Postato alle 15:54
Giovedì, 04/02/2010
..ciao ragazzi..dovrei fare una funzione che date due stringhe mi ritorni 0 se sono di caratteri nella stessa posizione e uguali, 1 se la stringa1 è piu grande e 2 se la stringa2 è piu grande..  sotto trovate la funzione come ho fatto io solo che non va..mi da a video sempre 2..




#include <STDIO.H>
#include <CONIO.H>

#define vero 1
#define falso 0

void main(void)
{
        
       interno del programma che non scrivo perchè non serve = )

}


int cerca_max (char *str1, char *str2)
{
   int kk, ris,bool;
  
   bool=0;
   ris=0;

   do
   {
      if (str1[kk]!= str2[kk])
      {
         if(str1[kk] > str2[kk])
          {
             ris=1;
             bool=1;
          }
            if(str1[kk] < str2[kk])
          {
             ris=2;
             bool=1;
          }
       }
     kk++;
   } while ((str1[kk] == str2[kk]) && (bool==0));

return (ris);
}

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 16:31
Giovedì, 04/02/2010
Testo quotato

Postato originariamente da bose:

..ciao ragazzi..dovrei fare una funzione che date due stringhe mi ritorni 0 se sono di caratteri nella stessa posizione e uguali, 1 se la stringa1 è piu grande e 2 se la stringa2 è piu grande..  sotto trovate la funzione come ho fatto io solo che non va..mi da a video sempre 2..



Codice sorgente - presumibilmente C++

  1. #include <STDIO.H>
  2. #include <CONIO.H>
  3.  
  4. #define vero 1
  5. #define falso 0
  6.  
  7. void main(void)
  8. {
  9.        
  10.       // interno del programma che non scrivo perchè non serve = )
  11.  
  12. }
  13.  
  14.  
  15. int cerca_max (char *str1, char *str2)
  16. {
  17.    int kk, ris,bool;
  18.    
  19.    bool=0;
  20.    ris=0;
  21.  
  22.    do
  23.    {
  24.       if (str1[kk]!= str2[kk])
  25.       {
  26.          if(str1[kk] > str2[kk])
  27.           {
  28.              ris=1;
  29.              bool=1;
  30.           }
  31.             if(str1[kk] < str2[kk])
  32.           {
  33.              ris=2;
  34.              bool=1;
  35.           }
  36.        }
  37.      kk++;
  38.    } while ((str1[kk] == str2[kk]) && (bool==0));
  39.  
  40. return (ris);
  41. }





Premessa: intanto usiamo il tag CODE altrimenti non si capisce niente del codice...

Hint 0):
la variabile kk non ha un valore iniziale, quindi potrebbe contenere un numero casuale facendo crashare il programma quando tenti di usarla come indice per un array...

inizializzala nel momento stesso in cui la dichiari:
Codice sorgente - presumibilmente C/C++

  1. int kk = 0;


Hint 1): non sai quanto sono lunghe le stringhe, quindi potresti tranquillamente andare a leggere memoria non inizializzata... una stringa termina quando incontri il carattere nullo, valore ascii 0.

Quando incontri questo carattere puoi dichiarare terminato il ciclo (quindi modifica il ciclo di conseguenza...).

Hint 2): Anzichè usare il do..while usa un più generico while. Non puoi sapere a priori se esiste almeno un carattere in entrambe le stringhe, quindi potresti far crashare il programma nel caso in cui una delle stringhe sia nulla.

Hint 3): Lo standard ISO vuole che la funzione main abbia la seguente firma:
Codice sorgente - presumibilmente C/C++

  1. int main(int argc, char **argv)


Se non rispetti questo standard, dichiarando la funzione come void, il sistema riceverà in output un valore numerico casuale (anche se di solito è 0 su windows), quindi non sarà in grado di determinare la corretta esecuzione del programma (con possibile falsa segnalazione di terminazione inaspettata). Dichiara come int, e quando il programma termina correttamente, metti un bel return 0; alla fine, oppure return 1 in caso di errori gravi e irreversibili (ad esempio quando finisce la memoria e fallisce una malloc).

Hint 4): la parola bool in C++ (e anche in C99) è il nome di un tipo predefinito. Usa un nome di variabile diverso da "bool", in modo da aumentare la compatibilità del tuo codice con tutti i compilatori C e C++ esistenti.

non ho altri suggerimenti da darti per il momento...
Ciao!


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
PM Quote
Avatar
bose (Normal User)
Newbie


Messaggi: 4
Iscritto: 04/02/2010

Segnala al moderatore
Postato alle 18:01
Giovedì, 04/02/2010
Testo quotato

Postato originariamente da TheKaneB:

Testo quotato

Postato originariamente da bose:

..ciao ragazzi..dovrei fare una funzione che date due stringhe mi ritorni 0 se sono di caratteri nella stessa posizione e uguali, 1 se la stringa1 è piu grande e 2 se la stringa2 è piu grande..  sotto trovate la funzione come ho fatto io solo che non va..mi da a video sempre 2..



Codice sorgente - presumibilmente C++

  1. #include <STDIO.H>
  2. #include <CONIO.H>
  3.  
  4. #define vero 1
  5. #define falso 0
  6.  
  7. void main(void)
  8. {
  9.        
  10.       // interno del programma che non scrivo perchè non serve = )
  11.  
  12. }
  13.  
  14.  
  15. int cerca_max (char *str1, char *str2)
  16. {
  17.    int kk, ris,bool;
  18.    
  19.    bool=0;
  20.    ris=0;
  21.  
  22.    do
  23.    {
  24.       if (str1[kk]!= str2[kk])
  25.       {
  26.          if(str1[kk] > str2[kk])
  27.           {
  28.              ris=1;
  29.              bool=1;
  30.           }
  31.             if(str1[kk] < str2[kk])
  32.           {
  33.              ris=2;
  34.              bool=1;
  35.           }
  36.        }
  37.      kk++;
  38.    } while ((str1[kk] == str2[kk]) && (bool==0));
  39.  
  40. return (ris);
  41. }





Premessa: intanto usiamo il tag CODE altrimenti non si capisce niente del codice...

Hint 0):
la variabile kk non ha un valore iniziale, quindi potrebbe contenere un numero casuale facendo crashare il programma quando tenti di usarla come indice per un array...

inizializzala nel momento stesso in cui la dichiari:
Codice sorgente - presumibilmente C/C++

  1. int kk = 0;


Hint 1): non sai quanto sono lunghe le stringhe, quindi potresti tranquillamente andare a leggere memoria non inizializzata... una stringa termina quando incontri il carattere nullo, valore ascii 0.

Quando incontri questo carattere puoi dichiarare terminato il ciclo (quindi modifica il ciclo di conseguenza...).

Hint 2): Anzichè usare il do..while usa un più generico while. Non puoi sapere a priori se esiste almeno un carattere in entrambe le stringhe, quindi potresti far crashare il programma nel caso in cui una delle stringhe sia nulla.

Hint 3): Lo standard ISO vuole che la funzione main abbia la seguente firma:
Codice sorgente - presumibilmente C/C++

  1. int main(int argc, char **argv)


Se non rispetti questo standard, dichiarando la funzione come void, il sistema riceverà in output un valore numerico casuale (anche se di solito è 0 su windows), quindi non sarà in grado di determinare la corretta esecuzione del programma (con possibile falsa segnalazione di terminazione inaspettata). Dichiara come int, e quando il programma termina correttamente, metti un bel return 0; alla fine, oppure return 1 in caso di errori gravi e irreversibili (ad esempio quando finisce la memoria e fallisce una malloc).

Hint 4): la parola bool in C++ (e anche in C99) è il nome di un tipo predefinito. Usa un nome di variabile diverso da "bool", in modo da aumentare la compatibilità del tuo codice con tutti i compilatori C e C++ esistenti.

non ho altri suggerimenti da darti per il momento...
Ciao!




ok grazie =) ..
..un paio di cose..

kk la immetto io con
Codice sorgente - presumibilmente Plain Text

  1. printf("\nINSERISCI MAX 10 CARTTERI")

..e cosi anche la seconda stringa.. leggendola con
Codice sorgente - presumibilmente Plain Text

  1. scanf("%s", s1)

e idem per la seconda stringa s2..  la lunghezza non l ho messa perchè non penso che serva.. perchè se incontra già la prima parola diversa esce.. e poi.. azzerando le stringhe..   le 2 stringhe sono da 10
Codice sorgente - presumibilmente C/C++

  1. char s1[10]

... mi scuso..mi rendo conto che queste cose dovevo dirle prima.. sorry..

facendo il while.. quale sarebbe la condizione per uscire?
Codice sorgente - presumibilmente C/C++

  1. while (s1[kk]!=s2[kk])

?

Ultima modifica effettuata da bose il 04/02/2010 alle 18:06
PM Quote
Avatar
ingMark (Ex-Member)
Pro


Messaggi: 176
Iscritto: 19/07/2009

Segnala al moderatore
Postato alle 18:59
Giovedì, 04/02/2010
e se le due stringhe fossero uguali? :P
Vai avanti all'infinito^^
la lunghezza non è necessaria a patto di far finire while (oltre che quando sono diverse) anche quando incontri '\0'.

ps.@kane ma in c le variabili locali non vengono automaticamente inizializzate a 0?
Mi pare sia cosi :k:


Mamma diceva sempre che stupido è chi lo stupido fa.
PM Quote
Avatar
bose (Normal User)
Newbie


Messaggi: 4
Iscritto: 04/02/2010

Segnala al moderatore
Postato alle 19:14
Giovedì, 04/02/2010
Testo quotato

Postato originariamente da ingMark:

e se le due stringhe fossero uguali? :P
Vai avanti all'infinito^^
la lunghezza non è necessaria a patto di far finire while (oltre che quando sono diverse) anche quando incontri '\0'.

ps.@kane ma in c le variabili locali non vengono automaticamente inizializzate a 0?
Mi pare sia cosi :k:




se sono uguale arrivato al decimo carattere esco...  a parte che a me basta guardare il primo carattere per definire se è piu grande, piu piccolo o uguale.. esempio..

s1= abcdefghil
s2= bacdefghil

in questo caso devo mettere ris=2 perchè b della seconda stringa è piu grande di a..quindi metto 2 e esco..  oopss.. pero un secondo  mi è venuto in mente una cosa.. non mi basta fare cosi:

ciclo do-while
ris=0;
Codice sorgente - presumibilmente C/C++

  1. if (s1[kk]!=s2[kk])
  2.        {
  3.           if (s1[kk] < s1[kk])
  4.               {
  5.                 ris=1;
  6.                  
  7.                   else
  8.                
  9.                  ris=2;
  10.  
  11.             }
  12.         }while ((s1[kk]==s2[kk]) && (ris==0));



fatto cosi cambi aqualcosa?
aiutatemi please... !!  :hail::hail:

Ultima modifica effettuata da bose il 04/02/2010 alle 19:23
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:49
Giovedì, 04/02/2010
Testo quotato

Postato originariamente da ingMark:
ma in c le variabili locali non vengono automaticamente inizializzate a 0?
Mi pare sia cosi :k:



No ... affatto ...

Testo quotato

Postato originariamente da bose:
kk la immetto io con
Codice sorgente ...



kk non è inizializzata nella funzione cerca_max ... non capisco dove la inizializzi, come dici di fare (a parte che non si inizializza con una printf ...)


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
bose (Normal User)
Newbie


Messaggi: 4
Iscritto: 04/02/2010

Segnala al moderatore
Postato alle 16:16
Venerdì, 05/02/2010
mi è venuto in mente di farlo cosi il programma che ne dite?

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <conio.h>
  3. void main(void)
  4. {
  5.      char  s1[10];
  6.      char  s2[10];
  7.  
  8.  
  9.      int        cerca_max(char *str1, char *str2);
  10.      int        kk,ris;
  11.      
  12.  
  13.         clrscr();
  14.  
  15.         for (kk=0; kk<10;kk++)
  16.         {
  17.                 s1[kk] = 0;
  18.         }
  19.        
  20.  
  21.         for (kk=0; kk<10;kk++)
  22.         {
  23.                 s2[kk] = 0;
  24.         }
  25.  
  26.         printf("\n\inserisci la prima parola max 10 caratteri");
  27.         scanf("%s",s1);
  28.      
  29.  
  30.         printf("\n\inserisci la seconda parola max 10 caratteri");
  31.         scanf("%s",s2);
  32.  
  33.         printf("\n\nIL RISULTATO VALE 1 SE LA PRIMA PAROLA E' PIU GRANDE DELLA SECONDA
  34.                 \n\nIL RISULTATO VALE 2 SE LA SECONDA PAROLA E' PIU GRANDE DELLA PRIMA
  35.                 \n\nIL RISULTATO VALE 0 SE LE PAROLI SONO UGUALI:
  36.                 \n\n\nIl risultato è: %d",ris);
  37.  
  38.  
  39.  
  40.  
  41.         ris= cerca_max (s1,s2);
  42.         getch();
  43. }
  44.  
  45.  
  46. int  cerca_max(char *str1, char *str2)
  47. {
  48.       int kk,ris;
  49.  
  50.       ris=0;
  51.  
  52. while(str1 && str2 && ris)
  53. {
  54.         if(str1[kk]>str2[kk]) ris=1;
  55.         if(str2[kk]>str2[kk]) ris=2;
  56.         if(str2[kk]==str1[kk]) kk++;
  57.        
  58.        
  59.     return (ris);
  60.  
  61. }



però.. mi rimane un dubbio..  il dubbio che nella funzione dopo i tre if ce ne vada un altro..

Codice sorgente - presumibilmente C/C++

  1. if (ris==0)
  2. {
  3. }


PM Quote