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

Sortowanie nazwisk [C]

Ostatnio zmodyfikowano 2017-02-17 04:51
Autor Wiadomość
nowawieza
Temat założony przez niniejszego użytkownika
Sortowanie nazwisk [C]
» 2017-02-16 02:09:16
Witam,
mam takie zadanie:

Napisz program z tablicą imion i nazwisk grupy n studentów, który sortuje je według nazwisk w kolejności alfabetycznej. Metoda sortowania dowolna ale ma być to w funkcji raczej.

Zacząłem robić to i już się męczę. Wiele prób, a co chwilę jakieś problemy mam :/
W programie jest wiele prób w komentarzach co do sortowania.

C/C++
#include <stdio.h>
#include <stdlib.h>
const int N = 30, M = 2, B = 25;
void sortowanie_babelkowe( float tab[ N ], char dane[ M ][ N ][ B ], int n );
void Sortowanie_alfabetyczne( char[], int );

int main() {
    int i = 0, xd = 0, n, s = 0;
   
    char dane[ N ][ M ][ B ], dane2[ N ][ M ][ B ], c, z, f, j;
    float tab[ N ], r;
   
   
   
    do {
        printf( "Podaj ilosc studentow: " );
        i = scanf( "%d", & n );
        fflush( stdin );
    } while( i == 0 || n > 30 || n < 2 );
   
    system( "cls" );
   
    for( i = 0; i < n; i++ ) {
        printf( "\nPodaj imie studenta nr %d: ", i + 1 );
        scanf( "%24s", & dane[ i ][ 0 ] );
        fflush( stdin );
        printf( "Podaj nazwisko studenta nr %d: ", i + 1 );
        scanf( "%24s", & dane[ i ][ 1 ] );
        fflush( stdin );
    }
    for( i = 0; i < n; i++ ) {
        tab[ i ] = dane[ i ][ 1 ][ 0 ];
    }
   
   
   
    do
    {
       
        s = 0;
        for( i = 0; i < n; i++ )
        {
            if( tab[ i ] < tab[ i + 1 ] )
            {
               
                z = dane[ i ][ M ][ B ];
                dane[ i ][ M ][ B ] = dane[ i + 1 ][ M ][ B ];
                dane[ i + 1 ][ M ][ B ] = z;
                s = 1;
            }
        }
    } while( s != 0 );
   
   
    /* for (i=1;i<n;i++)
        {
            z=dane[i][M][B];
           
            for(j=i-1;j>=0&&tab[j]>tab[i];j--)
                 dane[j+1][M][B]=dane[j][M][B];
           
            dane[j+1][M][B] = z;
        }
      */
    for( i = 0; i < n; i++ ) {
        printf( "\n %s %s", dane[ i ][ 0 ], dane[ i ][ 1 ] );
    }
   
   
    return 0;
}



/*
void sortowanie_babelkowe (float tab[N], char dane[M][N][B], int n)
{
int s,i;
char z;
do
{

s=0;
for (i=0;i<n;i++)
{
if (tab[i]>tab[i+1])
{
z=dane[i][M][B];
dane[i][M][0]=dane[i+1][M];
dane[i+1][M]=z;
s=1;
}
}
}
    while (s!=0);
}*/

void Sortowanie_alfabetyczne( char dane[], int n )
{
    char nazwisko;
    int i;
    int j;
    for( i = 1; i < n; ++i ) {
        nazwisko = dane[ i ];
        for( j = i - 1; j >= 0 && dane[ j ] > nazwisko; --j ) {
            dane[ j + 1 ] = dane[ j ];
        }
        dane[ j + 1 ] = nazwisko;
    }
   
}

Jakie sortowanie powinienem wybrać? Jakie są tu błędy?
Generalnie nie rozumiem tablic 3 wymiarowych jeśli chodzi o zapis w programie :/ Gubię się strasznie więc pewnie z tym są związane błędy.
P-157799
Nazgul
» 2017-02-16 02:18:11
Nie rozumiem pytania.
Czemu używasz trójwymiarowej tablicy, skoro może być jednowymiarowa?
Zadanie jest trywialne, a wprowadzasz tutaj kosmiczną abstrakcję.

