Oppure

Loading
04/02/10 14:54
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..




#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);
}
aaa
04/02/10 15:31
TheKaneB
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..



#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);
} 



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:
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:
 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!
aaa
04/02/10 17:01
bose
Postato originariamente da TheKaneB:

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..



#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);
} 



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:
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:
 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
printf("\nINSERISCI MAX 10 CARTTERI")
..e cosi anche la seconda stringa.. leggendola con
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
char s1[10]
... mi scuso..mi rendo conto che queste cose dovevo dirle prima.. sorry..

facendo il while.. quale sarebbe la condizione per uscire?
while (s1[kk]!=s2[kk])
?
Ultima modifica effettuata da bose 04/02/10 17:06
aaa
04/02/10 17:59
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 '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 '{parsed_message}'.

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

ps.@kane ma in c le variabili locali non vengono automaticamente inizializzate a 0?
Mi pare sia cosi :k:
aaa
04/02/10 18:14
bose
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 '
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 '{parsed_message}'.

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;
if (s1[kk]!=s2[kk])
       { 
          if (s1[kk] < s1[kk])
              {
                ris=1;
                 
                  else
                
                 ris=2;

            }
        }while ((s1[kk]==s2[kk]) && (ris==0)); 


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

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;
if (s1[kk]!=s2[kk])
       { 
          if (s1[kk] < s1[kk])
              {
                ris=1;
                 
                  else
                
                 ris=2;

            }
        }while ((s1[kk]==s2[kk]) && (ris==0)); 


fatto cosi cambi aqualcosa?
aiutatemi please... !! :hail::hail:
Ultima modifica effettuata da bose 04/02/10 18:23
aaa
04/02/10 20:49
nessuno
Postato originariamente da ingMark:
ma in c le variabili locali non vengono automaticamente inizializzate a 0?
Mi pare sia cosi :k:


No ... affatto ...

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 ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
05/02/10 15:16
bose
mi è venuto in mente di farlo cosi il programma che ne dite?

#include <stdio.h>
#include <conio.h>
void main(void)
{
     char  s1[10];
     char  s2[10];


     int   	cerca_max(char *str1, char *str2);
     int	kk,ris;
     

	clrscr();

     	for (kk=0; kk<10;kk++)
	{
		s1[kk] = 0;
	}
	

     	for (kk=0; kk<10;kk++)
	{
		s2[kk] = 0;
	}

	printf("\n\inserisci la prima parola max 10 caratteri");
     	scanf("%s",s1);
     

     	printf("\n\inserisci la seconda parola max 10 caratteri");
     	scanf("%s",s2);

	printf("\n\nIL RISULTATO VALE 1 SE LA PRIMA PAROLA E' PIU GRANDE DELLA SECONDA
		\n\nIL RISULTATO VALE 2 SE LA SECONDA PAROLA E' PIU GRANDE DELLA PRIMA
		\n\nIL RISULTATO VALE 0 SE LE PAROLI SONO UGUALI:
		\n\n\nIl risultato è: %d",ris);




     	ris= cerca_max (s1,s2);
	getch();
}


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

      ris=0;

while(str1 && str2 && ris)
{
	if(str1[kk]>str2[kk]) ris=1;
	if(str2[kk]>str2[kk]) ris=2;
	if(str2[kk]==str1[kk]) kk++;
	
	
    return (ris);

}


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

if (ris==0)
{
}
aaa