当前位置:文档之家› 实验5 LL(1)语法分析程序的设计与实现(C语言)

实验5 LL(1)语法分析程序的设计与实现(C语言)

实验5 LL(1)语法分析程序的设计与实现(C语言)
实验5 LL(1)语法分析程序的设计与实现(C语言)

实验五LL(1)文法识别程序设计

一、实验目的

通过LL(1)文法识别程序的设计理解自顶向下的语法分析思想。

二、实验重难点

FIRST集合、FOLLOW集合、SELECT集合元素的求解,预测分析表的构造。

三、实验内容与要求

实验内容:

1.阅读并理解实验案例中LL(1)文法判别的程序实现;

2.参考实验案例,完成简单的LL(1)文法判别程序设计。

四、实验学时

4课时

五、实验设备与环境

C语言编译环境

六、实验案例

1.实验要求

参考教材93页预测分析方法,94页图5.11 预测分析程序框图,编写表达式文法的识别程序。要求对输入的LL(1)文法字符串,程序能自动判断所给字符串是否为所给文法的句子,并能给出分析过程。

表达式文法为:

E→E+T|T

T→T*F|F

F→i|(E)

2.参考代码

为了更好的理解代码,建议将图5.11做如下标注:

/* 程序名称:LL(1)语法分析程序*/

/* E->E+T|T */

/* T->T*F|F */

/* F->(E)|i */

/*目的: 对输入LL(1)文法字符串,本程序能自动判断所给字符串是否为所给文法的句子,并能给出分析过程。

/********************************************/

/* 程序相关说明*/

/* A=E' B=T' */

/* 预测分析表中列号、行号*/

/* 0=E 1=E' 2=T 3=T' 4=F */

/* 0=i 1=+ 2=* 3=( 4=) 5=# */

/************************************/

#include"iostream"

#include "stdio.h"

#include "malloc.h"

#include "conio.h"

/*定义链表这种数据类型参见:

https://www.doczj.com/doc/4212588053.html,/link?url=_owQzf8PRZOt9H-5oXIReh4X0ClHo6zXtRdWrdSO5YBLpKl NvkCk0qWqvFFxjgO0KzueVwEQcv9aZtVKEEH8XWSQCeVTjXvy9lxLQ_mZXeS###*/ struct Lchar{

char char_ch;

struct Lchar *next;

}Lchar,*p,*h,*temp,*top,*base;

/*p指向终结符线性链表的头结点,h指向动态建成的终结符线性链表节点,top和base分

别指向非终结符堆栈的顶和底*/

char curchar; //存放当前待比较的字符:终结符

char curtocmp; //存放当前栈顶的字符:非终结符

int right;

int table[5][6]={{1,0,0,1,0,0},

{0,1,0,0,1,1},

{1,0,0,1,0,0},

{0,1,1,0,1,1},

{1,0,0,1,0,0}};/*存放预测分析表,1表示有产生式,0表示无产生式。*/ int i,j;

void push(char pchar) /*入栈函数*/

{

temp=(struct Lchar*)malloc(sizeof(Lchar));

temp->char_ch=pchar;

temp->next=top;

top=temp;

}

void pop(void) /*出栈函数*/

{

curtocmp=top->char_ch;

if(top->char_ch!='#')

top=top->next;

}

void doforpush(int t) /*根据数组下标计算的值找对应的产生式,并入栈*/ {

switch(t)

{

case 0:push('A');push('T');break;

case 3:push('A');push('T');break;

case 11:push('A');push('T');push('+');break;

case 20:push('B');push('F');break;

case 23:push('B');push('F');break;

case 32:push('B');push('F');push('*');break;

case 40:push('i');break;

case 43:push(')');push('E');push('(');

}

}

/*根据curchar和curtocmp转为数字以判断是否有产生式*/

void changchartoint()

{

switch(curtocmp) /*非终结符:栈顶*/

{

case 'E':i=0;break;

case 'A':i=1;break;

case 'T':i=2;break;

case 'B':i=3;break;

case 'F':i=4;

}

switch(curchar) /*终结符:待识别的表达式中*/

{

case 'i':j=0;break;

case '+':j=1;break;

case '*':j=2;break;

case '(':j=3;break;

case ')':j=4;break;

case '#':j=5;

}

}

/*识别算法*/

void dosome(void)

{

int t;

for(;;)

{

pop();/*读取栈顶的字符存curtocmp中*/

curchar=h->char_ch; /*读取输入字符链表h中一个字符存入curchar*/

printf("\n%c\t%c",curchar,curtocmp);

if(curtocmp=='#' && curchar=='#') /*如果都是终结符P94 图5.11圈1、圈5、圈7*/ break;

if(curtocmp=='A'||curtocmp=='B'||curtocmp=='E'||curtocmp=='T'||curtocmp=='F') /*如果curtocmp不是终结符P94 图5.11圈1*/

{

if(curtocmp!='#') /*如果curtocmp不是终结符,也不是结束符,则根据预测分析表

找到产生式并入栈P94 图5.11圈1*/

{

changchartoint();

if(table[i][j]) /*[1.1]有产生式P94 图5.11圈2*/

{

t=10*i+j; /*计算产生式在数组中的位置*/

doforpush(t); /*找对应t的产生式并入栈P94 图5.11圈3*/

continue;

}

else/*[1.2]没有产生式P94 图5.11圈4*/

{

right=0; /*出错*/

break;

}

}

else if(curtocmp!=curchar) /*如果curtocmp不是终结符,并且是结束符,判断终结

符链表字符是否也为终结符P94 图5.11圈1、1、5、6*/

{

right=0; /*出错*/

break;

}

else

break; /*正确P94 图5.11圈1、1、5、7*/

}

else if(curtocmp!=curchar) /* 如果curtocmp是终结符,并且不等于当前终结符链表中的终结符,则出错。P94 图5.11圈1、8、9*/

{

right=0; /*出错*/

break;

}

else /*如果curtocmp是终结符,并且等于当前终结符链表中的终结符,则匹配成功,可以读取下一个链表头的终结符P94 图5.11圈10*/

{

h=h->next; /*读取下一字符*/

continue;

}

}

}

int main(void)

