fork download
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <ctype.h> // na potrzeby tolower
  5.  
  6. #define DLUGOSC_NAPISU 30
  7. #define ILOSC_NAPISOW 5
  8. #define ZAKRES_WARTOSCI_A 128
  9.  
  10. char **A; // wejsciowa tablica do posortowania
  11. char **B; // wynikowa tablica, juz posortowana
  12. char **pom;
  13.  
  14. // Sortowanie pozycyjne - tablice indeksowane od 1
  15.  
  16. void sortPrzezZliczanie(char **A, char **B, int ilosc, int pozycja){
  17. int i,j;
  18. int C[2048]; // pomocnicza tablica 'licznikow', ile razy wystepuje jaki znak w A
  19.  
  20.  
  21. for (i=0;i<=ZAKRES_WARTOSCI_A;i++) C[i]=0;
  22. for (j=1;j<=ilosc;j++)
  23. C[A[j][pozycja]] +=1;
  24. for (i=1;i<=ZAKRES_WARTOSCI_A;i++)
  25. C[i]=C[i]+C[i-1];
  26. for (j=ilosc;j>0;j--){
  27. B[C[A[j][pozycja]]]=A[j];
  28. C[A[j][pozycja]]=C[A[j][pozycja]]-1;
  29. }
  30. }
  31.  
  32. void sortPozycyjne(char **A, char **B, int NAJDLUZSZY){ // wywoluje sortowanie przez zliczanie po kolei dla kazdej pozycji
  33. int i;
  34. for (i=NAJDLUZSZY; i>=0; i--){
  35. sortPrzezZliczanie(A,B,ILOSC_NAPISOW,i);
  36. pom=A;A=B;B=pom; // tablica wynikowa staje sie wejsciowa
  37. }
  38. }
  39.  
  40. void drukuj(char **tablica, int ilosc){
  41. int i;
  42. for (i=1;i<=ilosc;i++)
  43. //tablica[i]=toupper(tablica[i]); // jako ze drukujemy naziwska, zmiana pierwszej litery na Wielka
  44. printf("%s \n", tablica[i]);
  45. }
  46.  
  47. void czytaj(char **tablica, int ilosc){
  48. char slowo[DLUGOSC_NAPISU];
  49. int i,j;
  50. for (i=1;i<=ilosc; i++){
  51. scanf("%s",slowo);
  52. for (j=0;j<strlen(slowo);j++)
  53. slowo[j] = tolower(slowo[j]); // zmniejszam wielkosc litery
  54. tablica[i] = (char*) malloc(sizeof(char)*DLUGOSC_NAPISU);
  55. strcpy(tablica[i],slowo);
  56. }
  57. }
  58.  
  59. int najdluzszyNapis(char **tablica, int ilosc){ // znajduje dlugosc najdluzszego napisu
  60. int i,max=0;
  61. for (i=1;i<=ilosc;i++)
  62. if (strlen(tablica[i])>max) max=strlen(tablica[i]);
  63. return max;
  64. }
  65.  
  66. void taSamaDlugosc(char **tablica, int ilosc, int NAJDLUZSZY){ // jesli dany string jest krotszy, niz najdluzszy
  67. // to uzupelnia brakujace miejsca nullami
  68. int i,j;
  69. for (i=1; i<=ilosc; i++)
  70. for (j=0; j<=NAJDLUZSZY; j++)
  71. if (!(96 < (int)tablica[i][j] && (int)tablica[i][j] < 123)) tablica[i][j]=0;
  72. }
  73.  
  74. int main(){
  75. A=(char**) malloc(ILOSC_NAPISOW*sizeof(char*));
  76. B=(char**) malloc(ILOSC_NAPISOW*sizeof(char*));
  77. pom=(char**) malloc(ILOSC_NAPISOW*sizeof(char*));
  78. int NAJDLUZSZY; // dlugosc najdluzszego napisu w tablicy A
  79.  
  80. printf("Wpisz napisy do tablicy A:\n");
  81. czytaj(A,ILOSC_NAPISOW);
  82. NAJDLUZSZY=najdluzszyNapis(A,ILOSC_NAPISOW);
  83. taSamaDlugosc(A,ILOSC_NAPISOW,NAJDLUZSZY);
  84.  
  85. sortPozycyjne(A,B,NAJDLUZSZY);
  86.  
  87. printf("\nSlownikowo posortowana tablica:\n");
  88. drukuj(B,ILOSC_NAPISOW);
  89.  
  90. return 0;
  91. }
  92.  
Success #stdin #stdout 0s 2304KB
stdin
Standard input is empty
stdout
Wpisz napisy do tablicy A:

Slownikowo posortowana tablica: