PDA

Visualizza la versione completa : [C] Ordinamento di un array gi fornito nel programma


jac
23-02-2017, 23:50
Buonasera ragazzi, come da titolo sto cercando di creare un programma che ordina un array di stringhe(da me gia inserite).
Premetto che non � un esercizio datoci da svolgere dal professore.
L'algoritmo di ordinamento a cui mi ispiro � quello del bubblesort.
Il programma in se non da alcun errore quando provo a compilarlo per� quando lo eseguo sperando che riordini tutto fallisce restituendomi tutti i nomi nell'ordine in cui sono inseriti nel programma. Ormai sono gia diversi giorni(e soprattutto ore) che ci lavoro sopra senza giungere a nulla, complice anche il fatto che il mio professore universitario si spiega come un libro stracciato.
Sareste disposti a dirmi il codice in che punto non funziona come dovrebbe?
Il linguaggio di programmazione utilizzato � il C




#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int x=4,v,z,c,;
char *s[x];
s[0]="luca";
s[1]="marco";
s[2]="ciccio";
s[3]="aaaa";
{
for(v=1; v<3; v++)
{
for(z=0; z<3; z++)
{
c=strcmp(s[v],s[z]);
{
if(c==-1)
{
s[v]=s[z];
s[z]=s[v];
}
if(c==1)
{
s[z]=s[v];
s[v]=s[z];
}
}
}
}
}
for(v=0; v<4; v++)
{
printf("%s\n",s[v]);
}
}

boots
24-02-2017, 09:24
Ad occhio:

1. Uno dei due cicli deve andare fino a 4, altrimenti ti perdi il confronto dell'ultimo elemento

2. Se devi fare uno swap, ti serve un elemento di appoggio.


s[v] = s[z];
s[z] = s[v];

Alla fine sia s[v] che s[z] avranno lo stesso valore (s[z]). Quindi


char *tmp;
...
tmp = s[v];
s[v] = s[z];
s[z] = tmp;


3. La strcmp(s1,s2) restituisce un numero < 0 se s1 e minore di s2, >0 se s1 maggiore di s2, 0 se sono uguali. Di conseguenza non ha senso fare il confronto con +/-1


if(c > 0){
...
}
if(c < 0){
...
}


4. Non serve verificare se una stringa minore E maggiore dell'altra. Ti basta solo un if(c ... 0). Se metti la condizione c < 0 ordinerai l'array in modo crescente. Con c > 0 decrescente

jac
24-02-2017, 12:35
Guarda non so come ringraziarti, finalmente ne sono venuto a capo dopo giorni.
Se a qualcuno dovesse servire il codice e' questo:


#include<stdio.h>#include<stdlib.h>
int main(void)
{
char *tmp;//l'elemento di appoggio è necessario altrimenti tutti i nomi si sarebbero resi uguali
int x=4,v,z,d=0,c;
char *s[x];
s[0]="zucca";
s[1]="luca";
s[2]="ciccio";
s[3]="marco";
{
{
for(v=1; v<4; v++)
{
for(z=0; z<3; z++)
{
c=strcmp(s[v],s[z]);
{
if(c>0)
{//d++; //il contatore mi è servito per controllare se
tmp=s[v]; //il programma entrava effettivamente nel
s[v]=s[z];//ciclo dentro l'if per effettuare le
s[z]=tmp; //sostituzioni
}
}
}
}
}
for(z=0; z<4; z++)
{
printf("%s\n",s[z]);
}
//printf("%d\n", d);
}
}



:ciauz:
P.S. inoltre grazie a leleFT per aver modificato in una maniera piu comprensibile il mio messaggio iniziale

Loading