{

char ch;

right=1;

base=(struct Lchar*)malloc(sizeof(Lchar)); /*初始化非终结符堆栈,栈底为#,栈顶为文法开始符号*/

base->next=NULL;

base->char_ch='#';

temp=(struct Lchar*)malloc(sizeof(Lchar));

temp->next=base;

temp->char_ch='E';

top=temp; /*初始化非终结符堆栈,栈底为#,栈顶为文法开始符号E*/

/*初始化存放待识别的表达式(终结符)的线性链表头*/

h=(struct Lchar*)malloc(sizeof(Lchar));

h->next=NULL;

p=h; /*开辟了一个空的链表空间,p和h同时指向该空间,该空间将作为终结符链表的头部。*/

printf("请输入要分析的字符串(#号结束)\n");

do{ /*输入待识别的表达式*/

ch=getch();

putch(ch); //在屏幕上输出一个字符

if(ch=='i'||ch=='+'||ch=='*'||ch=='('||ch==')'||ch=='#')

{ /*将输入的ch存入链表*/

temp=(struct Lchar*)malloc(sizeof(Lchar));

temp->next=NULL;

temp->char_ch=ch;

h->next=temp;

h=h->next;/*如果输入正确,h不断的指向新输入的字符,而p始终指向输入终结符

字符串的头位置,即前面开辟的空的链表空间。*/

}

else

{

temp=p->next; /*如果输入错误,提示输入有错,请重新输入,让temp指向输入字

符串的头部,并将前面正确输出的字符串再次输出*/

printf("\nInput a wrong char!Input again:\n");

for(;;)

{

if (temp!=NULL)

printf("%c",temp->char_ch);

else

break;

temp=temp->next;

}

}

}while(ch!='#');

p=p->next; /*消去第一个空头节点,并使头结点指向非空线性链表表头*//*如果输入正确,h 不断的指向新输入的字符,而输入字符串的头位置被记录在p里面。*/

h=p; /*h重新指向头结点,以便后面识别操作*/

dosome();/*开始识别*/

if(right)

printf("\n成功! 输入的表达式可以被该文法识别!\n");

else

printf("\n错误! 表示输入的表达式不可以被该文法识别!\n");

getch();

return 0;

}

3.测试数据及运行结果

七、简单LL(1)文法判别程序设计

1、判断以下文法是不是LL(1)文法,写出详细的判断过程:

E→E+T|E-T|T

T→T*F|T/F|F

F→i|(E)

(1)消除左递归,文法变为:

E→TE’

E’→+TE’ | -TE’ | ε

T→FT’

T’→*FT’ | /FT’ |ε

F→i | (E)

ε

(3)各非终结符的FIRST集合为:

