wartość zmiennej jako operacja do wykonania

wartość zmiennej jako operacja do wykonania
T2
  • Rejestracja:prawie 9 lat
  • Ostatnio:prawie 9 lat
  • Postów:4
0

Witam,

mam pytanie odnośnie tego czy jest możliwe użycie wartości zmiennej jako polecenie do programu głównego np.
string m="cin>>n";
chodzi o to, żaby za pomocą zmiennej m użytkownik miał możliwość podania wartości n

Moje pytanie zrodziło się kiedy chciałem stworzyć program, w którym podaje się ciąg poleceń i są one wykonywane dopiero po podaniu ostatniego polecenia w ciągu. Dodatkowo chciałem też dać możliwość podania poleceń w osobnym pliku txt, ale jeżeli da się to zrobić ze zmienną to i z osobnym plikiem nie będzie problemu ;)

Z góry dziękuję za pomoc

kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:2 dni
  • Lokalizacja:Szczecin
0

Prawie na pewno się da, ale ciężko zrozumieć z Twojego posta co konkretnie chcesz osiągnąć


edytowany 1x, ostatnio: kq
T2
  • Rejestracja:prawie 9 lat
  • Ostatnio:prawie 9 lat
  • Postów:4
0

może podam przykład, żeby było łatwiej zrozumieć co mam na myśli:
W programie dany jest losowy ciąg liczb. W moim pliku txt mam podene nazwy funkcji takie jak min, max, add, delete.
przykład zawartości pliku txt
max
add 99
max
min
Teraz chciałbym, aby program był w stanie wykonać te funkcje, jednak moje umiejętności kończą się na pobraniu zawartości pliku, a nie wykonaniu tej zawartości

edytowany 1x, ostatnio: tomtom22
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:2 dni
  • Lokalizacja:Szczecin
1

Jak najbardziej, ale dla newbie to może nie być trywialne. Zacznij od zdefiniowania gramatyki (nie musi być formalnie, ale add przyjmuje u Ciebie argument, a inne rozkazy nie) i podzielenia wejścia na konkretne rozkazy. Potem możesz zająć się przypisywaniem ich do funkcji


T2
  • Rejestracja:prawie 9 lat
  • Ostatnio:prawie 9 lat
  • Postów:4
0

Niestety nie jest to dla mnie trywialny problem.

  1. Prawdę mówiąc dalej nie do końca wiem jak to ma działać, myślałem że będę pobierać całe wiersze z pliku txt i dalej nie wiedziałem co.
  2. Gramatyka będzie tutaj przydatna tylko do sprawdzenia czy składnia polecenia jest poprawna czy ma to jakiś większe znaczenie?
  3. Podzielenie wejścia na konkretne rozkazy, czyli z jednego wiersza jeden rozkaz?(rozkazem będzie np. "add 5"?)
  4. I chyba moje najważniejsze pytanie: jak przypisać do "rozkazu" funkcję która ma się wykonać?
carlosmay
Raczej chodziło o podział wg funkcjonalności: add dodaje coś do programu, amin i max wyszukują.
JA
  • Rejestracja:prawie 9 lat
  • Ostatnio:ponad 7 lat
  • Postów:40
0

Nie wiem, czy na pewno dobrze zrozumiałem o co Ci chodzi:

Kopiuj
 

void DoSomething(int c)
{
     printf("%d\n" , c);
}

int main()
{
    void (*SomeFunction)(int c) = DoSomething;

    SomeFunction(10);
}

Aczkolwiek nie jest to zbyt eleganckie i to jest w C. Samego C++ dobrze nie znam i tam pewnie jest jakis lepszy sposob

edytowany 1x, ostatnio: JohnAmadis
fasadin
jemu chodzi o kalkulator z odwrocona notacja polski. To co tutaj napisales nie ma zadnego powiazania z tym co autor chce ;)
JA
aaa, ok sorry :D
T2
  • Rejestracja:prawie 9 lat
  • Ostatnio:prawie 9 lat
  • Postów:4
0
Kopiuj
 

void max()
{
  int max=tab[0];
  for( int i = 1; i <= 9; i++ ){
    if (tab[i]>max) max=tab[i];
  }
 printf("%d\n" ,max);
}
 
int main()
{
 for( int i = 0; i <= 9; i++ ){
    tab[i]=rand() % 100;
  }
}

plik operacje.txt
max

i teraz chodzi mi, żeby zawartość pliku txt wywoływała odpowiednie funkcje w tym przypadku max. Umiem jedynie wypisać zawartość pliku txt.
Jedyny sposób jaki znam to wywołać max w części main(), a mi zależy żeby na podstawie zawartości pliku txt wykonać odpowiednie funkcję

