Repository 32bit  Forum
Repository 64bit  Wiki

ordinatore in c (sempre files uffi) [RISOLTO]

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.

ordinatore in c (sempre files uffi) [RISOLTO]

Messaggioda Blallo » mer lug 01, 2009 21:41

Codice: Seleziona tutto
#include <stdlib.h>
#include <stdio.h>
#define MAXLN 80

int main()
{
   FILE *fp, *fp2, *fpOUT;
   char str1[MAXLN], str2[MAXLN], str3[MAXLN];
   int a, b;
   printf("Inserire nome primo file:");
   scanf("%s", &str1);
   if((fp=fopen(str1,"r"))==NULL)
   {
      fprintf(stderr,"Errore apertura file");
      return EXIT_FAILURE;
   }
   printf("Inserire nome secondo file:");
   scanf("%s", &str2);
   if((fp2=fopen(str2,"r"))==NULL)
   {
      fprintf(stderr,"Errore apertura file");
      return EXIT_FAILURE;
   }
   printf("Inserire nome file output:");
   scanf("%s", &str3);
   if((fpOUT=fopen(str3,"w"))==NULL)
   {
      fprintf(stderr,"Errore creazione file");
      return EXIT_FAILURE;
   }

   while(((fscanf(fp, "%d", &a))!=EOF) && ((fscanf(fp2,"%d", &b))!=EOF)) /*termina se uno o tutti e due finiscono*/
   {
      if(a>=b)
         fprintf(fpOUT,"%d %d ",a, b);
      else if(b>a)
         fprintf(fpOUT,"%d %d ",b, a);
   }

   while((fscanf(fp,"%d",&a))!=EOF)/*se fp è finito, non esegue nulla*/
      fprintf(fpOUT,"%d ",a);
   while((fscanf(fp2,"%d",&b))!=EOF)
      fprintf(fpOUT,"%d ",b);

   fclose(fp);
   fclose(fp2);
   fclose(fpOUT);
   return EXIT_SUCCESS;
}

questo programma dovrebbe ordinare i numeri di 2 file in un terzo file in ordine crescente
i 2 file di inizio sono già ordinati
ma mette numeri di troppo!
soluzioni?grazie mille :D
Ultima modifica di Blallo il gio lug 02, 2009 20:52, modificato 1 volta in totale.
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3212
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: ordinatore in c (sempre files uffi)

Messaggioda ulisse89 » gio lug 02, 2009 7:22

Da quello che ho visto, quello che tu fai è confrontare a due a due i numeri nei due file e semplicemente stampi i due numeri ordinati. Non sono ordinati alla fine quelli nel file di output, ma a coppie di due sono ordinati. E' questo che vuoi fare? Se è questo lo hai fatto bene, se non che nell' else if del while dovresti mettere (b<a) e non maggiore. Se non è questo spiega meglio che vedo se ti so aiutare con le mie ridotte conoscenze.
Avatar utente
ulisse89
Packager
Packager
 
Messaggi: 644
Iscritto il: sab gen 17, 2009 12:53
Località: Bologna
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce

Re: ordinatore in c (sempre files uffi)

Messaggioda Blallo » gio lug 02, 2009 9:39

no no...nel file di out devono andare i numeri sia del primo che del secondo file ordinati in modo crescente...senza l'ausilio di vettori o algortitmi di ordinamento...quindi tutto gira sull'ordine con cui fprintf stampa sul file...nel file di in sono già ordinati crescenti a loro volta
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3212
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: ordinatore in c (sempre files uffi)

Messaggioda raffaele181188 » gio lug 02, 2009 10:19

Puoi fare un esempio dell'input e dell'output del tipo
FileA
1
3
5
7
9

FileB
6
8
10
12
14

FileRisultato
??
??
??
Avatar utente
raffaele181188
Packager
Packager
 
Messaggi: 789
Iscritto il: ven set 07, 2007 20:40
Località: DearSkin (FG)
Nome Cognome: Raffaele
Slackware: current
Kernel: 2.6.29.6
Desktop: KDE 4.3
Distribuzione: Ubuntu

Re: ordinatore in c (sempre files uffi)

Messaggioda ulisse89 » gio lug 02, 2009 10:57