FIRST(E) = {(,i}

FIRST(E’) ={+,-,ε}

FIRST(T)={(,i}

FIRST(T’) ={*,/,ε}

FIRST(F) ={(,i}

(4)各非终结符的FOLLOW集合为:

FOLLOW(E) = {),#}

FOLLOW(E’)= {),#}

FOLLOW(T) = {),#,+,-}

FOLLOW(T’)= {),#,+,-}

FOLLOW(F) = {*,/,+,-,),#}

(5)各产生式的SELECT集合为:

SELECT(E→TE’)={(,i}

SELECT(E’→+TE’)={+}

SELECT(E’→-TE’)={-}

SELECT(E’→ε)={ ),#}

SELECT(T→FT’)={(,i}

SELECT(T’→*FT’)={*}

SELECT(T’→/FT’)={/}

SELECT(T’→ε)={ +,-,),#}

SELECT(F→(E))={(}

SELECT(F→i)={i}

(6)有相同左部产生式的SELECT集合的交集是否为空?该文法是否为LL(1)文法?

2、设计LL(1)文法判别程序设计,源代码如下:

/* 程序名称: LL(1)语法分析程序 */

/* E->E+T|E-T/T */

/* T->T*F|T/F/F */

/* F->(E)|i */

/*目的: 对输入LL(1)文法字符串,本程序能自动判断所给字符串是否为所给文法的句子,并能给出分析过程。

/********************************************/

/* 程序相关说明 */

/* A=E' B=T' */

/* 预测分析表中列号、行号 */

/* 0=E 1=E' 2=T 3=T' 4=F */

/* 0=i 1=+ 2=- 3=* 4=/ 5=( 6=) 7=# */

/************************************/

#include"iostream"

#include "stdio.h"

#include "malloc.h"

#include "conio.h"

/*定义链表这种数据类型参见:

https://www.doczj.com/doc/4212588053.html,/link?url=_owQzf8PRZOt9H-5oXIReh4X0ClHo6zXtRdWrdSO5YBL pKlNvkCk0qWqvFFxjgO0KzueVwEQcv9aZtVKEEH8XWSQCeVTjXvy9lxLQ_mZXeS###*/ struct Lchar{

char char_ch;

struct Lchar *next;

}Lchar,*p,*h,*temp,*top,*base;

/*p指向终结符线性链表的头结点,h指向动态建成的终结符线性链表节点,top和base 分别指向非终结符堆栈的顶和底*/

char curchar; //存放当前待比较的字符:终结符

char curtocmp; //存放当前栈顶的字符:非终结符

int right;

int table[5][8]={{1,0,0,0,0,1,0,0},

{0,1,1,0,0,0,1,1},

{1,0,0,0,0,1,0,0},

{0,1,1,1,1,0,1,1},

{1,0,0,0,0,1,0,0}};/*存放预测分析表,1表示有产生式,0表示无产生式。*/

int i,j;

void push(char pchar) /*入栈函数*/

{

temp=(struct Lchar*)malloc(sizeof(Lchar));

temp->char_ch=pchar;

temp->next=top;

top=temp;

}

void pop(void) /*出栈函数*/

{

curtocmp=top->char_ch;

if(top->char_ch!='#')

top=top->next;

}

void doforpush(int t) /*根据数组下标计算的值找对应的产生式,并入栈*/ {

switch(t)

{

case 0:push('A');push('T');break;

case 5:push('A');push('T');break;

case 11:push('A');push('T');push('+');break;

case 12:push('A');push('T');push('-');break;

case 20:push('B');push('F');break;

case 25:push('B');push('F');break;

case 33:push('B');push('F');push('*');break;

case 34:push('B');push('F');push('/');break;

case 40:push('i');break;

case 45:push(')');push('E');push('(');break;

}

}

/*根据curchar和curtocmp转为数字以判断是否有产生式*/

void changchartoint()

{

switch(curtocmp) /*非终结符:栈顶*/

{

case 'A':i=1;break;

case 'B':i=3;break;

case 'E':i=0;break;

case 'T':i=2;break;

case 'F':i=4;

}

switch(curchar) /*终结符:待识别的表达式中*/

{

case 'i':j=0;break;

case '+':j=1;break;

case '-':j=2;break;

case '*':j=3;break;

case '/':j=4;break;

case '(':j=5;break;

case ')':j=6;break;

case '#':j=7;

}

}

/*识别算法*/

void dosome(void)

{

int t;

for(;;)

{

pop();/*读取栈顶的字符存curtocmp中*/

curchar=h->char_ch; /*读取输入字符链表h中一个字符存入curchar*/

printf("\n%c\t%c",curchar,curtocmp);

if(curtocmp=='#' && curchar=='#') /*如果都是终结符 P94 图5.11圈1、圈5、圈7*/

break;

if(curtocmp=='A'||curtocmp=='B'||curtocmp=='E'||curtocmp=='T'||curtocmp=='F') /*如果curtocmp不是终结符 P94 图5.11圈1*/

{

if(curtocmp!='#') /*如果curtocmp不是终结符,也不是结束符,则根据预测分析表找到产生式并入栈 P94 图5.11圈1*/

{

changchartoint();

if(table[i][j]) /*[1.1]有产生式P94 图5.11圈2*/

{

t=10*i+j; /*计算产生式在数组中的位置*/

doforpush(t); /*找对应t的产生式并入栈P94 图5.11圈3*/

continue;

}

else/*[1.2]没有产生式P94 图5.11圈4*/

{

right=0; /*出错*/

break;

}

}

else if(curtocmp!=curchar) /*如果curtocmp不是终结符,并且是结束符,判断终结符链表字符是否也为终结符P94 图5.11圈1、1、5、6*/

{

right=0; /*出错*/

break;

}

else

break; /*正确P94 图5.11圈1、1、5、7*/

}

else if(curtocmp!=curchar) /* 如果curtocmp是终结符,并且不等于当前终结符链表中的终结符,则出错。P94 图5.11圈1、8、9*/

{

right=0; /*出错*/

break;

}

else /*如果curtocmp是终结符,并且等于当前终结符链表中的终结符,则匹配成功,可以读取下一个链表头的终结符P94 图5.11圈10*/

{

h=h->next; /*读取下一字符*/

continue;

}

}

}

int main(void)

{

char ch;

right=1;

base=(struct Lchar*)malloc(sizeof(Lchar)); /*初始化非终结符堆栈,栈底为#,栈顶为文法开始符号*/

base->next=NULL;

base->char_ch='#';

temp=(struct Lchar*)malloc(sizeof(Lchar));

temp->next=base;

temp->char_ch='E';

top=temp; /*初始化非终结符堆栈,栈底为#,栈顶为文法开始符号E*/

/*初始化存放待识别的表达式(终结符)的线性链表头*/

h=(struct Lchar*)malloc(sizeof(Lchar));

h->next=NULL;

p=h; /*开辟了一个空的链表空间,p和h同时指向该空间,该空间将作为终结符链表的头部。*/

printf("请输入要分析的字符串(#号结束)\n");

do{ /*输入待识别的表达式*/

ch=getchar();

putchar(ch); //在屏幕上输出一个字符

if(ch=='i'||ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='('||ch==')'||ch=='#') { /*将输入的ch存入链表*/

temp=(struct Lchar*)malloc(sizeof(Lchar));

temp->next=NULL;

temp->char_ch=ch;

h->next=temp;

h=h->next;/*如果输入正确,h不断的指向新输入的字符,而p始终指向输入终结符字符串的头位置,即前面开辟的空的链表空间。*/

}

else

{

temp=p->next; /*如果输入错误,提示输入有错,请重新输入,让temp指向输入字符串的头部,并将前面正确输出的字符串再次输出*/

printf("\nInput a wrong char!Input again:\n");

for(;;)

{

if (temp!=NULL)

printf("%c",temp->char_ch);

else

break;

temp=temp->next;

}

}

}while(ch!='#');

p=p->next; /*消去第一个空头节点,并使头结点指向非空线性链表表头*//*如果输入正确,h不断的指向新输入的字符,而输入字符串的头位置被记录在p里面。*/ h=p; /*h重新指向头结点,以便后面识别操作*/

dosome();/*开始识别*/

if(right)

printf("\n成功! 输入的表达式可以被该文法识别!\n");

else

printf("\n错误! 表示输入的表达式不可以被该文法识别!\n");

getch();

return 0;

}

3、测试数据及运行结果,运行结果截图应包含姓名或学号信息.

截图应包含一个正例i*(i+i)-i/i# 一个反例i*(i+i)-i-/i#

正例成功截图如下:

反例成功截图如下:

4、实验总结、心得体会

在进行此次实验上机前应该做好准备:①按照老师提供的教材P93页的图4.11预测分析程序的流程图熟悉预测分析的工作过程。②计算出要分析的文法的FIRST集合、FOLLOW集合和SELECT集合。③根据②得出的各个集合得出构造预测分析表。在老师讲解其实验目的、要求和分析后,选择相应的数据,使用C语言参照算法中的流程编写词法分析的程序。将编写好的程序上次调试(包括正例和反例)。通过此次程序设计,更加清楚的明白了LL(1)分

析法的过程,从而也比较熟练掌握了自上而下语法分析的基本思想,此外,在老师的讲解下初步认识了数据结构的知识,加上自己的理解,与所学知识加以联系,将知识归纳在系统中。在实现和调试时采取模块化的思想,是的本次课程设计比较顺利,增强了自己的信心,提高了自己的编程能力和动手能力以及独立分析问题、解决问题的能力和综合运用所学知识的能力。

5.思考:词法分析与语法分析的不同

区别:顾名思义,词法分析器检查的是词法,语法分析器分析的是语法,什么是词法,什么是语法。

所谓词法,源代码由字符流组成,字符流中包括关键字,变量名,方法名,括号等等符号,其中变量名要满足不能包括标点符号,不能以数字开头的数字与字母的字符串这个条件,对于括号要成对出现等等,这就是词法;而语法,词法没有问题才能进入语法分析,语法就是词排列的方法,字面意义,语法分析器就是分析类似这样的语法的。

C语言程序设计实验报告(实验大纲+过程)

《C程序设计》实验教学大纲 一、适用范围 大纲适用信息管理专业本科教学使用。 二、课程名称 C程序设计 三、学时数与学分 总学时:90 总学分:4 实验学时:28 实验学分:1 四、教学目的和基本要求 目的:通过C程序设计实验,培养学生对学习程序设计的兴趣,加深对讲授内容的理解,尤其是通过上机来掌握语法规则,使学生全面了解 C 语言的特点,熟练掌握 C 语言程序设计的基本方法和编程技巧。 基本要求:了解和熟悉C语言程序开发的环境;学会上机调试程序,善于发现程序中的错误,并且能很快地排除这些错误,使程序能正确运行,达到实验知识和理论知识的融会贯通。上机实验前,学生必须事先根据题目的内容编好程序,然后在实验时输入程序、调试程序、直至运行结果正确为止,上机结束后,应整理出实验报告。 注:带*的实验项目为选做实验项目 六、教材、讲义及参考书 《C程序设计题解与上机指导》谭浩强主编清华大学出版社 七、实验成绩评定办法 实验成绩=平时实验表现+实验报告。实验成绩占总成绩的20%。 实验成绩以等级形式给出,评定等级分优、良、中、及格、不及格五类。 1、平时考核:上机实验前,学生必须事先根据题目的内容编好程序,然后在实验时输入程序、调试程序、直至运行结果正确为止。在实验中,教师可根据学生编程操作能力、观察和分析及运用知识能力、程序编制正确性以及学生的课堂纪律、实验态度、保持实验室卫生等方面的表现进行综合考核。

2、实验报告:学生实验后应按时完成实验报告。 八、实验教学大纲说明 本大纲共安排28学时的实验,其中带*号实验项目为选做实验项目,实际课时为18学时。实验项目多为设计性实验项目,每个设计性实验项目中都包含数个小的设计性题目,其中带*号的题目为选做题目,有时间和有能力的同学可以选做。 九、实验项目 实验一C程序的运行环境和运行一个C程序的方法 一、实验目的 1.了解Visual C++6.0编译系统的基本操作方法,学会独立使用该系统。 2.了解在该系统上如何编辑、编译、连接和运行一个C程序。 3.通过运行简单的C程序,初步了解C源程序的特点。 二、实验内容 1.用编辑程序,输入教材第一章例1.1程序,并进行编译和运行。应了解所用的系统是用什么命令进行编译和连接运行的。编译和连接后所得到的目标程序的后缀是什么形式的? 2.编写一个C程序,输出以下信息: **************************** very good! **************************** 3.输入并运行教材第一章中例1.3,了解如何在运行时向程序变量输入数据。 实验二数据类型、运算符和表达式 一、实验目的 1.掌握C语言数据类型,熟悉如何定义一个整型、字符型、实型变量,以及对它们赋值的方法,了解以上类型数据输出时所用格式转换符。 2.学会使用C的有关算术运算符,以及包含这些运算符的表达式,特别是自加(++)和自减(--)运算符的使用。 二、实验内容 1.输入并运行以下程序: main( ) { char c1,c2; c1=97;c2=98; pr intf(“%c %c\n”,c1,c2); printf(“%d %d\n”,c1,c2); } 在此基础上 ①将第三行、第四行改为: c1=321;c2=353; 再使之运行,分析其运行结果。 ②将第二行改为: int c1,c2; 再使之运行,分析其运行结果。。 2.输入并运行以下程序:

C语言程序设计实验报告参考答案

长沙理工大学C语言实验报告参考答案 实验一熟悉C语言程序开发环境及数据描述四、程序清单 1.编写程序实现在屏幕上显示以下结果: Thedressislong Theshoesarebig Thetrousersareblack 答案: #include main() { printf("Thedressislong\n"); printf("Theshoesarebig\n"); printf("Thetrousersareblack\n"); } 2.改错题(将正确程序写在指定位置) 正确的程序为: #include main() {

printf("商品名称价格\n"); printf("TCL电视机¥7600\n"); printf("美的空调¥2000\n"); printf("SunRose键盘¥50.5\n"); } 2.编写程序:a=150,b=20,c=45,编写求a/b、a/c(商)和a%b、a%c(余数)的程序。 答案: #include main() { inta,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); } 4.设变量a的值为0,b的值为-10,编写程序:当a>b时,将b赋给c;当a<=b时,将a赋给c。(提示:用条件运算符) 答案: #include main() { inta,b,c; a=0; b=-10; c=(a>b)?b:a; printf("c=%d\n",c); }

实验四-循环结构汇编语言程序的设计实验报告

循环结构汇编语言程序设计实验报告

实验四循环结构汇编语言程序设计 一、实验目的 1、学习循环结构的汇编语言程序的设计和调试。 2、学习通过直接对8086计算机的寄存器和存的直接访问,编写更高效简洁的汇编程序。 3、加深掌握计算机整体的工作过程。 3、加深对排序算法的理解。 二、实验任务 编写程序求出数组A中(20个元素)的最大值和最小值(数组没有排序)。 要求至少采用二种不同的排序算法来实现。( 快速排序,归并排序、堆排序、Shell排序、插入排序、冒泡排序、交换排序、选择排序、基数排序……) 三、实验容 为了更好地实现老师所布置的实验任务,我们根据情况选取以下两种方式实

验。 1、利用冒泡排序的方式求解数组A中元素的最大值最小值。设计流程图如 下所示: 2、利用选择排序的方式求得数组A中元素的序列。设计流程图如下所示:

四、实验环境 PC机: winXP/win7(32位)/win7(64位)+winxp 虚拟机 汇编工具:Masm.exe+Link.exe。 五、实验步骤 1)建立和生成的文件 (1)编写的源程序,源程序名为abc、扩展名为.asm (2)源程序经汇编程序Masm.exe汇编(翻译)后生成二进制目标程序,文件名为abc.obj (3)目标程序需要经Link.exe连接生成可执行程序,文件名为abc.exe 2)汇编环境 最基本的汇编环境只需要两个文件:Masm.exe和Link.exe。将这两个文件拷入到已经建好的文件夹(例如 huibian)中,并将文件夹huibian放在硬盘根

目录C :\>下 3)上机步骤 进入DOS窗口中执行。 4)调试程序 进入DEBUG后,调试程序 5)调试成功后重新汇编、连接并生成可执行代码 6)执行程序,并对运行结果截图。 利用冒泡排序求得数组A中元素的最大值最小值的实验结果如下图所示:(说明:输入数据为:13,0,59,900,587,1,657,234,34,48) 利用选择排序对数组A中元素排序得到的序列得实验结果如下图所示:(说明:输入数据为13,0,59,900,587,1,657,234,34,48)

