Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C] merge sort problema strcmp e allocazione dinamica

    Ciao a tutti,
    ho un problema con un programma. Il comando che mi è stato dato dice:
    "realizzare la fusione (merge) salvando su Dati.txt di volta in volta il dato minore tra il prossimo di Dati1 e il prossimo di Dati2. Nel file Dati, accanto a ogni dato va riportato anche il nome della centralina da cui e' stato rilevato, ricavato dal nome riportato in testa ai file Dati1.txt e Dati2.txt."

    Ho scritto una bozza di codice che però ad un certo punto si impalla. Credo che i problemi siano due:
    - non c'è ancora traccia di allocazione dinamica nei miei vettori
    - la strcmp sbaglia ad effettuare il confronto tra date (ad es. 30/01/2010 non lo interpreta come minore di 01/02/2010).

    Il mio listato è questo:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <stddef.h>
    #include <malloc.h>
    int main()
    {
    int risultato_confronto; //variabile per risultato del confronto delle date
    int i=0, j=0, k=0;      //contatori per scorrere Dati1.txt, Dati2.txt e Dati.txt
    int sizemax;
    char nome1[20];
    char nome2[20];
    char nome3[20];
    char nome4[20];
    
    struct tipo_dato            //creo struttura per immagazzinare i dati
    {
        double temp;
        char data[10];
    };
    struct tipo_dato centrale1[365];    //dichiaro struttura centrale1 per Dati1.txt
    struct tipo_dato centrale2[365];     //dichiaro struttura centrale2 per Dati2.txt
    FILE* f= NULL;      //puntatore al primo file
    FILE* f2 = NULL;    //puntatore al secondo file
    FILE* f3 = NULL;    //puntatore al terzo file
    f=fopen("Dati1.txt","r");
    f2=fopen("Dati2.txt","r");
    if (f==NULL || f2==NULL)
    {
        printf ("Errore nell'apertura dei file di origine.");
    }
    else
    {
        fscanf(f,"%s %s", nome1, nome2);
        fscanf(f2,"%s %s", nome3, nome4);
        //printf("%s %s\n", int2.nome1, int2.nome2);
        //fscanf(f,"%lf %s", &centrale1.temp, centrale1.data);
        //printf("%lf %s", centrale1.temp, centrale1.data);
        while (!(feof(f)))
        {
           fscanf(f,"%lf %s", &centrale1[i].temp, centrale1[i].data);
           printf("temp1: %lf data1: %s\n", centrale1[i].temp, centrale1[i].data);
           i++;
        }
        fclose(f);
        while (!(feof(f2)))
        {
            fscanf(f2,"%lf %s", &centrale2[j].temp, centrale2[j].data);
            j++;
        }
        fclose(f2);
        sizemax=i+j;
        f=fopen("Dati1.txt","r");
        f2=fopen("Dati2.txt","r");
        f3=fopen("Dati.txt","w");
        printf ("righe di dati1: %d\n", i);
        printf ("righe di dati2: %d\n", j);
        i=0;
        j=0;
        for (k=0;k<=(sizemax);k++)
        {
    
            risultato_confronto=strcmp(centrale1[i].data,centrale2[j].data);
            if (risultato_confronto==0)
            {
                if (centrale1[i].temp>=centrale2[j].temp)
                {
                    printf("i: %d j: %d %d %lf %s\n", i, j, k, centrale2[j].temp, centrale2[j].data);
                    fprintf(f3,"path1-> i: %d j: %d k: %d %lf %s %s %s scarto: %lf %s\n",i, j, k, centrale2[j].temp, centrale2[j].data, nome3, nome4, centrale1[i].temp, centrale1[i].data);
                    j++;
                }
                else
                {
                    printf("i: %d j: %d %d %lf %s\n", i, j, k, centrale1[i].temp, centrale1[i].data);
                    fprintf(f3,"path2-> i: %d j: %d k: %d %lf %s %s %s scarto: %lf %s\n",i ,j,  k, centrale1[i].temp, centrale1[i].data, nome1, nome2, centrale2[j].temp, centrale2[j].data);
                    i++;
                }
            }
            else
            {
                if (risultato_confronto>0)
                {
                    printf("i: %d j: %d %d %lf %s\n ", i, j, k, centrale2[j].temp, centrale2[j].data);
                    fprintf(f3,"path3-> i: %d j: %d k: %d %lf %s %s %s scarto: %lf %s\n", i, j, k, centrale2[j].temp, centrale2[j].data, nome3, nome4, centrale1[i].temp, centrale1[i].data);
                    j++;
                }
                else
                {
                    printf("i: %d j: %d %d %lf %s\n", i, j,  k, centrale1[i].temp, centrale1[i].data);
                    fprintf(f3,"path4-> i: %d j: %d k: %d %lf %s %s %s scarto: %lf %s\n", i, j, k, centrale1[i].temp, centrale1[i].data, nome1, nome2, centrale2[j].temp, centrale2[j].data);
                    i++;
                }
            }
        }
        fclose(f2);
        fclose(f);
        fclose(f3);
    }
    return 0;
    }

    Da notare che parte delle printf e delle fprintf sono piene di "miei debug" per cercare di capirci qualcosa.

    Vi ringrazio molto.

    ps. non capisco perchè il mio programma è indentato ma in anteprima di messaggio non lo indenta più :sob

    Daniele
    File allegati File allegati
    Ultima modifica di LeleFT; 30-12-2014 a 13:40 Motivo: Aggiunti i tag CODE

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Non ti serve leggere tutto il file per implementare ciò che ti è stato richiesto. Per confrontare 2 date basta confrontare anno, poi mese, poi giorno.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    Non ti serve leggere tutto il file per implementare ciò che ti è stato richiesto. Per confrontare 2 date basta confrontare anno, poi mese, poi giorno.
    Sì, sì, hai ragione e ci avevo anche pensato. Non riesco però a trattare le stringhe di dati poi, mi spiego:
    ora prelevo con fscanf(f,"%lf %s", &centrale1[i].temp, centrale1[i].data) nel ciclo while ogni temperatura e ogni data.

    Probabilmente è più furbo non popolare due array apposta ma fare il confronto riga per riga sempre nel ciclo while ma a parte questo il grosso problema è la data, trattata come stringa in quanto ha il formato "dd/mm/aaaa".
    Non riesco proprio ad inserire la stringa in una struttura (es. data1.gg, data1.mm, data1.aa e data2.gg....)
    per poi fare qualcosa tipo: if (data1.aa==data2.aa && data1.mm==data2.mm ecc ecc)

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    il metodo più facile è leggere i 3 numeri separati da / dalla scanf
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Cioè? Se ad esempio data1 è uguale "01/01/2010", come faccio ad ottenere tre variabili gg=01 mm=01 e aa=2010?
    Considerando anche che data1 è una stringa mentre gg,mm e aa interi..
    Non so proprio che pesci pigliare AIUTOO!!!

    Daniele

  6. #6
    Credo di aver risolto mediante sscanf

    Ora rimane la questione dell'allocazione dinamica della memoria.
    Provo ad aprire un altro thread per non andare off-topic, anche se è relativo comunque allo stesso listato...

    Daniele

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.