PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Калькулятор


Калькулятор

Сообщений 1 страница 13 из 13

1

Для общего развития и понимания PB  пробую собрать простой калькулятор.

Код ниже.
Работает пока: плюс, минус, умножить. разделить.
Вопрос: правильный подход или надо использовать другой принцип?
И как убирать лишние ноли (может функция есть )?
Я сделал способ, но если число целое остается запятая.
И надо еще придумать как набирать запятую только один раз.

Код:
Enumeration 
#Window_0
EndEnumeration

Enumeration 
#String  
#Backs      
#CE
#C
#But_7
#But_8
#But_9
#But_4
#But_5
#But_6
#But_1
#But_2
#But_3
#But_0
#znak
#drob
#delen
#umnoj
#minus
#plus
#sqrt
#pros
#fff
#rezul
#MC
#MR
#MS
#M_plus
EndEnumeration

Global rez3.d


Procedure Pros0() ;процедура убирает лишние нули
 sdf.s = StrD(rez3)
  For n =1 To  Len(StrD(rez3))
   df.s  = Left(sdf.s, n)
   fff.s = Right(df.s, 1)
   If fff.s  <> "0"
    SetGadgetText(#String, df.s) 
   EndIf
  Next
EndProcedure


;{------------------Окно--------------------------------
OpenWindow (#Window_0,  0,  0,  265,  240,  "Калькулятор", #PB_Window_MinimizeGadget |#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget) 
SetWindowColor(#Window_0,RGB(255, 255, 255))
StringGadget(#String, 10, 15, 245, 25, "")

ButtonGadget(#Backs, 55, 50, 70, 30, "Backspace")
ButtonGadget(#CE, 130, 50, 60, 30, "CE")
ButtonGadget(#C,  195, 50, 60, 30, "C")

ButtonGadget(#But_7, 55,  90,  35, 30, "7")
ButtonGadget(#But_8, 95,  90,  35, 30, "8")
ButtonGadget(#But_9, 135, 90,  35, 30, "9")

ButtonGadget(#But_4, 55,  125, 35, 30, "4")
ButtonGadget(#But_5, 95,  125, 35, 30, "5")
ButtonGadget(#But_6, 135, 125, 35, 30, "6")

ButtonGadget(#But_1, 55,  160, 35, 30, "1")
ButtonGadget(#But_2, 95,  160, 35, 30, "2")
ButtonGadget(#But_3, 135, 160, 35, 30, "3")

ButtonGadget(#But_0, 55,  195, 35, 30, "0")
ButtonGadget(#znak,  95,  195, 35, 30, "+/-")
ButtonGadget(#drob,  135, 195, 35, 30, ".")

ButtonGadget(#delen, 180, 90,  35, 30, "/")
ButtonGadget(#umnoj, 180, 125, 35, 30, "*")
ButtonGadget(#minus, 180, 160, 35, 30, "-")
ButtonGadget(#plus,  180, 195, 35, 30, "+")

ButtonGadget(#sqrt, 220, 90,  35, 30, "sqrt")
ButtonGadget(#pros, 220, 125, 35, 30, "%")
ButtonGadget(#fff,  220, 160, 35, 30, "1/x")
ButtonGadget(#rezul,220, 195, 35, 30, "=")

ButtonGadget(#MC,    10, 90,  35, 30, "MC")
ButtonGadget(#MR,    10, 125, 35, 30, "MR")
ButtonGadget(#MS,    10, 160, 35, 30, "MS")
ButtonGadget(#M_plus,10, 195, 35, 30, "M+")
;}------------------------------------------------------
rez1.d   =0
znak.s = "0"
;{----------------- Главный цикл -------------------------
Repeat
Event =  WaitWindowEvent() 
Window = EventWindow() 
Gadget = EventGadget()
   Select Event
        Case #PB_Event_Gadget
          Select EventGadget()
             
             Case #But_0,#But_1,#But_2,#But_3,#But_4,#But_5,#But_6,#But_7,#But_8,#But_9,#drob
              If znak = "+" Or znak = "-" Or znak = "*" Or znak = "/" Or znak = "0"
               rez0.s = GetGadgetText(#String)  
               SetGadgetText(#String, rez0+GetGadgetText(Gadget))
              ElseIf znak = "="  
               SetGadgetText(#String, "")
               rez0.s = GetGadgetText(#String)
               SetGadgetText(#String, rez0+GetGadgetText(Gadget)) 
               znak = "0"               
              EndIf
                         
             Case #C
             SetGadgetText(#String, "")
             rez1 =0
             
             
             
             Case #plus, #minus, #umnoj, #delen
               rez1= ValD(GetGadgetText(#String))
               SetGadgetText(#String, GetGadgetText(Gadget))
               znak = GetGadgetText(Gadget)
             
             
             Case #rezul
              If znak = "+" Or znak = "-"
               rez3 = rez1 + ValD(GetGadgetText(#String))
               Pros0()
               ;SetGadgetText(#String, StrD(rez3))
              ElseIf znak = "*"
               rez3 = rez1* ValD(Mid(GetGadgetText(#String),2))
               Pros0()
               ;SetGadgetText(#String, StrD(rez3))
              ElseIf znak = "/"
               rez3 = rez1/ ValD(Mid(GetGadgetText(#String),2))
               Pros0()
               ;SetGadgetText(#String, StrD(rez4))
              EndIf
             znak = "="
          EndSelect
   EndSelect
If Event = #PB_Event_CloseWindow
Break    
EndIf
ForEver

0

2

хороший пример, мне понравился. Да и метод вроде бы правильный

0

3

Нет, работают только простые примеры с одним знаком :

4+2=
5-8=
2*6=
5/9=

Если например набрать :

1 +2 +3+9+1+3=

то  в результате сложатся только последние две цифры.

0

4

Может надо что то так (пока только на плюс )

Код:
Enumeration 
#Window_0
EndEnumeration

Enumeration 
#String  
#Backs      
#CE
#C
#But_7
#But_8
#But_9
#But_4
#But_5
#But_6
#But_1
#But_2
#But_3
#But_0
#znak
#drob
#delen
#umnoj
#minus
#plus
#sqrt
#pros
#fff
#rezul
#MC
#MR
#MS
#M_plus
EndEnumeration

Global rez3.d


Procedure Pros0() ;процедура убирает лишние нули
 sdf.s = StrD(rez3)
  For n =1 To  Len(StrD(rez3))
   df.s  = Left(sdf.s, n)
   fff.s = Right(df.s, 1)
   If fff.s  <> "0"
    SetGadgetText(#String, df.s) 
   EndIf
  Next
EndProcedure


;{------------------Окно--------------------------------
OpenWindow (#Window_0,  0,  0,  265,  240,  "Калькулятор", #PB_Window_MinimizeGadget |#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget) 
SetWindowColor(#Window_0,RGB(255, 255, 255))
StringGadget(#String, 10, 15, 245, 25, "")

ButtonGadget(#Backs, 55, 50, 70, 30, "Backspace")
ButtonGadget(#CE, 130, 50, 60, 30, "CE")
ButtonGadget(#C,  195, 50, 60, 30, "C")

ButtonGadget(#But_7, 55,  90,  35, 30, "7")
ButtonGadget(#But_8, 95,  90,  35, 30, "8")
ButtonGadget(#But_9, 135, 90,  35, 30, "9")

ButtonGadget(#But_4, 55,  125, 35, 30, "4")
ButtonGadget(#But_5, 95,  125, 35, 30, "5")
ButtonGadget(#But_6, 135, 125, 35, 30, "6")

ButtonGadget(#But_1, 55,  160, 35, 30, "1")
ButtonGadget(#But_2, 95,  160, 35, 30, "2")
ButtonGadget(#But_3, 135, 160, 35, 30, "3")

ButtonGadget(#But_0, 55,  195, 35, 30, "0")
ButtonGadget(#znak,  95,  195, 35, 30, "+/-")
ButtonGadget(#drob,  135, 195, 35, 30, ".")

ButtonGadget(#delen, 180, 90,  35, 30, "/")
ButtonGadget(#umnoj, 180, 125, 35, 30, "*")
ButtonGadget(#minus, 180, 160, 35, 30, "-")
ButtonGadget(#plus,  180, 195, 35, 30, "+")

ButtonGadget(#sqrt, 220, 90,  35, 30, "sqrt")
ButtonGadget(#pros, 220, 125, 35, 30, "%")
ButtonGadget(#fff,  220, 160, 35, 30, "1/x")
ButtonGadget(#rezul,220, 195, 35, 30, "=")

ButtonGadget(#MC,    10, 90,  35, 30, "MC")
ButtonGadget(#MR,    10, 125, 35, 30, "MR")
ButtonGadget(#MS,    10, 160, 35, 30, "MS")
ButtonGadget(#M_plus,10, 195, 35, 30, "M+")
;}------------------------------------------------------
rez1.d   =0
znak.s = "0"
;{----------------- Главный цикл -------------------------
Repeat
Event =  WaitWindowEvent() 
Window = EventWindow() 
Gadget = EventGadget()
   Select Event
        Case #PB_Event_Gadget
          Select EventGadget()
             
             Case #But_0,#But_1,#But_2,#But_3,#But_4,#But_5,#But_6,#But_7,#But_8,#But_9,#drob
              If  znak = "0"
               rez0.s = GetGadgetText(#String)  
               SetGadgetText(#String, rez0+GetGadgetText(Gadget))
              ElseIf znak = "+"  
               SetGadgetText(#String, "")
               rez0.s = GetGadgetText(#String)
               SetGadgetText(#String, rez0+GetGadgetText(Gadget)) 
               znak = "0"               
              EndIf
                         
             Case #C
             SetGadgetText(#String, "")
             rez1 =0
             znak ="0"
             
             Case #plus
               If  znak = "0" 
                SetGadgetText(#String, Str(rez1 + ValD(GetGadgetText(#String)))    )
                rez1 =  ValD(GetGadgetText(#String))
                znak = GetGadgetText(Gadget)
               ElseIf znak = "=" 
                rez1 =  ValD(GetGadgetText(#String))
                SetGadgetText(#String, "")
                SetGadgetText(#String, Str(rez1 + ValD(GetGadgetText(#String)))    )
                ez1 =  ValD(GetGadgetText(#String))
                znak = GetGadgetText(Gadget)
               EndIf
                
             Case #rezul

               rez3 = rez1 + ValD(GetGadgetText(#String))
               Pros0()
               znak = GetGadgetText(Gadget)
               
          EndSelect
   EndSelect
If Event = #PB_Event_CloseWindow
Break    
EndIf
ForEver 
;}-------------------------------------------------------

0

5

mirashic написал(а):

И как убирать лишние ноли (может функция есть )?

Я в своё время вот это написал.

Код:
Procedure.s DelNull(String.s)
Protected Result.s
Result=String

Pos=FindString(String, ".", 1)
If Pos>0
  Len=Len(String)
  For i=Len To Pos Step -1
    Char.s=Mid(String, i, 1)
    If Char="."
      i-1
      Break
    ElseIf Char<>"0"
      Break
    EndIf
  Next i
  
  If i<Len
    Result=Left(String, i)
  EndIf
  
EndIf

ProcedureReturn Result
EndProcedure

0

6

Спасибо.

0

7

Во всех калькуляторах, при нажатии несколько раз на равно, при сумме к примеру 2+9 прибавляется 9 ( То есть последнее число, это удобно при том давным давно заведено), а у тебя 2.   То есть:
1)   11
2)   20
3)   29

А у тебя
1)  11
2)  13
3)  15

0

8

Это не понацея, возможно ты другой способ найдешь, но все таки это работает вроде как правильно:

Код:
Enumeration 
#Window_0
EndEnumeration

Enumeration 
#String  
#Backs      
#CE
#C
#But_7
#But_8
#But_9
#But_4
#But_5
#But_6
#But_1
#But_2
#But_3
#But_0
#znak
#drob
#delen
#umnoj
#minus
#plus
#sqrt
#pros
#fff
#rezul
#MC
#MR
#MS
#M_plus
EndEnumeration

Global rez3.d


Procedure Pros0() ;процедура убирает лишние нули
 sdf.s = StrD(rez3)
  For n =1 To  Len(StrD(rez3))
   df.s  = Left(sdf.s, n)
   fff.s = Right(df.s, 1)
   If fff.s  <> "0"
    SetGadgetText(#String, df.s) 
   EndIf
  Next
EndProcedure


;{------------------Окно--------------------------------
OpenWindow (#Window_0,  0,  0,  265,  240,  "Калькулятор", #PB_Window_MinimizeGadget |#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget) 
SetWindowColor(#Window_0,RGB(255, 255, 255))
StringGadget(#String, 10, 15, 245, 25, "")

ButtonGadget(#Backs, 55, 50, 70, 30, "Backspace")
ButtonGadget(#CE, 130, 50, 60, 30, "CE")
ButtonGadget(#C,  195, 50, 60, 30, "C")

ButtonGadget(#But_7, 55,  90,  35, 30, "7")
ButtonGadget(#But_8, 95,  90,  35, 30, "8")
ButtonGadget(#But_9, 135, 90,  35, 30, "9")

ButtonGadget(#But_4, 55,  125, 35, 30, "4")
ButtonGadget(#But_5, 95,  125, 35, 30, "5")
ButtonGadget(#But_6, 135, 125, 35, 30, "6")

ButtonGadget(#But_1, 55,  160, 35, 30, "1")
ButtonGadget(#But_2, 95,  160, 35, 30, "2")
ButtonGadget(#But_3, 135, 160, 35, 30, "3")

ButtonGadget(#But_0, 55,  195, 35, 30, "0")
ButtonGadget(#znak,  95,  195, 35, 30, "+/-")
ButtonGadget(#drob,  135, 195, 35, 30, ".")

ButtonGadget(#delen, 180, 90,  35, 30, "/")
ButtonGadget(#umnoj, 180, 125, 35, 30, "*")
ButtonGadget(#minus, 180, 160, 35, 30, "-")
ButtonGadget(#plus,  180, 195, 35, 30, "+")

ButtonGadget(#sqrt, 220, 90,  35, 30, "sqrt")
ButtonGadget(#pros, 220, 125, 35, 30, "%")
ButtonGadget(#fff,  220, 160, 35, 30, "1/x")
ButtonGadget(#rezul,220, 195, 35, 30, "=")

ButtonGadget(#MC,    10, 90,  35, 30, "MC")
ButtonGadget(#MR,    10, 125, 35, 30, "MR")
ButtonGadget(#MS,    10, 160, 35, 30, "MS")
ButtonGadget(#M_plus,10, 195, 35, 30, "M+")
;}------------------------------------------------------
rez1.d   =0
znak.s = "0"
;{----------------- Главный цикл -------------------------
Repeat
Event =  WaitWindowEvent() 
Window = EventWindow() 
Gadget = EventGadget()
   Select Event
        Case #PB_Event_Gadget
          Select EventGadget()
             
             Case #But_0,#But_1,#But_2,#But_3,#But_4,#But_5,#But_6,#But_7,#But_8,#But_9,#drob
              If  znak = "0"
               rez0.s = GetGadgetText(#String)  
               SetGadgetText(#String, rez0+GetGadgetText(Gadget))
              ElseIf znak = "+"  
               SetGadgetText(#String, "")
               rez0.s = GetGadgetText(#String)
               SetGadgetText(#String, rez0+GetGadgetText(Gadget)) 
               znak = "0"               
              EndIf
                         
             Case #C
             SetGadgetText(#String, "")
             rez1 =0
             znak ="0"
             POSL=0
             rez3=0
             rav_r=0
             
             Case #plus
               If  znak = "0" 
                SetGadgetText(#String, Str(rez1 + ValD(GetGadgetText(#String)))    )
                rez1 =  ValD(GetGadgetText(#String))
                znak = GetGadgetText(Gadget)
               ElseIf znak = "=" 
                rez1 =  ValD(GetGadgetText(#String))
                SetGadgetText(#String, "")
                SetGadgetText(#String, Str(rez1 + ValD(GetGadgetText(#String)))    )
                ez1 =  ValD(GetGadgetText(#String))
                znak = GetGadgetText(Gadget)
               EndIf
                
             Case #rezul
                
               If rav_r=0
               rez3 = rez1+ValD(GetGadgetText(#String))
               POSL=ValD(GetGadgetText(#String))
               rav_r=1
               Pros0()
               znak = GetGadgetText(Gadget)
               Else
               rez3=rez3+POSL
               Pros0()
               znak = GetGadgetText(Gadget)
               EndIf
               
               
          EndSelect
   EndSelect
If Event = #PB_Event_CloseWindow
Break    
EndIf
ForEver

0

9

Да правильно. Спасибо.

0

10

Запретил вводить всё кроме цифр и точки.
А то получается, что можно вводить и буквы  :O

Код:
Enumeration 
#Window_0
EndEnumeration

Enumeration 
#String  
#Backs      
#CE
#C
#But_7
#But_8
#But_9
#But_4
#But_5
#But_6
#But_1
#But_2
#But_3
#But_0
#znak
#drob
#delen
#umnoj
#minus
#plus
#sqrt
#pros
#fff
#rezul
#MC
#MR
#MS
#M_plus
EndEnumeration

Global rez3.d


Procedure Pros0() ;процедура убирает лишние нули
 sdf.s = StrD(rez3)
  For n =1 To  Len(StrD(rez3))
   df.s  = Left(sdf.s, n)
   fff.s = Right(df.s, 1)
   If fff.s  <> "0"
    SetGadgetText(#String, df.s) 
   EndIf
  Next
EndProcedure

Structure EditProc 
 Gadget.l 
 GadgetID.l 
 *EditWndProc 
EndStructure 


Global EditProc_1.EditProc 

Procedure EditWndProc(hwnd, msg, wParam, lParam) 
Shared EditProc_1, EditProc_2 
Protected *PointOldEditFunc 

  If EditProc_1\GadgetID=hwnd 
    Gadget=EditProc_1\Gadget 
    *PointOldEditFunc=EditProc_1\EditWndProc 
  Else 
   ProcedureReturn 0 
  EndIf 
  
  
  If  msg=258 
     If wParam=8 Or (wParam>='0' And wParam<='9') 
      
     ElseIf wParam='.' 
       Text.s=GetGadgetText(Gadget) 
       If Text<>"" 
          If FindString(Text, ".",1)>0 
             msg=0 
             MessageBeep_(#MB_ICONERROR) 
          EndIf 
       Else 
          msg=0 
           MessageBeep_(#MB_ICONERROR) 
       EndIf 
     Else 
      msg=0 
       MessageBeep_(#MB_ICONERROR) 
     EndIf 
  EndIf 

ProcedureReturn CallWindowProc_(*PointOldEditFunc,hwnd, msg, wParam, lParam) 
EndProcedure


;{------------------Окно--------------------------------
OpenWindow (#Window_0,  0,  0,  265,  240,  "Калькулятор", #PB_Window_MinimizeGadget |#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget) 
SetWindowColor(#Window_0,RGB(255, 255, 255))
StringGadget(#String, 10, 15, 245, 25, "")
      EditProc_1\Gadget=#String 
      EditProc_1\GadgetID=GadgetID(#String) 
      EditProc_1\EditWndProc=GetWindowLong_(EditProc_1\GadgetID, #GWL_WNDPROC) 
      SetWindowLong_(EditProc_1\GadgetID, #GWL_WNDPROC, @EditWndProc()) 


ButtonGadget(#Backs, 55, 50, 70, 30, "Backspace")
ButtonGadget(#CE, 130, 50, 60, 30, "CE")
ButtonGadget(#C,  195, 50, 60, 30, "C")

ButtonGadget(#But_7, 55,  90,  35, 30, "7")
ButtonGadget(#But_8, 95,  90,  35, 30, "8")
ButtonGadget(#But_9, 135, 90,  35, 30, "9")

ButtonGadget(#But_4, 55,  125, 35, 30, "4")
ButtonGadget(#But_5, 95,  125, 35, 30, "5")
ButtonGadget(#But_6, 135, 125, 35, 30, "6")

ButtonGadget(#But_1, 55,  160, 35, 30, "1")
ButtonGadget(#But_2, 95,  160, 35, 30, "2")
ButtonGadget(#But_3, 135, 160, 35, 30, "3")

ButtonGadget(#But_0, 55,  195, 35, 30, "0")
ButtonGadget(#znak,  95,  195, 35, 30, "+/-")
ButtonGadget(#drob,  135, 195, 35, 30, ".")

ButtonGadget(#delen, 180, 90,  35, 30, "/")
ButtonGadget(#umnoj, 180, 125, 35, 30, "*")
ButtonGadget(#minus, 180, 160, 35, 30, "-")
ButtonGadget(#plus,  180, 195, 35, 30, "+")

ButtonGadget(#sqrt, 220, 90,  35, 30, "sqrt")
ButtonGadget(#pros, 220, 125, 35, 30, "%")
ButtonGadget(#fff,  220, 160, 35, 30, "1/x")
ButtonGadget(#rezul,220, 195, 35, 30, "=")

ButtonGadget(#MC,    10, 90,  35, 30, "MC")
ButtonGadget(#MR,    10, 125, 35, 30, "MR")
ButtonGadget(#MS,    10, 160, 35, 30, "MS")
ButtonGadget(#M_plus,10, 195, 35, 30, "M+")
;}------------------------------------------------------
rez1.d   =0
znak.s = "0"
;{----------------- Главный цикл -------------------------
Repeat
Event =  WaitWindowEvent() 
Window = EventWindow() 
Gadget = EventGadget()
   Select Event
        Case #PB_Event_Gadget
          Select EventGadget()
             
             Case #But_0,#But_1,#But_2,#But_3,#But_4,#But_5,#But_6,#But_7,#But_8,#But_9,#drob
              If  znak = "0"
               rez0.s = GetGadgetText(#String)  
               SetGadgetText(#String, rez0+GetGadgetText(Gadget))
              ElseIf znak = "+"  
               SetGadgetText(#String, "")
               rez0.s = GetGadgetText(#String)
               SetGadgetText(#String, rez0+GetGadgetText(Gadget)) 
               znak = "0"               
              EndIf
                         
             Case #C
             SetGadgetText(#String, "")
             rez1 =0
             znak ="0"
             POSL=0
             rez3=0
             rav_r=0
             
             Case #plus
               If  znak = "0" 
                SetGadgetText(#String, Str(rez1 + ValD(GetGadgetText(#String)))    )
                rez1 =  ValD(GetGadgetText(#String))
                znak = GetGadgetText(Gadget)
               ElseIf znak = "=" 
                rez1 =  ValD(GetGadgetText(#String))
                SetGadgetText(#String, "")
                SetGadgetText(#String, Str(rez1 + ValD(GetGadgetText(#String)))    )
                ez1 =  ValD(GetGadgetText(#String))
                znak = GetGadgetText(Gadget)
               EndIf
                
             Case #rezul
                
               If rav_r=0
               rez3 = rez1+ValD(GetGadgetText(#String))
               POSL=ValD(GetGadgetText(#String))
               rav_r=1
               Pros0()
               znak = GetGadgetText(Gadget)
               Else
               rez3=rez3+POSL
               Pros0()
               znak = GetGadgetText(Gadget)
               EndIf
               
               
          EndSelect
   EndSelect
If Event = #PB_Event_CloseWindow
Break    
EndIf
ForEver

0

11

Да забыл указать, что переменную rav_r  надо обнулять при нажатиях на кнопки + - / *   и т. д.  Иначе при дальнейших действиях она в памяти торчит и вычисления корявит.

0

12

Замучился.
Пока без запрета на ввод букв.
Вроде работают все действия.
Может есть ошибки.

Код:
Enumeration 
#Window_0
EndEnumeration

Enumeration 
#String  
#Backs      
#CE
#C
#But_7
#But_8
#But_9
#But_4
#But_5
#But_6
#But_1
#But_2
#But_3
#But_0
#znak
#drob
#delen
#umnoj
#minus
#plus
#sqrt
#pros
#fff
#rezul
#MC
#MR
#MS
#M_plus
EndEnumeration

Global rez3.d


Procedure.s DelNull(String.s)   ;процедура убирает лишние нули
Protected Result.s
Result=String

Pos=FindString(String, ".", 1)
If Pos>0
  Len=Len(String)
  For i=Len To Pos Step -1
    Char.s=Mid(String, i, 1)
    If Char="."
      i-1
      Break
    ElseIf Char<>"0"
      Break
    EndIf
  Next i
  
  If i<Len
    Result=Left(String, i)
  EndIf
  
EndIf

ProcedureReturn Result
EndProcedure


;{------------------Окно--------------------------------
OpenWindow (#Window_0,  0,  0,  265,  240,  "Калькулятор", #PB_Window_MinimizeGadget |#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget) 
SetWindowColor(#Window_0,RGB(255, 255, 255))
StringGadget(#String, 10, 15, 245, 25, "")

ButtonGadget(#Backs, 55, 50, 70, 30, "Backspace")
ButtonGadget(#CE, 130, 50, 60, 30, "CE")
ButtonGadget(#C,  195, 50, 60, 30, "C")

ButtonGadget(#But_7, 55,  90,  35, 30, "7")
ButtonGadget(#But_8, 95,  90,  35, 30, "8")
ButtonGadget(#But_9, 135, 90,  35, 30, "9")

ButtonGadget(#But_4, 55,  125, 35, 30, "4")
ButtonGadget(#But_5, 95,  125, 35, 30, "5")
ButtonGadget(#But_6, 135, 125, 35, 30, "6")

ButtonGadget(#But_1, 55,  160, 35, 30, "1")
ButtonGadget(#But_2, 95,  160, 35, 30, "2")
ButtonGadget(#But_3, 135, 160, 35, 30, "3")

ButtonGadget(#But_0, 55,  195, 35, 30, "0")
ButtonGadget(#znak,  95,  195, 35, 30, "+/-")
ButtonGadget(#drob,  135, 195, 35, 30, ".")

ButtonGadget(#delen, 180, 90,  35, 30, "/")
ButtonGadget(#umnoj, 180, 125, 35, 30, "*")
ButtonGadget(#minus, 180, 160, 35, 30, "-")
ButtonGadget(#plus,  180, 195, 35, 30, "+")

ButtonGadget(#sqrt, 220, 90,  35, 30, "sqrt")
ButtonGadget(#pros, 220, 125, 35, 30, "%")
ButtonGadget(#fff,  220, 160, 35, 30, "1/x")
ButtonGadget(#rezul,220, 195, 35, 30, "=")

ButtonGadget(#MC,    10, 90,  35, 30, "MC")
ButtonGadget(#MR,    10, 125, 35, 30, "MR")
ButtonGadget(#MS,    10, 160, 35, 30, "MS")
ButtonGadget(#M_plus,10, 195, 35, 30, "M+")


DisableGadget(#Backs, 1): DisableGadget(#sqrt, 1): DisableGadget(#pros, 1): DisableGadget(#fff, 1)
DisableGadget(#MC, 1): DisableGadget(#MR, 1): DisableGadget(#MS, 1): DisableGadget(#M_plus, 1)




;}------------------------------------------------------
rez1.d =  0
znak.s = "0"
umn1.d =  1
um.d   =  1
oper.s ="0"
fff.s = "0"
;{----------------- Главный цикл -------------------------
Repeat
Event =  WaitWindowEvent() 
Window = EventWindow() 
Gadget = EventGadget()
   Select Event
        Case #PB_Event_Gadget
          Select EventGadget()
             
             Case #But_0,#But_1,#But_2,#But_3,#But_4,#But_5,#But_6,#But_7,#But_8,#But_9,#drob
             
              If  znak = "0"                        ; при первом вводе цифр  Вторая цифра и послед. цифры при втором наборе
               rez0.s = GetGadgetText(#String)  
               SetGadgetText(#String, rez0+GetGadgetText(Gadget))
              ElseIf znak = "+"                    ;  первяа цифра при втором наборе и переход                   
               SetGadgetText(#String, "")
               rez0.s = GetGadgetText(#String)
               SetGadgetText(#String, rez0+GetGadgetText(Gadget)) 
               znak = "0"
              ElseIf znak = "-"                    ;  первяа цифра при втором наборе и переход
               SetGadgetText(#String, "")
               rez0.s = GetGadgetText(#String)
               SetGadgetText(#String, "-"+rez0+GetGadgetText(Gadget)) 
               znak = "0"               
              ElseIf znak = "*" And oper = "0"     ;  первяа цифра при втором наборе и переход
               SetGadgetText(#String, "")
               rez0.s = GetGadgetText(#String)
               SetGadgetText(#String, rez0+GetGadgetText(Gadget)) 
               znak = "0"
               oper = "*"
              ElseIf znak = "/" And oper = "0"
              
               SetGadgetText(#String, "")
               rez0.s = GetGadgetText(#String)
               SetGadgetText(#String, rez0+GetGadgetText(Gadget))
               znak = "0"
               oper = "/"               
              EndIf
              
                         
             Case #C , #CE
             SetGadgetText(#String, "")
             rez1  = 0
             znak  ="0"
             POSL  = 0
             rez3  = 0
             rav_r = 0
             umn1  = 1
             um.d  = 1
             oper  ="0"
             fff = "0"   
                
             Case #plus, #minus
              
               If  znak = "0" And oper = "0"     
                SetGadgetText(#String, DelNull(StrD(rez1 + ValD(GetGadgetText(#String)))))
                rez1 =  ValD(GetGadgetText(#String))
                znak = GetGadgetText(Gadget)
                oper = "0"
                um =4
                fff = "1"
               ElseIf znak = "="                ; если было равно 
                SetGadgetText(#String, "")
                SetGadgetText(#String, DelNull(StrD(rez3)))
                rez1 =  ValD(GetGadgetText(#String))
                znak = GetGadgetText(Gadget)
                oper = "0"
                rav_r=0
                fff = "1"
               ElseIf znak = "0" And oper = "*"  ; если было умножение
                SetGadgetText(#String, DelNull(StrD(rez1 * ValD(GetGadgetText(#String)))))
                rez1 =  ValD(GetGadgetText(#String))
                znak = GetGadgetText(Gadget)
                oper = "0"
                fff = "1"
               ElseIf znak = "0" And oper = "/"  ; если было деление
                SetGadgetText(#String, DelNull(StrD(rez1 / ValD(GetGadgetText(#String)))))
                rez1 =  ValD(GetGadgetText(#String))
                znak = GetGadgetText(Gadget) 
                oper = "0"
                fff = "1"                 
               EndIf
               
             Case #umnoj    
               If  um =1     ;  при первом наборе
                SetGadgetText(#String, DelNull(StrD(1 * ValD(GetGadgetText(#String)))))
                rez1 =  ValD(GetGadgetText(#String))
                znak = "*"
                oper = "0" 
                 um = 0
               ElseIf um = 0 Or znak = "*"    ;  при последующич наборах
                SetGadgetText(#String, DelNull(StrD(rez1 * ValD(GetGadgetText(#String)))))
                rez1 =  ValD(GetGadgetText(#String))
                znak = "*"
                oper = "0"               
               ElseIf  znak = "0" And oper = "0" ; если было сложение  
                SetGadgetText(#String, DelNull(StrD(rez1 + ValD(GetGadgetText(#String)))))
                rez1 =  ValD(GetGadgetText(#String))
                znak = "*"
                oper = "0" 
                um = 0
               ElseIf znak = "0" And oper = "/"  ; если было деление
                SetGadgetText(#String, DelNull(StrD(rez1 / ValD(GetGadgetText(#String)))))
                rez1 =  ValD(GetGadgetText(#String))
                znak = "*" 
                oper = "0" 
                um = 0
               ElseIf znak = "="   ; если было равно 
                SetGadgetText(#String, "")
                SetGadgetText(#String, DelNull(StrD(rez3)))
                rez1 =  ValD(GetGadgetText(#String))
                znak = "*"
                oper = "0"
                um = 0 
               EndIf
               
             Case #delen
             
               If znak = "0" And oper = "0" And fff = "0"
                rez1 =  ValD(GetGadgetText(#String))
                SetGadgetText(#String, DelNull(StrD(rez1 )))
                znak = "/"
                oper = "0"
                um = 4
               ElseIf  znak = "0" And oper = "/"
                SetGadgetText(#String, DelNull(StrD(rez1 / ValD(GetGadgetText(#String)))))
                rez1 =  ValD(GetGadgetText(#String))
                znak = "/" 
                oper = "0"
                um = 4
               ElseIf  znak = "=" 
                SetGadgetText(#String, "")
                SetGadgetText(#String, DelNull(StrD(rez3)))
                rez1 =  ValD(GetGadgetText(#String))
                znak = "/" 
                oper = "0"
               ElseIf znak = "0" And oper = "0" And fff = "1" ; если было сложение  
                SetGadgetText(#String, DelNull(StrD(rez1 + ValD(GetGadgetText(#String)))))
                rez1 =  ValD(GetGadgetText(#String))
                znak = "/"
                oper = "0"  
               ElseIf znak = "0" And oper = "*"  ; если было умножение  
                SetGadgetText(#String, DelNull(StrD(rez1 * ValD(GetGadgetText(#String)))))
                rez1 =  ValD(GetGadgetText(#String))
                znak = "/"
                oper = "0"
               EndIf
               
             Case #rezul
             
                If znak = "0" And oper = "0"
                 rez3 = rez1+ValD(GetGadgetText(#String))
                 POSL=ValD(GetGadgetText(#String))
                 rav_r=1
                 SetGadgetText(#String, DelNull(StrD(rez3)))
                 znak = "="
                 oper = "0"
                 um = 4
                ElseIf  rav_r=1 And oper = "0" 
                 rez3=rez3+POSL
                 SetGadgetText(#String, DelNull(StrD(rez3)))
                 um = 4
                ElseIf znak = "0" And oper = "*"
                 rez3 = rez1*ValD(GetGadgetText(#String))
                 POSL=ValD(GetGadgetText(#String))
                 SetGadgetText(#String, DelNull(StrD(rez3)))
                 znak = "="
                 um = 4 
                 rav_r=2
                ElseIf  rav_r=2 And oper = "*"
                 rez3=rez3*POSL
                 SetGadgetText(#String, DelNull(StrD(rez3)))
                 um = 4
                 
                ElseIf znak = "0" And oper = "/"
                 rez3 = rez1/ValD(GetGadgetText(#String))
                 POSL=ValD(GetGadgetText(#String))
                 SetGadgetText(#String, DelNull(StrD(rez3)))                
                 znak = "=" 
                 oper = "/"
                 rav_r=3
                ElseIf  rav_r=3 And oper = "/"
                 rez3=rez3/POSL
                 SetGadgetText(#String, DelNull(StrD(rez3)))
                 um = 4
             EndIf  
               
          EndSelect
   EndSelect
If Event = #PB_Event_CloseWindow
Break    
EndIf
ForEver

0

13

mirashic написал(а):

Может есть ошибки.

Я не нашел ошибок, вроде все работает, по крайней мере, что пока задумано

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » Калькулятор