实验三 语法分析的C语言实现

实验三 语法分析的C语言实现
实验三 语法分析的C语言实现

实验三语法分析的C语言实现

一、实验目的

加深对语法分析器工作过程的理解;能够采用一种编程语言实现简单的语法分析程序;能够使用自己编写的分析程序对简单的程序段进行语法分析。

二、实验要求

1、在实验一(用C语言实现词法分析的程序)的基础上,实现编写语法分析程序,语法

分析程序的实现可以采用任何一种编程工具。

2、对语法规则有明确的定义;

3、编写的分析程序能够对实验一的结果进行正确的语法分析;

4、对于遇到的语法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利

完成语法分析过程;

三、实验分工

个人完成

四、程序说明

有文法G[E]:E->TG

T->FS

G->+TG|ε

S->*FS|=E|ε

F->(E)|i

1.1 判断LL(1)文法

当我们需选用自顶向下分析技术时,首先必须判别所给文法是否是LL(1)文法,分析所给文法可知文法中不含左公因子,也不存在左递归,因而再对给定文法计算First集、Follow集以及Select集,对于求出的每个产生式的Select 集,看对于同一个左部非终结符是否存在交集,如果它们的交为空则表示所给文法是LL(1)文法,否则不是L(1)文法。若所给文法是LL(1)文法,再根据求得的Select集合构造预测分析表,对于一个输入串,根据已知的预测分析表分析它是否是文法的句子。各非终结符的First集以及Follow集如下表所示:

表1-1