carlosmay
Najprościej będzie pobierać rozkaz i za pomocą instrukcji warunkowej wykonać odpowiednią funkcję.
fasadin
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
  • Postów:4882
0

w petli robisz tak

pobierasz linie (najlepiej do tego uzyc std::vector)
zapisujesz sobie pierwsze slowo (w sensie pobierasz z std::vector pierwszy element)
robisz switcha na podstawie tego slowa (uzyj std::map bo switch na stringu nie jest fajny... da sie ale nie jest fajny)
w switchu jezeli funkcja potrzebuje argumentow to pobierasz argumenty z tej linii co pobirales (kolejne elementy std::vectora)
wywolujesz funkcje jaka chcesz

az do konca pliku

edytowany 2x, ostatnio: fasadin
carlosmay
  • Rejestracja:prawie 9 lat
  • Ostatnio:około 5 lat
  • Lokalizacja:Pabianice
0

Taki przykład przyszedł mi do głowy:

Kopiuj
#include <iostream>
#include <string>
#include <map>

int add(int a, int b)
{
	return a + b;
}

int subt(int a, int b)
{
	return a - b;
}

int main()
{
	typedef int(*funPtr)(int, int);

	std::map<std::string, funPtr> arrFunPtr;
	arrFunPtr["add"] = &add;
	arrFunPtr["subt"] = &subt;

	int a, b;
	std::string op;

	if (std::cin >> a >> b && file >> op)  // wykonaj jeśli udało się pobrać wszystkie dane
	{
		auto posKey = arrFunPtr.find(op);  // wyszukaj z tablicy asocjacyjnej klucz o wartości pobranej z pliku
		if (posKey != arrFunPtr.end()) // jeśli znaleziono wykonaj funkcję
		{
			std::cout << posKey->second(a, b) << std::endl;
		}
		else
		{
			std::cerr << "Nie ma takiej operacji" << std::endl;
		}
	}
	else
		std::cerr << "Blad wczytywania danych" << std::endl;
} 

edytowany 1x, ostatnio: carlosmay
fasadin
no to teraz zrob funkcje ktora przyjmuje 1 argument a druga przyjmuje klase ;) autor nie podal ze ilosc argumentow bedzie taka sama ciagle
1

Możesz zawsze użyć funkcji, które oferuje ci C++11 i napisać to w tym stylu (to tylko wolna koncepcja, wymagająca poprawek)

Kopiuj
#include <functional>
#include <iostream>
#include <iterator>
#include <map>
#include <sstream>
#include <string>
#include <type_traits>
#include <utility>
#include <vector>


namespace {

struct argument
{
	std::string value;

	operator bool() const { return value == "true"; }
	operator float() const { return std::stof(value); }
	operator int() const { return std::stoi(value); }
	operator std::string() const { return value; }
};

template<typename Result, typename... Args, std::size_t... I>
Result call_impl(Result (*function)(Args...), std::vector<std::string> arguments,
               std::index_sequence<I...>)
{
	return function(argument{arguments[I]}...);
}

}

template<typename Result, typename... Args>
Result call(Result (*function)(Args...), std::vector<std::string> arguments)
{
	return call_impl(function, arguments, std::make_index_sequence<sizeof...(Args)>{});
}

template<typename Result, typename... Args>
std::function<void(std::vector<std::string>)> functor(Result (*function)(Args...))
{
	return [function](std::vector<std::string> arguments) {
		std::cout << call(function, arguments) << std::endl;
	};
}

std::vector<std::string> split(const std::string& str, char delim)
{
	std::vector<std::string> elements;
	std::stringstream stream(str);

	std::string element;
	while (std::getline(stream, element, delim)) {
		elements.push_back(element);
	}

	return elements;
}

int plus(int x, int y)
{
	return x + y;
}

int negate(int x)
{
	return -x;
}

int main()
{
	using functor_type = std::function<void(std::vector<std::string>)>;

	std::map<std::string, functor_type> functions;
	functions["add"] = functor(plus);
	functions["negate"] = functor(negate);

	std::string input;
	while (std::getline(std::cin, input)) {
		if (input == "quit") {
			break;
		}

		std::vector<std::string> parameters = split(input, ' ');

		auto func = functions[parameters[0]];

		parameters.erase(parameters.begin());
		func(parameters);
	}

	return 0;
}
gośćabc
czy pytający zasłużył na to, aby frajer go sfrajerzył?
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)