当前位置:文档之家› DO-WHILE循环语句的翻译程序设计(LL(1)法、输出三地址表示)

DO-WHILE循环语句的翻译程序设计(LL(1)法、输出三地址表示)

DO-WHILE循环语句的翻译程序设计(LL(1)法、输出三地址表示)
DO-WHILE循环语句的翻译程序设计(LL(1)法、输出三地址表示)

课程设计任务书

学生姓名:专业班级:

指导教师:工作单位:

题目: DO-WHILE循环语句的翻译程序设计(LL(1)法、输出三地址表示)初始条件:

理论:学完编译课程,掌握一种计算机高级语言的使用。

实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)

(1)写出符合给定的语法分析方法的文法及属性文法。

(2)完成题目要求的中间代码三地址表示的描述。

(3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。

(4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。

(5)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括:

1 系统描述(问题域描述);

2 文法及属性文法的描述;

3 语法分析方法描述及语法分析表设计;

4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计;

5 编译系统的概要设计;

6 详细的算法描述(流程图或伪代码);

7 软件的测试方法和测试结果;

8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等);

9 参考文献(按公开发表的规范书写)。

时间安排:

设计安排一周:周1、周2:完成系统分析及设计。

周3、周4:完成程序调试及测试。

周5:撰写课程设计报告。

设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。

设计报告书收取时间:设计周的次周星期一上午10点。

指导教师签名:年月日

系主任(或责任教师)签名:年月日

DO-WHILE循环语句的翻译程序设计

(LL(1)方法、输出三地址表示)

1.系统描述

1.1目的

通过设计、编制、生成、调试一个do-while循环语句的语法及语义分析程序,以加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。

1.2 设计内容

对循环语句:do {赋值语句} while <表达式>

1)设计符合自身语法分析方法要求的文法和属性文法(LL(1)语法)。

2)设计LR分析法相关的语法分析表(LL(1)分析表)。

3)设计中间代码格式(三地址中间代码)。

4)对源文件进行词法和语法分析的同时进行语义处理(语法制导分析)。

5)对源文件中的错误进行输出。

1.3 系统体系结构描述

本系统为子模块的体系结构风格,系统由两大模块组成:

1)词法分析模块

2)语法分析模块(调用语义分析模块)

1.3.1 系统结构图

源代码词法分析语法分析语义分析

中间代码

说明:输入do-while语句后,词法分析模块对文件进行处理并输出单词序列到队列queue[i],随后的语法分析模块将此队列内容作为输入,通过语法制导分析方法调用语

义分析模块最终生成中间代码。

1.3.2 词法分析模块

说明:对输入的源文件进行处理,逐个读入字符,将字符流进行合并并进行判断归类,将单词和其类型输入队列并保存。

1.3.3 语法分析模块

说明:接受由词法分析得到的队列queue ,进行语法分析和语法制导翻译,最后得到三地址中间代码。

队列queue

中间代码 (三地址码)

语法分析

(LL(1)分析法) 语义分析

(语法制导)

错误处理

(打印错误) 源文件

读取一个字符

判断字符类

单词归类

(关键字、标识符…)

存入队列queue

2.文法及属性文法描述

2.1 文法:

文法是用于描述语言的语法结构的形式规则(即语法规则)。这些规则必须是准确的、易于理解的以及有相当强的描述能力。由这种规则所产生的程序语言应有利于句子分析和翻译,而且,最好能通过这些规则自动产生有效的语法分析程序。

DO-WHILE循环语句的文法如下所示:

K->DLWS

L->SP

P->;SP

P->ε

D->do

W->while

2.2 属性文法:

属性文法是在上下文无关文法的基础上,为每个文法符号(终结符或者非终结符)配备若干相关的“值”(与文法符号相关的属性)。

在一个属性文法中,对应于每个产生式A→a都有一套与之相关联的语义规则,每规

则的形式为:b:=f(c

1,c

2

,…,c

k

)其中f是一个函数,而且或者①b是A的一个综合属性并

且c

1,c

2

,…,c

k

是产生式右边文法符号的属性或者②非终结符既可有综合属性也可有继属

性,文法开始符号的所有继承属性作为属性计算前的初始值。

属性文法为:

