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

Kalkulator C++, bez if, switch, else

Object Storage Arubacloud
+1 głos
756 wizyt
pytanie zadane 10 września 2020 w C i C++ przez Nidan23 Nowicjusz (130 p.)

Siema. Potrzebuję pomocy z kalkulatorem w C++. Staram się zrobić takie cudo, które nie zawiera ani if'a ani case'a. Program zapisuje w zmiennej znak, który przedstawia działanie ( "*" lub "/ "lub "+" lub "-"). I myk jest taki, że w jednej linijce chcę wykonać to działanie, wstawiam kod, który bardziej rozświetli to co mam na myśli:

 

#include <iostream>
using namespace std;
int main()
{
	int a, b; // liczby
	char c; // znak działania
	try {
		cout << "Podaj działanie, które chcesz wykonać" << endl;
		cin >> c;
		cout << endl << "Podaj liczbę A" << endl;
		cin >> a;
		cout << endl << "Podaj liczbę B" << endl;
		cin >> b;
		cout << a + c + b;
	} catch (exception)
	{
		cout << "Błąd";
	}
	getchar();
	return 0;
}

Jakieś pomysły? W internetach nic na ten temat nie znalazłem...

komentarz 10 września 2020 przez tkz Nałogowiec (42,000 p.)
A w jaki sposób chcesz sprawdzić rodzaj znaku?
komentarz 10 września 2020 przez Nidan23 Nowicjusz (130 p.)
O to chodzi, że nie sprawdzam. Zakładam, że znak jest jednym z 4 możliwych i staram się znaleźć sposób na to, żeby na podstawie tych 3 zmiennych wykonać działanie. Mój wykładowca mówił, że jest to możliwe przy użyciu tablic, ale nie mogę zrozumieć o co mu chodziło... Najlepsze jest to, że to działa, ale gdy daje 10 * 10 to wypluwa 62 i nie wiem czemu heh
komentarz 10 września 2020 przez Nidan23 Nowicjusz (130 p.)
Próbuje rozkminić co gość miał na myśli, ale coś mi nie wychodzi heh
komentarz 10 września 2020 przez tkz Nałogowiec (42,000 p.)
Nie potrafisz przekształcić tego na kod, czy nie rozumiesz? I które rozwiązanie wybrałeś?
komentarz 10 września 2020 przez Nidan23 Nowicjusz (130 p.)
Wybrałem te z ptaszkiem - pierwsze. Nie rozumiem kompletnie o co mu chodzi, jak zrozumiem to przekształcenie na kod to będzie googlowanie
komentarz 10 września 2020 przez tkz Nałogowiec (42,000 p.)
c==1: [1, 0, 0, 0] c1 = ((c-2) * (c-3) * (c-4)) / -6;
c==2: [0, 1, 0, 0] c2 = ((c-1) * (c-3) * (c-4)) / 2; 
c==3: [0, 0, 1, 0] c3 = ((c-1) * (c-2) * (c-4)) / -2;
c==4: [0, 0, 0, 1] c4 = ((c-1) * (c-2) * (c-3)) / 6;

Wczytujemy zmienną "c", dla każdej wartości zmiennej mamy inny wektor. Wektor, ten wyżej służy jako wyobrażenie działania, które przeprowadzimy na samym końcu.
Zmienne "c1", "c2", "c3", "c4" są faktycznym odzwierciedleniem "filtracji" za pomocą wektorów. 

#include <iostream>

int main()
{
    int a, b, c;
    std::cin>>a>>b>>c;
    int c1 = ((c-2) * (c-3) * (c-4)) / -6;//+
    int c2 = ((c-1) * (c-3) * (c-4)) / 2;//-
    int c3 = ((c-1) * (c-2) * (c-4)) / -2;//*
    int c4 = ((c-1) * (c-2) * (c-3)) / 6;///
    std::cout<<((c1 * (a+b)) + (c2 * (a-b)) + (c3 * (a*b)) + (c4 * (a/b)));
}

Lub mniej matematycznie 

#include <iostream>