C语言程序设计实验实验指导书及答案

实验一熟悉C程序运行环境 班级学号姓名成绩 一、实验目的 1. 熟悉C语言Visual C++调试环境。 2. 掌握C程序的编辑、调试及运行。 二、实验内容 项目1. 调试并运行下面程序,并写出运行结果: #include <> int main() { printf(“Good morning!\n”); printf(“Hello,world!\n”); return 0; } 运行结果(注意,按照屏幕输出格式写): 项目2. 调试并运行下面程序,并写出运行结果: #include <> int main() { int a , b , sum; /*定义变量*/ a=23; b=56; /*为变量赋值*/ sum=a+b; /*计算两个变量的和*/ printf(“sum is %d\n”,sum); /*输出计算结果*/ return 0; } 运行结果:

项目3. 调试并运行下面程序,并写出运行结果: #include <> int max(int,int); int main() { int a , b , c; /*定义变量*/ a=23; b=56; /*为变量赋值*/ c=max(a,b); /*调用max函数,将得到的值赋给c*/ printf(“max is %d\n”,c); /*输出c的值*/ return 0; } int max(int x,int y) /*定义max函数,函数值为整型*/ { int z; /*定义变量*/ if(x>y) z=x; else z=y; return(z); /*将z的值返回*/ } 运行结果: 三、提高部分 1.试想,如果求10个数中的最大者,则程序该如何编写。 程序代码 运行结果:

C语言程序设计实验与习题答案

2.程序填空 (1)以下程序的功能是计算1~50之间能被7整除的整数之和。 #include void main() {int i,sum= 0; for(i=1;50;i++) if(i%7==0) sum+=i; printf("sum=%d\n",sum); } (2) 下面程序接收来自键盘的输入,直到输入+Z(值为-1)键为止。这些字符被原样输出,但若有连续一个以上的空格时只输出一个空格。请填空。 #include void main() {char cx; char front=’’; while ((cx=getchar())!=’\n’) {if (cx!=’’) putchar(cx); if (cx= =’’) if (front!=’’) putchar(cx); front=cx; } } 3.程序改错 (1)下列程序的功能是求1+3+5+…99的和。

#include void main( ) { int s,i; ★//int s=0,i; i=1; while(i<=99)s=s+i;★//{s=s+i;i++;} printf("1+3+5+…99的和是:%d\n",s); } (2)下面程序的功能是输入一个正整数,判断是否是素数,若 为素数输出1,否则输出0。 #include void main() { int i,x,y=0; ★//y=1 scanf("%d",&x); for(i=2;i<=x/2&&y;i++) if ((x%i)!=0) y=0; ★//x%i==0 printf("%d\n",y); } 4.设计性实验 (1)题 /* 方法(1)精度控制*/ #include

