打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
【原创】自制编程语言-6 输入语句
现在我们的编程语言功能越来越多了,干劲也更足了,趁着这势头,我们继续写下去吧。这次我们来尝试编写输入语句。有了一个功能,加上运算符,我们就可以实现A+B问题了,真不错。输入语句的样式用很多,例如:
C++:cin>>a;
C:scanf("%d",&a);
PASCAL:read(a)
PYTHON:a=input()
我们就使用PYTHON的方式吧。这样写起来可以和赋值语句结合在一起。我们的输入就写成这样:
a = input()

好了,开始编写代码。关键点在于,我们如何从屏幕进行读入。因为之前为了读取代码,我们使用了freopen修改了读入的默认对象stdin。所以,我们需要重新将读入流修改回控制台。
有的人会问,“除了freopen,还有什么方式可以修改文件流?老师只说过这一种方法,还说其它的方式没必要知道那么多,知道一个freopen就够了。”现在看来,这个完全是错误的。(当然,如果是编程竞赛而不是工程设计,一个freopen是完全足够的)
C++可以用fstream来实现,C语言可以用FILE*指针实现。这里为了简单一点,我们直接用fstream实现了。
ifstream cons("CON")表示制作一个叫做cons的输入流,输入目标文件为"CON",实际就是将输入文件设置为控制台,就可以从控制台输入数据。此时就可以用cons>>n的语句来从cons读入。cons其实就是之前定义的变量。
多说一句, 这里的ifstream不是一个函数,而是构造函数。更多关于构造函数的知识可以去网上搜索。笔者这里的自制string类型以后也可能会往里面放一些构造函数和析构函数的东西。(不过可能会咕一阵子)

