编译原理课程设计——算术表达式、for、while语句转换为四元式

编译原理课程设计——算术表达式、for、while语句转换为四元式
编译原理课程设计——算术表达式、for、while语句转换为四元式

计算机与信息学院《操作系统与编译原理联合课程设计报告》

专题:编译原理部分

学生姓名:

学号:

专业班级:

2014 年 7 月

一、设计目标

设计一个语法制导翻译器,将算术表达式、for语句、while语句翻译成四元式。要求先确定一个定义算术表达式、for语句、while 语句的文法,为其设计一个语法分析程序,为每条产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现翻译程序。对用户输入的任意一个正确的表达式,程序将其转换成四元式输出。

二、设计思路

开发平台:Visual C++ MFC

解决这个问题的方案分为以下几个步骤:

1.将算数表达式、for语句、while语句转换为四元式的第一步为对读入的表达式进行处理,即删除不必要的空格、回车、换行等,保证之后的步骤能够顺利进行。

2.分析算术表达式、for语句、while语句的文法。

3.通过词法分析判断语句中的每个字符的类型,如:数字、字母、符号等。

4.建立每种文法的LR(0)分析表,通过每个文法的LR(0)分析表对相应的表达式进行语法分析。

5.在语法分析正确的情况下,通过语法分析的中间过程的符号栈输出四元式,四元式的形式为:(op arg1 arg2 result)。

(一)算术表达式转换为四元式

将算术表达式转换为四元式首先考

虑了括号的问题,对于不同的算术表达

式第一步进行词法分析,即确定各种符

号的位置。而括号中的式子是优先级最

高的,应该最先进行处理。我使用了一

个数组记录算术表达式中括号的位置,

并且定义了first_cc和first_jj函数

对括号内的乘除法和加减法分别进行

处理。后将括号内的式子以四元式的形

式输出。

通过以上转换,已将原算术表达式中的括号中的内容使用大写字母’A’、’B’……等代替(其中定义声明了change函数,用来将括号部分替换为大写字母)。新的式子中,只含有加减乘除以及赋值这四种运算,后根据优先级的不同,逐步生成四元式。

其算法流程图如右图所示。

(二)for语句转换为四元式

语句的文法如下:

S-> f ( E ; F ; G ){ H ;}

S-> f ( E ; X ; Y ){ H ;}

E-> id = c

F-> id < c

G-> id + +

X-> id > c

Y-> id ––

H-> id1 = id2 + id3

H-> id1 = id2 + c

H-> id1 = c+ id2

其中c 表示常数const,f表示关键字for, id表示一般标识符。for循环体内部的表达式一般为算术表达式,而算术表达式转换为四元式的方法在第一部分已给出,此处H只考虑比较简单的情况。

语句的LR(0)分析表如下:

3. 基本算法流程:

本算法定义声明了两个结构体:一个是Node结构体,其中char 型的type中存储当前符号的类型,CString型的sValue中存储的为

当前符号,int型的eValue只有在符号类型为数字的情况下才进行存储,存储数字的大小;另一个为stack结构体,这个结构体是实现语法分析中的符号栈和状态栈使用的,并未这两个栈分别定义了各自的pop函数和push函数。

除此之外,本算法中的LR(0)分析表通过二维数组存储。其中分为action表和goto表。action表中的状态转换符号,用2-44表示,规约的符号,用101-110表示。

具体的算法流程图如下:

(三)while语句转换为四元式语句的文法如下:

(1)S->while(B){E}

(2)E->AE

(3)E->A

(4)A->iPA

(5)A->i

(6)B->iTi

(7)B->i

其中while、( 、) 、{ 、} 、P、T 、;和i均为终结符,而S、A、B、E这些大写字母均为非终结符。T表示比较运算符,P表示算术运算符,i表示合法标识符。

语句的LR(0)分析表如下:

3.基本算法流程:

本算法的基本思想与for语句转换成四元式的思想比较相似,都是对读入的语句进行词法分析,后再通过LR(0)分析表对语句进行语法分析,并同时输出四元式。

与for语句转换成四元式不同的是,while语句转换为四元式在结构体定义等方面做了改进。首先是LR(0)分析表的存储方式进行了改进,本算法中为LR(0)分析表定义了一个table的结构体,将action 和goto两个部分全部存入table的结构体中,是查表的时候更加方便。

除此之外,还定义了obj结构体,此结构体主要是为了存储所要输出的四元式,定义了此结构体之后,程序的调理变得更为清晰了。

本算法中符号栈以及状态栈的部分主要调用了c++中原有的stack结构体,使用其本身定义的pop函数以及push函数,简化的代码。

以下为算法的流程图:

(四)输入、输出以及界面设计

1.输入:

本程序的输入均为语句或表达式,若每次测试程序均输入表达式,则会输入大量式子,浪费时间。所以本程序采用文件读入的形式,只需要在指定位置输入文件名即可。

2.输出:

本程序输出的四元式全部在MFC界面的文本框中显示。可以复制,方便之后的使用。

3.界面设计:

本程序为了方便使用以及界面美观,使用了MFC中的TabControl

控件,界面设计如下:

图中当前标签为“while语句”,显示的界面为“while语句转换为四元式”。通过若点击其他标签按钮,界面也会切换到相应的界面。每个界面都是一个对话框,如下图所示:

(1)作为主要的文件,去调用其他的对话框。首先对每一个对话框(IDD_DIALOG1-3)进行设置,样式:下层;边框:无。如下图所示:

(2)后在文件中添加每个对话框的头文件,以及申明每个对话框,代码如下:

#include ""

#include ""

#include ""

CDlg1 page1;

CDlg2 page2;

CDlg3 page3;

(3)在初始化函数CCompilerDesignDlg::OnInitDialog()中编写相关代码:

(0, "算术表达式");

(1, "for语句");

(2, "while语句");

(IDD_DIALOG1, &m_tabCtrl); (IDD_DIALOG2, &m_tabCtrl); (IDD_DIALOG3, &m_tabCtrl); CRect rc;

(&rc);

+= 22;

-= 3;

+= 2;

-= 3;

ype;

if(st[i]=='f')

{

GetDlgItemText(IDC_CF,str_cf);

CString temp_str3="关键字:for\r\n";

SetDlgItemText(IDC_CF,str_cf+temp_str3); }

