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

μαθηματική συνάρτηση στη C


dimitris2006

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

Δημοσ.

καλησπερα, κανω μια εργασια σε C η οποια εχει ενα δυσκολο κομματι που θα ηθελα βοηθεια. θελω να εισαγω μια μαθηματικη συναρτηση στο προγραμμα και να βρισκω το αποτελεσμα για καποιες τιμες του αγνωστου Χ. Ο καθηγητης μας ειπε οτι μπορουμε καθε φορα που τρεχει το προγραμμα να εισαγουμε εμεις στον κωδικα την συναρτηση. αλλα και παλι πως ειναι αυτο δυνατον; καμια ιδεα για βοηθεια;

Δημοσ.

οχι εννοω για μαθηματικη συναρτηση. πχ να δινεται η συναρτηση f(x)=x^2+sin(x)

 

αυτο που θελω να κανω ειναι να βρισκω την τιμη της συναρτησηςf(x) για χ=με εναν αριθμο.

 

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

Δημοσ.

ναι. απο το πληκτρολογιο να δινεται ο τυπος της μαθηματικης συναρτησης και στο προγραμμα να εμφανιζεται η λυση.

απλα, ξανατονιζω οτι μας ειπε πως μπορουμε αν θελουμε, κατα τη διαρκεια της παρουσιασης να εισαγουμε τον τυπο της συναρτησης στον κωδικα. δηλαδη να κανουμε καποια τροποποιηση αναλογως την εκαστοτε συναρτηση ωστε να παρουμε το αποτελεσμα

  • Moderators
Δημοσ.
οχι εννοω για μαθηματικη συναρτηση. πχ να δινεται η συναρτηση f(x)=x^2+sin(x)

 

αυτο που θελω να κανω ειναι να βρισκω την τιμη της συναρτησηςf(x) για χ=με εναν αριθμο.

 

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

 

Αν την συνάρτηση την δίνετε στην είσοδο τότε ενδεχομένως να θέλει να του φτιάξετε ένα parser για συναρτήσεις που θα αντικαθιστά τους αγνώστους (εδώ τον χ) με τις τιμές που δίνετε επίσης στην είσοδο και υπολογίζει το αποτέλεσμα (το f(x)). Μου φαίνεται αρκετά πολύπλοκο αυτό γιατί ο parser θα πρέπει να είναι κάτι σαν advanced calculator (όχι ότι δεν έχει δοθεί τέτοια άσκηση στο παρελθόν και σε πρώτο μάλιστα έτος C).

 

Αν θέλει οι συναρτήσεις να είναι hardcoded και να επιλέγει από ένα αριθμό συναρτήσεων αυτό μπορεί να γίνει με μια παράμετρο στην είσοδο και στον κώδικα με switch πάνω στην παράμετρο και cases που θα καλούν διαφορετική συνάρτηση.

 

Έχω την εντύπωση ότι κάτι χάνω από την εκφώνηση. Σας την έχει δώσει κάπου ολοκληρωμένη;

Δημοσ.
Αν την συνάρτηση την δίνετε στην είσοδο τότε ενδεχομένως να θέλει να του φτιάξετε ένα parser για συναρτήσεις που θα αντικαθιστά τους αγνώστους (εδώ τον χ) με τις τιμές που δίνετε επίσης στην είσοδο και υπολογίζει το αποτέλεσμα (το f(x)). Μου φαίνεται αρκετά πολύπλοκο αυτό γιατί ο parser θα πρέπει να είναι κάτι σαν advanced calculator (όχι ότι δεν έχει δοθεί τέτοια άσκηση στο παρελθόν και σε πρώτο μάλιστα έτος C).

 

Αν θέλει οι συναρτήσεις να είναι hardcoded και να επιλέγει από ένα αριθμό συναρτήσεων αυτό μπορεί να γίνει με μια παράμετρο στην είσοδο και στον κώδικα με switch πάνω στην παράμετρο και cases που θα καλούν διαφορετική συνάρτηση.

 

Έχω την εντύπωση ότι κάτι χάνω από την εκφώνηση. Σας την έχει δώσει κάπου ολοκληρωμένη;

 

το μαθημα ειναι μαθηματικο. αυτος ζητησε καποια κεφαλαια που καναμε να τα μετατρεψουμε σε γλωσσα C. μερος της υλης ειναι και αυτο που ζητησα.

 