好了,我们尝试运行A+B PROBLEM的代码。激动人心的时刻到了。(笑)
话说print不可以连续输出很不方便,到时候抽时间改掉就是了。但是这还不是最难受的,最难受的在于,1和2中间必须使用换行符分割。(如果想知道用空格会发生什么,自己运行一下吧)
所以,我们需要查错误。其实只需要移动一行代码就解决了。
没错,把cons设定为全局变量。
完。附上完整版代码。
  1. #include<bits/stdc++.h>  
  2. using namespace std;  
  3. char s[100];  
  4. ifstream cons("CON");  
  5. struct VALUE{  
  6.     char name[30];//变量名  
  7.     int type;//类型,0表示int,1表示string  
  8.     int vnum;//int类型的数值  
  9.     char vstring[255];//string类型  
  10. };  
  11. int value_ptr=0;  
  12. struct VALUE value[1000];  
  13. void get_word(char *s){//读入单词  
  14.     scanf("%s",s);  
  15. }  
  16. void get_string(char *s){  
  17.     int i=0,flag=0;  
  18.     for(i=0;i<100;i++){  
  19. next:  
  20.         s[i]=getchar();  
  21.         if(flag==0 && s[i]==' ')goto next;  
  22.         else flag=1;  
  23.         if(s[i]=='\n')break;  
  24.     }  
  25.     s[i]='\0';//结束掉字符串  
  26. }  
  27. void error(){  
  28.     cout<<"Error in program.\n";  
  29.     exit(0);//退出程序  
  30. }  
  31. int isnumber(const char *s){  
  32.     for(int i=0;i<strlen(s);i++)  
  33.         if(s[i]<='0' || s[i]>='9')return 0;//不是数字字符  
  34.     return 1;  
  35. }  
  36. int isvalue(const char *s){  
  37.     for(int i=0;i<value_ptr;i++){  
  38.         if(strcmp(value[i].name,s)==0)return 1;  
  39.     }  
  40.     return 0;  
  41. }  
  42. int getpos(const char *vname){  
  43.     for(int i=0;i<value_ptr;i++){  
  44.         if(strcmp(value[i].name,vname)==0)return i;//下标  
  45.     }  
  46.     return -1;//未找到  
  47. }  
  48. void put_value(const char *name){  
  49.     int i=getpos(name);  
  50.     if(i==-1)error();  
  51.     if(value[i].type==0)printf("%d",value[i].vnum);  
  52.     else printf("%s",value[i].vstring);  
  53. }  
  54. int getnum_sub(const char *s){  
  55.     if(isvalue(s))return value[getpos(s)].vnum;//是变量  
  56.     int i;  
  57.     sscanf(s,"%d",&i);  
  58.     return i;//是数字  
  59. }  
  60. int getnum(const char *s){  
  61.     if(strcmp(s,"input()")==0){  
  62.           
  63.         int n;  
  64.         cons>>n;  
  65.         return n;  
  66.     }  
  67.     char *p;  
  68.     char op;  
  69.     for(p=(char*)s;*p!='+'&&*p!='-'&&*p!='*'&&*p!='/'&&*p!='\0';p++);//找到运算符  
  70.     if(*p=='\0')return getnum_sub(s);//只有一个数的情况   
  71.     op=*p;*p='\0';//第一个数字到运算符结束  
  72.     char s1[100],s2[100];  
  73.     int n1,n2;  
  74.     strcpy(s1,s);strcpy(s2,p+1);  
  75.     n1=getnum_sub(s1);n2=getnum_sub(s2);  
  76.     if(op=='+')return n1+n2;  
  77.     else if(op=='-')return n1-n2;  
  78.     else if(op=='*')return n1*n2;  
  79.     else if(op=='/')return n1/n2;  
  80. }  
  81.       
  82. int main(int argc,char** argv){  
  83.     if(argc!=2){//有一个要解释的文件参数  
  84.         cout<<"Cannot find source file.\n";  
  85.         return 0;  
  86.     }  
  87.     freopen(argv[1],"r",stdin);  
  88.     for(;;){  
  89.         get_word(s);  
  90.         if(strcmp(s,"print")==0){//调用print输出  
  91.             get_string(s);  
  92.             if(isnumber(s))cout<<s;  
  93.             else if(s[0]=='\"' && s[strlen(s)-1]=='\"'){  
  94.                 for(int i=1;i<strlen(s)-1;i++){  
  95.                     if(s[i]=='\\' && s[i+1]=='n'){  
  96.                         printf("\n");i++;  
  97.                     }  
  98.                     else printf("%c",s[i]);  
  99.                 }  
  100.             }  
  101.             else if(isvalue(s)){  
  102.                 put_value(s);  
  103.             }  
  104.             else error();  
  105.         }  
  106.         else if(strcmp(s,"exit")==0){//退出程序  
  107.             return 0;  
  108.         }  
  109.         else if(strcmp(s,"dim")==0){//声明变量  
  110.             char sa[255],sb[255],sc[255];  
  111.             get_word(sa);get_word(sb);get_word(sc);  
  112.             if(strcmp(sb,"as")!=0)error();  
  113.             strcpy(value[value_ptr].name,sa);  
  114.             if(strcmp(sc,"int")==0)value[value_ptr].type=0;  
  115.             else if(strcmp(sc,"string")==0)value[value_ptr].type=1;  
  116.             else error();  
  117.             value_ptr++;  
  118.         }  
  119.         else if(isvalue(s)){//变量的赋值语句  
  120.             char sa[255],sb[255];  
  121.             get_word(sa);get_string(sb);  
  122.             if(strcmp(sa,"=")!=0)error();  
  123.             if(value[getpos(s)].type==0)value[getpos(s)].vnum=getnum(sb);  
  124.             else {  
  125.                 sb[strlen(sb)-1]='\0';//去掉最后的双引号  
  126.                 strcpy(value[getpos(s)].vstring,sb+1);//复制的时候去掉前面的双引号  
  127.             }  
  128.         }  
  129.         else{  
  130.             error();  
  131.         }  
  132.     }  
  133. }
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
c语言中串比较函数
java: utf-8转unicode
pcm音量计算
字符串的比较
strcmp代码实现
C语言字符串比较
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服