PDA

View Full Version : Niubbo con il linguaggio c cerca aiuto per una funzione


Dylan il drago
18-06-2003, 11:06
allora io ho da svolgere questo esercizio, il mio problema non consiste nell'ordinamento che sono riuscito a fare ma nella funzione leggi
vettore stringhe... l'esercizio è questo...


Esercizio 6: Ordinamento di stringhe

Dato un array a[0..n-1] di stringhe delle quali non sia nota a priori la lunghezza, procedere al suo ordinamento lessicografico utilizzando un opportuno adattamento dell'algoritmo SelectionSort (vedi esercizio 1). Nell'adattare SelectionSort si usi la funzione di libreria:

int strcmp(char s[], char t[])

se s < t restituisce un valore < 0;

se s == t restituisce 0

se s > t restituisce un valore > 0

L'array di stringhe deve essere allocato dinamicamente e la sua lunghezza n deve essere chiesta all'utente. Gli elementi del vettore sono puntatori a char; le stringhe cui questi puntatori si riferiscono devono essere lette da tastiera ed allocate dinamicamente in modo che contengano ciascuna il minimo numero di.

Si realizzino quindi le funzioni:

void leggi_vettore_stringhe(char *a[], int n)

Utilizza un array statico di caratteri buffer per leggere ciascuna stringa dall’input. Per ogni locazione dell’array di stringhe a(da 0 a n-1): legge dall’input la stringa corrente in buffer ne calcola la lunghezza, alloca dinamicamente un puntatore ad un’area della dimensione esatta per contenere la stringa in buffer, copia in questa area la stringa letta in buffer e assegna tale puntatore come valore della locazione corrente dell’array a.

void ordina(char* a[], int limite)

ordina in modo lessicografico l'array stringhe a tra le posizioni 0 e limite -1, mediante SelectionSort


