Pagina 1 di 2

ordinatore in c (sempre files uffi) [RISOLTO]

Inviato: mer 1 lug 2009, 22:41
da Blallo

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

Re: ordinatore in c (sempre files uffi)

Inviato: gio 2 lug 2009, 8:22
da ulisse89
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.

Re: ordinatore in c (sempre files uffi)

Inviato: gio 2 lug 2009, 10:39
da Blallo
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

Re: ordinatore in c (sempre files uffi)

Inviato: gio 2 lug 2009, 11:19
da raffaele181188
Puoi fare un esempio dell'input e dell'output del tipo
FileA
1
3
5
7
9

FileB
6
8
10
12
14

FileRisultato
??
??
??

Re: ordinatore in c (sempre files uffi)

Inviato: gio 2 lug 2009, 11:57
da ulisse89
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;
}

Re: ordinatore in c (sempre files uffi)

Inviato: gio 2 lug 2009, 13:48
da Blallo
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?

Re: ordinatore in c (sempre files uffi)

Inviato: gio 2 lug 2009, 14:27
da ulisse89
Proprio così. Secondo me funziona.

Re: ordinatore in c (sempre files uffi)

Inviato: gio 2 lug 2009, 14:52
da Mario Vanoni
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

Re: ordinatore in c (sempre files uffi)

Inviato: gio 2 lug 2009, 15:41
da ulisse89
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.

Re: ordinatore in c (sempre files uffi)

Inviato: gio 2 lug 2009, 15:56
da Mario Vanoni
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.

Re: ordinatore in c (sempre files uffi)

Inviato: gio 2 lug 2009, 16:11
da JohnnyMnemonic
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...

Re: ordinatore in c (sempre files uffi)

Inviato: gio 2 lug 2009, 17:18
da Mario Vanoni
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!

Re: ordinatore in c (sempre files uffi)

Inviato: gio 2 lug 2009, 17:27
da conraid
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

Re: ordinatore in c (sempre files uffi)

Inviato: gio 2 lug 2009, 17:53
da JohnnyMnemonic
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?

Re: ordinatore in c (sempre files uffi)

Inviato: gio 2 lug 2009, 20:26
da Mario Vanoni
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.