第四章 程序编写
C语言程序设计第4章
4.2.2 逻辑表达式
例:设a=3,b=4,x=0,y=0,求值: 结果:0 1、a < b && x > y 结果:1 2、a = = b || x = = y 3、! a || a > b 结果:0 4、! a && b || x > y 结果:0 5、int a=-1,b=1,c=2,d=3,m=5,n=2,k; k=(m=a+b)&&(n=c+d) k为0 ,m为0, n为2
当尝试对该程序进行编译时,C语言编译器会报告 "illegal else without matching if"的语法错误。 28
4.3.4使用if语句应注意的问题
void main() { int x; x=1; if(x==1) printf("x等于1\n"); else ; /*这里多加了个分号*/ printf("x不等于1\n"); }
if(表达式) 语句1 else 语句2
真 表达式 语句1 语句2 假
如果括号内的表达式为真,则执行括号后面的 语句1。如果表达式值为假,则执行else后面的 语句2;语句1和语句2只能有一个被执行。
21
4.3.2 else子句
【例4-2】输入两个整数,将较大者输出。 /*程序4-2*/ #include<stdio.h> void main () { int a, b, max; printf("Please input the data a and b:"); scanf("%d, %d",&a, &b); if(a>=b) max=a; else max=b; printf("The max is %d\n", max); }
湖南省C语言(上)教案:第四章分支结构程序设计(高教版).doc
第四章分支结构程序设计分支程序设计章节练习题四、选择题1.若x=0,y=3,z=3,以下表达式值为0的是A. !xB.x<y? 1:0C. x%2&&y==zD. y=x||z/32.以下运算符中优先级最低的运算符为 ,优先级最高的为。
A. &&B. !C. !=D. ||E. ?:F. ==3.若w=1,x=2,y=3,z=4,则条件表达式w<x?w:y<z?y:z的结果为。
A. 4B. 3C. 2D. 14.若w,x,z均为int型变量,则执行以下语句后的输出为。
w=3;z=7;x=10;printf("%d\n",x>10?x+100:x-10);printf("%d\n",w++||z++);printf("%d\n",!w>z);printf("%d\n",w&&z);A. 0B. 1C. 0D. 01 1 1 11 1 0 01 1 1 05.分析以下程序, 下列说法正确的是。
main(){ int x=5,a=0,b=3;if(x=a+b) printf("* * * *\n");else printf("# # # #\n");}A. 有语法错,不能通过编译B. 通过编译,但不能连接C. 输出* * * *D. 输出# # # #6.分析以下程序, 下列说法正确的是。
main(){ int x=0,a=0,b=0;if(x=a+b) printf("* * * *\n");else printf("# # # #\n");}A. 有语法错,不能通过编译B. 通过编译,但不能连接C. 输出* * * *D. 输出# # # #7.分析以下程序, 下列说法正确的是。
C语言程序设计-第四章简单计算器小程序-分支程序设计
P1 逻辑运算符 P2
或
逻辑运算符 P2
课堂练习: 求下面逻辑表达式的值: 2>1 && 4 && 7<3+!0
值为0
等价于((2>1)&&4)&&(7<(3+(!
1 条件运算符和条件表达式 1.2 逻辑运算—逻辑运算的重要规则
a&&b:当a为0时,不管b为何值,结果为0
课堂练习:有下面定义的语句和逻辑表达式: int a=0,b=10,c=0,d=0 a && b && (c=a+10,d=100) 逻辑表达式执行后,a,b,c,d的值各为多少?
任务实现效果演示 例题源代码:switchcalculator.c
相关知识 1. switch语句 2. break语句
1 switch多分支选择结构
❖ 尽管用if…else if结构可以实现多分支,注但意当:分常支量较表多达时式,必程须序是结整构型较、复字杂符。型或枚举类型,不能是 实型表达式,每个case关键字后的常量表达式应互不相同
值为0 等价于i==(k>j),值为1
1 条件运算符和条件表达式 1.2 逻辑运算—逻辑运算符与逻辑表达式
&&(逻辑与)、||(逻辑或)、!(逻辑非)(单目)
逻辑表达式的一般形式:
优先级: 1.由低到高: ||→ && → !; 2.多种运算符一起: = →|| →&& →关系运算符 →算术运算符→ !。
【】 简单计算器小程序:由用户输入运算数和四则运算符(+、-、*、/),输出计算结果。
【】
VFP 第四章 程序设计01课件
26
• 例8、随机产生一个70~80之间的数(例8 .PRG) • 例9、从2开始,计算偶数之和,直到和大于10000为止,并显示最后一个
在VFP环境下,通过系统提供的菜单命令,来完成各种操作。 3、程序文件方式
程序文件(简称程序),也叫做命令文件。将对数据库资源进行 操作管理的命令和对系统环境进行设置的命令,集中在一个扩展名 为(.PRG)的命令文件中,然后在运行该命令文件。
2
程序文件的建立与编辑
• 在VFP环境下,建立和编辑程序文件有两种方式:命令方式和菜单 方式 1、命令方式:在命令窗口中输入
• 实际上VFP只运行目标程序。对于新建的或已被修改的 VFP程序,执行DO命令是,VFP会自动对它编译并产生 与主名相同的目标程序,然后执行该目标程序。(例如 ,执行 DO QH时,将先编译产生 QH.FXP,然后运行 QX.FXP。)
• 目标程序的扩展名因源程序而异,.PRG的目标程序名是 .FXP,查询程序的目标扩展名为.QPX。
14
例3:对JS表,找到gh为‘A0002’的记录,如果此人的基本工资少于600,就将基本工 资增加100元(例3.PRG)
双向分支结构
• 根据一逻辑表达式的值,有条件的执行一组命令。语法:
IF 逻辑表达式 程序组1
ELSE 程序组2
ENDIF • 逻辑表达式代表一逻辑值,如果这逻辑值为真,系统执行程序组1,否则执
例: WAIT “请检查输入内容” WINDOW AT 12,20 TIMEOUT 10
《C语言程序设计课件》第四章-数组
#include <stdio.h> #define N 10 int main(void)
{ int a[N], i; printf("Enter %d numbers: ", N);
for (i = 0; i < N; i++)
for(i=0;i<1;i++) if (a[i]>a[i+1]) { t=a[i];a[i]=a[i+1];a[i+1]=t; }
a[0]
20
a[1]
02
a[2]
44
a[3]
55
a[4]
88
a[5]
99
for(i=0;i<5;i++) if (a[i]>a[i+1]) { ……}
for(i=0;i<4;i++) if (a[i]>a[i+1]) { ……}
4.2 一维数组
一维数组主要用来存储一组类型相同并且数量一定 的数据。其中,每个数据称为数组的一个元素。
4.2.1 一维数组定义 一维数组的定义形式如下: 类型名 数组名[常量表达式]; int x[100]; char string[10]; double data[10];
常量表达式给出了数组的长度,在C语 言中定义数组时必须确定数组的长度。
600
xxx[[[654]]]
700
xxx[[[765]]]
800
xxx[[[876]]]
900
xxx[[[987]]]
数控机床的程序编写
前言现代科学技术的发展极大地推动了不同学科的交叉与渗透,引起了工程领域的技术改造与革命。
在机械工程领域,由于微电子技术和计算机技术的迅速发展及其向机械工业的渗透所形成的机电一体化,使机械工业的技术结构、产品机构、功能与构成、生产方式及管理体系发生了巨大变化,使工业生产由“机械电气化”迈入了“机电一体化”为特征的发展阶段。
机电一体化主要体现在数控技术及应用上,在这次实训中,感触最深的是了解了数控机床在机械制造业中的重要性,它是电子信息技术和传统机械加工技术结合的产物,它集现代精密机械、计算机、通信、液压气动、光电等多学科技术为一体,具有高效率、高精度、高自动和。
摘要数控技术是机械加工自动化的基础,是数控机床的核心技术,其水平高低关系到国家战略地位和体现国家综合国力的水平,近年来,PLC在工业自动控制领域应用愈来愈广,它在控制性能、组机周期和硬件成本等方面所表现出的综合优势是其它工控产品难以比拟的。
随着PLC技术的发展, 它在位置控制、过程控制、数据处理等方面的应用也越来越多。
在机床的实际设计和生产过程中,为了提高数控机床加工的精度,对其定位控制装置的选择就显得尤为重要。
FBs系列PLC的NC定位功能较其它PLC更精准,且程序的设计和调试相当方便。
本文提出的是如何应用PLC的NC定位控制实现机床数控系统控制功能的方法来满足控制要求,在实际运行中是切实可行的。
整机控制系统具有程序设计思路清晰、硬件电路简单实用、可靠性高、抗干扰能力强,具有良好的性能价格比等显著优点,其软硬件的设计思路可供工矿企业的相关数控机床设计改造借鉴。
目录第一章:概述1.1、数控机床的发展趋势 (1)1.2、数控机床的发展历史 (2)第二章:数控加工的特点与刀具2.1、数控机床的特点 (3)2.1.1、数控车床的5大特点 (4)2.2、数控机床的常用种类 (4)2.3、数控机床的刀具选择与应用 (5)第三章:数控机床的程序编写3.1、数控机床的编程 (6)3.1.1、数控机床的自动编程内容与步骤 (6)3.1.2、数控机床编程的基本概览 (9)3.2、数控机床常用术语 (9)第四章:数控车床程序编程 (11)第一章概述1.1、数控机传递个发展趋势数控机床数字控制机床是用数字代码形式的信息(程序指令),控制刀具按给定的工作程序、运动速度和轨迹进行自动加工的机床,简称数控机床。
第4章 MCS-51单片机汇编语言程序设计
程序清单:
送转移地址序号
A,R3 ;取序号 A ;序号乘2 DPTR, #JTAB ;32个子程序 首地址送DPTR JMP @A+DPTR ;根据序号转移 JTAB: AJMP ROUT00 ;32个子程序首地址 AJMP ROUT01 … MP: MOV RL MOV AJMP ROUT31
第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计
【例4-1】
双字节二进制数求补。
程序说明:对R3(高8位)、R2(低8位)中的二进制定 点数取反加1即可得到其补码。
开始
程序清单:
BINPL:MOV A,R2 CPL A ADD A,#01H MOV R2,A MOV A,R3 CPL A ADDC A,#00H MOV R3,A RET ;低位字节取反 ;加1 ;低位字节补码送R2 ;高位字节取反 ;加进位 ;高位字节补码送R3
散转生成正确偏移号
置换指令地址表首址
转入R3指示的程序
AJMP
……
AJMP
第 四 章 MCS-51 单 片 机 汇 编 语 言 程 序 设 计
3.循环程序
包括:循环初始化、循环处理、循环控制
开始 置初值 循环体 循环结束? Y 循环修改 N 循环体 循环结束? N Y 结束 循环修改 结束 开始 置初值
;调用查表子程序 ; 暂存R1中 ;调查表子程序 ;平方和存A中 ;等待
取第一个数→A 调查表子程序 结果存入R1 取下一个数→A 调查表子程序 两数平方相加 存结果
子程序清单:
SQR: INC A ;加RET占的一个字节 MOVC A,@A+PC ;查平方表 RET TAB: DB 0,1,4,9,16 DB 25,36,49,64,81 END
第四章 循环结构程序设计
while(i<=100)
{ i++;
程序运行结果: sum=5050
sum=sum+i;
}
6
4.3 do-while语句
do-while语句的结构 do 语句 while(表达式);
例如: do
x-=1; while(x>0);
功能:
1)执行“语句”。 2)计算“表达式”的值。如果值为非0,转1);否则转3)。
}
8
4.3 do-while语句
1)循环体如果包含一个以上的语句,要用复合语句表示。 2)在循环体中应有使循环趋于结束的语句。 3)while语句的特点是先执行循环体,然后判断表达式的值。 4)一般情况下,用while语句和用do-while语句处理同一 个问题时,若二者的循环体部分一样,其结果也一样。但如
18
4.7 goto语句以及用goto语句构成循环结构
goto语句的一般格式:
goto 语句标号;
例如: goto loop;
功能:程序执行到goto语句时,将程序流程转到语句标号指定的 语句去执行。
有标号的语句的格式:
语句标号: 语句
例如: loop: sum=sum+i;
19
4.7 goto语句以及用goto语句构成循环结构
【例4-9】用goto语句实现求1~100累加和。
#include <stdio.h>
main() { int n=1, sum=0; loop: sum += n; n++;
if(n<=100) goto loop;
printf("sum=%d\n",sum); }
第4章汇编语言程序设计知识
图4-1 分支程序结构
例4-1
JMP_128:MOV RL MOV JMP JMPTAB:AJMP AJMP ┇ AJMP A,R3 A DPTR,#JMPTAB @A+DPTR ROUT00 ROUT01 ┇ ROUT7F
128个子程序首址
二、分支程序
说明:此程序要求128个转移目的地址(ROUT00 ~
三、反汇编
将二进制机器语言程序翻译成汇编语言程序的过程 称反汇编。
汇编和反汇编的过程如图4-3所示。
汇编(汇编程序)
源程序 (汇编语言)
反汇编(汇编程序)
目标码 (机器语言)
图4-3 汇编和反汇编过程
§4.2.3 伪指令
伪指令不是真正的指令,无对应的机器码,在汇编 时不产生目标程序,只是用来对汇编过程进行某种 控制。
格式:字符名称
DATA
表达式
功能:与EQU类似,但有以下差别:
1、EQU定义的字符名必须先定义后使用,而DATA定义的 字符名可以后定义先使用。
ORG START
2000H MOV R0,#21H ;21H→(R0) MOV A,20H ; (20H)→(A) ANL A,#0FH ;A^#0FH→(A),取低位 MOV @R0,A ; (A)→((R0))),低 位置 21H 中 INC R0 ;R0+1→(R0) MOV A,20H ; (20H)→(A) SWAP A, ;A0~3-((A4~7),低位 与高位交换 ANL A,#0FH ;A^#0FH,取高位 MOV @R0,A ; (A)→((R0)),高位 置 22H
序执行程序。
分支程序又分为单分支和多分支结构。 多分支程序是首先把分支程序按序号排列,然后按序号值进 行转移。
第四章程序设计基础
程序设 计基础
4.2 程序设计语言
程序设计语言=计算机语言
程序设计语言:用于书写计算机程序的语言。
计算机语言:计算机所能够识别的语言。
文章 程序 汉语、英语 计算机语言 字、词、语法结构 数据表示、表达式 语句结构 写文章 编程序
4-4
程序设 计基础
4.2 程序设计语言
计算机语言的分类
通用语言、专用语言 系统程序设计语言、科学计算语言 事务处理语言、实时控制语言 结构化语言 模块化语言 面向对象语言 机器语言 依赖于计算机硬件(低级语言) 汇编语言 高级语言→与计算机硬件基本无关
4-6
程序设 计基础
4.2 程序设计语言
[例题]用Intel 8086指令系统来编写机器语言程序,要 求完成 7+8=?
指令序号 机器语言程序 指令功能 1 10110000 把一加数 7 送到累加器 AL 中 00000111 2 00000100 把累加器 AL 中的内容与另一数 00001000 相加,结果仍存放在 AL 中 3 11110100 停止操作
4-30
程序设 计基础
4.4 Raptor控制结构
[例4-4] 求ax2+bx+c=0方程的根,a、b、c由键盘输入。
[解] 阅读教材相关内容,思考下列问题:假如将选择条件 disc<0 改变为 disc>=0,那么,流程图将如何变化?
(学生思考并回答,停留3分钟) [答案] Yes和No互换, 或选择结构两条分支路径的所有语句互换。
运行结果:
4-34
程序设 计基础
4.4 Raptor控制结构
[例4-6]百钱买百鸡问题。在例3-4 的基础上对流程图进行修改,使它 适应Raptor编程环境。
汇编语言程序设计
第四章汇编语言程序设计(assembly languageprogramming)§4.1 汇编语言(assembly language)一.概述汇编语言:一种符号语言,它用助记符表示指令的操作码和操作数,用标号或符号代表地址、常量和变量,与机器语言几乎一一对应汇编语言程序:用汇编语言编写的程序汇编:把汇编语言源程序翻译成机器语言目标程序的过程汇编语言源程序手工汇编或汇编程序机器语言目标程序汇编程序:用来完成汇编工作的程序,有小汇编ASM宏汇编MASM动态调试程序DEBUG二.汇编语言的语句格式: [名称] 指令助记符 [操作数] [;注释]带方括号的项有时可没有,注释项完全可以没有每个部分用空格分开每行最多可有132个字符,但最好不要超过屏宽80语句可分成指令性语句和指示性语句(伪指令语句)指令性语句汇编后可生成机器码[标号:] 指令助记符 [操作数] [;注释]指示性语句指示汇编程序处理一些工作[名称] 伪指令(指示符) [操作数] [;注释]1.名称(或称标识符)给指令或存储单元地址起的名字,由字母、数字、字符组成字母:A~Z ,a~z数字:0~9字符:可打印+-*/=()[]〈〉;.' ’ ,_:?@$&(非打印空格制表符TAB 回车换行)(界符:,;:.()[]〈〉+-*/=?_@&$' ’界符用来表示某个标志的结束)数字不能作名称的第一个字符,圆点.仅能作第一个字符保留字不能作标识符($、?是保留字,与其它字符组合除外)名称最长为31个字符当名称后跟冒号,表示该名称是其后指令的标号,代表该指令的开始地址,其他指令可以用该标号作为转移地址当名称不跟冒号,它可能是标号或变量名,伪指令前的名称不跟冒号冒号隐含NEAR属性,例:供段内调用写成 OUTPUT:OUT DX ,AL供段间调用写成 OUTPUT OUT DX ,AL2.指令助记符8086/8088指令,也可以是伪指令,如果指令有前缀(LOCK、REP等)则前缀和指令用空格分开3.操作数指令执行的对象,可能有一、二个或没有名称指令助记符操作数注释RET ;返回(无操作数)COUNT: INC CX ;CX加1(1个操作数)MOV AL,BL ;ALBL(2个操作数)伪指令可有多个操作数COST DB 3,4,5,6,7,8 ;(6个操作数,用逗号分开)操作数可以是常数、寄存器名、标号、变量、表达式,MOV AX,[BP+4];(第二个操作数为表达式)4.注释可选项,使程序易读,汇编时不作处理注释前面要加分号,它可位于操作数之后,也可位于行首三.常量与变量1.常量,也叫常数,没有属性的纯数,汇编时已确定的值·数字常量为0~65535中的数(16位寄存器使用,伪操作可定义32位),进制加后缀说明,十进制加D(可省),二进制加B,八进制加Q,十六进制加H,若十六进制第一位为字母,则前头应加0·字符和字符串叫串常量,是ASCII码字符串,必须加单(或双)引号例:‘A’,“ABC”,汇编后变成41H,414243H2.变量,用于表达数值(或串)的标识符,有三个属性① 段属性(SEGMENT)② 偏移地址属性(OFFSET)③ 类型属性(TYPE),用DB、DW、DD定义§4.2 伪指令(pseudo-instruction)一.符号定义伪指令1.等值EQU格式:符号名 EQU 表达式用来给符号定义一个值,程序中出现该符号就用其值代替,EQU只能定义一次DATA EQU 1234 ;代表一个数XYZ EQU ALPHA[SI] ;代表一个地址2.等号 =格式:符号名 = 表达式意义与EQU一样,但程序中可重新定义符号的值EMP = 6 ;EMP代表6EMP =EMP + 1 ;EMP现在代表73.解除PURGE格式:PURGE 符号名(符号1,符号2,……,符号n)用于解除所定义的符号使该符号在以后的定义中有效例:原定义 TAB EQU 5可用 PURGE TAB 来解除然后可重新定义 TAB EQU 10二.数据定义伪指令用于预置存储器或定义变量1.定义字节DB格式:[变量名称] DB 表达式例:DATA1 DB 2,3,4,5;从DATA1单元开始存放4字节数据2.定义字DW格式:[变量名称] DW 表达式例:TAB DW 1234H;TAB单元内容为34H,TAB+1单元内容为12H 3.定义双字DD格式:[变量名称] DD 表达式每个数据二字(四字节)低位部分在低地址,高位部分在高地址·用DB/DW/DD定义的数每行不得超过16项,超过16项必须换行DB/DW/DD用法<1> SUM DB ? ;给SUM单元分配一个字节,内容未定<2> TAB DB 20 DUP(0);给TAB开始单元分配20字节,内容为0<3> TIME DW 100 DUP(?);给TIME开始单元分配100字,内容未定<4> ADDR DD TABLE ;TABLE的地址(双字)给ADDR例:DATA SEGMENTORG 100HTABLE DB 1,2,3,4ADDR DD TABLEDATA ENDS假设汇编后DS=13A2H(如果ADDR用DW定义,只得偏移量)(如果TABLE是变量,ADDR得地址,是常量,ADDR得数值)<5> LETTER DB ‘ABCDEFG’;将字符串以ASCII码形式填入LETTER开始的内存<6> HIS DB 3 DUP(‘WELCOME!’,0DH,0AH);从HIS单元开始重复3次存放WELCOME!和回车换行符4.标号LABEL格式:标号名 LEBEL 类型标号用于说明可执行代码在汇编语言程序中的位置,即符号地址,供调用和转移之用标号有三个属性段属性偏移量属性距离属性(即格式中的类型):NEAR(近程)和FAR(远程)NEAR:本标号为段内标号,调用本标号只提供偏移地址,段基址为当前代码段FAR:本标号为段间标号,调用本标号提供偏移地址和段基址一个具有NEAR属性的标号也可用标号加冒号作后缀,并排列在代码行的开头来隐含如 AGAIN LABEL NEARXOR AX,BUFF[BX]可写成 AGAIN:XOR AX,BUFF[BX]例:ROOT LABEL NEAR ;以下程序所用的ROOT标号是段内属性COMP PROC NEAR ;以下程序所用的过程下的标号是段内属性TIME PROC FAR ;以下程序所用的过程下的标号是段间属性三.运算符1.算术运算符+、-、*、/、MOD即加、减、乘、除、除法取余数(如19 MOD 7=5)操作数是数字,结果也是数字存储器地址运算时只有加减,例TAB+2、BETA-5等2.逻辑运算符AND、OR、XOR、NOT即与、或、异或、非操作数是数字,结果也是数字例:AND BX,DAT AND 0FEH3.关系算符EQ、NE、LT、GT、LE、GE即相等、不等、小于、大于、小于等于、大于等于若关系是假结果为0,若关系是真结果为0FFFFH例:MOV BX,PAD LT 3则PAD的值小于3时,汇编成MOV BX,0FFFFH否则,汇编成MOV BX,04.分析运算符可把存储器操作数分解成它的组成部分,如段值、段内偏移量、类型5.合成算符由已存在的存储器操作数生成一个段值与偏移量相同,而类型不同的新的存储器操作数以下讨论分析算符和合成算符1.取段基址SEG它加于一个变量或标号之前,回送段基址,例:ASSUME CS:SEG BEGIN ;令CS为BEGIN程序段段基址MOV AX,SEG VARN ;将VARN的段基址送AX2.取偏移量OFFSET它加于一个变量或标号之前,取其偏移量,例:MOV BX,OFFSET SUM ;将SUM的段内偏移量存入BX3.取类型码TYPE它加于一个变量或标号之前,取其类型代码DB DW DD DQ DT NEAR FAR1 2 4 8 10 -1 -2例:NG1 DB ‘A’,‘D’,3NG2 DW 88,265……MOV AL,TYPE NG1 ;NG1定义字节,AL 1MOV AL,TYPE NG2 ;NG2定义字,AL 24.取长度LENGTH它加于一个变量之前,取分配给变量的项数例:TAB DB 150 DUP(?);150项,150字节FUM DW 150 DUP(?);150项,300字节则,MOV CX,LENGTH TAB ;CX 150MOV AX,LENGTH FUM ;AX 150·注意:LENGTH返回的存储区必须用DUP()来定义,否则返回为1 5.取字节数SIZE它加于一个变量之前,取回变量所占字节总数,有SIZE = LENGTH * TYPE由上例,LENGTH TAB = 150,TYPE TAB = 1LENGTH FUM = 150,TYPE FUM = 2可知: SIZE TAB = 150SIZE FUM = 300以上5个叫数值返回算符6.类型指示PTR格式:类型 PTR 地址表达式表示PTR右边的(存储器)操作数是左边的类型,有:BYTE、WORD、DWORD、NEAR、FAR例:INC BYTE PTR [BX] ;将BX指向的单元字节加1MOV WORD PTR [DI],99 ;立即数99送DI指向的字中JMP NEAR PTR FOK ;以近程方式跳转到FOK(只取FOK偏移地址)7.指定符THIS(合成算符)用于定义当前所指单元中的类型格式:THIS 类型/距离经THIS定义过的标号具有当前汇编段、偏移量和所规定的类型或距离等属性,例:FOOB EQU THIS BYTE;下面的字类型变量FOOW在这里指定为字节型FOOBFOOW DW 120 DUP(?)定义后,对同一数据块(FOOB和FOOW有相同的段和段内偏移量)有两种类型访问FOOB时为字节操作,访问FOOW时为字操作ADD AL,FOOB[3] ;将数组第四字节与AL相加MOV AX,FOOW[4]将数组第五六字节组成的字送AX也可以这样来构成FOOB:FOOB EQU BYTE PTR FOOW又例:DATAF EQU THIS FARDATAN:MOV AX,FOO这时 JMP DATAN为近程转移JMP DATAF为远程转移8.段修改符:用于对某一地址表达式指定临时段基址,如MOV AX,ES:[BX];指定ES为BX的段基址,对当前指令有效9.短程符SHORT与NEAR、FAR功能类似,位移量一字节范围 -128~+127,对应一条短转移指令例:JMP SHORT LAB;转移到标号LAB的地址10.方括号 [ ]表示操作数(加方括号)是一个地址偏移量,不是数值格式:[表达式] 或者 [表达式][ ]例:MOV [BX],AX ;将AX内容送BX所指单元MOV [BX+7],AX ;将AX内容送BX+7所指单元MOV AX,[BX][SI] ;将BX+SI所指单元内容送AX11.取高/低字节HIGH/LOW用来分离常量的高/低字节,对存储器操作数无效例:DATA EQU 789AHMOV AL,HIGH DATA ;AL=78HMOV AL,LOW DATA ;AL=9AH四.段定义伪指令1.SEGMENT—ENDS格式:[段名] SEGMENT [定位类型] [组合类型] [‘类别名’]┇[段名] ENDS·段名·定位类型(Align),给出实际段地点的种类或段长度的信息<1> PARA 段起始地址从一个节(paragraph)的边界开始<2> BYTE 段地址可从任意绝对地址开始<3> WORD 段地址从任意一个字的边界开始<4> PAGE 段地址从某一页的边界开始(一页等于256字节)<5> INPAG 段长度小于一页未说明定位类型时则默认为PARA·组合类型(Combine),又称联合类型,程序中各程序段的连接和定位方法<1> PUBLIC 将段名相同的程序段(亦称模块)依此紧密连接,但彼此不相互覆盖<2> COMMON将段名相同的程序段连接,各段都从同一地址开始<3> AT表达式段定位在由表达式(结果必须是常数)所指定的节的边界上例:AT 1234H,则段地址被定位在物理地址为12340H处,如果希望从12345H开始,则在SEGMENT命令的下一行写上ORG 5AT 不能向前引用<4>STACK 表示这个段是运行期间的堆栈段<5>MEMORY 该段是相互连接的几个段中地址最高的段<6>NONE本段与其他段无组合关系未说明联合类型时则默认为NONE,不和别的段连接·‘类别名’(Class),也叫组名,加单引号,汇编后类别名相同的程序段代码集中在一起定位,形成一个统一的物理段,类别名可自定,约定的有CODE (代码段)、DATA(数据段)、STACK(堆栈段)、CONST(常数)、MEMORY(存储)等2.ASSUME段寄存器说明伪指令,指明所定义的段名所使用的段寄存器(告诉汇编程序在运行期间通过哪一个段寄存器寻址才能找到所要的指令和数据),本语句一般在定义的代码段中第一条出现格式:ASSUME 段寄存器:段名 [,…]例: ASSUME CS:CODE,DS:DATA ;用SEGMENT—ENDS定义ASSUME CS:SEG KGF,DS:SEG BEGIN;由算符定义ASSUME ES:NOTHING ;用关键字定义,表示不使用ES(取消ES段寄存器)(保留字NOTHING在这里作为一个段名参数,ASSUME NOTHING表示取消所有段寄存器,各个段寄存器只能在指令性语句中由MOV指令赋值)·ASSUME只是设定段寄存器与逻辑段的对应关系,并没给段寄存器装入实际值,所以程序中必须对DS、ES、SS赋值,而CS由系统赋值3.ORG定点伪指令(段内定位),用以确定下一条指令(或变量)在当前段中的偏移地址格式:ORG 表达式表达式以65536(64K)为模计算,超过64K则取其余数本语句前未定义过的变量不可出现在表达式中,表达式可包含$(程序计数器当前值)如:ORG OFFSET $+1000表达式必须为正值,若为负值,就会从当前段的地址高端开始表达式最好不要写成OFFSET $-1000,以免把汇编过的1000个字节覆盖掉ORG指令不能带标识符,如START:ORG 0和SKIP ORG 100都是错的例:CODE SEGMENT ;段起始ORG 100H ;本程序代码从偏移地址100H开始装入ASSUME CS:CODE ;装入代码段地址到CS中START:IN AL,30H ;程序段SHL AL,1OUT 32H,ALJMP STARTCODE ENDS ;程序段结束END START ;汇编结束例:DATA SEGMENTORG 50HDAT DW 1,2,$+1┇DATA ENDS注意DAT不能定义为字节,否则与$不匹配五.过程定义伪指令格式:过程名 PROC 属性┇过程体RET过程名 ENDP·过程名不可缺省,它和标号一样有三个属性:段属性、偏移地址属性、距离属性·距离属性在PROC后指定,有NEAR和FAR,如果希望过程能让别的程序调用,则必须是FAR属性·一个过程允许多个入口,入口处有标号,标号要说明距离属性例:延时100ms子程序DELAY PROC ;隐含NEARMOV BL,10 4TDLY1: MOV CX,2801 ;内循环延时10ms 10TWAIT0: LOOP WAIT0 9/5T DEC BL 2TJNZ DLY1 8/4TRET 8TDELAY ENDP六.结束伪指令·NAME:给模块(源程序)命名格式:NAME 模块名称它出现在源程序的最前端·END:汇编结束格式:END [标号名]它通知汇编程序本模块汇编到此结束标号名是可选项,若选取,应指向执行本程序的起始地址若一个源程序是多模块,只有主模块的END后加标号,子模块只有END七.宏指令宏指令:在汇编语言源程序中多次重复出现的程序段,用一个名字来定义,然后当成一条指令来使用宏汇编:源程序中的宏指令经汇编程序翻译后扩展成对应程序段的机器码宏指令用MACRO—ENDM来定义,如:CRLF MACROMOV DL,0DHMOV AH,02HINT 21H┇ENDM(CRLF作回车换行)§4.3 汇编语言程序设计(assembly language programming)一.设计要求1.程序简明、易读、易调试、易修改2.程序占用内存要少(包括程序长度及运行时所需空间)3.程序运行速度要快二.基本设计方法1.选择合适的计算方法2.绘制程序流程图3.编制程序4.上机调试三.汇编语言程序格式和基本结构一般一个完整的汇编语言程序至少应包括以下三个程序段简化段格式:.MODEL SMALL.STACK 64H.DATA……;紧接指令代码从偶地址开始存放.CODESTART: MOV AX,@DATAMOV DS,AX……END STARTDATA SEGMENT ‘DATA’┇数据段DATA ENDSSTACK SEGMENT ‘STACK’┇堆栈段STACK ENDSCODE SEGMENT ‘CODE’ASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AX┇代码段CODE ENDSEND START程序的基本结构分为顺序结构、分支结构、循环结构和子程序结构(一)顺序结构一种简单程序,按顺序执行例1.将200H单元的低4位和高4位分别送入201H和202H单元的低4位,这二单元的高4位清0200HX X201H 0202H 0DATA SEGMENTORG 200HBCD DB 47HDB 2 DUP(?)DATA ENDSSTACK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STASTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV AX,STACK MOV SS,AXMOV AX,TOPMOV SP,AXMOV BX,OFFSET BCD MOV AL,[BX]AND AL,0FHMOV [BX+1],AL MOV AL,[BX]MOV CL,4ROL AL,CLAND AL,0FHMOV [BX+2],AL HLTCODE ENDS END START例2.将ADDR1和ADDR2两单元开始的二个16位无符号数相加,考虑到进位,将其结果存放在SUM开始的三个单元中DATA SEGMNETADDR1 DW 7854HADDR2 DW 9981HSUM DB 3 DUP(0)DATA ENDSSATCK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STASTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART: MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AXMOV AX,ADDR1ADD AX,ADDR2MOV WORD PTR SUM,AXADC SUM+2,0HLTCODE ENDSEND START例3.查表将DATA1单元中字节类型数据(0~0FH)转换成ASCII码,并存入ASCII单元中DATA SEGMENTASCTAB DB 30H,31H,32H,33H,34H,35H,36H,37HDB 38H,39H,41H,42H,43H,44H,45H,46HDATA1 DB 09HASCII DB ?DATA ENDSSTACK SEGMENT STACKDW 10 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART PROC FARASCTAB 30 031 1┇93941 A42 B┇46 F┇ASCIIPUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV BX,OFFSET ASCTABMOV AL,DATA1XLATMOV ASCII,ALRETSTART ENDPCODE ENDSEND START例4.将200H和201H单元字节的高4位对调,低4位不变CODE SEGMENT200H201HORG 200HDATA1 DB 0F3H,47HASSUME CS:CODE,DS:CODESTART:MOV AX,CODEMOV DS,AXMOV CL,4MOV AX,WORD PTR DATA1 ;AX=47F3HROL AX,CL ;AX=7F34H ROL AH,CL ;AX=F734H ROL AL,CL ;AX=F743H MOV WORD PTR DATA1,AXHLTCODE ENDSEND START(二)分支结构通过判断产生分支,借助于条件转移指令跳转到相应的分支地址执行分支程序分支程序由三部分组成① 测试部分,负责产生决定分支的条件② 定向部分,根据测试条件是否满足,决定程序是否分支③ 标注部分,标明分支的去向利用跳转表也可使程序转移到分支地址例1.16位二进制补码X在DATA1单元,求其绝对值送DATA2单元(设X≠8000H)∣X∣= X,X≥0-X, X<0DATA SEGMENTDATA1 DW 9F87HDATA2 DW ?DATA ENDSSTACK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STA STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AXMOV AX,DATA1AND AX,AXJNS ABS0NEG AXABS0: MOV DATA2,AXHLTCODE ENDSEND START例2.多重分支学生成绩按分数段划分为:A、90~100(5AH~64H)B、80~89 (50H~59H)C、70~79 (46H~4FH)D、60~69 (3CH~45H)E、 <60 ( <3CH)已知分数存放在MARK单元,请用ASCII码的A、B、C、D、E去代表MARK单元中的分数所属的段,并存于GRADE单元DATA SEGMENTMARK DB 81GRADE DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AXMOV BX,OFFSET MARKMOV AL,[BX]CMP AL,3CHJC LPECMP AL,46HJC LPDCMP AL,50HJC LPCCMP AL,5AHJC LPBMOV AL,41H ;‘A’JMP SHORT DONELPB: MOV AL,42H ;‘B’JMP SHORT DONELPC: MOV AL,43H ;‘C’JMP SHORT DONELPD: MOV AL,44H ;‘D’JMP SHORT DONELPE: MOV AL,45H ;‘E’DONE: MOV BX,OFFSET GRADE MOV [BX],ALHLTCODE ENDSEND START法2:直接查表转换(顺序结构)DATA SEGMENTTAB DB ‘EEEEEEDCBAA’MARK DB 81GRADE DB ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AXMOV BX,OFFSET TABMOV AL,MARKMOV AH,0MOV CL,10DIV CLXLATMOV GRADE,ALHLTCODE ENDSEND START(三)循环结构使机器重复执行一系列指令,是一种闭合的分支结构循环程序由四部分组成① 初始化部分(或预置部分),负责设置循环初值② 处理部分,循环过程的主体③ 控制部分,修改初值,判断是否循环循环次数由一计数器控制循环次数由某一指定条件是否满足来决定④ 结束部分,处理循环程序的最后结果例1.将DTAB单元开始的一组字节补码数(≤255个)求平均值,结果存入AVE单元,若结果为负,在SYM置FFH否则置0DATA SEGMENTDTAB DB 0FDH,0FCH,05H,0F8H,……DB 08H,25H,83H,97H,……COUNT EQU $-DTABAVE DB ?SYM DB ?DATA ENDSSTACK SEGMENT STACKSTA DB 20 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK AVER PROC FARSTART:PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXLEA BX,DTABMOV CX,COUNTXOR DX,DXNEXT: MOV AL,[BX]CBWADD DX,AXINC BXLOOP NEXTMOV AX,DX MOV CL,COUNTIDIV CLMOV AVE,ALMOV SYM,0AND AL,ALJNS DONEMOV SYM,0FFHDONE: RETAVER ENDPCODE ENDSEND START循环控制方法:循环次数由计数器控制例2.将8位二进制小数规格化设需规格化的小数在DATA1单元,要求规格化后使其最高位为1,并存入DATA2单元,办法是把小数左移至最高为位为1为止,左移次数存入DATA3单元,若小数是0,则在DATA2和DATA3单元存入0示例:DATA1 DATA2 DATA322H 88H 02H01H 80H 07HCBH CBH 00H00H 00H 00HDATA SEGMENTDATA1 DB 22HDATA2 DB ?DATA3 DB ?DATA ENDSSTACK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STA STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV DATAMOV DS,AXMOV AX,STACKMOV SS,AXMOV AX,TOPMOV SP,AXMOV CL,0MOV AL,DATA1 ;取数AND AL,AL ;设ZF、SF标志JZ DONECHKSF:JS DONEINC CLADD AL,AL ;左移一位JMP SHORT CHKSFDONE: MOV DATA2,ALMOV DATA3,CLHLTCODE ENDSEND START循环控制方法:循环次数由某一指定条件是否满足来决定例3.多重循环将n个无符号字节数从小到大排序,方法是依此比较相邻两单元的数,若前小后大不交换第一轮比较n-1次,最大数沉底(高地址)第二轮比较n-2次,次大数沉到最大数上面第n-1轮比较完若在某一轮比较时没有出现交换,说明顺序已排好,不必后续比较,故设交换标志AH=1代表不交换,AH=2代表有交换DATA SEGMENTLIST DB 18,6,11,3,1,2,3,9,8,7,6 DB 111,110,99,112,115,114,113,98,96,97 COUNT EQU $-LISTDATA ENDSSTACK SEGMENT STACKSTA DW 10 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSET PROC FARSTART:PUSH DSMOV AX,0PUSH AXMOV AX,DATAMOV DS,AXMOV DX,COUNT-1 ;n-1轮(外循环)EXGO:MOV CX,DX ;每轮次数(内循环)MOV AH,01H ;交换标志MOV BX,OFFSET LIST ;数据块首址INGO: MOV AL,[BX]INC BXCMP AL,[BX]JC NEXT ;数1小,不交换XCHG AL,[BX] ;数1>数2,交换DEC BXXCHG AL,[BX]INC BX ;恢复数据指针MOV AH,02H ;有交换标志NEXT: LOOP INGODEC DXJZ DONEDEC AHJNZ EXGODONE: RETSET ENDPCODE ENDSEND START(四)子程序结构基本要求:① 子程序的开始(入口处)应给予一个标号,结束处有返回指令② 通用子程序要说明入口条件(入口参数)和出口条件(出口参数)③ 调用子程序要注意保护现场和恢复现场调用—返回的堆栈操作:CALL target ;段内SPSP-2,[SP+1,SP] IP,IPIP+disp段间SPSP-2,[SP+1,SP] CS,CSsegSPSP-2,[SP+1,SP] IP,IPoffsetRET ;段内IP [SP+1,SP],SPSP+2;段间IP [SP+1,SP],SPSP+2CS [SP+1,SP],SPSP+2RET n ;如上操作后SPSP+n·子程序入口标号应说明距离属性·对于一个FAR过程,过程初必须先保护程序段前缀中的中断指令INT 20H 的断点地址(DS:0000),它是一个程序正常结束退出的中断处理程序例1.将内存200H单元开始的一个五字节十六进制数显示出来(低位在低地址)DATA SEGMENTORG 200HNUM DB 9AH,78H,56H,34H,12HDATA ENDSSTACK SEGMENTSTA DB 20 DUP(?)TOP EQU LENGTH STASTACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOV DS,AXMOV BX,5MOV AX,STACKMOV SS,AXMOV SP,TOPMOV SI,OFFSET NUMNEXT: MOV DH,[SI+BX-1] ;(不用AL,因调用MOV DL,DH ; display返回时DL→AL)MOV CL,4ROL DL,CLAND DL,0FHCALL DISPLAYMOV DL,DHAND DL,0FHCALL DISPLAYDEC BXJNZ NEXTMOV AX,4C00HINT 21HDISPLAY PROC NEARADD DL,30HCMP DL,3AHJB OKADD DL,07H;(如果DL=3AH,3AH+7=41H是‘A’)OK: MOV AH,02HINT 21HRET。
第四章。循环结构(while、do-while、for)
Top1.循环结构(while、do…while、for)1. 循环结构(while、do…while、for)1.1. 什么是循环结构在日常生活中,会有很多需要反复执行的事情,比如:每一年的4个季节,每一周的7天,每日的3餐,打印机每份文档打印50份,一圈跑道400米跑3圈,都是在反复执行的。
再看软件系统中的需求:问题1:输出100行语句,每行语句都一样,即:∙行动是成功的阶梯,行动越多,登得越高!∙行动是成功的阶梯,行动越多,登得越高!∙行动是成功的阶梯,行动越多,登得越高!…问题2:输出100行语句,每行语句都类似,即:∙第1,行动是成功的阶梯,行动越多,登得越高!∙第2,行动是成功的阶梯,行动越多,登得越高!∙第3,行动是成功的阶梯,行动越多,登得越高!∙…∙第100,行动是成功的阶梯,行动越多,登得越高!问题3:计算1到50乘以8.88的结果∙1×8.88 =8.88∙ 2 ×8.88 =17.76∙ 3 ×8.88 =26.64∙ 4 ×8.88 =35.52∙…∙50 ×8.88 =444诸如此类问题都是在反复执行的,在软件系统中可以通过循环这种语法结构来解决。
循环是程序设计语言中反复执行某些代码的一种计算机处理过程,是一组相同或相似语句被有规律的重复性执行。
对于循环来说,需要考虑两个要素,其一要素为循环体,也就是被反复执行的相同或相似的语句,其二要素为循环的条件,也就是循环得以继续执行下去的条件,常常以循环次数的方式体现。
常用的循环结构有:while、do-while、for。
1.2. while语句1.2.1. while语句的执行逻辑while语句是循环的一种常见语法结构,语法如下:1.while(boolean表达式){语句块;2.}while语句的执行过程为,首先计算boolean表达式的值,而后进行判断,若值为true则执行语句块,语句块执行完后再次判断boolean表达式的值,如果为true则继续执行语句块,如此循环往复,直到boolean表达式的值为false时退出while循环而执行while之后的语句。
第四章:8086汇编语言程序设计
第 4章
汇编语言程序设计
汇编语言程序设计
(2)尽量采用循环结构和子程序 (2)尽量采用循环结构和子程序 采用循环结构和子程序可以使程序的长度减少、 采用循环结构和子程序可以使程序的长度减少、 占用内存空间减少。 占用内存空间减少。 多重循环,注意各重循环的初值和循环结束条件, 多重循环,注意各重循环的初值和循环结束条件, 死循环”现象; 避免出现 “死循环”现象; 通用的子程序, 通用的子程序,除了用于存放子程序入口参数的寄 存器外, 存器外,子程序中用到的其它寄存器的内容应压入堆栈 进行现场保护, 进行现场保护,并要特别注意堆栈操作的压入和弹出的 平衡; 平衡; 中断处理子程序除了要保护程序中用到的寄存器外, 中断处理子程序除了要保护程序中用到的寄存器外, 还应保护标志寄存器。 还应保护标志寄存器。
1、汇编语言的语句格式
汇编语言源程序是由汇编语句(即指令)组成的。 汇编语言源程序是由汇编语句(即指令)组成的。 汇编语言一般由四部分组成。 汇编语言一般由四部分组成。
其典型的汇编语句格式: 其典型的汇编语句格式: 标号: 标号:操作码
例如: 例如: START: START:MOV AL,30H AL,30H ;(AL)=30H (AL)=30H 30
第 4章
汇编语言程序设计
汇编语言程序设计
经过任务分析、算法优化后, 经过任务分析、算法优化后, 在微型机上使用编 首先, 首先,要对单片机应用 就可以进行程序的总体构思, 就可以进行程序的总体构思, 辑软件编写源程序, 辑软件编写源程序, 系统预完成的任务进行 确定程序的结构和数据形式, 确定程序的结构和数据形式, 在使用交叉汇编的 深入的分析, 深入的分析,明确系统 并考虑资源的分配和参数的 方法对源程序进行 的设计任务、 的设计任务、功能要求 计算等。 计算等。然后根据程序运行 汇编, 汇编,然后采用串 和技术指标。其次, 和技术指标。其次,要 的过程, 的过程,勾画出程序执行的 算法是解决具体问题 行通信的方法, 行通信的方法,把 对系统的硬件资源和工 逻辑顺序, 。同一个问题 逻辑顺序,用图形符号将总 的方法。 的方法 汇编得到的目标程 作环境进行分析。 ,, 作环境进行分析。这是 体设计思路及程序流向绘制 的算法可以有多种, 的算法可以有多种 序传送到单片机内, 序传送到单片机内 单片机应用系统程序设 在平面图上, 在平面图上,从而使程序的 结果也可能不尽相同, 结果也可能不尽相同, 并进行程序运行和 计的基础和条件 结构关系直观明了, 结构关系直观明了,便于检 所以, 调试 所以,应对各种算法 查和修改。 查和修改。 进行分析比较,并进 进行分析比较, 行合理的优化
C语言程序设计教案第四章顺序程序设计(5篇模版)
C语言程序设计教案第四章顺序程序设计(5篇模版)第一篇:C语言程序设计教案第四章顺序程序设计第四章顺序程序设计课题:第四章顺序程序设计教学目的:1、掌握赋值语句、输入输出语句2、学会简单的顺序程序设计教学重点:输入、输出语句教学难点:格式输入输出语句步骤一复习引导上一章介绍的常量、变量、运算符、表达式等都是构成程序的基本成分。
本章将介绍为编写简单程序所必需的一些内容。
步骤二讲授新课一、C语句概述1、控制语句ν二个分支语句(if-else、switch)ν三个循环语句(for、while、do-while)ν四个转移语句(continue、break、goto、return)2、函数调用语句ν如:printf(“Hello, world!”);3、表达式语句ν x+y;i++;a=2;a=3*5, 40;4、空语句(;)5、复合语句{ 语句序列}一、赋值语句赋值语句是由赋值表达式加上一个分号构成,如:b=3;if((a=b)>0)t=a;三、数据输入输出的概念及在C语言中的实现1、输入、输出2、输入输出操作是由函数来实现的Ξ C语言函数库中有“标准输入输出函数” Ξ字符的输入与输出:getchar()、putchar()Ξ字符串的输入与输出:gets()、puts()Ξ格式输入与输出: scanf()、printf()3、在使用C语言库函数时,要用预编译命令“#include”将有关的“头文件”包括到用户源文件中。
例如:使用标准输入输出库函数时,要用到“stdio.h”文件,在源文件开头应有: #include 或#include “stdio.h”(一)字符数据的输入输出1、字符输出函数——putchar 语法:putchar(c)语义:(向stdout终端)输出一个字符;如:#include main(){ putchar(…141‟);putchar(…a‟);putchar(…A‟+32);putchar(…n‟);}输出:aaa2、字符输入函数——getchar语法:getchar(),是一个无参函数;语义:(从stdin终端上)输入一个字符;getchar 包含在stdio.h中,是stdio.h中定义的宏;如:#include main(){putchar(getchar());}如:#include main(){ int c;while((c=getchar())!=…#‟)if(c>=…a‟&&c<=…z‟)putchar(c-‟a‟+‟A‟);else putchar(c);}从键盘上输入一串字符遇‘#’结束,若字符在a~z之间时,则输出字符的大写;否则直接输出字符。
最新第4章程序代码基础PPT课件
如 temp = 3^2
MOD 求余数
例题:实现乘法、除法及指数运算:val()
VB中进行运算
二、连接运算 • & 强制两个表达式作字符串连接 • + 如果有数字,则作相加运算,否则作字符 串连接
有些情况下,用“&”比用“+”可能更安全。 例如:设A$=“Mouse”, B$=“Trap” 执行语句:
❖ 局部变量:定义在一个过程内部,仅限该过程使用 ❖ 例如:实验1例题
赋值运算符
frmMain.Width=300 frmTest.Caption=“Hello” temp=temp+1 flag1=true orderDate = #2002-12-20# Dim a As Form Set a = New Form1
第4章程序代码基础
语法基础
❖数据类型 ❖常量 ❖变量 ❖运算符
数据类型(6)
七.自定义数据类型
Type 自定义类型名 元素名 As 数据类型 元素名 As 数据类型 元素名 As 数据类型
...
End Type
如: Type Student ID as long Name as string * 10
(14)StrComp(字符串1,字符串2[,比较类型]): 按比较类型比较两个字符串,返回值为:相等时为0; 小于时为1;大于时为1。
? Strcomp(“abcd”,”ABCD”) 1
(15)StrReverse(字符串):将给定字符串逆序输 出。若为空串,返回空串,若为Null,则会出错。
?StrReverse(“abc”) cba
3 转换函数
❖ 转换函数一般用来实现不同类型数据之间的 转换。Visual Basic 提供的常用转换函数 有以下几个。
C语言程序设计 第3版 第4章 顺序结构程序设计
printf(“%d“,a); printf(“%d“,a+b);
C语言程序设计
2.printf函数
格式功能 格式控制 注意说明
注意说明:
(1)格式转换说明符个数和类型必须与输出列表一一 对应 。
(2)格式控制字符串中可以有转义字符和普通字符。 转义字符根据具体作用实现操作,普通字符原样输出。
例题:
scanf(“%d”,&a);
//一个变量
scanf(“%d%d”,&a,&b);
//两个变量
scanf(“%d%d%d”,&a,&b,&c); //三个变量
C语言程序设计
1.scanf函数
格式功能 格式控制 注意说明
注意说明:
(1)格式控制字符串中多个格式转换说明符之间没有 逗号,输入数据时,通常使用空格键或者回车键来分隔 数据;格式转换说明符之间有逗号,输入数据时,一定 要用逗号来分隔数据。
功能描述 输出一个十进制整数 输出一个单精度实数 输出一个双精度实数 按指数格式输出一个实数
输出一个字符 输出一个字符串 输出一个八进制整数 输出一个十六进制整数
C语言程序设计
2.printf函数
格式功能 格式控制 注意说明
输出列表:
输出列表由输出项组成,两个输出项之间用逗号分隔,输出项可以 是一般的表达式,也可以是简单变量,即:变量名或者表达式。
a
b
2
3
t
C语言程序设计
简单语句分析
实例介绍 算法设计 语句编写
将具体的算法转化为C语言的标准语句,采用 逐条语句编写方法,称为顺序结构程序设计。 算法设计如下:
1、定义三个变量a、b和t; 2、2存储到a中,3存储到b中; 3、将a的值存储到t中; 4、将b的值存储到a中; 5、将t的值存储到b中; 6、输出a和b的值;
计算机程序设计与语言
为了能顺利地进行维护,程序文档是非常重要的。 程序文档解释了程序的工作过程及使用方法。程序 文档有两种形式:插入到程序代码中的注释和专 门制作的文档。
23
4.5.1
程序设计语言的特点和分类
1. 机器语言——第一代语言 2. 汇编语言——第二代语言 3. 高级程序设计语言——第三代语言 4. 智能语言——第四代语言
26
3. 高级程序设计语言——第三代语言
(1)过程性语言 (2)面向对象语言 (3)专用语言
27
3. 高级程序设计语言——第三代语言(一)
(1)过程性语言 过程性的编程语言适合于那些顺序执行的算法。 用过程性语言编写的程序有一个起点和一个终点, 程序从起点到终点执行的流程是直线型的。
开始 模块 1 模块 2 模块 结束
7
4.2.2
算法设计
对于算法的评价有许多标准。但基本的标准有两个:一个是 时间标准(时间复杂度),一个是空间标准(空间复杂 度)。 所谓时间标准,简单说来,即执行这个算法需要多少时间, 基本的原则是时间越短越好。 所谓空间标准,即执行这个算法需要占用多少资源(可以理 解为占用了多少计算机存储单元),基本的原则是资源的 占用越少越好。 但是随着计算机技术的发展,硬件性能不断提高,程序的规 模越来越庞大,算法的清晰程度成了一个非常重要的问题。 算法的易懂性也是我们衡量一个算法好坏的重要指标。
(4)结构内没有死循环(无终止的循环)。
15
4.3
编写计算机程序
2. 程序设计风格 程序编码时,保持良好的程序设计风格可以增 加程序的可读性。由于影响程序可读性的因素很多, 我们这里仅列出几个主要的方面供编程者参考。 (1)文档化(documentation) (2)格式化(layout) (3)模块化(modularization)
第4章-汇编语言程序设计教案
第四章教学实施计划3课堂教学实施计划第 8 课教学过程设计:复习 0 分钟;授新课 100 分钟讨论 0 分钟;其它 0 分钟授课类型(请打√):理论课√讨论课□实验课□习题课□其它□教学方式(请打√):讲授√讨论□示教□指导□其它□教学手段(请打√):多媒体√模型□实物□挂图□音像□其它□4.1 汇编语言程序设计概述程序实际上是一系列计算机指令的有序集合。
我们把利用计算机的指令系统来合理地编写出解决某个问题的程序的过程,称为程序设计。
程序设计是单片机应用系统设计的重要组成部分,单片机的全部动作都是在程序的控制下进行的。
随着芯片技术的发展,很多标准的或功能型的硬件电路都集成到了芯片中,所以,软件设计在单片机应用系统开发中占的比重越来越大。
一、汇编语言和高级语言汇编语言:用助记符表示的指令称为汇编语言,用汇编语言编写的程序称为汇编语言源程序汇编语言也是面向机器的,它仍是一种低级语言。
汇编语言离不开具体计算机的硬件,与硬件紧密相关。
高级语言:高级语言不受具体“硬件”的限制,具有通用性强,直观、易懂、易学,可读性好等优点。
多数的51单片机用户使用C语言来进行程序设计。
C语言已经成为人们公认的高级语言中高效、简洁而又贴近51单片机硬件的编程语言。
二、汇编语言的特点•助记符指令和机器指令一一对应,所以用汇编语言编写的程序效率高,占用存储空间小,运行速度快,因此汇编语言能编写出最优化的程序。
•使用汇编语言编程比使用高级语言困难,因为汇编语言是面向计算机的,汇编语言的程序设计人员必须对计算机硬件有相当深入的了解。
•汇编语言能直接访问存储器及接口电路,也能处理中断,因此汇编语言程序能够直接管理和控制硬件设备。
•汇编语言缺乏通用性,程序不易移植,各种计算机都有自己的汇编语言,不同计算机的汇编语言之间不能通用。
三、汇编语言的语句格式•指令语句:每一条指令语句在汇编时都产生一个指令代码(也称机器代码),执行该指令代码对应着机器的一种操作。
第四章 汇编语言程序设计基础
4.2.2 分支程序的设计方法 ★条件控制 ★逻辑尺控制 ★地址跳转表控制
1. 条件控制——利用比较和条件转移指令实现分支,是最常用的 程序设计方法。
பைடு நூலகம்
例如,求解函数:
练习题2. 编写程序,比较两个字符串STRING1和STRING2所 含字符是否完全相同,若相同则显示“MATCH”,若不同则显示 “NO MATCH”。 答案: datarea segment string1 db ‘asfioa’ ;定义字符串STRING1 string2 db ‘xcviyoaf’ ;定义字符串STRING2 mess1 db ‘MATCH’,’$’ ;定义显示字串“MATCH” mess2 db ‘NO MATCH’,’$’ ;定义显示字串“NO MATCH” datarea ends prognam segment main proc far assume cs:prognam,ds:datarea start: push ds ;将ds:00入栈 sub ax,ax push ax mov ax,datarea ;装填数据段及附加段 mov ds,ax mov es,ax
程序流程图
mov ch,4 rotate: mov cl, 4 rol bx,cl mov al,bl and al,0fh add al,30h ;’0’-’9’ ASCII 30H-39H cmp al,3ah jl printit add al,7h ;’A’-’F’ ASCII 41H-46H printit: mov dl,al mov ah,2 int 21h dec ch jnz rotate
例4.3 将首地址为A的N字数组按照从小到大的次序整序(气 泡算法,多重循环) A dw 32,85,16,15, 8
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
x转换为二进制;
}
这里的函数体是我们需要解决的第二个问题——十进制转换为二进制问题。十进制转换为二进制用除二取余法,即求x除以2的余数,将其存入数组;再求商除以2的余数,存入数组,用得到的再商求除以2的余数,存入数组,……值到商为0。根据题意,“十进制转换为二进制”用C语言描述为:
我们先将10个数依次放入数组元素a[1],a[2],a[3],……,a[9],a[10]中。
选择排序的思想是:在a[1],a[2],a[3],……,a[9],a[10]中选择最小的值放入a[1],在a[2],a[3],……,a[9],a[10]中选择最小的值放入a[2]中,……,在a[i],a[i+1],……a[9],a[10]中选择最小值放入a[i]中(i=1,2,…9),如此,数组就成为有序数组。这样,选择排序的基本框架为:
(33)编写函数统计某字符在字符串中出现的次数,若该字符不出现则返回值零。
(34)编写函数,其函数功能是将字符串s倒置。例如,输入为”tracher”,则应输出“rehcaet”
(35)编写一个程序计算1到正整数n之间的奇数之和以及偶数之和。
(36)编写侯选人得票的统计程序。设有三个候选人,每次输入一个得票的后选人的名字,要求最后输出各人得票结果。
else
printf("no");
}
(2)方法1:
main()
{ float x,y;
printf("input x:");
scanf("%f",&x);
y=x;
if (x==0) y=x-1;
if (0<x&&x<10) y=x+1;
printf("y=%f\n",y);
}
方法2:
main()
{ float x,y;
max=i; /* max为最小元素的下标,即最小元素为a[i]的。*/
for(j=i+1;j<=10;j++)
{
if(a[j]<a[max])
max=j;
t=a[i];a[i]=a[max];a[max]=t;
这样,完整的选择排序程序为:
ቤተ መጻሕፍቲ ባይዱmain()
{ int i,j,t,max,a[11];
for(i=1;i<=9;i++)
case '*': data3=data1*data2;break;
case '/': if(data2==0)
{printf ("\nDivision by zero 1 ");
exit(1);}
第四章
在掌握了程序设计语言基本概念和基本技能的基础上,我们讨论程序的编写。本章运用结构化程序设计的思想,通过具体实例介绍了一般的编程方法。我们同时还提供一些专项练习题,并作了较详细的解答。
4
结构化程序设计的思想是由顶到底逐步细化。下面我们通过具体的编程例子来体现结构化程序设计的思想。
例:写完整的程序,用公式
(40)编写程序,从键盘上输入一个字符串,把该字符串中的小写字母转换为大写字母,输出到文件test.txt中,然后从该文件读出字符串并显示出来。
4
(1)main()
{int x;
printf(“input x:”);
scanf("%d",&x);
if (x%5==0 && x%7==0)
printf("yes");
printf("input x:");
scanf("%f",&x);
if (x==0) y=x-1;
else if (0<x&&x<10) y=x+1;
else y=x;
printf("y=%f",y);
}
(3)#include"stdio.h"
void main(void)
{float data1,data2,data3;char op;
scanf(“%d”,&n);
for(i=1;i<=n;i++)
{
for(j=1;j<=i;i++) printf(“%d”,1);
for(j=2;j<=n-i;j++) printf(“%d”,j);
}
通常打印图形用两重循环组成,外层循环控制行,内重循环控制列;若图形为上下对称图形,则分上下两部分分别打印。
(21)试用while控制结构,求出给定十进制正整数n的位数(例:278是三位数),并将结果存于变量C中。
(22)定义一个函数,统计3行4列的整数二维数组中有多少个正数、多少个负数,多少个零,并返回统计结果
(23)编写一个程序求数组a的最大数和第二最大数并分别存放于a[0]和a[1]中。假设数组中元素各不相同。
(6)输入100个整数,编一程序,分别统计其中偶数和奇数的个数。
(7)编写打印输出以下图案的程序。
MTMTMTM
MTMTM
MTM
M
(8)用迭代法求 求平方根的迭代公式为
要求前后两次求出的x的差的绝对值小于10-5。
(9)求整数m的所有素数因子
(10)一个数恰好等于它的因子之和,这个数就称为“完数”。例如,6的因子为1,2,3而6=1+2+3,因此6是完数。编程找出求1000以内的所有完全数。
int k=0;
do
{ b[k]=x%2;
x/=2;
k++;
}while(x);
这样,完整的函数为:
void dtob(int x,int b[ ])
{
int k=0;
do
{ b[k]=x%2;
x/=2;
k++;
}while(x);
}
例:将10个整数按小到大排列。
数据排序有多种方法,我们这里介绍选择排序法。
(11)以下程序的功能是统计正整数的各位数字中零的个数,并求各位数字中最大者。
(12)写完整的程序,用公式
计算e的近似值,直到某项小于10-7为止。
(13)试写一个函数,以m为整型参数,判别m是否为素数。若m是素数,则返回1;若m不是素数,则返回0。
(14)编写函数,根据公式1公里=5/8英里,把英里数转换为公里数。
y=1!+3!+5!+7!
(18)编写一个程序,打印出所有的“梅花数”。所谓“梅花数”是一个五位数,其各位数字的五次方和等于该数本身。例如:54748是一个“梅花数”,因为54748=55+45+75+45+85
(19)求100~150之间和400~450之间能被9整除的数。
(20)输出1至100之间每位数的乘积大于每位数的和的数。
(15)试用for控制结构,求数组a[N]的前k(k<=n)个元素中的最大值及最小值,并将结果分别存于变量max和min中。
(16)编写函数,实现计算n个元素组成的整型数组中去掉一个最大值和一个最小值后的平均值(如有多个相同的最大值和最小值,只要去掉一个,且设n大于2)。
(17)设计函数,求整数n的阶乘,并在主函数中调用该函数(通过循环结构)计算下列多项式:
(37)将三个学生的数据存入名为“student.dat”的文件。学生数据包括学号、姓名、年龄。
(38)编写程序将终端读入的文本(用#作为文本结束标志)复制到一个名为bi.dat的新文件中。
(39)设单链表的结点类型doctor中有工号num(整型)、工资pay(实型)和next(指向doctor类型的指针类型)三个成员。假定单链表已经建立,链表首指针为head,试写一个函数,以head为形式参数,其功能是删除给定工号为n的结点。
(24)用公式
求л的近似值,直到最后一项的值小于10-6为止。
(25)试用do-while控制结构,计算下列公式的近似值
当某项的值小于0.0001时,该项及以后各项不再累加,结束循环求和。
(26)输入一个正整数,要求以相反的顺序输出该数。
(27)编写计算字符串长度的函数。
(28)用公式:
求π的值,直到最后一项的绝对值小于10-6为止。
}
例:请输入n值,编写程序输出下列图形(例如n=5).
1 2 3 4 5
1 1 2 3 4
1 1 1 2 3
1 1 1 1 2
1 1 1 1 1
对于图形打印题目,我们应该这样来考虑。图形由若干行组成,也就是我们要重复打印行的操作若干次,用循环实现。这样程序的基本结构为:
scanf(“%d”,&n);
maxa=a[i];/* maxa为最小元素。*/
for(j=i+1;j<=10;j++)
{
if(a[j]<maxa)
{
{t=a[j];a[j]=maxa;maxa=t;}
max=j;/* max为最小元素下标。*/
}
t=a[i];a[i]=a[max];a[max]=t;
在数组中我们用下标区分数组元素。如,若max为最小元素下标,则a[max]为最小元素。那么,以上程序段可以简化为:
for(i=1;i<=n;i++)
{
打印第i行
}
循环体为“打印第i行”的操作。而第i行是由若干列,i个1和2,3,……n-i组成。所以打印“第i行”的操作为输出n个数:for(j=1;j<=i;i++) printf(“%d”,1);for(j=2;j<=n-i;j++) printf(“%d”,j);。所以此题目的程序为: