• 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?

Object Storage Arubacloud
0 głosów
312 wizyt
pytanie zadane 9 października 2017 w C i C++ przez ola1234520 Nowicjusz (140 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

0 głosów
odpowiedź 10 października 2017 przez j23 Mędrzec (194,920 p.)
edycja 10 października 2017 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 2017 przez niezalogowany

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
1 odpowiedź 421 wizyt
0 głosów
2 odpowiedzi 1,761 wizyt

92,542 zapytań

141,383 odpowiedzi

319,482 komentarzy

61,929 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!

...