Untitled

 avatar
unknown
plain_text
9 months ago
3.1 kB
9
Indexable
#include<string>
#include<iostream>
#include<cmath>

bool invalidInput();
void ignoreLine();
double userInputDouble();
int checkValidConversion(std::string_view sv);
double convertAToB(int sizeA, double numOf, int sizeB);
bool smallerThanTwo(std::string_view sv);

double userInputDouble()
{
	double num{};
	while (true)
	{
		std::cin >> num;
		if (invalidInput())
		{
			std::cout << "invalid input\n";
			continue;
		}
		ignoreLine();
		return num;
	}
}

void ignoreLine()
{
	std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
}

bool invalidInput()
{
	if (!std::cin)
	{
		if (std::cin.eof() && std::cin.peek() != '\n')
		{
			std::cerr << "ERROR";
			std::exit(0);
		}
		std::cin.clear();
		ignoreLine();
		
		return true;
	}
	return false;
}

int checkValidConversion(std::string_view sv)
{
	switch (sv[0])
	{
	__fallthrough;
	case'b':
	case'B':
	{
		if (sv[1] == 'i')
		{
			std::cout << "bit...\n";
			return 1;
		}
		else if(sv[1]=='y')
		{
			std::cout << "byte...\n";
			return 2;
		}
		std::cout << "invalid storage type\n";
		return 0;
	}
	__fallthrough;
	case'k':
	case'K':
	{
		std::cout << "kilobyte...\n";
		return 3;
	}
	__fallthrough;
	case'm':
	case'M':
	{
		std::cout << "megabyte...\n";
		return 4;
	}
	__fallthrough;
	case'g':
	case'G':
	{
		std::cout << "gigabyte...\n";
		return 5;
	}
	__fallthrough;
	case't':
	case'T':
	{
		std::cout << "terabyte...\n";
		return 6;
	}
	__fallthrough;
	case'p':
	case'P':
	{
		std::cout << "petabyte...\n";
		return 7;
	}
	default:
		std::cout << "invalid storage type\n";
		return 0;
	}
}

double convertAToB(int sizeA,double numOf,int sizeB)
{
	if (sizeA == 1)
	{
		numOf /= pow(2, 3);
		++sizeA;
	}
	if (sizeB == 1)
	{
		numOf *= pow(2, 3);
		--sizeA;
	}
	if (sizeA < sizeB)
	{
		for (;sizeA < sizeB;++sizeA)
			numOf /= pow(10, 3);
	}
	else if (sizeA > sizeB)
	{
		for (;sizeA > sizeB;--sizeA)
			numOf *= pow(10, 3);
	}
	return numOf;
}

bool smallerThanTwo(std::string_view sv)
{
	if (sv.length() < 2)
		return true;
	return false;
}

int main()
{
	std::string storageSize{};
	while (true)//intentional infinite loop
	{
		std::cout << "Converting A to B, please enter the first 2 characters (e.g. te = terabyte)\nInput A: ";
		std::cin >> storageSize;
		if (smallerThanTwo(static_cast<std::string_view>(storageSize)))
			continue;

		int sizeA{ checkValidConversion(static_cast<std::string_view>(storageSize)) };
		if (sizeA == 0)
			continue;

		std::cout << "Insert number of " << storageSize << "s: ";
		double numOf{userInputDouble()};

		std::cout << "Input B: ";
		std::cin >> storageSize;
		if (smallerThanTwo(static_cast<std::string_view>(storageSize)))
			continue;

		int sizeB{ checkValidConversion(static_cast<std::string_view>(storageSize)) };

		if (sizeB == 0)
			continue;

		std::cout << "the number of " << storageSize << "s is: " << convertAToB(sizeA, numOf, sizeB) << '\n';
	}


	return 0;
}
Editor is loading...
Leave a Comment