1-{ if(S.value == true) emit(‘if(‘, S.value, ‘)goto’, codebegin) else emit(‘-‘, ‘-‘, ‘goto’, nextstate)} 2-{p = lookup(https://www.doczj.com/doc/6515687125.html,); if(p != NULL) L.place = p; else error; E.place = L.place; emit(‘=‘, id, ‘-’, L.place)}

3-{L.place = newtemp; emit(‘+’, F1.place, F2.place, F.place)}

4-{S.place = newtemp; S.value = (F1.value > F2.value); emit(‘>’, F1.place, F2.place, S.place)}

5-{F.place = newtemp; p = lookup(https://www.doczj.com/doc/6515687125.html,); if(p != NULL) F.place = p; else error}

6-{F.place = newtemp; p = lookup(https://www.doczj.com/doc/6515687125.html,); if(p != NULL) F.value = digit.value; else error}

3.语法分析方法描述及语法分析表设计

3.1语法分析

为实现LL(1)算法,可以使用栈结构,算法的基本思想是: 首先定义栈结构,栈中的元素是一个二维数组:

void semantic()

{

if(VT[opr]=='=')

{

arr[d][0]=arr_i[opd];

arr[d][1]='=';

arr[d][2]=id;

arr[d][3]=' ';

arr[d][4]=' ';

id++;

}

else if(opr==-2)

{

arr[d][0]=id-1;

arr[d][1]='=';

arr[d][2]=arr_i[opd];

arr[d][3]=' ';

arr[d][4]=' ';

}

else

{

if(VT[opr]!='<'&&VT[opr]!='>')

arr[d][0]=id-1;

else

arr[d][0]=id+1;

arr[d][1]='=';

arr[d][2]=arr_i[opd];

arr[d][3]='+';

arr[d][4]=id;

id++;

}

d++;

}

3.2 预测分析部分:

int M[10][14]={ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,-1,-1,-1},

{1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},

{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 3, 2,-1},

{4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},

{5,-1,-1,-1,-1,-1,-1,-1,5,-1,-1,-1,-1,-1},

{-1,-1,-1,-1,6,7,-1,-1,-1,-1,-1, 8, 8, 8},

{9,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1},

{-1,-1,-1,-1,12,12,10,11,-1,-1,-1,12,12,12},

{14,-1,-1,-1,-1,-1,-1,-1,13,-1,-1,-1,-1,-1},

{-1,15,16,17,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},

};

3.3 语法分析过程:

void syntax()

{

int n;

count++;

print();

X=stack[sp]; //将sp压入栈STACK中

a=queue[front]; //从queue队列中读取词法分析后的字符if(X=='#'&&a=='#')f=4;

if(X<'A'||X>'Z')

{

if(X==a)

{

sp--;

front++;

if(a!='i')

{

if(a!='d'&&a!='w'&&a!=';'&&a!='#')

{

opr=index(a,VT);

semantic(); //语法分析调用

}

else if(a==';'||a=='w'||a=='#')

{

opr=-2;

semantic(); //语法分析调用

}

cout<<'\t'<<'\''<

}

else

{

opd=c;

//cout<

cout<<'\t'<<'\''<

}

}

else f=1; //转入出错处理

}

else

{

int tx=index(X,VN);

int ta=index(a,VT);

n=M[tx][ta];

td[t++]=M[tx][ta];

if(ta==-1)

{

f=2; //转入出错处理

cout<

}

else if(n==-1)f=3; //转入出错处理

else

{

sp--;

cout<<'\t'<";

if(len(p[n])!=0)

{

for(int i=len(p[n])-1;i>=0;i--)

{

stack[++sp]=p[n][i];

cout<

}

cout<

}

else cout<<"空串"<

}

}

if(f==0)syntax();

else

{

td[t]='-1';

err(f);

}

}

4.中间代码形式及其序列的结构设计

中间代码是3地址码形式来表示,即4元式的变形。

三地址码由5个域构成:中间代码地址标号,操作符,左操作数,右操作数,目的操作数

操作符:=,+,> ,< (文法仅定义这些操作);

左操作数,右操作数:opt,opr;

目的操作数:用来存放操作值的变量。

例如:i=(0)

(0)=i+1

(1)=i

表示i=i+1 。

5.简要分析与概要设计

5.1 系统分析

5.1.1 词法分析

输入源程序文本,对输入串进行预处理,然后从左至右逐个字符地对源程序进行扫(超前搜索法),产生一个一个的单词符号,在状态转换图的基础上,把作为字符串源程序改造成为单词符号串。

概要流程图见图1.3.2。

5.1.2 语法分析

在完成词法分析的基础上对DO-WHILE循环语句进行语法分析,对状态栈、符号栈分别进行移进、规约(采用LL(1)分析方法)、接受和出错处理四步操作,从而分析判定程序的语法结构是否符合语法规则。

概要流程图见1.3.3节。

5.1.3 语义分析以及三地址码表示

当在栈中找到可归前缀后,进行规约时,根据相应产生式对应的语义子程序进行语法制导翻译(在语法的分析过程中,随着分析的步步进展,根据每一个产生式所对应的语义子程序进行翻译的方法).三地址指令很类似于四元式,这种中间表示通常称为三地址代码,三个地址即是两个为操作数,一个是操作符。

5.1.4 LL(1)语法分析中的出错处理

1)字符不匹配,转去出错处理。

2)字符没有出现在产生式终结符集VT[]中,转去出错处理

3)没有找到合适的候选产生式来做进一步推导,转去出错处理

5.2 概要设计(系统总体描述)

源代码词法分析语法分析语义分析

中间代码

6.详细的算法描述

详细的伪代码(源程序)

#include

#define MAX 35

char X,a;

char VN[11]={'K','L','P','S','E','G','T','R','F','Q','\0'};

char VT[15]={'i','=','<','>','+','-','*','/','(',')','d','w',';','#','\0'};

char

p[18][6]={"dLwS\0","SP\0",";SP\0","\0","iQE\0","TG\0","+TG\0","-TG\0","\0 ","FR\0", "*FR\0","/FR\0","\0","(E)\0","i\0","=\0","<\0",">\0"};

char stack[MAX];

char queue[MAX];

int sp,front;

int M[10][14]={ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 0,-1,-1,-1},

{1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},

{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1, 3, 2,-1},

{4,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},

{5,-1,-1,-1,-1,-1,-1,-1,5,-1,-1,-1,-1,-1},

{-1,-1,-1,-1,6,7,-1,-1,-1,-1,-1, 8, 8, 8},

{9,-1,-1,-1,-1,-1,-1,-1,9,-1,-1,-1,-1,-1},

{-1,-1,-1,-1,12,12,10,11,-1,-1,-1,12,12,12},

{14,-1,-1,-1,-1,-1,-1,-1,13,-1,-1,-1,-1,-1},

{-1,15,16,17,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},

};

int f=0;

int count=0;

int c=0;

char arr_i[MAX];

char var[MAX]; //表格管理

int td[MAX]; //输出产生式序列

int t=0;

int opd=-1;

int opr=-1;

int id=0;

//int ptr[MAX];

int d=0;

char arr[MAX][5]; //存放待输出的三地址

//char keyword[2][7]={"do\0","while\0"};

int len(char str[])

{

int i=0;

while(str[i]!='\0')i++;

return i;

}

int index(char ch,char str[])

{

int i=0;

while(str[i]!='\0')

{

if(ch!=str[i])i++;

else break;

}

if(str[i]=='\0')return -1;

return i;

}

void err(int n)

{

if(n==1)

cout<<"字符不匹配"<

else if(n==2)

cout<<"字符没有出现在产生式终结符集VT中"<

else if(n==3)

cout<<"没有找到合适的候选产生式来做进一步推导"<

cout<<"该句子是文法语言的句子!"<

}

void print()

{

cout<<"(";

if(count<10)cout<<'0';

cout<

int i;

for(i=0;i<=sp;i++)cout<

for(;i<=20;i++)cout<<" ";

for(i=0;i

for(;queue[i]!='#';i++)cout<

cout<

for(;i<=20;i++)cout<<" ";

}

void semantic()

{

if(VT[opr]=='=')

{

arr[d][0]=arr_i[opd];

arr[d][1]='=';

arr[d][2]=id;

arr[d][3]=' ';

arr[d][4]=' ';

id++;

}

else if(opr==-2)

{

arr[d][0]=id-1;

arr[d][1]='=';

arr[d][2]=arr_i[opd];

arr[d][3]=' ';

arr[d][4]=' ';

}

else

{

if(VT[opr]!='<'&&VT[opr]!='>')

arr[d][0]=id-1;

else

arr[d][0]=id+1;

arr[d][1]='=';

arr[d][2]=arr_i[opd];

arr[d][3]='+';

arr[d][4]=id;

id++;

}

d++;

}

void syntax()

{

int n;

count++;

print();

X=stack[sp];

a=queue[front];

if(X=='#'&&a=='#')f=4;

if(X<'A'||X>'Z')

{

if(X==a)

{

sp--;

front++;

if(a!='i')

{

if(a!='d'&&a!='w'&&a!=';'&&a!='#')

{

opr=index(a,VT);

semantic();

}

else if(a==';'||a=='w'||a=='#')

{

opr=-2;

semantic();

}

cout<<'\t'<<'\''<

}

else

{

opd=c;

//cout<

cout<<'\t'<<'\''<

}

}

else f=1; //字符不匹配,转去出错处理

}

else

{

int tx=index(X,VN);

int ta=index(a,VT);

n=M[tx][ta];

td[t++]=M[tx][ta];

if(ta==-1)

{

f=2;cout<

} //字符没有出现在产生式终结符集VT中,转去出错处理else if(n==-1)f=3; //没有找到合适的候选产生式来做进一步推导,转去出错处理

else

{ //用产生式M[tx][ta]来做进一步推导

sp--;

cout<<'\t'<";

if(len(p[n])!=0)

{

for(int i=len(p[n])-1;i>=0;i--)

{

stack[++sp]=p[n][i];

cout<

}

cout<

}

else cout<<"空串"<

}

}

if(f==0)syntax();

else

{

td[t]='-1';

err(f);

}

}

void lexical()

{ //do{m=m+i;i=i+1;}while(i<4);#

int i,j,d;

char ch;

j=d=0;

for(i=0;var[i]!='#';i++)

{

ch=var[i];

if(ch=='d'&&var[i+1]=='o')

{

cout<<"do"<<'\t'<<"keyword"<

queue[j++]='d';i+=1;

}

else if(ch=='w')

{

ch=var[i+1];

if(ch=='h')

{

ch=var[i+2];

if(ch=='i')

{

ch=var[i+3];

if(ch=='l')

{

ch=var[i+4];

if(ch=='e')

{

ch=var[i+5];

}

}

}

}

cout<<"while"<<'\t'<<"keyword"<

queue[j++]='w';i+=4;

}

else if(index(ch,VT)<=0)

{

if(ch!='{'&&ch!='}'&&ch!='('&&ch!=')')

{

cout<

arr_i[d-1]=ch;

queue[j++]='i';

}

else cout<

}

else if(index(ch,VT)>0)

{

cout<

queue[j++]=ch;

}

}

queue[j]='#';

for(i=0;queue[i]!='#';i++)cout<

cout<

}

int main() //主程序

{

int i=0;

char S='K';

sp=front=0;

stack[0]='#';

sp++;

stack[1]='K';

cout<<"LL(1)文法如下:"<

cout<<"(0)K->dLwS\n(1)L->SP\n(2)P->;SP\n(3)P->ε\n(4)S->iQE\n(5)E->TG \n(6)G->+TG\n"

<<"(7)G->-TG\n(8)G->ε\n(9)T->FR\n(10)R->*FR\n(11)R->/FR\n(12)R->ε\n( 13)F->(E)\n"

<<"(14)F->i\n(15)Q->=\n(16)Q-><\n(17)Q->>\n";

cout<<"请输入do-while语句:";

do

{

cin>>var[i];

i++;

if(var[i]==' ')i--;

}while(var[i-1]!='#');

var[i]='\0';

cout<<"词法分析:"<

lexical();

cout<<"LL(1)语法分析:"<

syntax();

cout<<"所用产生式序列:"<

for(i=0;td[i]!='-1';i++)cout<

cout<

cout<<"输出三地址:"<

for(i=0;i

{

for(int j=0;j<5;j++)

{

if(arr[i][j]>=0&&arr[i][j]<=9)

cout<<"("<

else

cout<

}

cout<

}

return 0;

}

7.测试用例及测试结果描述

7.1测试用例

(1)正确的语法输入do{i=i+1}while{i<4}#

(2)错误的语法输入do{i=i+1}while#

7.2测试结果(如下图)

(1)正确的语法 1.输入语句 #结束

2.词法分析

3.语法分析及所用产生式序列

4.输出三地址

(2)错误的语法

1.输入语句 #结束

2.词法分析

3.语法分析及所用产生式序列

4.输出三地址

8.研制报告

8.1研制过程

从周日拿到题目对题目进行分析,再到周一至周三的编写,到周四的调试,我觉得我的程序编写能力又有了一定的提升。回顾起这次DO-WHILE循环语句的课程设计,我感慨颇多,的确,从分析到编写,从理论到实践,在这一个星期的日子里,可以说是花了很多功夫的,但是我学到了很多很多的的东西,不仅巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。在本次课程设计中,我先是重温了课本上对于相关知识的讲解,然后根据自己的题目进行了文法的设计,将二者结合起来,作出一个自己的文法,然后我开始设计一些基本的构件并描述出它们的具体接口功能,接口设计好之后,下一步便是进行接口的

实现了,最关键的一步是总控程序的设计,对其他构件类的调用。在以上功能完成之后,我就开始遍程了。最后,进行调试。

8.2 设计评价

我对这次课程设计的评价就是收获颇多,可以说我这个程序还没有达到预想的结果,但是对于我这样一个编程很一般的学生来说,我觉得是一个成功。

首先我的程序实现了大部分的功能,包括语法分析和三地址输出,但是在词法分析这个问题上还有很大的问题。在设计的时候,我也找同学帮忙指正,但是仍然存在着一些细小的问题,不过我的设计在总体上还是不错的。

8.3 体会和收获

在整个设计过程中,最大的收获就是切身体会了编程语言在具体分析方法下进行翻译的实现机制和步骤.其次才是对LL(1)算法的理解和运用以及对堆栈的操作原理的掌握. 因为之前学理论的时候,感觉和实际的编程语言联系不是很大,也不知道所学理论如何在语句的翻译过程中发挥作用.而在具体DO----WHILE循环语句翻译的设计实践过程中,才真正体会了该步骤是如何一步步实现的,这些都是以往单纯理论知识学习所感触不到的.

在词法分析和语法分析的程序过程中,遇到了一些编程方面的困难,有些语句功能实现不了,而且在调试的时候也出现了问题,例如词法分析的错误调试的还不够好,但总体来说不是很严重.在请教同学检查修改之后,都得到了解决.所以自身感觉在编程设计和具体实践过程中还需要进一步的学习,尤其是要提高把理论运用到实践当中的编程能力.

9.参考文献

教材:

[1]张素琴、吕映芝、蒋维杜、戴桂兰等.编译原理(第二版).清华大学出版社.2005年2月

参考书:

[1]何炎祥.编译原理(第二版).武汉:华中科技大学出版社.2005年8月

[2]陈火旺等.程序设计语言编译原理(第3版).国防工业出版社.2003年2月

[3]Alfred V.Aho,Ravi Sethi,Jeffrey D.Ullman.Compilers:Principles,Techniques,and Tools.人民邮电出版社.2002年2月

[4]胡伦骏.编译原理(第2版).电子工业出版社.2005年2月

[5]陈意云.编译原理与技术(第二版).中国科学技术大学出版社.2002年1月

【教学】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程序的运行方法及程序设计的根底知识,学习了顺序结构和分支结构的程序执行流程和编程。具备一定的算法根底和具有一定的比较、归纳能力。

WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示)

课程设计任务书 学生姓名:赵旭林专业班级:计算机0801班 指导教师:陈天煌工作单位:计算机科学与技术学院 题目: WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示)初始条件: 理论:学完编译课程,掌握一种计算机高级语言的使用。 实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) (1)写出符合给定的语法分析方法的文法及属性文法。 (2)完成题目要求的中间代码三地址表示的描述。 (3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。 (4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 (5)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括: 1 系统描述(问题域描述); 2 文法及属性文法的描述; 3 语法分析方法描述及语法分析表设计; 4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计; 5 编译系统的概要设计; 6 详细的算法描述(流程图或伪代码); 7 软件的测试方法和测试结果; 8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等); 9 参考文献(按公开发表的规范书写)。 时间安排: 设计安排一周:周1、周2:完成系统分析及设计。 周3、周4:完成程序调试及测试。 周5:撰写课程设计报告。 设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。 设计报告书收取时间:设计周的次周星期一上午10点。 指导教师签名: 2010年 11月 13日 系主任(或责任教师)签名: 2010年 11月 13日

c语言循环语句和循环控制例题解析

一、循环控制 (一)、break语句 break语句通常用在循环语句和开关语句中。当break用于开关语句switch中时,可使程序跳出switch而执行switch以后的语句;如果没有break语句,则将成为一个死循环而无法退出。break在switch中的用法已在前面介绍开关语句时的例子中碰到,这里不再举例。 当break语句用于do-while、for、while循环语句中时,可使程序终止循环而执行循环后面的语句,通常break语句总是与if语句联在一起。即满足条件时便跳出循环。 例如: int main(int argc, char *argv[]) { int sn=0,i; for(i=1;i<=100;i++) { if(i==51) break; /*如果i等于51,则跳出循环*/ sn+=i; /*1+2+……+50*/ } printf(%d\n,sn); } 可以看出,最终的结果是1+2+……+50。因为在i等于51的时候,就跳出循环了。自己写写怎样在while和do--while循环中增加break语句。 注意: 1. break语句对if-else的条件语句不起作用。 2. 在多层循环中,一个break语句只向外跳一层。 例如: int main(int argc, char *argv[]) { int i,j; printf(i j\n); for(i=0;i<2;i++) for(j=0;j<3;j++) { if(j==2) break; printf(%d %d\n,i,j); } } 输出结果为: i j 0 0 0 1 1 0 1 1 当i==0,j==2时,执行break语句,跳出到外层的循环,i变为1。 (二)、continue语句

FOR循环语句的翻译程序设计

目录 1 系统描述 (2) 1.1目的 (2) 1.2设计内容: (2) 1.3翻译过程 (2) 1.4初始条件: (3) 1.5 开发平台 (3) 2文法及属性文法的描述 (3) 3 语法分析表设计 (4) 3.1 LR分析概述 (4) 3.2 LR(0)分析表 (5) 3.3 LR语法分析过程的设计思想及算法 (7) 3.4 翻译方法 (8) 4 中间代码形式的描述及中间代码序列的结构设计 (8) 5简要的分析与概要设计 (9) 6详细的算法描述 (9) 6.1 main函数 (10) 6.2词法分析 (10) 6.3 语法分析 (12) 7 测试方法和测试结果 (13) 7.1测试过程 (13) 7.2 测试结论 (14) 8 研制报告 (14) 8.1研制过程 (14) 8.2本设计的评价 (15) 8.3个人心得体会 (15) 9 参考文献 (16) 本科生课程设计成绩评定表 (17)

FOR循环语句的翻译程序设计 ——LR方法、输出四元式 1 系统描述 1.1目的 通过设计、编制、调试一个FOR循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,实现词法分析程序对单词序列的词法检查和分析,并且实现对单词序列的语法分析、语义分析以及中间代码生成。 1.2设计内容: 本设计按照要求设计出for语句的简单文法,并使用LR分析法对用户输入的程序进行分析和翻译。 对下列正确的程序输入: for(i=0;i<10;i++) { m=m+i; } 结果程序要对该输入进行词法分析,然后利用LR分析法对词法分析后得到的单词序列进行语法分析,经过语法制导翻译显示出等价的四元式表示的中间代码。 对于错误的程序输入,如: for(i=0;i<10) { m=m+i; } 结果程序要指出程序出错。 1.3翻译过程

IF-ELSE条件语句的翻译程序设计(LL(1)法、输出三地址表示) 2

IF-ELSE条件语句的翻译程序设计 1 问题描述 要求用LL(1)自顶向下分析方法及三地址中间代码,对IF-THEN-ELSE条件语句完成编译各阶段过程,包括词法、语法、语义等分析。 2 问题分析及编译系统的概要设计 编译过程一般分为六个阶段的过程,可以由六个模块完成,它们称为词法分析程序、语法分析程序、语义分析程序、中间代码生成程序、代码优化程序、目标代码生成程序,此外,一个完整编译程序还必须包括“表格管理程序”和“出错处理程序”。 这次实验涉及到词法分析、语法分析、语义分析及表格管理和出错管理。其中,词法分析至少要能识别关键字“if”、“then”和“else”,标识符(即自定义变量),数字,和运算符等等;语法分析要分析程序结构的合法性,即是否为文法的句子;语义分析要能够语法制导翻译出中间代码(三地址)并将其输出;表格管理是指符号表;出错处理是指在语法分析时,所有非文法句子的错误类型处理. 3 文法及属性文法的定义 3.1 文法: 文法是用于描述语言的语法结构的形式规则(即语法规则)。这些规则必须是准确的、易于理解的以及有相当强的描述能力。由这种规则所产生的程序语言应有利于句子分析和翻译,而且,最好能通过这些规则自动产生有效的语法分析程序. IF-ELSE条件语句的文法如下所示: 0.A->EB 1.B->+EB|-EB|ε 2.E->FT 3.T->*FT|/FT|ε 4.F->i|(E) 或者能够更简洁一点: 0.S->if A THEN B ELSE C 1.A->m rop n

3.C->x=n arop m 4.rop->=|<|> 5.arop->+|-|*|/ 3.2 属性文法: 属性文法是在上下文无关文法的基础上,为每个文法符号(终结符或者非终结符)配备若干相关的“值”(与文法符号相关的属性)。 在一个属性文法中,对应于每个产生式A→a都有一套与之相关联的语义规则,每规 则的形式为:b:=f(c 1,c 2 ,…,c k )其中f是一个函数,而且或者①b是A的一个综合属性 并且c 1,c 2 ,…,c k 是产生式右边文法符号的属性或者②非终结符既可有综合属性也可有 继属性,文法开始符号的所有继承属性作为属性计算前的初始值。 属性文法为: if(VT[opr]=='=') //{"="判断}; { arr[d][1]=arr_i[opd]; arr[d][0]='='; arr[d][2]=id; arr[d][3]=' '; arr[d][4]=' '; id++; } else if(VT[opr]=='>') //{">"判断}; { arr[d][1]=arr_i[opd]; arr[d][0]='>'; arr[d][2]=id; arr[d][3]=' '; arr[d][4]=' '; id++; }

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为假,

DO-WHILE循环语句的翻译程序设计

课程设计任务书 学生姓名:专业班级: 指导教师:工作单位:计算机科学与技术学院 题目: DO-WHILE循环语句的翻译程序设计(LL(1)法、输出三地址表示)初始条件: 理论:学完编译课程,掌握一种计算机高级语言的使用。 实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) (1)写出符合给定的语法分析方法的文法及属性文法。 (2)完成题目要求的中间代码三地址表示的描述。 (3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。 (4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 (5)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括: 1 系统描述(问题域描述); 2 文法及属性文法的描述; 3 语法分析方法描述及语法分析表设计; 4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计; 5 编译系统的概要设计; 6 详细的算法描述(流程图或伪代码); 7 软件的测试方法和测试结果; 8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等); 9 参考文献(按公开发表的规范书写)。 时间安排: 设计安排一周:周1、周2:完成系统分析及设计。 周3、周4:完成程序调试及测试。 周5:撰写课程设计报告。 设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。 设计报告书收取时间:设计周的次周星期一上午10点。 指导教师签名: 2011年月日 系主任(或责任教师)签名: 2011年月日

DO-WHILE循环语句的翻译程序设计 (LL(1)法、输出三地址表示) 1. 系统描述 1.1 设计目的 通过设计、编制、调试一个DO-WHILE循环语句的语法及语义分析程序,加深对法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。 1.2 设计内容及步骤 对循环语句: DO〈赋值语句〉WHILE 〈表达式〉 (1)按给定的题目写出符合自身语法分析方法要求的文法和属性文法描述。 (2)按给定的题目给出语法分析方法的思想及分析表设计。 (3)按给定的题目给出中间代码序列的结构设计。 (4)完成相应的词法分析、语法分析和语义分析程序设计。 (5)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 2. 文法及属性文法的描述 2.1 文法描述 K -> do L while S L -> SP P -> ;SP | ε S -> iQE E -> TG G -> +TG | -TG | εT -> FR R -> *FR | /FR | εF -> (E) | i Q -> = | < | > 2.2 属性文法的描述

JavaScript流程控制语句

第5章流程控制语句 JavaScript程序是由若干个语句组成的,每一个语句以分号作为结束符。语句可以很简单,也可以很复杂。其中,改变程序正常流程的语句称为控制语句。流程控制语句是用来控制程序中各语句执行顺序的语句,是程序中基本却又非常关键的部分。流程控制语句可以把单个语句组合成有意义的、能完成一定功能的小逻辑模块。本章内容包括: ?顺序控制语句; ?选择控制语句; ?循环控制语句; ?其他流程控制语句。 通过本章学习,读者应该对几种流程控制语句有很深的理解,并可以利用这几种流程控制语句编写简单的程序。 5.1 顺序控制语句 JavaScript语言中,顺序控制语句是最简单的语句。其有如下特点:所有语句按照一定的顺序执行,每一条语句只执行一遍,不重复执行,也没有语句不执行。JavaScript语言中的顺序控制语句包括表达式语句,函数调用语句,空语句和复合语句等。 5.1.1 表达式语句 表达式后面跟一个分号就构成了一个表达式语句。最常见的表达式语句为赋值语句。赋值语句是在一个赋值表达式后跟一个分号形成的,程序中很多计算都由赋值语句完成。 【示例5-1】演示几个表达式语句。其代码如下所示。 var m=4; //把4赋给变量m var n=”hello world”; //把字符串hello world赋值给n i=m+n; //把变量m和n的和赋值给变量i 实际上,任何表达式都可以加上分号而成为语句。 【示例5-2】变量i自增1。 i++; //变量i的值加1 注意:有些语句写法虽然是合法的,但是由于其没有保留计算结果,因而并没有实际意义。如以下代码: a-b; i++-1;

5条件语句和循环语句

第二、三课时 1.2.2-1.2.3条件语句和循环语句 教学目标: 知识与技能 (1)正确理解条件语句和循环语句的概念,并掌握其结构的区别与联系。 (2)会应用条件语句和循环语句编写程序。 过程与方法 经历对现实生活情境的探究,认识到应用计算机解决数学问题方便简捷,促进发展学生逻辑思维能力 情感态度与价值观 了解条件语句在程序中起判断转折作用,在解决实际问题中起决定作用。深刻体会到循环语句在解决大量重复问题中起重要作用。减少大量繁琐的计算。通过本小节内容的学习,有益于我们养成严谨的数学思维以及正确处理问题的能力。 重点与难点 重点:条件语句和循环语句的步骤、结构及功能。 难点:会编写程序中的条件语句和循环语句。 学法与教学用具 计算机、图形计算器 教学设想

【创设情境】 试求自然数1+2+3+……+99+100的和。 显然大家都能准确地口算出它的答案:5050。而能不能将这项计算工作交给计算机来完成呢?而要编程,以我们前面所学的输入、输出语句和赋值语句还不能满足“我们日益增长的物质需要”,因此,还需要进一步学习基本算法语句中的另外两种:条件语句和循环语句(板出课题) 【探究新知】 (一)条件语句 算法中的条件结构是由条件语句来表达的,是处理条件分支逻辑结构的算法语句。它的一般格式是:(IF-THEN-ELSE 格式) 当计算机执行上述语句时,首先对IF 后的条件进行判断,如果条件符合,就执行THEN 后的语句1,否则执行ELSE 后的语句2。其对应的程序框图为:(如上右图)

在某些情况下,也可以只使用IF-THEN 语句:(即IF-THEN 格式) 计算机执行这种形式的条件语句时,也是首先对IF 后的条件进行判断,如果条件符合,就执行THEN 后的语句,如果条件不符合,则直接结束该条件语句,转而执行其他语句。其对应的程序框图为:(如上右图) 条件语句的作用:在程序执行过程中,根据判断是否满足约定的条件而决定是否需要转换到何处去。需要计算机按条件进行分析、比较、判断,并按判断后的不同情况进行不同的处理。 【例题精析】 〖例1〗:编写程序,输入一元二次方程20ax bx c ++=的系数,输出它的实数根。 分析:先把解决问题的思路用程序框图表示出来,然后再根据程序框图给 出的算法步骤,逐步把算法用对应的程序语句表达出来。 IF 条件 THEN 语句

for循环语句的翻译

课程设计任务书 学生姓名:辛波专业班级:计算机0707班 指导教师:彭德巍工作单位:计算机科学与技术学院 题目: FOR循环语句的翻译程序设计(递归下降法、输出四元式) 初始条件: 理论:学完编译课程,掌握一种计算机高级语言的使用。 实践:计算机实验室提供计算机及软件环境。如果自己有计算机可以在其上进行设计。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) (1)写出符合给定的语法分析方法的文法及属性文法。 (2)完成题目要求的中间代码四元式的描述。 (3)写出给定的语法分析方法的思想,完成语法分析和语义分析程序设计。 (4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 (5)设计报告格式按附件要求书写。课程设计报告书正文的内容应包括: 1 系统描述(问题域描述); 2 文法及属性文法的描述; 3 语法分析方法描述及语法分析表设计; 4 按给定的题目给出中间代码形式的描述及中间代码序列的结构设计; 5 编译系统的概要设计; 6 详细的算法描述(流程图或伪代码); 7 软件的测试方法和测试结果; 8 研制报告(研制过程,本设计的评价、特点、不足、收获与体会等); 9 参考文献(按公开发表的规范书写)。 时间安排: 设计安排一周:周1、周2:完成系统分析及设计。 周3、周4:完成程序调试及测试。 周5:撰写课程设计报告。 设计验收安排:设计周的星期五第1节课开始到实验室进行上机验收。 设计报告书收取时间:设计周的次周星期一上午10点。 指导教师签名: 2010年 01月 08日 系主任(或责任教师)签名: 2010年 01月 08日

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)选择“开始”/“所有程序”/“附件”/“记事本”命令,打开一个无标题的记事本文档。

