Forum - C/C++
- ordinamento - Pagina 2
pierotofy (Admin )
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
Per fare l'ordinamento ti servirà come prima cosa memorizzare ogni linea del file di input in un array...
Codice sorgente - presumibilmente C/C++
unsigned char *lines[999];
Supponendo ovviamente che il tuo file non contenga più di 999 righe; in caso contrario aumenta quel valore.
Dopodichè quando leggi il file:
Codice sorgente - presumibilmente C/C++
//...
int i = 0; //Questo dichiaralo all'inizio della funzione
while(!feof(fp)){
lines[i++]=fgets(buf, 50 ,fp);
}
//...
In questo modo avrai caricato le righe dal file di input in un array.
Adesso basta richiamare la funzione qsort seguendo le linee guida che trovi nel link che ho postato prima.
Poi mi spieghi come mai apri il file di output ogni volta che viene eseguita un'iterazione per leggere dal file di input?
Ultima modifica effettuata da pierotofy il 21/05/2008 alle 16:42
lorelapo (Ex-Member)
Expert
Messaggi: 355
Iscritto: 28/02/2007
@eddiewrc:l'ignoranza anche nelle semplici cose è più che leggittima, soprattutto in chi si sforza di chiedere e capire.
Ultima modifica effettuata da lorelapo il 23/05/2008 alle 16:01
volley.sil (Normal User)
Rookie
Messaggi: 39
Iscritto: 19/05/2008
Ciao piero..
mi potresti aiutare.
nn so se ricordi quale progetto devo svlgere; dovrei ordinare attraverso il quicksort stringhe ricevute da un file di input(input_list)e stamparle in un file di output(output_list).ho provato ad implementare il tutto.
Non riesco a capire il xkè mi stampa nel file di output solo l'ultima stringa del file.
potresti darci un'occhiata?
Grazie per la disponibilità.
p.s. ti allego il sorgente del progetto e il file di input.
volley.sil (Normal User)
Rookie
Messaggi: 39
Iscritto: 19/05/2008
non riesco ad allegare file te li posto qui:
FILE SORGENTE:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define size 50
int i;
char *stringa;
char lista[50];
char buf[50];
void exchange(int *list, int i, int j); /*funzione che scambia le posizioni all'interno del vettore*/
int partition(int *list, int p, int r); /*funzione che divide il vettore in due blocchi e individua il pivot*/
void quicksort(int *list, int p, int r); /*fuzione ricorsiva per ordinare le stringhe*/
void scrittura_file(char *output_list, char *buf, int n, char *stringa); /*funzione scrittura file: output_list*/
void lettura_file(char *input_list, int *list, int *n); /*funzione lettura file: input_list*/
int main(int argc, const char *argv[])
{
int *list=(int *)malloc(10000000*sizeof(int)), n;
clock_t start, end;
system("cls");
srand(time(NULL));
lettura_file((char *)argv[1],list,&n);
start=clock();
quicksort(list,0,n-1);
end=clock();
printf("\n Tempo impiegato: %g\n",(double)(end-start)/(double)CLOCKS_PER_SEC);
scrittura_file((char *)argv[2], buf ,n, stringa);
system("PAUSE");
return 0;
system("PAUSE");
//close(fp);
return 0;
}
void lettura_file(char *input_list, int *list, int *n)
{
int x,i=0;
FILE *fp;//=fopen("input_list.txt","r");
if((fp=fopen("input_list.txt","r"))==NULL)
{
printf("\nErrore nell'apertura del file\n");
exit(1);
}
else
{
while(!feof(fp))
{
(*n)=i;
printf("%d",*n);
stringa=fgets(buf, 50 ,fp);
// printf("%c",buf);
list[i++]=stringa;
printf("%s",stringa);
}
}
fclose(fp);
}
void scrittura_file(char *output_list, char *buf, int n, char *list)
{
int i;
FILE *fin=fopen("output_list.txt","a");
fputs(buf, fin);
printf("ciao %s",list);
fprintf(fin,"\n");
fclose(fin);
}
int partition(int *list, int p, int r)
{
int i=p, j=r, x, pivot;
x=rand()%(r-p+1)+p;
exchange(list,x,p);
pivot=list[p];
while(i<j)
{
while(j>p && list[j]>pivot) j--;
while(i<r && list<=pivot) i++;
if(i<j) exchange(list,i,j);
}
exchange(list,p,j);
return j;
}
void quicksort(int *list, int p, int r)
{
int q;
if(p<r)
{
q=partition(list,p,r);
quicksort(list,p,q-1);
quicksort(list,q+1,r);
}
}
void exchange(int *list, int i, int j)
{
int tmp=list;
list=list[j];
list[j]=tmp;
}
FILE DI INPUT:
aaaaaaaa
gggggggg
eeeeeeee
ffffffff
bbbbbbbb
Ultima modifica effettuata da volley.sil il 27/05/2008 alle 9:50
volley.sil (Normal User)
Rookie
Messaggi: 39
Iscritto: 19/05/2008
ciao ho provato a implementare il progetto di cui ti avevo parlato ma avviandolo con Dev C++,mi trova alcuni errori.
Potresti darci un'occhiata?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void exchange(char *list, int i, int j) {
int tmp=list;
list=list[j];
list[j]=tmp;
}
int partition(char *list, int *length, int *size) {
int i=(*length), j=(*size), x, pivot;
x=rand()%(*size-*length+1)+*length;
pivot=list[*length];
while(i<j) {
while(j>(*length) && list[j]>pivot) j--;
while(i<(*size) && list<=pivot) i++;
if(i<j) exchange(list,i,j);
}
exchange(list,(int)length,j);
return j;
}
char quicksort(char *list, int *length, int *size) {
int q;
if(length<size) {
(int*)q=partition(list,length,size);
quicksort((char*)list,(int*)length,(int*)(q)-1);
quicksort((char*)list,(int*)(q)+1,(int*)size);
}
return *list;
}
void readsize(int *length, int *size) {
FILE *in=fopen("input_list.txt","r");
int i=0,j=0;
char tmp;
printf("ciao2");
while(fscanf(in,"%c",&tmp)!=EOF && tmp!='\n') j++;
rewind(in);
printf("ciao3");
while(fscanf(in,"%*s\n")!=EOF) i++;
printf("ciao4");
(int)length=i; (int)size=j;
printf("ciao5");
fclose(in);
}
char *readline(FILE *in,int size) {
char *line=(char *)malloc(size*sizeof(char)), tmp;
int i=0;
printf("ciao9");
while(i<size && fscanf(in,"%c",&line)!=EOF) i++;
fscanf(in,"%c",&tmp);
if(tmp!='\n') {
printf("Error: malformed file\n");
return NULL;
}
return line;
}
char **loadlist(int *length, int *size) {
int i;
char **list;
FILE *in=fopen("input_list.txt","r");
readsize(length,size);
list=(char **)malloc((*length)*sizeof(char *));
printf("ciao6");
// for(i=0; i<(*length); i++)
list=readline(in,(int)size);
printf("ciao7");
fclose(in);
return list;
}
void printlist(char *list, int *length, int *size,int n)
{
int i;
FILE *fin=fopen("output_list.txt","a");
printf("ciao10");
for(i=0; i<n; i++)
printf("ciao11");
fprintf(fin,"%c ",&list);
printf("ciao12");
fprintf(fin,"\n");
fclose(fin);
}
int main(int n)
{
system("cls");
char **list;
int length,size;
time_t start, end;
printf("ciao");
list=loadlist((int*)length,(int*)size);
printf("ciao1");
start=clock();
(char*)list=quicksort((char*)list,(int*)length,(int*)size);
end=clock();
printf("\nTempo impiegato: %.2f\n",(double)(end-start)/(double)CLOCKS_PER_SEC);
printlist((char*)list,(int*)length,(int*)size,(int)n);
system("PAUSE");
return 0;
}
volley.sil (Normal User)
Rookie
Messaggi: 39
Iscritto: 19/05/2008
ciao...
sono riuscita a implementare quel progetto di cui ti parlavo ordinare stringhe di caratteri con la procedura quicksort...Ora te lo posto.Xò il compilatore ma si blocca e nn finisce di compilare mi sai dire dove può trovarli l'errore???
dv trovi tutti quei printf ("ciao x")sono solo per capire fino a dv il compilatore non si bloccava...
Grazie
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void exchange(char *list, int *i, int *j)
{
int tmp=list[*i];
list[*i]=list[*j];
printf(" ciao 9ter");
list[*j]=tmp;
}
int partition(char *list, int *length, int *size)
{
int *i,*j;
int x, pivot;
i=length;
j=size;
printf(" %d ",size);
printf(" %d ",length);
x=rand()%((int)size-(int)length+1)+(int)length;
pivot=x;
while(i<j)
{
while(j>length && list[*j]>pivot)
j--;
//while(i<size && list[*i]<=pivot)
//i++;
printf("ciao 9bis");
if(i<j)
{
exchange(list,i,j);
}
}
exchange(list,length,j);
return *j;
}
char quicksort(char *list, int *length, int *size) {
int q;
if(length<size)
{
(int)q=partition(list,length,size);
quicksort((char*)list,(int*)length,(int*)(q)-1);
quicksort((char*)list,(int*)(q)+1,(int*)size);
}
return *list;
}
void readsize(int *length, int *size) {
FILE *in=fopen("input_list.txt","r");
int i=0,j=0;
char tmp;
printf("ciao2");
while(fscanf(in,"%c",&tmp)!=EOF && tmp!='\n') j++;
rewind(in);
printf("ciao3");
while(fscanf(in,"%*s\n")!=EOF) i++;
printf("ciao4");
length=(int*)i; size=(int*)j;
printf(" %d ",length);
printf(" %d ",size);
printf("ciao5");
fclose(in);
}
char *readline(FILE *in,int size) {
char *line=(char *)malloc(size*sizeof(char)), tmp;
int i=0;
printf("ciao9");
while(i<size && fscanf(in,"%c",&line)!=EOF) i++;
fscanf(in,"%c",&tmp);
if(tmp!='\n')
{
printf("Error: malformed file\n");
return NULL;
}
return line;
}
char **loadlist(int *length, int *size) {
int i;
char **list;
FILE *in=fopen("input_list.txt","r");
readsize(length,size);
printf("ciao6");
(char**)list=(char *)malloc(sizeof(char length));
for(i=0; i<&length; i++)
printf(" %d",i);
list=readline(in,(int)size);
fclose(in);
return list;
}
void printlist(char *list, int *length, int *size,int n)
{
int i;
FILE *fin=fopen("output_list.txt","a");
printf("ciao10");
for(i=0; i<n; i++)
printf("ciao11");
fprintf(fin,"%c ",&list);
printf("ciao12");
fprintf(fin,"\n");
fclose(fin);
}
int main(int n)
{
system("cls");
char **list;
int length,size;
time_t start, end;
printf("ciao");
list=loadlist((int*)length,(int*)size);
printf("ciao1");
start=clock();
(char)**list=quicksort((char*)list,(int*)length,(int*)size);
end=clock();
printf("\nTempo impiegato: %.2f\n",(double)(end-start)/(double)CLOCKS_PER_SEC);
printlist((char*)list,(int*)length,(int*)size,(int)n);
system("PAUSE");
return 0;
}
Ti prego dammi una mano è veramente urgente!!!
gantonio (Normal User)
Guru^2
Messaggi: 1532
Iscritto: 09/09/2007
Nella funzione
partition
passi tutto per puntatore. Quindi, al suo interno, devi tenerne conto ...
volley.sil (Normal User)
Rookie
Messaggi: 39
Iscritto: 19/05/2008
cioè in che modo devo tenerne conto???
puoi spiegarti meglio...