proszę o pomoc :( PORÓWNYWANIE LEKSYKOGRAFICZNE

Odpowiedz Nowy wątek
2019-01-09 20:15
0

mam takie polecenie:

Mamy alfabet A złożony z trzech liter: c, a, b. Napisz funkcję
int my_strcmp(char S1[], char S2[]);
która porówna ze sobą łańcuchy S1 i S2 zapisane w alfabecie A. Wynikiem powinno być:
0, jeśli S1=S2;
-1, jeśli S1 jest leksykograficznie mniejszy niż S2;
1, jeśli S1 jest leksykograficznie większy niż S2.

Input:
5
aa cc
ac a
c ac
bc ab
bc ac

Output:
1
1
-1
1
1

GOTOWY POCZĄTEK/SZABLON:
#include <iostream>
#include <cstring>
#include <cassert>

using namespace std;

typedef char letter;

#define T_SIZE 1001
#define MAX_ZNAK 256

int my_strcmp(char S1[], char S2[]);

int main(){
int t,odp;
char S1[T_SIZE], S2[T_SIZE];

cin >> t; / wczytaj liczbę testów /
cin.getline(S1,T_SIZE);
while(t){
cin.getline(S1,T_SIZE,' ');
cin.getline(S2,T_SIZE);
odp=my_strcmp(S1, S2);
cout << odp << endl;
t--;
}
return 0;
}

Nie wiem jak się za to zabrać, bo kompletnie nie ogarniam wskaźników i tych łańcuchów znaków, więc będę wdzięczna za jakąkolwiek pomoc.
W sumie nieważne jak, ważne by program robił to co ma robić :'(((

Pozostało 580 znaków

2019-01-09 23:22
0

Użyj: http://www.cplusplus.com/reference/cstring/strcmp/

EDIT Jeśli nie Możesz używać dodatkowych funkcji to:

int compare_strings(char a [], char b []) {
    while (*a && *b) {
        if (*a < *b) 
            return -1;
        a++;
        b++;
    }
    return 1;
}

int main() {
    printf("%d\n", compare_strings("bbccc", "aabbc")); // -> -1
    return 0;
}

EDIT2 Jak słusznie zauważył @hauleth; brakowało wariantu równych ciągów(jak długości równe i inkrementacja cnt do nich "dojechała, to zwróć 0"). Dołozyłem też funkcję liczącą długość stringa, i naprawiłem buga w warunku while (jak on przeszedł to tylko chochlik wie!:)), niestety kod się trochę skomplikował:

int len(char a []){
    int cnt = 0;
    while (*a++)
       cnt++;
    return cnt;
}

int compare_strings(char a [], char b []) {
    int cnt = 0;
    int a_len = len(a);
    int b_len = len(b);
    while (*a && *b) {
        if (*a == *b)
            cnt++;
        if (*a < *b) 
            return -1;
        a++;
        b++;
    }
    if ( a_len == b_len && a_len == cnt ) return 0;
    return 1;
}

int main() {
    char a[] = "aa";
    char b[] = "aa";
    printf("%d\n", compare_strings(a, b)); // -> 0
    printf("%d\n", compare_strings("ab", "aac")); // -> 1
    return 0;
}

edytowany 4x, ostatnio: lion137, 2019-01-10 01:06
Brakuje przypadku gdy a == b. - hauleth 2019-01-10 00:18
Tak, edycja. - lion137 2019-01-10 01:04

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0