Pomogę, ale mam pytania:
Miałeś struktury?
Miałeś klasy?
Miałeś tworzenie tablic dynamicznych?

//EDIT
aaa rozumiem, w C, to pewnie dynamicznej alokacji pamięci nie ogarniacie, ok rozumiem
P-157800
nowawieza
Temat założony przez niniejszego użytkownika
» 2017-02-16 02:33:18
Wydaje mi się, że prowadząca ćwiczenia na studiach wymaga w tym zadaniu tablicy 3 wymiarowej (sam tego nie rozumiem...)

Nie poznaliśmy jeszcze klas, struktur ani tablic dynamicznych.

To jest dział tablic i ich sortowania. Na tablicach 3 wymiarowych też za wiele nie działaliśmy ale no trzeba próbować.
P-157801
Nazgul
» 2017-02-16 02:39:11
to okej,
wybór sortowania jest dowolny, np. w sortowaniu bąbelkowym przydaje się funkcja zamien(...), np.:
C/C++
void zamien( char * wyraz1, char * wyraz2 )
{
    for( unsigned int i = 0; i < MAX_DLUGOSC_WYRAZU; i++ )
    {
        if( wyraz1[ i ] > wyraz2[ i ] )
        {
            char * wyraz3 = wyraz1;
            wyraz1 = wyraz2;
            wyraz2 = wyraz3;
            return;
        }
    }
}

i resztę robisz tak jak w sortowaniu bąbelkowym.

C/C++
void zamien( char * wyraz1, char * wyraz2 )
{
    for( unsigned int i = 0; i < MAX_DLUGOSC_WYRAZU; i++ )
    {
        if( wyraz1[ i ] > wyraz2[ i ] )
        { char * wyraz3 = wyraz1;
            wyraz1 = wyraz2;
            wyraz2 = wyraz3;
            return;
        }
    }
}

void sortuj( char * tablica[], unsigned int rozmiar )
{
    do
    {
        for( unsigned int i = 0; i < rozmiar - 1; i++ )
             zamien( tablica[ i ], tablica[ i + 1 ] );
       
        rozmiar--;
    } while( rozmiar > 1 );
   
}
P-157802
nowawieza
Temat założony przez niniejszego użytkownika
» 2017-02-16 02:46:44
Nie mogę użyć char * gdyż nie miałem jeszcze wskaźników, a to pewnie wskaźnik. No my jeszcze gwiazdek nie poznaliśmy :P

Ale nawet mniejsza o to.
Głównie mam problem z całym programem, a nie tylko z sortowaniem :D

Zaraz postaram się napisać program bardziej czysty ale to już jest męczarnia :/
P-157803
nowawieza
Temat założony przez niniejszego użytkownika
» 2017-02-16 03:05:21
C/C++
#include <stdio.h>
#include <stdlib.h>
const int N = 30, M = 2, B = 25;
void sortowanie_babelkowe( float tab[ N ], char dane[ M ][ N ][ B ], int n );
void sortuj( char[], int );