Select(E->TG)={(,i}

Select(T->FS)={(,i}

Select(G->+TG)={+} Select(G->ε)={#,)}

Select(S->*FS)={*} Select(S->ε)={+,#,)} Select(S->=E)={=} Select(F->(E))={(} Select(F->i)={i}

由各产生式的Select集可以看出,每个非终结符的Select集交集为空,则可以确定该文法是LL(1)文法。

1.2 构造预测分析表

主要函数介绍:

1、void print();输出分析栈

2、void print1();输出剩余串

3、int main();程序主函数,在其中调用自定义函数,完成文法产生式的赋值,预测分析表的构建,以及对输入串的分析等主要功能。

程序主要代码:

1、初始化程序即分析栈、剩余串、非终结符与终结符的初始化

char A[20];/*分析栈*/

char B[20];/*剩余串*/

char v1[20]={'i','+','*','(',')','#',';','='};/*终结符 */ char v2[20]={'E','G','T','S','F'};/*非终结符 */

int j=0,b=0,top=0,l;/*L为输入串长度 */

2、结构体的定义及结构体变量定义

typedef struct type/*产生式类型定义 */

{

char origin;/*大写字符 */

char array[5];/*产生式右边字符 */

int length;/*字符个数 */

}type;

type c,e,t,g,g1,s,s1,f,f1,s2;/*结构体变量 */

type C[10][10];/*预测分析表 */

3、输出分析栈函数定义

void print()

{

int a;

for(a=0;a<=top+1;a++)

printf("%c",A[a]);

printf("\t\t");

}

4、输出剩余串函数定义

void print1()

{

int j;

for(j=0;j

printf(" ");

for(j=b;j<=l;j++)

printf("%c",B[j]);

printf("\t\t\t");

}

5、在main函数中定义结构体,把文法产生式赋值给结构体

/*把文法产生式赋值结构体*/

e.origin='E';

strcpy(e.array,"TG");

e.length=2;

t.origin='T';

strcpy(t.array,"FS");

t.length=2;

g.origin='G';

strcpy(g.array,"+TG");

g.length=3;

g1.origin='G';

g1.array[0]='^';

g1.length=1;

s.origin='S';

strcpy(s.array,"*FS");

s.length=3;

s1.origin='S';

s1.array[0]='^';

s1.length=1;

f.origin='F';

strcpy(f.array,"(E)");

f.length=3;

f1.origin='F';

f1.array[0]='i';

f1.length=1;

s2.origin='S';

strcpy(s2.array,"=E");

s2.length=2;

6、预测分析表的初始化及构造

for(m=0;m<=7;m++)/*初始化分析表*/

for(n=0;n<=7;n++)

C[m][n].origin='N';/*全部赋为空*/

/*填充分析表*/

C[0][0]=e;C[0][3]=e;

C[1][1]=g;C[1][4]=g1;C[1][5]=C[1][7]=g1;

C[2][0]=t;C[2][3]=t;

C[3][1]=s1;C[3][2]=s;C[3][4]=C[3][5]=s1;C[3][7]=s2;

C[4][0]=f1;C[4][3]=f;

7、读入分析串,对输入串进行分析,判断输入串是否符合文法的定义,是否有非法字符,是否在分析过程中出现错误信息,是否被接受为文法的句子

do

{

x=A[top--];/*x为当前栈顶字符*/

printf("%d",k++);

printf("\t\t");

for(j=0;j<=7;j++)/*判断是否为终结符*/

if(x==v1[j])

{

flag=1;

break;

}

if(flag==1)/*如果是终结符*/

{

if(x=='#')

{

finish=1;/*结束标记*/

printf("accept!\n");/*接受 */

getchar();

getchar();

exit(1);

}

if(x==ch)

{

print();

print1();

printf("%c匹配\n",ch);

ch=B[++b];/*下一个输入字符*/

flag=0;/*恢复标记*/

}/*if*/

else/*出错处理*/

{

print();

print1();

printf("%c出错\n",ch);/*输出出错终结符*/ exit(1);

}/*else*/

}/*if*/

else/*非终结符处理*/

{

for(j=0;j<=7;j++)

if(x==v2[j])

{

m=j;/*行号*/

break;

}

for(j=0;j<=7;j++)

if(ch==v1[j])

{

n=j;/*列号*/

break;

}

cha=C[m][n];

if(cha.origin!='N')/*判断是否为空*/

{

print();

print1();

printf("%c->",cha.origin);/*输出产生式*/

for(j=0;j

printf("%c",cha.array[j]);

printf("\n");

for(j=(cha.length-1);j>=0;j--)/*产生式逆序入栈*/

A[++top]=cha.array[j];

if(A[top]=='^')/*为空则不进栈*/

top--;

}/*if*/

else/*出错处理*/

{

print();

print1();

printf("%c出错\n",x);/*输出出错非终结符*/

exit(1);

}

}

}while(finish==0);

}

编程中遇到的问题:

栈的判断出错,无法对应和自行从终结符中提取

预测分析表出错,定义后无法识别

可改进的地方:

1、由于一个人实验,工作量实在太大,实力不足,总有很多问题卡住,于是根据书本先行使用书本文法进行编辑,先行使用i替换所有的字母数字

2、由于时间关系,没法对i进行改动区分开所有的字母数字,仍旧使用i进行操作判断

3、由于没对i进行编辑改动,导致了while以及if语句未能插入代码中,只能识别出赋值语句

4、做这份代码是太多太多的辛酸,认识到了实力不足时团队的重要性,还望老师谅解

五、截图

六、

#include #include #include #include #include using namespace std; char A[20];/*分析栈*/ char B[20];/*剩余串*/

char v1[20]={'i','+','*','(',')','#',';','='};/*终结符 */ char v2[20]={'E','G','T','S','F'};/*非终结符 */

int j=0,b=0,top=0,l;/*L为输入串长度*/ typedef struct type/*产生式类型定义*/ {

char origin;/*大写字符*/

char array[5];/*产生式右边字符*/

int length;/*字符个数*/

}type;

type c,e,t,g,g1,s,s1,f,f1,s2;/*结构体变量*/ type C[10][10];/*预测分析表*/

void print()/*输出分析栈*/

{

int a;/*指针*/

for(a=0;a<=top+1;a++)

printf("%c",A[a]);

printf("\t\t");

}

void print1()/*输出剩余串*/

{

int j;

for(j=0;j

printf(" ");

for(j=b;j<=l;j++)

printf("%c",B[j]);

printf("\t\t\t");

}

int main()

{

int m,n,k=0,flag=0,finish=0;

char ch,x;

type cha;/*用来接受C[m][n]*/

/*把文法产生式赋值结构体*/

e.origin='E';

strcpy(e.array,"TG");

e.length=2;

t.origin='T';

strcpy(t.array,"FS");

t.length=2;

g.origin='G';

strcpy(g.array,"+TG");

g.length=3;

g1.origin='G';

g1.array[0]='^';

g1.length=1;

s.origin='S';

strcpy(s.array,"*FS");

s.length=3;

s1.origin='S';

s1.array[0]='^';

s1.length=1;

f.origin='F';

strcpy(f.array,"(E)");

f.length=3;

f1.origin='F';

f1.array[0]='i';

f1.length=1;

s2.origin='S';

strcpy(s2.array,"=E");

s2.length=2;

for(m=0;m<=7;m++)/*初始化分析表*/

for(n=0;n<=7;n++)

C[m][n].origin='N';/*全部赋为空*/

/*填充分析表*/

C[0][0]=e;C[0][3]=e;

C[1][1]=g;C[1][4]=g1;C[1][5]=C[1][7]=g1;

C[2][0]=t;C[2][3]=t;

C[3][1]=s1;C[3][2]=s;C[3][4]=C[3][5]=s1;C[3][7]=s2;

C[4][0]=f1;C[4][3]=f;

printf("提示:本程序只能对由'i','+','*','(',')'构成的以'#'结束的字符串进行分析,\n"); printf("请输入要分析的字符串:");

FILE * fpin;

char in_fn[30]; //存放地址

for(;;)

{

cin>>in_fn;

if((fpin=fopen(in_fn,"r"))!=NULL) //判断文件是否存在

break;

else

cout<<"文件路径错误!";

}

do/*读入分析串*/

{

ch=fgetc(fpin);

if ((ch!='i') &&(ch!='+')

&&(ch!='*')&&(ch!='(')&&(ch!=')')&&(ch!='#')&&(ch!='=')&&(ch!=';'))

{

printf("输入串中有非法字符\n");

exit(1);

}

B[j]=ch;

j++;

}while(ch!='#');

l=j;/*分析串长度*/

ch=B[0];/*当前分析字符*/

A[top]='#'; A[++top]='E';/*'#','E'进栈*/

printf("步骤\t\t分析栈\t\t剩余字符\t\t产生式或匹配\n"); do

{

x=A[top--];/*x为当前栈顶字符*/

printf("%d",k++);

printf("\t\t");

for(j=0;j<=7;j++)/*判断是否为终结符*/

if(x==v1[j])

{

flag=1;

break;

}

if(flag==1)/*如果是终结符*/

{

if(x=='#')

{

finish=1;/*结束标记*/

printf("accept!\n");/*接受*/

getchar();

getchar();

exit(1);

}

if(x==ch)

{

print();

print1();

printf("%c匹配\n",ch);

ch=B[++b];/*下一个输入字符*/

flag=0;/*恢复标记*/

}/*if*/

else/*出错处理*/

{

print();

print1();

printf("%c出错\n",ch);/*输出出错终结符*/

exit(1);

}/*else*/

}/*if*/

else/*非终结符处理*/

{

for(j=0;j<=7;j++)

if(x==v2[j])

{

m=j;/*行号*/

break;

}

for(j=0;j<=7;j++)

if(ch==v1[j])

{

n=j;/*列号*/

break;

}

cha=C[m][n];

if(cha.origin!='N')/*判断是否为空*/

{

print();

print1();

printf("%c->",cha.origin);/*输出产生式*/

for(j=0;j

printf("%c",cha.array[j]);

printf("\n");

for(j=(cha.length-1);j>=0;j--)/*产生式逆序入栈*/ A[++top]=cha.array[j];

if(A[top]=='^')/*为空则不进栈*/

top--;

}/*if*/

else/*出错处理*/

{

print();

print1();

printf("%c出错\n",x);/*输出出错非终结符*/

exit(1);

}

}

}while(finish==0);

}

七、测试语句

I=(i+i)*i#

四、实验报告

1. 实验目的

2. 实验分工

3. 程序说明:实现的文法说明、主要函数介绍

4. 其他说明:包括可选功能的实现介绍、编程中遇到的主要问题、可改进的地方

5. 运行结果截图显示

6. 源程序:要求有一定的注释

c语言实验报告 ()

丽水学院计算机实验报告

丽水学院计算机实验报告 一、实验目的 1.熟悉Visual C++和C-Free等集成环境,掌握运行一个C程序的基本步骤,包括编辑、编译、连接和运行。 2.掌握算术表达式和赋值表达式的使用。 3.掌握基本输入、输出函数的使用。 4.能够编程实现简单的数据处理。 二、实验环境 硬件:Pentium以上的计算机。 软件:Windows XP操作系统、Visual C++和C-Free等集成环境。 三、实验内容和结果 1.编程题1 在屏幕上显示一个短句“What is a computer?” 思考: (1)如何在屏幕上显示你自己的学号,姓名和班级? (2)如何在屏幕上显示数字、英文字母和汉字等信息?例如:“你在机房吗?” 编程题1源程序: #include<> void main() { printf("What is a computer?\n");

} 程序运行结果: What is a computer? 思考题(1): #include<> void main() { printf(",小王,班级\n"); } 思考题(2): #include<> void main() { printf("英文字母abcdefgABCDEFG\n"); printf("汉字:哇哈哈啊哈和\n"); } 2.编程题2 在屏幕上显示下列图形。 * * * * * * * * * *

思考:如何在屏幕上显示下列图形? A A A A 编程题2源程序: #include<> void main() { int i,j; for(j=1;j<5;j++) { for(i=5;i>j;i--) printf("*"); printf("\n"); } } 程序运行结果: * * * * * * * * * * 思考题:

C语言实验报告3

实验报告 实验名称:最简单的C程序设计——顺序程序设计成绩: 实验日期: 2011 年 10 月 24 日实验报告日期: 2011 年 10 月24 日 实验者:桂婷 一、实验目的 1、掌握C语言中使用最多的一种语句——赋值语句的使用方法。 2、掌握各种类型数据的输入输出的方法,能正确使用各种格式转换符。 3、进一步掌握编写程序和调试程序的方法。 二、实验内容 1、输入程序并运行结果。 2、设圆半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积、圆柱体积。编程序,用scanf输入数据,输出计算结果/。 3、计算存款利息。 有1000元,想存5年,可探子以下5种办法存: (1)一次存5年期; (2)先存2年期,到期后将本息再存3年期; (3)先存3年期,到期后将本息再存2年期; (4)存1年期,到期后将本息存再存1年期,连续存5次; (5)存活期存款。活期利息每一季度结算一次。 三、实验步骤: 1、

总结:1、变量在定义时就赋了初值。 2、两次的printf语句输出都指定了要输出数据的长度和小数点。2、 总结:1、程序在定义时只对部分变量赋了初值,这是允许的。 2、在计算时,乘号是用*表示,不能省略。 3、同样,在输出时指定了输出格式,长度,小数点位数。 3、

总结:1、用scanf语句输入数据,要与指定的格式一样。 2、程序用到了数学公式,调用“include ” 4、实验出现的问题、实验结果分析 1、程序在运行时是自上而下同,自左向右的。运到调用函数则会跳 转,但调用完了仍然回到主函数中。 2、printf语句中的常量是按原样输出的。 3、注意赋值语句的使用。 五、实验小结和思考 1、如果在程序2中不指定输出的长度和小数位数,看运行结果。 2、在程序3中不包含“include ”会怎样? 3、程序3若不给变量赋初值会出现什么情况。

编译原理C语言词法分析器

编译原理 C语言词法分析器 一、实验题目 编制并调试C词法分析程序。 a.txt源代码: ?main() { int sum=0 ,it=1;/* Variable declaration*/ if (sum==1) it++; else it=it+2; }? 设计其词法分析程序,能识别出所有的关键字、标识符、常数、运算符(包括复合运算符,如++)、界符;能过滤掉源程序中的注释、空格、制表符、换行符;并且能够对一些词法规则的错误进行必要的处理,如:标识符只能由字母、数字与下划线组成,且第一个字符必须为字母或下划线。实验要求:要给出所分析语言的词法说明,相应的状态转换图,单词的种别编码方案,词法分析程序的主要算法思想等。 二、实验目的 1、理解词法分析在编译程序中的作用; 2、掌握词法分析程序的实现方法与技术; 3、加深对有穷自动机模型的理解。 三、主要函数 四、设计 1、主函数void main ( ) 2 3

4、整数类型判断函数 char *key1[]={" ","(",")","[","]","{","}",",",";","'"}; /*分隔符表*/

char *key2[]={" ","+","-","*","/","%","<",">","==",">=","<=","!=","!","&&","||","<<",">>","~","|","^","&","=","?:","->","++","--","、","+=","-=","*=","/="}; /*运算符表*/ int xx0[35],xx1[10],xx2[31]; int temp_key3=0,temp_c40=0,temp_c41=0,temp_c42=0,temp_c43=0; /******* 初始化函数*******/ void load() { int mm; for (mm=0;mm<=34;mm++) { xx0[mm]=0; } for (mm=0;mm<=9;mm++) { xx1[mm]=0; } for (mm=0;mm<=30;mm++) { xx2[mm]=0; } FILE *floading; if ((floading=fopen("key0、txt","w"))==NULL) { printf("Error! Can't create file : key0、txt"); return; } fclose (floading); /*建立保留字表文件:key0、txt*/ if ((floading=fopen("key1、txt","w"))==NULL) { printf("Error! Can't create file : key1、txt"); return; } /*建立分隔符表文件:key1、txt*/ if ((floading=fopen("key2、txt","w"))==NULL) { printf("Error! Can't create file : key2、txt"); return; } fclose(floading); /*建立运算符表文件:key2、txt*/ if ((floading=fopen("key3、txt","w"))==NULL) { printf("Error! Can't create file : key3、txt");

C语言实验报告

《C语言程序设计实训1》报告 设计题目:基于数组的学生信息管理系统学院名称:信息科学技术学院

专业:计算机科学与技术 班级: 姓名:学号 指导教师: 提交日期: 2014年12月22日 一、实验内容 编写并调试程序,实现学校各专业班级学生信息的管理。10个学生的信息存储在文件中。在头文件中定义学生信息的结构体类型,包括: 学号、姓名、专业、班级、3门成绩;和符号常量N(学生数)。(同一班 级的学生可以属于不同的专业,同一专业的学生可以属于不同的班级)

二、实验要求 (1)main函数:以菜单形式将各项功能提供给用户,根据用户的选择, 调用相应的函数。 STU student[N]; 函数 #include "" void main() { int i,n,id,num,m,sub,corse;将从文件中读取10个人的信\n"); printf("\n2.您将从文件中随机读取第n(0<=n<=9)个学生的信息\n") printf("\n3.您将根据某一班级某一专业总分超过多少进行查找\n"); printf("\n4.您将求某一课程分数最高的学生序号的下标\n"); printf("\n5.您将对平均成绩由低到高进行简单选择排序法\n ");

printf("\n6.您将对某一个班的平均成绩由低到高进行起泡排序法\n"); printf("\n7.您将对某门专业的学生的某门课程成绩由低到高进行直接插入排序法\n"); printf("\n8.您将把学生信息存入文件\n"); scanf("%d",&id); getchar(); switch(id){ case 1: { printf("\n从文件中读取信息\n"); Input(students,sizeof(students)/sizeof(STU));Sort_select 函数 #include "" void Sort_select(STU * p) { int i,j,k; float sum,ave[N],t; STU tem; for(i=0;i

C语言实验报告参考答案 原

C语言实验报告参考答案 实验一熟悉C语言程序开发环境及数据描述 四、程序清单 1.编写程序实现在屏幕上显示以下结果: The dress is long The shoes are big The trousers are black 答案: #include main() { printf("The dress is long\n"); printf("The shoes are big\n"); printf("The trousers are black\n"); } 2.编写程序: (1) a=150,b=20,c=45,编写求a/b、a/c(商)和a%b、a%c(余数)的程序。 (2)a=160,b=46,c=18,d=170, 编写求(a+b)/(b-c)*(c-d)的程序。 答案: (1) #include main() {

int a,b,c,x,y; a=150; b=20; c=45; x=a/b; y=a/c; printf("a/b的商=%d\n",x); printf("a/c的商=%d\n",y); x=a%b; y=a%c; printf("a/b的余数=%d\n",x); printf("a/c的余数=%d\n",y); } (2) #include main() { int a,b,c,d; float x; a=160; b=46; c=18;

d=170; x=(a+b)/(b-c)*(c-d); printf("(a+b)/(b-c)*(c-d)=%f\n",x); } 3. 设变量a的值为0,b的值为-10,编写程序:当a>b时,将b赋给c;当a<=b 时,将0赋给c。(提示:用条件运算符) 答案: #include main() { int a,b,c; a=0; b=-10; c= (a>b) ? b:a; printf("c = %d\n",c); } 五、调试和测试结果 1.编译、连接无错,运行后屏幕上显示以下结果: The dress is long The shoes are big The trousers are black 2、(1) 编译、连接无错,运行后屏幕上显示以下结果: a/b的商=7

c语言语法分析器详解

#include #include #include /*******************************************/ int count=0; /*分解的产生式的个数*/ int number; /*所有终结符和非终结符的总数*/ char start; /*开始符号*/ char termin[50]; /*终结符号*/ char non_ter[50]; /*非终结符号*/ char v[50]; /*所有符号*/ char left[50]; /*左部*/ char right[50][50]; /*右部*/ char first[50][50],follow[50][50]; /*各产生式右部的FIRST和左部的FOLLOW集合*/ char first1[50][50]; /*所有单个符号的FIRST集合*/ char select[50][50]; /*各单个产生式的SELECT集合*/ char f[50],F[50]; /*记录各符号的FIRST和FOLLOW是否已求过*/ char empty[20]; /*记录可直接推出@的符号*/ char TEMP[50]; /*求FOLLOW时存放某一符号串的FIRST集合*/ int validity=1; /*表示输入文法是否有效*/ int ll=1; /*表示输入文法是否为LL(1)文法*/ int M[20][20]; /*分析表*/ char choose; /*用户输入时使用*/ char empt[20]; /*求_emp()时使用*/ char fo[20]; /*求FOLLOW集合时使用*/ /******************************************* 判断一个字符是否在指定字符串中 ********************************************/ int in(char c,char *p) { int i; if(strlen(p)==0) return(0); for(i=0;;i++) { if(p[i]==c) return(1); /*若在,返回1*/ if(i==strlen(p)) return(0); /*若不在,返回0*/ } } /******************************************* 得到一个不是非终结符的符号 ********************************************/

C语言实验报告《综合实验》

C语言实验报告《综合实验》C语言的实验报告,可以参考一下哈,学财务的童鞋快过来!小编为你推荐。 学号:__ 姓名:__ 班级:__ 日期:__ 指导教师:__ 成绩:__ 实验** 综合实验 1、掌握C语言中的变量、数组、函数、指针、结构体等主要知识点。 2、掌握C程序的结构化程序设计方法,能使用C语言开发简单的应用程序。 编写一个学生信息排序程序。要求: 1、程序运行时可输入n个学生的信息和成绩(n预先定义)。 2、学生信息包括:学号、英文姓名、年龄;学生成绩包括:语文、数学、计算机。 3、给出一个排序选择列表,能够按照上述所列信息(学号、姓名、年龄、语文、数学、计算机)中的至少一个字段进行排序,并显示其结果。 1、使用函数方法定义各个模块。 20**年C语言实验报告《****》 课程名称:会计实务综合实验 院系名称:经济管理管理

专业班级:会计09- 学生姓名: 学号: 20**年C语言实验报告《***》XX年C语言实验报告《***》指导教师:李*** ****工程学院教务处制 实验项目 会计实务综合实验 实验日期 在这一次的操作中,加深对会计理论知识的理解和掌握,通过对会计业务的运用和基本技能的训练,将专业理论和会计实务紧密结合。本实验的操作,也是对学生所学专业知识掌握程度及运用能力的一次综合考查,为他们以后从事的会计工作打下扎实的基础。 1、实验模拟教材 2、计算器 3、钢笔、直尺 根据本学期所学的中级会计实务的内容,解决我们实习中老师布置的问题,本学期所学的重点主要是投资性房地产、非货币性资产交换、借款费用、债务重组、或有事项、所得税的计算、会计政策、会计估计变更和差错更正以及资产负债表日后事项的调整。把每一个业务题都当作一个真实的业

2016年C语言实验报告

通知 各位老师: 本学期非计算机专业《计算机程序设计基础(C语言)》课实验报告要求: 1.统一用《武汉科技大学实验报告》本写。本学期交三次实验报告。 ①循环结构程序设计。 ②数组。 ③函数。 要求学生在完成以下实验报告,参考《C语言程序设计课程实验与题解》中的要求认真完成。 实验1 循环结构程序设计 一、实验目的 1.熟悉用while语句,do-while语句和for语句实现循环的方法。 2.掌握在程序设计中用循环的方法实现各种算法(如穷举、迭代、递推等)。 3.熟悉break语句和continue语句用法的不同之处。 二、实验内容 【例】以下程序,输出下三角形状的乘法九九表。 #include void main() { int i,j; for (i=1;i<=9;i++) /* 打印表头*/ printf(" %4d",i); printf("%c",'\n'); for (i=0;i<=50;i++) printf("%c",'_'); printf("%c",'\n'); for (i=1;i<=9;i++) /* 循环体执行一次,打印一行*/ { for (j=1;j<=i;j++) printf(" %4d",i*j); /* 循环体执行一次,打印一个数据*/ printf("%c",'\n'); /* 每行尾换行*/ } printf("%c",'\n'); } 输入并执行该程序,观察输出结果,试着修改程序打印上三角形状的乘法九九表。 三、编程序并上机调试运行。 1.打印出所有“水仙花数”。所谓“水仙花数”是指一个三位数,其各位数字的立方和正好等于该数本身。例如:153是一个“水仙花数”,因为153=13+53+33。 解题思路:根据题目要求只要分别求出一个三位数的个位、十位、百位上的数字,然后判断是否满足(某一三位数a=a的百位的立方+a的十位的立方+a的个位的立方)这个公式,满足这个三位数就是“水仙花数”。 2.李先生岁数的平方与他的夫人的岁数之和是1053,而他的夫人的岁数的平方与他

C语言编译器的设计与实现.

C语言编译器的设计与实现 01计算机4班18号任春妍2号陈俊我们设计的编译程序涉及到编译五个阶段中的三个,即词法分析器、语法分析器和中间代码生成器。编译程序的输出结果包括词法分析后的二元式序列、变量名表、状态栈分析过程显示及四元式序列程序,整个编译程序分为三部分: (1) 词法分析部分 (2) 语法分析处理及四元式生成部分 (3) 输出显示部分 一.词法分析器设计 由于我们规定的程序语句中涉及单词较少,故在词法分析阶段忽略了单词输入错误的检查,而将编译程序的重点放在中间代码生成阶段。词法分析器的功能是输入源程序,输出单词符号。我们规定输出的单词符号格式为如下的二元式:(单词种别,单词自身的值) #define ACC -2 #define syl_if 0 #define syl_else 1 #define syl_while 2 #define syl_begin 3 #define syl_end 4 #define a 5 #define semicolon 6 #define e 7 #define jinghao 8 #define s 9 #define L 10 #define tempsy 11 #define EA 12 #define EO 13 #define plus 14 #define times 15 #define becomes 16 #define op_and 17 #define op_or 18 #define op_not 19 #define rop 20 #define lparent 21 #define rparent 22 #define ident 23 #define intconst 24

C语言实验报告参考源代码

实验5三种基本结构的综合应用 4.一个素数(设为p)依次从最高位去掉一位,二位,三位,……,若得到的各数仍都是素数(注:除1和它本身外,不能被其它整数整除的正整数称为素数,1不是素数,2是素数),且数p的各位数字均不为零,则称该数p为逆向超级素数。例如,617,17,7都是素数,因此617是逆向超级素数,尽管503,03,3都是素数,但它不是逆向超级素数,因为它包含有零。试求[100,999]之内的所有逆向超级素数的个数。 #include "stdio.h" main() {int i,j,k,m,p,q,n=0; for(i=100;i<=999;i++) {for(j=2;j=i) /*三位数是素数时*/ {k=i%100; /*去掉百位数字*/ if(k>=10) /*十位数字不是0时*/ {for(m=2;m=k) /*两位数是素数时*/ {p=i%10; /*p为个位数字*/ for(q=2;q=p)n++;}}}} printf("%d\n",n);} Key:57 5.求[2,400]中相差为10的相邻素数对的对数。 #include "stdio.h" main() {int i,j,k,m,p,q,n=0; for(i=2;i<=400;i++) {for(j=2;j=i) /*i是素数时*/ {for(k=i+1;k=k)break;} /*k是素数时终止if语句的外层循环*/ if(k>=i+10) /*[i+1,i+9]不是素数时*/ {for(q=2;q

:C语言实验报告册-2016.3资料

学生实验报告册 (理工类) 课程名称:C语言程序设计实验专业班级: 16数字媒体技术学生学号: 1613031008 学生姓名:李翔 所属院部:计算机工程学院指导教师:吕艳林 20 16 ——20 17 学年第一学期 金陵科技学院教务处制

实验报告书写要求 实验报告上交电子稿,标题采用四号黑体,正文采用小四号宋体,单倍行距。 实验报告书写说明 实验报告中实验目的和要求、实验仪器和设备、实验内容与过程、实验结果与分析这四项内容为必需项。教师可根据学科特点和实验具体要求增加项目。 填写注意事项 (1)细致观察,及时、准确、如实记录。 (2)准确说明,层次清晰。 (3)尽量采用专用术语来说明事物。 (4)外文、符号、公式要准确,应使用统一规定的名词和符号。 (5)应独立完成实验报告的书写,严禁抄袭、复印,一经发现,以零分论处。 实验报告批改说明 实验报告的批改要及时、认真、仔细,一律用红色笔批改。实验报告的批改成绩采用五级记分制或百分制,按《金陵科技学院课堂教学实施细则》中作业批阅成绩评定要求执行。

实验项目名称:初级程序设计实验学时: 6 实验地点: A107 实验日期: 2016年10月13,20,27 实验成绩: 批改教师:批改时间:

实验1 初级程序设计 一、实验目的和要求 (1)熟悉Visual C++集成环境,进行编辑、保存、编译、连接及运行,并能进行简单程序调试; (2)掌握C语言中各种运算符的使用; (3)掌握C语言中各种数据类型的区别与应用; (4)熟练掌握C语言中变量的定义、赋值和使用,表达式语句、输入/输出语句的使用; (5)掌握C语言中输入/输出函数的使用; (6)掌握C语言中控制语句的使用,含if-else、for、while、do-while语句的使用。 二、实验仪器和设备 奔腾以上计算机,装有windows XP以上版本操作系统和Visual C++ 6.0软件。 三、实验内容与过程 1、程序调试 (1)#include main() { int s,t,p,sum; scanf(“%d%d%d”,&s,&t,&p); sum=s+t+p; printf(“sum=%d\n”,sum); } (2)#include main() { int k=3; if(k=3) printf(“***”); else printf(“###”); } (3)#include main() {int k=0; do { printf(“k=%d\n”,k); }while(k++>0); } 2、程序改错

C语言综合性设计实验报告

C语言综合性设计实验报告 1.实验题目 建立一个简单的会员卡储值积分管理系统。 该系统的主要功能是:会员卡管理功能和会员卡储值积分管理。 会员卡管理功能: (1)根据身份证办理会员卡,一张身份证只能办理一张会员卡。 (2)根据需要可以注销、挂失、冻结会员卡或修改会员卡密码以及积分和消费金额查询。会员基本信息包括:会员身份证号、卡号、密码、积分、消费金额、级别。 会员卡储值积分管理: (1)根据会员卡级别设置折扣率,根据折扣率自动打折计算消费金额。 (2)根据消费金额计算积分,积分累计达到一定标准后换购商品。 2.设计分工 组员 组员 组员: 组员 在本系统开发中,小组各成员的分工如下: 会员的信息存储数据结构和各个子函数的名称及实验报告的书写由全体成员统一制定; 主函数main,主控程序模块call函数,系统退出函数,各函数名称及用到的变量名称的规定由胡丽萍统一负责。 会员管理总函数,会员积分总函数,会员信息查询函数及信息内容输出函数由陈建飞负责。 会员信息冻结函数,挂失函数,注销函数及内部返回到主菜单的返回函数由郭娟如负责。 密码设置函数,查询时检查函数,增加新会员函数,修改密码函数统一由郭霞负责。 输入级别函数,输入消费函数,查询积分函数,查询折扣率函数统一交由胡桂芳负责。 3.问题概述 要实现这个会员积分管理系统,要遇到的问题如下: ①. 首先要有一个主函数来负责对子函数的调用。 ②. 进行新增一个会员时的增加操作 ③. 对身份证号码的判定操作及密码的设置及判定操作 ④. 输出会员信息时对各部分的总体把握 ⑤. 修改密码时覆盖其原有的密码 ⑥. 会员级别及消费来查询折扣率和积分的操作 4.问题分析 首先该问题分为两个大块,一个是会员卡管理功能,另一个是会员积分管 理功能。针对会员卡管理功能,首先应具备7项功能,新会员的录入,查询会员

C语言实验报告

实验一进制转换一、实验要求 采用模块化程序设计完成进制转换。由键盘输入一个十进制正整数,然后将该数转换成指定的进制数(二、八、十六) 形式输出。指定的进制由用户输入。 二、实验目的 1、熟悉C 环境的安装、使用。 2、承上启下,复习《C 程序设计》等基础课程的知识。 3、掌握C 语言编程的方法。 三、预备知识 1、VC6.0的安装与使用。 2、C 程序设计基础知识。 四、实验内容 采用模块化程序设计完成进制转换。

五、程序框图 六、程序清单 1. 编写主函数:输入需转换的数与转换的进制 2. 编写子函数 (1)函数转换为除16进制以外的进制转换算数编程,使用while 循环实现计算进制 的转换,并输出转换后的数字; (2)函数转换为16进制,用while 函数实现16进制转换的计算并输出16进制转换后的数据; 3. 编写数组,关于16进制的一系列字符 4. 编写主函数加入do while 使函数可以循环。

七、实验步骤 #include char num[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; void fun(int n, int m) { int i=-1, a[100]; if(m!=16) { while(n) { a[i++]=n%m; n=n/m; } while(i!=-1) printf("%d",a[--i]); printf("\n");

} else { while(n) { a[++i]=num[n%16]; n/=16; } while(i!=-1) printf("%c",a[i--]); printf("\n"); } } int main() { int a, c;

C语言程序设计实验报告优秀范文

C语言程序设计实验报告优秀范文 实验名称计算出1000以内10个最大素数之和 实验目的 1、熟练掌握if、if…else、if…else if语句和witch语句格式及使用方法,掌握if语句中的嵌套关系和匹配原则,利用if语句和switch语句实现分支选择结构。 2、熟练掌握while语句、do…while语句和for语句格式及使用方法,掌握三种循环控制语句的循环过程以及循环结构的嵌套,利用循环语句实现循环结构。 3、掌握简单、常用的算法,并在编程过程中体验各种算法的编程技巧。进一步学习调试程序,掌握语法错误和逻辑错误的检查方法。 实验内容 计算并输出1000以内最大的10个素数以及它们的和。 要求: 在程序内部加必要的注释。 由于偶数不是素数,可以不考虑对偶数的处理。 虽然在1000以内的素数超过10个,但是要对1000以内不够10个素数的情况进行处理。 输出形式为:素数1+素数2+素数3+…+素数10=总和值。 算法描述流程图 main函数: 判断素数: 源程序 #include #include int sushu(int n)/* 判断素数的函数*/ { int t,i; t=sqrt(n); for(i=2;i if(n%i==0)/* 如果不是素数,返回0 */ return 0; return n;/* 如果是素数,返回该数*/ } void main { int i,j=0,n,m=0,a[1000],x; /*clrscr;*/ printf("please input a number form 1 to 1000:"); scanf("%d",&x); if(x==2)/* x=2时的处理*/ printf("%dn",x); else if(x printf("error!n");

C语言实验报告答案

二、编程题(参考答案) 1、 #include “stdio.h” void main() { int Math=82,eng=78,comp=91,average; average=(Math+eng+comp)/3; printf(“Math=%d,eng=%d,comp=%d,average=%d\n”,Math,eng,comp,average); } 2、 #include “stdio.h” void main() { int n=152,d1,d2,d3; d1=n%10; d2=(n/10)%10; d3=n/100; printf(“整数%d的个位数字是%d,十位数字是%d,百位数字是%d\n”,n,d1,d2,d3); } 3、 #include “stdio.h” void main() { int n1,n2; printf(“Enter n1,n2:”); scanf(“%d,%d”,&n1,&n2); printf(“%d+%d=%d\n”,n1,n2,n1+n2); printf(“%d/%d=%d\n”,n1,n2,n1/n2); printf(“%d%%%d=%d\n”,n1,n2,n1%n2); } 三、改错题 原错误行(共三行): /********************************** found ********************************/ #include “stdoi,h” /********************************** found ********************************/ printf(“%d=%d*%d\n”,x); /********************************** found ********************************/ printf(“%d*%d=%d\n”,y); 改正后: #include “stdio.h” printf(“%d=%d*%d\n”,y,x,x); printf(“%d*%d=%d\n”,x,x,y);

C语言编程实验报告(三)

华北水院高级语言程序设计(C语言)实验报告(三) 2012--2013学年第二学期 2012级专业:学号:姓名:……………………………………………………………………………………………… 一、实验题目:循环结构程序设计 二、实验目的:(略) 三、实验内容 1. 程序验证(略) 2.程序设计 1) 找出100-900之间的无暇素数。所谓无暇素数是指本身为素数,且其逆序数也是素数的数。例如:113是一个素数,311也是一个素数,113就是无暇素数。 源代码:运行结果: #include "stdafx.h" #include #include void main() { int n,m,i,j,a,b,c,k; int flag,count=0; for(n=101;n<=109;n+=2) { a=n%100; b=(n%100)/10; c=(n%100)%10; m=c*100+b*10+c; flag=1; k=(int)sqrt(n); for(i=2;i<=k;i++)

if(n%i==0&&m%i==0) { flag=0; break; } if(flag) { count++; printf("%5d",n); if(count%4==0) printf("\n"); } } } 2) 编程:用迭代法求某数a的平方根。平方根的迭代公式如下:

x n+1=(x n+a/x n)/2; 设x0=a/2; 当迭代相邻两项差的绝对值小于10-5时,迭代结束。 源代码:运行结果:#include "stdafx.h" #include #include void main() { double a,b,m,n,t; printf("请输入一个数"); scanf("%lf",&a); m=(a/2+a/(a/2)); while(t>=1e-5) { n=m; m=(n+a/n)/2; t=n-m; } printf("%lf",t); }

编译原理课程设计 C语言编译器的实现

编译原理课程设计报告 设计题目编译代码生成器设计 学生姓名 班级 学号 指导老师 成绩

一、课程设计的目的 编译原理课程兼有很强的理论性和实践性,是计算机专业的一门非常重要的专业基础课程,它在系统软件中占有十分重要的地位,是计算机专业学生的一门主修课。为了让学生能够更好地掌握编译原理的基本理论和编译程序构造的基本方法和技巧,融会贯通本课程所学专业理论知识,提高他们的软件设计能力,特设定该课程的课程设计,通过设计一个简单的PASCAL语言(EL语言)的编译程序,提高学生设计程序的能力,加深对编译理论知识的理解与应用。 二、课程设计的要求 1、明确课程设计任务,复习编译理论知识,查阅复印相关的编译资料。 2、按要求完成课程设计内容,课程设计报告要求文字和图表工整、思路清晰、算法正 确。 3、写出完整的算法框架。 4、编写完整的编译程序。 三、课程设计的内容 课程设计是一项综合性实践环节,是对平时实验的一个补充,课程设计内容包括课程的主要理论知识,但由于编译的知识量较复杂而且综合性较强,因而对一个完整的编译程序不适合平时实验。通过课程设计可以达到综合设计编译程序的目的。本课程的课程设计要求学生编写一个完整的编译程序,包括词法分析器、语法分析器以及实现对简单程序设计语言中的逻辑运算表达式、算术运算表达式、赋值语句、IF语句、While语句以及do…while语句进行编译,并生成中间代码和直接生汇编指令的代码生成器。 四、总体设计方案及详细设计 总体设计方案: 1.总体模块 主程序 词法分析程序语法分析 程序 中间代码 生成程序

2. 表2.1 各种单词符号对应的种别码 单词符号种别码单词符号种别码bgin 1 :17 If 2 := 18 Then 3 < 20 wile 4 <> 21 do 5 <= 22 end 6 > 23 lettet(letter|digit)* 10 >= 24 dight dight* 11 = 25 + 13 ;26 —14 ( 27 * 15 ) 28 / 16 # 0 详细设计: 4.1界面导入设计 (1)一共三个选项: ①choice 1--------cifafenxi ②choice 2--------yufafenxi ③choice 3--------zhongjiandaima (2)界面演示 图一

C语言程序设计实验报告(完整版)

报告编号:YT-FS-4244-21 C语言程序设计实验报告 (完整版) After Completing The T ask According To The Original Plan, A Report Will Be Formed T o Reflect The Basic Situation Encountered, Reveal The Existing Problems And Put Forward Future Ideas. 互惠互利共同繁荣 Mutual Benefit And Common Prosperity

C语言程序设计实验报告(完整版) 备注:该报告书文本主要按照原定计划完成任务后形成报告,并反映遇到的基本情况、实际取得的成功和过程中取得的经验教训、揭露存在的问题以及提出今后设想。文档可根据实际情况进行修改和使用。 实验名称计算出1000以内10个素数之和 实验目的 1、熟练掌握if、if…else、if…else if语句和 witch语句格式及使用方法,掌握if语句中的嵌套关 系和匹配原则,利用if语句和switch语句实现分支 选择结构。 2、熟练掌握while语句、do…while语句和for 语句格式及使用方法,掌握三种循环控制语句的循环 过程以及循环结构的嵌套,利用循环语句实现循环结 构。 3、掌握简单、常用的算法,并在编程过程中体验 各种算法的编程技巧。进一步学习调试程序,掌握语 法错误和逻辑错误的检查方法。

实验内容 计算并输出1000以内的10个素数以及它们的和。 要求: 在程序内部加必要的注释。 由于偶数不是素数,可以不考虑对偶数的处理。 虽然在1000以内的素数超过10个,但是要对1000以内不够10个素数的情况进行处理。 输出形式为:素数1+素数2+素数3+…+素数10=总和值。 算法描述流程图 Main函数: 判断素数: 源程序 #include #include int sushu(int n)/* 判断素数的函数 */ { int t,i;

c语言实验三实验报告

C语言程序设计实验报告 实验三使用数组的程序设计 班级学号姓名 一、实验目的 (1)掌握一维数组和二维数组的定义、赋值和输入输出方法。 (2)掌握字符数组的使用。 (3)掌握与数组有关的算法。 二、实验内容及步骤 1、检验并打印幻方矩阵 在下面的5*5阶幻方矩阵中,每一行、每一列、每一对角线上的元素之和都是相等的,试编写程序将这些幻方矩阵中的元素读到一个二维整型数组中,然后检验其是否为幻方矩阵,并将其按如下格式显示到屏幕上。 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 程序代码: #include int main() { int i,j,k=0; int sum1[5]={0},sum2[5]={0},b[2]={0}; int a[5][5]={{17,24,1,8,15},{23,5,7,14,16},{4,6,13,20,22},{10,12,19,21,3},{11,18,25, 2,9}}; for(i=0;i<5;i++) { for(j=0;j<5;j++) { printf("%4d",a[i][j]); sum1[i]=sum1[i]+a[i][j]; sum2[i]=sum2[i]+a[j][i]; } printf("\n"); } for(i=0;i<5;i++) { b[0]=b[0]+a[i][i]; b[1]=b[1]+a[i][4-i]; } for(i=0;i<5;i++) {

if(sum1[i]==b[0]&&sum2[i]==b[0]&&b[0]==b[1]) k++; } if(k==5) printf("这是一个幻方矩阵.\n"); else printf("这不是一个幻方矩阵.\n"); return 0; } 2、完成以下程序,并进行调试 某班期末考试科目为数学、英语和计算机,有最多不超过30人参加考试,考试后要求:1)计算每个学生的总分和平均分; 2)按总分成绩由高到低排出成绩的名次; 3)打印出名次表,表格内包括学生学号、各科分数、总分和平均分; 4)任意输入一个学号,能够查找出该学生在班级中的排名及其考试分数。 【提示】:用二维数组score存放每个学生各门课程的成绩,用一维数组num存放每个学生的学号,用一维数组sum存放每个学生的总分,用一维数组aver存放每个学生的平均分。 程序代码: #include int main() { int i,j,k,l,g,t,s,r,p; int score[31][4],num[31],sum[31]={0},aver[31],m; printf("请输入学生人数:\n"); scanf("%d",&k); for(i=1;i<=k;i++) { printf("请输入学号和各科成绩:\n");//输入学号及成绩 scanf("%d",&num[i]);getchar(); for(j=1;j<4;j++) { scanf("%d",&score[i][j]);getchar(); sum[i]=sum[i]+score[i][j]; } aver[i]=sum[i]/3; } for(j=1;j

