Sortowanie przez scalania na plikach

0

Witam, tak jak w temacie mam do napisania taki projekt na plikach. Dzis zabralem sie do pracy i trafiłem na pierwsza przeciwnosc z ktora nie moge sobie poradzic a oto kod:

 
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int pobierz_wybor(void);      
int pobierz_pierwszy(void);
void generuj(void);
void podziel(void);

int main(){
	
	int wybor;
	int pobierz_wybor();
	
	
	while((wybor = pobierz_wybor())!= 'k'){
		switch(wybor){
			
			case 'a' : generuj();
				break;
			case 'b' : 
				break;
			case 'c' : 
				break;
			case 'd' : 
				break;
		}
	}
	
	return 0;
}

int pobierz_pierwszy(void){
	
		int ch;
	
	ch = getchar();
	while(getchar()!= '\n')
		continue;
	return ch;
}

int pobierz_wybor(void){
	
		int ch;
	
	
	printf("Co chcesz zrobic?\n");
	printf("a. generuj plik    b. \n");
	printf("k. koniec\n");
	
	ch = pobierz_pierwszy();
	while( (ch < 'a' || ch > 'd')&& ch!= 'k'){
		
		printf("Wpisz a, b, c, d lub k aby zakonczyc.\n");
		ch = pobierz_pierwszy();
		
	}
	return ch;
}



void generuj(){
	int a,i;
	srand(time(NULL));
	FILE *fp,*fp1,*fp2;
	
	if( (fp = fopen("plik.txt", "w+"))==NULL){
	}	
	if( (fp1 = fopen("plik1.txt", "w+"))==NULL){
	}	
	if( (fp2 = fopen("plik2.txt", "w+"))==NULL){
	}	
	
	printf("\n");
	printf("Wylosowane liczby to:\n");
	
	for(i =0; i<10; i++){
		a = rand()%11;
		fprintf(fp, "%d", a);
		fprintf(fp, " ", a);
		printf("%d\n", a);
		
		
	}
	
	for(i =0; i<=5; i++){
		
		fprintf(fp1, "%d", a);
		
	}	

	for(i =6; i<=10; i++){
		
		fprintf(fp2, "%d", a);
		
	}	
	
	
}






Jak widać, chce podzielić liczby wylosowane (jest ich 10) do 2 plików "pomocniczych" tylko problem w tym że mój sposób nie działa. Do plików jest wpisywana 5 razy wartość, która zostaje wylosowana jako ostatnia.

Czekam na pomoc bardziej doświadczonych.

1

w 2 ostatnich pętlach for zapisujesz a do pliku, a a się nie zmienia przecież...
usuń pierwszą pętle for i zamień 2 następne na (jeśli dobrze zrozumiałem twoje intencje):

        for(i =1; i<=5; i++){
                a = rand()%11;
                fprintf(fp, "%d", a);
                fprintf(fp, " ");
                fprintf(fp1, "%d", a);
 
        }        
 
        for(i =6; i<=10; i++){
                a = rand()%11;
                fprintf(fp, "%d", a);
                fprintf(fp, " ");
                fprintf(fp2, "%d", a);
 
        }   

albo jeszcze prościej z jedną pętlą:

for(i =0; i<10; i++){
  a = rand()%11;
  fprintf(fp, "%d ", a);
  fprintf(i<5?fp1:fp2, "%d", a);
} 
0
dawidgarus napisał(a):

w 2 ostatnich pętlach for zapisujesz a do pliku, a a się nie zmienia przecież...
usuń pierwszą pętle for i zamień 2 następne na (jeśli dobrze zrozumiałem twoje intencje):

        for(i =1; i<=5; i++){
                a = rand()%11;
                fprintf(fp, "%d", a);
                fprintf(fp, " ");
                fprintf(fp1, "%d", a);
 
        }        
 
        for(i =6; i<=10; i++){
                a = rand()%11;
                fprintf(fp, "%d", a);
                fprintf(fp, " ");
                fprintf(fp2, "%d", a);
 
        }   

albo jeszcze prościej z jedną pętlą:

for(i =0; i<10; i++){
  a = rand()%11;
  fprintf(fp, "%d ", a);
  fprintf(i<5?fp1:fp2, "%d", a);
} 

to z jedna petla warunkowa przy kompilacji pisze w dev Permission denied .

A to z dwoma petlami myślałem o tym zanim jeszcze włączyłem dziś komputer takze dzięki wielkie. Proszę nie zamykać tematu, ponieważ pojawi się tu jeszcze wiele pytań.

0

Teraz gdy mam juz jeden ciag, podzielony na dwa równe i zapisane w plikach chciałbym zabrać się za sortowanie tych liczb. Ogólnie trzeba teraz posortować te dwa podciągi a następnie połączyć je w jeden. O ile jesli z tym drugim nie mam problemu, to z tym pierwszym jest gotowy algorytm ale działa on na tablicach a nie na plikach.

Mógłbyś coś podpowiedzieć?

A oto ten algorytm:

 
#include <stdio.h>
#define N 30

//using namespace std;

int tab[N] = {30,29,28,27,26,25,1,2,3,4,5,6,7,24,23,22,21,20,19,18,8,9,10,11,17,16,15,13,14,12};
int t[N];  // Tablica pomocnicza

/* Scalanie dwoch posortowanych ciagow
   tab[pocz...sr] i tab[sr+1...kon] i
   wynik zapisuje w tab[pocz...kon] */
void merge(int pocz, int sr, int kon)
{
  int i,j,q;
  for (i=pocz; i<=kon; i++) t[i]=tab[i];  // Skopiowanie danych do tablicy pomocniczej
  i=pocz; j=sr+1; q=pocz;                 // Ustawienie wskaźników tablic
  while (i<=sr && j<=kon) {		  // Przenoszenie danych z sortowaniem ze zbiorów pomocniczych do tablicy głównej
    if (t[i]<t[j])
        tab[q++]=t[i++];
    else
        tab[q++]=t[j++];
  }
  while (i<=sr) tab[q++]=t[i++];	// Przeniesienie nie skopiowanych danych ze zbioru pierwszego w przypadku, gdy drugi zbiór się skończył
}

/* Procedura sortowania tab[pocz...kon] */
void mergesort(int pocz, int kon)
{
  int sr;
  if (pocz<kon) {
    sr=(pocz+kon)/2;
    mergesort(pocz, sr);    // Dzielenie lewej części
    mergesort(sr+1, kon);   // Dzielenie prawej części
    merge(pocz, sr, kon);   // Łączenie części lewej i prawej
  }
}

int main() {
int i;

printf("Zbior przed sortowaniem:\n");
for (i=0; i<N; i++)
   printf("%d ", tab[i]);

mergesort(0,N-1);

printf("\nZbior po sortowaniu:\n");
for (i=0; i<N; i++)
   printf("%d ", tab[i]);
}

Tak to ma mniej więcej działać:

<image> http://www.algorytm.org/images/stories/as/merge.gif</image>

Oczywiście ma usuwać pliki pomocnicze: ale to wykona się instrukcją:

remove("pomocniczy_1.txt");

albo zrobi sie osobna funkce do tego

0

Nikt nic nie podpowie?

0

pomogę Ci, jeśli przyznasz się, że programowanie, to nie to co lubisz robić

0

Powiem tak, jestem początkujący w tych sprawach dlatego staram się do wszystkiego sam dojść, ewentualnie szukać pomocy gdzieś na forach.

0

Obiecałeś pomoc i jak nie było tak nie ma wiec mam sobie sma radzic?

1 użytkowników online, w tym zalogowanych: 0, gości: 1