Nieskończona ilość znaków w kalkulatorze

Witam, jestem początkującym programistą. Niedawno w szkole skończyliśmy pascal i zaczęliśmy c++ który bardzo mi się spodobał. W szkole program realizujemy bardzo wolno więc postanowiłem sam się kształcić w tym kierunku. Ostatnio napisałem kilka programów z pętlą i zaczynam tablice. I tu rodzi się moje pytanie, w jaki sposób napisać kalkulator na nieskończoną ilość znaków? Na początku deklaruje się ile liczb chcemy zsumować lub pomnożyć i tyle liczb wprowadzamy. Nie chcę aby ktoś mi gotowca pisał, tylko wytłumaczył ponieważ nie znalazłem odpowiedzi ani na forum ani w wyszukiwarce. Pozdrawiam :slight_smile:

Największa liczba możliwa w C++ to 18 446 744 073 709 551 615, zapisana w zmiennej typu unsigned long long int. Jeżeli chciałbyś przechowywać nieograniczoną liczbę znaków musiałbyś operować na stringach.

A jak stworzyć program w którym określam liczbę wprowadzonych danych, przyjmijmy że maksymalnie będzie to 1000 i mogę wprowadzić raz 10, czasem 3 itd. Czy możliwa jest taka opcja?

int a;

cin>>a;

int b[a];

Oraz czy mógłbyś mi mniej więcej naszkicować jak to powinno wyglądać?

int a;

cin >> a;

int* b = new int[a];

//coś tam robisz

delete[] b; //na koniec dobrze jest zwolnić pamięć

Albo lepiej używać np. std::vector i nie przejmoać się obsługą pamięci :smiley:

Najwieksza to jest nieskończoność zapisana na zwykłym float’cie :wink:

Są też dostępne darmowe bilioteki do obsługi liczb o “dowolnej” (zawsze jesteś ograniczony ilością pamięci) precyzji, mozesz też samemu napisać taką obsługę (na stringu to chyba jedna z najmniej wydajnych implementacji).

Poczytaj o dynamicznej alokacji pamięci, operatorach new, delete, new[] i delete[]. Uczysz się z jakiejś książki lub kursu na stronie internetowej?

Nie, nie jest to poprawny kod.

Aktualnie z kursu http://wsi.edu.pl/~sistudem/Podstawy/CPPindex.html i chciałem spróbować napisać właśnie owy kalkulator, ale za mało wiem żeby taki program sobie wyobrazić. Uważam że książki stworzone do szkoły są bez sensu i zawierają dużo zbędnych informacji i ogólnych opisów. Czy mógłby ktoś mi naszkicować taki kalkulator? Chodzi mi głównie o to że jak już określę ilość danych w tablicy to jak później po kolei to wprowadzić?

Podałeś indeks jakiegoś kursu, powiedz konkretnie o jaki kalkulator ci chodzi.

Jeśli chciałbyś sobie zrobić kalkulator podstawowy, bez kolejności wykonywania działań, zapisu etc

zadeklaruj zmienną string (to będzie twoje działanie)

zadeklaruj 2 zmienne int (jedna wynik=0, druga do konwersji)

pobierz zmienną string

jeśli jest + dodaj druga do wyniku (porównujesz funkcją strcmp)

analogiczne - / *

jeśli = wyświetl wynik i wyzeruj go

jeśli dojdzie dotąd: zamień string na liczbę i zapisz do zmiennej druga

Co do ostatniego pkt:

string pobierany ;

int druga;

sscanf(pobierany.c_str(), "%d", &i);

Jak napiszesz sobie wg tego algorytmu, nie potrzebujesz tablicy, pobierania ilości znaków.

Chcąc dodać kolejność wykonywania działań, musisz skorzystać z tablic / tablic dynamicznych, zapisać całe działanie, po czym przeszukiwać kolejne działania, wykonywać je po kolei i zapisywać w ich miejsce i tak w kółko (za dużo zachodu, napiszesz taki jak nauczysz się list)

Kurs był do pytania kolegi wyżej z czego się uczę. Napisałem już, chodzi mi o kalkulator na liczbę znaków którą ja chcę sobie wybrać.

Po włączeniu pyta nas ile liczb chcemy wprowadzić, następnie wprowadzamy dwie liczby i pyta nas jakie działanie chcemy zastosować i wybieramy przyjmijmy że dodawanie. Następnie pyta nas co kolejną liczbę jakie działanie mamy zastosować.

Przyjmijmy:

cout<<"Podaj liczby \n";

cin>>a;

cin>>b;

c=a+b;

cin>>d;

e=c*d;

Coś w tym stylu. Oczywiście wiem że ten kod jest niepoprawny, ale chciałem Wam naszkicować tylko o co mi chodzi. :slight_smile:

cout<<"Podaj ile razy: ";

unsigned N;

cin>>N;

while(N--)

  {

   cout<<"Podaj operacje: ";

   ...

  }

Przykładowy kalkulator

#include 


int main()

{

	int w = 0;

	std::cin >> w;

	for(;;)

	{

		char op;

		std::cin >> std::ws >> op;

		if(op == '=')

			break;

		int x;

		std::cin >> x;

		switch(op)

		{

			case '+': w += x; break;

			case '-': w -= x; break;

			case '*': w *= x; break;

			case '/': case ':': w /= x; break;

			case '%': w %= x; break;

		}

	}

	std::cout << w;

	return 0;

}

Wpisujesz działanie w postaci liczba operator liczba operator…, ostatnim operatorem musi być = np.

10 * 2 - 5 : 3 + 7 =

Nie przestrzega kolejności wykonywania działań.

Do nauki polecam:

Miłej zabawy :smiley:

Dziękuję:)

Up: Nie lepiej deklarować standard na początku? Czy to ma jakieś znaczenie? Ja standard std zawsze deklarowałem po bibliotekach.

using namespace std;

Zależy od kompilatora, bez tego np visual ci nie przepuści, ale większość innych już tak.

Jak Ci wygodniej.

Są to tzw. przestrzenie nazw, przydają się gdy masz bardzo dużo nazw. Zwykle biblioteki używają jakiejś swojej przestrzeni nazw, żeby uniknąć konfliktu z innymi bibliotekami. std to przestrzeń nazw tzw. biblioteki standardowej (biblioteka to co innego niż nagłówek, biblioteki mogą używać wielu nagłówków).

???

dla visuala:

using namespace std;

cin

===

std::cin

!=

cin -> error

a np w dev (przynajmniej tym starszym, dawno nie używałem) samo cin zadziała, a dodając namespace dostaniesz error :slight_smile:

A bardziej po ludzku?

Nie ma to jak powoływać się na prehistoryczne środowisko :wink:

Podobno ostatnio jakaś aktualizacja wyszła ^^

Nie wyszła :wink:

wxDev-C++ i Orwell Dev-C++ są forkami rozwijanymi przez inne zespoły. Oryginalny Dev-C++ jest od dawna nierozwijany, a drobok wspomniał, że używał starszego Deva.