史萊姆論壇

史萊姆論壇 (http://forum.slime.com.tw/)
-   生活話題、日常閒聊、喇勒唬爛灌水區 (http://forum.slime.com.tw/f23.html)
-   -   回味一下Basic吧 (http://forum.slime.com.tw/thread287502.html)

魔術王子 2017-06-11 11:34 PM

回味一下Basic吧
 
其實這又是一篇很怪異的發文:on_52:
多怪異呢:on_50:
看下去就知道啦:on_13:
相信有很多曾經玩過DOS的人一定接觸過Basic
我覺得那是我玩電腦的時光中,最快樂的時光
就算是現在的系統多強大多好用,就因為過於強大好用,用起來反而覺得綁手綁腳的
最後還是懷念直譯式的Basic
曾經透過虛擬機器來回味,可是仍覺得太過於麻煩
因為我想要玩Basic的操作環境,卻又希望能有Windows般的控制環境
最後就突發奇想的想自己用C++ Builder設計一個:on_90:
我的做法很簡單
在新表單上放一個Rich的元件,這元件的功能就類似記事本,但比記事本強大,所以其實是Windwos附屬應用程式裡的Wordpad(因為大家比較常用記事本,所以先講記事本,讓大家對原本功能有點印象)
接著放兩個ListBox元件一個存放變數名稱,一個存放變數值
當程式指令下達A=10時
程式會先搜尋ListBox的項目,看是否有這個變數值若有,就改變值
引用:

_for (int i=0 ; i<=ListBox1->Items->Count-1 ; i++)
__if (ListBox1->Items->Strings[i]==v1) {
___p=i;
___ListBox2->Items->Strings[p]=v2;
___break;
__}

若沒有新增值
引用:

_if (p<0){
__ListBox1->Items->Add(v1);
__ListBox2->Items->Add(v2);
__p=ListBox1->Items->Count-1;

然後就是最基本的PRINT指令
PRINT必須顯示""中間的文字
引用:

_String v1,v2;
_if(s.Pos("\"")){
__s=s.SubString(s.Pos("\"")+1,s.Length()-s.Pos("\""));
__if(s.Pos("\"")) s=s.SubString(1,s.Length()-1);
_} else {

以及顯示變數值
引用:

__v1=s.SubString(s.Pos(" ")+1,s.Length()).UpperCase();
__for (int i=0 ; i<=ListBox1->Items->Count-1 ; i++) if (ListBox1->Items->Strings[i]==v1) s=ListBox2->Items->Strings[i];
_}
_RichEdit1->Lines->Add(s);

有輸出就一定要有輸入
但利用Rich元件實在很難控制輸入的指令,而且既然是在Windows環境,就該"入境隨俗",利用Windows的資源InputBox
引用:

_if(s.Pos("\"")){
__v1=s.SubString(s.Pos(",")+1,s.Length()).UpperCase();
__s=s.SubString(s.Pos("\"")+1,s.Pos(",")-s.Pos("\"")+1);
__if(s.Pos("\"")) s=s.SubString(1,s.Length()-1);
__v2=InputBox("選擇",s.c_str(),"");
__for (int i=0 ; i<=ListBox1->Items->Count-1 ; i++)
___if (ListBox1->Items->Strings[i]==v1) {
____p=i;
____ListBox2->Items->Strings[p]=v2;
____break;
___}
__if (p<0){
___ListBox1->Items->Add(v1);
___ListBox2->Items->Add(v2);
___p=ListBox1->Items->Count-1;
__}
_}

感謝的沒學過C++ Builder或C++的朋友,很感謝你耐心的看到這裡:on_28:
實在想不出該發些什麼文了,只好把這個無聊的興趣也跟大家分享
不知大家看了有沒有什麼想法

johnss 2017-06-11 11:58 PM

Visual Basic(VB)會不會比較符合你所需

魔術王子 2017-06-12 06:47 AM

引用:

作者: johnss (文章 2369523)
Visual Basic(VB)會不會比較符合你所需

不會
因為想要 直譯式 的感覺:on_79::on_79::on_79:

mini 2017-06-12 03:57 PM

:on_22::on_68::on_76:
https://voicespice.com/Player.aspx?c...C7DB11&j=52C8B

魔術王子 2017-06-12 06:57 PM

其實呢小王子也沒有那麼無聊,只設計變數跟輸出/輸入指令,就拿來當做Basic
再來就分享小王子自行設計的判別式IF...THEN...ELSE
引用:

__String v1,v2,v3;
__int p=-1,n1,n2;
__if(s.Pos("=")) {
____v1=s.SubString(s.Pos(" ")+1,s.Pos("=")-s.Pos(" ")-1).UpperCase();
____v3=s.SubString(s.Pos("=")+1,s.UpperCase().Pos("THEN")-s.Pos("=")-2);
____if (v3.Pos("\"")) v3=v3.SubString(2,v3.Length()-2);
____for (int i=0 ; i<=Form2->ListBox1->Items->Count-1 ; i++)
______if (Form2->ListBox1->Items->Strings[i]==v1) {
________p=i;
________v2=Form2->ListBox2->Items->Strings[p];
________break;
______}
____if ((p>=0)&&(v2==v3)){
______if(s.UpperCase().Pos("ELSE")) v1=s.SubString(s.UpperCase().Pos("THEN")+5,s.UpperCase().Pos("ELSE")-s.UpperCase().Pos("THEN")-6); else v1=s.SubString(s.UpperCase().Pos("THEN")+5,s.Length());
______RESOLVE(v1);*
____} else {
______if(s.UpperCase().Pos("ELSE")) {
________v2=s.SubString(s.UpperCase().Pos("ELSE")+5,s.Length()-s.UpperCase().Pos("ELSE")-1);
________RESOLVE(v2);
______}
____}
__} else {
____v1=s.SubString(s.Pos(" ")+1,s.UpperCase().Pos("THEN")-s.Pos(" ")-2).UpperCase();
____if(v1[1]=='!') { v3="False"; v1=v1.SubString(2,v1.Length()); } else v3="True";
____for (int i=0 ; i<=Form2->ListBox1->Items->Count-1 ; i++)
______if (Form2->ListBox1->Items->Strings[i]==v1) {
________p=i;
________v2=Form2->ListBox2->Items->Strings[p];
________break;
______}
____if ((p>=0)&&(v2==v3)){
______if(s.UpperCase().Pos("ELSE")) v1=s.SubString(s.UpperCase().Pos("THEN")+5,s.UpperCase().Pos("ELSE")-s.UpperCase().Pos("THEN")-6); else v1=s.SubString(s.UpperCase().Pos("THEN")+5,s.Length());
______RESOLVE(v1);
____} else {
______if(s.UpperCase().Pos("ELSE")) {
________v2=s.SubString(s.UpperCase().Pos("ELSE")+5,s.Length()-s.UpperCase().Pos("ELSE")-1);
________RESOLVE(v2);
______}
____}
__}

*RESOLVE()是收集所有的指令的函式,以後會介紹

魔術王子 2017-06-13 06:55 AM

在思考如何設計這個程式時
小弟有一個感覺,就好像在跟電腦對話一樣
如果沒記錯的話,Basic可以用?來代替PRINT指令
所以如果要BASIC幫你運算,除了輸入PRINT 1+2之外,也可以輸入? 1+2
不過現在這些產品已經都走向商業化了,大概也沒機會體驗這種感覺了

getter 2017-06-13 08:04 PM

背死渴 ...

想當年 ... 一開使接觸學習,可不像現在這樣有老師解說指令作用或是程式流程 ...

而是 ... 背程式 ... 背程式 ... 背程式 .... 打字 ... 打字 ... 打字 ...

記憶力好兼打字快的人多吃香啊 ...

魔術王子 2017-06-13 10:20 PM

引用:

作者: getter (文章 2369549)
背死渴 ...

想當年 ... 一開使接觸學習,可不像現在這樣有老師解說指令作用或是程式流程 ...

而是 ... 背程式 ... 背程式 ... 背程式 .... 打字 ... 打字 ... 打字 ...

記憶力好兼打字快的人多吃香啊 ...

記得那段時光,本來只寫一段小小的小程式,然後邊玩,腦筋邊浮出無數的靈感
就邊玩邊改,結果原本才十行不到,最後改到成快一百行:on_75:

魔術王子 2017-06-13 10:25 PM

這是FOR的程式
引用:

__String ls;
__ls=s.SubString(s.Pos(" ")+1,3);
__SET(ls);
__s=s.SubString(s.UpperCase().Pos("TO"),s.Length());
__Tag_Num=s.SubString(s.Pos(" ")+1,s.Length()).ToInt();

NEXT
引用:

__String v1=s.SubString(s.Pos(" ")+1,s.Length()).UpperCase();
__for (int i=0 ; i<=Form2->ListBox1->Items->Count-1 ; i++) if (Form2->ListBox1->Items->Strings[i]==v1) s=Form2->ListBox2->Items->Strings[i];
__int n=s.ToInt();
__if (n==Tag_Num) {
__} else {
____n=n++;
____v1=v1+"="+n;
____SET(v1);
____for(int i=0;i<=Form2->RichEdit1->Lines->Count;i++){
______s=Form2->RichEdit1->Lines->Strings[i];
______if (s.UpperCase().Pos("FOR")) { Proc_No=i; break; }
____}
__}

GOTO
引用:

__String s1;
__s=s.SubString(s.Pos(" ")+1,s.Length());
__for(int i=0;i<=Form2->RichEdit1->Lines->Count;i++){
____s1=Form2->RichEdit1->Lines->Strings[i];
____s1=s1.SubString(1,s1.Pos(" ")-1);
____if (s1==s) { Proc_No=i-1; break; }
__}

ON ... GOTO
引用:

__String s1,v1,v2;
__v1=s.SubString(4,1);
__for (int i=0 ; i<=Form2->ListBox1->Items->Count-1 ; i++) if (Form2->ListBox1->Items->Strings[i]==v1) v2=Form2->ListBox2->Items->Strings[i];
__s=s.SubString(11,s.Length())+",over";
__int i=1;
__while(1){
____if (i==v2.ToInt()) {
______if (s.Pos(",")) s=s.SubString(1,s.Pos(",")-1);
______break;
____} else {
______if (s.Pos(",")) s=s.SubString(s.Pos(",")+1,s.Length()); else break;
____}
____i++;
__}
__if (s!="over") {
____for(int i=0;i<=Form2->RichEdit1->Lines->Count;i++){
______s1=Form2->RichEdit1->Lines->Strings[i];
______s1=s1.SubString(1,s1.Pos(" ")-1);
______if (s1==s) { Proc_No=i-1; break; }
____}
__}

下面是這個小程式,分享給大家玩玩,第一次用MEGA空間分享,不知會不會有問題
https://mega.nz/#!fMAQ3aiI!OL8Lx0A6r...PIR_ZLtngYcghw

https://mega.nz/#!KcxhVBrT!OmEE-sDWL...rn8y0atlZOySBY

mini 2017-06-14 02:47 PM

原來是在實作 basic直譯器 :on_02:
可以做一個中文直譯器
這樣可以給小學生玩(賣給安親班賺一筆:on_16:)
例:
「錢包」<有7>元
<狀況1>爸爸<每1>天給10元<共6>天
所以「錢包」每次<加10>元
<狀況1完>
<告知>我的錢包擁有「錢包」元

「」裝變數
<> 裝識別字,及阿拉伯數字

「錢包」<有7>元
相當於「錢包」=7

<狀況1>爸爸<每1>天給10元<共6>天
相當於1 To 6 Step 1

所以「錢包」每次<加10>元
相當於「錢包」=「錢包」+10

沒有被<>及「」所包住的字是註解 可有可無
如行首是<告知>
則列印出來

魔術王子 2017-06-14 09:37 PM

引用:

作者: mini (文章 2369565)
原來是在實作 basic直譯器 :on_02:
可以做一個中文直譯器
這樣可以給小學生玩(賣給安親班賺一筆:on_16:)
例:
「錢包」<有7>元
<狀況1>爸爸<每1>天給10元<共6>天
所以「錢包」每次<加10>元
<狀況1完>
<告知>我的錢包擁有「錢包」元

「」裝變數
<> 裝識別字,及阿拉伯數字

「錢包」<有7>元
相當於「錢包」=7

<狀況1>爸爸<每1>天給10元<共6>天
相當於1 To 6 Step 1

所以「錢包」每次<加10>元
相當於「錢包」=「錢包」+10

沒有被<>及「」所包住的字是註解 可有可無
如行首是<告知>
則列印出來

雖然程式勉強可以做出類似Basic的程式效果
但小王子仍舊不滿意,只是這已經是自己的極限了
所以分享出來,希望以後有人可以把它設計得更好:on_14:


所有時間均為台北時間。現在的時間是 12:37 PM

Powered by vBulletin® 版本 3.6.8
版權所有 ©2000 - 2024, Jelsoft Enterprises Ltd.

『服務條款』

* 有問題不知道該怎麼解決嗎?請聯絡本站的系統管理員 *


SEO by vBSEO 3.6.1