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

Jak zamienić liczbę z systemu SI na dziesiętny?

Ultraszybki serwer VPS NVMe START
0 głosów
165 wizyt
pytanie zadane 9 października w C i C++ przez ola1234520 Nowicjusz (120 p.)

Mam do napisania program zmieniający liczbę np. 4M na 4 000 000 (M=1 000 000). Program nie chce mi do końca działać, wiem że powinnam zastosować stringi ale nie wiem w jaki sposób.

#include <iostream>
#include <string>
#include <stdlib.h>

using namespace std;
long long trans(char a ) {
	switch (a) {
	case 'M':return a * 100000; break;
	case 'B':return a * 1000000000; break;
	case 'T':return a * 1000000000000; break;
	case 'Qa':return a * 1000000000000000; break;
	case 'Qi':return a * 1000000000000000000; break;
	case 'Sx':return a * 1000000000000000000000; break;
	case 'Sp':return a * 1000000000000000000000000; break;
	case 'Oc':return a * 1000000000000000000000000000; break;
	default: return 0; break;
	}
}
int main()
{
	unsigned char literki[12][255] = { " ", "M", "B", "T", "Qa", "Qi", "Sx",
		"Sp", "Oc", '\0' };

    
	string a;
	cout << "Podaj cyfre z litera: ";
	cin >> a;
	
	int element = 0, wynik = 0, temp = 0;
	for (int i = 0; i<a.length(); ++i)
	{
		element = trans(a.at(i));
		if (i<a.length() - 1) {
			temp = trans(a.at(i + 1));
		}
		if (temp>element)
		{
			element = 0 - element;
		}
		wynik = element + wynik;
	}
	cout << wynik;

	return 0;
}

 

2 odpowiedzi

+1 głos
odpowiedź 10 października przez j23 Nałogowiec (30,660 p.)
edycja 10 października przez j23

char to jeden znak, a w case'ach masz dwuznakowe literały - to nie może dobrze działać. Później mnożysz znak przez wartości liczbowe... co ta funkcja zwróci?

Tu masz funkcję, która zamieni jednostkę na mnożnik:

long long unit2multiplier(const char *u ) {
	const size_t units_n = 8;
	const char* units[units_n] = { "M", "B", "T", "Qa", "Qi", "Sx", "Sp", "Oc" };
	long long multip[units_n] = { 
		1000000,
		1000000000,
		1000000000000,
		1000000000000000,
		1000000000000000000,
		-1,//1000000000000000000000, // za duże dla long long
		-1,//1000000000000000000000000,// za duże dla long long
		-1,//1000000000000000000000000000// za duże dla long long
	};

	for(int i = 0; i < units_n; ++i)
	{
		if(strncmp(units[i], u, strlen(units[i])) == 0)
			return multip[i];
	}

	return 1;
}

Podumaj jak jej użyć.

 

Inna opcja to funkcja, która zwraca zera w postaci tekstowej:

const char* unit2zeroes(const char *u ) {
	const size_t units_n = 8;
	const char* units[units_n] = { "M", "B", "T", "Qa", "Qi", "Sx", "Sp", "Oc" };
	const char* zeroes[units_n] = { 
		"000000",
		"000000000",
		"000000000000",
		"000000000000000",
		"000000000000000000",
		"000000000000000000000",
		"000000000000000000000000",
		"000000000000000000000000000"
	};

	for(int i = 0; i < units_n; ++i)
	{
		if(strncmp(units[i], u, strlen(units[i])) == 0)
			return zeroes[i];
	}

	return "";
}


//użycie
cout << 4 << unit2zeroes("M") << '\n'; //dla 4M

 

 

0 głosów
odpowiedź 10 października przez shead VIP (141,060 p.)

Jak rozumiem to pewnie nie chce ci działać dla dwu-literowych jednostek, np. 'Qa'? Wynika to z tego, że char mieści jedną literę, a nie dwie

Btw bardziej elegancko by to wyglądało jakoś tak:

int get_val(int val, std::sting unit) {
  static const std::string UNIT = {"M", "B", "T", ...};
  static const int MULTIPLIER = {10000, 10000000, ....}; // mogą się zera nie zgadzac, tylko przyklad idei

  int idx = get_unit_index(unit, UNIT);
  return val * MULTIPLIER[idx];
}
  

 

Podobne pytania

0 głosów
2 odpowiedzi 114 wizyt
+1 głos
2 odpowiedzi 167 wizyt
pytanie zadane 22 czerwca 2016 w Nasze projekty przez obl Nałogowiec (36,130 p.)

41,548 zapytań

80,592 odpowiedzi

159,504 komentarzy

19,827 pasjonatów

Przeglądających: 124
Pasjonatów: 3 Gości: 121

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...