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

Konwersja inta na c-string

VPS Starter Arubacloud
0 głosów
222 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.)
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 249 wizyt
0 głosów
1 odpowiedź 211 wizyt
pytanie zadane 15 lutego 2021 w C i C++ przez Rainbow99 Początkujący (430 p.)
0 głosów
2 odpowiedzi 1,087 wizyt

92,455 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...