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)表两个部分,它们都可以用二维数组表示。
分析栈,包括文法符号栈和相应的状态栈。
它们均是先进后出栈。
分析器的动作由栈顶状态和当前输入符号所决定。
LR 分析器工作过程示意图如图所示:其中SP 为栈顶指针,S[i]为状态栈,X[i]为文法符号栈。
状态转换表内容按关系GOTO[Si,X]=Sj 确定,改关系式是指当前栈顶状态为Si 遇到当前文法符号为X 时应转向状态Sj 。
X 为终结符或非终结符。
ACTION[Si,a]规定了栈顶状态为Sj 时遇到输入符号c[i]应该执行的动作。
动作有以下四种可能:移进:当Sj=GOTO[Si ,a]成立,则把Sj 移入到文法符号栈。
其中i ,j 表示状态号。
规约:当在栈顶形成句柄为b 时,则用b 归约为相应的非终结符A ,即当文法中有A->b 的产生式,而b 的长度为r ,则从状态栈和文法符号栈中自栈顶向下去掉r 个符号。
并把A 移入文法符号栈内,再把满足Sj=GOTO[Si ,A]的状态移进状态栈,其中Si 为修改指针后的栈顶状态。
接受acc :当归约到文法符号栈中只剩下文法的开始符号S 时,并且输入符号串已结束即当前输入符是‘#’,则为分析成功。
报错:当遇到状态栈顶为某一状态下出现不该遇到的文法符号时,则报错,说明输入串不是该分发能接受的句子。
3.2语法分析表设计3.2.1构造文法的DFAI0:S ’->.SS->.do{E;}while(B)I1:S ’->S.I2:S->do.{E;}while(B) I3:S->do{.E;}while(B) E->.I= I op I I->.id输入串XXX …#总控程序 ACTION 表GOTO 表Sn . . S1 S0 Xn . . X1 #SP输出I4:S->do{E.;}while(B) I5:E->I . =I op I I6:I->id.I7:S->do{E;.}while(B) I8:E->I=.I op I I->.idI9:S->do{E;}.while(B) I10:E->I = I. op II11:S->do{E;}while.(B) I12:E->I=I op .I I=.idI13:S->do{E;}while(.B) B->.I rop I I->.idI14:E->I=I op I.I15:S->do{E;}while(B.) I16:B->I .rop II17:S->do{E;}while(B). I18:B->I rop .I I19:B->IropI.3.2.2然后写出LR 分析表:状态ACTIONGOTO Do { = ; } While ( ) Rop Op Id #S B EI 0 S21 1 acc2 S3I1I0I19I4I13I9I14I15I12I6I10I8I2I7I16I11I5I3I17I183 S64 54 S75 S86 R4 R4 R4 R4 R4 R4 R4 R4 R4 R4 R4 R47 S98 S6 109 S1110 S1211 S1312 S1413 S6 15 1614 R3 R3 R3 R3 R3 R3 R3 R3 R3 R3 R3 R315 S1716 S1817 R1 R1 R1 R1 R1 R1 R1 R1 R1 R1 R1 R118 S6 1919 R2 R2 R2 R2 R2 R2 R2 R2 R2 R2 R2 R24.中间代码形式的描述及中间代码序列的结构设计4.1中间代码形式的描述在本程序中作用三地址码表示中间代码三地址码的表达形式为:标号结果:= 操作数1 操作符操作数2常见三地址表示举例:赋值语句t1 := a op b,a:= b条件转移if true goto Label无条件转移goto Label4.2中间代码序列的结构设计本程序用标号来表示程序的跳转过程,示例如下100 赋值语句101赋值语句102 条件跳转语句103 无条件转移语句…5.编译系统的概要设计本编译程序的结构图如下:源程序(do-while 语句)词法分析(Lex函数)语法语义分析(Analyze函数)代码生成程序程序输出说明:源程序(do-while语句)通过控制台输入。
然后通过Lex函数对输入的源程序进行分析后,将分析结果以二元组的方式输出到控制台。
接下来通过调用语法语义分析函数来完成对分析得到的单词进行文法句子的识别,并用进行语法制导翻译,完成属性文法定义规定的相关语义动作。
本编译程序最后完成的三地址码输出是通过中间文件间接输出到控制台上的。
在执行Analyze函数的过程中,同时运用ofstream文件流将三地址码输出到一个ASCII码的txt类型文件中,最后从该文件中读出最终处理的三地址码输出至控制台。
6.详细的算法描述(流程图或伪代码)6.1词法分析词法分析程序要做的工作是:从源程序的第一个字符开始,顺序读字符,一次读一个,根据所读进的字符识别各类单词,同时去掉源程序中的空白和注释。
词法分析检查的错误主要是挑出源程序中出现的非法符号。
下面为本程序中所用来进行词法分析的伪代码:输入字符;If(字符是字母){查找关键词表;If(是关键字do或者while)识别关键词;Else 判断为标识符;}Else if(字符是数字)获取整个数;Else if(运算符){If(是算术运算符)识别算术运算符;Else 识别为关系运算符;}Else 标识为其他类型以下附部分源码:int Lex(char InStr[20][8],int InStrLen){//0关键字,1标识符2数字3界符4算符5其他char strsrc[BUFFURSIZE],strdst[8],ch;int strcount=0,strLength,i=0;cout<<"Please input the do-while statement:"<<endl;gets(strsrc);strLength=strlen(strsrc);cout<<endl<<" Lexical Analyse:"<<endl;while(strcount<strLength){while(strsrc[strcount]==' ') strcount++;ch=strsrc[strcount];if(Alpha(ch)){i=0;do strdst[i++]=strsrc[strcount++];while((Alpha(strsrc[strcount])||Digit(strsrc[strcount]))&&(strcount<strLength));strdst[i]='\0';if(!strcmp(strdst,"while"))cout<<setw(10)<<"(0,"<<strdst<<")"<<endl;elsecout<<setw(10)<<"(1,"<<strdst<<")"<<endl;for(int k=0;strdst[k]!='\0';k++){InStr[InStrLen][k]=strdst[k];}InStr[InStrLen++][k]='\0';}else if(Digit(ch)){i=0;do strdst[i++]=strsrc[strcount++];while(Digit(strsrc[strcount])&&(strcount<strLength));strdst[i]='\0';cout<<setw(10)<<"(2,"<<strdst<<")"<<endl;for(int k=0;strdst[k]!='\0';k++){InStr[InStrLen][k]=strdst[k];}InStr[InStrLen++][k]='\0';}else if(Oper(ch)){i=0;strdst[i]=ch;strdst[i+1]='\0';if(!strcmp(strdst,";")||!strcmp(strdst,"(")||!strcmp(strdst,")")||!strcmp(strdst,"{")||!st rcmp(strdst,"}"))cout<<setw(10)<<"(3,"<<ch<<")"<<endl;elsecout<<setw(10)<<"(4,"<<ch<<")"<<endl;for(int k=0;strdst[k]!='\0';k++){InStr[InStrLen][k]=strdst[k];}InStr[InStrLen++][k]='\0';strcount++;}else{cout<<setw(10)<<"(5,"<<ch<<")"<<endl;isillegal=1; cout<<"isillegal="<<isillegal<<endl;cout<<"not while statement "<<endl;break;strcount++;}}InStr[InStrLen++][0]='#';cout<<"inputed string"<<endl;for(int j=0;j<InStrLen;j++)cout<<" "<<InStr[j];cout<<"grammer analysis"<<'\n';return InStrLen;}6.2语法分析流程图如下,具本处理过程,请参见本文档3.1小节此处附上语法语义分析函数 void Analyze(State state) {int row=0,col=0,numchange=0;cout<<" Procedure"<<endl; cout.setf(ios::left); cout<<"step"<<""<<setw(20)<<"STATESTACK"<<setw(20)<<"SYMBOLSTACK"<<setw(20)<<"IN PUT"<<setw(8)<<"ACTION"<<setw(6)<<"GOTO"<<endl;strcpy(next,state.InStr[state.CurInstr]); ropOrOp(next);row=state.stkState[state.CurState]; col=Index(next);numchange=table[row][col];输入串XXX …#总控程序 ACTION 表GOTO 表Sn . . S1 S0 Xn . . X1 #SP输出ofstream outfile("do_while.txt");while(strcmp(state.stkSymbol[state.CurSymbol],"S")!=0&&numchange!=20) {if(numchange==0){isillegal=1;break;}numchange=Action(state,numchange,outfile);}if(isillegal==0){cout<<setw(4)<<step++<<" ";state.showState();cout<<setw(8)<<"acc"<<endl;}cout<<"processing semantic analysis"<<endl;system("PAUSE");}关键的状态转移函数ACTION和GOTOint Action(State &state,int actionnum,ofstream &outfile){int row=0,col=0,numchange=0;int choice=0;int ct=100;int m=0;if(actionnum>=1&&actionnum<=18)choice=1;else choice =actionnum;switch(choice){case 0:{isillegal=1;cout<<"isillegal="<<isillegal<<endl;break;}case 1://移进项目{cout<<setw(4)<<step++<<" ";state.showState();cout<<setw(8)<<actionnum<<endl;state.CurState++; s tate.stkState[state.CurState]=actionnum;state.CurSymbol++;strcpy(state.stkSymbol[state.CurSymbol],state.InStr[state.CurInstr]);strcpy(next,state.InStr[state.CurInstr]);ropOrOp(next);row=state.stkState[state.CurState];col=Index(next);numchange=table[row][col];break;}case 20://接收{cout<<setw(4)<<step++<<" ";state.showState();cout<<setw(8)<<"acc"<<endl;break;}case 21://r1 S-->while(B){E;}{cout<<setw(4)<<step++<<" ";state.showState();cout<<setw(8)<<actionnum;for(int i=9;i>0;i--){state.stkState[state.CurState--]=0;}for(i=9-1;i>=0;i--){strcpy(B[i],state.stkSymbol[state.CurSymbol]);strcpy(state.stkSymbol[state.CurSymbol--],"");}outfile<<"B.false: "<<'\n';state.CurSymbol++;strcpy(state.stkSymbol[state.CurSymbol],"S"); //B-->IropI strcpy(next,state.stkSymbol[state.CurSymbol]);ropOrOp(next);row=state.stkState[state.CurState];col=Index(next);numchange=table[row][col];numchange=Goto(state,numchange);break;}case 22://r2 B-->IropI{cnt=0;cout<<setw(4)<<step++<<" ";cout<<setw(8)<<actionnum;for(int i=3;i>0;i--){state.stkState[state.CurState--]=0;}for(i=3-1;i>=0;i--){strcpy(B[i],state.stkSymbol[state.CurSymbol]);strcpy(state.stkSymbol[state.CurSymbol--],"");}outfile<<"102 t1:="<<I[0]<<B[1]<<I[1]<<endl;outfile<<"103 if t1.val=true"<<" goto 100"<<endl;outfile<<"104 goto 105"<<endl;state.CurSymbol++;strcpy(state.stkSymbol[state.CurSymbol],"B"); //归约B-->IropI strcpy(next,state.stkSymbol[state.CurSymbol]);ropOrOp(next);row=state.stkState[state.CurState];col=Index(next);numchange=table[row][col];numchange=Goto(state,numchange);break;}case 23://r3 E-->I=IopI{cnt=0;cout<<setw(4)<<step++<<" ";state.showState();cout<<setw(8)<<actionnum;for(int i=5;i>0;i--){state.stkState[state.CurState--]=0;}for(i=5-1;i>=0;i--){strcpy(E[i],state.stkSymbol[state.CurSymbol]);strcpy(state.stkSymbol[state.CurSymbol--],"");}outfile<<"100 "<<"t1:="<<I[1]<<E[3]<<I[2]<<endl;outfile<<"101 "<<I[0]<<":=t1"<<endl;state.CurSymbol++;strcpy(state.stkSymbol[state.CurSymbol],"E");strcpy(next,state.stkSymbol[state.CurSymbol]);ropOrOp(next);row=state.stkState[state.CurState];col=Index(next);numchange=table[row][col];numchange=Goto(state,numchange);break;}case 24://r4归约I-->id{cout<<setw(4)<<step++<<" ";state.showState();cout<<setw(8)<<actionnum;state.stkState[state.CurState--]=0;strcpy(I[cnt++],state.stkSymbol[state.CurSymbol]);//{I.value=id.value}strcpy(state.stkSymbol[state.CurSymbol],"I"); //归约I-->idstrcpy(next,state.stkSymbol[state.CurSymbol]);ropOrOp(next);row=state.stkState[state.CurState];col=Index(next);numchange=table[row][col];numchange=Goto(state,numchange);break;}}return numchange;}int Goto(State &state,int gotonum){int row=0,col=0,numchange=0;cout<<setw(6)<<gotonum<<endl;state.CurState++;state.stkState[state.CurState]=gotonum;strcpy(next,state.InStr[state.CurInstr]);ropOrOp(next);row=state.stkState[state.CurState];col=Index(next);return table[row][col];}7.软件的测试方法和测试结果(1)运行程序,显示如下程序界面(2)按照提示输入合法的do-while语句Do{a=b+c;}while(a<b)(3)按enter确定输入完毕,得到词法分析结果,显示如下:并且最后一行提示了经过词法分析后合法的待输入串在栈中的存储情况。
WHILE循环语句的翻译程序设计(简单优先法,三地址输出)
目录1 问题域描述 (3)2 文法及属性文法的描述 (3)2.1 WHILE循环语句的文法 (3)2.2 WHILE循环语句的属性文法 (4)3 语法分析方法及中间代码形式的描述 (4)3.1语法分析方法 (4)3.2中间代码形式描述 (6)4 编译系统的概要设计 (7)4.1词法分析 (7)4.2语法制导翻译 (8)5 详细的算法描述 (8)5.1 文法设计 (8)5.2 算法描述 (8)5.3 源程序代码 (9)6 软件的调试过程和结果测试 (19)6.1调试过程 (19)6.2结果测试 (19)7 使用说明 (20)8 课设总结 (20)9 参考文献 (22)WHILE循环语句的翻译程序设计(简单优先法、输出三地址表示)1 问题域描述while循环语句的翻译程序设计(简单优先法,输出单地址表示),要求完成:(1)用C++语言正确编写程序,完成WHILE循环语句的翻译程序设计。
(2)求能正确进行词法分析,语法分析,并能正确的输出预期结果。
(3)根据指定的文法,判定程序的正确性。
本次课程设计中要求设计一个WHILE循环语句的词法﹑语法及语义分析程序,语法分析选择简单优先法,采用语法制导翻译输出中间代码三元式。
通过设计、编制、调试一个WHILE循环语句的语法及语义分析程序,加深对语法及语义分析原理的理解,实现功能。
while循环语句的格式为:while(P){do A},其中A为循环体,可为一个或多个赋值语句;P为循环控制条件。
while循环语句首先根据循环控制条件P进行判断,若满足条件则执行循环体A,否则执行下面的程序段;本次课程设计中系统首先要进行词法分析,即从左到右把源文件的字符序列逐个进行扫描,产生一个个的单词序列,作为语法分析的输入从而继续编译过程。
该程序的语法分析读入词法分析的结果,并判断输入语句是否满足while循环语句的文法所描述的形式。
通过简单优先法对语句进行分析,看是否能通过给定的输入串归约到文法的开始符号。
do-while语句的语法格式及其流程
do-while语句的语法格式及其流程`do-while` 语句是一种循环语句,它在执行循环体之前先执行一次条件判断。
这意味着,无论条件是否满足,循环体至少会被执行一次。
下面是`do-while` 语句的语法格式和执行流程:```cppdo {// 循环体} while (条件表达式);```- `do` 后面紧跟着循环体,用花括号`{}` 括起来,循环体是需要重复执行的语句块。
- `while` 后面跟着条件表达式,条件表达式返回一个布尔值。
如果条件为真,循环会继续执行;如果条件为假,循环结束。
执行流程如下:1. 执行`do` 后的循环体。
2. 执行完循环体后,计算`while` 后的条件表达式。
3. 如果条件表达式为真,则回到步骤1,重新执行循环体;如果条件表达式为假,则退出循环。
下面是一个简单的C++ 示例,演示了`do-while` 语句的用法:```cpp#include <iostream>int main() {int count = 0;do {std::cout << "Count: " << count << std::endl;count++;} while (count < 5);return 0;}```这个例子会输出以下内容:```Count: 0Count: 1Count: 2Count: 3Count: 4```即使条件`count < 5` 在第一次循环后变为假,`do-while` 语句仍然执行了一次循环体。
DO-WHILE循环语句翻译程序设计
DO-WHILE循环语句翻译程序的设计目录第一章概述 (1)1.1 课程设计背景 (1)1.2 课程设计目的 (1)1.3 实验环境与开发工具 (1)1.4 C++语言简单介绍 (2)第二章设计内容 (3)2.1 设计需求陈述 (3)2.1.1词法分析的原理 (4)2.1.2 语法分析器的原理 (5)2.1.3 语义分析中间代码生成器的原理.......................................... 错误!未定义书签。
2.2 需要完成的功能................................................................................. 错误!未定义书签。
2.2.1 判定输入的文法词法分析是否正确 (8)2.2.2 判定输入的文法语法分析是否正确 (9)2.2.3中间代码(四元式)的生成与输出 (10)2.3 分析器的构造 (11)第三章逻辑设计 (12)3.1系统的组织与基本工作流程 (12)3.2 总体结构逻辑结构图 (13)第四章详细设计.............................................................................................. 错误!未定义书签。
4.1 软件功能分析................................................................................... 错误!未定义书签。
4.1.1 判定输入文法词法分析是否正确 (14)4.1.2 判定输入的文法的语法分析是否正确.................................. 错误!未定义书签。
4.1.3 语义分析和中间代码生成...................................................... 错误!未定义书签。
dowhile的用法c语言
dowhile的用法c语言【原创实用版】目录1.概述 do-while 循环的用途2.do-while 循环的基本语法3.do-while 循环与 while 循环的区别4.使用 do-while 循环的注意事项5.示例:使用 do-while 循环实现的功能正文一、概述 do-while 循环的用途在 C 语言编程中,循环结构是经常使用的一种控制结构,用于重复执行某些操作。
do-while 循环是其中一种循环结构,它的主要用途是当满足某个条件时,重复执行一段代码。
与 while 循环不同,do-while 循环会至少执行一次循环体。
二、do-while 循环的基本语法do-while 循环的基本语法如下:```do {// 循环体} while (条件);```其中,`do`和`while`是关键字,`do`后面跟着的是循环体,`while`后面跟着的是条件表达式。
只要条件表达式为真,循环体就会一直执行。
三、do-while 循环与 while 循环的区别do-while 循环与 while 循环的主要区别在于执行顺序不同。
while 循环是先进行条件判断,如果条件为真,则执行循环体;而 do-while 循环是先执行一次循环体,然后再进行条件判断。
因此,do-while 循环至少会执行一次循环体。
四、使用 do-while 循环的注意事项在使用 do-while 循环时,需要注意以下几点:1.循环条件表达式应尽可能简单,以减少程序执行的时间。
2.循环体内部不要包含可能影响循环执行的语句,例如使用 break 语句跳出循环。
3.do-while 循环一般用于需要重复执行一定次数的操作,或者用于处理可能需要多次尝试才能成功的情况。
五、示例:使用 do-while 循环实现的功能下面是一个使用 do-while 循环实现的简单示例,用于计算 1 到100 之间所有偶数的和:```c#include <stdio.h>int main() {int sum = 0;int i = 1;do {if (i % 2 == 0) {sum += i;}i++;} while (i <= 100);printf("1 到 100 之间的偶数和为:%d", sum);return 0;}```在这个示例中,我们使用 do-while 循环遍历 1 到 100 之间的所有整数,当整数 i 为偶数时,将其累加到变量 sum 中。
dowhile语句的用法
dow hi le语句的用法篇一:4.d o-wh il e语句的用法d o-wh il e语句的一般形式为:d o语句w hi le(表达式);这个循环与wh il e循环的不同在于:它先执行循环中的语句,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。
因此,do-w hi le循环至少要执行一次循环语句。
其执行过程可用下图表示。
【例6.5】用d o-wh il e语句计算从1加到100的值m ai n(){in ti,su m=0;i=1;do{s um=s um+i;i++;}w hi le(i=100)p ri nt f(%d\n,s um);}同样当有许多语句参加循环时,要用{和}把它们括起来。
【例6.6】wh il e和do-w hi le循环比较。
(1)ma in(){in tsu m=0,i;s ca nf(“%d”,wh il e(i=10){su m=su m+i;i++;}pr in tf(“su m=%d”,su m);}(2)m ai n(){i nts um=0,i;sc an f(“%d”,do{su m=su m+i;i++;}wh il e(i=10);pr in tf(“su m=%d”,su m);}篇二:d ow hi le使用技巧#de fi neM AC RO_N AM E(pa ra)do{m ac roc on te nt}w hi le(0)的格式,总结了以下几个原因:1,空的宏定义避免wa rn in g:#de fi nef oo()d o{}w hi le(0)2,存在一个独立的b lo ck,可以用来进行变量定义,进行比较复杂的实现。
java中do while的用法
Java中的do-while循环是一种常见的循环结构,它与while循环和for循环一样,用于重复执行一段代码,直到满足某个条件时停止。
本文将详细介绍java中do-while循环的用法,包括语法、示例代码和一些注意事项。
一、语法do-while循环的语法如下所示:```javado {// 循环体} while (条件表达式);```二、示例代码下面是一个简单的示例代码,演示了do-while循环的基本用法:```javapublic class DoWhileDemo {public static void m本人n(String[] args) {int i = 1;do {System.out.println(i);i++;} while (i <= 5);}}```三、解释与注意事项1. do-while循环与while循环的区别在于,do-while循环会先执行一次循环体,然后再判断条件是否满足。
这意味着,即使条件一开始就不满足,循环体也会被执行一次。
而while循环则先判断条件是否满足,然后再决定是否执行循环体。
2. 在使用do-while循环时,要特别注意条件表达式的初始值和更新方式,以免造成死循环或者跳不出循环的情况。
3. 在实际编程中,do-while循环通常用于需要先执行一次循环体才能确定条件是否满足的情况。
读取用户输入的信息,或者进行一些初始化操作。
以上就是关于java中do-while循环的介绍。
希望本文能够帮助大家更好地理解和运用do-while循环。
四、do-while循环的嵌套和实际应用除了基本的do-while循环语法外,我们还可以将多个do-while循环嵌套在一起,以实现更复杂的循环逻辑。
下面的示例演示了嵌套的do-while循环:public class NestedDoWhileDemo {public static void m本人n(String[] args) {int i = 1, j;do {j = 1;do {System.out.print(i * j + " ");j++;} while (j <= 3);System.out.println();i++;} while (i <= 3);}}```在这个示例中,外层的do-while循环负责控制输出的行数,内层的do-while循环负责控制每行输出的内容。
c语言中do while的用法
c语言中do while的用法C语言中的do while循环是一种循环结构,它与while循环和for 循环一样,可以用来重复执行一段代码。
但是,它与while循环和for循环不同的是,它的循环体至少会被执行一次,即使循环条件一开始就不满足。
do while循环的语法格式如下:```do {// 循环体} while (循环条件);```在这个语法格式中,循环体是需要重复执行的代码块,循环条件是一个布尔表达式,用来判断是否继续执行循环体。
当循环条件为真时,循环体会被重复执行,直到循环条件为假为止。
下面是一个简单的例子,演示了do while循环的用法:```#include <stdio.h>int main() {int i = 1;do {printf("%d ", i);i++;} while (i <= 10);return 0;}```这个程序会输出从1到10的数字,因为循环体会被执行10次,直到i的值大于10为止。
即使i的初始值为11,循环体也会被执行一次,因为do while循环的特点是至少会被执行一次。
do while循环的优点是它可以保证循环体至少被执行一次,这在某些情况下非常有用。
比如,当需要从用户那里获取输入时,可以使用do while循环来保证至少获取一次输入。
另外,do while循环也可以用来处理一些需要先执行一次循环体的情况,比如初始化变量等。
do while循环是C语言中一种非常有用的循环结构,它可以保证循环体至少被执行一次,同时也可以用来处理一些特殊情况。
在编写程序时,我们应该根据具体情况选择合适的循环结构,以便更好地完成任务。
《编译原理》课程设计说明书_DO_WHILE循环语句的翻译程序设计(LR方法、输出三地址表示)
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个部分组成:总控程序,也可以称为驱动程序。
do while循环语句用法
do while循环语句用法
嘿,朋友们!咱今儿个就来好好唠唠 do while 循环语句的用法。
你想啊,就好比你去跑马拉松,do while 循环就像是你先不管三七
二十一地跑起来,然后在特定条件下才决定是不是继续跑。
比如说,
你设定一个目标,“只要我还没跑到终点,我就继续跑”,这就是 do while 循环的精髓所在!
咱先说说它的基本结构哈。
“do”后面紧跟着要执行的代码块,然后
是“while”,再加上判断条件。
这就像是一个有决心的人,先行动起来,然后再看看情况决定下一步。
比如说,你让程序一直输出数字,直到某个数字出现。
这就像你在
玩猜数字游戏,一直猜,直到猜对了为止!“哎呀,我怎么还没猜对呀!”这时候 do while 循环就派上用场啦。
再举个例子,你想让程序不断地接收用户输入,直到用户输入一个
特定的字符。
这多有意思呀,就像你和朋友聊天,一直聊到说到某个
关键词为止。
“嘿,你怎么还不说那个词呀!”
它和其他循环语句比起来,有它独特的优势呢。
它至少会执行一次
代码块,这就好比你下定决心要做一件事,不管怎样先做了再说。
不
像有些循环,可能因为条件不满足一开始就不执行。
总之,do while 循环语句就像是一个勇往直前的战士,先冲出去再说!它在很多情况下都超级实用,能帮我们解决好多问题呢。
我觉得 do while 循环语句真是编程世界里不可或缺的一部分呀,它能让我们的程序更灵活、更有趣!你们觉得呢?。
dowhile循环语句用法
dowhile循环语句用法1. 嘿呀,你知道 do while 循环语句怎么用吗?就像你一直往前走,直到遇到特定条件才停下来。
比如说,你想要让用户一直输入直到输入正确,那就可以用 do while 循环呀!“do { 获取用户输入; } while (输入不正确);”,是不是很神奇呀!2. 哎呀,do while 循环语句可有意思啦!它就像一场冒险,先行动起来,然后再看条件决定要不要继续呢。
好比你在找宝藏,先找,然后看是不是找到了,没找到就接着找!“do { 尝试打开宝箱; } while (宝箱未打开);”,妙不妙呀!3. 告诉你哦,do while 循环语句真是个好东西呢!这就像是打游戏,先出招,然后判断能不能过关。
比如说统计输入的数字总和,直到输入负数就停止,“do { 输入数字; 总和 += 数字; } while (数字不小于0);”,是不是超好用呀!4. 哇塞,do while 循环语句的用法你可得搞清楚呀!它就如同你在跑步,先跑一段,然后看符不符合要求。
像是计算从 1 开始到多少累加和超过100,“do { 当前数++; 累加和 += 当前数; } while (累加和<= 100);”,多有趣呀!5. 嘿,do while 循环语句的魅力可大啦!它好比是你去尝试做一件事,做完看看情况,不行再接着做。
就像检查输入是否为偶数,“do { 输入数字; } while (数字不是偶数);”,这方法简直绝了!6. 你看,do while 循环语句是不是特别神奇呀!它就像一个执着的人,先做了再说,然后看结果决定下一步。
假设要反复询问是否喜欢编程,“do { 询问是否喜欢; } while (回答否);”,是不是让你大开眼界呢!我觉得 do while 循环语句是非常实用且有趣的,它能让我们的程序更灵活,让我们能更轻松地处理一些先执行后判断的情况。
