Funkcje i ich wywoływanie na podstawie danych wprowadzonych z klawiatury

0

Dzień dobry.
Chcę zrobić parę funkcji które mają się nazywać A,B,C. Przyjmijmy, że funkcje są dobrze zaprogramowane.Przykładowy sposób działania programu:

wejscie:
A //jakieś operacje na funkcji
B //jakieś operacje na funkcji
KONIEC //koniec programu

wyjście:
wynik operacji na funkcjach

Tu rodzi się moje pytanie. Jak zrobić a) Po wpisaniu A wywołała sie funkcja A, po wpisaniu B funkcja B itd.(Switch chyba nie wchodzi w grę bo trzeba wpisać cyfrę?)? **b)**Program nie kończył się po wpisaniu jednej funkcji,tylko po wpisaniu KONIEC?

0

Najprościej? Funkcje opakuj w jakieś obiekty Callable a potem wpakuj do mapy string -> callable. Kiedy użytkownik coś wpisze to wyciągniesz z mapy odpowiednią akcje i wykonasz.

0

Jakiś szybki przykład, nawet w pseudokodzie ?

0

hm a może coś takiego:

string slowo = "";

while (slowo != "koniec")
{
    cin << slowo;
   // tu ify które wywołują stosowne funkcje w zależności od tego co w slowo siedzi. Zakładając naturalnie żę "polecenia" kończą się enterem, ale Swith też by go wymagał.
}
 
0

Chodzi mi o najprostsze rozwiązanie, bo to moje początki z programowaniem. To drugie zdecydowanie bardziej mi się podoba, ale czy jest tak samo efektywne ?

0
#include <iostream>

using namespace std;


void funkcja()
{
   int j;
   cin>>j;
}


int main()
{
   int A;   
   cin>>x;

   if (x=A)
   {
      funkcja();
   }
}

Program powinien zadziałać tak: po wpisaniu A, powinno dać się dalej wpisać jakieś dane (cin>>j;), a tak się nie dzieje. Za to gdy w funkcja() zmienię cin >> j; na np. cout<<"sdad"<<endl; , program działa.

wstawienie kodu do posta i jego sformatowanie - fp

0

Nie jest i łamie zasadę Open-Close rule ;) Podałbym przykład, ale nie napisałeś nawet w jakim języku to chcesz, więc padło na pythona...

import sys


class Callable(object):
    def call(self):
        pass


class A(Callable):
    def call(self):
        print("A")


class B(Callable):
    def call(self):
        print("B")


class End(Callable):
    def call(self):
        sys.exit(0)


def main():
    actions = {"A": A(), "B": B(), "koniec": End()}
    while True:
        command = raw_input("Podaj akcje")
        try:
            actions[command].call()
        except KeyError:
            print("Nie ma takiej akcji!")

main()
0

@mlaskmlask: Odróżniaj zmienne od literałów. I wbij sobie do głowy (najlepiej jakimś ostrym narzędziem), że w C/C++ porównanie to ==, a nie =

#include <iostream>
using namespace std;

void funkcja(){
    int j;
    cin>>j;
}


int main()
{
    char x;   
    cin>>x;
    if (x=='A')
    {
        funkcja();
    }
}

up:

if __name__ == "__main__":
    main()

:P

0
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;

void A() { cout<<"A"<<endl; }
void B() { cout<<"B"<<endl; }
void C() { cout<<"C"<<endl; }
void D() { exit(0); }

struct { const char *name; void(*fun)(); } Tb[]=
  {
    {"A",&A},
    {"B",&B},
    {"C",&C},
    {"D",&D},
  };

int main()
  {
   string line;
   while(getline(cin,line))
     {
      for(unsigned i=0;i<sizeof(Tb)/sizeof(*Tb);++i) if(line==Tb[i].name) Tb[i].fun();
     }
   return 0;
  }

Można użyć też mapy ale przed C++11 nie da się ją tak ładnie zainicjalizować

1 użytkowników online, w tym zalogowanych: 0, gości: 1