主页
搜索
最近更新
数据统计
赞助我们
系统公告
1
/
1
请查看完所有公告
T541724 程序设计(program) 题解
最后更新于 2025-06-15 19:34:42
作者
geren
分类
题解
复制 Markdown
查看原文
更新内容
写std前:就是黄题的难度嘛 写std后:就是 上位~~绿~~黄嘛QWQ 虽然题目说有100个变量,但其实最多只有26个。 ## 正片 >0.输入 >先把数字输进`in[]`,并定义`zhii`为它的指针,每执行一次`cin`就把它+1,代表抛弃这个数。 > >```cpp >cin>>n; > for(int i=1;i<=n;i++) cin>>in[i]; >int zhii=1; >``` >1.定义 > 建一个结构体,存某个变量的名字和数值,并定义`zhiin`为下一个定义的数是第几个。 > ```cpp > struct intt{ > int zhi=0; > char name; > }it[110]; > int zhiin=1; > ``` >2.查找 >在后面的函数中,我们要时刻对变量进行访问。用一个函数返回这个变量的地址,如果是常数返回-1。 > >``` >int find(char c){ > for(int i=1;i<=zhiin;i++){ > if(it[i].name==c) return i; > } > return -1; >} >``` >3.输入 >在接受到`cin` 时,输入接下来的一个字符,并把即将输入的一个数字(`in[zhii]`)存入接下来的这个字符中,别忘了输入最后的分号。 > >```cpp >if(s=="cin"){ //s是每行的第一个单词 > char c; > cin>>c; > it[find(c)].zhi=in[zhii]; > zhii++; > cin>>c; //shu ru ; > } >``` >4.输出 >在接受到`cout` 时,输入接下来的一个字符$c $,输出它的位置上的值(`it[find(c)].zhi`),题目写了不能是数字,别忘了输入最后的分号。 > >```cpp >if(s=="cout"){ > char c; > cin>>c; > int x=it[find(c)].zhi; > cout<<x<<"\n"; > cin>>c; //shu ru ; > } >``` >5.定义 >当输入`int`时,输入接下来的一个字符,把它存到下一个位置(`it[zhiin].name`)别忘了输入最后的分号。 >```cpp >if(s=="int"){ > char c; > cin>>c; > it[zhiin].name=c; > zhiin++; > cin>>c; //shu ru ; > } >``` >6.for >~~终于到了最难写的环节!~~ >把它单独定义一个函数`ford`,因为可能要递归。 >输入它时,往后读三个字符串,但是第二和第三个可能是常数,所以之前查找时的-1就体现出优势啦!之后把三个数的值放到函数里计算。 >```cpp >if(s=="for"){ > string i,j,k; > int ii,jj,kk; > cin>>i>>j>>k; > if(find(i[0])==-1) > ii=i[0]-'0'; > else ii=it[find(i[0])].zhi; > if(find(j[0])==-1) > jj=j[0]-'0'; > else jj=it[find(j[0])].zhi; > if(find(k[0])==-1) > kk=k[0]-'0'; > else kk=it[find(k[0])].zhi; > string s; > cin>>s; > ford(ii,jj,kk,s); > } >``` >然后`ford`里面就按上述几种情况的代码复制然后改亿下就好了(提示:for函数里只会有输出或表达式或嵌套for)。 >~~终于讲完了for...~~ >7.表达式 >不符合上述几种情况时,就是表达式了。 >输入它时,往后读三个字符串,将第二个和第三个 数或变量 的值求出来,然后带进去就好了。 > ```cpp else{ //四则运算 char c=s[0]; int plc1=find(c); cin>>c; //输入= cin>>c; int plc2=find(c),z2; if(plc2==-1) z2=c-'0'; else z2=it[plc2].zhi; cin>>c; // 输入运算符 char cc; cin>>cc; int plc3=find(cc),z3; if(plc3==-1) z3=c-'0'; else z3=it[plc3].zhi; cin>>cc; //shu ru ; if(c=='+') it[plc1].zhi=z2+z3; if(c=='-') it[plc1].zhi=z2-z3; if(c=='*') it[plc1].zhi=z2*z3; if(c=='/') it[plc1].zhi=z2/z3; } ``` ### 最后,易错点 >1.没特判`s=="return;"`。 >2.没输分号。 >3.for 函数里四则运算的第二第三个数字可能改变,注意重新查找。 >4.`zhii`和`zhiin`搞反。 >5.把重新输入的$c$ 搞成$s[0]$ 。 >6.嵌套循环里不要多输入东西。 >7.别忘了输入最后的分号。 >8.不开long long 见祖宗 ### 最后的最后,std奉上(150行,打了两天) ```cpp #include<bits/stdc++.h> #define int long long using namespace std; struct intt{ int zhi=0; char name; }it[110]; int zhii=1,zhiin=1; int in[110],n; int find(char c){ for(int i=1;i<=zhiin;i++){ if(it[i].name==c) return i; } return -1; } void ford(int ii,int jj,int kk,string s){ if(s=="cout"){ char c; cin>>c; int x=it[find(c)].zhi; for(int i=ii;i<=jj;i+=kk) cout<<x<<"\n"; cin>>c; //shu ru ; } else if(s=="for"){ string i,j,k; int ii1,jj1,kk1; cin>>i>>j>>k; if(find(i[0])==-1) ii1=i[0]-'0'; else ii1=it[find(i[0])].zhi; if(find(j[0])==-1) jj1=j[0]-'0'; else jj1=it[find(j[0])].zhi; if(find(k[0])==-1) kk1=k[0]-'0'; else kk1=it[find(k[0])].zhi; string s; cin>>s; for(int i=ii;i<=jj;i+=kk) ford(ii1,jj1,kk1,s); } else{ //四则运算 char c=s[0]; //cout<<it[1].name; int plc1=find(c); //cout<<plc1<<" "; cin>>c; //输入= cin>>c; int plc2=find(c),z2; if(plc2==-1) z2=c-'0'; else z2=it[plc2].zhi; cin>>c; // 输入运算符 char cc; cin>>cc; int plc3=find(cc),z3; if(plc3==-1) z3=c-'0'; else z3=it[plc3].zhi; cin>>cc; //shu ru ; //cout<<plc3<<" "; //cout<<plc1<<" "<<plc2<<" "<<plc3; for(int i=ii;i<=jj;i+=kk){ if(plc2!=-1) z2=it[plc2].zhi; if(plc3!=-1) z3=it[plc3].zhi; if(c=='+') it[plc1].zhi=z2+z3; if(c=='-') it[plc1].zhi=z2-z3; if(c=='*') it[plc1].zhi=z2*z3; //cout<<it[plc1].zhi<<"\n"; if(c=='/') it[plc1].zhi=z2/z3; } } } void shuru(string s){ if(s=="int"){ char c; cin>>c; it[zhiin].name=c; zhiin++; cin>>c; //shu ru ; } else if(s=="cin"){ char c; cin>>c; it[find(c)].zhi=in[zhii]; zhii++; cin>>c; //shu ru ; } else if(s=="cout"){ char c; cin>>c; int x=it[find(c)].zhi; cout<<x<<"\n"; cin>>c; //shu ru ; } else if(s=="for"){ string i,j,k; int ii,jj,kk; cin>>i>>j>>k; if(find(i[0])==-1) ii=i[0]-'0'; else ii=it[find(i[0])].zhi; //cout<<find(i[0])<<"\n"; if(find(j[0])==-1) jj=j[0]-'0'; else jj=it[find(j[0])].zhi; //cout<<it[2].zhi<<"\n"; if(find(k[0])==-1) kk=k[0]-'0'; else kk=it[find(k[0])].zhi; //cout<<ii<<" "<<jj<<" "<<kk<<" "; string s; cin>>s; ford(ii,jj,kk,s); } else{ //四则运算 char c=s[0]; //cout<<it[1].name; int plc1=find(c); //cout<<plc1<<" "; cin>>c; //输入= cin>>c; int plc2=find(c),z2; if(plc2==-1) z2=c-'0'; else z2=it[plc2].zhi; cin>>c; // 输入运算符 char cc; cin>>cc; int plc3=find(cc),z3; if(plc3==-1) z3=c-'0'; else z3=it[plc3].zhi; cin>>cc; //shu ru ; //cout<<plc3<<" "; //cout<<plc1<<" "<<plc2<<" "<<plc3; if(c=='+') it[plc1].zhi=z2+z3; if(c=='-') it[plc1].zhi=z2-z3; if(c=='*') it[plc1].zhi=z2*z3; if(c=='/') it[plc1].zhi=z2/z3; } } signed main(){ cin>>n; for(int i=1;i<=n;i++) cin>>in[i]; string s; while(1){ cin>>s; //cout<<s<<" "; if(s=="return;") break; else shuru(s); } return 0; } ``` 看注释量就知道我调了多久。。。 题解5257 字,希望大家都能A这道题!
正在渲染内容...
点赞
0
收藏
0