να επισημανω οτι αυτος δεν θα εξετασει τον κωδικα (μαθηματικος δε ξερει απο προγραμαμτισμο). θα δει μονο αποτελεσματα.

 

 

να πω λιγο και αυτο που σκεφτηκα εγω. πχ στην παρουσιαση μας δινει το f(x)=x^2+sin(x) . εγω μπορω να μετρησω εκεινη την ωρα ποσες πραξεις εχουμε στον τυπο και να δημιουργησω τις αναλογες θεσεις σε εναν πινακα ωστε στο τελος να τις προσθεσω. αν λοιπον εδινε το παραδειγμα που ανεφερα πιο πανω για χ=5 θα εφτιαχνα 2 θεσεις πινακα. θα εβαζα ρ1=5^2 ρ2=sin(5) . στο τελος θα τα κανω προσθεση και θα εχω το αποτελεσμα.

 

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

Δημοσ.

Υπάρχει ένα πλήθος συναρτήσεων που μπορεί να σας ζητήσει? Δηλαδή μία από 20? Αυτό μπορεί να γίνει με ένα δείκτη σε συνάρτηση, προσπαθώ να φτιάξω αυτό που κατάλαβα πρίν, αν έχω αποτελέσματα θα ενημερώσω...

  • Moderators
Δημοσ.

να πω λιγο και αυτο που σκεφτηκα εγω. πχ στην παρουσιαση μας δινει το f(x)=x^2+sin(x) . εγω μπορω να μετρησω εκεινη την ωρα ποσες πραξεις εχουμε στον τυπο και να δημιουργησω τις αναλογες θεσεις σε εναν πινακα ωστε στο τελος να τις προσθεσω. αν λοιπον εδινε το παραδειγμα που ανεφερα πιο πανω για χ=5 θα εφτιαχνα 2 θεσεις πινακα. θα εβαζα ρ1=5^2 ρ2=sin(5) . στο τελος θα τα κανω προσθεση και θα εχω το αποτελεσμα.

 

Αυτό που λες, ενδεχομένως να δούλευε για απλή πρόσθεση, αλλά και πάλι θα έπρεπε κάπως να καταλαβαίνει το πρόγραμμα τι επιμέρους πράξεις έχεις (να καταλαβαίνει τους τελεστές και τα operands- εδώ τη δύναμη και το sin). Αν είχες όμως αφαιρέσεις, πολ/σμους, διαιρέσεις και παρενθέσεις τότε τι κάνεις; Ή ακόμα χειρότερα παραγώγους και ολοκληρώματα;

Δημοσ.

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

  • Moderators
Δημοσ.

Αυτό που ήθελα να πω ήταν ότι πρέπει να σας δώσει σαφή εκφώνηση/προδιαγραφές για να ξέρετε και τι ακριβώς θα πρέπει να κάνετε και το βαθμό πολυπλοκότητας της υλοποίησης.

Αλλιώς θα κάνετε μπακάλικες λύσεις που ενδεχομένως δε θα δουλέψουν για όλες τις πιθανές εισόδους ή θα είναι σε λάθος κατεύθυνση.

Δημοσ.

μωρέ θα πάρεις το input string, θα αφαιρέσεις το whitespace και θα το κάνεις parse και θα γίνονται οι πράξεις, παίζει να σου κάνω ενα μη ολοκληρωμένο παράδειγμα αργότερα όταν φάω για να καταλάβεις.

 

edit: βασικά υπάρχουν lib's για την δουλειά απλά χρησιμοποιησε μια μιάς και δεν θέλει κώδικα..

 

http://warp.povusers.org/FunctionParser/

Δημοσ.

Τονίζω ότι είμαι αρχάριος στη C αλλά θα προσπαθήσω να βοηθήσω...

