一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

【原創(chuàng)】自制編程語(yǔ)言-9 嵌套if語(yǔ)句(2)

 計(jì)算機(jī)知識(shí)雜談 2021-07-01
昨天干了一晚上的調(diào)試工作,這嵌套if可是真的煩。
首先先報(bào)告一些昨天的錯(cuò)誤。(貌似昨天做的棧整個(gè)全部是錯(cuò)的)不運(yùn)行不知道,一運(yùn)行嚇一跳。
這才是真正正確的代碼。結(jié)構(gòu)體指針的引用不可以用“.“,用的是箭頭運(yùn)算符”->“。并且,malloc分配的數(shù)據(jù)不會(huì)自動(dòng)清零,不想再加memset了,直接calloc不就好了。
我們先加兩個(gè)變量。
然后是get_nowif函數(shù)。這個(gè)函數(shù)用來(lái)判斷現(xiàn)在if狀態(tài),到底是否執(zhí)行接下來(lái)的代碼。(if不成立就不執(zhí)行)
如果之前有一個(gè)條件不成立,接下來(lái)的東西就不執(zhí)行,是“且”的關(guān)系。
同樣,如果nowif為0,我們需要在main里面特殊判斷。
我們首先需要把棧初始化,然后往棧里面放入1,nowif也是1,表示如果沒(méi)有特殊情況就是執(zhí)行。然后,我們按照之前說(shuō)過(guò)的方法,對(duì)棧進(jìn)行操作。當(dāng)然,不執(zhí)行里面的代碼,直接跳轉(zhuǎn)到結(jié)束位置,這是因?yàn)閚owif是0,說(shuō)明條件不成立。
end是在循環(huán)最后的地方。
然后,如果nowif不為0,應(yīng)該往下執(zhí)行到這里。同樣,我們對(duì)棧進(jìn)行操作。每次操作后,需要get_nowif()一下。
完。(話說(shuō)這段代碼看上去很容易,實(shí)際調(diào)試我用了差不多一個(gè)小時(shí)。)
附上完整代碼:
  1. #include<bits/stdc++.h>    
  2. #include"stack.h"  
  3. using namespace std;    
  4. char s[100];    
  5. int endifs=0;  
  6. ifstream cons("CON");   
  7. struct STACK ifstack;   
  8. int nowif;  
  9. struct VALUE{    
  10.     char name[30];//變量名    
  11.     int type;//類(lèi)型,0表示int,1表示string    
  12.     int vnum;//int類(lèi)型的數(shù)值    
  13.     char vstring[255];//string類(lèi)型    
  14. };    
  15. int value_ptr=0;    
  16. struct VALUE value[1000];    
  17. void get_word(char *s){//讀入單詞    
  18.     scanf("%s",s);    
  19. }    
  20. void get_string(char *s){    
  21.     int i=0,flag=0;    
  22.     for(i=0;i<100;i++){    
  23. next:    
  24.         s[i]=getchar();    
  25.         if(flag==0 && s[i]==' ')goto next;    
  26.         else flag=1;    
  27.         if(s[i]=='\n')break;    
  28.     }    
  29.     s[i]='\0';//結(jié)束掉字符串    
  30. }    
  31. void error(){    
  32.     cout<<"Error in program.\n";    
  33.     exit(0);//退出程序    
  34. }    
  35. int isnumber(const char *s){    
  36.     for(int i=0;i<strlen(s);i++)    
  37.         if(s[i]<='0' || s[i]>='9')return 0;//不是數(shù)字字符    
  38.     return 1;    
  39. }    
  40. int isvalue(const char *s){    
  41.     for(int i=0;i<value_ptr;i++){    
  42.         if(strcmp(value[i].name,s)==0)return 1;    
  43.     }    
  44.     return 0;    
  45. }    
  46. int getpos(const char *vname){    
  47.     for(int i=0;i<value_ptr;i++){    
  48.         if(strcmp(value[i].name,vname)==0)return i;//下標(biāo)    
  49.     }    
  50.     return -1;//未找到    
  51. }    
  52. void put_value(const char *name){    
  53.     int i=getpos(name);    
  54.     if(i==-1)error();    
  55.     if(value[i].type==0)printf("%d",value[i].vnum);    
  56.     else printf("%s",value[i].vstring);    
  57. }    
  58. int getnum_sub(const char *s){    
  59.     if(isvalue(s))return value[getpos(s)].vnum;//是變量    
  60.     int i;    
  61.     sscanf(s,"%d",&i);    
  62.     return i;//是數(shù)字    
  63. }    
  64. int getnum(const char *s){    
  65.     if(strcmp(s,"input()")==0){    
  66.             
  67.         int n;    
  68.         cons>>n;    
  69.         return n;    
  70.     }    
  71.     char *p;    
  72.     char op;    
  73.     for(p=(char*)s;*p!='+'&&*p!='-'&&*p!='*'&&*p!='/'&&*p!='\0'&&*p!='>'&&*p!='<'&&*p!='=';p++);//找到運(yùn)算符    
  74.     if(*p=='\0')return getnum_sub(s);//只有一個(gè)數(shù)的情況     
  75.     op=*p;*p='\0';//第一個(gè)數(shù)字到運(yùn)算符結(jié)束    
  76.     char s1[100],s2[100];    
  77.     int n1,n2;    
  78.     strcpy(s1,s);strcpy(s2,p+1);    
  79.     n1=getnum_sub(s1);n2=getnum_sub(s2);    
  80.     if(op=='+')return n1+n2;    
  81.     else if(op=='-')return n1-n2;    
  82.     else if(op=='*')return n1*n2;    
  83.     else if(op=='/')return n1/n2;    
  84.     else if(op=='>')return n1>n2;  
  85.     else if(op=='<')return n1<n2;  
  86.     else if(op=='=')return n1==n2;  
  87. }    
  88. int get_nowif(){  
  89.     nowif=1;  
  90.     for(int i=0;i<=ifstack.top;i++){  
  91.         if(ifstack.num[i]==0)nowif=0;  
  92.     }  
  93.     return nowif;  
  94. }  
  95. int main(int argc,char** argv){    
  96.     if(argc!=2){//有一個(gè)要解釋的文件參數(shù)    
  97.         cout<<"Cannot find source file.\n";    
  98.         return 0;    
  99.     }    
  100.     freopen(argv[1],"r",stdin);    
  101.     init_stack(64,&ifstack);  
  102.     ifstack.num[0]=1;  
  103.     nowif=1;  
  104.     for(;;){    
  105.         get_word(s);  
  106.         get_nowif();  
  107.         if(nowif==0){  
  108.             if(strcmp(s,"if")==0){  
  109.                 char sa[255];  
  110.                 get_word(sa);  
  111.                 int a=getnum(sa);//cout<<a<<endl;  
  112.                 push_stack(&ifstack,a);  
  113.                 get_nowif();  
  114.             }  
  115.             else if(strcmp(s,"endif")==0){  
  116.                 pop_stack(&ifstack);  
  117.                 get_nowif();  
  118.             }  
  119.             goto end;  
  120.         }  
  121.         if(strcmp(s,"/*")==0){//是注釋  
  122.             while(strcmp(s,"*/")!=0)get_word(s);//直到注釋的末尾標(biāo)記  
  123.         }  
  124.         else if(strcmp(s,"print")==0){//調(diào)用print輸出    
  125.             get_string(s);    
  126.             if(isnumber(s))cout<<s;    
  127.             else if(s[0]=='\"' && s[strlen(s)-1]=='\"'){    
  128.                 for(int i=1;i<strlen(s)-1;i++){    
  129.                     if(s[i]=='\\' && s[i+1]=='n'){    
  130.                         printf("\n");i++;    
  131.                     }    
  132.                     else printf("%c",s[i]);    
  133.                 }    
  134.             }    
  135.             else if(isvalue(s)){    
  136.                 put_value(s);    
  137.             }    
  138.             else error();    
  139.         }    
  140.         else if(strcmp(s,"exit")==0){//退出程序    
  141.             return 0;    
  142.         }    
  143.         else if(strcmp(s,"dim")==0){//聲明變量    
  144.             char sa[255],sb[255],sc[255];    
  145.             get_word(sa);get_word(sb);get_word(sc);    
  146.             if(strcmp(sb,"as")!=0)error();    
  147.             strcpy(value[value_ptr].name,sa);    
  148.             if(strcmp(sc,"int")==0)value[value_ptr].type=0;    
  149.             else if(strcmp(sc,"string")==0)value[value_ptr].type=1;    
  150.             else error();    
  151.             value_ptr++;    
  152.         }    
  153.         else if(isvalue(s)){//變量的賦值語(yǔ)句    
  154.             char sa[255],sb[255];    
  155.             get_word(sa);  
  156.             if(value[getpos(s)].type==1)get_string(sb);    
  157.             else get_word(sb);  
  158.             if(strcmp(sa,"=")!=0)error();    
  159.             if(value[getpos(s)].type==0)value[getpos(s)].vnum=getnum(sb);    
  160.             else {    
  161.                 sb[strlen(sb)-1]='\0';//去掉最后的雙引號(hào)    
  162.                 strcpy(value[getpos(s)].vstring,sb+1);//復(fù)制的時(shí)候去掉前面的雙引號(hào)    
  163.             }    
  164.         }    
  165.         else if(strcmp(s,"if")==0){  
  166.             endifs++;  
  167.             char sa[255];  
  168.             get_word(sa);  
  169.             int a=getnum(sa);//cout<<a<<endl;  
  170.             push_stack(&ifstack,a);  
  171.             get_nowif();  
  172.         }  
  173.         else if(strcmp(s,"endif")==0){  
  174.             pop_stack(&ifstack);get_nowif();  
  175.         }  
  176.         else{    
  177.             error();    
  178.         }    
  179. end:  
  180.         continue;  
  181.     }    
  182. }  

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多

    日韩成人午夜福利免费视频| 国产福利一区二区久久| 天海翼精品久久中文字幕| 日韩综合国产欧美一区| 欧美乱码精品一区二区三| 老富婆找帅哥按摩抠逼视频| 亚洲国产精品久久网午夜| 国产精品欧美激情在线| 成人日韩在线播放视频| 99热在线精品视频观看| 91日韩欧美中文字幕| 日韩精品一区二区不卡| 国产亚洲欧美日韩精品一区| 少妇淫真视频一区二区| 精品久久久一区二区三| 少妇特黄av一区二区三区| 少妇丰满a一区二区三区| 国产又爽又猛又粗又色对黄| 久久国产人妻一区二区免费| 国产精品免费视频久久| 久久国产人妻一区二区免费| 亚洲一区二区三区在线中文字幕| 亚洲午夜福利不卡片在线| 日韩一区中文免费视频| 又大又长又粗又黄国产| 亚洲综合一区二区三区在线| 欧美日韩国产亚洲三级理论片| 国产亚洲欧美日韩精品一区 | 亚洲中文字幕熟女丝袜久久| 丰满少妇被粗大猛烈进出视频| 99国产成人免费一区二区| 在线九月婷婷丁香伊人| 国产永久免费高清在线精品| 欧美日韩中国性生活视频| 九九热这里有精品20| 人妻一区二区三区在线 | 真实国产乱子伦对白视频不卡| 国产亚洲成av人在线观看| 麻豆在线观看一区二区| 日韩在线免费看中文字幕| 久久精品久久久精品久久|