برنامه نویسی

برنامه های قدرت، چند روش برای ساخت ماشین حساب

LowCode گاهی اوقات ساده و قابل تکرار در نظر گرفته می شود. بلوک های ساختمانی کمتری وجود دارد، بنابراین تنها یک راه برای حل یک مشکل وجود دارد. و اگرچه این به نوعی درست است، اما کاملاً درست نیست. 9 بار از 10 مورد، یک راه حل خارج از جعبه وجود خواهد داشت که پیاده سازی آن سریع و آسان است، اما زمان ها و راه هایی برای خلاقیت بیشتر وجود دارد. و این جایی است که بیشتر لذت از آنجا ناشی می شود

یکی از معدود راه‌حل‌های موجود در Power Apps، ماشین‌حساب‌ها هستند، بنابراین فکر کردم همه راه‌های مختلفی را که می‌توانیم یک ماشین‌حساب ایجاد کنیم، و چیزهایی که می‌توانم یاد بگیرم، بررسی کنم.

بنابراین به چند روش می توانید یک ماشین حساب بسازید، خوب من حداقل 5 راه پیدا کردم:

  1. دکمه های استاندارد
  2. آلبوم عکس
  3. کد
  4. تایمر
  5. چرتکه 🧮


1. استاندارد

ایده بسیار ساده است، هر عدد و اپراتور جزء دکمه مخصوص به خود است. ما 5 متغیر داریم:#

  • vsOne = شماره اول
  • vsTwo = عدد دوم (بر روی 99999999999999999999 تنظیم کنید تا بدانیم استفاده نشده است)
  • vsCalc = اپراتور
  • vsEquals = نمایش نتیجه
  • viValue = نتیجه

در یک پوسته مهره، مقدار اول را در vsOne نگه می داریم و در اپراتور اپراتور را ذخیره می کنیم و vsTwo را روی “” تنظیم می کنیم و اعداد بعدی را در آنجا ذخیره می کنیم. سپس روی مساوی از سوئیچ مبتنی بر عملگر برای تکمیل عمل استفاده می کنیم.

دکمه تنظیم مجدد

Set(vsOne,"0");
Set(vsTwo,"99999999999999999999");
Set(vsCalc,"");
Set(vbEquals,false);
Set(viValue,0);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

دکمه شماره

If(vsTwo="99999999999999999999",
    Set(vsOne,Value(vsOne& Self.Text)&"")
,
    Set(vsTwo,Value(vsTwo& Self.Text)&"")
)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

دکمه اپراتور (+)

Set(vsCalc,Self.Text);   
If(vsTwo="99999999999999999999",       
    Set(vsTwo,"0");
,
    Set(viValue,Value(vsOne) + Value(vsTwo));
    Set(vsOne,viValue&"");
    Set(vsTwo,"0");
)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

دکمه برابر است

Switch(vsCalc,
    "+",Set(viValue,Value(vsOne) + Value(vsTwo)),
    "-",Set(viValue,Value(vsOne) - Value(vsTwo)),
    "*",Set(viValue,Value(vsOne) * Value(vsTwo)),
    "https://dev.to/",Set(viValue,Value(vsOne) / Value(vsTwo))
);
Set(vsOne,viValue&"");
Set(vsTwo,"99999999999999999999");
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

2. گالری

ماشین حساب مبتنی بر گالری

رویکرد گالری شبیه دکمه‌ها است، اما این مزیت را دارد که همه دکمه‌ها را به‌طور خودکار قرار می‌دهند.