程序流程控制语句

程序流程控制语句:选择语句 https://www.doczj.com/doc/6515687125.html,网站制作 2011年9月1日 Java语言中的程序流程控制语句有三种:顺序结构、选择结构和循环结构。其中顺序结构最简单,程序依次执行各条语句。Java的每条语句一般以分号(“;”)作为结束标志。所以本章重点讲解选择结构和循环结构。 1、选择语句 在程序设计时,经常需要使用选择结构在程序中完成逻辑判断和选择功能,这就需要使用到选择语句。Java中的选择语句包括if语句、if-else语句和switch语句。选择语句用来控制选择结构,对选择条件进行判断,并根据判断结果选择要执行的程序语句,改变程序执行流程。 2、if选择语句 在实际生活中,经常会需要做一些逻辑判断,并根据逻辑判断结果做出选择。例如,当一个男孩子向一个非常理智的女孩子求婚时,这个女孩子思考的逻辑可能是这样的: 如果你有100万 那么,我就嫁给你!

在这里,女孩子嫁给男孩子这个过程的实施,必须以“你有一百万”为前提。只有逻辑判断“你有一百万”这一前提条件为真时,“那么,我就嫁给你!”这个行为才能得到执行。在生活当中,类似这样的情形是很常见的。 相应地,在Java程序设计语言中,也有相应的条件语句来完成类似的逻辑判断和有选择地执行这样的功能,这就是if语句。if语句的语法格式如下: if(条件表达式) 语句 或者 if(条件表达式){ 一条或多条语句 } if语句执行的过程如下: 1.对if后面括号里的条件表达式进行判断。 2.如果条件表达式的值为true,就执行表达式后面的语 句或后面大括号里的多条语句。 3.如果条件表达式的值为false,则跳过if语句,执行 下一条语句。

