|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 | |
|
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2271
|
C++ help con bubble sort e strcmp
Quote:
Grazie mille per le vostre risposte...
__________________
RYzen 5900 asus rog strix z570-f Cors Veng 32 GB (4X8GB)DDR4 3600 MHz GTX 1080ti SEAG Barr 7200.10 - 320 Gb +750 + 2x 1Tb - 1 SDD120 GB + 1 SDD Crucial M4 480 GB corsair 950W - Case CorsCC-9011059-WW
|
|
|
|
|
|
|
#2 | |
|
Member
Iscritto dal: Dec 2006
Messaggi: 104
|
Quote:
-un intero minore di 0 se s1 è minore di s2( o meglio i primi n caratteri della stringa s1 sono minori degli n caratteri della stringa s2) -un intero maggiore di 0 se s1 è maggiore di s2(i caratteri della prima stringa sono maggiori di quelli della seconda stringa) -0 se sono uguali le due stringhe. Ritornando al codice da te riportato, quindi, nell'if tu vai a confrontare precisamente se il primo parametro e' maggiore del secondo(riferimenti al nome)e lì non effettui affatto l'ordinamento delle componenti, cioè non è strcmp che lo determina bensì le istruzioni che vengono dopo quel costrutto di selezione cioe': Codice:
if(strcmp(Selezionaimpiegato[y].nome, Selezionaimpiegato[y + 1].nome) > 0)
{
//salvi in hold il campo con valore maggiore
hold = Selezionaimpiegato[y];
Selezionaimpiegato[y] = Selezionaimpiegato[y + 1];
//per poi aggiornarlo con quello minore
Selezionaimpiegato[y +1] = hold;
}
//alla fine di questo ciclo in pratica ti trovi le componenti ordinate.
//Per comprenderlo meglio, cerca di farti un esempio proprio come un nome
//sostituendo i valori delle variabili con questi nomi e vedi che il ragionamento torna.
|
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2271
|
Questo lo sapevo , ma la mia domanda è più specifica , in pratica vorrei sapere in base a cosa calcola i valori che restituisce e cosa rappresentano i valori maggiori o minori di 0 nel caso siano anche diversi da 1 o -1 , in pratica qual'è il processo che permette a strcmp di tirar fuori un valore di questo tipo ,
cosa intendi per iprimi n caratteri della stringa sono minori degli n della seconda? se due stringhe per esempio sono di 5 caratteri entrambe , differendo solo per le ultime due , come fa ad ordinarle? in base a quali valori l'algoritmo decide che una stringa viene prima di un altra in ordine alfabetico ? in sostanza come viene deciso l'ordine alfabetico ? Qual'è la connessione nujerica?
__________________
RYzen 5900 asus rog strix z570-f Cors Veng 32 GB (4X8GB)DDR4 3600 MHz GTX 1080ti SEAG Barr 7200.10 - 320 Gb +750 + 2x 1Tb - 1 SDD120 GB + 1 SDD Crucial M4 480 GB corsair 950W - Case CorsCC-9011059-WW
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: May 2005
Città: Bari
Messaggi: 349
|
uhm...azzardo un'ipotesi...penso ci sia una sorta di corrispondenza tra lettera e intero... quindi ad es ad 'a' è associato 1, a 'b' 2 ecc...
io prima di conoscere il return di strcmp pensavo di fare una cosa simile per ordinare alfabeticamente, ovvero utilizzando atoi e poi confrontare gli interi resituiti... Vito
__________________
Si può vincere una guerra in due...o forse anche da solo. Si può estrarre il cuore anche al più nero assassino, ma è più difficile cambiare un'idea! |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2271
|
mi chiedo invece se strcmp non faccia in pratica una sottrazione tra valori ascii dei caratteri ed in base a questo risultato dia la differenza ..... ma è solo una mia ipotesi , vorrei avere una risposta certa....
__________________
RYzen 5900 asus rog strix z570-f Cors Veng 32 GB (4X8GB)DDR4 3600 MHz GTX 1080ti SEAG Barr 7200.10 - 320 Gb +750 + 2x 1Tb - 1 SDD120 GB + 1 SDD Crucial M4 480 GB corsair 950W - Case CorsCC-9011059-WW
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Codice:
int __cdecl strcmp (
const char * src,
const char * dst
)
{
int ret = 0 ;
while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
++src, ++dst;
if ( ret < 0 )
ret = -1 ;
else if ( ret > 0 )
ret = 1 ;
return( ret );
}
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2271
|
sI Ma strcmp cosa fa esattamente?
__________________
RYzen 5900 asus rog strix z570-f Cors Veng 32 GB (4X8GB)DDR4 3600 MHz GTX 1080ti SEAG Barr 7200.10 - 320 Gb +750 + 2x 1Tb - 1 SDD120 GB + 1 SDD Crucial M4 480 GB corsair 950W - Case CorsCC-9011059-WW
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2271
|
QUALCUNO HA IL SOURCE CODE DI STRCMP PER IL C++?
__________________
RYzen 5900 asus rog strix z570-f Cors Veng 32 GB (4X8GB)DDR4 3600 MHz GTX 1080ti SEAG Barr 7200.10 - 320 Gb +750 + 2x 1Tb - 1 SDD120 GB + 1 SDD Crucial M4 480 GB corsair 950W - Case CorsCC-9011059-WW
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
Se non ti è chiaro il codice sopra .... è semplice da spiegare: la strcmp prende ogni singolo carattere (allo stesso indice) di ognuna delle due stringhe e lo compara. Fino a quando due caratteri sono uguali, va avanti. Appena trova due caratteri diversi o trova il nullo su una stringa, allora esce.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: May 2005
Città: Bari
Messaggi: 349
|
Quote:
int strcmp(const char *s1, const char *s2); vuol dire che inseriti 2 puntatori a char (ricordo che il "nome" di un array è di per sè un puntatore al primo carattere dell'array), nel fare la "comparazione" restituisce un intero... questo intero è maggiore, minore o uguale a 0 a seconda che s1 sia maggiore, minore o uguale a s2. banalmente nel tuo main hai una cosa di questo tipo...la butto giù lì velocemente.. Codice:
#include <stdio.h>
#include <string.h>
int main()
{
char stringa1[20], stringa2[20]; //array da comparare
int confronto; //variabile per effettuare il controllo
printf("Carica la prima stringa: ");
scanf("%s", stringa1);
printf("Carica la seconda stringa: ");
scanf("%s", stringa2);
confronto=strcmp(stringa1,stringa2);
if(confronto>0)
printf("La stringa 2 viene prima della 1");
else
{
if(confronto<0)
printf("La stringa 1 viene prima della 2");
else
printf("Le due stringhe sono identiche");
}
}
__________________
Si può vincere una guerra in due...o forse anche da solo. Si può estrarre il cuore anche al più nero assassino, ma è più difficile cambiare un'idea! |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2271
|
Forse non sono stato chiaro , quello che volgio sapere è "come" e non cosa faccia , e non mi riferisco al come agisca all'interno di un altro programma , ma cosa accafdaall'interno della funzione strcmp , confronta un carattere con l'altro daccordo , ma come? quali algoritmi usa ? che numeri tira fuori , e cosa vuol dire che un carattere è maggiore di un altro?
__________________
RYzen 5900 asus rog strix z570-f Cors Veng 32 GB (4X8GB)DDR4 3600 MHz GTX 1080ti SEAG Barr 7200.10 - 320 Gb +750 + 2x 1Tb - 1 SDD120 GB + 1 SDD Crucial M4 480 GB corsair 950W - Case CorsCC-9011059-WW
|
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: May 2005
Città: Bari
Messaggi: 349
|
presumo e dico presumo che, brutalmente, faccia una sottrazione tra i rispettivi codici ascii, ovvero i numeri che vengono "ritornati" dalla funzione atoi...
i numeri associati ai caratteri, in ascii, sono sequenziali, quindi presumo che strcmp esamini il risultato della differenza e poi restituisca il -1, lo 0 oppure l'1... esempio: il carattere 'a' ha codice 97, e così via la 'b', la 'c'...fino a 'z' che ha 122. supponendo di confrontare i due valori di 'a' (della stringa 1) e 'z' (della stringa 2) verrebbe 97 - 122 che è ovviamente < 0...quindi, indipendentemente dal risultato, strcmp(stringa1,stringa2) restituirà un valore pari a -1 confrondando, al contrario, 'z' ed 'a' (quindi strcmp(stringa2,stringa1)) si ha un valore > 0 e strcmp "ritorna" 1. nel caso in cui si confrontino due stringhe con char uguali la differenza è banalmente zero. spero di essere stato esauriente, Vito
__________________
Si può vincere una guerra in due...o forse anche da solo. Si può estrarre il cuore anche al più nero assassino, ma è più difficile cambiare un'idea! Ultima modifica di mapomapo : 14-01-2007 alle 15:17. |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2271
|
E' la stessa presunzione che ho fatto io , ma vorrei averne una certezza , possibile che non c'è nessun codice da vedere?
__________________
RYzen 5900 asus rog strix z570-f Cors Veng 32 GB (4X8GB)DDR4 3600 MHz GTX 1080ti SEAG Barr 7200.10 - 320 Gb +750 + 2x 1Tb - 1 SDD120 GB + 1 SDD Crucial M4 480 GB corsair 950W - Case CorsCC-9011059-WW
|
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Per il compilatore C++ i caratteri non sono altro che dei numeri, cambiano solo le funzioni che le manipolano (ad esempio vengono stampati a video in modo diverso) , per cui quando fai 'a' < 'b' o 97 < 98 non cambia nulla. La "conversione" da 'a' a 97 avviene nel momento in cui il tuo codice viene letto dal frontend del compilatore oppure viene letto l'input da tastiera, poi e' solo un numero. Questo perlomeno nell'implementazione piu' "cruda", in cui ad esempio le lettere maiuscole (che hanno codice piu' basso di quelle minuscole) vengono considerate "minori" di quelle minuscole, cosi' che hai "ZZZ" minore di "aaa". In C++ hai pure la possibilita' (usando le string) di scegliere un tipo di confronto diverso.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele Ultima modifica di marco.r : 14-01-2007 alle 16:12. |
|
|
|
|
|
|
#15 |
|
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2271
|
Ok quindi ad esempioc come funzionerebbe mettere in ordine le tre parole come :
abcd abde abco ?
__________________
RYzen 5900 asus rog strix z570-f Cors Veng 32 GB (4X8GB)DDR4 3600 MHz GTX 1080ti SEAG Barr 7200.10 - 320 Gb +750 + 2x 1Tb - 1 SDD120 GB + 1 SDD Crucial M4 480 GB corsair 950W - Case CorsCC-9011059-WW
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
{ 97, 98, 99, 100, 0 } { 97, 98, 100, 101, 0 } { 97, 98, 99, 111, 0 } Quando confronta i primi due, fa le seguenti considerazioni confronta 97 con 97, sono uguali e quindi passa al successivo; confronta 98 con 98, sono uguali e passa al terzo elemento. 99 pero' e' minore di 100 per cui l'algoritmo si ferma e ritorna -1
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
|
#17 |
|
Senior Member
Iscritto dal: Jan 2006
Messaggi: 2271
|
qUINDI TIENE IN CONSIDERAZIONE IL VALORE DEL CHAR , MA ANCHE L'ORDINE in cui sono disposti giucsto? per esempio se al terzo char trova che la prima stringa contiene un char < del terzo char della seconda stringa si ferma nell'analisi e restituisce direttamente un -1?
__________________
RYzen 5900 asus rog strix z570-f Cors Veng 32 GB (4X8GB)DDR4 3600 MHz GTX 1080ti SEAG Barr 7200.10 - 320 Gb +750 + 2x 1Tb - 1 SDD120 GB + 1 SDD Crucial M4 480 GB corsair 950W - Case CorsCC-9011059-WW
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
esatto
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 17:16.



















