• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Konwersja inta na c-string

Object Storage Arubacloud
0 głosów
224 wizyt
pytanie zadane 15 marca 2021 w C i C++ przez Krzysztof Juraszek Nowicjusz (230 p.)

Witam mam oto taki program  gdzie podstawą jest program dostarczony przez wykładowce a moim zadaniem jest napisanie dwóch funkcji unsigned toString(unsigned n, unsigned p, char* code) oraz bool isPalindrom(char* s, unsigned k)

 Kod programu :

#include <iostream>
#include <string>
 
using namespace std;
 
unsigned toString(unsigned n, unsigned p, char* code);
 
bool isPalindrom(char* s, unsigned k);
 
 
int main() 
{
    
 
    unsigned m, n, p; // zakres liczb m..n; p: podstawa zapisu
    unsigned k;       // liczba cyfr w zapisie przy podstawie p  
    char code[33] = { 0 };// Co najwyżej 32 cyfry rozwinięcia unsigned
 
 
    setlocale(LC_ALL, "pl-PL.UTF8");
 
    cout << "Program sprawdza, które liczby całkowite > 0 z zakresu m..n \n";
    cout << "są w zapisie przy podstawie p palindromami. \n";
    cout << "Liczby na wejściu podawane są w zapisie dziesiętnym. \n";
    cout << "m, n <= 0 --> koniec programu.\n";
    cout << "Uwaga: podstawa p musi być ze zbioru {2 .. 36}. \n";
 
 
    while (true) { // Konwersacja 
        cout << "\nzakres m..n i podstawa p: m n p = ";
        cin >> m >> n >> p;
        if (m <= 0 || n <= 0) break;
 
 
        for (unsigned i = m; i <= n; ++i) {
 
            k = toString(i, p, code);
            if (isPalindrom(code, k))
                cout << i << " = " << code << endl;
        }
 
    }
    cout << "\nKoniec programu\n";
}
 
 
 
// Zwraca true jeśli liczba k-cyfrowa w s jest palindromem.
 
bool isPalindrom(char* s, unsigned k)
{
    std::string num_str(s);
    std::string num_reversed = std::string(num_str.rbegin(), num_str.rend());
    return num_str == num_reversed;
}
 
// 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)
{
 
    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' };
 
 
    if (n<2 || p>static_cast<int>(signs.size()) - 1) return {};
 
  
    string result;
 
    do
    {
        result += signs[n % p];
       n /= p;
    } while (p > 0);
 
    reverse (begin(result), end(result));
 
    return result;
 
 
 
}



W funkcji  unsigned toString(unsigned n, unsigned p, char* code) mam dokonać konwersji  inta na string o podstawie p < gdzie jak dobrze rozumie p jest system zapisu licz. Niestety  program się nie kompiluje z powodu

linia 72

Ważność    Kod    Opis    Projekt    Plik    Wiersz    Stan pominięcia
Ostrzeżenie    C4018    ">": niezgodność typu ze znakiem/bez znaku    Project1    C:\Users\nimda\source\repos\Project1\Źródło.cpp    72   

Linia 85  

Ważność    Kod    Opis    Projekt    Plik    Wiersz    Stan pominięcia
Błąd    C2440    "return": nie można konwertować z "std::string" na "unsigned int"    Project1    C:\Users\nimda\source\repos\Project1\Źródło.cpp    85    

 

Jak mam poprawić tą funkcje

2 odpowiedzi

+3 głosów
odpowiedź 15 marca 2021 przez TOM_CPP Pasjonat (22,640 p.)

Niestety  program się nie kompiluje z powodu ...

Program nie kompiluje się z powodu tego, że sam go nie napisałeś, tylko skopiowałeś z wątku . Jak sam nie zaczniesz pisać kodu, to nigdy go nie zrozumiesz i nie będziesz wiedział skąd biorą się tego rodzaju błędy.

0 głosów
odpowiedź 15 marca 2021 przez Psz3mo Mądrala (5,030 p.)

unsigned toString(unsigned n, unsigned p, char* code) ->funkcja zwraca unsigned int. A powinna string wnioskując z tego co napisałeś poniżej.