else if (st[i]=='i')

{

CString temp_str3=node[i].sValue;

str_i=str_i+temp_str3+" ";

}

else if(st[i]=='c')

{

CString temp_str3=node[i].sValue;

str_c=str_c+temp_str3+" ";

number[count++]=node[i].sValue;

}

}

GetDlgItemText(IDC_CF,str_cf);

SetDlgItemText(IDC_CF,str_cf+"符号:"+str_i+"\r\n"+"常数:"+str_c+"\r\n");

for (i = 0; i

ah[i] = node[i].sValue; ct_0[k] == 's'){

int row = ();

(row, "");

ct_1[k];

tmp_n = strlen(fuhao) - 1;

fuhao[++tmp_n] = shuru[i++];

CString str00="";

for (l = 0; l

CString temp_str1;

("%d",Tai[l]);

str00=str00+temp_str1;

}

(row, 0, str00);

CString str11=fuhao;

(row, 1, str11);

CString str22="";

for (l = i; l

CString temp_str2=shuru[l];

str22=str22+temp_str2;

}

(row, 2, str22);

}

else if (action[j].act_0[k] == 'r'){

int row = ();

(row, "");

X = strlen(W[action[j].act_1[k]]) - 1;

for (m = len; m

fuhao[m] = '\0';

fuhao[len] = W[action[j].act_1[k]][0]; switch (W[action[j].act_1[k]][0]){ case 'S':

l = 0;

break;

case 'E':

l = 1;

break;

case 'B':

l = 2;

break;

case 'A':

break;

}

len += 1;

Tai[len - 1] = action[Tai[len - 2]].go[l];

CString str00="";

for (l = 0; l

CString temp_str1;

("%d",Tai[l]);

str00=str00+temp_str1;

}

(row, 0, str00);

CString str11=fuhao;

(row, 1, str11);

CString str22="";

for (l = i; l

{

CString temp_str2=shuru[l]; str22=str22+temp_str2;

}

(row, 2, str22);

}

else if (action[j].act_0[k] == 'Z'){

break;

}

else{

}

}

}

函数:主要用于操作符号栈,并且输出四元式。

【教学】For循环语句

【关键字】教学 《F o r循环语句》教学设计 池州市第八中学杜亦麟 课题 For循环语句 教学内容 粤教版信息技术(选修1)《算法与程序设计》第二章《程序设计根底》第四节《程序的循环结构》第一小节《For循环语句》 教学目标 知识与能力: 1.理解循环结构的基本思想及For语句的执行过程。 2.培养和提高学生逻辑思维能力,使其可以独立完成简单循环结构算法的设计。 3.能够利用For循环语句实现循环结构,解决实际问题。 过程与方法: 1.通过简单的数学问题的分析、讲解,让学生掌握For循环语句语法知识,及其执行原理。 2.以任务驱动,学生分组合作探究的方式,进一步让学生理解For循环语句的基本思想,同时培养学生自主探究和合作学习的能力。 3.通过自评和互评活动,培养学生语言表达能力和归纳总结能力。 情感态度与价值观: 1.提高学生学习兴趣,培养学习的主动性和探究性。 2.培养学生团结协作精神,体验成功的快乐。 教学重点 1.掌握For循环语句的格式和功能; 2.理解For循环语句的执行过程。 教学难点 控制循环的条件、确定循环体的内容 教材分析 第二章是程序设计根底,也是全书的根底。它沿着分析问题、设计算法、编写程序等运用计算机解决问题之路,开始学习如何使用VB程序设计编写程序解决问题。本节课的主要内容For语句的基本格式、执行过程及语句的实际应用。又是本章的重点和难点内容。而循环结构是程序设计的三种基本结构之一,其作用是使一段程序反复执行。For循环语句在程序设计中频繁出现,也是三种结构中较难的一种,因此,学好本节课非常重要,本节课的学习会使学生对算法有一个更深刻的理解,为以后的程序设计打下一个良好的根底,也可以培养学生的创新能力、分析问题和解决问题的能力以及探究精神。 学生分析 1、知识储备根底 在前面的学习中,同学们已经初步掌握了VB编程环境和VB程序的运行方法及程序设计的根底知识,学习了顺序结构和分支结构的程序执行流程和编程。具备一定的算法根底和具有一定的比较、归纳能力。

算术表达式的求解-数据结构课程设计报告

课程设计报告 题目:算术表达式求值 一、需求分析 1、设计要求: 给定一个算术表达式,通过程序求出最后的结果 1>、从键盘输入要求解的算术表达式; 2>、采用栈结构进行算术表达式的求解过程; 3>、能够判断算术表达式正确与否; 4>、对于错误表达式给出提示; 5>、对于正确的表达式给出最后的结果; 2、设计构想: 为了实现算符优先算法使用两个工作栈,一个称作OPTR,以寄存运算符;另一个称作OPND,用以寄存操作数或运算结果。在操作数和操作符入栈前,通过一个函数来判别,输入的是操作数还是操作符,操作数入OPND,操作符入OPTR。在输入表达式的最后输入‘#’,设定‘#’的优先级最低,代表表达式输入结束。在表达式输入过程中,遇操作数则直接入栈,遇到运算符则与栈顶运算符比较优先级,若当前运算符优先级高,则当前运算符入栈,扫描下一符号;否则栈顶运算符出栈,两操作数出栈,进行运算,所得结果入数栈,重新比较当前运算符与新栈顶运算符。如此重复直到栈顶运算符与当前符号均为‘#’,运算结束。 二、概要设计 1、本程序包含的模块:

(1)栈模块——实现栈抽象数据类型 (2)运算模块——实现数据表达式的运算(3)主程序模块 三、详细设计 (1)栈模块 1、定义栈结构 struct Sqstack