汇编语言学习知识程序设计实验

目录 目录 (1) 实验一利用DEBUG熟悉常用指令的使用 (2) 一、实验目的 (2) 二、示例 (2) 三、实验题 (2) 实验二汇编程序和连接程序的使用 (6) 一、实验目的。 (6) 二、示例。 (6) 三、实验题。 (8) 实验三顺序结构程序设计 (11) 一、实验目的 (11) 二、示例 (11) 三、实验题 (12) 四、实验报告 (15) 实验四循环结构程序设计 (16) 一、实验目的 (16) 二、示例 (16) 三、实验题 (18) 实验五分支结构程序设计 (21) 一、实验目的 (21) 二、示例 (21) 三、实验题 (22) 实验六子程序设计 (29) 一、实验目的 (29) 二、实验题 (29)

实验一利用DEBUG熟悉常用指令的使用 一、实验目的 熟悉指令系统,掌握常用指令的用法;通过实验加深对各种寻址方式的理解;能熟练使用DEBUG中的命令对指令进行反汇编,观察并了解机器代码。 二、示例 请分别用一条汇编语言指令完成如下功能:(过程略)。 1.用寄存器BX和SI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加,并把结果送到AL中。 ADD AL,[BX][SI] 2.用位移量为0520H的直接寻址方式把存储器中的一个字与3412H相加,并把结果送回该存储单元。 ADD WORF PTR [0520H],3412H 三、实验题 1.调试、验证下列指令的结果,已知(DS)=2000H,(BX)=0100H,(SI)=0002H,(BP)=0200H,(SS)=2300H,(20100)=12H,(20101)=34H,(20102)=56H,(20103)=78H,(21200)=2AH,(21201)=4CH,(21202)=B7H,(21203)=65H,(23204)=88H,说明各指令执行完后AX寄存器的内容。要求输入指令,相应存储单元的内容要事先设置,单步 P执行,观察执行结果。 (设置存储器的值)

高级语言程序设计实验C

陕西理工大学 学号: 姓名:

目录 实验一:C开发环境与顺序结构程序设计 (1) 1.实验目的: (1) 2.实验环境: (1) 3.实验步骤: (1) 41 58 9 1.9 2.9 3.9 4.17 18 1.18 2.18 3.18 4.19 19 1.20 2.实验内容: (20) 3.实验总结 (23)

实验一:C开发环境与顺序结构程序设计 1 Array 2 3 4.实验内容: 4.1 输入并运行下列程序,查看程序运行的结果。 #include

void main() { printf(“* * * * * * * * * *\n”); printf(“Programing in c A Labrtry Maual\n”); printf(“* * * *\n”); printf(“*\n”); } 4.2查看程序运行的结果 #include void main() { int i,j,m,n; i=8; j=10; m=++i; n=j--; printf(“%d,%d,%d,%d\n”,i,j,m,n); } 4.3找出下列程序中的错误,改正后写出程序运行结果. #include void main() { Int x,y=z=5,aver; x=7; AVER=(x+y+z)/3 printf(“AVER=%d\n”,aver); }

4.4输入参考程序。在下划线处分别填入不同的变量定义、表达式、输出格式控制符号。 #include void main() { int a,b,x; //数据类型定义 a=5; b=10; x=a+10; //表达式 printf(“%d”,x); //格式控制符 } 该程序的执行结果为:15 当数据类型说明符为int 时,对应的格式控制符为%d ; 当数据类型说明符为long 时,对应的格式控制符为%l ;; 当数据类型说明符为float 时,对应的格式控制符为%f ; 当数据类型说明符为double 时,对应的格式控制符为%lf ; 当数据类型说明符为char 时,对应的格式控制符为%c ; 仅当表达式更改为1/2*a*b 时,程序执行结果为0 ; 仅当表达式更改为0.5*a*b 时,程序执行结果为25 (2)求从键盘上输入的两个整数之和,完成程序并将结果输出。 源程序: #include void main( ) { int x,y,z; scanf("%d%d",&x,&y);

汇编语言程序设计课后习题解答宋人杰2版

第1章汇编语言基础知识 1.简述汇编语言源程序、汇编程序、和目标程序的关系。 答:用汇编语言编写的程序称为汇编源程序;汇编源程序在汇编程序的翻译下转换成计算机语言变成目标程序。 2. 简述汇编语言的优缺点。 答:(1) 汇编语言的优点: ①可有效地访问、控制计算机各种硬件设备,如磁盘、存储器、CPU、I/O端口等。. ②目标代码简短,占用内存少,执行速度快,是高效的程序设计语言。 ③可与高级语言配合使用,应用十分广泛。 (2) 汇编语言的缺点: ①通用性和可移植性较差 ②相对于高级语言来说较繁锁、易出错、不够直观。 3.CPU的寻址能力为8KB,那么它的地址总线的宽度为多少? 答:13 4. 1KB的存储器有多少个存储单元? 答:1024个字节。 5. 指令中的逻辑地址由哪两部分组成? 答:指令中的逻辑地址由段基址和偏移量组成。 6. 以下为用段基址:偏移量形式表示的内存地址,试计算它们的物理地址。 (1) 12F8:0100 (2) 1A2F:0103 (3) 1A3F:0003 (4) 1A3F:A1FF 答: (1) 13080H (2) 1A3F3H (3) 1A3F3H (4) 245EFH 7. 自12FA:0000开始的内存单元中存放以下数据(用十六进制形式表示): 03 06 11 A3 13 01,试分别写出12FA:0002的字节型数据、字型数据及双字型数据 的值。 答:字节型数据:11H 字型数据:0A311H 双字型数据:0113A311H 8. 内存中某单元的物理地址是19318H,段基地址为1916H,则段内偏移地址为 多少?若段内偏移地址为2228H,则段基地址为多少? 答:若段基地址为1916H,则段内偏移地址为01B8H;若段内偏移地址为2228H,则段基地址为170FH 9. 在实模式环境中,一个段最长不能超过多少字节? 答:64KB 10. 实模式可寻址的内存范围是多少? 答:1MB

C语言程序设计实验报告(数组)

C语言程序设计实验报告(数组) 1实验目的 (1)熟练掌握一维数组,二维数组的定义,初始化和输入、输出方法; (2)熟练掌握字符数组和字符串函数的使用; (3)掌握与数组有关的常用算法(查找、排序等)。 2实验内容 编写函数catStr(char str1[],char str2[])用于进行两个字符串的连接,编写函数lenStr(char str[])用于统计一个字符串的长度,并在主函数中调用。 要求: 1、不允许用strcat()和strlen()字符处理库函数; 2、在主函数以直接初始化的方式输入两个字符串str1和str2.调用函数 strlen()计算并返回两个字符串的长度; 3、调用函数catstr()连接两个字符串(将str2连接在str1后面); 4、调用函数lenstr()计算并返回连接后字符串的长度; 5、在主函数中输入两个原始的字符串及几个字符串的长度,以及处理后字 符串及其长度。

3算法描述流程图

