C语言程序设计题

C语言程序设计题,第1张

前面那个有点问题,这是改进后的:

#include<iostream>

#include<string>

#include<stack>

#include<cctype>

using namespace std;

double count(double left,char op,double right);

int you(char op);

double chuli(string stra);

stack<double>opnd;

stack<char>optr;

char car; string str="";

double count(double left,char op,double right)

{

double ret;

int reta;

if(op=='+'){

ret=left+right;

return ret;

}

if(op=='-'){

ret=left-right;

return ret;

}

if(op==''){

ret=leftright;

return ret;

}

if(op=='/'){

ret=left/right;

return ret;

}

if(op=='%'){

int lefta,righta;

lefta=(int)left;

righta=(int)right;

reta=lefta%righta;

return reta;

}

if(op=='^'){

int righta=(int)right;

double lefta=left;

if(righta>0){

for(int a=1;a<righta;a++)

lefta=left;}

else if(righta==0)

lefta=1000000;

else{

righta=-righta;

for(int a=1;a<righta;a++)

lefta=left;

lefta=1/lefta;}

return lefta;

}

}

int you(char op)

{

if(op=='(')

return 0;

if(op=='+'||op=='-')

return 1;

if(op==''||op=='/'||op=='%')

return 2;

if(op=='^')

return 3;

}

int main(){

double last;

char choice;

int num1=0;

while(true){

cout<<"请输入你要计算的表达式,并以‘=’号结束:\n";

do{

cin>>car;

if(car!='=')

str+=car;

if(car!='('&&car!=')'&&car!='+'&&car!='-'&&car!=''&&car!='/'&&car!='%'&&car!='^'&&car!='='&&!isdigit(car)&&car!='')

num1++;

if(car=='=')

break;

}while(car!='=');

if(num1==0){

str+="=";

last=chuli(str);

cout<<"你输入的表达式是:"<<str<<endl;

cout<<"运算结果是:"<<last<<endl;}

else{

cout<<"你输入的表达式不符合规则!\n";

num1=0;}

cout<<"'y'继续,'n'退出"<<endl;

cin>>choice;

str="";

if(choice=='n')break;

}

system("pause");

return 0;

}

double chuli(string stra)

{

string strb="";double dou;

for(int a=0;a<stralength();a++){//1

if(isdigit(stra[a])||stra[a]==''){//11

strb+=stra[a];

if(!isdigit(stra[a+1])&&stra[a+1]!=''){//111

dou=atof(strbc_str());

opndpush(dou);

strb="";}//111

}//11

if(stra[a]=='+'|| stra[a]=='-'||stra[a]==''||stra[a]=='/'||stra[a]=='%'||stra[a]=='^'){//12

if(a==0){//121

opndpush(0);

optrpush(str[a]);}//121

else if(stra[a-1]=='('){//124

opndpush(0);

optrpush(str[a]);}//124

else if(optrempty()){

optrpush(stra[a]);

}

else if(you(stra[a])>you(optrtop())){//122

optrpush(stra[a]);

}//122

else if(you(stra[a])<=you(optrtop())){//123

while(!optrempty()&&you(stra[a])<=you(optrtop())&&optrtop()!='('){

double left,right;

right=opndtop();

opndpop();

left=opndtop();

opndpop();

opndpush(count(left,optrtop(),right));

optrpop();}

optrpush(stra[a]);

}//123

}//12

if(stra[a]==')'&&optrtop()=='('){//13

optrpop();

}//13

if(stra[a]==')'&&optrtop()!='('){//16

while(optrtop()!='('){//161

double left,right;

right=opndtop();

opndpop();

left=opndtop();

opndpop();

opndpush(count(left,optrtop(),right));

optrpop();}//161

optrpop();

}//16

if(stra[a]=='('){//14

optrpush('(');

}//14

if(stra[a]=='='){//15

while(!optrempty()){//151

double left,right;

right=opndtop();

opndpop();

left=opndtop();

opndpop();

opndpush(count(left,optrtop(),right));

optrpop();}//151

}//15

}//1

return opndtop();

}

#include <iostream>

using namespace std;

#define m 45

#define n 100

#define t 10

int main()