{ elemtype *top;//栈顶元素 elemtype *base; //栈底元素 int stacksize;//栈的大小 }; 2、栈的基本操作 ①初始化栈 status initstack(struct Sqstack &s) { s.base=(elemtype *)malloc(stack_size*sizeof(elemtype)); if(!s.base) return OVERFLOW; s.top=s.base; s.stacksize=stack_size; return OK; } ②入栈 status push(struct Sqstack &s,elemtype e) {

while循环

while 循环 语法形式: while(条件) { 需要循环执行的语句; } while 是“当”的意思。 请首先和if语句作一个比较: if(条件) { 条件成立时执行的语句; } 二者除了关键字不一样以外,结构完全一样。但一定要注意,在条件成立时,if语句仅仅执行一遍,而while语句则将反复执行,直到条件不再成立。 请看while循环的流程图: 程序从“前面的语句”开始执行,然后进行条件判断,如果条件成立,则执行一次“每次循环执行 的语句”,再后请特别注意红色部分,这是我们碰上的,第一次会往后走流程:红线就像汽车拐弯, 掉头到条件处(并不包括前面的语句),然后再进行下一次的条件判断……直到某一次判断时条件不 成立了,程序“继续后面的语句”。

我们用while的语法套用生活中的实际例子,可以直观地看出while的用法。 假设有一个爱哭的小娃娃,有一天她要求父母给买一条小红裙,可惜父母不同意,于是她就开始一个循环: while ( 父母不给买小红裙) { 我哭; } 这段“代码”的意思是:当“父母不给买小红裙”,那么,小女孩就一遍一遍地哭。 这就是我们和循环流程的第一个遭遇战。所举的例子看似直观:“小孩一遍遍地哭,直到父母给买裙”,但真正要用程序的语言来正确地表达出来,需要很多方面要考虑到,必竟,程序是严谨的。 首先,一个合适的判断是否继续的条件相当重要。小女孩要继续哭,仅仅“父母不给买小红裙”,这显示不符合事实,想想我们小时候,再会哭,最终也有累的时候,所以,要想继续哭,我们的条件有两个:“父母不给买小红裙”并且“我还没有哭累”。 while ( 父母不给买小红裙&& 我还没有哭累) { 我哭; } 其次,大多数情况下,条件需要被恰当地改变。小女孩在不停地哭,那么她如何知道父母是否买了红裙呢?所以,她不能只顾哭,还得在哭的间隙观察大人是否同意买裙。至于是否哭累,我们假设小女孩有一个疲劳度,每哭一次疲劳度加1,当疲劳度到达200时,可怜的小女孩累了…… while(父母不给买小红裙&& 疲劳度< 200) { 我哭; 我偷看爸妈是否同意买裙; 疲劳度++; } 例一:用while 语句实现求从1到100的累加和。 求1+2的和,我们可以写a = 1 + 2;求1加到100,我们当然可以这样写a = 1 + 2 + 3 + ... 100.不过这样写显然太累人了,要从1写到100啊!所以聪明如高斯的你,当然也知道这样写:a = (1+100) * 50;这确实是个在任何时候都值得称赞的,又快又简的方法,只是今天我们想让计算机累一点,老老实实地从1加到100。首先用我们先学的while式的循环。 请同学们打开CB,然后新建一空白的控制台程序,在main()函数体加入下面黑体部分代码。然后按F9运行。查看运行结果以加深印象。 //--------------------------------------------------------------------------- #include #pragma hdrstop //--------------------------------------------------------------------------- #pragma argsused int main(int argc, char* argv[])

c语言for循环的嵌套题(含解析和答案)

第33、34课时for循环的嵌套 实验题一: 1、下面有关for循环的正确描述是: D A) for循环只能用于循环次数已经确定的情况 B) for循环是先执行循环体语句,后判断表达式 C) 在for循环中,不能用break语句跳出循环体 D) for循环的循环体语句中, 可以包含多条语句,但必须用花括号括起来 2、对for(表达式1;;表达式3)可理解为:B A) for(表达式1; 0;表达式3) B) for(表达式1;1;表达式3) C) for(表达式1;表达式1;表达式3) D) for(表达式1;表达式3;表达式3) 3、若i为整型变量,则以下循环执行次数是:B for (i=2;2==0;) printf("%d",i-- ); A)无限次B) 0次 C) 1 次 D) 2次 4、以下for循环的执行次数是:C for (x=0,y=0; (y=123)&&(x<4); x++) ; A)是无限循环 B)循环次数不定C)执行4次 D)执行3次

成立,x++x=2 第三次:(y=123)&&(2<4)成立,x++x=3 第四次:(y=123)&&(3<4)成立,x++x=4 第五次:(y=123)&&(4<4)不成立,退出循环。 5、以下不是无限循环的语句为:A A) for (y=0,x=1;x > ++y;x =i++) i=x ; B) for (;1; x++=i); C) while (1) {x ++;} D) for(i=10;1 ;i--) sum+=i; 6、下面程序段的运行结果是:C for (y=1;y<10;) y=((x=3* y,x+1),x-1); printf ("x=%d,y=%d",x,y); A)x=27,y=27 B)x=12,y=13 C)x=15,y=14 D)x=y=27 第一次:1<10为真,x=3,x+1=3+1=4, y=(4,x-1) y=(4,2)=2 第二次: 2<10为真, x=3*2=6,7 y=(7,x-1)=(7,5) y=5 第三次:5<10为真,x=3*5=15 16 y=(16,x-1)=(16,14) y=14 第四次: 14<10为假,

编译原理课程设计——算术表达式、for、while语句转换为四元式

计算机与信息学院 操作系统与编译原理联合课程设计报告》 专题:编译原理部分学生姓名:学号: 专业班级:指导教师: 2014 年7 月

