Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - ordinamento
Forum - C/C++ - ordinamento - Pagina 2

Pagine: [ 1 2 3 4 5 ] Precedente | Prossimo
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 16:39
Mercoledì, 21/05/2008
Per fare l'ordinamento ti servirà come prima cosa memorizzare ogni linea del file di input in un array...

Codice sorgente - presumibilmente C/C++

  1. 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++

  1. //...
  2. int i = 0; //Questo dichiaralo all'inizio della funzione
  3. while(!feof(fp)){
  4.   lines[i++]=fgets(buf, 50 ,fp);
  5. }
  6. //...



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


Il mio blog: https://piero.dev
PM
Avatar
lorelapo (Ex-Member)
Expert


Messaggi: 355
Iscritto: 28/02/2007

Segnala al moderatore
Postato alle 16:00
Venerdì, 23/05/2008
@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
PM
Avatar
volley.sil (Normal User)
Rookie


Messaggi: 39
Iscritto: 19/05/2008

Segnala al moderatore
Postato alle 9:47
Martedì, 27/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.

PM
Avatar
volley.sil (Normal User)
Rookie


Messaggi: 39
Iscritto: 19/05/2008

Segnala al moderatore
Postato alle 9:47
Martedì, 27/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
PM
Avatar
volley.sil (Normal User)
Rookie


Messaggi: 39
Iscritto: 19/05/2008

Segnala al moderatore
Postato alle 16:18
Giovedì, 29/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;
      
}


PM
Avatar
volley.sil (Normal User)
Rookie


Messaggi: 39
Iscritto: 19/05/2008

Segnala al moderatore
Postato alle 11:22
Martedì, 10/06/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!!!

PM
Avatar
gantonio (Normal User)
Guru^2


Messaggi: 1532
Iscritto: 09/09/2007

Segnala al moderatore
Postato alle 13:42
Martedì, 10/06/2008
Nella funzione

partition

passi tutto per puntatore. Quindi, al suo interno, devi tenerne conto ...

PM
Avatar
volley.sil (Normal User)
Rookie


Messaggi: 39
Iscritto: 19/05/2008

Segnala al moderatore
Postato alle 15:02
Martedì, 10/06/2008
cioè in che modo devo tenerne conto???
puoi spiegarti meglio...

PM
Pagine: [ 1 2 3 4 5 ] Precedente | Prossimo