2016-11-20 5 views
3

먼저 시간을내어 주신 것을 감사드립니다. 나는 또한 나의 영어에 대해 사과하고 싶다. 그것은 나의 모국어가 아니다.C 기수 정렬 문자열 배열

나는 radix sort와 counting sort로 문자열 배열을 정렬하는 작은 프로그램을 작성했다. 문제는 제대로 작동하지 않는다는 것입니다. 모든 문자열의 길이가 동일하면 출력은 정확하지만 문자열 이름이 10자를 넘으면 프로그램이 잘못 응답합니다. 나는 함수에서 NAJDLUZSZY을 증가시킨 후 모든 것이 잘 작동한다는 것을 알았지 만, 나는 왜 그런지 이해하지 못한다. 나는 변수와 함수의 폴란드어 이름에 대해 사과

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <ctype.h>  // na potrzeby tolower 

#define DLUGOSC_NAPISU 30 
#define ILOSC_NAPISOW 7 
#define ZAKRES_WARTOSCI_A 128 

char **A; // input array to sort 
char **B; // output sorted array 
char **pom; 

// Sortowanie pozycyjne - tablice indeksowane od 1 

void sortPrzezZliczanie(char **A, char **B, int ilosc, int pozycja) { //counting sort 
    int i, j; 
    int C[2048]; // pomocnicza tablica 'licznikow', ile razy wystepuje jaki znak w A 

    for (i = 0; i <= ZAKRES_WARTOSCI_A; i++) 
     C[i] = 0; 
    for (j = 1; j <= ilosc; j++) 
     C[A[j][pozycja]] += 1; 
    for (i = 1; i <= ZAKRES_WARTOSCI_A; i++) 
     C[i] = C[i] + C[i - 1]; 
    for (j = ilosc; j > 0; j--) { 
     B[C[A[j][pozycja]]] = A[j]; 
     C[A[j][pozycja]] = C[A[j][pozycja]] - 1; 
    } 
} 

void sortPozycyjne(char **A, char **B, int NAJDLUZSZY) { // radix sort 
    int i; 
    for (i = NAJDLUZSZY; i >= 0; i--) { 
     sortPrzezZliczanie(A, B, ILOSC_NAPISOW, i); 
     pom = A; A = B; B = pom;  // input array to output 
    } 
} 

void drukuj(char **tablica, int ilosc) { 
    FILE *fp; 

    if ((fp = fopen("output.txt", "w")) == NULL) { 
     printf("Nie mogê otworzyæ pliku input.txt do zapisu!\n"); 
     return; 
    } 

    int i; 
    for (i = 1; i <= ilosc; i++) 
     //tablica[i]=toupper(tablica[i]);    
     fprintf(fp, "%s \n", tablica[i]); 

    fclose(fp); 
} 

void czytaj(char **tablica, int ilosc) { 
    FILE *fp; 
    //int tmp; 
    if ((fp = fopen("input.txt", "r")) == NULL) { 
     printf("Nie mogê otworzyæ pliku output.txt do zapisu!\n"); 
     return; 
    } 

    char slowo[DLUGOSC_NAPISU]; 
    int i, j; 
    for (i = 1; i <= ilosc; i++) { 
     //fscanf (fp, "%d", &tmp); 
     fscanf(fp, "%s", &slowo); 
     // for (j = 0; j < strlen(slowo); j++) 
     //  slowo[j] = tolower(slowo[j]); // zmniejszam wielkosc litery 
     tablica[i] = (char*) malloc(sizeof(char) * DLUGOSC_NAPISU); 
     strcpy(tablica[i], slowo); 
    } 
    fclose (fp); 
} 

int najdluzszyNapis(char **tablica, int ilosc) { // finds maximum length of word 
    int i, max = 0; 
    for (i = 1; i <= ilosc; i++) 
     if (strlen(tablica[i]) > max) 
      max = strlen(tablica[i]); 
    return max; 
} 

void taSamaDlugosc(char **tablica, int ilosc, int NAJDLUZSZY) { 
    // if string is lower than maximum then fill with nulls 

    int i, j; 
    for (i = 1; i <= ilosc; i++) 
     for (j = 0; j <= NAJDLUZSZY; j++) 
      if (!(96 < (int)tablica[i][j] && (int)tablica[i][j] < 123)) 
       tablica[i][j] = 0; 
} 

int main() { 
    A = (char**)malloc(ILOSC_NAPISOW * sizeof(char*)); 
    B = (char**)malloc(ILOSC_NAPISOW * sizeof(char*)); 
    pom = (char**)malloc(ILOSC_NAPISOW * sizeof(char*)); 
    int NAJDLUZSZY; // length of the longest word 

    printf("Wpisz napisy do tablicy A:\n"); 
    czytaj(A, ILOSC_NAPISOW); 
    NAJDLUZSZY = najdluzszyNapis(A, ILOSC_NAPISOW); 
    taSamaDlugosc(A, ILOSC_NAPISOW, NAJDLUZSZY); 

    sortPozycyjne(A, B, NAJDLUZSZY); 

    printf("\nSlownikowo posortowana tablica:\n"); 
    drukuj(B, ILOSC_NAPISOW); 
    printf("%d", NAJDLUZSZY); 
    return 0; 
} 

: 여기

는 코드입니다. NAJDLUZSZY이 줄면 답이 정확합니다.

+0

'(j = 1; j <= ilosc; j ++)'->'for (j = 0; j chux

답변

0

코드를 읽을 수 있도록 다시 포맷했습니다. 적절하고 일관된 들여 쓰기와 간격을 사용하는 것이 명확성의 핵심입니다. 이 스타일에서 배우고 배우십시오. 여기

내 노트입니다

  • 당신이 당신의 코드에서 폴란드어를 사용하여 의견을 사용, 함수 나 변수 이름없는하려는 경우. 의견은 폴란드 독자가 코드를 이해하는 데 도움이되며 폴란드어가 아닌 독자는 변수 및 함수 이름에서 코드를 이해할 수있는 기회를 갖습니다. 또한 어쨌든 키워드가 영어로되어 있기 때문에 일관성이 있습니다. 프랑스어를 사용하는 프로그래머와 함께 프랑스에서 살고 일하는데 우리는 더 이상 프랑스어로 의견을 말하지 않습니다 ...

  • 모든 <=은 매우 틀린 것 같습니다. 배열은 C에서 0을 기반으로 : 배열 인덱스 값은 일반적으로 0에서 따라 제외 n에 실행 malloc()

    for (i = 0; i < size; i++) { 
        ... 
    } 
    
  • 캐스팅 반환 반환 값은 나쁜 스타일로 간주됩니다. 난 당신이 모든 비트가 0으로 초기화 배열을 할당 할 calloc()을 사용하는 것이 좋습니다 :

    A = calloc(ILOSC_NAPISOW, sizeof(*A)); 
    ... 
    
  • 항상 비 사소한 루프와 시험 {} 중괄호를 사용하면 비지지 문 3 단계의 일부 구조를 가지고, 이것은 매우 오류가 발생하기 쉬운입니다.

  • 특히 A, B 또는 pom과 같은 전역 변수는 사용하지 않아야합니다.

이것은 내가 폴란드어 이해하려고 노력 몇 분 안에 줄 수있는만큼 조언 기수 정렬 Y 좋아하는 알고리즘 중 하나 임에도 불구하고, 노력의 너무 많이이다.