一、设计目标设计一个语法制导翻译器,将算术表达式、for 语句、while 语句翻译成四元式。要求先确定一个定义算术表达式、for 语句、while 语句的文法,为其设计一个语法分析程序,为每条产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现翻译程序。对用户输入的任意一个正确的表达式,程序将其转换成四元式输出。 二、设计思路开发平台:Visual C++ MFC 解决这个问题的方案分为以下几个步骤: 1. 将算数表达式、for 语句、while 语句转换为四元式的第一步为对读入的表达式进行处理,即删除不必要的空格、回车、换行等,保证之后的步骤能够顺利进行。 2. 分析算术表达式、for 语句、while 语句的文法。 3. 通过词法分析判断语句中的每个字符的类型,如:数字、字母、符号等。 4. 建立每种文法的LR(0) 分析表,通过每个文法的LR(0) 分析表对相应的表达式进行语法分析。 5. 在语法分析正确的情况下,通过语法分析的中间过程的符号栈输出四元式,四元式的形式为:( op arg1 arg2 result )。 (一)算术表达式转换为四元式将算术表达式转换为四元式首先考虑了括号的问题,对于不同的算术表达式第一步进行词法分析,即确定各种符号的位置。而括号中的式子是优先级最高的,应该最先进行处理。我使用了一个数组记录算术表达式中括号的位置,并且定义了first_cc 和first_jj 函数对括号内的乘除法和加减法分别进行处理。后将括号内的式子以四元式的形式输出。通过以上转换,已将原算术表达式中的括号中的内容使用大写字母' A'、' B'??等代替(其中定义声明了change 函数,用来将括号部分替换为大写字母)。新的式子中,只含有加减乘除以及赋值这四种运算,后根据优先级的不同,逐步生成四元式。 其算法流程图如右图所示。 (二)for 语句转换为四元式 1. For 语句的文法如下: S-> f ( E ; F ; G ){ H ;} S-> f ( E ; X ; Y ){ H ;} E-> id = c F-> id < c G-> id + + X-> id > c Y-> id ––

算术表达式求值演示程序

数理学院 课程设计报告书 课程名称数据结构课程设计 设计题目算术表达式求值演示 专业班级 学号 姓名 指导教师

2014 年12 月

4.2.2 基本操作: InitStack(&S) 操作结果:构造一个空栈S。 GetTop(S) 初始条件:栈S 已存在。 操作结 果: 用P 返回S的栈顶元素。Push(&S 初始条 件:,ch) 栈S 已存在。 操作结 果:插入元素ch 为新的栈顶元素。 Pop(&S) 初始条件:栈S 已存在。 操作结 果:删除S 的栈顶元素。 In(ch) 操作结果:判断字符是否是运算符,运算符即返回1 Precede(c1, c2) 初始条件:c1,c2 为运算符。操作结果:判断运算符优先权,返回优先权高的。Operate(a,op,b) 初始条件:a,b 为整数,op为运算符。操作结果: a 与 b 进行运算,op 为运算符,返回其值。num(n) 操作结果:返回操作数的长度。EvalExpr() 初始条件:输入表达式合法。操作结果:返回表达式的最终结果。}ADT Stack 主程序的流程:

EvaluateExpression() 函数实现了对表达式求值的功能,main() 函数直接调用EvaluateExpression() 对输入的表达式求值输出。 4.2.3 函数的调用关系图