4源程序 #include #include void catStr(char str1[],char str2[]) { int i,j; for (i=0;str1[i]!='\0';i++); for(j=0;str2[j]!='\0';j++) str1[i+j]=str2[j]; str1[i+j]='\0'; } lenStr(char m[] ) {int i;

for (i=0;m[i]!='\0';i++); printf("%d",i); } void main() {char s1[50]="forever",s2[50]="more"; printf("s1=%s,s2=%s",s1,s2); printf("\ns1的长度:"); lenStr(s1); printf("\ns2的长度:"); lenStr(s2); catStr(s1,s2); printf("\n连接后的字符:"); printf("%s\n",s1); printf("连接后字符的长度:"); lenStr(s1); printf("\n"); } 5测试数据 s1=forever, s2=more 6运行结果 7出现问题及解决方法 在输入程序时,少写了半边引号,调试时发现存在错误,找到了错误并加以改正。无论什么事,细心都是必不可少的,认真是解决问题的关键。 8实验心得 通过本次实验,对于函数的定义和声明,数组以及循环语句有了进一步的认识,掌握了字符数组和字符串函数的使用,以及与数组有关的常用算法。此次实验不是调用strlen()和strcat()函数,而是通过自己设计程序来进行字符串的连接以及计量字符串的长度,由此我学会了如何去理清自己的思路来设计程序。

51汇编语言程序设计

第四章MCS-51汇编语言程序设计 重点及难点: 单片机汇编语言程序设计的基本概念、伪指令、单片机汇编语言程序的三种基本结构形式、常用汇编语言程序设计。 教学基本要求: 1、掌握汇编语言程序设计的基本概念; 2、掌握伪指令的格式、功能和使用方法; 3、掌握顺序结构、分支结构和循环结构程序设计的步骤和方法; 4、掌握常用汇编语言程序设计步骤和方法。 教学内容 §4.1汇编语言程序设计概述 一、汇编语言的特点 (1)助记符指令和机器指令一一对应,所以用汇编语言编写的程序效率高,占用存储空间小,运行速度快,因此汇编语言能编写出最优化的程序。 (2)使用汇编语言编程比使用高级语言困难,因为汇编语言是面向计算机的,汇编语言的程序设计人员必须对计算机硬件有相当深入的了解。 (3)汇编语言能直接访问存储器及接口电路,也能处理中断,因此汇编语言程序能够直接管理和控制硬件设备。 (4)汇编语言缺乏通用性,程序不易移植,各种计算机都有自己的汇编语言,不同计算机的汇编语言之间不能通用;但是掌握了一种计算机系统的汇编语言后,学习其他的汇编语言就不太困难了。 二、汇编语言的语句格式 [<标号>]:<操作码> [<操作数>];[<注释>] 三、汇编语言程序设计的步骤与特点 (1)建立数学模型 (2)确定算法 (3)制定程序流程图 (4)确定数据结构 (5)写出源程序 (6)上机调试程序 §4.2伪指令 伪指令是程序员发给汇编程序的命令,也称为汇编命令或汇编程序控制指令。 MCS- 51常见汇编语言程序中常用的伪指令:

第四章MCS-51汇编语言程序设计91 1.ORG (ORiGin)汇编起始地址命令 [<标号:>] ORG <地址> 2.END (END of assembly)汇编终止命令 [<标号:>] END [<表达式>] 3.EQU (EQUate)赋值命令 <字符名称> EQU <赋值项> 4.DB (Define Byte)定义字节命令 [<标号:>] DB <8位数表> 5.DW (Define Word)定义数据字命令 [<标号:>] DW <16位数表> 6.DS (Define Stonage )定义存储区命令 [<标号:>] DW <16位数表> 7.BIT位定义命令 <字符名称> BIT <位地址> 8.DA TA数据地址赋值命令 <字符名称> DATA <表达式> §4.3单片机汇编语言程序的基本结构形式 一、顺序程序 [例4-1]三字节无符号数相加,其中被加数在内部RAM的50H、51H和52H单元中;加数在内部RAM的53H、5414和55H单元中;要求把相加之和存放在50H、51H和52H单元中,进位存放在位寻址区的00H位中。 MOV R0 ,# 52H ;被加数的低字节地址 MOV R1 ,# 55H ;加数的低字节地址 MOV A ,@ R0 ADD A ,@ R1 ;低字节相加 MOV @ R0 , A ;存低字节相加结果 DEC R0 DEC R1 MOV A ,@ R0 ADDC A ,@ R1 ;中间字节带进位相加 MOV @ R0 , A ;存中间字节相加结果 DEC R0 DEC R1 MOV A ,@ R0 ADDC A ,@ R1 ;高字节带进位相加 MOV @ R0 , A ;存高字节相加结果 CLR A

汇编语言程序设计实验报告

微机原理实验报告 实验名称汇编语言程序设计 一、实验目的 1、掌握Lab6000p实验教学系统基本操作; 2、掌握8088/8086汇编语言的基本语法结构; 3、熟悉8088/8086汇编语言程序设计基本方法 二、实验设备 装有emu8086软件的PC机 三、实验内容 1、有一个10字节的数组,其值分别是80H,03H,5AH,FFH, 97H,64H,BBH,7FH,0FH,D8H。编程并显示结果:如果数组是无符号数,求出最大值,并显示; 如果数组是有符号数,求出最大值,并显示。 2、将二进制数500H转换成二-十进制(BCD)码,并显示“500H 的BCD是:” 3、将二-十进制码(BCD)7693转换成ASCII码,并显示“BCD 码7693的ASCII是:” 4、两个长度均为100的内存块,先将内存块1全部写上88H,再 将内存块1的内容移至内存块2。在移动的过程中,显示移动次数1,2 ,3…0AH…64H(16进制-ASCII码并显示子程序) 5、键盘输入一个小写字母(a~z),转换成大写字母 显示:请输入一个小写字母(a~z): 转换后的大写字母是: 6、实现4字节无符号数加法程序,并显示结果,如99223344H + 第1页

99223344H = xxxxxxxxH 四、实验代码及结果 实验代码见代码附录 1.1程序运行结果 图1 无符号最大值结果截图 1.1 程序运行结果

图2 有符号最大值截图2.0 程序运行结果

图3 BCD码显示3.0 程序运行结果

图4 ASCII码显示4.0 程序运行结果

图5 移动次数显示5.0 程序运行结果

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;

8086汇编语言程序设计

实验1 简单汇编语言程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握简单汇编语言程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG 工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG 工具调试程序,验证程序的正确性。 1. 若X、Y、R、W 是存放8 位带符号数字节单元的地址,Z 是16 位字单元的 地址。试编写汇编程序,完成Z←((W-X) ÷5-Y)?(R+ 2) 。 2.试编写一个程序,测试某数是否是奇数。如该数是奇数,则把DL 的第0 位置1,否则将该位置0。 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

实验2 分支及循环程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握分支程序和循环程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,汇编连接汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。 1.编写汇编程序,统计某存储区若干个数据中英文字母的个数,并将结果在屏幕上显示。 2.从键盘任意输入一组字符数据,请编写汇编程序将该组数据加密后在屏幕上显示。参考加密方法是:每个数乘以2。(说明:本题的加密方法,同学们可以自己拟定) 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

