Czy dobrze napisałem funkcje

0

Witam

Mam za zadnie napisać program, w którym mam zmodyfikować dwie funkcje unsigned toString(unsigned n, unsigned p, char* code); oraz bool isPalindrom(char* s, unsigned k);

cały program jest tu https://pastebin.com/tZCQXCrF tutaj jest poprawny kod

wymyśliłem sobie ze funkcja isPalindrom będzie napisana tak

std::string str = std::to_string(k);
 
size_t size = str.size();
std::string rev;  //pomocniczy 
rev.reserve(size);
for (size_t i = 0; i < size; ++i)
{
    rev += str[size - i - 1];
}
if (rev == str)
{
    return true;
}
else
{
    return false;
}

Ale to kompletnie nie działa czy ktoś by mógł mi pomoc bo porostu nie umie grzebać w czyimś kodzie a muszę to zrobić bez większych modyfikacji programu. Kompletnie też nie wiem jak napisać funkcje unsigned toString

Bardzo proszę o pomoc

0

isPalindrom(char s, unsigned k);

Nie bardzo rozumiem co ta sygnatura oznacza. Czym jest s i czym jest k? Spodziewałbym się jakieś isPalindrom(std::string) albo chociaż isPalindrom(char*) ale char i unsigned to nic mi nie mówią.

Jeśli chodzi o sam kod to jest bez sensu. Podpowiem że std::string ma reverse iterator.

Jeśli chodzi o toString to też nie rozumiem co dokładnie ta funkcja ma u ciebie robić. Czym są te parametry? o_O Może gdybyś wstawił na forum kod albo podał link do konkretnej pasty a nie do pastebin.com to byłoby prościej.

0

To nie jest mój program tylko wykładowcy

1

Na oko to powinno być coś w stylu:

bool isPalindrom(char s, unsigned k){
    char result[1024];
    toString(s,k, result)
    std::string str = std::string(result);
    std::string rev = std::string(str.rbegin(),str.rend());
   return str == rev;
}

ale ta sygnatura toString to rak straszliwy. Zamiana na liczbę w innym systemie nie powinna być jakaś specjalnie trudna, coś w stylu (pseudokod):

charset = '012345....abcdef....xyz'
result = []
while number > 0:
    digit_value = number%base
    result.append(charset[digit_value])
    number /= base

Czyli bierzesz sobie resztę z dzielenia przez podstawę systemu (czyli wartość ostatniej "cyfry"), dopisujesz do wyniku zgodnie z przyjętym charsetem do zapisu tych twoich liczb a potem obcinasz tą cyfrę z liczby.

0

jestem w tarapatach czy ktoś mi pomorze

2
unsigned toString(unsigned n, unsigned p, char* code)

Nie używaj takich sygnatur funkcji w C++. Goły wskaźnik code może wskazywać na dowolne miejsce w pamięci, a wewnątrz funkcji nie masz możliwości sprawdzenia czym jest "struktura danych" na które pokazuje wskaźnik, dodatkowo zakładasz że jest to zawsze tablica char code[33]. Wiem że jest to czysto zaliczeniowa rzecz, ale warto tutaj podkreślić, że nie należy w taki sposób tworzyć kodu. Traktuj to jako antywzorzec.

0

@TomaszLiMoon: @Shalom

Czy ta 2 funkcja powinna wyglądać tak

// Konwersja liczby dodatniej n na postać znakową
// w zapisie przy podstawie p do tablicy code.
// Funkcja zwraca liczbę znaków rozwinięcia przy podstawie p.
// Uwaga: w zależności od p: cyfry ze zbioru {0..9, A..Z}.

unsigned toString(unsigned n, unsigned p, char* code)
{
std::string str = std::to_string(n);
strcpy(code, str.c_str());
return str.size() + 1;

}

1

Not even close. A konwersja to gdzie jest? :D Rozumiesz w ogóle polecenie? Dostajesz liczbę 255 i masz ja zapisać w systemie o podstawie 16 więc masz zwrócić jako wynik stringa FF

0

Masz zamienić liczbę n typu unsigned z systemu o podstawie 10 na system o podstawie p i zapisać ją w tablicy tekstowej.
Zobacz jak może wyglądać algorytm w takiej funkcji.

using namespace std;

const string signs { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
                     'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
                     'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U'  };

string int_to_string( int number , int base )
{
    if( base<2 || base>static_cast<int>(signs.size())-1 ) return {};

    string result;

    do
    {
        result += signs[number%base];
        number /= base;
    }
    while( number > 0 );

    reverse( begin(result) , end(result) );

    return result;
}

int main()
{
    cout << int_to_string(2508,16) << endl;
    return 0;
}
0

@B4mbus

jasne, ale czemu jest globalny?

String jest globalny aby łatwiej czytało się kod i algorytm.
W C++20 można to trochę bardziej zwięźle.

#include <iostream>

using namespace std;

template< size_t N >
struct fixString
{
    constexpr fixString( const char (&str)[N] ) { copy_n(str, N, value); }
    char value[N];
};

template< fixString signs = "0123456789ABCDEFGHIJKLMNOPRSTUWZ" >
auto int_to_string( int number , size_t base )
{
    return base<2 || base>sizeof(signs.value) ? ""s : [&](){ string result; do{result+=signs.value[number%base];number/=base;}while(number>0);return string(rbegin(result),rend(result) );}();
}

int main()
{
    cout << int_to_string(2508,10) << endl;
    return 0;
}

https://godbolt.org/z/Po98K6

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