{

FILE fp;

char filename[20],c[n];

printf("Type the file name which you want to open:");

scanf("%s",&filename);

fp=fopen(filename,"r+"); /以r-只读方式打开指定文件/

if((fp=fopen(filename,"r"))==NULL) /文件不存在输出错误/

{cout<<"文件不存在!"<<endl;exit(-1);}

cout<<"文件中内容如下:"<<endl;

for(int j=0;!feof(fp);j++){

c[j]=fgetc(fp);//从流中读取字符

}

char keyword[m][t]={"include","int","string","cout","cin","auto","break","case","char","class","const",

"continue","default","delete","do","double","else","enum","extern","float","for","friend","if","inline",

"int","long","new","operator","private","protected","public","register","return","short","sizeof","static",

"struct","switch","template","this","typedef","union","virtual","void","while"};//关键字数组

char a[t],p=c,q=a,s=a;

bool w=0,r=0;

int i=0;

for(i=0;i<10;i++)a[i]=NULL;//初始化临时数组

while (p !=NULL){

q=s=a;

if((p>='a'&&p<='z')||(p>='A'&&p<='Z')||p=='_'){//识别标识符

q=p;p++;q++;

while ((p>='a'&&p<='z')||(p>='A'&&p<='Z')||(p>='0'&&p<='9')||p=='_'){

q=p;p++;q++;

}

for(i=0;i<m;i++)if(strcmp(keyword[i],a)==0){r=1;break;}

if(r==1){cout<<"关键字为:";r=0;}

else cout<<"标识符为:";

while(s!=q){

cout<<s;

s++;

}

cout<<endl;

for(i=0;i<t;i++)a[i]=NULL;

}

else if(p=='\''){//识别字符常量

p++;

while(p!='\''){

q=p;

p++;

q++;

}

cout<<"字符常量为:";

while(s!=q){

cout<<s;

s++;

}

cout<<endl;

for(i=0;i<t;i++)a[i]=NULL;

p++;

}

else if(p=='\"'){//识别字符串常量

p++;

while(p!='\"'){

q=p;

p++;

q++;

}

cout<<"字符串常量为:";

while(s!=q){

cout<<s;

s++;

}

cout<<endl;

for(i=0;i<t;i++)a[i]=NULL;

p++;

}

else if(p=='+'||p=='-'||p==''||p=='/'||p=='='||p=='%'||p=='/'){//识别运算符

cout<<"运算符为:"<<p;

cout<<endl;

p++;

}

else if(p==';'||p==','){//识别分解符

cout<<"分界符为:"<<p;

cout<<endl;

p++;

}

else if(p>='0'&&p<='9'){

s=q=a;

q=p;p++;q++;

while(p>='0'&&p<='9'||p==''){

q=p;p++;q++;

}

while(s!=q){

if(s==''){w=1;break;}//识别实型常量

s++;

}

s=a;

if(w ==1){

cout<<"实型常量为:";

while(s!=q){

cout<<s;

s++;

}

for(i=0;i<t;i++)a[i]=NULL;

}

else {

cout<<"整型常量为:";

while(s!=q){//识别整型常量

cout<<s;

s++;

}

for(i=0;i<t;i++)a[i]=NULL;

}

cout<<endl;

}

else p++;

}

return 0;

}

时间:2012-10-30 晚

要求:输入一串字符串,对其进行词法分析,并且按照(<种别>,<字符串/数字>)格式进行输出

种别编码:

符号 种别 符号 种别 符号 种别

begin 1 + 13 <= 22

if 2 - 14 > 23

then 3 15 >= 24

while 4 / 16 = 25

do 5 : 17 ; 26

end 6 := 18 ( 27

l(l|d) 10 < 20 ) 28

数字① 11 <> 21 # 0

①数字的词法正规式如下:( +|-|ε ) dd(dd | ε)( e ( +|-|ε ) dd|ε)

ps:输入的字符串以“#”结尾

运行环境:VC++60

说明:搜索网上的资源,大部分的“数字”部分都是dd形式,但这次试验要求的是①形式,因而在数字部分做了很大努力。与dd形式的不同有三个地方——ch是数字时,ch是+后接着是数字形式,ch是-后接着是数字形式。然而由于水平有限,时间较短,每个“加号”或“减号”后必须要在输入数字正负符号,否则会默认“+”“-”为正负符号而不是“加号”“减号”。希望能有简单方法解决这个问题。

源代码:

#include <stdioh> //定义I/O库所用的某些宏和变量

#include <stringh> //定义字符串库函数

#include <mathh> //定义数学运算符号库函数

char prog[80],token[8]; //prog:缓冲区;token:一个有意义的字符串

char ch; //ch:当前处理的字符

int syn,p,m,n,f,e;

//syn:类别;p,m,n:计数变量;f,标记数字正负;e,10的次方数

double sum; //sum,数字

char rwtab[6]={"begin","if","then","while","do","end"};

//基本字表置初值

void main(void) //主函数

{

void scaner(void); //声明函数

p=0;

printf("\n请输入字符串:\n");

do{ //输入的字符放入缓冲区

ch=getchar();

prog[p++]=ch;

}while(ch!='#');

p=0;

do{ //分析词法并输出结果

scaner();

switch(syn)

{

case 11:printf("(%2d,%16g)\n",syn,sum);break;

case -1:printf("输入错误\n");break;

default:printf("(%2d,%16s)\n",syn,token);

}

}while(syn!=0);

}

void scaner(void)

{

for(n=0;n<8;n++) //token初始化

token[n]=NULL;

ch=prog[p++];

while(ch==' ') //如果取消空字符(目前空字符只包括空格)

ch=prog[p++];

if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))

//如果ch是字母字符

{

m=0;

while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9'))

//如果ch是字母字符或数字字符

{

token[m++]=ch;

ch=prog[p++]; //读下一个字符

}

token[m++]='\0';

p--;

syn=10;

for(n=0;n<6;n++)

if(strcmp(token,rwtab[n])==0)

{

syn=n+1; //给出syn值

break;

}

}