实验3 子程序程序设计 一、实验目的与要求 1.熟悉汇编语言运行、调试环境及方法。 2.掌握子程序的设计方法。 3.熟悉调试工具DEBUG,并运用DEBUG工具调试程序。 二、实验内容 根据下列要求,编写汇编源程序,并利用DEBUG工具调试程序,验证程序的正确性。 1.编程以十进制形式和十六进制形式显示AX的内容,并把两个显示功能分别封装成子程序dispDEC和dispHEX。 2.设在以EXAMSCORE为首地址的数据缓冲区依次存放某班10名同学5门功课的成绩,现要统计各位同学的总分,并将总分放在该学生单科成绩后的单元,并调用第1个程序封装好的子程序,以十进制方式显示统计情况,显示格式自行设计。请编程完成此功能。数据缓冲区参考数据定义如下: EXAMSCORE DB 01 ;学号 DB 89,76,54,77,99 ;单科成绩 DW ? ;该学生的总分 DB 02 ;学号 DB 79,88,64,97,92 ;单科成绩 DW ? ;该学生的总分 三、实验报告要求 1.程序算法流程图。 2.源程序清单。 3.程序运行结果。 4.调试过程中遇到的问题和解决的方法。

汇编语言程序设计实验篇emu

1.汇编语言程序设计实验篇 1.1.汇编系统软件简介 Emu8086-Microprocessor Emulator是集源代码编辑器、汇编/反汇编工具以及debug 的模拟器。它能模拟一台"虚拟"的电脑运行程序,拥有独立的“硬件”,避免访问真实硬件。该软件兼容Intel的下一代处理器,包括PentiumII、Pentium4。利用该软件提供的调试工具,能够单步跟踪程序,观察程序执行过程中寄存器、标志位、堆栈和内存单元的内容。 1.1.1创建程序 https://www.doczj.com/doc/4212588053.html, TEMPLATE程序 本章与指令相关的实验都是用COM TEMPLATE类型的程序完成的。打开emu8086,在“welcome…”对话框中,单击按钮,创建文件。 在“choose code template”对话框中,选择“COM template-simple and tiny executable file format, pure machine code.”后,单击按钮。

在如所示的编辑界面中,在“;add your code here”部分输入相应的指令,第一条指令默认的偏移地址为100h。 输入全部指令后,单击按钮,保存相应的程序段。 2.EXE TEMPLATE程序 本章与DOS功能调用和汇编源程序相关的实验都是用EXE TEMPLATE程序完成的。打开emu8086,在“welcome…”对话框中,单击按钮,创建文件。

在“choose code template”对话框中,选择“EXE template-advanced executable file.header: relocation, checksum.”后,单击按钮。 在如图所示的编辑界面中,已经可以给出了源程序的框架,包含数据段、堆栈段和代码段的定义以及必要的功能调用等,在“add your data here”和“;add your code here”部分可以分别输入相应的变量定义和指令。

C语言程序设计实验手册

实验手册使用及要求 实验操作是教学过程中理论联系实际的重要环节,而实验报告的撰写又是知识系统化的吸收和升华过程,因此,实验报告应该体现完整性、规范性、正确性、有效性。现将实验报告撰写的有关内容说明如下: 1、实验前按实验要求手写程序或程序填空,并走查代码,有疑问处标记,上机时在C语言集成开发环境下输入并调试手写程序,分析运行结果。 2、实验结束后填写通过后的源程序和对实验的总结。 3、通过后的源程序可以手写也可以打印粘贴。 实验项目一览表

实验一熟悉C语言编程环境 实验目的: 1.熟悉C语言编程环境(VC++、Cfree、Turboc2.0等) 2.了解C程序的基本框架 3.理解程序调试的思想,能找出并改正C程序中的错误 实验内容: 1.1 建立自己的文件夹:在磁盘上建立一个文件夹,用于存放自己的C程序 1.2 编程示例 在屏幕上显示一个短句“Programming in C is fun!”(教师示例,学生模仿并创新,如输出汉字、特除字符等。学会使用编程环境VC++,启动、编辑、编译、运行、保存、关闭、打开)1.3 编程 在屏幕上显示如下网格。 +---+---+ | | | | | | +---+---+ 1.4 调试示例 改正下列程序中的错误,在屏幕上显示“Welcome to You !”。(掌握找错、改错的方法) 源程序: # include int mian(void) { printf(Welcome to You! \n") getchar(); return 0; } 注:需要修改的语句直接在程序上标注并修改 实验总结:

新版汇编语言程序设计钱晓捷第1章习题答案

第1章汇编语言基础知识(全) 2010-10-18 19:32:40| 分类:答案集锦| 标签:|字号大中小订阅 第1章汇编语言基础知识 〔习题1.1〕简述计算机系统的硬件组成及各部分作用。 〔解答〕 CPU:包括运算器、控制器和寄存器组。运算器执行所有的算术和逻辑运算;控制器负责把指指令逐条从存储器中取出,经译码分析后向机器发出各种控制命令,并正确完成程序所要求的功能;寄存器组为 处理单元提供所需要的数据。 存储器:是计算机的记忆部件,它用来存放程序以及程序中所涉及的数据。 外部设备:实现人机交换和机间的通信。 〔习题1.2〕明确下列概念或符号: 主存和辅存,RAM和ROM,存储器地址和I/O端口,KB、MB、GB和TB 〔解答〕 主存又称内存是主存储器的简称,主存储器存放当前正在执行的程序和使用的数据,CPU可以直接存取,它由半导体存储器芯片构成其成本高、容量小、但速度快。辅存是辅助存储器的简称,辅存可用来长期保存大量程序和数据,CPU需要通过I/O接口访问,它由磁盘或光盘构成,其成本低、容量大,但速 度慢。 RAM是随机存取存储器的英语简写,由于CPU可以从RAM读信息,也可以向RAM写入信息,所以RAM也被称为读写存储器,RAM型半导体存储器可以按地址随机读写,但这类存储器在断电后不能保存信息;而ROM中的信息只能被读出,不能被修改,ROM型半导体通常只能被读出,但这类存储器断电 后能保存信息。 存储器由大量存储单元组成。为了区别每个单元,我们将它们编号,于是,每个存储单元就有了一个存储地址,I/O接口是由一组寄存器组成,为了区别它们,各个寄存器进行了编号,形成I/O地址,通常 称做I/O端口。 KB是千字节、MB是兆字节、GB是吉字节和TB是太字节,它们都是表示存储器存储单元的单位。 〔习题1.3〕什么是汇编语言源程序、汇编程序、目标程序? 〔解答〕 用汇编语言书写的程序就称为汇编语言源程序;完成汇编工作的程序就是汇编程序;由汇编程序编 译通过的程序就是目标程序。

C语言程序设计实验报告(实验1-12)

文档从网络中收集,已重新整理排版.word版本可编辑.欢迎下载支持. 《C语言程序设计》 实验报告 2013~2014学年第二学期 班级 姓名 学号 指导教师