Ok ora credo di aver capito. se non puoi appoggiarti su vettori potresti fare così. Confronti a due a due e stampi di volta in volta il più piccolo, non entrambi. Poi non fai la fscanf in tutti e due i file ogni volta ma solo in quello dove c'era il numero più piccolo appena stampato.
Può darsi che nel codice ci siano dei piccoli errori di compilazione ma nel complesso dovrebbe andare.
Codice: Seleziona tutto
#include <stdlib.h>
#include <stdio.h>
#define MAXLN 80

int main()
{
   FILE *fp, *fp2, *fpOUT;
   char str1[MAXLN], str2[MAXLN], str3[MAXLN];
   int a, b;
   printf("Inserire nome primo file:");
   scanf("%s", &str1);
   if((fp=fopen(str1,"r"))==NULL)
   {
      fprintf(stderr,"Errore apertura file");
      return EXIT_FAILURE;
   }
   printf("Inserire nome secondo file:");
   scanf("%s", &str2);
   if((fp2=fopen(str2,"r"))==NULL)
   {
      fprintf(stderr,"Errore apertura file");
      return EXIT_FAILURE;
   }
   printf("Inserire nome file output:");
   scanf("%s", &str3);
   if((fpOUT=fopen(str3,"w"))==NULL)
   {
      fprintf(stderr,"Errore creazione file");
      return EXIT_FAILURE;
   }

   int i = fscanf(fp, "%d", &a);
   int e = fscanf(fp2,"%d", &b);
   while(i != EOF && e != EOF) /*termina se uno o tutti e due finiscono*/
   {
      if(a<=b)
        {
               fprintf(fpOUT,"%d",a);
               int i =  fscanf(fp, "%d", &a);
        }
      else if(a > b)
        {
              fprintf(fpOUT,"%d ",b);
              e = fscanf(fp2,"%d", &b):
        }
   }

   if(e == EOF)
  {
     while((fscanf(fp,"%d",&a))!=EOF)/*se fp è finito, non esegue nulla*/
           fprintf(fpOUT,"%d ",a);
  }
  if(i == EOF)
  {
      while((fscanf(fp2,"%d",&b))!=EOF)
          fprintf(fpOUT,"%d ",b);
  }

   fclose(fp);
   fclose(fp2);
   fclose(fpOUT);
   return EXIT_SUCCESS;
}
Ultima modifica di ulisse89 il gio lug 02, 2009 19:45, modificato 1 volta in totale.
Avatar utente
ulisse89
Packager
Packager
 
Messaggi: 644
Iscritto il: sab gen 17, 2009 12:53
Località: Bologna
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce

Re: ordinatore in c (sempre files uffi)

Messaggioda Blallo » gio lug 02, 2009 12:48

forse ho capito come dici...praticamente mi legge i primi di ogni file, e avanza poi solo nel file che ha il numero più piccolo...termina fino a che uno dei file è finito e poi mi finisce il resto giusto?
Io sono il detective Arsenio Magret, e porto sempre la camicia TATUATA!
Avatar utente
Blallo
Packager
Packager
 
Messaggi: 3212
Iscritto il: ven ott 12, 2007 10:37
Località: Torino / Torremaggiore (FG)
Nome Cognome: Savino Liguori
Slackware: 14.1 / 12.2
Kernel: 3.12.2-ck
Desktop: Openbox

Re: ordinatore in c (sempre files uffi)

Messaggioda ulisse89 » gio lug 02, 2009 13:27

Proprio così. Secondo me funziona.
Avatar utente
ulisse89
Packager
Packager
 
Messaggi: 644
Iscritto il: sab gen 17, 2009 12:53
Località: Bologna
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce

Re: ordinatore in c (sempre files uffi)

Messaggioda Mario Vanoni » gio lug 02, 2009 13:52

Umile domanda, perche' non usi semplicemente

sort -n -o FileC FileA FileB
se vuoi mantenere doppioni
sort -n -u -o FileC FileA FileB
se non vuoi doppioni
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: ordinatore in c (sempre files uffi)

Messaggioda ulisse89 » gio lug 02, 2009 14:41

Mario Vanoni ha scritto:Umile domanda, perche' non usi semplicemente

sort -n -o FileC FileA FileB
se vuoi mantenere doppioni
sort -n -u -o FileC FileA FileB
se non vuoi doppioni

Sort è un comando della shell, mentre lui credo debba farlo in C.
Avatar utente
ulisse89
Packager
Packager
 