else if(ch>='0'&&ch<='9') //数字(1)

{

sum=0;

while(ch>='0'&&ch<='9')

{

sum=sum10+ch-'0';

ch=prog[p++];

}

if(ch=='') //有小数点

{

e=-1;

ch=prog[p++];

if(ch>='0'&&ch<='9')

{

while(ch>='0'&&ch<='9')

{

sum=sum+(ch-'0')pow(10,e--);

ch=prog[p++];

}

}

}

if(ch=='e'||ch=='E') //有e

{

e=0,f=1;

ch=prog[p++];

if(ch=='+')

{

f=1;

ch=prog[p++];

}

else if(ch=='-')

{

f=-1;

ch=prog[p++];

}

if(ch>='0'&&ch<='9')

{

while(ch>='0'&&ch<='9')

{

e=e10+ch-'0';

ch=prog[p++];

}

}

e=ef;

sum=sumpow(10,e);

}

p--;

syn=11;

}

else switch(ch)

{

case '<':

m=0;

token[m++]=ch;

ch=prog[p++];

if(ch=='>') //<>

{

syn=21;

token[m++]=ch;

}

else if(ch=='=') //<=

{

syn=22;

token[m++]=ch;

}

else //<

{

syn=20;

p--;

}

break;

case '>':

m=0;

token[m++]=ch;

ch=prog[p++];

if(ch=='=') //>=

{

syn=24;

token[m++]=ch;

}

else //>

{

syn=23;

p--;

}

break;

case ':':

m=0;

token[m++]=ch;

ch=prog[p++];

if(ch=='=') //:=

{

syn=18;

token[m++]=ch;

}

else //:

{

syn=17;

p--;

}

break;

case '+':

ch=prog[p++];

if(ch>='0'&&ch<='9') //数字(2)

{

sum=0;

while(ch>='0'&&ch<='9')

{

sum=sum10+ch-'0';

ch=prog[p++];

}

if(ch=='') //有小数点

{

e=-1;

ch=prog[p++];

if(ch>='0'&&ch<='9')

{

while(ch>='0'&&ch<='9')

{

sum=sum+(ch-'0')pow(10,e--);

ch=prog[p++];

}

}

}

if(ch=='e'||ch=='E') //有e

{

e=0,f=1;

ch=prog[p++];

if(ch=='+')

{

f=1;

ch=prog[p++];

}

else if(ch=='-')

{

f=-1;

ch=prog[p++];

}

if(ch>='0'&&ch<='9')

{

while(ch>='0'&&ch<='9')

{

e=e10+ch-'0';

ch=prog[p++];

}

}

e=ef;

sum=sumpow(10,e);

}

p--;

syn=11;

}

else //+

{

syn=13;

p--;

ch=prog[p-1];

token[0]=ch;

}

break;

case '-':

ch=prog[p++];

if(ch>='0'&&ch<='9') //数字(3)

{

sum=0;

while(ch>='0'&&ch<='9')

{

sum=sum10+ch-'0';

ch=prog[p++];

}

if(ch=='') //有小数点

{

e=-1;

ch=prog[p++];

if(ch>='0'&&ch<='9')

{

while(ch>='0'&&ch<='9')

{

sum=sum+(ch-'0')pow(10,e--);

ch=prog[p++];

}

}

}

if(ch=='e'||ch=='E') //有e

{

e=0,f=1;

ch=prog[p++];

if(ch=='+')

{

f=1;

ch=prog[p++];

}

else if(ch=='-')

{

f=-1;

ch=prog[p++];

}

if(ch>='0'&&ch<='9')

{

while(ch>='0'&&ch<='9')

{

e=e10+ch-'0';

ch=prog[p++];

}

}

e=ef;

sum=sumpow(10,e);

}

sum=-sum;

p--;

syn=11;

}

else //-

{

syn=13;

p--;

ch=prog[p-1];

token[0]=ch;

}

break;

case '': syn=15;token[0]=ch;break;

case '/': syn=16;token[0]=ch;break;

case '=': syn=25;token[0]=ch;break;

case ';': syn=26;token[0]=ch;break;

case '(': syn=27;token[0]=ch;break;

case ')': syn=28;token[0]=ch;break;

case '#': syn=0;token[0]=ch;break;

default: syn=-1;

}

}

试试吧

既然是C语言词法分析器,那就是用C/C++对一段C语言文本进行词法分析,C语言中的for语句、while语句、switch语句、if语句等等的进行分析并将其提取出来的一个设计和实现过程而矣

这是大学专门有一门《编译原理》的课程而矣

这个是编译原理的课程设计吧, 做词法分析这个题目算是最简单的了

只需输入合法词的正则表达式,就可以输出一个确定有限状态自动机(DFA),而DFA的表现形式,往往是一张分析表。

有了词法分析器的自动生成器,则可以避免繁琐的单词识别程序,直接对照分析表即可得出yes or no,

以上就是关于C语言程序设计题全部的内容,包括:C语言程序设计题、求C语言编译原理语法分析程序、做一个简单的词法分析器, 一:要求能识别C程序中的部分关键字 int, char ,float if,else main, prin等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9307868.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存