|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Aug 2002
Città: Cherasco
Messaggi: 8885
|
Niubbo con il linguaggio c cerca aiuto per una funzione
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à
__________________
Trattative concluse positivamente:gV, RuBiNo, puddu, EBJ, syscall ,damy0489, phantom101, AleAme, Marco166,Kardo, capitanofindus,Andrea87,athlon900,]Rik`[,Manoel,Madelui,Bestia666,brutal,ReaToMe,wolfnyght,Marilyn 52,oldfield e molti altri |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Sep 2002
Città: Celano (AQ) Segno_Zodiacale: Leone Ascendente: Cammello Segni_Particolari: Quello
Messaggi: 9571
|
cosa intendi per ordinamento lessicografico?
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Aug 2002
Città: Cherasco
Messaggi: 8885
|
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++; } }
__________________
Trattative concluse positivamente:gV, RuBiNo, puddu, EBJ, syscall ,damy0489, phantom101, AleAme, Marco166,Kardo, capitanofindus,Andrea87,athlon900,]Rik`[,Manoel,Madelui,Bestia666,brutal,ReaToMe,wolfnyght,Marilyn 52,oldfield e molti altri |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Aug 2002
Città: Cherasco
Messaggi: 8885
|
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; }
__________________
Trattative concluse positivamente:gV, RuBiNo, puddu, EBJ, syscall ,damy0489, phantom101, AleAme, Marco166,Kardo, capitanofindus,Andrea87,athlon900,]Rik`[,Manoel,Madelui,Bestia666,brutal,ReaToMe,wolfnyght,Marilyn 52,oldfield e molti altri |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Firenze
Messaggi: 630
|
A occhio vedo che queste cose non mi tornano:
Codice:
copia(min,*a[start]); Codice:
copia(min,a[start]); Codice:
*a[c]=strdup(buff); Codice:
a[c]=strdup(buff);
__________________
---> Lombardp CSS Certified Expert (Master Level) at Experts-Exchange Proud user of LITHIUM forum : CPU technology Webmaster of SEVEN-SEGMENTS : Elettronica per modellismo |
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Aug 2002
Città: Cherasco
Messaggi: 8885
|
Quote:
e mi da questo errore 58 [Warning] assignment makes pointer from integer without a cast uff grazie cmq
__________________
Trattative concluse positivamente:gV, RuBiNo, puddu, EBJ, syscall ,damy0489, phantom101, AleAme, Marco166,Kardo, capitanofindus,Andrea87,athlon900,]Rik`[,Manoel,Madelui,Bestia666,brutal,ReaToMe,wolfnyght,Marilyn 52,oldfield e molti altri |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Aug 2002
Città: Cherasco
Messaggi: 8885
|
Quote:
__________________
Trattative concluse positivamente:gV, RuBiNo, puddu, EBJ, syscall ,damy0489, phantom101, AleAme, Marco166,Kardo, capitanofindus,Andrea87,athlon900,]Rik`[,Manoel,Madelui,Bestia666,brutal,ReaToMe,wolfnyght,Marilyn 52,oldfield e molti altri |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Aug 2002
Città: Cherasco
Messaggi: 8885
|
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
__________________
Trattative concluse positivamente:gV, RuBiNo, puddu, EBJ, syscall ,damy0489, phantom101, AleAme, Marco166,Kardo, capitanofindus,Andrea87,athlon900,]Rik`[,Manoel,Madelui,Bestia666,brutal,ReaToMe,wolfnyght,Marilyn 52,oldfield e molti altri |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Firenze
Messaggi: 630
|
Al posto di COPIA, perché non usare STRCPY ?
E usare SCANF al posto di GETS ?
__________________
---> Lombardp CSS Certified Expert (Master Level) at Experts-Exchange Proud user of LITHIUM forum : CPU technology Webmaster of SEVEN-SEGMENTS : Elettronica per modellismo |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Aug 2002
Città: Cherasco
Messaggi: 8885
|
Quote:
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è?
__________________
Trattative concluse positivamente:gV, RuBiNo, puddu, EBJ, syscall ,damy0489, phantom101, AleAme, Marco166,Kardo, capitanofindus,Andrea87,athlon900,]Rik`[,Manoel,Madelui,Bestia666,brutal,ReaToMe,wolfnyght,Marilyn 52,oldfield e molti altri |
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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: Codice:
int copia(char **s, char *t)
{
if(*s) free(*s);
*s=(char *)strdup(t);
return strlen(*s);
}
Codice:
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
Codice:
if((d=minimo(a,i,limite)) > i)
{
copia(&temp,a[i]);
copia(&a[i],a[d]);
copia(&a[d],temp);
}
Finito il ciclo devi deallocare sia min |
|
|
|
|
|
#12 |
|
Senior Member
Iscritto dal: Aug 2002
Città: Cherasco
Messaggi: 8885
|
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...
__________________
Trattative concluse positivamente:gV, RuBiNo, puddu, EBJ, syscall ,damy0489, phantom101, AleAme, Marco166,Kardo, capitanofindus,Andrea87,athlon900,]Rik`[,Manoel,Madelui,Bestia666,brutal,ReaToMe,wolfnyght,Marilyn 52,oldfield e molti altri |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
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 !!! |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
Codice:
void leggi_vettore_stringhe(char *a[], int n)
{
int c;
char buff[20];
fflush(stdin);
|
|
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: Aug 2002
Città: Cherasco
Messaggi: 8885
|
Quote:
ora devo capire perchè leggi_vettore_stringa non mi funge bene.. non riesco a capire...
__________________
Trattative concluse positivamente:gV, RuBiNo, puddu, EBJ, syscall ,damy0489, phantom101, AleAme, Marco166,Kardo, capitanofindus,Andrea87,athlon900,]Rik`[,Manoel,Madelui,Bestia666,brutal,ReaToMe,wolfnyght,Marilyn 52,oldfield e molti altri |
|
|
|
|
|
|
#16 |
|
Senior Member
Iscritto dal: Aug 2002
Città: Cherasco
Messaggi: 8885
|
up per favore help entro stanotte alle 11 e 59 devo consegnarli via mail al professore
__________________
Trattative concluse positivamente:gV, RuBiNo, puddu, EBJ, syscall ,damy0489, phantom101, AleAme, Marco166,Kardo, capitanofindus,Andrea87,athlon900,]Rik`[,Manoel,Madelui,Bestia666,brutal,ReaToMe,wolfnyght,Marilyn 52,oldfield e molti altri |
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 19:17.



