گالری به مجموعه موارد زیر نیاز دارد:
[“1″,”2″,”3″,”4″,”5″,”6″,”7″,”8″,”9″,”0″,”+”,”-“,”https://dev.to/”,”*”,”=”,”C”]

سپس همه کد OnSelect را رول می کنیم زیرا همه دکمه ها از یک کد استفاده می کنند.

همه دکمه ها

If(IsNumeric(Self.Text),
    If(vsTwo="99999999999999999999",
        Set(vsOne,Value(vsOne& Self.Text)&"")
    ,
        Set(vsTwo,Value(vsTwo& Self.Text)&"")
    )
,
    If(Self.Text="=",
        Switch(vsCalc,
            "+",Set(viValue,Value(vsOne) + Value(vsTwo)),
            "-",Set(viValue,Value(vsOne) - Value(vsTwo)),
            "*",Set(viValue,Value(vsOne) * Value(vsTwo)),
            "https://dev.to/",Set(viValue,Value(vsOne) / Value(vsTwo))
        );
        Set(vsOne,viValue&"");
        Set(vsTwo,"99999999999999999999");
    ,
        If(Self.Text="C",
            Set(vsOne,"0");
            Set(vsTwo,"99999999999999999999");
            Set(vsCalc,"");
            Set(vbEquals,false);
            Set(viValue,0);
            Set(sPrint,"");
        ,
            Set(vsCalc,Self.Text);   
            If(vsTwo="99999999999999999999",       
                Set(vsTwo,"0");
            ,
                Switch(Self.Text,
                    "+",Set(viValue,Value(vsOne) + Value(vsTwo)),
                    "-",Set(viValue,Value(vsOne) - Value(vsTwo)),
                    "*",Set(viValue,Value(vsOne) * Value(vsTwo)),
                    "https://dev.to/",Set(viValue,Value(vsOne) / Value(vsTwo))
                );
                Set(vsOne,viValue&"");
                Set(vsTwo,"0");
            )
        )           
    )
)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

3. کد

گیف متحرک از ماشین حساب مبتنی بر صفحه کلید

این یکی که شخصا فکر می کنم بسیار جالب است، به جای استفاده از دکمه ها، چرا از صفحه کلید استفاده نکنید.

ما رویکرد مشابهی داریم اما این بار در متغیرها ذخیره نمی‌کنیم، بلکه در یک ردیف در یک مجموعه ذخیره می‌کنیم

متأسفانه هیچ راه آسانی برای استفاده از Regex وجود نداشت (من توانستم آن را پیدا کنم) بنابراین رویکرد من این بود که ورودی را به یک آرایه تقسیم کنم و سپس روی هر کاراکتر حلقه بزنم و به آرایه ردیفی (که ما به عنوان یک شی استفاده می کنیم) ذخیره یا اضافه کنیم. برای ذخیره متغیرها همانطور که نمی توانید در یک حلقه ForAll تنظیم کنید). منطق این است

  • اگر عدد است و هیچ اپراتور ذخیره نشده است به کلید یک اضافه کنید (زیرا این اولین عدد در فرمول است)
  • اگر عدد است اما عملگر ذخیره شده است به کلید دو اضافه می شود (زیرا این دومین عدد در فرمول است)
  • Else روی عملگر تنظیم شود (همانطور که می دانیم عددی نیست)
  • پس از اتمام ForAll از عملگر برای انتخاب فرمول و نمایش نتایج استفاده کنید

نمودار منطقی حلقه

دکمه برابر است

ClearCollect(colInput,Split(inCalcCode.Text,""));
Set(viValue,0);
ClearCollect(colResult,{one:"",operator:"",two:"",value:0,id:1});
ForAll(colInput,
    If(IsNumeric(ThisRecord.Value)&&Index(colResult,1).operator="",
        Patch(colResult,{id:1},{
            one:Index(colResult,1).one&ThisRecord.Value}
        )
    ,
        If(IsNumeric(ThisRecord.Value),
            Patch(colResult,{id:1},{
                two:Index(colResult,1).two&ThisRecord.Value}
            )
        ,
            Patch(colResult,{id:1},{
                operator:ThisRecord.Value}
            )
        )
    )
);
Switch(Index(colResult,1).operator,
    "+",Set(viValue,Value(Index(colResult,1).one) + Value(Index(colResult,1).two)),
    "-",Set(viValue,Value(Index(colResult,1).one) - Value(Index(colResult,1).two)),
    "*",Set(viValue,Value(Index(colResult,1).one) * Value(Index(colResult,1).two)),
    "https://dev.to/",Set(viValue,Value(Index(colResult,1).one) / Value(Index(colResult,1).two))
);
Set(vbResult,true);

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

4.تایمر

ماشین حساب برنامه برق مبتنی بر تایمر

همانطور که قبلاً اشاره کردم، تایمرها روش انعطاف‌پذیر دیگری برای انجام حلقه‌ها در Power Apps هستند.
این رویکرد مشابه رویکرد کد (حلقه ForAll) با چند تفاوت کوچک است.

از آنجایی که این بیشتر یک حلقه For است، ما روی هر آیتم افزایش نمی‌دهیم، بلکه می‌شماریم و مقایسه شاخص انجام می‌دهیم. و همانطور که اکنون می‌توانیم متغیرها را تنظیم کنیم، به مجموعه تک ردیفی خود نیاز نداریم.

دکمه برابر است