int main() {
    int i = 0, xd = 0, n, s = 0;
   
    char dane[ N ][ M ][ B ], dane2[ N ][ M ][ B ], c, z, f, j;
    float tab[ N ], r;
   
   
   
    do {
        printf( "Podaj ilosc studentow: " );
        i = scanf( "%d", & n );
        fflush( stdin );
    } while( i == 0 || n > 30 || n < 2 );
   
    system( "cls" );
   
    for( i = 0; i < n; i++ ) {
        printf( "\nPodaj imie studenta nr %d: ", i + 1 );
        scanf( "%24s", & dane[ i ][ 0 ] );
        fflush( stdin );
        printf( "Podaj nazwisko studenta nr %d: ", i + 1 );
        scanf( "%24s", & dane[ i ][ 1 ] );
        fflush( stdin );
    }
    for( i = 0; i < n; i++ ) {
        tab[ i ] = dane[ i ][ 1 ][ 0 ];
    }
   
   
   
    do
    {
       
        s = 0;
        for( i = 0; i < n; i++ )
        {
            if( tab[ i ] < tab[ i + 1 ] )
            {
               
                z = dane[ i ][ M ][ B ];
                dane[ i ][ M ][ B ] = dane[ i + 1 ][ M ][ B ];
                dane[ i + 1 ][ M ][ B ] = z;
                s = 1;
            }
        }
    } while( s != 0 );
   
   
   
    for( i = 0; i < n; i++ ) {
        printf( "\n %s %s", dane[ i ][ 0 ], dane[ i ][ 1 ] );
    }
   
   
    return 0;
}



void zamien( char * wyraz1, char * wyraz2 )
{
    for( unsigned int i = 0; i < B; i++ )
    {
        if( wyraz1[ i ] > wyraz2[ i ] )
        { char * wyraz3 = wyraz1;
            wyraz1 = wyraz2;
            wyraz2 = wyraz3;
            return;
        }
    }
}

void sortuj( char * tablica[], unsigned int rozmiar )
{
    do
    {
        for( unsigned int i = 0; i < rozmiar - 1; i++ )
             zamien( tablica[ i ], tablica[ i + 1 ] );
       
        rozmiar--;
    } while( rozmiar > 1 );
   
}

//void Sortowanie_alfabetyczne( char dane[], int n )
//{
//    char nazwisko;
//    int i;
//    int j;
//    for( i = 1; i < n; ++i ) {
//        nazwisko = dane[ i ];
//        for( j = i - 1; j >= 0 && dane[ j ] > nazwisko; --j ) {
//            dane[ j + 1 ] = dane[ j ];
//        }
//        dane[ j + 1 ] = nazwisko;
//    }

}

Na razie tyle. Będę edytował jak coś poprawię. (Nadal u mnie nie działa no ale to pewnie dlatego, że źle dobrane argumenty w funkcjach. Zobaczę co i jak)
P-157804
Nazgul
» 2017-02-16 03:08:48
C/C++
#include <stdio.h>
#include <stdlib.h>

const unsigned int MAX_DLUGOSC_WYRAZU = 25;
const unsigned int MAX_LICZBA_STUDENTOW = 30;

int main() {
    unsigned int n = 0;
    char tablica_studentow[ 2 ][ MAX_LICZBA_STUDENTOW ][ MAX_DLUGOSC_WYRAZU ];
    printf( "Podaj liczbe studentow: " );
    scanf( "%d", & n );
    if( n > MAX_LICZBA_STUDENTOW )
         return - 1;
   
    for( unsigned int i = 0; i < n; i++ )
    {
        printf( "\nPodaj imie studenta nr %d: ", i + 1 );
        scanf( "%24s", & tablica_studentow[ 1 ][ i ][ 0 ] );
        printf( "Podaj nazwisko studenta nr %d: ", i + 1 );
        scanf( "%24s", & tablica_studentow[ 0 ][ i ][ 0 ] );
    }
   
   
   
    unsigned int rozmiar = n;
    while( rozmiar > 1 )
    {
        for( unsigned int i = 0; i < rozmiar - 1; i++ )
        {
            for( unsigned int j = 0; j < MAX_DLUGOSC_WYRAZU; j++ )
            {
                if( tablica_studentow[ 0 ][ i ][ j ] > tablica_studentow[ 0 ][ i + 1 ][ j ] )
                {
                    char zamiennik_imie[ MAX_DLUGOSC_WYRAZU ];
                    char zamiennik_nazwisko[ MAX_DLUGOSC_WYRAZU ];
                   
                    for( unsigned k = 0; k < MAX_DLUGOSC_WYRAZU; k++ )
                    {
                        zamiennik_imie[ k ] = tablica_studentow[ 1 ][ i ][ k ];
                        zamiennik_nazwisko[ k ] = tablica_studentow[ 0 ][ i ][ k ];
                    }
                    for( unsigned k = 0; k < MAX_DLUGOSC_WYRAZU; k++ )
                    {
                        tablica_studentow[ 1 ][ i ][ k ] = tablica_studentow[ 1 ][ i + 1 ][ k ];
                        tablica_studentow[ 0 ][ i ][ k ] = tablica_studentow[ 0 ][ i + 1 ][ k ];
                    }
                    for( unsigned k = 0; k < MAX_DLUGOSC_WYRAZU; k++ )
                    {
                        tablica_studentow[ 1 ][ i + 1 ][ k ] = zamiennik_imie[ k ];
                        tablica_studentow[ 0 ][ i + 1 ][ k ] = zamiennik_nazwisko[ k ];
                    }
                    break;;
                }
            }
        }
        rozmiar--;
    }
   
   
   
    return 1;
}