WHILE循环语句的翻译程序设计(简单优先法、输出四元式)

WHILE循环语句的翻译程序设计(简单优先法、输出四元式) 1 需求说明或问题描述 1.1 问题描述 对C++中while循环语句的理解及分析,通过编译中的词法分析、语法分析、语义分析及中间代码生成等编译过程,用简单优先分析法分析并翻译while语句。 1.2 需求说明 1 写出符合给定的语法分析方法的文法及属性文法 2 完成题目要求的中间代码四元式的描述 3 写出给定的语法分析方法的思想,完成语法分析及语义分析程序设计 4 设计若干用例,上机通过测试 2 文法及语法设计 2.1文法及属性文法: 文法G=(V N ,V T ,P ,S) 其中V N={S , B, E, C, A, B, P, T} V T={w, (, ), { ,}, i, ;} P={ S -> w(B){E} E -> C C -> CA C -> A A -> iPA A -> i; P -> +|-|*|/ B -> iTi B-> i T -> >|<|>=|<=|== } 2.2 语法分析方法描述及语法分析表设计 2.2.1 语法分析方法描述: 简单优先分析法是按照文法符号(终极符和非终极符)的优先关系确定句柄的。 基本思想可设计如下,首先根据已知优先文法构造相应优先关系矩阵,并将

