Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

Javada equaiton solver


raider

Öne çıkan mesajlar

Selam arkadaşlar. Şimdi benim istediğim şey şöyle bişey olucak. Klavyeden String olarak bi equation girilecek. örneğin:
3sinx – x2
ki buda bilgisayara söyle giriliyor:
3 * sin x – pow x 2

bunu bir şekilde işlem haline getirmeliyim.sanırsam söyle olucak.misal çarpma işareti gördüğünde, kendinden bir öncekiyle kendinden bir sonrakini çarpıcak.bu şekilde equation elemanları bitene kadar bunları tekrarlayacak.fakat bunu nasıl kod olarak yazıcam çözemedim. Java bilen arkadaşlardan yardım ve destek bekliyorum :)
Link to comment
Sosyal ağlarda paylaş

genelde işlemler bilgisayara queue olarak giriliyor. Tabi queue olarak girenler işlem operatörleri. Bir çeşit bir öncelik tanımlaman lazım işlemler arası

çünkü adam

5*5+5 dediğinde önce toplamayı değil çarpmayı yapmalı. Yani sadece operatörleri ekrandan okuma seviyesinde bir olay değil.
Queue'ya ekrana girilen satırı okudukça, tüm olası operatörleri ve parantezleri sokuyorsun fakat çıkarırken sırayı gözetmek adına nasıl bir yol izliyordun tam hatırlamıyorum biraz düşünmem lazım :p
Link to comment
Sosyal ağlarda paylaş

Precedence deniyo buna. Islem sirasi.
Eger wikipedia'da aratirsan neyin onceligi vardir sana gosterir.
Recursive olarak yapman programi isine gelir.
Soyle ki,
string'i alip oncelik sirasina gore aratirsin, mesela "=" bunun onceligi en sondur. "sin"in onceligi "*"dan oncedir. Diyelim ki kullanacagimiz islemler sadece bunlar: ['sin', '*', '"'].
Once string'de sin var mi diye bakiyourz. Varsa calculateSin(x) diye bi fonksiyon yazarsin, gider double return eder. Bunu "sin x" degerinin yerine yazarsin. Sonra equation solver'da yeni string'i verirsin. Ayni islem tek bir sayi kalincaya kadar tekrarlanir.
http://en.wikipedia.org/wiki/Order_of_operations
Bu adreste var listesi:
1 	()   []   ->   .   :: 	Grouping, scope, array/member access
2 ! ~ ++ -- - + * & sizeof type cast (most) unary operations, sizeof and type casts
3 * / % Multiplication, division, modulus
4 + - Addition and subtraction
5 << >> Bitwise shift left and right
6 < <= > >= Comparisons: less-than, ...
7 == != Comparisons: equal and not equal
8 & Bitwise AND
9 ^ Bitwise exclusive OR
10 | Bitwise inclusive (normal) OR
11 && Logical AND
12 || Logical OR
13 ?: Ternary operator
14 = += -= *= /= %= &= |= ^= <<= >>= Assignment operators

Senin isine yarayacaklar () / * - + % ^(ya da pow) muhtemelen.

"(" ")" icin
String'i " " (bosluk) karakterine gore ayir. "(" gordugun zaman ")" bunu ara. Sonra aradaki her seyi "main" fonksiyonuna yolla, return edeni string'in dogru yerine yaz ve bu sefer hepsini main'e yolla.

"/" icin
Sembolu gordugun index'in bir oncesini ve bir sonrasini division() fonksiyonuna yolla, gelen cevabi orjinal String'deki dogru yerle replace et. Tekrar main'e yolla.

vs. vs. anladin?
Link to comment
Sosyal ağlarda paylaş

Oda bir problem ama asıl problemim ,string'i işlem haline getirmek.misal x in ikinci kuvvetini "pow x 2 " olarak string şekline girdim diyelim.öncelikle bu string'i ilk chardan sonuna kadar aratmam lazım. ilk olarak p yi bulucak. sonra o ve w yi bulacak. off fena halde kafam karışmış bulunmata.
Link to comment
Sosyal ağlarda paylaş

Java'da her sey cok koolay yahu sakin ol.

Programi ben olsam su sekilde yapardim, islem onceligi nasil? 1- pow 2- carpi bolu 3- arti eksi

str alacagin string diyelim

while (str.indexOf("pow") != -1) loopuyla powlari hallediceksin. indexofun dondurecegi sayi, pow'un p sinin indexidir. ona gore ayarlayip kacinci poweri oldugunu hallediceksin. isin icine parantez girmedigini varsayarak yaziyorum bu algoritmayi belirteyim.

sonra while str.indexOf("*") || / yapicaksin iste, o islemi yapicaksin. yine dondurecegi indexin operatorun indexi oldugunu dusunerek, oncesini sonrasini alicaksin, alma islemini de soldaki sayi icin 0-9 gordukce sola git seklinde yapip o aranin substringini alarak yapabilirsin mesela, sag icin de saga giderek.

+ ve - yukaridakiyle ayni sekilde.

Yukaridaki her while loopunun sonunda, islemi bitirdiginde tum kullandigin sayi ve operatorun yerine o kismi yazicaksin. onu da soyle yapabilirsin. ornegin pow x2 yi yaptin ve bu 5 indexinde basliyor, uzunlugu da gorecegin uzere 6:

str = str.substring(0,5) + sonuc + str.substring(11);

yapicaksin, oh mis.
Link to comment
Sosyal ağlarda paylaş

Sanırım anladım gibi. :) saolun. başka bilemediklerim olursa yazarım :P. ki daha bu denklemin köklerini vs bulucam.


bu arada bu proje gibi bişey.okulumun yaz okulu olmadığı için, başka bir okuldan ders alıyorum.(data structures) dersin içeriği ve gerektirdiği Prereqs biraz farklı oluğunan zorlanıyorum.
Link to comment
Sosyal ağlarda paylaş

StringTokenizer diye bir class var, ben onu kullaniyorum dille ilgili islemlerde kelime vs ayirirken, onu da kullanabilirsin.

String str = bilmemne

StringTokenizer tokens = new StringTokenizer(str);

space t ve n olanlari ayiriyo bu. nextToken() diyerek falan alabiliyorsun.

veya StringTokenizer tokens = new StringTokenizer(str, "+");

diyorsun, + lardan ayiriyor.. gibi
Link to comment
Sosyal ağlarda paylaş

Son sorum geliyor , bunuda çözersem olay tamamdır. :) şimdi hoca demişki;


Finding a solution to equations of the form f(x) = 0 is one of the important problems of numerical analysis. If it is known that f is continuous and it has two points low and high such that f(low) and f(high) have opposite signs, a root must exist between low and high, which can be found using binary search. At each iteration, binary search checks the function value at the midpoint of the [low, high] interval. If a zero (f(x) = 0) is encountered, the algorithm terminates. Otherwise, low and high are updated in a way dictated by the function value at the midpoint and the execution proceeds with the next iteration

mesela "x3 + -10.0/5*/" denklemine göre düşünürsek

Burada yapmam gereken herhangi 2 sınır alıp,(-1000,1000)bunların midpointini(0) x'in yerine koyup.çıkan sonucun işaretine göre yeniden midpointle sınır oluşturmak oluyor deilmi?
Link to comment
Sosyal ağlarda paylaş

f(low) ile f(high) 'in -/+ olmasi gerekiyo, low ile high'in degil, buna dikkat et.

Diyo ki, eger f(x)=0 olmussa, eger ki low ve high diye iki sayi, f(low) ve f(high) hesaplandiginda farkli sign'lara sahiplerse o iki sayi arasinda mutlaka bi kok bulunmali.

Son paragrafta soyledigin dogru. Her seferinde ihtimallerin yarisini elemis oluyosun ki buna binary search deniyo.

pseudo

findRoot(low, high) alacak. Daha sonra

midPoint=(low+high)/2
if( f(midPoint) == 0)
return null;
else if( f((midPoint+high)/2) == 0 )
return findRoot(low, (midPoint+high)/2))
else
return findRoot((midPoint+high)/2), high)




gibin...
Link to comment
Sosyal ağlarda paylaş

Hala yazdığım bu kök bulma olayında sorun var sanırım. mesela x * x * x - 27 nin kökünü bulurken , x * x - 4 ü bulmamakta.


while(solved==false){

midpoint=(low+high)/2;
if((f(midpoint)==0)
solved=true;
System.out.println("Root of the equation is : "+midpoint);
}
else if(f(midpoint)>0){
high=midpoint;
}

else if(f(midpoint)<0) low=midpoint;
}

Link to comment
Sosyal ağlarda paylaş

×
×
  • Yeni Oluştur...