먼저 시간을내어 주신 것을 감사드립니다. 나는 또한 나의 영어에 대해 사과하고 싶다. 그것은 나의 모국어가 아니다.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
이 줄면 답이 정확합니다.
'(j = 1; j <= ilosc; j ++)'->'for (j = 0; j
chux