Sortowanie przez scalania na plikach

Odpowiedz Nowy wątek
2012-07-17 22:12

Rejestracja: 7 lat temu

Ostatnio: 3 lata temu

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.


...
edytowany 1x, ostatnio: balu, 2012-07-17 22:12

Pozostało 580 znaków

2012-07-17 22:26

Rejestracja: 12 lat temu

Ostatnio: 7 lat temu

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);
} 

#define if(x) if(rand()%6 && (x)) u mad? !user image
edytowany 2x, ostatnio: dawidgarus, 2012-07-17 22:30

Pozostało 580 znaków

2012-07-18 10:17

Rejestracja: 7 lat temu

Ostatnio: 3 lata temu

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ą:
> 
```c
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ń.


...
edytowany 1x, ostatnio: balu, 2012-07-18 10:22

Pozostało 580 znaków

2012-07-18 10:40

Rejestracja: 7 lat temu

Ostatnio: 3 lata temu

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/image[...]as/merge.gif</image&gt;

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

remove("pomocniczy_1.txt");

albo zrobi sie osobna funkce do tego


...
edytowany 3x, ostatnio: balu, 2012-07-18 11:42

Pozostało 580 znaków

2012-07-19 22:53

Rejestracja: 7 lat temu

Ostatnio: 3 lata temu

0

Nikt nic nie podpowie?


...

Pozostało 580 znaków

2012-07-20 00:46

Rejestracja: 17 lat temu

Ostatnio: 5 dni temu

0

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

Pozostało 580 znaków

2012-07-20 12:31

Rejestracja: 7 lat temu

Ostatnio: 3 lata temu

0

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


...

Pozostało 580 znaków

2012-07-26 19:35

Rejestracja: 7 lat temu

Ostatnio: 3 lata temu

0

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


...

Pozostało 580 znaków

Odpowiedz

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