int main()
{
    int a, b, c;
    std::cin>>a>>b>>c;
    int tab[4][4]={{1,0,0,0}, {0,1,0,0}, {0,0,1,0}, {0,0,0,1}};
    std::cout<<((tab[c][0] * (a+b)) + (tab[c][1]  * (a-b)) + (tab[c][2]  * (a*b)) + (tab[c][3]  * (a/b)));
}

 

komentarz 11 września 2020 przez Wiciorny Ekspert (270,190 p.)

@Nidan23, to co to za kalkulator? :D 

3 odpowiedzi

0 głosów
odpowiedź 10 września 2020 przez TOM_CPP Pasjonat (22,640 p.)

Możesz użyć mapy.

#include <iostream>
#include <functional>
#include <map>

#define operation(x) []( auto a , auto b ) { return a x b; }

using namespace std;

template< typename T >
map<char,function<T(T,T)>> operations {
                                         {'+' , operation(+) }, {'-' , operation(-) },
                                         {'*' , operation(*) }, {'/' , operation(/) }
                                      };
int main()
{
   int a {0} , b {0};
   char sign {0};
   cout << "Input operation + , - , * , /" << endl;
   cin >> sign;
   cout << endl << "Input first number" << endl;
   cin >> a;
   cout << endl << "Input second number" << endl;
   cin >> b;

   cout << a << " " << sign << " " << b << " = " << operations<int>[sign](a,b) << endl;
   return 0;
}

 

0 głosów
odpowiedź 10 września 2020 przez VBService Ekspert (253,400 p.)
edycja 10 września 2020 przez VBService

Evaluating arithmetic expressions from string in C++

TinyExpr

#include "tinyexpr.h"
#include <stdio.h>

int main()
{
    double answer = te_interp("3*2+4*1+(4+9)*6", 0);
    printf("Answer is %f\n", answer);
    return 0;
}

libmatheval (1.1.11+dfsg-4)

Simple Arithmetic Expression Evaluator

Zastosowanie eval-uacji np.: w php-ie:

index.php

<?php

if($_SERVER["REQUEST_METHOD"] == "POST") {
  if(isset($_POST['calculate_operations'])) {
     $calculate_operations = trim($_POST['calculate_operations']);
     try {
          ob_start();
          eval("echo ".$calculate_operations.";");
          $outcome = ob_get_clean();
          $outcome = "Wynik działania: ".$outcome.PHP_EOL;
     } catch (ParseError $e) {
          $outcome = "<span style='color: red'>Nieprawidłowy zapis działania</span>.".PHP_EOL;
          //$outcome = "Error php: ".$e->getMessage();
     }
  }
} else {
  $outcome = "";
  $calculate_operations = "(7+3.45)*3.257+(5-6)";
}
?>
<!DOCTYPE html>
<html lang="pl">
<head>
    <meta charset="utf-8">
</head>
<body>

  <form method="POST" action="./">

    <h2>Kalkulator</h2>
    <p>Wpisz działanie :</p>
    <p>Dozwolone znaki: + - * / ( ) np.: (7+3.45)*3.257+(5-6)</p>
    <input type="text" name="calculate_operations" style="width: 300px" value="<?php echo $calculate_operations; ?>">
    <input type="submit" value="Oblicz">
    <pre><?php echo $outcome; ?></pre>

  </form>
</body>
</html>

 

0 głosów
odpowiedź 11 września 2020 przez j23 Mędrzec (194,920 p.)
char op = '/';
int a = 2, b = 3;
    
(op - '+' || (std::cout << a + b, 0)) &&
(op - '-' || (std::cout << a - b, 0)) &&
(op - '*' || (std::cout << a * b, 0)) &&
(op - '/' || (std::cout << a / b, 0));

 

Podobne pytania

0 głosów
1 odpowiedź 6,268 wizyt
pytanie zadane 28 lutego 2017 w C i C++ przez Geralt_z_Rivii Nowicjusz (240 p.)
0 głosów
0 odpowiedzi 193 wizyt
pytanie zadane 2 lutego 2021 w C i C++ przez Osama Nowicjusz (140 p.)
0 głosów
2 odpowiedzi 336 wizyt
pytanie zadane 22 sierpnia 2022 w C i C++ przez Daaa22 Dyskutant (8,250 p.)

92,579 zapytań

141,429 odpowiedzi

319,657 komentarzy

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

...