Powinno być okej, sprawdz jeszcze dokładnie bo nie mam pewności.
z rozdzieleniem na funkcje nie powinieneś mieć problemu.
Zrobiłem to typowo "na Janusza", z pewnością można to zrobić lepiej, ale domyślam się że na kolokwium prowadzący będzie miał to gdzieś;P
Ahh gdyby te wskaźniki mogły być używane, to byśmy pięknie zmieniali same wskaźniki, a nie przepisywali całe tryliardy znaczków
P-157805
nowawieza
Temat założony przez niniejszego użytkownika
» 2017-02-16 03:14:21
Ciężko mi zrozumieć chwilowo ten kod, bo jest 20 razy coś podobnego ale powiedz mi tylko czy zrobiłeś sortowanie względem nazwiska, bo innego nie potrzebuję :D

A to nawet nie na kolokwium tylko na oddanie ma pójść. Miałem 6 zadań z sortowaniem i to mi tylko zostało.

Ps: Dałbyś radę mi przetłumaczyć jakoś co tu zrobiłeś?:

C/C++
unsigned int rozmiar = n;
while( rozmiar > 1 )
{
    for( unsigned int i = 0; i < rozmiar - 1; i++ )
    {
        for( unsigned int j = 0; j < MAX_DLUGOSC_WYRAZU; j++ )
        {
            if( tablica_studentow[ 0 ][ i ][ j ] > tablica_studentow[ 0 ][ i + 1 ][ j ] )
            {
                char zamiennik_imie[ MAX_DLUGOSC_WYRAZU ];
                char zamiennik_nazwisko[ MAX_DLUGOSC_WYRAZU ];
               
                for( unsigned k = 0; k < MAX_DLUGOSC_WYRAZU; k++ )
                {
                    zamiennik_imie[ k ] = tablica_studentow[ 1 ][ i ][ k ];
                    zamiennik_nazwisko[ k ] = tablica_studentow[ 0 ][ i ][ k ];
                }
                for( unsigned k = 0; k < MAX_DLUGOSC_WYRAZU; k++ )
                {
                    tablica_studentow[ 1 ][ i ][ k ] = tablica_studentow[ 1 ][ i + 1 ][ k ];
                    tablica_studentow[ 0 ][ i ][ k ] = tablica_studentow[ 0 ][ i + 1 ][ k ];
                }
                for( unsigned k = 0; k < MAX_DLUGOSC_WYRAZU; k++ )
                {
                    tablica_studentow[ 1 ][ i + 1 ][ k ] = zamiennik_imie[ k ];
                    tablica_studentow[ 0 ][ i + 1 ][ k ] = zamiennik_nazwisko[ k ];
                }
                break;;
            }
        }
    }
    rozmiar--;
}

Znaczy widzę, że są zamieniane miejsca co chwilę ale kurcze serio nie da się bez wskaźników tego ułatwić?
Troche masakra xD
P-157806
« 1 » 2 3 4
  Strona 1 z 4 Następna strona