Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα και καλες γιορτές!
Γραφω ενα προγραμμα σε C στο οποιο θελω κατα την εκτελεση του ο χρηστης να μπορει να δωσει μια εντολη τυπου:
function orisma1 orisma2 orisma3.... orismaN
και να καλεσει με αυτον τον τροπο την συναρτηση function με ορισματα τα orisma1,orisma2 κτλ

Ευχαριστω εκ των προτερων για την βοηθεια σας!

  • Moderators
Δημοσ.

Χρειάζεται να κάνεις parse το μήνυμα που θα σου δώσει ο χρήστης και στη συνέχεια να επιλέξεις ποια συνάρτηση θα κληθεί (με πολλαπλά IFs). Δηλαδή αν εγώ γράψω "function1 arg1 arg2", το πρόγραμμα να χωρίζει αυτό που έγραψα σε "function1", "arg1" και "arg2". Στη συνέχεια, το πρόγραμμα να μπαίνει στο if που αντιστοιχεί στο function1 και αφού κάνει τα κατάλληλα casts στα arguments, να καλεί την function1.

  • Like 1
Δημοσ.

Ουσιαστικα θες ενα script. Δηλαδη 3 σταδια, 1 binds 2 parse 3 evaluate.

Ενα πχ σε c++ για προφανεις λογους.

typedef std::vector<std::string> Args;
typedef std::string (*Function)(const Args& args);
std::map<std::string,Function> functionMap;

//bind stage
std::string BindPow(const Args& args)
{
	double base = atof( args[0].c_str() );
	double exp	= atof( args[1].c_str() );
	double result;

	result = std::pow(base,exp); //native
	
	return std::to_string(result);
}

std::string BindPrint(const Args& args)
{
	for(size_t i = 0; i < args.size(); i++)
		std::cout<< args[i];
	return "<void>";
}
std::string BindSin(const Args& args)
{
	double r	= atof(args[0].c_str());
	double result;
	
	result = std::sin(r); //native call

	return std::to_string(result);
}


// parse & evaluate stage

void LetUserCall()
{
	std::string input;
	std::getline(std::cin,input);
	std::stringstream ss(input);

	std::string funcName;
	Args args;
	//format: functionName arg1 arg2 argN
	ss>> funcName;// read functionName
	while(ss)
	{
		std::string arg;
		ss>>arg; // read arg
		args.push_back(arg);
	}

	//find func in functiontable
	auto func = functionMap.find(funcName);
	if(func != functionMap.end()) // if found
	{
		std::string result = func->second(args); // call with args
		std::cout<<result<<std::endl; // print result
	}
	else
		std::cout<<"Fail"<<std::endl;
}

int main()
{
	//init binds
	functionMap["pow"]		= BindPow;
	functionMap["print"]	= BindPrint;
	functionMap["sin"]		= BindSin;

	while(1)
		LetUserCall();
	
	return 0;
}

output

print 121323
121323<void>
print hello
hello<void>
pow 1 1
1.000000
pow 2 2
4.000000
pow 3 2
9.000000
pow 4 2
16.000000
sin 3.1415
0.000093

Δημοσ.

 

Ουσιαστικα θες ενα script. Δηλαδη 3 σταδια, 1 binds 2 parse 3 evaluate.

Ενα πχ σε c++ για προφανεις λογους.

typedef std::vector<std::string> Args;
typedef std::string (*Function)(const Args& args);
std::map<std::string,Function> functionMap;

//bind stage
std::string BindPow(const Args& args)
{
	double base = atof( args[0].c_str() );
	double exp	= atof( args[1].c_str() );
	double result;

	result = std::pow(base,exp); //native
	
	return std::to_string(result);
}

std::string BindPrint(const Args& args)
{
	for(size_t i = 0; i < args.size(); i++)
		std::cout<< args[i];
	return "<void>";
}
std::string BindSin(const Args& args)
{
	double r	= atof(args[0].c_str());
	double result;
	
	result = std::sin(r); //native call

	return std::to_string(result);
}


// parse & evaluate stage

void LetUserCall()
{
	std::string input;
	std::getline(std::cin,input);
	std::stringstream ss(input);

	std::string funcName;
	Args args;
	//format: functionName arg1 arg2 argN
	ss>> funcName;// read functionName
	while(ss)
	{
		std::string arg;
		ss>>arg; // read arg
		args.push_back(arg);
	}

	//find func in functiontable
	auto func = functionMap.find(funcName);
	if(func != functionMap.end()) // if found
	{
		std::string result = func->second(args); // call with args
		std::cout<<result<<std::endl; // print result
	}
	else
		std::cout<<"Fail"<<std::endl;
}

int main()
{
	//init binds
	functionMap["pow"]		= BindPow;
	functionMap["print"]	= BindPrint;
	functionMap["sin"]		= BindSin;

	while(1)
		LetUserCall();
	
	return 0;
}

output

print 121323
121323<void>
print hello
hello<void>
pow 1 1
1.000000
pow 2 2
4.000000
pow 3 2
9.000000
pow 4 2
16.000000
sin 3.1415
0.000093

ευχαριστω πολυ παπι!!

Αν επιτρέπεται, ποιος είναι ο λόγος τέτοιου είδους λειτουργικότητας στο πρόγραμμά σου;

χμμ..βασικα δεν υπαρχει καποιο προγραμμα με συγκεκριμενες προδιαγραφες και λειτουργικοτητες...δοκιμες κανω

Δημοσ.

...

χμμ..βασικα δεν υπαρχει καποιο προγραμμα με συγκεκριμενες προδιαγραφες και λειτουργικοτητες...δοκιμες κανω

 

Α οκ, γιατί διαβάζοντας το αρχικό σου ποστ το μυαλό μου πήγε σε closures, που δεν υποστηρίζονται στη στάνταρ C.

 

Εφόσον δεν πρόκειται για closures ή κάτι παραπλήσιο, δεν μπορώ να σκεφτώ αυτή τη στιγμή για ποιο λόγο ο χρήστης ενός προγράμματος χρειάζεται να γνωρίζει τα εσωτερικά ονόματα των συναρτήσεων και τα ορίσματα που παίρνει η κάθε μια, πόσο μάλλον να τα χρησιμοποιεί κιόλας ως input του προγράμματος.

 

Ο κανόνας είναι να παρουσιάζουμε στον χρήστη μενού επιλογών, με την καθεμιά τους να ζητάει έξτρα input (αν χρειάζεται) κι ανάλογα ποια επιλογή θα διαλέξει ο χρήστης και τι input θα μας δώσει για αυτή την επιλογή, να καλούμε εμείς εσωτερικά την ή τις συναρτήσεις που έχουμε προγραμματίσει για αυτή την επιλογή.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...