函数与编译预处理的实验操作
编译原理实验一_源程序的预处理及词法分析程序设计
实验一词法分析程序设计(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语言程序设计》实验四
电子科技大学计算机学院标准实验报告(实验)课程名称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个数后进行排序输出。
C++程序设计实践教程思考题答案
实验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++]='#';}。
L4_实验四_函数与预处理
在运行时,分别指定盘子数为3,5,7。并统计,在不同盘子数的情况下,移动盘子多少次。请试一下如果盘子数为16,在你所用的计算机上要运行多少时间。设想一下,如果盘子数为64,会出现什么情况。
4.课本P133,第14题。
5.课本P133,第16题。
通过这个简单的程序,初步掌握处理包含多文件的程序的方法。
三、实验结果
实验报告
实验名称函数与预处理
实验项目
专业班级姓名学号
指导教师成绩日期
一、实验目的
1.熟悉定义函数的方法、函数实参与形参的对应关系以及“值传递”的方式。
2.熟悉函数的嵌套调用和递归调用的方ห้องสมุดไป่ตู้。
3.熟悉全局变量、局部变量概念和使用方法。
4.熟悉编译预处理的应用。
5.掌握多文件的程序的编译和运行的方法。
二、实验内容和步骤
1.课本P132,第3题。
该程序应当准备以下测试数据:17,34,2,1,0。分别运行并检查结果是否正确。
2.写一个函数验证哥德巴赫猜想,一个不小于6的偶数可以表示为两个素数之和,如6=3+3,8=3+5,10=3+7……在主函数中输入一个不小于6的偶数n,然后调用函数gotbaha,在gotbaha函数中再调用prime函数,prime函数的作用是判别一个数是否为素数。在gotbaha函数中输入以下形式的结果:34=3+31。运行时,输入该偶数的值为6,12,20,458,分析运行结果。如果输入2,4,会出现什么情况?修改程序,使之能输出相应的信息。
实验7 预处理命令
详细操作步骤
(1).新建一个目录:mkdirlesson7
(2).切换目录到lesson7:cdlesson7
(3).分别编写五个程序文件
1)实现两个浮点数相加运算的程序文件
float add(float f1,float f2)
说明:在程序主函数使用宏时只能用两个实参,如SWAP(a,b),不能用三个参数。
#include<stdio.h>
#define SWAP(a,b) {t=a;a=b;b=t;}
intmain()
{
intm,n,t;
scanf("%d%d",&m,&n);
SWAP(m,n);
printf("two num swap is:%d,%d\n",m,n);
#define CHANGE 1
则输出密码。若
#define CHANGE 0
则不译成密码,按原码输出。
用条件编译方法来处理。
#include<stdio.h>
#define CHANGE 1
intmain()
{
charstr[20];
inti=0;
printf("input text:\n");
gets(str);
#define F2(f1,f2) PR(D2,f1,f2)
#define F3(f1,f2,f3) PR(D3,f1,f2,f3)
(2)建立源文件test8_2.c,编写如下程序
#include<stdio.h>
#include"format.h"
C语言程序设计教案 第九章 编译预处理
第九章编译预处理课题:第九章编译预处理教学目的: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)再与源程序合并说明:⑴宏名一般用大写表示,以便与变量名区分。
c语言实验报告
《高级语言程序设计》实验指导学院:信息科学与技术学院专业:信息管理与信息系统学期: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. 理解函数的概念和作用;2. 掌握函数的定义和调用方法;3. 掌握函数的参数传递和返回值的使用;4. 能够设计并实现简单的函数。
实验方法本次实验分为以下几个步骤:1. 了解函数的概念和作用;2. 学习函数的定义和调用方法;3. 理解函数的参数传递和返回值的概念;4. 设计并实现一个简单的函数;5. 运行并测试实现的函数。
实验过程1. 理解函数的概念和作用函数是一段封装了一系列指令的代码块,它可以被其他代码通过调用的方式来执行。
函数的作用主要有两个方面:- 提高代码的复用性:将一些常用的功能封装成函数,可以在多个地方进行调用,避免了重复编写相似的代码。
- 提高代码的可维护性:将复杂的逻辑拆分成多个函数,分工明确,易于理解和修改。
2. 学习函数的定义和调用方法函数的定义一般由以下几个部分组成:- 函数名:标识符,用于调用函数;- 参数列表:函数执行时需要接收的参数;- 返回值类型:函数执行完毕后返回的结果类型;- 函数体:包含了具体的代码实现。
函数的调用方法为直接使用函数名,后跟参数列表(如果有的话)。
3. 理解函数的参数传递和返回值的概念函数的参数传递可以通过值传递和引用传递两种方式进行。
值传递是指将参数的值复制一份传递给函数,而引用传递是指将参数的地址传递给函数。
函数可以通过返回值将计算结果返回给调用者。
返回值可以是单个值,也可以是一个列表或对象等复杂类型。
4. 设计并实现一个简单的函数我们将设计一个简单的函数,用于计算两个整数的和。
函数定义如下:pythondef add(a, b):return a + b5. 运行并测试实现的函数我们可以在程序中调用这个函数来计算两个整数的和。
C语言程序设计实验五:函数(5篇范例)
C语言程序设计实验五:函数(5篇范例)第一篇:C语言程序设计实验五:函数C语言程序设计实验五:函数1、定义函数返回两个数中较大的数,在主函数中通过调用该函数求三个数中较大的数并输出,编写主函数调用该函数。
说明:(1)请大家按学号来坐,便于考勤和管理。
(2)请珍惜宝贵的实验时间!不要做与实验无关的事情,比如聊QQ、上网或打游戏。
(3)直接把C语言代码粘贴到相应的实验题目下方,上交实验报告时只交word文档。
(4)文档名称:班级+学号后2位+姓名+实验编号,例如12通1班12张山实验五.doc。
第二篇:C语言程序设计实验七:函数、数组、指针C语言程序设计实验七:函数、数组、指针1、程序运行后,用户任意输入一个字符串,求出字符串长度,然后输出字符串内容及个数。
不能使用strlen函数。
求字符串长度函数的函数原型必须如下:int MyStrLenPt(char *str)若输入:nihao123!则输出:nihao123!:9 chars2、编写一个对一维数组进行排序的程序。
要求:写两个函数,一个主函数,一个sort函数。
在主函数中完成数组的输入和输出,通过调用sort函数对数组进行排序。
sort函数的原型为:voidsort(int*p, intn);说明:(1)请大家按学号来坐,便于考勤和管理。
(2)请珍惜宝贵的实验时间!不要做与实验无关的事情,比如聊QQ、上网或打游戏。
(3)直接把C语言代码粘贴到相应的实验题目下方,上交实验报告时只交word文档。
(4)文档名称:班级+学号后2位+姓名+实验编号,例如11电1班12张山实验七.doc。
第三篇:C语言程序设计—函数—实验报告实验报告专业软件工程班级X班学号_ XXXXXXXXXXX_姓名实验日期:201X年X月X日报告退发(订正、重做)课程C程序设计实验实验名称函数一、实验目的① 熟练掌握C程序中函数的定义;② 掌握函数的调用,函数参数的传递;③ 熟练掌握函数的嵌套调用和递归调用;二、实验环境(描述实验的软件、硬件环境)① 软件环境:windows xp/win7等操作系统,Microsoft Visual C++ 6.0编译器;② 硬件环境:PC机一台三、实验内容、步骤和结果分析题目一:编写一个用来判断质数(素数)的函数。
C语言程序的编译流程
C语言程序的编译流程C语言是一种高级程序设计语言,常用于开发各种应用程序和系统软件。
在将C语言程序转化为可执行的计算机程序之前,需要经过编译的流程。
本文将详细介绍C语言程序的编译流程,包括预处理、编译、汇编和链接等步骤。
1. 预处理(Preprocessing)在编译过程中的第一步是预处理。
预处理器会对源代码进行处理,去除注释、替换宏定义、展开头文件等。
预处理的输出是一个经过修改的源文件,通常以.i作为文件扩展名。
预处理器还可以通过条件编译来控制程序中特定代码块的编译。
这对于根据不同平台或配置条件选择不同代码实现非常有用。
2. 编译(Compiling)预处理之后,进入编译阶段。
编译器会将预处理生成的.i文件翻译成汇编语言。
汇编语言是一种简单的低级语言,使用助记符来表示计算机指令。
编译的输出通常以.s作为文件扩展名。
编译器会对源代码进行语法分析和语义分析,并将其转化为中间表示。
中间表示是一种介于源代码和汇编语言之间的抽象语言形式,使得优化和目标代码生成更容易。
3. 汇编(Assembling)在汇编阶段,汇编器将汇编语言翻译成机器语言。
机器语言是计算机可以直接执行的二进制指令。
汇编的输出通常以.obj或.o作为文件扩展名。
汇编器会将汇编代码转化为可重定位目标代码(relocatable object code)。
可重定位目标代码包含机器指令、符号表和重定位信息等。
4. 链接(Linking)最后一步是链接阶段。
链接器将一个或多个目标文件链接在一起,形成最终的可执行文件。
链接的输出可以是可执行文件、静态库或动态库。
链接器会解析目标代码中的符号引用,并将其与其他目标文件中的符号定义进行关联。
同时,链接器还会执行地址重定位,将目标文件中的相对地址转化为绝对地址,以便正确地执行程序。
链接可以分为静态链接和动态链接。
静态链接将编译后的目标代码和库代码合并在一起,生成独立的可执行文件。
动态链接则在程序运行时才将所需的库代码加载到内存中。
编译原理实验-词法分析器
编译原理实验-词法分析器⼀、实验⽬的设计、编制、调试⼀个词法分析程序,对单词进⾏识别和编码,加深对词法分析原理的理解。
⼆、实验内容1.选定语⾔,编辑任意的源程序保存在⽂件中;2.对⽂件中的代码预处理,删除制表符、回车符、换⾏符、注释、多余的空格并将预处理后的代码保存在⽂件中;3.扫描处理后的源程序,分离各个单词符号,显⽰分离的单词类型。
三、实验思路对于实验内容1,选择编写c语⾔的源程序存放在code.txt中,设计⼀个c语⾔的词法分析器,主要包含三部分,⼀部分是预处理函数,第⼆部分是扫描判断单词类型的函数,第三部分是主函数,调⽤其它函数;对于实验内容2,主要实现在预处理函数processor()中,使⽤⽂档操作函数打开源程序⽂件(code.txt),去除两种类型(“//”,“/*…*/”)的注释、多余的空格合并为⼀个、换⾏符、回车符等,然后将处理后的保存在另⼀个新的⽂件(afterdel.txt)中,最后关闭⽂档。
对于实验内容3,打开处理后的⽂件,然后调⽤扫描函数,从⽂件⾥读取⼀个单词调⽤判断单词类型的函数与之前建⽴的符号表进⾏对⽐判断,最后格式化输出。
四、编码设计代码参考了两篇博主的,做了部分改动,添加了预处理函数等1 #include<iostream>2 #include<fstream>3 #include<cstdio>4 #include<cstring>5 #include<string>6 #include<cstdlib>78using namespace std;910int aa;// fseek的时候⽤来接着的11string word="";12string reserved_word[20];//保留13char buffer;//每次读进来的⼀个字符14int num=0;//每个单词中当前字符的位置15int line=1; //⾏数16int row=1; //列数,就是每⾏的第⼏个17bool flag; //⽂件是否结束了18int flag2;//单词的类型192021//预处理函数22int processor(){//预处理函数23 FILE *p;24int falg = 0,len,i=0,j=0;25char str[1000],str1[1000],c;26if((p=fopen("code.txt","rt"))==NULL){27 printf("⽆法打开要编译的源程序");28return0;29 }30else{31//fgets(str,1000,p);32while((c=getc(p))!=EOF){33 str[i++] = c;34 }35 fclose(p);36 str[i] = '\0';37for(i=0;i<strlen(str);i++){38if(str[i]=='/'&&str[i+1]=='/'){39while(str[i++]!='\n'){}40 }//单⾏注释41else if(str[i]=='/'&&str[i+1]=='*'){42while(!(str[i]=='*'&&str[i+1]=='/')){i++;}43 i+=2;44 }//多⾏注释45else if(str[i]==''&&str[i+1]==''){46while(str[i]==''){i++;}47 i--;48if(str1[j-1]!='')49 str1[j++]='';50 }//多个空格,去除空格51else if(str[i]=='\n') {52if(str1[j-1]!='')53 str1[j++]='';54 }//换⾏处理,55else if(str[i]==9){56while(str[i]==9){57 i++;58 }59if(str1[j-1]!='')60 str1[j++]='';61 i--;62 }//tab键处理63else str1[j++] = str[i];//其他字符处理64 }65 str1[j] = '\0';66if((p = fopen("afterdel.txt","w"))==NULL){ 67 printf("can not find it!");68return0;69 }70else{71if(fputs(str1,p)!=0){72 printf("预处理失败!");73 }74else printf("预处理成功!");75 }76 fclose(p);77 }78return0;79 }8081//设置保留字82void set_reserve()83 {84 reserved_word[1]="return";85 reserved_word[2]="def";86 reserved_word[3]="if";87 reserved_word[4]="else";88 reserved_word[5]="while";89 reserved_word[6]="return";90 reserved_word[7]="char";91 reserved_word[8]="for";92 reserved_word[9]="and";93 reserved_word[10]="or";94 reserved_word[11]="int";95 reserved_word[12]="bool";96 }9798//看这个字是不是字母99bool judge_word(char x)100 {101if(x>='a' && x<='z' || x>='A' && x<='Z' ){ 102return true;103 }104else return false;105 }106107//看这个字是不是数字108bool judge_number(char x)109 {110if(x>='0' && x<='9'){111return true;112 }113else return false;114 }115116//看这个字符是不是界符117bool judge_jiefu(char x)118 {119if(x=='('||x==')'||x==','||x==';'||x=='{'||x=='}'){ 120return true;121 }122else return false;123 }124125126//加减乘127bool judge_yunsuanfu1(char x)128 {129if(x=='+'||x=='-'||x=='*')130 {131return true;132 }133else return false;134 }135136//等于赋值,⼤于⼩于⼤于等于,⼩于等于,⼤于⼩于137bool judge_yunsuannfu2(char x)138 {139if(x=='='|| x=='>'||x=='<'||x=='&'||x=='||'){140return true;141 }142else return false;143 }144145146//这个最⼤的函数的总体作⽤是从⽂件⾥读⼀个单词147int scan(FILE *fp)148 {149 buffer=fgetc(fp);//读取⼀个字符150if(feof(fp)){//检测结束符151 flag=0;return0;152 }153else if(buffer=='')154 {155 row++;156return0;157 }158else if(buffer=='\n')159 {160 row=1;161return0;162 }163//如果是字母开头或'_' 看关键字还是普通单词164else if(judge_word(buffer) || buffer=='_')165 {166 word+=buffer;167 row++;168while((buffer=fgetc(fp)) && (judge_word(buffer) || judge_number(buffer) || buffer=='_'))169 {170 word+=buffer;171 row++;172 }173if(feof(fp)){174 flag=0;175return1;176 }177for(int i=1;i<=12;i++){178if(word==reserved_word[i]){179 aa=fseek(fp,-1,SEEK_CUR);//如果执⾏成功,stream将指向以fromwhere为基准,偏移offset(指针偏移量)个字节的位置,函数返回0。
编译原理实验1预处理
一、实验目的与任务编制一个源程序的输入过程,从键盘、文件或文本框输入若干行语句,依次存入输入缓冲区(字符型数据);并编制一个扫描子程序,该子程序中每次调用能依次从存放源程序的输入缓冲区中读出一个有效字符。
二、实验涉及的相关知识点1、VC++中微软基础类库MFC的使用,包括控件、菜单的使用以及消息映射。
2、原程序的扫描,分析及处理。
三、实验内容与过程1、创建一个单文档应用程序,添加控件,关联变量,结果如下:2、为控件添加消息映射,代码如下:void CMainFrame::OnBYYuChuLi(){// TODO: Add your command handler code herechar strWrite[1024];char strTmp[32];int i;if (!bFileOk){MessageBox("请先打开一个源程序文件!","预处理",MB_OK|MB_ICONINFORMATION);return;}GetAppPath();strcpy(strWrite,strAppPath);strcat(strWrite,"yuchuli.txt");//定义输入文件及输出文件/*///////////////////////////////方法(1)CFile//缺点:文件结束的判断CFile fpIn,fpOut;char ch;UINT nfLen;if (!fpIn.Open(strFile,CFile::modeRead,NULL))MessageBox("Open Error!");if(!fpOut.Open(strWrite,CFile::modeWrite|CFile::modeCreate,NULL)) MessageBox("Write Error!");fpIn.Read(&ch,1);//读一个字节nfLen=fpIn.GetLength();//取得文件长度fpOut.Write(&ch,1); //写一个字节/////////////////*//*///////////////////////////////方法(2)fstreamchar ch;fstream fpIn(strFile,ios::in);//定义文件用于输入fstream fpOut(strWrite,ios::out);//定义文件用于输出fpIn>>ch;//读入一个字节或使用fpIn.read();fpout<<ch;///写一个字节到文件或使用fpOut.write();fpIn.close();//关闭文件fpOut.close();/////////////////////////////*////////////////////////////////方法(3)FILEchar ch=' ',ch1;FILE *fpIn,*fpOut;//打开文件用于读入数据if ((fpIn=fopen(strFile,"rt"))==NULL){MessageBox("无法读入文件数据!","预处理",MB_OK|MB_ICONEXCLAMATION);return;}//打开文件用于写入数据if ((fpOut=fopen(strWrite,"wt"))==NULL){MessageBox("无法写数据到文件!","预处理",MB_OK|MB_ICONEXCLAMATION);return;}//去掉程序最前面的空格while (ch==' ')ch=fgetc(fpIn);//开始对程序进行扫描i=0;while(!feof(fpIn)){if (islower(ch) || ch=='#'){strTmp[i++]=ch;fprintf(fpOut,"%c",ch);ch=fgetc(fpIn);}else{if (!(isalpha(ch) || isdigit(ch))){//不是字母和数字strTmp[i]='\0';if (i!=0)if (isKeyWord(strTmp))fprintf(fpOut,"%c",' ');i=0;switch(ch){case ' ':while (ch==' ' &&!feof(fpIn))ch=fgetc(fpIn);break;case '/':ch1='/';ch=fgetc(fpIn);if ( ch=='*'){while ((ch1!='*' || ch!='/')&&!feof(fpIn)){ch1=ch;ch=fgetc(fpIn);}if (!feof(fpIn)){ch=fgetc(fpIn);while (ch=='\n' &&!feof(fpIn))ch=fgetc(fpIn);}}elsefprintf(fpOut,"%c",'/');break;default:fprintf(fpOut,"%c",ch);ch=fgetc(fpIn);if (ch=='\n'){fprintf(fpOut,"%c",'\n');ch=fgetc(fpIn);}while (ch=='\n' && !feof(fpIn))ch=fgetc(fpIn);}}else{fprintf(fpOut,"%c",ch);ch=fgetc(fpIn);}}}fclose(fpIn);fclose(fpOut);//打开处理的结果CByylApp *pApp=(CByylApp *)AfxGetApp();POSITION curTemplatePos=pApp->GetFirstDocTemplatePosition();CDocTemplate*curTemplate=pApp->GetNextDocTemplate(curTemplatePos);curTemplate->OpenDocumentFile(strWrite);}void CMainFrame::OnByOpen(){// TODO: Add your command handler code herestatic TCHAR szFilter[]=_T("C Source Files(*.c)|*.c|Text Files(*.txt)|*.txt|C++ Source Files(*.cpp)|*.cpp|");CString strOpen;CByylApp *pApp=(CByylApp *)AfxGetApp();CFileDialogdlg(TRUE,"",NULL,OFN_HIDEREADONLY|OFN_PATHMUSTEXIST,szFilter,NULL);dlg.m_ofn.lpstrTitle="打开文件";if (dlg.DoModal()==IDOK){POSITION curTemplatePos=pApp->GetFirstDocTemplatePosition();CDocTemplate*curTemplate=pApp->GetNextDocTemplate(curTemplatePos);curTemplate->OpenDocumentFile(dlg.GetPathName());strOpen=dlg.GetPathName();strcpy(strFile,LPCTSTR(strOpen));bFileOk=TRUE;}}void CMainFrame::GetAppPath(){CString strName;GetModuleFileName(NULL,strAppPath,1024);strName=strAppPath;int x=strName.ReverseFind('\\');strAppPath[x+1]='\0';return;}BOOL CMainFrame::isKeyWord(char* word){char*keyWords[]={"#include","#define","int","char","short","long", "unsigned","signed","float","double","FILE","struct","enum","static","return"};int i,n=15;for(i=0;i<n;i++)if (strcmp(word,keyWords[i])==0)return TRUE;return FALSE;}四、实验结果及分析1、打开一个CPP文件:处理前:处理后:五、实验相关说明文中利用了单文档应用程序的菜单和工具栏进行数据的处理。
HUST函数与程序结构_编译预处理实验
函数与程序结构,编译预处理2.4 函数与程序结构实验(一) 实验目的(1)熟悉和掌握函数的定义、声明;函数调用与参数传递方法;以及函数返回值类型的定义和返回值使用。
(2)熟悉和掌握不同存储类型变量的使用。
(3)熟悉多文件编译技术。
(二) 实验内容及要求1.源程序改错下面是计算s=1!+2!+3!+…+n!的源程序,在这个源程序中存在若干语法和逻辑错误。
要求在计算机上对这个例子程序进行调试修改,使之能够正确完成指定任务。
改正后代码如下(1)#include<stdio.h>long sum_fac(int n){static long f=1,s=0;f*=n;s+=f;return s;}void main(void){int k,n;printf("please input n:\n");scanf("%d",&n);for(k=1;k<=n;k++)printf("k=%d\tthe sum is %ld\n",k,sum_fac(k));}代码运行结果:(2)#include<stdio.h>long double sum_fac(int n){long double s=0;int i;long double fac=1;for(i=1;i<=n;i++)fac*=i,s+=(1.0/fac);return s;}void main(void){int k,n;printf("please input n:\n");scanf("%d",&n);for(k=1;k<=n;k++)printf("k=%d\tthe sum is %lf\n",k,sum_fac(k));}运行结果如下:3.跟踪调试下面是计算fabonacci数列前n项和的源程序,现要求单步执行该程序,并观察p,i,sum,n值,即:(1)刚执行完scanf("%d",&k);语句时,p,i值是多少?(2)从fabonacci函数返回后,光条停留在哪个语句上?(3)进入fabonacci函数时,watch窗口显示的是什么?(4)当i=3时,从调用fabonacci函数到返回,n值如何变化?源程序:void main(void){int i,k;long sum=0,*p=∑scanf("%d",&k);for(i=1;i<=k;i++){sum+=fabonacci(i);printf("i=%d\tthe sum is %ld\n",i,*p);}}long fabonacci(int n){if(n==1 || n==2)return 1;elsereturn fabonacci(n-1)+fabonacci(n-2);}(1)(2)4.程序设计编写并上机调试运行能实现以下功能的程序。
c语言程序编译的流程
c语言程序编译的流程C语言是一种高级编程语言,它是一种通用的编程语言,可以用于开发各种类型的应用程序。
C语言程序编译的流程是指将C语言源代码转换为可执行文件的过程。
本文将详细介绍C语言程序编译的流程。
C语言程序编译的流程可以分为以下几个步骤:1. 预处理预处理是C语言程序编译的第一步。
在这个步骤中,编译器会对源代码进行一些预处理操作,例如宏替换、头文件包含等。
预处理器会将源代码中的宏定义替换为宏定义中的内容,并将头文件中的内容插入到源代码中。
预处理后的代码称为预处理文件。
2. 编译编译是C语言程序编译的第二步。
在这个步骤中,编译器会将预处理文件转换为汇编代码。
汇编代码是一种低级语言,它是机器语言的一种表现形式。
编译器会将C语言代码转换为汇编代码,这个过程称为编译。
3. 汇编汇编是C语言程序编译的第三步。
在这个步骤中,汇编器会将汇编代码转换为机器语言代码。
机器语言是计算机可以直接执行的语言,它是由0和1组成的二进制代码。
汇编器会将汇编代码转换为机器语言代码,这个过程称为汇编。
4. 链接链接是C语言程序编译的最后一步。
在这个步骤中,链接器会将机器语言代码和库文件链接在一起,生成可执行文件。
库文件是一些预编译的代码,它们可以被多个程序共享。
链接器会将程序中使用到的库文件链接到程序中,生成可执行文件。
以上就是C语言程序编译的流程。
下面我们将详细介绍每个步骤的具体内容。
1. 预处理预处理是C语言程序编译的第一步。
在这个步骤中,编译器会对源代码进行一些预处理操作,例如宏替换、头文件包含等。
预处理器会将源代码中的宏定义替换为宏定义中的内容,并将头文件中的内容插入到源代码中。
预处理后的代码称为预处理文件。
预处理器的工作原理是将源代码中的宏定义和头文件包含替换为实际的代码。
例如,下面是一个简单的宏定义:#define PI 3.1415926在预处理阶段,预处理器会将源代码中的所有PI替换为3.1415926。
这样,程序中所有使用到PI的地方都会被替换为3.1415926。
《C语言程序设计》实践教案
《C语言程序设计》实践教案第一章:C语言概述1.1 教学目标了解C语言的历史和发展掌握C语言的特点和优势理解C语言在计算机领域中的应用1.2 教学内容C语言的历史和发展C语言的特点和优势C语言的应用领域1.3 实践任务编写一个简单的C语言程序分析C语言程序的基本结构1.4 教学方法讲授和演示相结合学生动手实践1.5 教学评价学生参与度学生对C语言的基本理解第二章:C语言基础语法2.1 教学目标掌握C语言的数据类型理解变量和常量的概念熟悉运算符和表达式的使用2.2 教学内容C语言的数据类型变量和常量的声明和使用运算符和表达式的规则2.3 实践任务编写C语言程序实现基本的数学运算理解变量和常量的作用域2.4 教学方法实例讲解和演示学生动手实践和调试2.5 教学评价学生对数据类型的理解学生对变量和常量的掌握程度第三章:控制语句3.1 教学目标掌握C语言的条件语句和循环语句理解控制语句的作用和用法能够运用控制语句编写复杂的程序3.2 教学内容if条件语句switch多分支语句while循环语句do-while循环语句for循环语句3.3 实践任务编写C语言程序实现猜数字游戏运用不同的控制语句解决问题3.4 教学方法通过实例讲解和演示学生动手实践和调试3.5 教学评价学生对条件语句和循环语句的理解学生运用控制语句解决问题的能力第四章:函数与编译预处理4.1 教学目标掌握C语言的函数定义和调用理解局部变量和全局变量的概念熟悉编译预处理指令的使用4.2 教学内容函数的定义和声明局部变量和全局变量的使用函数的参数传递和返回值编译预处理指令4.3 实践任务编写C语言程序实现函数的调用和参数传递理解局部变量和全局变量的作用域使用编译预处理指令4.4 教学方法通过实例讲解和演示学生动手实践和调试4.5 教学评价学生对函数的理解和应用能力学生对局部变量和全局变量的掌握程度第五章:数组和字符串5.1 教学目标掌握C语言的数组和字符串操作理解一维和多维数组的使用熟悉字符串的存储和操作方法5.2 教学内容一维数组的声明和使用多维数组的声明和使用字符串的声明和操作函数5.3 实践任务编写C语言程序实现数组的排序和查找理解数组和字符串的内存分配5.4 教学方法通过实例讲解和演示学生动手实践和调试5.5 教学评价学生对数组和字符串的理解和应用能力学生对内存分配的理解程度第六章:指针6.1 教学目标理解指针的概念和作用掌握指针的声明和使用了解指针与数组、函数的关系6.2 教学内容指针的声明和赋值指针与变量的关系指针数组和多维数组指针作为函数参数指针与字符串6.3 实践任务编写C语言程序实现指针的基本操作利用指针处理数组和字符串6.4 教学方法通过实例讲解和演示学生动手实践和调试6.5 教学评价学生对指针概念的理解学生运用指针解决问题的能力第七章:结构体和联合体7.1 教学目标掌握结构体和联合体的定义和使用理解结构体和联合体的内存分配熟悉结构体和联合体的成员访问7.2 教学内容结构体的声明和使用联合体的声明和使用结构体数组和联合体数组结构体和联合体作为函数参数7.3 实践任务编写C语言程序实现结构体和联合体的应用利用结构体和联合体存储和组织数据7.4 教学方法通过实例讲解和演示学生动手实践和调试7.5 教学评价学生对结构体和联合体的理解学生运用结构体和联合体解决问题的能力第八章:文件操作8.1 教学目标掌握文件的概念和文件操作函数理解文件读写和文件指针的关系熟悉文件权限和文件夹操作8.2 教学内容文件的概念和文件操作函数文件的打开、读写、关闭文件的定位和文件指针文件权限和文件夹操作8.3 实践任务编写C语言程序实现文件的读写操作理解文件指针在文件操作中的作用8.4 教学方法通过实例讲解和演示学生动手实践和调试8.5 教学评价学生对文件操作的理解学生运用文件操作解决问题的能力第九章:标准库函数9.1 教学目标熟悉C语言标准库函数的作用和用法掌握常用标准库函数的应用了解标准库函数的分类和调用方式9.2 教学内容数学函数字符串函数输入输出函数日期和时间函数随机数函数9.3 实践任务编写C语言程序实现标准库函数的应用利用标准库函数解决实际问题9.4 教学方法通过实例讲解和演示学生动手实践和调试9.5 教学评价学生对标准库函数的理解学生运用标准库函数解决问题的能力第十章:编程规范与代码优化10.1 教学目标理解编程规范的重要性掌握C语言编程规范和最佳实践学习代码优化的方法和技巧10.2 教学内容C语言编程规范命名conventions代码组织和结构代码优化方法和技巧10.3 实践任务分析并优化现有C语言程序遵循编程规范编写C语言程序10.4 教学方法讲解和分析实例学生动手实践和调试10.5 教学评价学生对编程规范的理解学生代码的质量和优化程度第十一章:数据结构基础11.1 教学目标理解数据结构的概念和重要性掌握基本数据结构如栈、队列、链表、树和图的原理和实现能够运用数据结构解决实际问题11.2 教学内容数据结构的基本概念栈的实现和应用队列的实现和应用链表的实现和应用树的基本概念和遍历图的基本概念和遍历11.3 实践任务编写C语言程序实现栈和队列的基本操作实现链表并进行应用创建简单的树结构并进行操作实现图的数据结构并进行应用11.4 教学方法通过实例讲解和演示学生动手实践和调试11.5 教学评价学生对数据结构概念的理解学生运用数据结构解决问题的能力第十二章:算法设计与分析12.1 教学目标理解算法设计的重要性掌握常见的算法设计方法和技巧分析算法的时间和空间复杂度12.2 教学内容算法设计的基本方法:递归、分治、贪心、动态规划等算法的分析:时间复杂度、空间复杂度排序和搜索算法:冒泡排序、选择排序、插入排序、快速排序、二分搜索等12.3 实践任务实现常见的排序和搜索算法分析算法的时间和空间复杂度设计并实现特定的算法解决问题12.4 教学方法通过实例讲解和演示学生动手实践和调试12.5 教学评价学生对算法设计方法的理解学生分析算法性能的能力第十三章:数据库基础13.1 教学目标理解数据库的概念和作用掌握SQL语言的基本操作了解C语言与数据库的交互方式13.2 教学内容数据库的基本概念:数据库、表、记录等SQL语言:创建表、插入数据、查询数据、更新数据、删除数据等C语言与数据库的交互:使用数据库驱动程序进行连接和操作13.3 实践任务使用C语言和SQL语句进行数据库操作实现简单的数据库应用13.4 教学方法通过实例讲解和演示学生动手实践和调试13.5 教学评价学生对数据库概念的理解学生使用SQL语言和C语言进行数据库操作的能力第十四章:软件工程与项目管理14.1 教学目标理解软件工程的基本原则和方法掌握项目管理的流程和技巧能够运用软件工程和项目管理解决实际问题14.2 教学内容软件工程的基本原则:需求分析、设计、实现、测试等项目管理的基本流程:项目计划、执行、监控、收尾等项目工具和技能:Git、Gantt图、需求文档等14.3 实践任务完成一个小型项目的需求分析和设计使用项目管理工具进行项目计划的制定和执行14.4 教学方法通过实例讲解和演示学生动手实践和调试14.5 教学评价学生对软件工程和项目管理的理解学生运用软件工程和项目管理解决问题的能力第十五章:职业素养与编程面试15.1 教学目标理解职业素养的重要性掌握求职技巧和编程面试的应对策略提升学生的职业发展和就业竞争力15.2 教学内容职业素养的基本要素:沟通能力、团队合作、时间管理等求职技巧:简历制作、面试准备、自我介绍等编程面试的应对策略:算法题、编程题、系统设计题等15.3 实践任务制作个人简历并进行模拟面试准备编程面试题并进行模拟面试15.4 教学方法通过实例讲解和演示学生动手实践和调试15.5 教学评价学生对职业素养的理解学生应对求职和编程面试的能力重点和难点解析本文主要介绍了《C语言程序设计》实践教案的十五个章节,涵盖了C语言的基本概念、语法、控制语句、函数、数组和字符串、指针、结构体和联合体、文件操作、标准库函数、编程规范与代码优化、数据结构基础、算法设计与分析、数据库基础、软件工程与项目管理以及职业素养与编程面试等方面的内容。
编译原理第四版附录c编译程序实验
编译原理第四版附录c编译程序实验
编译原理第四版附录C编译程序实验指的是一项编译器开发实验,旨在让学生通过实践掌握编译器的设计和实现原理。
该实验一般分为以下几个步骤:
1. 了解编译器的基本原理和流程:这包括词法分析、语法分析、语义分析、代码生成等基本步骤,以及编译器的组成结构、工作流程等概念。
2. 设计编译器的语法和语义规则:在了解编译器的基本原理之后,需要根据具体的编译语言和需求设计语法和语义规则,通常采用自顶向下或自底向上的语法分析方法。
3. 实现编译器的核心算法和数据结构:编译器的核心算法包括词法分析器、语法分析器、语义分析器和代码生成器等,需要实现相应的数据结构和算法。
4. 测试和调试编译器:在完成编译器的实现之后,需要进行测试和调试,包括对编译器的正确性、效率和容错性进行测试和评估,以及对编译器的性能进行优化。
5. 扩展编译器的功能:在完成基本的编译器实现之后,可以考虑对编译器进行功能扩展,例如支持更丰富的语言特性、优化代码生成等。
总的来说,编译原理第四版附录C编译程序实验是一项非常有挑战性和实用性的实验,旨在让学生深入了解编译器的设计和实现原理,提高编程能力和实践经验。
编译原理实验步骤
实验步骤
在实验过程中,针对每一个需要解决的问题,应当按下列步骤去做:
1. 模块设计
将程序分成合理的多个模块(函数),每个模块做具体的同一事情。
2.设计方案描述
模块关系简图、流程图、全局变量、函数接口等。
(1) 函数设计
系统中每个函数的设计,包括调用方式和数据传递方式设计、实现功能逻辑设计和出错处理设计,给出输入、输出、处理流程。
如果是编译器已经提供的函数,可以只做调用方式和数据传递方式设计。
(2) 测试用例设计
设计测试用例,测试用例中包括测试数据、操作方法、预期结果。
为了检查函数是否能抗拒意外,测试用例应包括合理的输入和不合理的输入。
3. 上机调试
对程序进行编译,纠正可能出现的语法错误,进行初步调试,能够正确运行后用测试用例对系统进行全面的测试,直至能够得出完全满意的结果。
4. 编程时注意编程风格
空行的使用、注释的使用、缩进的使用等。
5. 整理实验报告
实验报告格式:
1. 姓名班级学号
2. 实验报告人报告时间
3. 实验名称
4. 实验目的
5. 实验要求
6. 实验内容 (实验报告的主要部分 )
(1)功能描述:该程序具有什么功能?
(2)写出试验方案
(3)程序结构描述:函数调用格式、参数含义、返回值描述、函数功能;函数之间的调用关系图。
(4)程序总体执行流程图
7. 实验过程记录:
出错次数、出错严重程度、解决办法摘要。
8. 实验总结 ( 实验心得 )
实验过程中遇到了问题、如何克服的、收获有哪些?。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
函数与编译预处理的实验操作
实验目的:了解函数的定义,掌握函数的调用和参数的传递及预编译命令实验要求:熟练掌握函数的调用及参数的传递
实验内容: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.关闭程序工作区
实验结果:
实验分析:。