4.3 详细设计 4.3.1 ① . Precede(char c1,char c2)判断运算符优先权,返回优先权高的 算符间的优先关系 如下: 算法伪代码如下: char Precede(char c1,char c2) { static char array[49]={ >', '>', '<', '<', '<', '>', '>', >', '>', '<', '<', '<', '>', '>', >', '>', '>', '>', '<', '>', '>', >', '>', '>', '>', '<', '>', '>', <', '<', '<', '<', '<', '=', '!', >', '>', '>', '>', '!', '>', '>', <', '<', '<', '<', '<', '!', '='}; // 用一维数组存储 49 种情况 switch(c1) { /* i 为下面 array 的横标 */ case '+' : i=0;break; case '-' : i=1;break; case '*' : i=2;break;

for循环语句

for循环语句 for循环语句也称为计次循环语句,一般用于循环次数已知的情况。例如,要计算1到100之间所有整数的和,就可以使用for循环语句。具体代码如下: int sum=0; for(int i=1;i<=100;i++){ sum+=i; } System.out.println("1到100之间所有整数的和是: "+sum); 在对for循环语句有一个初步的认识后,下面给出for循环语句的语法格式。for循环语句的语法格式如下: for(初始化语句;循环条件;迭代语句){ 语句序列 } 初始化语句:为循环变量赋初始值的语句,该语句在整个循环语句中只执行一次。 循环条件:决定是否进行循环的表达式,其结果为boolean类型,也就是其结果只能是true或false。 迭代语句:用于改变循环变量的值的语句。 语句序列:也就是循环体,在循环条件的结果为true时,重复执行。 说明: for循环语句执行的过程是:先执行为循环变量赋初始值的语句~然后判断循环条件~如果循环条件的结果为true~则执行一次循环体~否则直接退出循环~最

后执行迭代语句~改变循环变量的值~至此完成一次循环,接下来将进行下一次循环~直到循环条件的结果为false~才结束循环。 for循环语句的执行过程如图1所示。 初始化语句 N循环条件 Yfor(初始化语句;循环条件;迭代语句) 语句序列(循环体) 语句序列(循环体) 执行迭代语句 改变循环变量的值 N-S结构化流程图 传统流程图 图1 for循环语句的执行流程图 注意: 在使用for语句时~一定要保证循环可以正常结束~也就是必须保证循环条件的结果存在为false的情况~否则循环体将无休止的执行下去~从而形成死循环。例如~下面的循环语句就会造成死循环~原因是i永远大于等于1。 for(int i=1;i>=1;i++){ System.out.println(i); } 为了使读者更好的理解for语句,下面将以一个具体的实例介绍for语句的应用。本实例主要实现计算100以内所有奇数的和。具体步骤如下。 (1)选择“开始”/“所有程序”/“附件”/“记事本”命令,打开一个无标题的记事本文档。

带格式的输出语句及输入语句

带格式的输出语句及输入语句 一、输入语句(读语句) 在程序中可以用赋值语句给变量获得一个确定的值,但是变量的值经常变化,尤其初始化时,则必须使用输入语句──读语句,将更为方便。读语句是在程序运行时由用户给变量提供数据的一种很灵活的输入动作,它有两种格式: 1.读语句的一般格式: read(<变量名表>); readln[(<变量名表>)]; 其中变量名表是用逗号隔开的若干个变量名组成的。 功能:从标准输入(即INPUT,一般对应着键盘)中读入数据,并依次赋给相应的变量。 说明: ①read和readln是标准过程名,它们是标准标识符。 ②执行到read或readln语句时,系统处于等待状态,等待用户从键盘上输入数据,系统根据变量的数据类型的语法要求判断输入的字符是否合法。如执行read(a)语句,a是整型变量,则输入的字符为数字字符时是合法的,合法的情况下将输入的整数赋给变量a。 ③在输入数值型(整型或实型)数据时,数据间要用空格或回车分隔开各个数据,一定要输入足够个数的数据,否则仍要继续等待输入,但最后一定要有回车,表示该输入行结束,直到数据足够,读语句执行结束,程序继续运行。 例3. 设a、b、c为整型变量,需将它们的值分别赋以10,20,30,写出对应下列语句的所有可能输入格式。 Read(a,b,c); 解 根据③,即可列出所有可能输入格式 (a)10□20□30←┘ (b)10□20←┘ 30←┘ (c)10←┘ 20□30←┘ (d)10←┘ 20←┘ 30←┘ 其中"←┘"表示回车键。 ④read语句与readln语句的第一个区别是:

read语句是一个接一个地读数据,在执行完本Read语句(读完本语句中变量所需的数据)后,下一个读语句接着从该数据输入行中继续读数据,也就是说,不换行。如: Read(a,b); Read(c,d); Read(e); 如果输入数据行如下: 1□2□3□4□5□6□←┘ 则a,b,c,d,e的值分别为1,2,3,4,5,如果后面无读语句则数据6是多余的,这是允许的。 Readln则不同,在读完本Readln语句中变量所需的数据后,该数据行中剩余的数据多余无用,或者说,在读完本Readln语句中变量所需数据后,一定要读到一个回车,否则多余的数据无用。 例4 设要达到例1同样的目的,但语句改为: readln(a,b);readln(c) 则例3中的4种输入格式只有(b)(d)是有效的. ⑤readln语句与read语句的第二个区别是:read后一定要有参数表,而readln 可以不带参数表,即可以没有任何输入项,只是等待读入一个换行符(回车)。经常用于暂停程序的运行,直到输入一个回车。 例5 设有下列语句: read(a,b,c); readln(d,e); readln; readln(f,g); 其中,所有变量均为整型。再设输入的数据如下: 1□2←┘ 3□4□5□6□7□8←┘ 9□10←┘ 11←┘ 12□13←┘ 列表给出每个变量的值.

复合算术运算符解读

复合算术运算符 现在我们来看看由几种运算符和包含混合数据类型的更复杂的表达式。 优先权规则 算术表达式能够由许多常量、变量、运算符和括号组成,那么操作执行的次序是怎样的呢?例如,在赋值语句中 avgTemp = FREEZE_PT + BOIL_PT / 2.0; 是FREEZE_PT + BOIL_PT 首先被计算呢还是 BOIL_PT / 2.0首先被计算? 基本的算术运算符的运算顺序与数学的运算符顺序是一样的,按照优先权规则: 最高优先级: 单目 + 单目 - 中等优先级: * / % 最低优先级: + - 在上面的表达式例子中隐含着用括号一样: FREEZE_PT + (BOIL_PT / 2.0 即,我们首先用2除 BOIL_PT然后加FREEZE_PT得到结果。 你能够使用括号改变求值的次序,在语句 avgTemp = (FREEZE_PT + BOIL_PT / 2.0; 中FREEZE_PT 和 BOIL_PT 首先被加,然后它们的和再除以2。我们首先求括号内的子表达式的值,然后接下来再按运算符的优先权规则求值。 当一个算术表达式有几个具有同样优先权的双目运算符时,它们的结合次序是从左到右。表达式

int1 - int2 + int3 意味着(intl - int2 + int3, 不是 int1 - (int2 + int3。另一个例子,我们使用表达式 (float1 + float2 / float1 * 3.0 首先求括号内的表达式的值,然后将得到的和除以float1再乘以3.0。下面是更多的一些例子。———————————————————— 表达式值 10/2*3 15 10%3-4/2 -1 5.0*2.0/4.0*2.0 5.0 5.0*2.0/(4.O*2.O 1.25 5.0+2.0/(4.0*2.0 5.25 ———————————————————— 在C++中, 所有的单目运算符都有从右到左的结合性,例如, - + x 意味着 - (+ x 而不是意味着(- + x。 类型的强制和类型的转换 整型值和浮点值被不同的存储在计算机存储器内,如果在一条赋值语句或算术表达式中我们将整数和浮点值混合在一起会发生什么情况?让我们首先看看赋值语句。 赋值语句如果你做如下声明 int someInt ;

1.2.1输入、输出语句和赋值语句(教、学案)

1. 2.1输入、输出语句和赋值语句 【教学目标】 1.正确理解输入语句、输出语句、赋值语句的结构。 2.会写一些简单的程序。 3.掌握赋值语句中的“=”的作用 【重点与难点】 教学重点:正确理解输入语句、输出语句、赋值语句的作用。 教学难点:准确写出输入语句、输出语句、赋值语句。 【教学过程】 1.情境导入 在现代社会里, 计算机已经成为人们日常生活和工作不可缺少的工具, 如:听MP3, 看 电影, 玩游戏, 打字排版, 画卡通画, 处理数据等等, 那么, 计算机是怎样工作的呢? 计算机完成任何一项任务都需要算法, 但是, 我们用自然语言或程序框图描述的算法, 计算机是无法“看得懂, 听得见”的。因此还需要将算法用计算机能够理解的程序设计语言(programming language )翻译成计算机程序。 程序设计语言有很多种。为了实现算法中的三种基本的逻辑结构:顺序结构、条件结构、 和循环结构, 各种程序设计语言中都包含下列基本的算法语句: 输入语句 输出语句 赋值语句 条件语句 循环语句 2..探究新知 我们知道, 顺序结构是任何一个算法都离不开的基本结构。 输入、输出语句和赋值语句基本上对应于算法中的顺序结构。(如右图)计算机从上而下按照语句排列的顺序执行这些语句。 输入语句和输出语句分别用来实现算法的输入信息, 输出结果的功能。 用描点法作函数3 2 32430y x x x =+-+的图象时, 需要求 出自变量与函数的一组对应值。编写程序, 分别计算当5,4,3,2,1,0,1,2,3,4,5x =-----时的函数值。 程序: (一)输入语句 在该程序中的第1行中的INPUT 语句就是输入语句。这个语句的一般格式是:

第六课for循环语句

第六课for循环语句 在实际应用中,会经常遇到许多有规律性的重复运算,这就需要掌握本章所介绍的循环结构程序设计。在Pascal语言中,循环结构程序通常由三种的循环语句来实现。它们分别为FOR循环、当循环和直到循环。通常将一组重复执行的语句称为循环体,而控制重复执行或终止执行由重复终止条件决定。因此,重复语句是由循环体及重复终止条件两部分组成。 一、for语句的一般格式 for <控制变量>:=<表达式1> to <表达式2> do <语句>; for <控制变量>:=<表达式1> downto <表达式2> do <语句>; 其中for、to、downto和do是Pascal保留字。表达式1 与表达式2的值也称为初值和终值。 二、For语句执行过程 ①先将初值赋给左边的变量(称为循环控制变量); ②判断循环控制变量的值是否已"超过"终值,如已超过,则跳到步骤⑥; ③如果末超过终值,则执行do后面的那个语句(称为循环体); ④循环变量递增(对to)或递减(对downt o)1; ⑤返回步骤②; ⑥循环结束,执行for循环下面的一个语句。 三、说明 ①循环控制变量必须是顺序类型。例如,可以是整型、字符型等,但不能为实型。 ②循环控制变量的值递增或递减的规律是:选用to则为递增;选用downto则递减。 ③所谓循环控制变量的值"超过"终值,对递增型循环,"超过"指大于,对递减型循环,"超过"指小于。 ④循环体可以是一个基本语句,也可以是一个复合语句。 ⑤循环控制变量的初值和终值一经确定,循环次数就确定了。但是在循环体内对循环变量的值进行修改,常常会使得循环提前结束或进入死环。建议不要在循环体中随意修改控制变量的值。 ⑥for语句中的初值、终值都可以是顺序类型的常量、变量、表达式。 四、应用举例

北京交通大学 编译原理

2011级《编译原理》实验教学内容 一、学习目标 编译系统是计算机系统重要的系统软件之一,编译原理课程主要讲授编译系统重要组成部分程序设计语言编译程序的设计原理和实现技术,是计算机科学与技术专业学生的必修专业课程,也是每个优秀的计算机专业人员必修的一门课程,更重要的是,编译原理课程中蕴含着计算机科学中解决问题的思路、抽象问题和解决问题的方法,其内容可让计算机专业学生“享用一辈子”。 本课程开展研究性教学的目是,在教师的引导下以问题回朔与思维启发的方式,使学生在不断的探究过程中掌握编译程序设计和构造的基本原理和实现技术,启迪学生的抽象思维、激发学生的学习兴趣、培养学生的探究精神和专业素养,从而提高学生发现问题、分析问题和解决问题的能力。 二、学习任务 1、学习内容 以理论与教学紧密结合的五个研究性学习专题作为教学载体,这五个研究专题是: 专题1_词法分析程序构造原理与实现技术 专题2_递归下降语法分析设计原理与实现技术 专题3_LL(1)语法分析设计原理与实现技术 专题4_算符优先语法分析设计原理与实现技术 专题5_语义分析及中间代码生成程序设计原理与实现技术 2、任务要求 1)以上内容专题1必做,专题2、3、4选择二个必做;专题5选做;实验占总成绩的20%,完成选做部分在总成绩中将获得加分。 2)实验要求设计并完成所做专题,同时又能将专题完成从源程序的输入,经过词法分析、语法分析的过程,或者(选做专题5)从词法分析、语法制导翻译生成中间代码的过程。程序应能查看到词法分析的输出二元式序列,词法分析和语法分析得的输出结果。或者中间代码序列,还能给出简单的错误提示。 3)编写符合实验语言词法和语法规则的源程序进行测试,须给出尽可能完备的测试用例。 4)能力培养:深入理解理论对实践的指导作用;基本原理、实现技术和方法的正确运用;编译程序本身的系统性。鼓励同学扩充语言的功能,如增加单词符号的种类,增加赋值语句、条件语句等。

最新数学表达式计算(c语言实现)

一、设计思想 计算算术表达式可以用两种方法实现: 1.中缀转后缀算法 此算法分两步实现:先将算术表达式转换为后缀表达式,然后对后缀表达式进行计算。具体实现方法如下: (1)中缀转后缀 需要建一个操作符栈op和一个字符数组exp,op栈存放操作符,字符数组用来存放转换以后的后缀表达式。首先,得到用户输入的中缀表达式,将其存入str数组中。 对str数组逐个扫描,如果是数字或小数点,则直接存入exp数组中,当扫描完数值后,在后面加一个#作为分隔符。 如果是操作符,并且栈为空直接入栈,如果栈不为空,与栈顶操作符比较优先等级,若比栈顶优先级高,入栈;如果比栈顶优先级低或相等,出栈将其操作符存到exp数组中,直到栈顶元素优先等级低于扫描的操作符,则此操作符入栈;如果是左括号,直接入栈,如果是右括号,出栈存入exp数组,直到遇到左括号,左括号丢掉。然后继续扫描下一个字符,直到遇到str中的结束符号\0,扫描结束。结束后看op栈是否为空,若不为空,继续出栈存入exp数组中,直到栈为空。到此在exp数组最后加结束字符\0。 我们就得到了后缀表达式。 (2)后缀表达式计算 此时需要一个数值栈od来存放数值。对exp数组进行逐个扫描,当遇到数字或小数点时,截取数值子串将其转换成double类型的小数,存入od栈中。当遇到操作符,从栈中取出两个数,进行计算后再放入栈中。继续扫描,知道扫描结束,此时值栈中的数值就是计算的结果,取出返回计算结果。 2.两个栈实现算法 此算法需要两个栈,一个值栈od,一个操作符栈op。将用户输入的数学表达式存入str数组中,对其数组进行逐个扫描。 当遇到数字或小数点,截取数值子串,将其转换成double类型的数值存入od栈中; 当遇到左括号,直接入op栈;遇到右括号,op栈出栈,再从值栈od中取出两个数值,计算将其结果存入值栈中,一直进行此操作,直到操作符栈栈顶为左括号,将左括号丢掉。 如果遇到操作符,若op栈为空,直接入栈;若栈不为空,与栈顶元素比较优先等级,若比栈顶操作符优先等级高,直接入op栈,如果低于或等于栈顶优先等级,op栈出栈,再从值栈中取出两个数值,计算将其结果存入值栈中,一直进行此操作,直到栈顶优先等级低于扫描的操作符等级,将此操作符入op栈。继续扫描直到遇到str中的结束字符\0,扫描结束。此时看操作符栈是否为空,若不为空,出栈,再从值栈中取出两个数值进行计算,将其结果存入值栈,一直进行此操作,直到操作符栈为空。此时把值栈中的数值取出,即为所得的最终计算结果。 二、算法流程图 第一种算法:中缀转后缀算法

while循环结构例题

引子 #include "stdio.h" main() { int i=1; for(i=1;i<=10000;i++) printf(“%d\t”,i); } 题型1 输入输出多个数据 eg1、输出1~10000之间所有的整数#include "stdio.h" main() { int i=1; while(i<=1000) {printf(“%d\t”,i); i++;} } 拓展:1、换成所有的奇数 2、换成所有的偶数 题型2 有限个数连加和连乘

eg2.1、求1+2+3+4+………+100的值 #include "stdio.h" main() { int i=1,s=0; while(i<=100) {s=s+i; i++;} printf(“%d\n”,s); } 拓展:1、求1+2+3+4+………+n的值 2、求12+22+32+………+n2的值 3、求1+1/2+1/3+………+1/n的值eg2.2、求n!的值 #include "stdio.h" main() { int i=1,n,p=1; scanf(“%d”,&n); while(i<=n) {p=p*i; i++;} printf(“%d\n”,p); }

拓展:求1!+2!+3!+………+n!的值 #include "stdio.h" main() { int i=1,n,p=1,s; scanf(“%d”,&n); while(i<=n) {p=p*i; s=s+p; i++;} printf(“%d\n”,s); } 题型3 无限个数连加 eg3、求1-1/3+1/5-1/7+………的近似值,要求精度要达到10-4 #include "stdio.h" #include "math.h" main() { float n=1,s=0,f=1,t=1; while(fabs(t)>=1e-4) {t=f/(2*n-1); s=s+t;

For循环语句

五、For循环语句 有时候需要处理的是反复进行的工作,这时候使用循环语句是很好的方法,下面我们通过一个练习来学习; 2、输入程序代码 1)输入下列代码,单引号后面是注释,双引号后面是分号; cls'xun huan for i= 1 to 10 print i; next print for i= 1 to 10 s= s+ i next print " s="; s end 2)for循环包括三行,第一行是循环条件,i=1 to 10表示从1到10,这样就会循环10次; 中间一行是执行的语句,每循环一次,就执行一下这一句, 第三行next表示继续,这时候i会自动加1,然后回到第一行去判断是否超过了循环条件; 3)第二个循环中的s=s+i是累加运算,就像盖楼房一样,一层一层往上加,这样s就会存上每次相加的和; 以 xunhuan 为文件名,保存一下文件,按F5运行一下程序,看一下程序运行的结果,如果有错误,就检查一下是否是拼写和标点错误;

六、Do循环 我们继续来看另一中循环,它跟前面的For循环区别在于,For循环一般知道循环次数,在第一行里头就指明了,而Do循环一般不知道循环次数,下面我们通过一个练习来学习; 2、输入程序代码 1)输入下列代码,单引号后面是注释,双引号后面是分号; cls'do xun huan do input "chengji"; chj s= s+ chj loop while chj> 0 print "zongfen="; s end 2)input是输入一个成绩,然后把成绩加起来,放到变量s当中 在loop一行里头,检查一下chj的大小,如果大于0,就继续循环,等于0或小于0,就退出循环;

编译原理阶段测试题

第一阶段测试卷 考试科目:《编译原理》第1章至第4章(总分100分)时间:90分钟 学习中心(教学点)批次:层次: 专业:学号:身份证号: 姓名:得分: 一、选择与填充(30) 1. 一个正则语言只能对应( )? A. 一个正则文法 B. 一个最小有限状态自动机 C. 一个自然语言 D. 一个上下文有关文法 2. 对于编译程序而言,输入数据是源程序,输出数据是___________________。 3. 给出在字母表{0,1}上的“所有以00结尾的符号串的集合”的语言的正则表达式:_____________________。 4. 一个句型中最左的()称为该句型的句柄。 A. 简单短语 B. 短语 C. 非终结符号 D. 终结符号 5. Micro语言只有三种语句:()、输入语句和输出语句。 A. GOTO语句 B.赋值语句 C. 条件语句 D.循环语句 6. 描述高级语言语法的常用方法有________________和BNF范式。 二、给出与正规式R=(ab)*(a|b*)ab等价的NFA。(16) 三、简述 DFA 与 NFA 有何区别。(14) 四、判断下列文法是否具有二义性:G[P]: P→PaP|PbP|cP|Pe|f(18) 五、对于下面的文法G[Z],构造句子(i*i+i)*i的最左和最右推导及相应的语法树。(22) (1) Z::=E (2) E::=T+E (3) E::=T (4) T::=F*T (5) T::=F (6) F::=(E) (7) F::=i 附:参考答案: 一、选择与填充(30) 1.一个正则语言只能对应( B )?

A. 一个正则文法 B. 一个最小有限状态自动机 C. 一个自然语言 D. 一个上下文有关文法 2.对于编译程序而言,输入数据是源程序,输出数据是____目标程序_________。 3. 给出在字母表{0,1}上的“所有以00结尾的符号串的集合”的语言的正则表达式:________(0|1)*00__________。 4. 一个句型中最左的( A )称为该句型的句柄。 A. 简单短语 B. 短语 C. 非终结符号 D. 终结符号 5. Micro语言只有三种语句:( B )、输入语句和输出语句。 A.GOTO语句 B.赋值语句 C.条件语句 D.循环语句 6. 描述高级语言语法的常用方法有___语法图_____和BNF范式。 二、给出与正规式R=(ab)*(a|b*)ab等价的NFA。(16) 三、简述 DFA 与 NFA 有何区别。(14) 解:DFA与NFA的区别主要有两点: 1是NFA可以若干个开始状态,而DFA仅只一个开始状态。 2是DFA的映象M是从K×∑到K,而NFA的映象M是从K×∑到K的子集,即映象M将产生一个状态集合(可能为空集),而不是单个状态。 四、判断下列文法是否具有二义性:G[P]: P→PaP|PbP|cP|Pe|f(18)

数据结构课程设计算术表达式求值计算器.doc

高级语言程序设计 《算术表达式求值》 课程设计报告

算术表达式求值 系统可以实现实现对算术四则混合运算表达式求值,并打印求值过程中运算符栈、操作数栈的变化过程。 第二章系统分析 开始运行时界面如下: 你可以输入一个表达式,按E对其进行求值。

第四章系统实现 #include #include #include #include #define N 100 double numStack[N]={0};//操作数栈 int numTop; char opStack[N];//运算符栈 int opTop; void print_num(double str1[],int n) { int i; printf("\n操作数栈:\n"); for(i=0;i

if(ch=='+'||ch=='-') return 2; if(ch=='*'||ch=='/') return 3; if(ch=='(') return -1; return 0; } double result(double num1,char op,double num2)//计算 { if(op=='+') return num1+num2; if(op=='-') return num1-num2; if(op=='*') return num1*num2; if(op=='/') return num1/num2; return 0; } int compute(char str[]) { double num=0; int i=0,j=1,k=1; numTop=opTop=0; while(str[i]!='\0'||opTop>0) { if(str[i]>='0'&&str[i]<='9') num=num*10+str[i]-'0'; else if( k==1&&str[i]=='-'&&(i==0||op(str[i-1])) ) k=-1; else { if(i>0&&!op(str[i-1])&&str[i]!='('&&str[i-1]!=')')

运算符和表达式教案

QBASIC语言程序设计之 运算符和表达式 科目:计算机 授课人:赵华 时间:2007年10月

《运算符和表达式》教案 教学目标: 1、识记运算符的分类及表达式的定义。 2、掌握算术运算符的运算规则。 3、掌握QBASIC表达式的书写规则。 4、掌握算术表达式的求值方法。 教学重点: 1、掌握算术运算符的运算规则。 2、掌握算术表达式的求值方法。 教学难点: 1、掌握算术运算符的运算规则。 2、掌握算术表达式的求值方法。 课前巩固: 1、函数SQR(X)的功能是什么?(举例介绍) 2、函数INT(X)的功能是什么?(举例介绍) 教学内容: 一、运算符的分类 运算符表示对数据进行的具体运算。在QBASIC中分为四类:算术运算符、字符串运算符、关系运算符、逻辑运算符本节我们重点学习算术运算符和算术表达式的有关内容。 二、算术运算符 1、种类: 2、运算规则: ①^ 是乘方运算符: 例如:6^2就表示数学上的62,其值等于36。 2^-2就表示数学上的2-2,其值等于0.25。

② \ 是整除运算符: 运算功能是:如果参与运算的两个数是整数,运算结果为商的整数部分;如果参与运算的量含有小数,则系统先将它们按四舍五入转换为整数,然后再进行运算。 例1: 7 \ 2 = 3 10 \ 4 = 2 例2: 8.7 \ 5 = 1 12.37 \ 4.78 = 2 ③ MOD 是求余运算符: 运算功能是:如果参与运算的两个数是整数,运算结果为两数相除后的余数;如果参与运算的量含有小数,则系统先将它们按四舍五入转换为整数,然后相除取它们的余数。 例1: 12 MOD 5 = 2 23 MOD 4 = 3 例2: 11.7 MOD 8 = 4 13.23 MOD 4.76 = 3 三、算术表达式 1、什么叫表达式? 是指用圆括号和运算符将常量、变量和函数连接起来的式子。 2 、表达式分为哪几类? 根据运算性质不同可分为四类: 算术表达式 、 字符表达式 、 关系表达式 、 逻辑表达式 3、什么是算术表达式? 就是用圆括号和算术运算符将数值常量、变量和函数连接起来的式子。 4、怎样把代数式写成QBASIC 的算术表达式 例1: 2X + Y +6 写成QBASIC 表达式为: 2*X +Y + 6 例2:A AC 24B +B -2-写成QBASIC 表达式为: (-B+SQR (B^2-4*A*C ))/(2*A) 例3: B A y x +写成QBASIC 表达式为: (ABS (X )* ABS (Y ))/(A+ B )

while循环练习

一、选择题 1.设有程序段 int k=10; while(k=0)k=k-1; 这下面描述中正确的是_________. a)while循环执行10次 b)循环是无限循环 c)循环体语句以此也不执行 d)循环体语句执行一次 a)E==0 b)E!=1 c)E!=0 d)E==1 2.语句while(!E);中的表达式!E等价于________. 3.下面程序段的运行结果是__________. int n=0; while(n++<=2);printf("%d",n); a)2 b)3 c)4 d)有语法错 4.下面程序的运行结果是____. #include main() { int num=0; while(num<=2) { num++; printf("%d\n",num); } } a)1 b)1 c)1 d)1 2 2 2 3 3 4 二、编程计算 1、求1~100中所有偶数的和。 2、下面程序的功能是输出1至100之间每位数的乘积大于每位数的和的数。 3、计算并输出1-3+5-7+……-99+101的值。