ClearCollect(colInput,Split(inCalcTimer.Text,""));
Set(vsOne,"");
Set(vsNumber,"");
Set(viValue,0);
Set(i,1);
Set(vbResult,false);
Set(vsCalc,"");
Set(vbCalc,true);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این بار قصد داریم به:

  • بر روی هر آیتم از رشته تقسیم می شود. وقتی به طول رسیدیم حلقه را متوقف می کنیم، فرمول را انتخاب کرده و نتیجه را نشان می دهیم.
  • اگر کمتر از طول باشد، بررسی می کنیم که آیا عدد است و vsCalc خالی است (همانطور که می دانیم قسمت اول یا دوم فرمول).
  • اگر هر دو باشد ما به vsNumber اضافه می کنیم
  • اگر عدد است اما vsCalc خالی نیست، بررسی می کنیم که آیا vsOne خالی است یا نه، اگر vsNumber را کپی می کنیم و vsNumbner را پاک می کنیم (آماده برای شماره دوم در فرمول). سپس دوباره به vsNumber اضافه می کنیم.
  • در نهایت اگر عددی نباشد، ذخیره به همان اندازه vsCal است که می دانیم اپراتور است.

فرآیند حلقه تایمر
شروع کنید

vbCalc
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

تکرار

vbCalc
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

OnTimerEnd

If(i>CountRows(colInput),
    Set(vbCalc,false);
    Set(vbResult,true);
    Switch(vsCalc,
        "+",Set(viValue,Value(vsOne) + Value(vsNumber)),
        "-",Set(viValue,Value(vsOne) - Value(vsNumber)),
        "*",Set(viValue,Value(vsOne) * Value(vsNumber)),
        "https://dev.to/",Set(viValue,Value(vsOne) / Value(vsNumber))
    );
    Reset(inCalcTimer);
,
    If(IsNumeric(Index(colInput,i).Value),
        If(vsCalc="",
            Set(vsNumber,vsNumber&Index(colInput,i).Value);
        ,
            If(vsOne="",Set(vsOne,vsNumber);Set(vsNumber,""));
            Set(vsNumber,vsNumber&Index(colInput,i).Value);          
        )
    ,
          Set(vsCalc,Index(colInput,i).Value)  
    )
);
Set(i,i+1);
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

5. چرتکه

می‌خواهید واقعاً نوآورانه عمل کنید، پس LowCode and Power Apps به شما کمک می‌کند. چرا وقتی می توانید از چرتکه استفاده کنید از ماشین حساب استفاده کنید.

گیف متحرک برنامه چرتکه

چرتکه با تراز کردن 2 گالری ساخته شده است که در سمت راست مهره های استفاده نشده و سمت چپ استفاده شده است.
گالری با 2 مجموعه مشابه پر شده است

Screen OnVisible / Clear Button OnSelect

ClearCollect(colSelected,
    {type:"ones",show:"|",val:""},
    {type:"tens",show:"X",val:""},
    {type:"hundreds",show:"C",val:""},
    {type:"thousands",show:"M",val:""},
    {type:"tenthousnads",show:"̅X̅",val:""}
);
ClearCollect(colUnSelected,
    {type:"ones",show:"|",val:"||||||||||"},
    {type:"tens",show:"X",val:"XXXXXXXXXXX"},
    {type:"hundreds",show:"C",val:"CCCCCCCCCC"},
    {type:"thousands",show:"M",val:"MMMMMMMMMM"},
    {type:"tenthousnads",show:"̅X̅",val:"X̅X̅X̅X̅X̅X̅X̅X̅X̅X̅"}
)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

گالری دارای یک برچسب است که val مجموعه را نشان می دهد، روی انتخاب برچسب با پچ مقدار با طول -1 و مجموعه دیگر را با val و نمایش آن وصله کنید.

برچسب گالری OnSelect

If(ThisItem.val<>"",
    Patch(colUnSelected,{type:ThisItem.type},
        {val:Left(ThisItem.val,Len(ThisItem.val)-1)}
    );
    Patch(colSelected,{type:ThisItem.type},
        {val:LookUp(colSelected,type=ThisItem.type).val&ThisItem.show}
    );
)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

آخرین مرحله تبدیل آیتم های colSelected به عدد است.

متن برچسب نتیجه

(Len(Index(colSelected,1).val)*1)+
(Len(Index(colSelected,2).val)*10)+
(Len(Index(colSelected,3).val)*100)+
(Len(Index(colSelected,4).val)*1000)+
(Len(Index(colSelected,5).val)*10000/2)
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید


همانطور که می بینید راه های مختلفی برای حل هر راه حل برنامه وجود دارد، این نشان می دهد که بررسی طراحی خوب برای کمک به برنامه ریزی قبل از توسعه چقدر مهم است.

یک کپی از برنامه را می توانید در اینجا پیدا کنید

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

همچنین ببینید
بستن
دکمه بازگشت به بالا