C语言实验报告

《C语言》实验报告 专业_____________ 年级_____________ 学号_____________ 学生姓名_____________ 指导老师_____________ 华中师范大学信息管理系编

I 实验要求 1.每次实验中有若干习题,每个学生至少应该完成其中的三道习题。 2.上机之前应作好充分的准备工作,预先编好程序,经过人工检查无误后,才能上机,以提高上机效率,严禁一边上机一边编写。 3.独立上机输入和调试自己所编的程序,切忌抄袭、拷贝他人程序。 4.上机结束后,应整理出实验报告。书写实验报告时,重点放在调试过程和小结部分,总结出本次实验中的得与失,以达到巩固课堂学习、提高动手能力之目的。 II 实验内容 实验一简单程序设计 【实验目的】 1.熟悉TC++、Borland C++和VC++6.0的运行环境。 2.了解在TC++、Borland C++和VC++6.0上如何编辑、编译、连接和运行一个C程序。 3.熟练使用各种C语言的数据类型、运算符与表达式。 4.熟练掌握格式输入与格式输出函数的使用。 5.通过运行简单的C程序,初步了解C源程序的特点,初步掌握查错和排错的技能. 【上机实习指导】 1.通过以下程序来掌握上机操作的全过程 在VC、BC或TC中练习输入、编译、运行一个C语言程序的全过程 以下程序是计算函数y=3x2+2x-4(假设x=2)。 # include “stdio.h” void main( ) { int x=2,y; y=3*x*x+2*x-4; printf(“\ny=%d”,y); } 2.基本数据类型表示范围练习 假设有如下程序: #include void main ( ) { char ch1, ch2, ch; unsigned char c; int a;

相关文档
最新文档