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.
Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

ordinatore in c (sempre files uffi) [RISOLTO]

Messaggio 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
Ultima modifica di Blallo il gio 2 lug 2009, 21:52, modificato 1 volta in totale.

Avatar utente
ulisse89
Packager
Packager
Messaggi: 643
Iscritto il: sab 17 gen 2009, 12:53
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce
Località: Bologna

Re: ordinatore in c (sempre files uffi)

Messaggio 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.

Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: ordinatore in c (sempre files uffi)

Messaggio 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

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

Re: ordinatore in c (sempre files uffi)

Messaggio 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
??
??
??

Avatar utente
ulisse89
Packager
Packager
Messaggi: 643
Iscritto il: sab 17 gen 2009, 12:53
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce
Località: Bologna

Re: ordinatore in c (sempre files uffi)

Messaggio 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;
}
Ultima modifica di ulisse89 il gio 2 lug 2009, 20:45, modificato 1 volta in totale.

Avatar utente
Blallo
Packager
Packager
Messaggi: 3302
Iscritto il: ven 12 ott 2007, 11:37
Nome Cognome: Savino Liguori
Slackware: 14.2 / 12.2
Kernel: 4.4.14-smp
Desktop: DWM
Località: Torino / Torremaggiore (FG)
Contatta:

Re: ordinatore in c (sempre files uffi)

Messaggio 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?

Avatar utente
ulisse89
Packager
Packager
Messaggi: 643
Iscritto il: sab 17 gen 2009, 12:53
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce
Località: Bologna

Re: ordinatore in c (sempre files uffi)

Messaggio da ulisse89 »

Proprio così. Secondo me funziona.

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: ordinatore in c (sempre files uffi)

Messaggio 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

Avatar utente
ulisse89
Packager
Packager
Messaggi: 643
Iscritto il: sab 17 gen 2009, 12:53
Nome Cognome: Riccardo
Slackware: 13.0
Kernel: 2.6.29.6
Desktop: Xfce
Località: Bologna

Re: ordinatore in c (sempre files uffi)

Messaggio 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.

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: ordinatore in c (sempre files uffi)

Messaggio 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.

Avatar utente
JohnnyMnemonic
Staff
Staff
Messaggi: 2733
Iscritto il: dom 5 set 2004, 0:00
Nome Cognome: Giuseppe Palmiotto
Slackware: 14.0
Kernel: 3.5.5-thanatos
Località: Bologna
Contatta:

Re: ordinatore in c (sempre files uffi)

Messaggio 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...

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: ordinatore in c (sempre files uffi)

Messaggio 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!

Avatar utente
conraid
Staff
Staff
Messaggi: 13631
Iscritto il: gio 14 lug 2005, 0:00
Nome Cognome: Corrado Franco
Slackware: current64
Desktop: kde
Località: Livorno
Contatta:

Re: ordinatore in c (sempre files uffi)

Messaggio 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

Avatar utente
JohnnyMnemonic
Staff
Staff
Messaggi: 2733
Iscritto il: dom 5 set 2004, 0:00
Nome Cognome: Giuseppe Palmiotto
Slackware: 14.0
Kernel: 3.5.5-thanatos
Località: Bologna
Contatta:

Re: ordinatore in c (sempre files uffi)

Messaggio 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?

Mario Vanoni
Iper Master
Iper Master
Messaggi: 3174
Iscritto il: lun 3 set 2007, 21:20
Nome Cognome: Mario Vanoni
Slackware: 12.2
Kernel: 3.0.4 statico
Desktop: fluxbox/seamonkey
Località: Cuasso al Monte (VA)

Re: ordinatore in c (sempre files uffi)

Messaggio 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.

Rispondi