>
#include <stdio.h>
#include <math.h>
int main(void){
int ch[20], i, a, b, f, pl, k, integ[10], j ; /* protimousa malloc() alla den to brika pws */
ch[1] = getchar();
i = 1;
while(ch[i] != '\n'){
i++;
ch[i] = getchar();
}
i = 1;
while (ch[i] != 'f' && ch[i+1] != '(' && ch[i+2] != 'x' && ch[i+3] != ')' && i<=20) i++; /* gia na brw tin arxi */
if(i=20) {
printf("Error");
return 1;
}
while(ch[i]==' ')
i++;
i--;
for(j=0;j<10;j++) integ[j] = 0;
pl = 0;
f = 0;
j = i;
while(i<=20){
while(ch[i]>='0' && ch[i]<=9){
	if(!(ch[i-1]>='0' && ch[i-1]<=9))
		a = i;
	if(!(ch[i+1]>='0' && ch[i+1]<=9)){
		b = i;
		k = a;
		while(b-k + 1 > 0){
			integ[pl] = integ[pl] + strtoi(ch[i]) * pow(10, k-a)  ;
			}
		pl++;
	}
	i++;
	}
	if(pl == 0){
		f = integ[pl];
		}
}
for(j=0;j<10;j++){
	if( ch[j+1] == '-')
		f = f - integ[j+1];
	else if ( ch[j+1] == '*')
		f = f * integ[j+1];
	else if ( ch[j+1] == '/')
		f = f / integ[j+1];
	else if ( ch[j+1] == '^')
		f = pow(f, integ[j+1]);
}
}

 

Δεν λειτουργεί ακόμα όπως περίμενα, χρειάζεται να αποθηκεύει την συνάρτηση και μετά να τη χρησιμοποιεί για κάθε x που θα βάζεις, πιστεύω να βοήθησα λίγο..

Δημοσ.

Έκατσα και ασχολήθηκα 1 ώρα... έτσι για πλάκα, παραθέτω αυτό αν

θές να πάρεις μια ιδέα

http://en.wikipedia.org/wiki/Shunting_yard_algorithm

υλοποίηση αυτού είναι so far... αλλά μόνο για () και + - * /

μπορείς από κει και πέρα να κάνεις process το queue και να προστέσεις

τις άλλες πράξεις (βαριόμουν να κοιτάξε τις προταιραιότητες) και τις συναρτήσεις

 

πάντως για το trial string δουλέυει μια χαρούλα (δεν έκανα test και πολύ)

μπορεις να εξακριβώσεις πάντως testing στο:

http://www.chris-j.co.uk/parsing.php

 

 

>
#include <iostream>
#include <string>
#include <stack>
#include <queue>
#include <iostream>
#include <sstream>
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>

/*
* get the result of an input string
* representing a mathematical expression
*/

int
evaluate (std::string input)
{

 char i (0);
 std::string s;
 float ret (0);
 std::stack < std::string > ops;
 std::queue < std::string > out;


 //remove whitespace
 for (i = input.length (); i >= 0; i--)
   if (input[i] == ' ')
     input.erase (i, 1);

 std::stringstream ss;
 ss << input;
 //dumbed down bersion of the Shunting yard algorithm!
 /* start Shunting-yard algorithm */
 while (!ss.eof ())
   {
     i = ss.get ();
     if (isdigit (i))
{
  s.append (1, i);
  while (isdigit (ss.peek ()))
    s.append (1, ss.get ());
  out.push (s);
  s.clear ();
}

     else if ((i == '+') || (i == '-') || (i == '*') || (i == '/'))
{
  if (ops.empty () == false)
    if ((ops.top () == "*") || (ops.top () == "/"))
      {
	out.push (ops.top ());
	ops.pop ();
      }
  s.append (1, i);
  ops.push (s);
  s.clear ();
}
  
     else if (i == '(')
{
  s.append (1, i);
  ops.push (s);
  s.clear ();
}
     else if (i == ')')
{
  while (ops.top () != "(" && (ops.size () > 0))
    {
      out.push (ops.top ());
      ops.pop ();
    }
  if (ops.size () == 0)
    {
      std::cout << "mismatching parenthesis\n exiting\n";
      exit (0);
    }
  if (ops.top () == "(")
    ops.pop ();
}
   }

 while (ops.size () > 0)
   {
     if ((ops.top () == "(") || (ops.top () == ")"))
{
  std::cout << "mismatching parenthesis\n exiting\n";
  exit (0);
}
     out.push (ops.top ());
     ops.pop ();
   }
/* end Shunting-yard algorithm */

    while (out.empty() == false){
    std::cout << out.front() << " ";
    out.pop();
    } 
 return ret;
}


int
main (int argc, char **argv)
{
 evaluate ("3+4* 2/(1-5) *2 *3");
 return 0;
}

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...