2012-11-29 3 views
1

결과를 출력 파일에 저장하는 데 문제가 있습니다. 함수에 문제가있는 것 같지만 찾을 수없고 수정할 수 없습니다. 누가 잘못되었는지 알아?C에서 Kruskal 알고리즘 - 파일에 저장할 수 없습니다.

프로그램 CODE :

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

int **str; 
int *tab; 

void read(){ 
    int n = 1; 
    char help_sign; 
    FILE *fp = fopen("In0303.txt", "r"); 
    if(fp == NULL){ 
     printf("Blad odczytu z pliku!"); 
    } 

    while((help_sign = fgetc(fp)) != EOF){ 
     if (help_sign == '\n'){ 
      n++; 
     } 
    } 
    fclose(fp); 
} 

void gen(){ 
    int i, n; 
    int **str; 

    str =(int**)malloc(n*sizeof(int*)); 

    for (i = 0; i < n; i++){ 
     str[i] = (int*)malloc(4*sizeof(int)); 
    } 
} 

void load_date(){ 
    int i, n; 
    int **str; 

    FILE *fp = fopen("In0303.txt", "r"); 

    for (i = 0; i < n; i++){ 
     fscanf(fp, "%d" , &str[i][0]); 
     fscanf(fp, "%d" , &str[i][1]); 
     fscanf(fp, "%d" , &str[i][2]); 
     str[i][3]=0; 
    } 
    fclose(fp); 
} 

void gen_tab(){ 
    int i, n, k = 0; 
    int **str; 
    int *tab; 

    for (i = 0; i < n; i++){ 
     if (str[i][0] > k) k = str[i][0]; 
     if (str[i][1] > k) k = str[i][1]; 
    } 

    tab = (int*)malloc(k*sizeof(int)); 

    for (i = 0; i < k; i++){ 
     tab[i] = i + 1; 
    } 
} 

void sort(){ 
    int i, n, j,tmp; 
    int **str; 

    for (i = 0; i < n-1; i++) 
     for (j = i+1; j < n; j++){ 
      if (str[i][2] > str[j][2]){ 
       tmp = str[i][0]; 
       str[i][0] = str[j][0]; 
       str[j][0] = tmp; 
       tmp = str[i][1]; 
       str[i][1] = str[j][1]; 
       str[j][1] = tmp; 
       tmp = str[i][2]; 
       str[i][2] = str[j][2]; 
       str[j][2] = tmp; 
      } 
     } 
} 

int min(int x, int y){ 
    if (x > y) return y; 
    else return x; 
} 

int max(int x, int y){ 
    if (x < y) return y; 
    else return x; 
} 

void make(){ 
    int i, j, min1, max1, p, q, n, k; 
    int *tab; 
    int **str; 
    for (i = 0; i < n; i++){ 
     if (tab[((str[i][0])-1)] != tab[((str[i][1])-1)]){ 
      str[i][3] = 1; 
      min1 = min(tab[((str[i][0])-1)], tab[((str[i][1])-1)]); 
      max1 = max(tab[((str[i][0])-1)], tab[((str[i][1])-1)]); 

      for (j = 0; j < k; j++){ 
       if (tab[j] == max1) 
        tab[j] = min1; 
      } 
     } 
    } 
} 

void save(){ 
    int i, n; 
    int **str; 
    int *tab; 

    FILE *g = fopen("Out0303.txt","w"); 

    for (i = 0; i < n; i++){ 
     if (str[i][3] == 1){ 
      fprintf(g, "%d ", str[i][0]); 
      fprintf(g, "%d ", str[i][1]); 
      fprintf(g, "%d\n", str[i][2]); 
     } 
    } 
    fclose(g); 
} 

int main(){ 
    read(); 
    gen(); 
    load_date(); 
    gen_tab(); 
    sort(); 
    make(); 
    save(); 

    printf("Wyniki zapisane do pliku!\n"); 
    free(str); 
    free(tab); 
    return 0; 
} 

이 입력 파일 ("In0303.txt")이다

9 17 
2 3 8 4 9 8 
1 3 3 6 4 5 9 6 
2 6 4 4 9 1 
2 5 3 4 5 3 9 2 
4 3 6 1 9 5 
5 1 7 5 9 2 
6 5 8 4 9 2 
1 4 7 4 9 2 
1 8 2 6 3 1 4 2 5 5 6 2 7 2 8 2 

는이 출력 파일에 생성되어야 무엇인가 ("Out0303.txt") :

17 
3 9 [1] 
5 6 [1] 
4 9 [2] 
6 9 [2] 
7 9 [2] 
8 9 [2] 
1 2 [3] 
1 8 [4] 
+0

freopen 함수를 사용하여 표준 출력을 리디렉션하지 않는 이유 –

답변

3

즉석 - 당신의 저장 기능에, 당신은 지정하지 않는다 "N"

,536에

조금 확장. 당신은 전역 변수로 "n"을 사용하고자하지만 그것의 로컬 인스턴스를 선언하므로 값은 함수에서 유지되지 않습니다. 글로벌하게 만들거나 전달할 수 있습니다.

3

DRC의 답변에 추가 :

이 코드 조각 :

for (i = 0; i < n; i++){

n을 설정하지 않으면, 당신은(),() gen_tab를 세대에서이 실수를 거의 있는가, load(), save() 그리고 거의 모든 다른 함수들.

+0

이러한 기능 중 하나에 변경 사항을 표시 하시겠습니까? 나는 프로그래밍에서 새로운 것이다. –

+0

@MaciejJanuszewski :'read()'를'int read (void)'로 바꾸고,'int n = 0;'을 초기화하고 함수에서'n'을 돌려 주어야 할 것이다. 메인 코드는'int n = read(); if (n> 0) {gen (n); load_date (n); ...}', 그래서 당신은 각 함수에'n'을 넘깁니다. 그러나, 나는'load_date()'에서 시작하여 당신을 기다리는 다른 문제가 있다는 것을 두려워한다. –

+0

확인. 이제 인수()에 대한 각 함수에 대해 말합니다. -> 함수는 1 개의 인수를 취하지 않습니다. –

관련 문제