unsigned toString(unsigned n, unsigned p, char* code)  //zwróć unsigned int !!!
{
  
    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' };
  
  
    if (n<2 || p>static_cast<int>(signs.size()) - 1) return {};
  
   
    string result;
  
    do
    {
        result += signs[n % p];
       n /= p;
    } while (p > 0);
  
    reverse (begin(result), end(result));
  
    return result;  //zwróć string !!!
  
  
  
}

Musisz to poprawić.

komentarz 15 marca 2021 przez Krzysztof Juraszek Nowicjusz (230 p.)
no właśnie musi zwrócić inta
komentarz 15 marca 2021 przez Psz3mo Mądrala (5,030 p.)
Tak ale niżej zwracasz string

Możesz to zrobić za pomocą funkcji atoi();
komentarz 15 marca 2021 przez Psz3mo Mądrala (5,030 p.)
Ale moim zdaniem to bez sensu, że ma zwracać int, ponieważ w tablicy signs masz litery których nie zamienisz na int
komentarz 15 marca 2021 przez Krzysztof Juraszek Nowicjusz (230 p.)
// Funkcja zwraca liczbę znaków rozwinięcia przy podstawie p.

nie za bardzo wiem co wykładowca miał na myśli
komentarz 15 marca 2021 przez Krzysztof Juraszek Nowicjusz (230 p.)
mała podpowiedz wykładowcy

dla 255 i podstawy 16 będzie FF, dla 255 i podstawy 2 będzie 11111111 a dla podstawy 8 377
komentarz 15 marca 2021 przez Psz3mo Mądrala (5,030 p.)
Czyli twój program ma zamieniać liczby dziesiętne na binarne, trójkowe itp aż do 36 i sprawdzać to co obliczy czy jest palindromem, tak?
komentarz 15 marca 2021 przez Krzysztof Juraszek Nowicjusz (230 p.)
to jest opis zadania od wykładowcy co do tej funkcji

// 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}.
komentarz 15 marca 2021 przez Psz3mo Mądrala (5,030 p.)
A jeśli tak, to na co ci funkcja isPalindrom?
komentarz 15 marca 2021 przez Krzysztof Juraszek Nowicjusz (230 p.)
ale to się tyczy funkcji unsigned toString(unsigned n, unsigned p, char* code)

tamta funkcja tylko sprawdza
komentarz 15 marca 2021 przez Psz3mo Mądrala (5,030 p.)

Musisz mieć funkcje, która zamienia liczby dziesiętne na inny system o podstawie p.

Zamiana liczby dziesiętnej:
Dla mnie najłatwiej jest użyć tutaj tablicy vector.
Po pierwsze tworzysz tablicę ze wszystkimi znakami od 0 do Z.
Następnie w pętli sprawdzającej czy liczba jest mniejsza od p dzielisz modulo liczbę przez p i wynik dzielenia wpisujesz do tablicy za pomocą tablicy ze znakami.
Potem to dzielenie robisz jeszcze raz, ale bez modulo i wynik zaokrąglasz w dół, a następnie zamieniasz liczbę na wynik tego dzielenia. Po wszystkich pętlach wpisujesz ostatni wyraz i masz gotowy ciąg znaków.
A z resztą powinieneś sobie już poradzić.

vector<string> vec1;
	string tab[p] = { "0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F" };
	unsigned int r = a;
	while (r > p-1) {
		int j = r % p;
		vec1.push_back(tab[j]);
		int h = floor(r / p);
		r = h;
	}
	vec1.push_back(tab[r]);

Wyżej przykład jakbyś nie zrozumiał tego co napisałem.

Tutaj więcej o vectorach

komentarz 15 marca 2021 przez Psz3mo Mądrala (5,030 p.)
Chyba wiesz jak policzyć liczbę znaków, zamiast tablicy vec1 możesz dodać licznik int a = 0;

i z każdym dzieleniem inkrementować tą wartość.

Podobne pytania

0 głosów
0 odpowiedzi 250 wizyt
0 głosów
1 odpowiedź 215 wizyt
pytanie zadane 15 lutego 2021 w C i C++ przez Rainbow99 Początkujący (430 p.)
0 głosów
2 odpowiedzi 1,116 wizyt

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...