函数与编译预处理的实验操作
- 格式:doc
- 大小:34.50 KB
- 文档页数:3
实验一词法分析程序设计(6学时)一、实验目的设计并实现一个包含预处理功能的词法分析程序,加深对编译中词法分析过程的理解。
二、实验要求1、实现词法分析功能输入:所给文法的源程序字符串。
输出:二元组(syn,token)构成的序列。
其中,syn为单词种别码。
Token为存放的单词自身字符串。
具体实现时,可以将单词的二元组用结构进行处理。
2、待分析的C语言子集的词法1)关键字main if then while do static int double struct break else long switch case typedef char return const float shortcontinue for void default sizeof do所有的关键字都是小写。
2)运算符和界符+ - * / < <= > >= = ; ( )3)其他标记ID和NUM通过以下正规式定义其他标记:标识符 ID→letter(letter|digit)*无符号整数 NUM→digit digit*字母 letter→a|…|z|A|…|Z数字 digit→0|…|9…4)空格由空白、制表符和换行符组成空格一般用来分隔ID、NUM、专用符号和关键字,词法分析阶段通常被忽略。
4、各种单词符号对应的种别码表1 各种单词符号的种别码单词符号种别码单词符号种别码main 1 ; 41if 2 ( 42else 3 ) 43while 4 int 7do 5 double 8static 6 struct 9ID (标识符)25 break 10NUM (整数) 26 else 11+ 27 long 12- 28 switch 13* 29 case 14/ 30 typedef 15: 31 char 16:= 32 return 17< 33 const 18<> 34 float 19<= 35 short 20> 36 continue 21>= 37 for 22= 38 void 23default 39 sizeof 24do 405、词法分析程序的主要算法思想算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到的单词符号的第一个字符的种类,拼出相应的单词符号。
电子科技大学计算机学院标准实验报告(实验)课程名称C语言程序设计电子科技大学教务处制表电子科技大学实验报告四学生姓名:学号:指导教师:王瑞锦实验地点:实验日期:年月日一、实验室名称:软件实验室二、实验项目名称:函数的应用及预处理三、实验学时:2四、实验原理:使用Turbo C软件(简称TC),在微型计算机上,对其程序进行编辑、编译、连接与运行。
Turbo C是一个集成环境,它具有方便、直观、易用的界面和丰富的库函数。
通过上机练习掌握在TC环境下编辑、编译、连接、和运行C程序的方法和过程。
五、实验目的1.掌握C语言中定义函数的方法;2.掌握函数传值调用的方法;3.掌握函数传址调用的方法;4.掌握递归函数的设计方法;5.掌握命令行参数的使用方法;6.掌握函数在不同文件中的编译、链接方法。
六、实验内容编程实验,完成以下上机内容,调试运行程序并完成报告1)、教材第七章习题7.4;2)、编写一个实现冒泡法排序的函数,并在主函数中从键盘上输入6个数后进行排序输出;3)、教材第七章习题7.11;4)、教材第七章习题7.15;5)、教材第七章习题7.24;6)、求解汉渃塔(tower of Hanoi)问题。
在一块平板上立有3根立柱,从左到右分别标记为A,B,C。
最初在A柱上放有6个大小不等的圆盘,并且大盘在下面,小盘在上面。
要求将这些盘从A移到C(可以借助B柱)。
条件是:每次只能移动一个盘,并且不允许把大盘放在小盘的上面。
(提示:利用函数的递归调用);七、实验器材(设备、元器件):pc硬件要求:CPU PII 以上,64M 内存,1OOM 硬盘空间即可。
软件要求:DOS3.0以上/Windows98/Me/XP/NT/2000。
八、实验步骤:实验编程与运行结果⑴编写一个求两个整数的最小公倍数的函数,两个整数由键盘输入,用主函数调用这个函数,并输出结果。
程序文件名为7_4.c,源程序清单如下:#include<stdio.h>lcd(int a,int b){int temp,num1,num2;num1=a;num2=b;while(num2!=0){temp=num1%num2;num1=num2;num2=temp;}return(a*b/num1);}main(){int t,x,y;printf("Please input two integers:");scanf("%d,%d",&x,&y);if(x>y){t=x;x=y;y=t;}printf("lcd(%d,%d)=%d\n",x,y,lcd(x,y));}运行结果:⑵编写一个实现冒泡法排序的函数,并在主函数中从键盘上输入6个数后进行排序输出。
实验1 C++基础6.编写程序,输入某大写字母的ASCII码值,输出该字母的对应小写字母。
#in clude<iostream>using n amespace std;int mai n(){int i;cin> >i;if(i>=65 && 1<=90 )cout<<char(i-'A'+'a')vve ndl;elsecout«"输入有误"<<endl;} return 0;实验2三、实验思考1.输入直角三角形的两条直角边长,调用平方根库函数sqrt来求斜边的长度#in clude<iostream>#in clude<cmath>using n amespace std;int mai n(){ float a,b,c;coutvv"请输入直角三角形的两条边长:";cin> >a>>b;c二sqrt(a*a+b*b);cout«"直角三角形的斜边="<<c<<endl;return 0;}2 •从键盘输入一个字符,如果输入的是英文大写字母,则将它转换成小写字母后输出,否则输出原来输入的字符。
#in clude<iostream>using n amespace std;int mai n(){char c;1coutvv"请输入一个字符:";cin> >c;if(c>='A'&& c<='Z')c+='a'-'A';coutvvcvve ndl;return 0;3•输入一个学生的成绩,如高于60分,贝V输出“ pass” ;否则,输出“failed ”。
程序编译的四个步骤程序编译通常涉及以下四个步骤:预处理、编译、汇编和链接。
1.预处理预处理是编译过程的第一步,它主要负责对源代码进行一些预处理操作。
预处理器工具通常被称为预处理程序,它会根据源代码文件中的预处理指令来修改源代码。
预处理指令位于源代码文件的开头,以“#”字符开头。
预处理指令主要包括宏定义、条件编译和包含文件等。
在预处理阶段,预处理器会执行以下操作:-展开宏定义:将代码中的宏定义替换为相应的代码片段。
-处理条件编译:根据条件编译指令的结果,决定是否包含或排除一些代码。
-处理包含文件:将文件中的包含文件指令替换为实际的文件内容。
预处理后的源代码通常会生成一个中间文件,供下一步编译使用。
2.编译编译是程序编译过程的第二个阶段。
在编译阶段,编译器将预处理生成的中间文件翻译成汇编语言。
编译器会按照源代码的语法规则,将源代码转换为汇编语言指令,生成目标文件(也称为汇编代码文件)。
编译器在编译过程中执行以下操作:-词法分析:将源代码分割为多个词法单元,如关键字、标识符和运算符等。
-语法分析:根据语言的语法规则,分析词法单元的组合,生成语法树。
-语义分析:检查语法树的语义正确性,进行类型检查等。
-优化:对生成的中间代码进行各种优化,以提高程序执行效率。
编译器输出的目标文件通常是汇编语言形式的代码,以便下一步汇编使用。
3.汇编汇编是编译过程的第三个阶段,它将编译器生成的汇编代码翻译成目标机器码。
汇编器(或称为汇编程序)将汇编代码中的指令和操作数翻译为目标机器指令的二进制表示。
汇编器在汇编过程中执行以下操作:-识别和解析汇编指令:将汇编代码中的汇编指令和操作数分割解析。
-确定存储器地址:根据符号的引用和定义,计算并分配存储器地址。
-生成目标机器指令:将汇编指令和操作数翻译为目标机器指令的二进制表示。
汇编器的输出是一个或多个目标文件,每个目标文件都包含可在目标机器上执行的二进制指令。
4.链接链接是编译的最后一个阶段,它将多个目标文件和库文件组合在一起,生成最终的可执行文件。
编译原理实验编译原理实验。
编译原理是计算机科学中的一个重要领域,它研究的是编译器的设计和实现原理。
编译器是将高级语言代码转换成机器语言代码的程序,它在软件开发过程中起着至关重要的作用。
而编译原理实验则是帮助学生深入理解编译原理的重要手段之一,通过实际操作来加深对编译原理知识的理解和掌握。
在编译原理实验中,我们需要掌握以下几个关键点:1. 词法分析,词法分析是编译过程中的第一步,它负责将源代码分割成一个个的单词(Token)。
在词法分析实验中,我们需要实现一个词法分析器,能够正确地识别出源代码中的各种单词,并进行分类和标记。
2. 语法分析,语法分析是编译过程中的第二步,它负责将词法分析得到的单词序列转换成抽象语法树。
在语法分析实验中,我们需要实现一个语法分析器,能够根据给定的文法规则,将单词序列转换成抽象语法树,并进行语法检查。
3. 语义分析,语义分析是编译过程中的第三步,它负责对抽象语法树进行语义检查和翻译。
在语义分析实验中,我们需要实现一个语义分析器,能够对抽象语法树进行类型检查、作用域分析等,并生成中间代码。
4. 代码生成,代码生成是编译过程中的最后一步,它负责将中间代码转换成目标机器代码。
在代码生成实验中,我们需要实现一个代码生成器,能够将中间代码转换成目标机器代码,并进行优化。
通过以上实验,我们可以深入理解编译原理的各个环节,并掌握编译器的设计和实现原理。
同时,实验过程中还能培养我们的动手能力和解决问题的能力,为今后的软件开发打下坚实的基础。
总之,编译原理实验是非常重要的,它能够帮助我们深入理解编译原理知识,提高我们的动手能力和解决问题的能力。
希望大家能够认真对待编译原理实验,从中获得更多的收获和成长。
实验一编译预处理实验目的:1. 了解程序设计语言的编译系统;2. 从编译程序的角度理解程序设计语言。
实验内容:1.编写一程序,输入一C语言源程序,输出的结果不对源程序行改变,仅去掉所有注释的内容;把C语言中定义的符号变量能采用对应的常量来替换。
2.学生可以进入turbo c和其它程序设计语言来实现程序。
实验要求:每位同学撰写一份试验报告,并提交电子版的源程序和报告。
实验报告的要求:程序流程图源程序输入和输出实验提示:以下是一个C++程序,请试着写出它的功能。
#include <fstream.h>#include <iostream.h>void pro_process(char *);void main(){char buf[4048]={'\0'};pro_process(buf);cout<<buf<<endl;}void pro_process(char *buf){ifstream cinf("source.txt",ios::in);int i=0;char old_c='\0',cur_c;bool in_comment=false;while(cinf.read(&cur_c,sizeof(char))) {switch(in_comment){case false:if(old_c=='/'&&cur_c=='*'){i--;in_comment=true;}else{if(old_c=='\\'&& cur_c=='\n')i--;else{if(cur_c>='A'&&cur_c<='Z')cur_c+=32;if(cur_c=='\t'||cur_c=='\n')cur_c=' ';buf[i++] =cur_c;}}break;case true:if(old_c=='*'&&cur_c=='/')in_comment=false;}old_c=cur_c;}buf[i++]='#';}。
第九章编译预处理课题:第九章编译预处理教学目的:1、了解预处理的概念及特点2、掌握有参宏与无参宏的定义及使用,领会文件包含的使用及效果教学重点:教学难点:掌握宏的使用,文件包含有参宏与无参宏的使用步骤一复习引导ANSI C标准规定可以在C源程序中加入一些“预处理命令”,以改进程序设计环境,提高编程效率。
这些预处理命令是由ANSI C统一规定的,但它不是C语言本身的组成部分,不能直接对它们进行编译。
必须在对程序进行通常的编译之前,先对程序中这些特殊的命令进行“预处理”,即根据预处理命令对程序作相应的处理。
经过预处理后程序不再包括预处理命令了,最后再由编译程序对预处理后的源程序进行通常的编译处理,得到可供执行的目标代码。
步骤二讲授新课C语言与其他高级语言的一个重要区别是可以使用预处理命令和具有预处理的功能。
C 提供的预处理功能主要有以下三种:宏定义、文件包含、条件编译。
分别用宏定义命令、文件包含命令、条件编译命令来实现。
为了与一般C语句相区别,这些命令以符号“ #” 开头。
§9.1宏定义宏:代表一个字符串的标识符。
宏名:被定义为“宏”的标识符。
宏代换(展开):在编译预处理时,对程序中所有出现的“宏名”,用宏定义中的字符串去代换的过程。
一、不带参数的宏定义一般形式:#define 标识符字符串#define PI 3.1415926main(){ float l, s, r, v;printf( “input radius:” );scanf( “%f”, &r );l = 2.0*PI*r;s = PI*r*r;v = 3.0/4*PI*r*r*r;printf(“%10.4f,%10.4f,%10.4\n”, l, s, v);}例如:由键盘输入y值,求表达式:3(y2+3y)+ 4(y2+3y)+ y(y2+3y)#define M (y*y+3*y)main(){ int s, y;printf( “Input a number :”); scanf (“%d”,&y);s=3*M+4*M+y*M; p rintf(“s=%d\n”,s);}先宏展开:s=3*(y*y+3*y) +4*( y*y+3*y) + y*(y*y+3*y)再与源程序合并说明:⑴宏名一般用大写表示,以便与变量名区分。
《高级语言程序设计》实验指导学院:信息科学与技术学院专业:信息管理与信息系统学期:2010~2011学年第二学期教师:目录实验1 熟悉C语言程序开发环境 (1)1.1 实验目的 (1)1.2 实验预习 (1)1.3 实验任务 (1)实验2 数据描述 (6)2.1 实验目的 (6)2.2 实验预习 (6)2.3 实验任务 (6)实验3 顺序结构程序设计 (10)3.1 实验目的 (10)3.2 实验预习 (10)3.3 实验任务 (10)实验4 选择结构程序设计 (13)4.1 实验目的 (13)4.2 实验预习 (13)4.3 实验任务 (13)实验5 循环结构程序设计 (16)5.1 实验目的 (16)5.2 实验预习 (16)5.3 实验任务 (16)实验6 函数与编译预处理 (22)6.1 实验目的 (22)6.2 实验预习 (22)6.3 实验任务 (22)实验7 数组 (28)7.1 实验目的 (28)7.2 实验预习 (28)7.3 实验任务 (28)实验8综合实验 (33)8.1 实验目的 (33)8.2 实验预习 (33)8.3 实验任务 (33)实验9 指针 (36)9.1 实验目的 (36)9.2 实验预习 (36)9.3 实验任务 (36)实验10 结构体数据类型与链表 (40)10.1 实验目的 (40)10.2 实验预习 (40)10.3 实验任务 (40)实验11 共用体数据类型 (43)11.1 实验目的 (43)11.2 实验预习 (43)11.3 实验任务 (43)实验12 文件 (45)12.1 实验目的 (45)12.2 实验预习 (45)12.3 实验任务 (45)实验13 综合实验 (48)13.1 实验目的 (48)13.2 实验预习 (48)13.3 实验任务 (48)实验1 熟悉C语言程序开发环境院(系):信息科学与技术学院课程名称:高级语言程序设计教师签名:1.1 实验目的1.了解和掌握C语言的主要特点。
函数与编译预处理的实验操作
实验目的:了解函数的定义,掌握函数的调用和参数的传递及预编译命令实验要求:熟练掌握函数的调用及参数的传递
实验内容:1.在VC++下输入以下函数
#include<stdio.h>
int fact(int n)
{
int j,f=1;
for(j=1;j<=n;j++)
f=f*j;
return f;
}
void main()
{
int k’sum=0;
for(k=1;k<=5;k++)
sum=sum+fact(k);
printf(“sum=%d\n”,sum);
}
#include<stdio.h>
int max(int x,int y)
{
return x>y?x:y;
}
void main()
{
int a,b,c,m;
printf(“请输入三个整数:\n”);
scanf(“%d%d%d”,&a&b&c);
m=max(c,max(a,b));
printf(“m=%d\n”,m);
}
#include<math.h>
#include<stdio.h>
int prime(int x)
{
int i,r=1;
for(i=2;i<=sqrt(x);i++)
if(x%i==0)
{
r=0;break;
}
return r;
}
void output(int x,int n)
{
printf(“%6d”,x);
if(n%5==0) printf(“\n”);
}
void main()
{
int m,n=0;
for(m=2;m<=50;m++)
if(prime(m))
{
n++;
output(m,n);
}
}
#include<stdio.h>
double fac(int n)
{
double f;
if(n<0) printf(“n<0,input error!”) else if(n==0||n==1)f=1;
else f=fac(n-1)*n;
return(n);
}
void main()
{
int n;
printf(“\ninput a inteager number:”); scanf(“%d”,&n);
printf(“%d!=%.1f\n”,n,fac(n));
}
#include<stdio.h>
int ged (int m,int n)
{
int g;
if(n==0)
g=m;
else
g=ged(n,m%n);
return(g)
}
void main()
{
int m,n;
printf(“请输入两个整数:”);
scanf(“%d%d”,&m&n);
printf(“gcd=%d\n”,gcd(m,n));
}
#include<stdio.h>
int divisor(int a,int b)
{
int r;
while((r=a%b)!=0)
{
a=b;b=r;
}
return b;
}
int multiple(int a,int b)
{
int d;
d=divisor(a,b);
return a*b/d;
}
void main()
{
int a,b,c;
printf(“请输入两个整数a,b:\n”);
scanf(“%d%d”,&a&b);
c=multiple(a,b);
printf(“最小公倍数=%d\n”,c);
}
2.保存程序并编译,当窗口显示无错误时,选择执行程序
3.关闭程序工作区
实验结果:
实验分析:。