Messaggi: 644
Iscritto il: sab gen 17, 2009 12:53
Località: Bologna
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce

Re: ordinatore in c (sempre files uffi)

Messaggioda Mario Vanoni » gio lug 02, 2009 14:56

ulisse89 ha scritto:
Mario Vanoni ha scritto:Umile domanda, perche' non usi semplicemente

sort -n -o FileC FileA FileB
se vuoi mantenere doppioni
sort -n -u -o FileC FileA FileB
se non vuoi doppioni

Sort è un comando della shell, mentre lui credo debba farlo in C.


Reinventare la ruota?

Il codice di sort(1) e` GPL'ed.
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: ordinatore in c (sempre files uffi)

Messaggioda JohnnyMnemonic » gio lug 02, 2009 15:11

1) Se all'università fai un corso di programmazione e devi imparare il C
2) Se per motivi tuoi vuoi imparare il C
3) Se nel titolo del thread leggi "ordinatore in c"

io penso che voglia impararlo a fare in C...
Avatar utente
JohnnyMnemonic
Staff
Staff
 
Messaggi: 2732
Iscritto il: sab set 04, 2004 23:00
Località: Bologna
Nome Cognome: Giuseppe Palmiotto
Slackware: 14.0
Kernel: 3.5.5-thanatos

Re: ordinatore in c (sempre files uffi)

Messaggioda Mario Vanoni » gio lug 02, 2009 16:18

JohnnyMnemonic ha scritto:1) Se all'università fai un corso di programmazione e devi imparare il C
2) Se per motivi tuoi vuoi imparare il C
3) Se nel titolo del thread leggi "ordinatore in c"

io penso che voglia impararlo a fare in C...


E` vecchia usanza UNIX/C di riciclare quello gia creato!
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Re: ordinatore in c (sempre files uffi)

Messaggioda conraid » gio lug 02, 2009 16:27

Non so se lui cerchi un "sort" o altro, ma sort non è un programma della shell, ma fa parte delle coreutils ed è scritto in C
http://www.gnu.org/software/coreutils/
Magari trova spunti
Avatar utente
conraid
Staff
Staff
 
Messaggi: 11987
Iscritto il: mer lug 13, 2005 23:00
Località: Livorno
Nome Cognome: Corrado Franco
Slackware: current

Re: ordinatore in c (sempre files uffi)

Messaggioda JohnnyMnemonic » gio lug 02, 2009 16:53

Mario Vanoni ha scritto:
JohnnyMnemonic ha scritto:1) Se all'università fai un corso di programmazione e devi imparare il C
2) Se per motivi tuoi vuoi imparare il C
3) Se nel titolo del thread leggi "ordinatore in c"

io penso che voglia impararlo a fare in C...


E` vecchia usanza UNIX/C di riciclare quello gia creato!


E a casa mia si usano le bucce di grana bollite nel minestrone, però se qualcuno chiede la soluzione a un problema in una certa via perchè cambiare le carte in tavola?
Avatar utente
JohnnyMnemonic
Staff
Staff
 
Messaggi: 2732
Iscritto il: sab set 04, 2004 23:00
Località: Bologna
Nome Cognome: Giuseppe Palmiotto
Slackware: 14.0
Kernel: 3.5.5-thanatos

Re: ordinatore in c (sempre files uffi)

Messaggioda Mario Vanoni » gio lug 02, 2009 19:26

JohnnyMnemonic ha scritto:
Mario Vanoni ha scritto:
JohnnyMnemonic ha scritto:1) Se all'università fai un corso di programmazione e devi imparare il C
2) Se per motivi tuoi vuoi imparare il C
3) Se nel titolo del thread leggi "ordinatore in c"

io penso che voglia impararlo a fare in C...


E` vecchia usanza UNIX/C di riciclare quello gia creato!


E a casa mia si usano le bucce di grana bollite nel minestrone, però se qualcuno chiede la soluzione a un problema in una certa via perchè cambiare le carte in tavola?


E a casa mia si usano le bucce di grana bollite nel minestrone == riciclaggio codice C esistente e funzionante.
Mario Vanoni
Iper Master
Iper Master
 
Messaggi: 3174
Iscritto il: lun set 03, 2007 20:20
Località: Cuasso al Monte (VA)
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey

Prossimo

Torna a Programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti