Favorilerine Ekle | Giriş Sayfan Yap | Tavsiye Et

 

Kurs Tanıtım Sayfası | Süper Üye Kimdir? | Menü Tasarımı Konulu Örnek Ders
Kod İndir| Hazır Kodlar | Makaleler| İpuçları | VB .NET Kursu | Dersler | Forum | Alt Bölümler | Servisler
    Merhaba Misafir
    anasayfa » visual basic makaleleri » Bir metin içinde bulunan 4 işlem hesabını yapar
Üye Girişi
Kullanıcı Adı:  
Şifre : 
Kaydet ?
Siteden tam olarak faydalanabilmek için üye olmalısınız.
Unuttuğunuz şifrenizi öğrenebilmek için kayıt sırasında verdiğiniz Hatırlatma Cevabı'nı bilmeniz gereklidir.
Şifre hatırlatma işlevini sadece 3 defa kullanma hakkınız vardır.
Kullanıcı adını ve şifresini unutan üyelere email ile yardım verilmez.

Aktivasyon Gelmedi mi?Aktivasyon mesajınız email adresinize gelmedi mi?
Buraya tıklayarak bir kez daha aktivasyon mesajı gönderilmesini sağlayabilirsiniz.
Lütfen email hesabınızın BULK ve SPAM klasörlerini de kontrol ediniz.
Rastgele Makale

İKİ PC ARASINDA İLETİŞİM YAPMAK VE KARŞIDAKİ BİLGİSAYAR HAKKINDA BİLGİ EDİNMEK

Yazar: aarslan

Webmasterlar
Sitenize Ekleyin!
Sitenizde "Son Eklenen 10 Visual Basic Yazısı"'nı göstermek ve içeriğini zenginleştirmek için buraya tıklayınız.

Vbasicmaster.com'a link verin!
Aşağıdaki minik banneri sitenize eklemek için tıklayın!

Üye Sayısı:
Ziyaretçiler nerede?
Yayın № : 7480
Yayın Tar:08.08.2006
Yazar : Ramci
Hit :3774

Bu Yazarın Yazıları Sadece bu yazarın  göster
Bu Yazıyı Tavsiye Et

Option Explicit

'Forumda bir arkadas sormustu bende uzerine biraz dusundum
'ramci_geliyo@hotmail.com


Private Sub Form_Load()

Debug.Print "Hesaplanan : "; Calculator("4-(8*4-(1*2)*4)*4/32+41-55+5*4/2"), "Gercek : "; 4 - (8 * 4 - (1 * 2) * 4) * 4 / 32 + 41 - 55 + 5 * 4 / 2

End Sub

Private Function Calculator(OperationLine$) As String

'Parantezleri acip
'saf islem satirlarini PureCalculation
'fonksiyouna gonderir
Dim LeftBracketPlace%, RightBraketPlace%
Dim TempOperationLine$, PureValue As Double

'Sag parantez yerini bul
RightBraketPlace = InStr(1, OperationLine, ")")
If RightBraketPlace > 0 Then
'Sol parantez yerini bul
LeftBracketPlace = InStrRev(OperationLine, "(", RightBraketPlace) + 1
'parantezler icindeki islem satirini al
TempOperationLine = Mid(OperationLine, LeftBracketPlace, RightBraketPlace - LeftBracketPlace)
'saf islem satirini hesapla
PureValue = PureCalculation(TempOperationLine)
'hesapladigini eskisi ile degistir
OperationLine = Replace(OperationLine, "(" + TempOperationLine + ")", CStr(PureValue))
'yeni islem satirini hesapla
Calculator = Calculator(OperationLine)
Else
'parantez yok ise saf islem satirini hesapla
Calculator = PureCalculation(OperationLine)
End If

End Function

Private Function PureCalculation$(OperationLine$)

'Saf islem satirlarini hesaplar
Dim OC%, COP%, CO$
'OC operator sayaci
'COP gecerli operator yeri
'CO gecerli operator
Dim OPB%, OPA%
'OPB onceki operator yeri
'OPA sonraki operator yeri
Dim V1$, V2$
'V1 ilk degisken
'V2 ikinci degisken
Dim TO1$, TO2$
'TO1 bulunan ikli islem
'TO2 bulunan ikli islemin hesaplanmis degeri

OperationLine = Replace(OperationLine, ",", ".")
OperationLine = Replace(OperationLine, "+-", "-")
OperationLine = Replace(OperationLine, "--", "+")
For OC = 0 To 3
'gecerli operatoru belirle
Select Case OC
Case 0
CO = "/"
Case 1
CO = "*"
Case 2
CO = "-"
Case 3
CO = "+"
End Select
'gecerli operatorun islem satirindaki yerini bul
COP = InStr(2, OperationLine, CO)
If COP > 0 Then
'onceki islemi bul
OPB = OperationPlaceBefore(OperationLine, COP)
'degiskeni al
V1 = Mid(OperationLine, OPB + 1, COP - OPB - 1)
'sonraki islemi bul
OPA = OperationPlaceAfter(OperationLine, COP)
'diger degiskeni al
V2 = Mid(OperationLine, COP + 1, OPA - COP - 1)
'islem satirindaki ikili islem budur
TO1 = V1 + CO + V2
'bu islem satirindaki ikili islemi hesaplat
Select Case OC
Case 0
TO2 = CStr(Val(V1) / Val(V2))
Case 1
TO2 = CStr(Val(V1) * Val(V2))
Case 2
TO2 = CStr(Val(V1) - Val(V2))
Case 3
TO2 = CStr(Val(V1) + Val(V2))
End Select
'hesaplanan degeri eskisi ile degistir
'sonra tekrar hesaplat
PureCalculation = PureCalculation(Replace(OperationLine, TO1, TO2))
Exit Function
End If
Next OC
'hic islem kalmadi ise saf sayi kalmistir
PureCalculation = OperationLine

End Function

Private Function OperationPlaceBefore%(OperationLine$, OperationPlace%)

'Bir islem yerinden hemen
'once gelen islem yerini bulur
Dim OP%(3), TC$

'Sirasi ile onceki islem yerlerini bul
OP(0) = InStrRev(OperationLine, "*", OperationPlace - 1)
OP(1) = InStrRev(OperationLine, "/", OperationPlace - 1)
OP(2) = InStrRev(OperationLine, "+", OperationPlace - 1)
OP(3) = InStrRev(OperationLine, "-", OperationPlace - 1)
'Bu arada - ten once operator var ise onu al
'cunku bu - sayinin negatifligi icin kullanilmakta
If OP(3) = 1 Then
OP(3) = 0
ElseIf OP(3) > 1 Then
TC = Mid(OperationLine, OP(3) - 1, 1)
If (TC = "*") Or (TC = "/") Or (TC = "+") Or (TC = "-") Then OP(3) = OP(3) - 1
End If
'bunlardan OperationPlace (operasyon yeri)
'degerine en yakin olanini bul
OperationPlaceBefore = IIf(OP(0) < OP(1), OP(1), OP(0))
OperationPlaceBefore = IIf(OperationPlaceBefore < OP(2), OP(2), OperationPlaceBefore)
OperationPlaceBefore = IIf(OperationPlaceBefore < OP(3), OP(3), OperationPlaceBefore)

End Function

Private Function OperationPlaceAfter%(OperationLine$, OperationPlace%)

'Bir islem yerinden hemen
'sonra gelen islem yerini bulur
Dim OP%(3), OL%

OL = Len(OperationLine)
OP(0) = InStr(OperationPlace + 1, OperationLine, "*")
If OP(0) = 0 Then OP(0) = OL + 1
OP(1) = InStr(OperationPlace + 1, OperationLine, "/")
If OP(1) = 0 Then OP(1) = OL + 1
OP(2) = InStr(OperationPlace + 1, OperationLine, "+")
If OP(2) = 0 Then OP(2) = OL + 1
OP(3) = InStr(OperationPlace + 1, OperationLine, "-")
If OP(3) = OperationPlace + 1 Then OP(3) = InStr(OP(3) + 1, OperationLine, "-")
If OP(3) = 0 Then OP(3) = OL + 1
OperationPlaceAfter = IIf(OP(0) < OP(1), OP(0), OP(1))
OperationPlaceAfter = IIf(OP(2) < OperationPlaceAfter, OP(2), OperationPlaceAfter)
OperationPlaceAfter = IIf(OP(3) < OperationPlaceAfter, OP(3), OperationPlaceAfter)

End Function
onaylayan: Webmaster




Yorumlar, eklemeler ve düşünceler
        Bazı Değerler Yanlış Dönüyor Örnegin şu işlemden parantez kullansamda kullanmasamda yanlış bir sonuç dönüyor

(324124*23424)*(234247/32535)*(3453*345)

28590845.4663253 dönüyor

PArantez kullnmazsam
22.5119513779651

dönüyor ama gerçek sonuç
65.119.513.779.651.300,00

bazı değerlerde de hataya rastladım bu BUG lar giderilmeden önemli uygulamalarda kullanılmamalı



   accounter, 20.11.2006 02:41
© Hakan Ersöz 2000-2013| Üyelik Sözleşmesi | | Ödeme Bildirimi
Sitemizden yenilikleri hemen öğrenin, pop upları engelleyin, chat yapın... ToolBarımızı indirin:
Vasicmaster Toolbar'ı indirin