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

Program sortujący łańcuchy tekstowe

Ostatnio zmodyfikowano 2014-01-06 14:33
Autor Wiadomość
lucky44
Temat założony przez niniejszego użytkownika
Program sortujący łańcuchy tekstowe
» 2014-01-06 11:32:24
Witam, mam do napisania program który wczyta łańcuchy od użytkownika i posortuje je alfabetycznie.
Jednak jest kilka uwag do zadania, mianowicie wprowadzanie łańcuchów ma się zakończyć na wprowadzeniu łańcucha pustego i nie mam pojęcia jaki warunek zawrzeć. Próbowałem na kilka sposobów... ale nijak nie wiem, bo jak już piszę jakiś warunek to wczytywanie wykonuje się nieskończoną ilość razy albo w ogóle się wysypuje. Z góry dzięki za pomoc.

C/C++
#include <iostream>
#include <string.h>
#include <stdlib.h>


using namespace std;

char * dopobrania( void )
{
    char bufor[ 40 ], * b;
    cin >> bufor;
    int e = strlen( bufor );
    b = new char[ e + 1 ];
    strcpy( b, bufor );
    return b;
}

void sortowanie( char * W[], int a )
{
    int i, j;
    char * t;
    if( a == 0 ) return;
   
    for( i = 0; i < a - 1; i++ )
   
    for( j = i + 1; j < a; j++ )
   
    if( _strcmpi( W[ i ], W[ j ] ) > 0 )
    {
        t = W[ i ]; W[ i ] = W[ j ]; W[ j ] = t;
    }
}

void wyswietl( char * W[], int n )
{
    for( int i = 0; i < n; i++ )
         cout << W[ i ] << endl;
   
}


int main( void )
{
    char * lancuch[ 40 ];
    int ilosc = 0;
    cout << "Pisz kolejne lancuchy do sortowania – "
    << "zakoncz znakiem *:" << endl;
    do
    {
        lancuch[ ilosc++ ] = dopobrania();
    } while( * lancuch != '...' ); // tu mam problem ........
   
    ilosc--;
    cout << "Wpisales lancuchy:" << endl;
   
    wyswietl( lancuch, ilosc );
   
    sortowanie( lancuch, ilosc );
   
    cout << "Alfabetycznie:" << endl;
   
    wyswietl( lancuch, ilosc );
   
    fflush( stdin );
    getchar();
    return 0;
}
P-101343
alixir
» 2014-01-06 12:15:54
Doprecyzuj czy te łańcuchy to mają być całe linie, które są następnie sortowane alfabetycznie (ja to przynajmniej tak zrozumiałem).

Bo sam warunek jest chyba dość prosty i wygląda najogólniej tak:
C/C++
std::string tekst;
do {
    std::getline( std::cin, tekst );
} while( tekst != "\0" );
P-101348
lucky44
Temat założony przez niniejszego użytkownika
» 2014-01-06 12:37:00
Tzn. mam takie zadanie że ma program wczytywać łańcuchy aż wystąpi łańcuch "pusty". Czyli wyraz ... pozniej enter kolejny wyraz no i naciskam enter i jeszcze raz enter (linia do pobierania wyrazu jest pusta) no i wtedy ma kończyć przyjmować wyrazy i program ma wykonywać sort alfabetyczny.
P-101360
alixir
» 2014-01-06 14:29:53
W ramach ćwiczeń napisałem sobie coś co chyba spełnia twoje oczekiwania. Oczywiście wszelkie sugestie mile widziane.

C/C++
#include <iostream>
#include <string>
#include <algorithm>

class cWords {
public:
    void printWords();
    int getSize();
    void getWords();
    void sortWords();
   
private:
    std::string * tWords;
    int size;
    std::string to_lower( std::string );
};

int main() {
   
    cWords slowa;
   
    slowa.getWords();
    std::cout << "Ilosc wprowadzonych lancuchow: " << slowa.getSize() << std::endl;
    slowa.sortWords();
    std::cout << "Posortowane alfabetycznie:" << std::endl;
    slowa.printWords();
   
    return 0;
}

void cWords::printWords() {
    for( int i = 0; i < size; i++ )
         std::cout << tWords[ i ] << std::endl;
   
}

void cWords::getWords() {
    std::string * tNew;
    std::string * tOld;
    std::string tmp;
    tNew = new std::string[ 1 ];
    int licz = 0;
    while( true ) {
        if( licz != 0 ) {
            tOld = new std::string[ licz ];
            for( int j = 0; j < licz; j++ )
                 tOld[ j ] = tNew[ j ];
           
            delete[] tNew;
           
            tNew = new std::string[ licz + 1 ];
            for( int j = 0; j < licz; j++ )
                 tNew[ j ] = tOld[ j ];
           
            delete[] tOld;
        }
        std::getline( std::cin, tmp );
        if( tmp == "\0" ) {
            break;
        }
        tNew[ licz ] = tmp;
        licz++;
    };
    tWords = tNew;
    size = licz;
}

int cWords::getSize() {
    return size;
}

void cWords::sortWords() {
    int i, j;
    std::string t;
    if( size == 0 ) return;
   
    for( i = 0; i < size - 1; i++ )
   
    for( j = i + 1; j < size; j++ )
   
    if( to_lower( tWords[ i ] ) > to_lower( tWords[ j ] ) )
    {
        t = tWords[ i ];
        tWords[ i ] = tWords[ j ];
        tWords[ j ] = t;
    }
   
}

std::string cWords::to_lower( std::string napis )
{
    transform( napis.begin(), napis.end(), napis.begin(),::tolower );
    return napis;
}
P-101408
pekfos
» 2014-01-06 14:33:17
Oczywiście wszelkie sugestie mile widziane.
std::vector<> znacznie uprościłby sprawę. No i wypadałoby używać technik znanych autorowi tematu..
P-101410
« 1 »
  Strona 1 z 1