qualche anima pia potrebbe aiutarmi a completare questo esercizio? sono agli inizi e mi trovo in difficoltà:(

VegetaSSJ5
18-06-2003, 11:52
cosa intendi per ordinamento lessicografico?

Dylan il drago
18-06-2003, 12:02
dal a alla z


io ho fatto questo ragionamento... dato che devo usare il selection sort e non un merge io pensavo di trovare la stringa più piccola e metterla per prima nel vettore e andare avanti così.. per trovare la stringa più piccola ho fatto questa funzione dite che funge?

int minimo(char *a[], int start, int limite)
{
char min[100];
copia(min,*a[start]);
char stringa1[100];
int i,j;
copia(stringa1,*a[start+1];
while( start< limite)
{
j=strcmp(min,stringa1);
if (j>0)
{
copia(min,*a[start]);
i=start;

}
start++;
}
return i;
}
void copia(char *s, char *t)
{
while((*s = *t)!='\0')
{
s++;
t++;
}
}

Dylan il drago
18-06-2003, 13:32
il programma l'ho fatto così sapreste dirmi perchè dopo che inserisco la grandezza del vettore e inserisco la prima stringa mi si blocca ed esce?

#include<stdio.h>
#include<stdlib.h>

int minimo(char *a[], int start, int limite)
{
char min[100];
copia(min,*a[start]);
char stringa1[100];
long i,j;
copia(stringa1,*a[start]);
while( start< limite)
{
j=strcmp(min,stringa1);
if (j>0)
{
copia(min,*a[start]);
i=start;

}
start++;
}
return i;
}
int copia(char *s, char *t)
{
while((*s = *t)!='\0')
{
s++;
t++;
}
return 1;
}

void ordina(char *a[], int limite)
{
int d,i=0,m=0,j;
char temp[100];
while (i<limite)
{
d=minimo(a,i,limite);
copia(temp,a[i]);
copia(a[i],a[d]);
copia(a[d],temp);
i++;
}
for(j=0;j<limite;j++) printf("%c ", *a[j]);
printf("\n");
}

void leggi_vettore_stringhe(char *a[], int n)
{
int c;
char buff[20];
for(c=0;c<n;c++)
{
printf("Inserisci stringa %d",c+1);
gets(buff); //legge la stringa e la mette nel buffer
*a[c]=strdup(buff); //dupplica la stringa generando un puntantore a una strnga ottimizzata
}

}

int main (void)
{


int g;
printf("inserire la grandezza del vettore");
scanf("%d",&g);
char *pd[g];
leggi_vettore_stringhe(pd,g);
ordina (pd,g);
getch();
return 1;
}

lombardp
18-06-2003, 14:14
A occhio vedo che queste cose non mi tornano:

copia(min,*a[start]);


perché copia vuole due puntatori quindi presumo:

copia(min,a[start]);


E poi:

*a[c]=strdup(buff);

sempre per un motivo analogo presumo sia:

a[c]=strdup(buff);

Dylan il drago
18-06-2003, 15:05
Originally posted by "lombardp"

A occhio vedo che queste cose non mi tornano:

copia(min,*a[start]);


perché copia vuole due puntatori quindi presumo:

copia(min,a[start]);


E poi:

*a[c]=strdup(buff);

sempre per un motivo analogo presumo sia:

a[c]=strdup(buff);

grazie a te ho trovato il primo errore... ora mi fa inserire le stringhe però poi mi si blocca appena scrivo l'ultima...
e mi da questo errore
58 [Warning] assignment makes pointer from integer without a cast
uff grazie cmq :)

Dylan il drago
18-06-2003, 15:18
Originally posted by "Dylan il drago"


void leggi_vettore_stringhe(char *a[], int n)
{
int c;
char buff[20];
for(c=0;c<n;c++)
{
printf("Inserisci stringa %d",c+1);
gets(buff); //legge la stringa e la mette nel buffer
*a[c]=strdup(buff); //dupplica la stringa generando un puntantore a una strnga ottimizzata
}

}

inoltre questo pezzo mi fa inserire la stringa ma la prima non me la fa inserire passa subito alla seconda:( mida inserire stringa1 e non facendomi schiacciare niente passa alla seconda richiesta....

Dylan il drago
18-06-2003, 15:23
void ordina(char *a[], int limite)
{
int d,i=0,m=0,j;
char temp[100];
while (i<limite)
{
//d=minimo(a,i,limite);
copia(temp,a[i]);
copia(a[i],a[d]);
copia(a[d],temp);
i++;
}
for(j=0;j<limite;j++) printf("%c ", *a[j]);
printf("\n");
}


ora mi si blocca dopo l'istruzione qui sopra con le due barre... non mi fa il copia sotto.... sapete aioutarmi? vi prego perchè devo consegnarlo entro stasera questo programma:(

lombardp
18-06-2003, 16:04
Al posto di COPIA, perché non usare STRCPY ?

E usare SCANF al posto di GETS ?

Dylan il drago
18-06-2003, 16:12
Originally posted by "lombardp"

Al posto di COPIA, perché non usare STRCPY ?

E usare SCANF al posto di GETS ?

ma scanf va meglio?

copia perchè il prof vuole che strcpy sia fatto da noi!!

inoltre quel maledetto leggi_vettore_stringa non mi fa leggere la prima stringa ma passa subito alla seconda.... perchè?

cionci
18-06-2003, 16:48
copia non va bene...

Se *s è più corta di *t vai a scrivere fuori dalla lunghezza assegnata ad *s...

Una cosa così potrebbe andare bene:

int copia(char **s, char *t)
{
if(*s) free(*s);
*s=(char *)strdup(t);
return strlen(*s);
}

Per richiamarla:

char *min = NULL;
char *stringa1 = NULL; //stringa1 non ti serve a niente
long i = start,j; //nota anche qui un'errore...i non l'avevi inizializzato...
copia(&min,a[start++]);
while( start< limite)
{
j=strcmp(min,a[start]); //devi fare il confronto con a[start] non con stringa1

Inoltre quando trovi il minimo devi fare in questo modo:

if((d=minimo(a,i,limite)) > i)
{
copia(&temp,a[i]);
copia(&a[i],a[d]);
copia(&a[d],temp);
}

Altrimenti ti sbirilla in cui a[i] sia la stringa minima...
Finito il ciclo devi deallocare sia min

Dylan il drago
18-06-2003, 16:57
scusa quando hai fatto il copia perchè con int? cosa restituisce? eppoi nell'ultimo codice perchè maggiore di i?

miseria mi accorgo di essere proprio incapace...:(

ah e poi un'altra cosa:

ho fatto come mi hai consigliato ... però la funzione leggi_stringa_vettore mi legge ancora la seconda stringa saltando la prima...

cionci
18-06-2003, 17:05
Ah...mi ero scordato...metti in alto:

#include <string.h> così ti toglie il warning su strdup...anche togliendo il cast (char *)...

Restituisce strlen della stringa copiata...cioè il numero di caratteri copiati... Anche tu l'avevi messo int e gli facevi ritornare sempre 1...

Perchè nel cas che d sia uguale a i non deve fare lo scambio...si scambierebbe con se stesso...e copia(&a[i],a[d]); potrebbe dare seri problemi !!!

cionci
18-06-2003, 17:08
Originally posted by "Dylan il drago"

mi legge ancora la seconda stringa saltando la prima...

void leggi_vettore_stringhe(char *a[], int n)
{
int c;
char buff[20];
fflush(stdin);

Resta l'invio della prima scanf nello standard input...con fflush svuti lo standard input...

Dylan il drago
18-06-2003, 17:08
Originally posted by "cionci"

Ah...mi ero scordato...metti in alto:

#include <string.h> così ti toglie il warning su strdup...anche togliendo il cast (char *)...

Restituisce strlen della stringa copiata...cioè il numero di caratteri copiati... Anche tu l'avevi messo int e gli facevi ritornare sempre 1...

Perchè nel cas che d sia uguale a i non deve fare lo scambio...si scambierebbe con se stesso...e copia(&a[i],a[d]); potrebbe dare seri problemi !!!
grazie mille:)
ora devo capire perchè leggi_vettore_stringa non mi funge bene.. non riesco a capire...

Dylan il drago
18-06-2003, 21:24
up per favore help entro stanotte alle 11 e 59 devo consegnarli via mail al professore:(

cionci
19-06-2003, 08:34
Originally posted by "Dylan il drago"

up per favore help entro stanotte alle 11 e 59 devo consegnarli via mail al professore:(
Se vuoi che te lo faccia dimmelo... Perchè leggi_vettore_stringa non funziona bene te l'ho scritto sopra...