实验一 实验项目名称:C程序的运行环境和运行C程序的方法 所使用的工具软件及环境:Visual C++ 6.0 一、实验目的: 1.了解在Visual C++ 6.0环境下如何编辑、编译、连接和运行一个C程序; 2.通过运行简单的C程序,初步了解C源程序的特点。 二、预习内容: 教材《C语言程序设计教程》第1章。 三、实验内容: 1. 在Visual C++ 6.0环境下输入并运行下面的程序: #include int main( ) { printf("This is a C program.\n"); return 0; } 2. 在Visual C++ 6.0环境下输入下面的程序(有语法错误),编译、连接、调试该程序,直至程序 无语法错误,然后运行程序,并观察分析运行结果。 #include int main( ) { int a,b,sum a=3; b=4; sun=a+b; print(“%d+%d=%d\n”,a,b,sum); return 0; } 四、实验结果: 1. 运行结果(或截图): This is a C program. Press any key to continue

2. (1) 改正后的源程序: #include int main( ) { int a,b,sum; a=3; b=4; sum=a+b; printf("%d+%d=%d\n",a,b,sum); return 0; } (2) 运行结果(或截图): 3+4=7 五、思考题: 1. 一个C程序上机的步骤有哪些? 答:上级输入与编辑源程序—对原程序进行编译–与库函数链接–运行可执行的目标程序。 2. 组成C程序的基本单位是函数,一个函数包括哪几个部分? 答:一个函数包括两部分:分别为函数头或函数首部和函数体。 成绩指导教师签名 实验二 实验项目名称:数据类型、运算符和表达式 所使用的工具软件及环境:Visual C++ 6.0 一、实验目的: 1.掌握整型、实型与字符型这三种基本类型的概念; 2.掌握常量及变量的使用方法; 3. 掌握基本算术运算符及其表达式的使用方法; 4. 掌握++、--运算符、赋值运算符及其表达式的使用方法。 二、预习内容:

java程序设计语言实验

实验名称实验四字符串与位操作 一.实验目的 1、了解和掌握汇编语言中字符串操作; 2、了解和掌握汇编语言中位操作; 3、了解和掌握汇编语言中条件设置字节指令; 二.实验内容 1、请简述IA-32系列处理器提供字符串操作指令的原因。 2、请简述IA-32系列处理器新增条件设置字节指令的原因。 3、常用的串操作指令有哪几类?除此之外还有什么类型的串操作指令? 4、串操作指令能够操作哪几种尺寸的字符? 5、字符串操作指令的源操作数和目标操作数在哪里?编写一个C程序,由用户输入一个十进制 整数,统计其各位中7出现的次数,并输出统计结果。采用一个子程序进行统计。根据5.1.1说明的VC2010的编译配置选项,生成对应汇编语言形式的目标代码,观察分析主函数main 和子程序对应的目标代码。 6、字符串传送指令功能上相当于先后执行了字符串装入和字符串存储2条指令,请问两种方法 有什么区别? 7、请说明DF标志的作用以及改变DF标志的方法。(除了采用CLD和STD指令外,还有其他 方法吗?) 8、请举例说明重复前缀的用途。 9、请说明指令“LODSD”与如下程序片段的异同: MOV EAX,[ESI] ADD ESI, 4 10、条件设置指令和条件指令有何异同? 下列编程题,除了输入和输出操作之外,请采用嵌入汇编的形式实现: 11、请编写程序ex41实现如下功能:由用户从键盘输入一个字符串;然后,统计该字符串中各个 英文字母出现的个数;最后,输出这些统计结果。 12、请编写程序ex42实现如下功能:由用户从键盘输入两个字符串str1和str2;然后,确定str2 在str1中出现的起始位置(如果不出现,则起始位置是-1);最后,显示输出起始位置。 13、请编写程序ex43实现如下功能:由用户从键盘输入两个字符串str1和str2;然后,确定str1 中的首个没有在str2中出现的字符位置(如果都出现,则位置为-1);最后,显示输出位置。(12、13任选一题) 14、请充分运用字符串操作指令编写程序ex44实现如下功能:由用户从键盘输入一个字符串;然 后,过滤掉其中可能出现的标点符号;最后,显示输出过滤后的字符串。 15、请充分运用字符串操作指令和重复前缀编写程序ex45实现如下功能:由用户从键盘输入两个 字符串;然后,把两个字符串合并到一起;最后,显示输出合并后的字符串。请采用子程序实现两个字符串的合并。 16、请编写程序ex46实现如下功能:由用户从键盘分别输入一个字符ch和一个数值n;然后, 生成一个由字符ch构成的n个字符的字符串;最后,显示输出该字符串。请采用子程序实现生成 第1页,共2页 教务处制

C语言程序设计实验-答案

-前言- /*非常感谢度娘以及各位网上C语言高手的支持,才能让敝人完成此文档的整理。 本文档集合了本人、度娘、众网友的力量,其中代码的正确率约为90%(不正确的有标注)。为回报度娘及众网友的帮助,本文档免费下载。 */ /*配“电子科技大学出版社(周信东主编)”的C语言程序设计实验*/ /*努力吧,骚年以及学妹们!*/ /*整理ed by 口玉刀一of GUET.*/ ===================== 实验一C语言程序初步 ===================== 1.---------------------------- 已知a=5,b=4,c=6,求出s并换行 #include"stdio.h" main() { int a,b,c,s; a=5;b=4;c=6; s=(a+b+c)/3; printf("a=%d,b=%d,c=%d\n,s=%d",a,b,c,s); } 2.------------------------------- 输入一个数字求他的平方 #include main() { int r,s; scanf("%d",&r); s=r*r; printf("s=%d\n",s); } 3.-------------------------------- (1) #include main() { printf(" *\n"); printf("***\n"); printf(" *\n"); } (2) #include

{ int v; int a,b,c; //a,b,c aer sides,v is volume of cube a=3;b=3;c=5; v=a*b*c; printf("v=%d\n",v); } ================================= 实验二数据类型、运算符和表达式 ================================= 1. (1)-------------------------------------------------- //总觉得打印结果怪怪的,DO YOU THINK SO? main() { char s1='3',s2='4',s3='5'; int c1=101,c2=102; printf("3%c\t4%c\t5%c\n",s1,s2,s3); //3%c为输出3和%c printf("s1=%d\ts2=%d\ts3=%d\n",s1,s2,s3);//注意哦,s1,s2,s3是char!而%d:输入输出为整形%ld 长整型%hd 短整型%hu无符号整形%u %lu%s:输入输出为字符串%c字符%f:输入输出为浮点型%lf双精度浮点型printf("c1=%d\t~%c\n",c1,c1); //换码符'\t',表示水平制表位(horizeontal tab),它的作用是将光标移到最接近8的倍数的位置 printf("c2=%d\t~%c\n",c2,c2); //注意c1,c2的类型 } (2) //运行结果为8.300000 %是求余数先运算x-y,把结果转换为int型的有利于四则运算 main() { float x=8.3,y=4.2,s; int a=7; s=x+a%5*(int)(x-y)%2/3; printf("s=%f",s); }

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