Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

counting sort / problem ze wskaźnikami i tablicami

Ostatnio zmodyfikowano 2016-11-22 10:40
Autor Wiadomość
kkkkkkkkkkk
Temat założony przez niniejszego użytkownika
counting sort / problem ze wskaźnikami i tablicami
» 2016-11-22 02:38:40
"Napisać program sortujący napisy (tzn. ciągi znaków) według pierwszej litery (nie rozróżniając dużych i małych liter), stosując sortowanie przez zliczanie."

Przy kompilacji wyskakują błędy "error: array subscript is not an integer" w funkcji Zliczanie. Funkcja ta jest implementacją algorytmu http://lifehug.com/category/algorithms/  Niestety nie jestem jeszcze biegły we wskaźnikach i tablicach i nie do końca wiem jak to zmodyfikować.
C/C++
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MaxDlugoscNapisu 30
#define MaxIloscNapisow 5
#define IleJestLiter 26

char ** A; // wejsciowa tablica do posortowania
char ** B; // wynikowa tablica, juz posortowana
char ** C; // pomocnicza tablica 'licznikow', ile razy wystepuje jaki znak w A

// Sortowanie przez zliczanie - tablice indeksowane od 1

void Zliczanie( char ** A, char ** B, int ilosc ) {
    int i, j;
   
    for( i = 1; i <= IleJestLiter; i++ ) C[ i ] = 0;
   
    for( j = 1; j <= ilosc; j++ )
         C[ A[ j ] ] = C[ A[ j ] ] + 1; // teraz C[i] to tablica licznikow
   
    for( i = 2; i <= IleJestLiter; i++ )
         C[ i ] = C[ i ] + C[ i - 1 ]; // teraz C[i] to ilosc wart >= 'i' w A
   
    for( j = MaxIloscNapisow; j > 0; j-- ) {
        B[ C[ A[ j ] ] ] = A[ j ];
        C[ A[ j ] ] = C[ A[ j ] ] - 1;
    }
}

void drukuj( char ** tablica, int ilosc ) {
    int i;
    for( i = 1; i <= ilosc; i++ )
         printf( "%s \n", tablica[ i ] );
   
}

void czytaj( char ** tablica, int ilosc ) {
    char slowo[ MaxDlugoscNapisu ];
    int i;
    for( i = 1; i <= ilosc; i++ ) {
        scanf( "%s", slowo );
        tablica[ i ] =( char * ) malloc( sizeof( char ) * MaxDlugoscNapisu );
        strcpy( tablica[ i ], slowo );
    }
}

int main() {
    A =( char ** ) malloc( MaxIloscNapisow * sizeof( char * ) );
    B =( char ** ) malloc( MaxIloscNapisow * sizeof( char * ) );
    C =( char ** ) malloc( MaxIloscNapisow * sizeof( char * ) );
   
    printf( "Wpisz napisy do tablicy A:\n" );
    czytaj( A, MaxIloscNapisow );
    Zliczanie( A, B, MaxIloscNapisow );
    printf( "Posortowana tablica ze wzgl na pierwszy znak:\n" );
    drukuj( B, MaxIloscNapisow );
   
    return 0;
}
 
P-154004
mateczek
» 2016-11-22 05:01:04
funkcja zliczanie wydaje się być wyrwana z kosmosu!!!
jest jakby pisana dla pojedynczych tablic znaków a ty tam ładujesz tablice napisów ?? poza tym o ile rozumiem idee tego sortowania to dla napisów się to nie nada bo jeśli występują dwa napisy zaczynające się od litery "a" to w pomocniczej tablicy nie da się pod indexem "tab[ a ]" zapisać obydwóch (licznik wystąpień jest tu bezużyteczny).
P-154005
kkkkkkkkkkk
Temat założony przez niniejszego użytkownika
» 2016-11-22 09:57:39
Właśnie mam problem z modyfikacją tego dla tablic napisów. W jaki sposób mogę to najprościej zmienić?
P-154007
mateczek
» 2016-11-22 10:40:45
masz w c++ na stringach
Moim zdaniem patent się nie nadaje do sortowania napisów bo nie da się w prosty sposób przechować większej liczby napisów pod tym samym indexem w tablicy
C/C++
#include<iostream>
#include<string>
using namespace std;
int main() {
    string tab[ 5 ] = { "bolek", "ala", "zenon", "piotrek", "marek" };
    string tabPomocnicza[ 'z' - 'a' + 1 ] = { "" }; //ile liter w alfabecie
    for( int i = 0; i < 5; i++ ) {
        int index = tab[ i ][ 0 ] - 'a'; //pierwsza litera stringa -'a'. Wynikiem będzie dla poszczególnych liter a=0, b=1, c=2
        tabPomocnicza[ index ] = tab[ i ]; //zrobiłem na stringach bo nie chciało mi się kopiować napisów znak po znaku
    }
    //wyświetlenie posortowanego
    for( int i = 0; i <=( 'z' - 'a' ); i++ ) {
        if( tabPomocnicza[ i ] != "" ) cout << tabPomocnicza[ i ] << endl;
       
    }
}
P-154008
« 1 »
  Strona 1 z 1