三、写一个小型计算器。 界面如下: 要求: 1.有简单运算选择界面 2.采用循环实现菜单显示 3.采用switch结构实现菜单的选择 4.运算对象为两个操作数,从键盘输入 5.运算结果输出 1、计算下列式子的值: (1)1+3+……+99 (2)1+2+4+8+……+128+256 2、输入一个整数,计算它各位上数字的和。(注意:是任意位的整数) 3、输入一整数A,判断它是否质数。(提示:若从2到A的平方根的范围内,没有一个数能整除A,则A是质数。) 4、求两个数的最小公倍数和最大公约数。(提示:公约数一定小于等于两数中的小数,且能整除两数中的大数。公倍数一定大于等于两数中的大数,且是大数的倍数,又能给两数中的小数整除。) 5、编写一个译码程序,把一个英语句子译成数字代码。译码规则是以数字1代替字母A,数字2代替字母B,……,26代替字母Z,如遇空格则打印一个星号…*?,英文句子以….…结束。 6、求水仙花数。所谓水仙花数,是指一个三位数abc,如果满足a^3+b^3+c^3=abc,则abc 是水仙花数。 7、“百钱买百鸡”是我国古代的著名数学题。题目这样描述:3文钱可以买1只公鸡,2文钱可以买一只母鸡,1文钱可以买3只小鸡。用100文钱买100只鸡,那么各有公鸡、母鸡、小鸡多少只?与之相似,有"鸡兔同笼"问题。

相关文档
最新文档