文法的产生式保存,设置符号栈S,步骤如下: (1)将输入符号串a1a2…a n#依次逐个存入符号栈S中,直到遇到栈顶符号a i的优先性>下一个待输入符号a j为止。 (2)栈顶当前符号a i为句柄尾,由此向左在栈中找句柄的头符号a k,即找到a k-1

WHILE循环语句的翻译程序设计.

WHILE循环语句的翻译程序设计(递归下降法、输出三地址表示) 1 系统描述 按照课程设计的要求,写一个能识别while循环语句的文法,通过一定的变换使它符合递归下降法的要求,然后按照这个文法编写一个程序,该程序能识别输入的语句是否符合while语句的文法,或者能不能通过文法的开始符号推导出该语句。 该程序应该包括词法分析器,能对输入的语句进行词法分析,然后再对结果进行语法分析。词法分析器应能识别关键字,标示 符,常量,操作符等。 该程序的语法分析器能对输入的语法进行分析,判断输入语句能否满足while循环语句的文法。通过递归下降的方法对语句进行分析,看能否通过开始符号推导出来。 该程序的语义分析器就是对分析结果进行输出,要求输出结果是 三地址形式的。 2 文法及属性文法的描述 2.1文法描述 语句 > ::= while (< 条件表达式 > (< 赋值语句 > | 语句 > <条件表达式> ::= (<标识符>|<无符号整数>)<条件运算符> (<标识符>|<无符号整数> <标识符> ::= <字母> (<字母>|<数字> <条件运算符> ::= > | < | = <无符号整数> ::= <数字>(<数字>

<赋值语句> ::= <标识符>=(<标识符> | <数字> <算术运算符> (<标识符> | <数字> <算术运算符> ::= + | - | * | / <赋值语句> ::= <标识符>=<标识符> | <数字> 2.2递归文法 while语句文法: S -> while (B S | i=E B -> E relop E relop -> < | = | > E -> E+E | E-E | E*E | E/E | (E | i | n 在编写程序的时候用到的是递归下降法,而递归下降法对文法的要求是不能包含左递归,对上述的文法进行消除左递归之后,得 到如下的递归文法: S -> while (B S | i=E B -> E relop E relop -> < | = | > E -> (E F | iF | nF F -> +EF | -EF | *EF | /EF | ε 2.3属性文法的描述 产生式属性文法 S -> while (B S1S.begin:=newlabel;

流程控制结构

流程控制结构 Document serial number【NL89WT-NY98YT-NC8CB-NNUUT-NUT108】

(单元教案首页) 单元标题第3章流程控制结构 教学时数:()学时,其中理论()学时、实验()学时、上机()其它()学时,其它是指: 教学目的与要求: 1.理解程序的的三大控制结构。 2.掌握选择结构实现语句的用法编程应用 3.掌握循环结构实现语句的用法及其编程应用。 4.理解并掌握各种跳转语句的使用方法。 主要教学内容: 1.程序的控制结构:顺序、选择、循环。 2.选择结构语句:if语句(两种格式)和switch语句、程序举例。 3.循环结构语句:for语句、while、语句、do-while语句、三种循环语句的互相转化、程序举例。 4.控制结构跳转语句:break语句、continue语句、return语句 教学重点与难点: 重点:if语句、switch语句、for语句、while语句、do-while语句 难点: switch语句、选择结构编程应用、循环结构编程应用、跳转语句的编程应用课后作业: 1.课本P66 综合练习三:第一题~第四题 2.上机实习:实习3:Java流程控制 课后体会:

兰州资源环境职业技术学院教师授课教案

—————————————————————— 第3章流程控制结构 一、本章主要内容: 本章主要讲述Java程序的基本控制结构和控制语句,使得学生能利用这三种结构来解决一些比较复杂的问题。 Java程序的基本控制结构有三种:顺序结构、选择结构、循环结构。 二、具体授课内容: 概述 选择结构 循环结构 跳转语句 三、本章授课思路: 1. 回顾C语言中结构化程序设计方法所所用的程序三大控制结构(顺序结构、选择结构、循环结构)语法知识,以复习回顾的方式引入讲解Java语言的程序控制结构知识(和 C语言用法一致),学生易于理解记忆。 2.具体讲解选择结构(if、switch)和循环结构语法(while、for、do-while)及其编程用法的典型程序编写举例,使学生理解掌握Java语言中控制结构的使用特点及编程技巧。 将两种输入数据的编程方法融入到控制结构用法的编程举例的程序中,使学生对输入数据方法的能够有一定的理解掌握和编程使用,结合在后续第4章面向对象的程序设计的方法的具体学习中再加强理解和掌握。 4.课堂上通过练习和讲解第3章课后习题,加强和巩固学生对所学知识的理解和掌握使用。

C语言练习2(选择和循环结构)

C语言(分支和循环结构) 一、选择题 1.以下程序输出结果是( ) main() { int m=5; if(m++>5) printf("%d\n",m); else printf("%d\n",m--);} A)7 B)6 C)5 D)4 2以下程序的输出结果为( ) # include main ( ) { int i=0, j=0, a=6; if ((++i>0)&&(++j>0)) a++; printf ("i=%d, j=%d, a=%d\n", i,j,a);} A) i=0, j=0, a=6 B) i=1, j=1, a=7 C) i=1, j=0, a=7 D) i=0, j=1, a=7 3有如下程序 main() { int a=2,b=-1,c=2; if(a

4若i为int型,且有程序如下,则输出结果是( ) i=111; if(i%3==0) printf("####"); printf("****"); A) #### B) **** C) ####**** D) 无输出结果 5若运行时x=12,则运行结果为( ) {int x, y; scanf("%d", &x); y=x>12 ? x+10:x-12; printf("%d\n", y);} A) 0 B) 22 C) 12 D) 10 6以下程序的输出结果是( ) main() { int i=0, j=0, k=6; if ((++i>0)||(++j>0)) k++; printf("%d, %d, %d\n", i, j, k); } A) 0, 0, 6 B) 1, 0, 7 C) 1, 1, 7 D) 0, 1, 7 7若变量都已正确说明,则以下程序段输出为( ) int a=1,b=2,c=3; if(a>b) a=b; b=c; c=a; printf("a=%d b=%d c=%d\n",a,b,c);

WHILE循环语句的翻译程序设计课设报告

1.题目:将WHILE语句转换成四元式的程序实现 设计内容及要求:设计一个语法制导翻译器,将WHILE语句翻译成四元式。要求:先确定一个定义WHILE语句的文法,为其设计一个语法分析程序,为每条产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现翻译程序。对用户输入的任意一个正确的WHILE语句,程序将其转换成四元式输出(可按一定格式输出到指定文件中)。 1、系统描述 通过设计、编制、调试一个WHILE循环语句的语法及语义分析程序,加深对语法 及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。用语法 制导完成语义分析,并将形成的中间代码以四元式的形式输出。 2 、文法及属性文法的描述 。 2.1 文法的描述 该文法的产生式如下所示: (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表示合法标识符。 2.2 属性文法的描述 对该文法的属性文法描述如下: (1) S->while(B){E} prinf(if B goto E else goto next) (2) E->AE print = · (3) E->A print =

(4) A->i P A print(A= P (5) A->i; = i; (6) B->i T i print(B = T (7) B->i = i 3 、语法分析方法描述及语法分析表设计 | 3.1 语法分析表设计 3.1.1 文法的DFA

第六课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语句中的初值、终值都可以是顺序类型的常量、变量、表达式。 四、应用举例

循环语句习题选

循环语句习题选 1. 一个自然数与3的和是5的倍数,与3的差是6的倍数,这个自然数最小是几? [ 27 ] 2. 在400--500之间求一个数,它被2除余1,被5除余3,被9除余1,这个数是多少? [ 433 ] 3. 一些四位数,百位数字都是3,十位数字都是6,并且它们既能被2整除,又能被3整除,求这样的四位数中最大的和最小的两数各是几? [ 9366, 1362 ] 4. 编程求一个四位自然数ABCD,它乘以A后变成DCBA. [ 共10个] 5. 编程求出满足以下条件的三位数:它除以11所得的商等于它各位数字之和. [ 198 ] 6. 由计算机产生五个互不相同的19到87之间的随机整数(包括19,不包括87),从中找出所有的三个数之和能被3整除的数组,并按如下格式打印出来. 例如: 42 24 34 51 52 42 + 24 + 51 = 117 = 3 * 39 [ 87年北京市小学组初赛] 7. 某数被80除所得的商,不但是7的倍数,而且用2,3,4,5,6去除余数都是1,求这个自然数. [ 24080 ] 8. 有一种最简真分数,它们的分子与分母的乘积都是140,把所有这样的真分数从小到大打印出来. [ 1/140 ; 4/35 ; 5/28 ; 7/20 ] 9. 求把2/7化为小数后,小数点后面1001位数字总和是多少? [ 4505 ] 10. 一个五位数,若在它的后面写上一个7,得到一个六位数A,若在它前面写上一个7,得到一个六位数B,B是A的五倍,求此五位数. [ 14285 ] 11. 有一个六位数,其个位数字是7,现将个位数字移到首位,而其余各位数字不变,均后退一位,得到一个新的六位数,如果新的六位数是原六位数的四倍,求原来的六位数. [179487 ] 12.一个自然数的个位数字是6,如果把这个位数字移到首位,所得到的数是原数的4倍,求这个自然数. [ 153846 ] 13. 某数的末位数字是2,将2移到首位,所得到的新数正好是原数的2倍,求满足条件的最小数. [ 105263157894736842 ] 14. 有一个六位数,第一位是1,如果把它移到个位,新的六位数正好是原数的三倍,求原来的六位数. [ 142857 ] 15. 已知一个正整数的个位数字是7,将7移到该数字的首位,其他数字顺序不变, 则所得到的新数恰好是原数的7倍,编程找出满足上述要求的最小的自然数. [ 1014492753623188405797 ] 16. 一辆以固定速度行驶得汽车,司机从里程表上看到的数字是一个回文数

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,就退出循环;

do-while语句翻译程序

DO-WHILE循环语句的翻译程序设计 (LR方法、输出三地址表示) 1.系统描述 1.1设计目的 通过设计、编制、调试一个DO-WHILE循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,并实现词法分析程序对单词序列的词法检查和分析。 1.2设计内容及步骤 对循环语句:DO〈赋值语句〉WHILE 〈表达式〉 按给定的题目写出符合自身语法分析方法要求的文法和属性文法描述。 (1)按给定的题目给出语法分析方法的思想及分析表设计。 (2)按给定的题目给出中间代码序列的结构设计。 (3)完成相应的词法分析、语法分析和语义分析程序设计。 (4)编制好分析程序后,设计若干用例,上机测试并通过所设计的分析程序。 2文法的描述 本程序所用的文法如下: G[S]: (1)S->do{E;}while(B) {if B.true goto B.true else goto B.false;} (2)B->I1 rop I2 {B.type=bool;B.val=I1.val rop I2.val;} (3)E->I1=I2 op I3 {I1.val=I2.val op I3.val;} (4)I->id {I.val=id.val;} 注意:rop is < or >,op is +,-,*,/, id is any number or identifier 由上可知,非终结符B表示布尔表达式,E表示赋值表达式 3.语法分析方法描述及语法分析表设计 3.1语法分析方法描述 本实验采用LR分析方法对DO-WHILE语句进行语法分析。LR分析法是一种能根据当前分析栈中的符号串(通常以状态表示)和向右顺序查看输入串的K个(K>=0)符号就能惟一的确定分析器的动作是移进还是归约和用哪个产生式归约,因而也就能惟一的确定句柄。LR分析法的归约过程是规范推导的逆过程,所以LR分析过程是一种规范过程。 一个LR分析器由3个部分组成: 总控程序,也可以称为驱动程序。对所有的LR分析器,总控程序是相同的。 分析表或分析函数。不同的方法分析表将不同,同一个方法采用的LR分析器不同时,分析表也不同,分析表表又可以分为动作(ACTION)表和状态转换(GOTO)表两个部分,它们都可以用二维数组表示。 分析栈,包括文法符号栈和相应的状态栈。它们均是先进后出栈。

相关主题
文本预览
相关文档 最新文档