程序编程范文
时间:2023-04-03 19:19:05
导语:如何才能写好一篇程序编程,这就需要搜集整理更多的资料和文献,欢迎阅读由公务员之家整理的十篇范文,供你借鉴。
篇1
本课介绍c语言程序设计的基本方法和基本的程序语句。
从程序流程的角度来看,程序可以分为三种基本结构,即顺序结构、分支结构、循环结构。这三种基本结构可以组成所有的各种复杂程序。c语言提供了多种语句来实现这些程序结构。本章介绍这些基本语句及其应用,使读者对c程序有一个初步的认识,为后面各章的学习打下基础。
c程序的语句
c程序的执行部分是由语句组成的。程序的功能也是由执行语句实现的。
C语句可分为以下五类:
1.表达式语句
2.函数调用语句
3.控制语句
4.复合语句
5.空语句
1.表达式语句
表达式语句由表达式加上分号“;”组成。其一般形式为:表达式;执行表达式语句就是计算表达式的值。例如:x=y+z;赋值语句y+z;加法运算语句,但计算结果不能保留,无实际意义i++;自增1语句,i值增1
2.函数调用语句
由函数名、实际参数加上分号“;”组成。其一般形式为:函数名(实际参数表);执行函数语句就是调用函数体并把实际参数赋予函数定义中的形式参数,然后执行被调函数体中的语句,求取函数值。(在第五章函数中再详细介绍)例如printf("CProgram");调用库函数,输出字符串。
3.控制语句
控制语句用于控制程序的流程,以实现程序的各种结构方式。
它们由特定的语句定义符组成。c语言有九种控制语句。可分成以下三类:
(1)条件判断语句
if语句,switch语句
(2)循环执行语句
dowhile语句,while语句,for语句
(3)转向语句
break语句,goto语句,continue语句,return语句
4.复合语句
把多个语句用括号{}括起来组成的一个语句称复合语句。在程序中应把复合语句看成是单条语句,而不是多条语句,例如
{
x=y+z;
a=b+c;
printf(“%d%d”,x,a);
}
是一条复合语句。复合语句内的各条语句都必须以分号“;”结尾,在括号“}”外不能加分号。
5.空语句
只有分号“;”组成的语句称为空语句。空语句是什么也不执行的语句。在程序中空语句可用来作空循环体。例如while(getchar()!=''''\n'''');本语句的功能是,只要从键盘输入的字符不是回车则重新输入。这里的循环体为空语句。
赋值语句
赋值语句是由赋值表达式再加上分号构成的表达式语句。其一般形式为:变量=表达式;赋值语句的功能和特点都与赋值表达式相同。它是程序中使用最多的语句之一。在赋值语句的使用中需要注意以下几点:
1.由于在赋值符“=”右边的表达式也可以又是一个赋值表达式,因此,下述形式变量=(变量=表达式);是成立的,从而形成嵌套的情形。其展开之后的一般形式为:变量=变量=…=表达式;
例如:
a=b=c=d=e=5;按照赋值运算符的右接合性,因此实际上等效于:
e=5;
d=e;
c=d;
b=c;
a=b;
2.注意在变量说明中给变量赋初值和赋值语句的区别。给变量赋初值是变量说明的一部分,赋初值后的变量与其后的其它同类变量之间仍必须用逗号间隔,而赋值语句则必须用分号结尾。
3.在变量说明中,不允许连续给多个变量赋初值。如下述说明是错误的:inta=b=c=5必须写为inta=5,b=5,c=5;而赋值语句允许连续赋值
4.注意赋值表达式和赋值语句的区别。赋值表达式是一种表达式,它可以出现在任何允许表达式出现的地方,而赋值语句则不能。
下述语句是合法的:if((x=y+5)>0)z=x;语句的功能是,若表达式x=y+5大于0则z=x。下述语句是非法的:if((x=y+5;)>0)z=x;因为=y+5;是语句,不能出现在表达式中。
数据输出语句
本小节介绍的是向标准输出设备显示器输出数据的语句。在c语言中,所有的数据输入/输出都是由库函数完成的。因此都是函数语句。本小节先介绍printf函数和putchar函数。printf函数printf函数称为格式输出函数,其关键字最末一个字母f即为“格式”(format)之意。其功能是按用户指定的格式,把指定的数据显示到显示器屏幕上。在前面的例题中我们已多次使用过这个函数。
一、printf函数调用的一般形式
printf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。但作为一个特例,不要求在使用printf函数之前必须包含stdio.h文件。printf函数调用的一般形式为:printf(“格式控制字符串”,输出表列)其中格式控制字符串用于指定输出格式。格式控制串可由格式字符串和非格式字符串两种组成。格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。如“%d”表示按十进制整型输出,“%ld”表示按十进制长整型输出,“%c”表示按字符型输出等。后面将专门给予讨论。
非格式字符串在输出时原样照印,在显示中起提示作用。输出表列中给出了各个输出项,要求格式字符串和各输出项在数量和类型上应该一一对应。
voidmain()
{
inta=88,b=89;
printf("%d%d\n",a,b);
printf("%d,%d\n",a,b);
printf("%c,%c\n",a,b);
printf("a=%d,b=%d",a,b);
}
a<--8,b<--89
printf("%d%d\n",a,b);
printf("%d,%d\n",a,b);
printf("%c,%c\n",a,b);
printf("a=%d,b=%d",a,b);
本例中四次输出了a,b的值,但由于格式控制串不同,输出的结果也不相同。第四行的输出语句格式控制串中,两格式串%d之间加了一个空格(非格式字符),所以输出的a,b值之间有一个空格。第五行的printf语句格式控制串中加入的是非格式字符逗号,因此输出的a,b值之间加了一个逗号。第六行的格式串要求按字符型输出a,b值。第七行中为了提示输出结果又增加了非格式字符串。
二、格式字符串
在TurboC中格式字符串的一般形式为:[标志][输出最小宽度][.精度][长度]类型其中方括号[]中的项为可选项。各项的意义介绍如下:
1.类型类型字符用以表示输出数据的类型,其格式符和意义下表所示:
表示输出类型的格式字符格式字符意义
d以十进制形式输出带符号整数(正数不输出符号)
o以八进制形式输出无符号整数(不输出前缀O)
x以十六进制形式输出无符号整数(不输出前缀OX)
u以十进制形式输出无符号整数
f以小数形式输出单、双精度实数
e以指数形式输出单、双精度实数
g以%f%e中较短的输出宽度输出单、双精度实数
c输出单个字符
s输出字符串
2.标志
标志字符为-、+、#、空格四种,其意义下表所示:
标志格式字符标志意义
-结果左对齐,右边填空格
+输出符号(正号或负号)空格输出值为正时冠以空格,为负时冠以负号
#对c,s,d,u类无影响;对o类,在输出时加前
缀o对x类,在输出时加前缀0x;对e,g,f类当结果有小数时才给出小数点
3.输出最小宽度
用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。
4.精度
精度格式符以“.”开头,后跟十进制整数。本项的意义是:如果输出数字,则表示小数的位数;如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。
5.长度
长度格式符为h,l两种,h表示按短整型量输出,l表示按长整型量输出。
voidmain(){
inta=15;
floatb=138.3576278;
doublec=35648256.3645687;
chard=''''p'''';
printf("a=%d,%5d,%o,%x\n",a,a,a,a);
printf("b=%f,%lf,%5.4lf,%e\n",b,b,b,b);
printf("c=%lf,%f,%8.4lf\n",c,c,c);
printf("d=%c,%8c\n",d,d);
}a<--15
b<--138.3576278
c<--35648256.3645687
d<--''''p''''main()
{
inta=29;
floatb=1243.2341;
doublec=24212345.24232;
charc=''''h''''
printf("a=%d,%5d,%o,%x\n",a,a,a,a);
printf("b=%f,%lf,%5.4lf,%e\n",b,b,b,b);
printf("c=%lf,%f,%8.4lf\n",c,c,c);
printf("d=%c,%8c\n",d,d);
}
本例第七行中以四种格式输出整型变量a的值,其中“%5d”要求输出宽度为5,而a值为15只有两位故补三个空格。第八行中以四种格式输出实型量b的值。其中“%f”和“%lf”格式的输出相同,说明“l”符对“f”类型无影响。“%5.4lf”指定输出宽度为5,精度为4,由于实际长度超过5故应该按实际位数输出,小数位数超过4位部分被截去。第九行输出双精度实数,“%8.4lf”由于指定精度为4位故截去了超过4位的部分。第十行输出字符量d,其中“%bc”指定输出宽度为8故在输出字符p之前补加7个空格。
使用printf函数时还要注意一个问题,那就是输出表列中的求值顺序。不同的编译系统不一定相同,可以从左到右,也可从右到左。TurboC是按从右到左进行的。如把例2.13改写如下述形式:
voidmain(){
inti=8;
printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i--,i++,-i--);
}i<--8
这个程序与例2.13相比只是把多个printf语句改一个printf语句输出。但从结果可以看出是不同的。为什么结果会不同呢?就是因为printf函数对输出表中各量求值的顺序是自右至左进行的。在式中,先对最后一项“-i--”求值,结果为-8,然后i自减1后为7。再对“-i++”项求值得-7,然后i自增1后为8。再对“i--”项求值得8,然后i再自减1后为7。再求“i++”项得7,然后I再自增1后为8。再求“--i”项,i先自减1后输出,输出值为7。最后才求输出表列中的第一项“++i”,此时i自增1后输出8。但是必须注意,求值顺序虽是自右至左,但是输出顺序还是从左至右,因此得到的结果是上述输出结果。
字符输出函数
putchar函数
putchar函数是字符输出函数,其功能是在显示器上输出单个字符。其一般形式为:putchar(字符变量)例如:
putchar(''''A'''');输出大写字母A
putchar(x);输出字符变量x的值
putchar(''''\n'''');换行对控制字符则执行控制功能,不在屏幕上显示。使用本函数前必须要用文件包含命令:
#include<stdio.h>
#include<stdio.h>
voidmain(){
chara=''''B'''',b=''''o'''',c=''''k'''';
putchar(a);putchar(b);putchar(b);putchar(c);putchar(''''\t'''');
putchar(a);putchar(b);
putchar(''''\n'''');
putchar(b);putchar(c);
}
数据输入语句
c语言的数据输入也是由函数语句完成的。本节介绍从标准输入设备—键盘上输入数据的函数scanf和getchar。scanf函数scanf函数称为格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。
一、scanf函数的一般形式
scanf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中,与printf函数相同,c语言也允许在使用scanf函数之前不必包含stdio.h文件。scanf函数的一般形式为:scanf(“格式控制字符串”,地址表列);其中,格式控制字符串的作用与printf函数相同,但不能显示非格式字符串,也就是不能显示提示字符串。地址表列中给出各变量的地址。地址是由地址运算符“&”后跟变量名组成的。例如,&a,&b分别表示变量a和变量b的地址。这个地址就是编译系统在内存中给a,b变量分配的地址。在c语言中,使用了地址这个概念,这是与其它语言不同的。应该把变量的值和变量的地址这两个不同的概念区别开来。变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。变量的地址和变量值的关系如下:&a--->a567a为变量名,567是变量的值,&a是变量a的地址。在赋值表达式中给变量赋值,如:a=567在赋值号左边是变量名,不能写地址,而scanf函数在本质上也是给变量赋值,但要求写变量的地址,如&a。这两者在形式上是不同的。&是一个取地址运算符,&a是一个表达式,其功能是求变量的地址。
voidmain(){
inta,b,c;
printf("inputa,b,c\n");
scanf("%d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d",a,b,c);
}
注意&的用法!
在本例中,由于scanf函数本身不能显示提示串,故先用printf语句在屏幕上输出提示,请用户输入a、b、c的值。执行scanf语句,则退出TC屏幕进入用户屏幕等待用户输入。用户输入7、8、9后按下回车键,此时,系统又将返回TC屏幕。在scanf语句的格式串中由于没有非格式字符在“%d%d%d”之间作输入时的间隔,因此在输入时要用一个以上的空格或回车键作为每两个输入数之间的间隔。
如:789
或
7
8
9
格式字符串
格式字符串的一般形式为:%[*][输入数据宽度][长度]类型其中有方括号[]的项为任选项。各项的意义如下:
1.类型
表示输入数据的类型,其格式符和意义下表所示。
格式字符意义
d输入十进制整数
o输入八进制整数
x输入十六进制整数
u输入无符号十进制整数
f或e输入实型数(用小数形式或指数形式)
c输入单个字符
s输入字符串
2.“*”符
用以表示该输入项读入后不赋予相应的变量,即跳过该输入值。如scanf("%d%*d%d",&a,&b);当输入为:123时,把1赋予a,2被跳过,3赋予b。
3.宽度
用十进制整数指定输入的宽度(即字符数)。例如:scanf("%5d",&a);
输入:
12345678
只把12345赋予变量a,其余部分被截去。又如:scanf("%4d%4d",&a,&b);
输入:
12345678将把1234赋予a,而把5678赋予b。
4.长度
长度格式符为l和h,l表示输入长整型数据(如%ld)和双精度浮点数(如%lf)。h表示输入短整型数据。
使用scanf函数还必须注意以下几点:
a.scanf函数中没有精度控制,如:scanf("%5.2f",&a);是非法的。不能企图用此语句输入小数为2位的实数。
b.scanf中要求给出变量地址,如给出变量名则会出错。如scanf("%d",a);是非法的,应改为scnaf("%d",&a);才是合法的。
c.在输入多个数值数据时,若格式控制串中没有非格式字符作输入数据之间的间隔则可用空格,TAB或回车作间隔。C编译在碰到空格,TAB,回车或非法数据(如对“%d”输入“12A”时,A即为非法数据)时即认为该数据结束。
d.在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。例如:
scanf("%c%c%c",&a,&b,&c);
输入为:
def
则把''''d''''赋予a,''''f''''赋予b,''''e''''赋予c。只有当输入为:
def
时,才能把''''d''''赋于a,''''e''''赋予b,''''f''''赋予c。如果在格式控制中加入空格作为间隔,如scanf("%c%c%c",&a,&b,&c);则输入时各数据之间可加空格。
voidmain(){
chara,b;
printf("inputcharactera,b\n");
scanf("%c%c",&a,&b);
printf("%c%c\n",a,b);
}
scanf("''''C14F14%c%c",&a,&b);
printf("%c%c\n",a,b);由于scanf函数"%c%c"中没有空格,输入MN,结果输出只有M。
而输入改为MN时则可输出MN两字符,见下面的输入运行情况:inputcharactera,b
MN
MN
voidmain(){
chara,b;
printf("inputcharactera,b\n");
scanf("%c%c",&a,&b);
printf("\n%c%c\n",a,b);
}
scanf("%c%c",&a,&b);本例表示scanf格式控制串"%c%c"之间有空格时,输入的数据之间可以有空格间隔。e.如果格式控制串中有非格式字符则输入时也要输入该非格式字符。
例如:
scanf("%d,%d,%d",&a,&b,&c);其中用非格式符“,”作间隔符,故输入时应为:5,6,7
又如:scanf("a=%d,b=%d,c=%d",&a,&b,&c);
则输入应为
a=5,b=6,c=7g.如输入的数据与输出的类型不一致时,虽然编译能够通过,但结果将不正确。
voidmain(){
inta;
printf("inputanumber\n");
scanf("%d",&a);
printf("%ld",a);
}
由于输入数据类型为整型,而输出语句的格式串中说明为长整型,因此输出结果和输入数据不符。如改动程序如下:
voidmain(){
longa;
printf("inputalonginteger\n");
scanf("%ld",&a);
printf("%ld",a);
}
运行结果为:
inputalonginteger
1234567890
1234567890当输入数据改为长整型后,输入输出数据相等。
键盘输入函数
getchar函数getchar函数的功能是从键盘上输入一个字符。其一般形式为:getchar();通常把输入的字符赋予一个字符变量,构成赋值语句,如:
charc;
c=getchar();#include<stdio.h>
voidmain(){
charc;
printf("inputacharacter\n");
c=getchar();
putchar(c);
}
使用getchar函数还应注意几个问题:
1.getchar函数只能接受单个字符,输入数字也按字符处理。输入多于一个字符时,只接收第一个字符。
2.使用本函数前必须包含文件“stdio.h”。
3.在TC屏幕下运行含本函数程序时,将退出TC屏幕进入用户屏幕等待用户输入。输入完毕再返回TC屏幕。
voidmain(){
chara,b,c;
printf("inputcharactera,b,c\n");
scanf("%c%c%c",&a,&b,&c);
printf("%d,%d,%d\n%c,%c,%c\n",a,b,c,a-32,b-32,c-32);
}
输入三个小写字母
输出其ASCII码和对应的大写字母。
voidmain(){
inta;
longb;
floatf;
doubled;
charc;
printf("%d,%d,%d,%d,%d",sizeof(a),sizeof(b),sizeof(f)
,sizeof(d),sizeof(c));
}
输出各种数据类型的字节长度。
分支结构程序
关系运算符和表达式
在程序中经常需要比较两个量的大小关系,以决定程序下一步的工作。比较两个量的运算符称为关系运算符。在c语言中有以下关系运算符:
<小于
<=小于或等于
>大于
>=大于或等于
==等于
!=不等于
关系运算符都是双目运算符,其结合性均为左结合。关系运算符的优先级低于算术运算符,高于赋值运算符。在六个关系运算符中,<,<=,>,>=的优先级相同,高于==和!=,==和!=的优先级相同。
关系表达式
关系表达式的一般形式为:表达式关系运算符表达式例如:a+b>c-d,x>3/2,''''a''''+1<c,-i-5*j==k+1;都是合法的关系表达式。由于表达式也可以又是关系表达式。因此也允许出现嵌套的情况,例如:a>(b>c),a!=(c==d)等。关系表达式的值是“真”和“假”,用“1”和“0”表示。
如:5>0的值为“真”,即为1。(a=3)>(b=5)由于3>5不成立,故其值为假,即为0。
voidmain(){
charc=''''k'''';
inti=1,j=2,k=3;
floatx=3e+5,y=0.85;
printf("%d,%d\n",''''a''''+5<c,-i-2*j>=k+1);
printf("%d,%d\n",1<j<5,x-5.25<=x+y);
printf("%d,%d\n",i+j+k==-2*j,k==j==i+5);
}
charc=''''k'''';
inti=1,j=2,k=3;
floatx=3e+5,y=0.85;
printf("%d,%d\n",''''a''''+5<c,-i-2*j>=k+1);
printf("%d,%d\n",1<j<5,x-5.25<=x+y);
printf("%d,%d\n",i+j+k==-2*j,k==j==i+5);
在本例中求出了各种关系运算符的值。字符变量是以它对应的ASCII码参与运算的。对于含多个关系运算符的表达式,如k==j==i+5,根据运算符的左结合性,先计算k==j,该式不成立,其值为0,再计算0==i+5,也不成立,故表达式值为0。
逻辑运算符和表达式
逻辑运算符c语言中提供了三种逻辑运算符&&与运算||或运算!非运算与运算符&&和或运算符||均为双目运算符。具有左结合性。非
运算符!为单目运算符,具有右结合性。逻辑运算符和其它运算符优先级的关系可表示如下:
按照运算符的优先顺序可以得出:
a>b&&c>d等价于(a>b)&&(c>d)
!b==c||d<a等价于((!b)==c)||(d<a)
a+b>c&&x+y<b等价于((a+b)>c)&&((x+y)<b)
逻辑运算的值
逻辑运算的值也为“真”和“假”两种,用“1”和“0”来表示。其求值规则如下:
1.与运算&&参与运算的两个量都为真时,结果才为真,否则为假。例如,5>0&&4>2,由于5>0为真,4>2也为真,相与的结果也为真。
2.或运算||参与运算的两个量只要有一个为真,结果就为真。两个量都为假时,结果为假。例如:5>0||5>8,由于5>0为真,相或的结果也就为真
3.非运算!参与运算量为真时,结果为假;参与运算量为假时,结果为真。
例如:!(5>0)的结果为假。
虽然c编译在给出逻辑运算值时,以“1”代表“真”,“0”代表“假”。但反过来在判断一个量是为“真”还是为“假”时,以“0”代表“假”,以非“0”的数值作为“真”。例如:由于5和3均为非“0”因此5&&3的值为“真”,即为1。
又如:5||0的值为“真”,即为1。
逻辑表达式逻辑表达式的一般形式为:表达式逻辑运算符表达式其中的表达式可以又是逻辑表达式,从而组成了嵌套的情形。例如:(a&&b)&&c根据逻辑运算符的左结合性,上式也可写为:a&&b&&c逻辑表达式的值是式中各种逻辑运算的最后值,以“1”和“0”分别代表“真”和“假”。
voidmain(){
charc=''''k'''';
inti=1,j=2,k=3;
floatx=3e+5,y=0.85;
printf("%d,%d\n",!x*!y,!!!x);
printf("%d,%d\n",x||i&&j-3,i<j&&x<y);
printf("%d,%d\n",i==5&&c&&(j=8),x+y||i+j+k);
}charc=''''k'''';
inti=1,j=2,k=3;
floatx=3e+5,y=0.85;
printf("%d,%d\n",!x*!y,!!!x);
printf("%d,%d\n",x||i&&j-3,i<j&&x<y);
printf("%d,%d\n",i==5&&c&&(j=8),x+y||i+j+k);
本例中!x和!y分别为0,!x*!y也为0,故其输出值为0。由于x为非0,故!!!x的逻辑值为0。对x||i&&j-3式,先计算j-3的值为非0,再求i&&j-3的逻辑值为1,故x||i&&j-3的逻辑值为1。对i<j&&x<y式,由于i<j的值为1,而x<y为0故表达式的值为1,0相与,最后为0,对i==5&&c&&(j=8)式,由于i==5为假,即值为0,该表达式由两个与运算组成,所以整个表达式的值为0。对于式x+y||i+j+k由于x+y的值为非0,故整个或表达式的值为1。
if语句
用if语句可以构成分支结构。它根据给定的条件进行判断,以决定执行某个分支程序段。c语言的if语句有三种基本形式。
1.第一种形式为基本形式if(表达式)语句;其语义是:如果表达式的值为真,则执行其后的语句,否则不执行该语句。其过程可表示为下图
voidmain(){
inta,b,max;
printf("\ninputtwonumbers:");
scanf("%d%d",&a,&b);
max=a;
if(max<b)max=b;
printf("max=%d",max);
}
输入两个整数,输出其中的大数。
scanf("%d%d",&a,&b);
max=a;
if(max<b)max=b;
printf("max=%d",max);
本例程序中,输入两个数a,b。把a先赋予变量max,再用if语句判别max和b的大小,如max小于b,则把b赋予max。因此max中总是大数,最后输出max的值。
2.第二种形式为if-else形式
if(表达式)
语句1;
else
语句2;
其语义是:如果表达式的值为真,则执行语句1,否则执行语句2。
voidmain(){
inta,b;
printf("inputtwonumbers:");
scanf("%d%d",&a,&b);
if(a>b)
printf("max=%d\n",a);
else
printf("max=%d\n",b);
}
输入两个整数,输出其中的大数。改用if-else语句判别a,b的大小,若a大,则输出a,否则输出b。
3.第三种形式为if-else-if形式
前二种形式的if语句一般都用于两个分支的情况。当有多个分支选择时,可采用if-else-if语句,其一般形式为:
if(表达式1)
语句1;
elseif(表达式2)
语句2;
elseif(表达式3)
语句3;
…
elseif(表达式m)
语句m;
else
语句n;
其语义是:依次判断表达式的值,当出现某个值为真时,则执行其对应的语句。然后跳到整个if语句之外继续执行程序。如果所有的表达式均为假,则执行语句n。然后继续执行后续程序。if-else-if语句的执行过程如图3—3所示。
#include"stdio.h"
voidmain(){
charc;
printf("inputacharacter:");
c=getchar();
if(c<32)
printf("Thisisacontrolcharacter\n");
elseif(c>=''''0''''&&c<=''''9'''')
printf("Thisisadigit\n");
elseif(c>=''''A''''&&c<=''''Z'''')
printf("Thisisacapitalletter\n");
elseif(c>=''''a''''&&c<=''''z'''')
printf("Thisisasmallletter\n");
else
printf("Thisisanothercharacter\n");
}
if(c<32)
printf("Thisisacontrolcharacter\n");
elseif(c>=''''0''''&&c<=''''9'''')
printf("Thisisadigit\n");
elseif(c>=''''A''''&&c<=''''Z'''')
printf("Thisisacapitalletter\n");
elseif(c>=''''a''''&&c<=''''z'''')
printf("Thisisasmallletter\n");
else
printf("Thisisanothercharacter\n");
本例要求判别键盘输入字符的类别。可以根据输入字符的ASCII码来判别类型。由ASCII码表可知ASCII值小于32的为控制字符。在“0”和“9”之间的为数字,在“A”和“Z”之间为大写字母,在“a”和“z”之间为小写字母,其余则为其它字符。这是一个多分支选择的问题,用if-else-if语句编程,判断输入字符ASCII码所在的范围,分别给出不同的输出。例如输入为“g”,输出显示它为小写字符。
4.在使用if语句中还应注意以下问题
(1)在三种形式的if语句中,在if关键字之后均为表达式。该表达式通常是逻辑表达式或关系表达式,但也可以是其它表达式,如赋值表达式等,甚至也可以是一个变量。例如:if(a=5)语句;if(b)语句;都是允许的。只要表达式的值为非0,即为“真”。如在if(a=5)…;中表达式的值永远为非0,所以其后的语句总是要执行的,当然这种情况在程序中不一定会出现,但在语法上是合法的。
又如,有程序段:if(a=b)
printf("%d",a);
else
printf("a=0");本语句的语义是,把b值赋予a,如为非0则输出该值,否则输出“a=0”字符串。这种用法在程序中是经常出现的。
(2)在if语句中,条件判断表达式必须用括号括起来,在语句之后必须加分号。
(3)在if语句的三种形式中,所有的语句应为单个语句,如果要想在满足条件时执行一组(多个)语句,则必须把这一组语句用{}括起来组成一个复合语句。但要注意的是在}之后不能再加分号。
例如:
if(a>b){
a++;
b++;
}
else{a=0;
b=10;
}
if语句的嵌套
当if语句中的执行语句又是if语句时,则构成了if语句嵌套的情形。其一般形式可表示如下:
if(表达式)
if语句;
或者为
if(表达式)
if语句;
else
if语句;
在嵌套内的if语句可能又是if-else型的,这将会出现多个if和多个else重叠的情况,这时要特别注意if和else的配对问题。例如:
if(表达式1)
if(表达式2)
语句1;
else
语句2;
其中的else究竟是与哪一个if配对呢?
应该理解为:还是应理解为:
if(表达式1)if(表达式1)
if(表达式2)if(表达式2)
语句1;语句1;
elseelse
语句2;语句2;
为了避免这种二义性,c语言规定,else总是与它前面最近的if配对,因此对上述例子应按前一种情况理解。
voidmain(){
inta,b;
printf("pleaseinputA,B:");
scanf("%d%d",&a,&b);
if(a!=b)
if(a>b)printf("A>B\n");
elseprintf("A<B\n");
elseprintf("A=B\n");
}
比较两个数的大小关系。
printf("pleaseinputA,B:");
scanf("%d%d",&a,&b);
if(a!=b)
if(a>b)printf("A>B\n");
elseprintf("A<B\n");
elseprintf("A=B\n");
本例中用了if语句的嵌套结构。采用嵌套结构实质上是为了进行多分支选择,例3.16实际上有三种选择即A>B、A<B或A=B。这种问题用if-else-if语句也可以完成。而且程序更加清晰。因此,在一般情况下较少使用if语句的嵌套结构。以使程序更便于阅读理解。
voidmain(){
inta,b;
printf("pleaseinputA,B:");
scanf("%d%d",&a,&b);
if(a==b)printf("A=B\n");
elseif(a>b)printf("A>B\n");
elseprintf("A<B\n");
}
条件运算符和条件表达式
如果在条件语句中,只执行单个的赋值语句时,常可使用条件表达式来实现。不但使程序简洁,也提高了运行效率。
条件运算符为?和:,它是一个三目运算符,即有三个参与运算的量。由条件运算符组成条件表达式的一般形式为:
表达式1?表达式2:表达式3
其求值规则为:如果表达式1的值为真,则以表达式2的值作为条件表达式的值,否则以表达式2的值作为整个条件表达式的值。条件表达式通常用于赋值语句之中。
例如条件语句:
if(a>b)max=a;
elsemax=b;
可用条件表达式写为max=(a>b)?a:b;执行该语句的语义是:如a>b为真,则把a赋予max,否则把b赋予max。
使用条件表达式时,还应注意以下几点:
1.条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符。因此max=(a>b)?a:b可以去掉括号而写为max=a>b?a:b
2.条件运算符?和:是一对运算符,不能分开单独使用。
3.条件运算符的结合方向是自右至左。
例如:
a>b?a:c>d?c:d应理解为
a>b?a:(c>d?c:d)这也就是条件表达式嵌套的情形,即其中的表达式3又是一个条
件表达式。
voidmain(){
inta,b,max;
printf("\ninputtwonumbers:");
scanf("%d%d",&a,&b);
printf("max=%d",a>b?a:b);
}
用条件表达式对上例重新编程,输出两个数中的大数。
switch语句
c语言还提供了另一种用于多分支选择的switch语句,其一般形式为:
switch(表达式){
case常量表达式1:语句1;
case常量表达式2:语句2;
…
case常量表达式n:语句n;
default:语句n+1;
}
其语义是:计算表达式的值。并逐个与其后的常量表达式值相比较,当表达式的值与某个常量表达式的值相等时,即执行其后的语句,然后不再进行判断,继续执行后面所有case后的语句。如表达式的值与所有case后的常量表达式均不相同时,则执行default后的语句。
voidmain(){
inta;
printf("inputintegernumber:");
scanf("%d",&a);
switch(a){
case1:printf("Monday\n");
case2:printf("Tuesday\n");
case3:printf("Wednesday\n");
case4:printf("Thursday\n");
case5:printf("Friday\n");
case6:printf("Saturday\n");
case7:printf("Sunday\n");
default:printf("error\n");
}
}
本程序是要求输入一个数字,输出一个英文单词。但是当输入3之后,却执行了case3以及以后的所有语句,输出了Wednesday及以后的所有单词。这当然是不希望的。为什么会出现这种情况呢?这恰恰反应了switch语句的一个特点。在switch语句中,“case常量表达式”只相当于一个语句标号,表达式的值和某标号相等则转向该标号执行,但不能在执行完该标号的语句后自动跳出整个switch语句,所以出现了继续执行所有后面case语句的情况。这是与前面介绍的if语句完全不同的,应特别注意。为了避免上述情况,c语言还提供了一种break语句,专用于跳出switch语句,break语句只有关键字break,没有参数。在后面还将详细介绍。修改例题的程序,在每一case语句之后增加break语句,使每一次执行之后均可跳出switch语句,从而避免输出不应有的结果。
voidmain(){
inta;
printf("inputintegernumber:");
scanf("%d",&a);
switch(a){
case1:printf("Monday\n");break;
case2:printf("Tuesday\n");break;
case3:printf("Wednesday\n");break;
case4:printf("Thursday\n");break;
case5:printf("Friday\n");break;
case6:printf("Saturday\n");break;
case7:printf("Sunday\n");break;
default:printf("error\n");
}
}
在使用switch语句时还应注意以下几点:
1.在case后的各常量表达式的值不能相同,否则会出现错误。
2.在case后,允许有多个语句,可以不用{}括起来。
3.各case和default子句的先后顺序可以变动,而不会影响程序执行结果。
4.default子句可以省略不用。程序举例
输入三个整数,输出最大数和最小数。
voidmain(){
inta,b,c,max,min;
printf("inputthreenumbers:");
scanf("%d%d%d",&a,&b,&c);
if(a>b)
{max=a;min=b;}
else
{max=b;min=a;}
if(max<c)
max=c;
else
if(min>c)
min=c;
printf("max=%d\nmin=%d",max,min);
}
本程序中,首先比较输入的a,b的大小,并把大数装入max,小数装入min中,然后再与c比较,若max小于c,则把c赋予max;如果c小于min,则把c赋予min。因此max内总是最大数,而min内总是最小数。最后输出max和min的值即可。计算器程序。用户输入运算数和四则运算符,输出计算结果。
voidmain(){
floata,b,s;
charc;
printf("inputexpression:a+(-,*,/)b\n");
scanf("%f%c%f",&a,&c,&b);
switch(c){
case''''+'''':printf("%f\n",a+b);break;
case''''-'''':printf("%f\n",a-b);break;
case''''*'''':printf("%f\n",a*b);break;
case''''/'''':printf("%f\n",a/b);break;
default:printf("inputerror\n");
}
}
floata,b,s;
charc;
printf("inputexpression:a+(-,*,/)b\n");
scanf("%f%c%f",&a,&c,&b);
switch(c){
case''''+'''':printf("%f\n",a+b);break;
case''''-'''':printf("%f\n",a-b);break;
case''''*'''':printf("%f\n",a*b);break;
case''''/'''':printf("%f\n",a/b);break;
default:printf("inputerror\n");
}
本例可用于四则运算求值。switch语句用于判断运算符,然后输出运算值。当输入运算符不是+,-,*,/时给出错误提示。
循环结构程序
循环结构是程序中一种很重要的结构。其特点是,在给定条件成立时,反复执行某程序段,直到条件不成立为止。给定的条件称为循环条件,反复执行的程序段称为循环体。c语言提供了多种循环语句,可以组成各种不同形式的循环结构。
while语句
while语句的一般形式为:while(表达式)语句;其中表达式是循环条件,语句为循环体。
while语句的语义是:计算表达式的值,当值为真(非0)时,执行循环体语句。其执行过程可用图3—4表示。统计从键盘输入一行字符的个数。
#include<stdio.h>
voidmain(){
intn=0;
printf("inputastring:\n");
while(getchar()!=''''\n'''')n++;
printf("%d",n);
}intn=0;
printf("inputastring:\n");
while(getchar()!=''''\n'''')
n++;
printf("%d",n);
本例程序中的循环条件为getchar()!=''''\n'''',其意义是,只要从键盘输入的字符不是回车就继续循环。循环体n++完成对输入字符个数计数。从而程序实现了对输入一行字符的字符个数计数。
使用while语句应注意以下几点:
1.while语句中的表达式一般是关系表达或逻辑表达式,只要表达式的值为真(非0)即可继续循环。
voidmain(){
inta=0,n;
printf("\ninputn:");
scanf("%d",&n);
while(n--)
printf("%d",a++*2);
}inta=0,n;
printf("\ninputn:");
scanf("%d",&n);
while(n--)
printf("%d",a++*2);
本例程序将执行n次循环,每执行一次,n值减1。循环体输出表达式a++*2的值。该表达式等效于(a*2;a++)
2.循环体如包括有一个以上的语句,则必须用{}括起来,组成复合语句。
3.应注意循环条件的选择以避免死循环。
voidmain(){
inta,n=0;
while(a=5)
printf("%d",n++);
}inta,n=0;
while(a=5)
printf("%d",n++);
本例中while语句的循环条件为赋值表达式a=5,因此该表达式的值永远为真,而循环体中又没有其它中止循环的手段,因此该循环将无休止地进行下去,形成死循环。4.允许while语句的循环体又是while语句,从而形成双重循环。
do-while语句
do-while语句的一般形式为:
do
语句;
while(表达式);
其中语句是循环体,表达式是循环条件。
do-while语句的语义是:
先执行循环体语句一次,再判别表达式的值,若为真(非0)则继续循环,否则终止循环。
do-while语句和while语句的区别在于do-while是先执行后判断,因此do-while至少要执行一次循环体。而while是先判断后执行,如果条件不满足,则一次循环体语句也不执行。
while语句和do-while语句一般都可以相互改写。
voidmain(){
inta=0,n;
printf("\ninputn:");
scanf("%d",&n);
doprintf("%d",a++*2);
while(--n);
}
inta=0,n;
printf("\ninputn:");
scanf("%d",&n);
doprintf("%d",a++*2);
while(--n);
在本例中,循环条件改为--n,否则将多执行一次循环。这是由于先执行后判断而造成的。
对于do-while语句还应注意以下几点:
1.在if语句,while语句中,表达式后面都不能加分号,而在do-while语句的表达式后面则必须加分号。
2.do-while语句也可以组成多重循环,而且也可以和while语句相互嵌套。
3.在do和while之间的循环体由多个语句组成时,也必须用{}括起来组成一个复合语句。
4.do-while和while语句相互替换时,要注意修改循环控制条件。
for语句
for语句是c语言所提供的功能更强,使用更广泛的一种循环语句。其一般形式为:
for(表达式1;表达式2;表达3)
语句;
表达式1通常用来给循环变量赋初值,一般是赋值表达式。也允许在for语句外给循环变量赋初值,此时可以省略该表达式。
表达式2通常是循环条件,一般为关系表达式或逻辑表达式。
表达式3通常可用来修改循环变量的值,一般是赋值语句。
这三个表达式都可以是逗号表达式,即每个表达式都可由多个表达式组成。三个表达式都是任选项,都可以省略。
一般形式中的“语句”即为循环体语句。for语句的语义是:
1.首先计算表达式1的值。
2.再计算表达式2的值,若值为真(非0)则执行循环体一次,否则跳出循环。
3.然后再计算表达式3的值,转回第2步重复执行。在整个for循环过程中,表达式1只计算一次,表达式2和表达式,3则可能计算多次。循环体可能多次执行,也可能一次都不执行。for语句的执行过程如图所示。
voidmain(){
intn,s=0;
for(n=1;n<=100;n++)
s=s+n;
printf("s=%d\n",s);
}
用for语句计算s=1+2+3+...+99+100
intn,s=0;
for(n=1;n<=100;n++)
s=s+n;
printf("s=%d\n",s);
本例for语句中的表达式3为n++,实际上也是一种赋值语句,相当于n=n+1,以改变循环变量的值。
voidmain(){
inta=0,n;
printf("\ninputn:");
scanf("%d",&n);
for(;n>0;a++,n--)
printf("%d",a*2);
}
用for语句修改例题。从0开始,输出n个连续的偶数。
inta=0,n;
printf("\ninputn:");
scanf("%d",&n);
for(;n>0;a++,n--)
printf("%d",a*2);
本例的for语句中,表达式1已省去,循环变量的初值在for语句之前由scanf语句取得,表达式3是一个逗号表达式,由a++,n--两个表达式组成。每循环一次a自增1,n自减1。a的变化使输出的偶数递增,n的变化控制循次数。
在使用for语句中要注意以下几点
1.for语句中的各表达式都可省略,但分号间隔符不能少。如:for(;表达式;表达式)省去了表达式1。for(表达式;;表达式)省去了表达式2。
for(表达式;表达式;)省去了表达式3。for(;;)省去了全部表达式。
2.在循环变量已赋初值时,可省去表达式1,如例3.27即属于这种情形。如省去表达式2或表达式3则将造成无限循环,这时应在循环体内设法结束循环。例题即属于此情况。
voidmain(){
inta=0,n;
printf("\ninputn:");
scanf("%d",&n);
for(;n>0;)
{a++;n--;
printf("%d",a*2);
}
}inta=0,n;
printf("\ninputn:");
scanf("%d",&n);
for(;n>0;)
{a++;n--;
printf("%d",a*2);
}
本例中省略了表达式1和表达式3,由循环体内的n--语句进行循环变量n的递减,以控制循环次数。
voidmain(){
inta=0,n;
printf("\ninputn:");
scanf("%d",&n);
for(;;){
a++;n--;
printf("%d",a*2);
if(n==0)break;
}
}
inta=0,n;
printf("\ninputn:");
scanf("%d",&n);
for(;;){
a++;n--;
printf("%d",a*2);
if(n==0)break;
}
本例中for语句的表达式全部省去。由循环体中的语句实现循环变量的递减和循环条件的判断。当n值为0时,由break语句中止循环,转去执行for以后的程序。在此情况下,for语句已等效于while(1)语句。如在循环体中没有相应的控制手段,则造成死循环。
3.循环体可以是空语句。
#include"stdio.h"
voidmain(){
intn=0;
printf("inputastring:\n");
for(;getchar()!=''''\n'''';n++);
printf("%d",n);
}
本例中,省去了for语句的表达式1,表达式3也不是用来修改循环变量,而是用作输入字符的计数。这样,就把本应在循环体中完成的计数放在表达式中完成了。因此循环体是空语句。应注意的是,空语句后的分号不可少,如缺少此分号,则把后面的printf语句当成循环体来执行。反过来说,如循环体不为空语句时,决不能在表达式的括号后加分号,这样又会认为循环体是空语句而不能反复执行。这些都是编程中常见的错误,要十分注意。
4.for语句也可与while,do-while语句相互嵌套,构成多重循环。以下形成都合法的嵌套。
(1)for(){…
while()
{…}
…
}
(2)do{
…
for()
{…}
…
}while();
(3)while(){
…
for()
{…}
…
}
(4)for(){
…
for(){
…
}
}
voidmain(){
inti,j,k;
for(i=1;i<=3;i++)
{for(j=1;j<=3-i+5;j++)
printf("");
for(k=1;k<=2*i-1+5;k++)
{
if(k<=5)printf("");
elseprintf("*");
}
printf("\n");
}
}
转移语句
程序中的语句通常总是按顺序方向,或按语句功能所定义的方向执行的。如果需要改变程序的正常流向,可以使用本小节介绍的转移语句。在c语言中提供了4种转移语句:
goto,break,continue和return。
其中的return语句只能出现在被调函数中,用于返回主调函数,我们将在函数一章中具体介绍。本小节介绍前三种转移语句。
1.goto语句
goto语句也称为无条件转移语句,其一般格式如下:goto语句标号;其中语句标号是按标识符规定书写的符号,放在某一语句行的
前面,标号后加冒号(:)。语句标号起标识语句的作用,与goto语句配合使用。
如:label:i++;
loop:while(x<7);
c语言不限制程序中使用标号的次数,但各标号不得重名。goto语句的语义是改变程序流向,转去执行语句标号所标识的语句。
goto语句通常与条件语句配合使用。可用来实现条件转移,构成循环,跳出循环体等功能。
但是,在结构化程序设计中一般不主张使用goto语句,以免造成程序流程的混乱,使理解和调试程序都产生困难。
统计从键盘输入一行字符的个数。
#include"stdio.h"
voidmain(){
intn=0;
printf("inputastring\n");
loop:if(getchar()!=''''\n'''')
{n++;
gotoloop;
}
printf("%d",n);
}intn=0;
printf("inputastring\n");
loop:if(getchar()!=''''\n'''')
{n++;
gotoloop;
}
printf("%d",n);
本例用if语句和goto语句构成循环结构。当输入字符不为''''\n''''时即执行n++进行计数,然后转移至if语句循环执行。直至输入字符为''''\n''''才停止循环。
break语句
break语句只能用在switch语句或循环语句中,其作用是跳出switch语句或跳出本层循环,转去执行后面的程序。由于break语句的转移方向是明确的,所以不需要语句标号与之配合。break语句的一般形式为:break;上面例题中分别在switch语句和for语句中使用了break语句作为跳转。使用break语句可以使循环语句有多个出口,在一些场合下使编程更加灵活、方便。
continue语句
continue语句只能用在循环体中,其一般格式是:
continue;
其语义是:结束本次循环,即不再执行循环体中continue语句之后的语句,转入下一次循环条件的判断与执行。应注意的是,本语句只结束本层本次的循环,并不跳出循环。
voidmain(){
intn;
for(n=7;n<=100;n++)
{
if(n%7!=0)
continue;
printf("%d",n);
}
}
输出100以内能被7整除的数。
intn;
for(n=7;n<=100;n++)
{
if(n%7!=0)
continue;
printf("%d",n);
}
本例中,对7~100的每一个数进行测试,如该数不能被7整除,即模运算不为0,则由continus语句转去下一次循环。只有模运算为0时,才能执行后面的printf语句,输出能被7整除的数。
#include"stdio.h"
voidmain(){
chara,b;
printf("inputastring:\n");
b=getchar();
while((a=getchar())!=''''\n''''){
if(a==b){
printf("samecharacter\n");
break;
}b=a;
}
}
检查输入的一行中有无相邻两字符相同。
chara,b;
printf("inputastring:\n");
b=getchar();
while((a=getchar())!=''''\n''''){
if(a==b){
printf("samecharacter\n");
break;
}b=a;
}
本例程序中,把第一个读入的字符送入b。然后进入循环,把下一字符读入a,比较a,b是否相等,若相等则输出提示串并中止循环,若不相等则把a中的字符赋予b,输入下一次循环。
输出100以内的素数。素数是只能被1和本身整除的数。可用穷举法来判断一个数是否是素数。
voidmain(){
intn,i;
for(n=2;n<=100;n++){
for(i=2;i<n;i++)
if(n%i==0)break;
if(i>=n)printf("\t%d",n);
}
}intn,i;
for(n=2;n<=100;n++){
for(i=2;i<n;i++)
if(n%i==0)break;
if(i>=n)printf("\t%d",n);
}
本例程序中,第一层循环表示对1~100这100个数逐个判断是否是素数,共循环100次,在第二层循环中则对数n用2~n-1逐个去除,若某次除尽则跳出该层循环,说明不是素数。如果在所有的数都是未除尽的情况下结束循环,则为素数,此时有i>=n,故可经此判断后输出素数。然后转入下一次大循环。实际上,2以上的所有偶数均不是素数,因此可以使循环变量的步长值改为2,即每次增加2,此外只需对数n用2~n去除就可判断该数是否素数。这样将大大减少循环次数,减少程序运行时间。
#include"math.h"
voidmain(){
intn,i,k;
for(n=2;n<=100;n+=2){
k=sqrt(n);
for(i=2;i<k;i++)
if(n%i==0)break;
if(i>=k)printf("\t%2d",n);
}
}
小结
1.从程序执行的流程来看,程序可分为三种最基本的结构:顺序结构,分支结构以及循环结构
2.程序中执行部分最基本的单位是语句。c语言的语句可分为五类:
(1)表达式语句任何表达式末尾加上分号即可构成表达式语句,常用的表达式语句为赋值语句。
(2)函数调用语句由函数调用加上分号即组成函数调用语句。
(3)控制语句用于控制程序流程,由专门的语句定义符及所需的表达式组成。主要有条件判断执行语句,循环执行语句,转向语句等。
(4)复合语句由{}把多个语句括起来组成一个语句。复合语句被认为是单条语句,它可出现在所有允许出现语句的地方,如循环体等。
(5)空语句仅由分号组成,无实际功能。
3.c语言中没有提供专门的输入输出语句,所有的输入输出都是由调用标准库函数中的输入输出函数来实现的。
scanf和getchar函数是输入函数,接收来自键盘的输入数据。
scanf是格式输入函数,可按指定的格式输入任意类型数据。
getchar函数是字符输入函数,只能接收单个字符。
printf和putchar函数是输出函数,向显示器屏幕输出数据。
printf是格式输出函数,可按指定的格式显示任意类型的数据。
putchar是字符显示函数,只能显示单个字符。
4.关系表达式和逻辑表达式是两种重要的表达式,主要用于条件执行的判断和循环执行的判断。
5.c语言提供了多种形式的条件语句以构成分支结构。
(1)if语句主要用于单向选择。
(2)if-else语句主要用于双向选择。
(3)if-else-if语和switch语句用于多向选择。
这几种形式的条件语句一般来说是可以互相替代的。
6.c语言提供了三种循环语句。
(1)for语句主要用于给定循环变量初值,步长增量以及循环次数的循环结构。
(2)循环次数及控制条件要在循环过程中才能确定的循环可用while或do-while语句。
(3)三种循环语句可以相互嵌套组成多重循环。循环之间可以并列但不能交叉。
(4)可用转移语句把流程转出循环体外,但不能从外面转向循环体内。
(5)在循环程序中应避免出现死循环,即应保证循环变量的值在运行过程中可以得到修改,并使循环条件逐步变为假,从而结束循环。
7.c语言语句小结
名称一般形式
简单语句表达式语句表达式;
空语句;
复合语句{语句}
条件语句if(表达式)语句;
if(表达式)语句1;else语句2;
if(表达式1)语句1;elseif(表达式2)语句2…else语句n;
开关语句switch(表达式){case常量表达式:语句…default:语句;}
循环语句while语句
while(表达式)语句;
for语句for(表达式1;表达式2;表达式3)语句;
break语句break;
goto语句goto;
篇2
关键词:螺纹; 宏程序; 循环功能; 参数化
中图分类号:TG62
文献标识码:A文章编号:16749944(2017)8024002
1引言
螺纹是机械零部件之间的主要连接方式,所以机械加工中螺纹的加工是非常重要的环节。
数控镗铣床设备上加工2400 t压力机滑块上的一组规格的螺纹,原有的加工方法存在一些弊端,除了对操作者的编程水平有一定要求外,加工效率也得不到提高,因此改进一种实用、简便的螺纹铣削方法对提高公司生产线生产效率具有重大意义。
公司数控M铣床班组加工该零件的多个规格螺纹时,手工编程要求操作者具备一定的编程水平,当更换不同规格的螺纹时就要重新编程,加工效率不高,对于简单的螺纹加工采用自动编程又不太适用。所以,上报设计部门后决定添加一种螺纹铣削“循环功能”。
2螺纹铣削工艺
螺纹铣削需要配合三轴以上联动机床,坐标系要在螺纹轴线与端面的交点处。采用数控镗铣床TK6920加工螺纹,选用单刃螺纹铣刀,铣削螺纹时螺纹的导程跟转速没关系,仅跟程序设定刀具的圈数和下刀距离有关系。转速和进给根据螺纹导程设置,转速高进给快,会因为切削力太大导致丝锥或板牙损坏。虽然转速慢进给慢在一定范围内能完成攻丝或套丝加工,但是转速也要限制在电机的实际使用扭矩范围内。
3问题的解决
首先利用宏程序加工标准右旋内螺纹M42×4.5,螺纹深度为50 mm,单刃螺纹铣刀半径13 mm。
为了安全起见,同时也为了确保螺纹深度为Z-50,通过计算可知:
50÷4.5=11余0.5(mm),
应考虑每次应距初始面一定高度开始加工,安全高度值可为:
h=p-0.5=4.5-0.5=4(mm)(1)
由于直螺纹特点(上下径线尺寸不变),这样就可确保经过11+1个循环后螺纹深度正好是50mm。
5结论
对螺纹铣削循环程序的生成,改进了传统铣削螺纹加工的方式,操作者能够简单、快速地解决加工不同规格螺纹铣削的问题。
值得肯定的是在此螺纹循环程序中涉及的计算多为基本的计算,对于新培训上岗的操作工也能完成操作。降低了编程难度,具有方便、快捷、浅显易懂的特点。刚好契合了参数化编程的理念,有利于节省人力成本。同时能满足在产品多样性情况下提高螺纹加工的生产效率的要求,直接为企业降低生产成本,提高企业的效益。
参考文献:
[1]
梅艳波.螺纹加工方法研究[J].长江大学学报,2009(1):279~280.
[2]刘明玺. 西门子系统数控车床螺纹加工参数化编程方法探究[J].电子测试,2013(23).
[3]刘金文. 浅析加工中心铣削螺纹的加工方法[J].数字技术与应用,2012(4) .
[4]李庆余. 机械制造装备设计[M].北京:机械工业出版社,2008.
[5]孙本绪. 机械加工余量手册[M].北京:国防工业出版社, 1999.
[6]艾兴,肖诗纲.切削用量简明手册[M].3版.北京:机械工业出版社,1994.
[7]陈国文,马芳薇,周瑜. 宏程序在螺纹铣削快速编程中的应用[J]. 金属加工(冷加工),2015(16):20~21.
[8]乔龙阳. 基于宏程序的螺纹数控铣削功能开发[J]. 机械研究与应用,2014(1):181~183.
[9]钟如全. 铣削螺纹固定循环指令的开发[J]. 组合机床与自动化加工技术,2013(10):121~122,126.
[10]刘玉春. 基于FANUC宏程序的螺纹铣削加工编程应用[J]. 金属加工(冷加工),2013(13):46~48.
[11]杨辉,万海鑫,张宣升. 基于螺纹铣削数控宏程序的优化设计[J]. 制造业自动化,2012(21):26~29,39.
[12]戴冠林. 基于MasterCAM 9.1的螺纹铣削工艺分析与编程[J]. 机械,2010(8):66~68.
篇3
关键词: 点位加工;宏程序;段落
随着数控机床技术的不断进步,加工中心在机械制造企业的应用已经得到了普及,对于一些箱体类零件、阀体类零件、机架类零件的铣面和点位加工,属于典型的四面加工类零件,大多数企业仍然采用手工编写程序代码,如果孔系复杂,完成一个零件的加工可能用到几十把刀具,程序也变得很长而且重复代码非常多,下面以FANUC 16i系统G81、G85固定循环为例简要说明。
要在坐标为(-100.0,0)和(100.0,0)两处加工∮16的销孔,采用中心钻定位-->钻孔-->扩孔-->铰孔工艺,为方便程序调试和提高易读性,我们一般将几把刀具对应的程序分成几个大的“段落”,程序如下:
G90G00G17G54;
N101(ZHONG XIN ZUAN T01);
M09;
M05;
G91G00G30Z0;
G30Y0;
T01;
M06;
G90G00G80G49S600;
X-100.0Y0;
G43Z50.0H01;
Z10.0;
M03;
M08;
G98G81Z-3.0R3.0F80;
X100.0Y0;
N102(ZUAN KONG T02);
M09;
M05;
G91G00G30Z0;
G30Y0;
T02;
M06;
G90G00G80G49S600;
X-100.0Y0;
G43Z50.0H02;
Z10.0;
M03;
M08;
G98G81Z-55.0R3.0F80;
X100.0Y0;
N103(KUO KONG T03);
M09;
M05;
G91G00G30Z0;
G30Y0;
T03;
M06;
G90G00G80G49S400;
X-100.0Y0;
G43Z50.0H03;
Z10.0;
M03;
M08;
G98G81Z-50.0R3.0F80;
X100.0Y0;
N104(JIAO KONG T04);
M09;
M05;
G91G00G30Z0;
G30Y0;
T04;
M06;
G90G00G80G49S300;
X-100.0Y0;
G43Z50.0H04;
Z10.0;
M03;
M08;
G98G85Z-50.0R3.0F100;
X100.0Y0;
从以上四把刀具所用程序不难看出,程序结构完全相同:标识—关切削液---主轴停---回参考点---换刀---坐标设定等---刀具补偿、移动---主轴正转---开切削液---固定循环加工-->调用下一把刀具加工程序。
如果我们将每把刀具对应程序的“段落”写成宏程序,那么在编程时调用宏程序,就会将十几段程序用一段或几段完成。比如中心钻定位、钻孔、扩孔都使用G81固定循环完成,所不同的只是刀具、坐标、切削参数等,把这些不同的数值用宏变量替代改为宏程序O0081,同理铰孔程序改为O0085,清单如下:
O0081(ZUAN KONG);
M09;
M05;
G91G00G30Z0;
G30Y0;
T#20;
M06;
G17G90G00G80G49S#19;
X#24Y#25;
G43Z50.0H#20;
Z10.0;
M03;
M08;
G98G81Z#26R3.0F#9;
O0085(JIAO KONG);
M09;
M05;
G91G00G30Z0;
G30Y0;
T#20;
M06;
G90G00G80G49S#19;
X#240Y#25;
G43Z50.0H#20;
Z10.0;
M03;
M08;
G98G85Z#26R3.0F#9;
如此一来,上述四个“段落”的加工程序可通过宏程序调用编写,程序代码由原来的60多段减少到十几段,大大减少了编程工作量,同时提高了程序的易读性,节省了程序存储空间,也可以很好地避免输入错误。
G90G00G17G54;
N101(ZHONG XIN ZUAN T01);
G65P0081T01S600.0X-100.0Y0Z-3.0F80.0;
X100.0Y0;
N102(ZUAN KONG T02);
G65P0081T02S600.0X-100.0Y0Z-55.0F80.0;
X100.0Y0;
N103(KUO KONG T03);
G65P0081T03S400.0X-100.0Y0Z-50.0F80.0;
X100.0Y0;
N104(JIAO KONG T04);
G65P0085T04S300.0X-100.0Y0Z-50.0F100.0;
X100.0Y0;
同样道理,读者可以把类似的加工程序“段落” 改写成宏程序存入数控机床,方便编程时调用。
参考文献:
FANUC Series 16i-MA使用说明书
篇4
[关键词]宏程序 特点 实例
一、宏程序编程的特点
随着数控技术的快速发展以及数控车技能大赛的举行,在数控车竞赛中会经常遇到复杂轮廓的加工,如椭圆、抛物线、双曲线等,采用常规的数控编程指令,需要计算每个节点的坐标值,不但计算量大、精度差、编程速度慢,而且容易出错,难以满足生产要求。若采用CAD/CAM软件自动编程,也需要大量时间来建模和处理,而且程序过于冗长,程序传输速度慢导致加工滞后,且空刀多,浪费时间。随着数控技术的发展,现在先进的数控系统不仅向用户编程提供了一般的准备功能和辅助功能,而且为编程提供了扩展数控功能的手段,宏程序的出现为此类图形的编程提供了很好的解决办法。宏程序在数控车中的运用越来越广泛,掌握它的编程,掌握一定的编程模式,对刚开始接触数控车宏程序的学生,可以大大降低学生接受的难度,从而提高教学的效果。宏程序也属于计算机高级语言编程,它可以在程序中使用变量,通过对变量进行赋值,变量可以进行算术运算,逻辑判断和跳转等操作。
二、宏程序的应用
(1)宏程序在实际生产中的应用
在实际生产中,宏程序编程是自动编程的有效补充。使用CAD/CAM软件编程一般都存在工作量大、程序庞大和加工参数不易修改等缺点,只要任何一个加工参数发生变化,软件就要根据变化后的加工参数重新计算刀具轨迹,任何智能化的软件也不能避免这一步骤。在实1.机械零件上常见的一些典型结构 ,如多边形槽、圆槽、孔系、内外球面和倒R面等,在采用了宏程序编程之后,只要是同一类型的零件,不论尺寸如何变化,都可以用同一程序来完成加工,而操作者只需在加工前把反映零件关键尺寸的参数输入即可。
2.在车削零件加工中,可以通过G代码编程与宏程序编程相结合的方式,来实现几乎所有零件的加工。
3.对中等难度的零件来说 ,使用宏程序编程可以选择更加合适的走刀方式。由于应用了大量的编程技巧,使得宏程序的精度很高,这样不仅使程序段大大的缩短了,而且也比自动编程的程序加工时间要少了很多。
(2)宏程序在数控编程教学中的应用
与G代码编程方式相比,宏程序编程要更加复杂,不再是利用已有的编程指令,而是输入相应的参数。在进行宏程序编程之前,学生必须对所加工的零件有全面的了解,如:为什么该零件要使用宏程序编程,用其它简单的编程方法是否可以实现;零件的哪些参数要设为变量,是什么类型的变量;要用到哪些数学知识;使用何种语句,达到什么样的加工效果,等等,在综合的考虑好这些问题之后方能进行编程。虽然这些问题对于高职学生来说是有一定难度的,但这也正是学生能力的最好体现。
(3)宏程序在数控大赛中的应用
纵观近几年国家、省和市级的各种数控大赛,基本上还是以手工编程为主来实现零件的加工。如何做到在有限的时间里和有限的零件载体上体现出选手的综合素质,需要参考多项指标,而宏程序编程就是其中重要的一项。
三、编程实例
手动编写下图零件的程序:
参考文献:
[1] 陈光伟.关于宏程序循环语句的应[J].Equipment ManufacturingTechnology,2010(5):100~ 103.
篇5
关键词:PLC 工作原理 维护 故障查处
在PLC的课堂教学中,教师要教授的内容包括运用PLC编写程序、PLC的日常维护,以及PLC问题的解决,在教学中要从以下几个方面入手开展工作。
一、让学生了解PLC的系统组成
PLC系统是由CPU、存储器、I/O装置、编程器以及电源组成的。其中,教师要引导学生重点了解CPU。它是PLC的核心部分,用扫描的方式接收现场输入装置的状态或数据,并存入到映像寄存器或数据寄存器中,在PLC进入到运行状态后,执行用户程序,进行数据处理,并随时更新数据状态,起着诊断电源和PLC编程过程中出现的语法错误的作用。
二、让学生掌握PLC的工作原理
PLC采用的是“顺序扫描、不断循环、集中采样、集中输出”的工作方式。在每次扫描的过程中,PLC集中对输入信号进行采样,集中对输出信号进行刷新。在输入刷新过程中,当输入端口关闭,程序在进行执行阶段时,输入端有新状态,但是新状态不能被读入。只有当程序进行下一次扫描时,新状态才能被读入。PLC的每一个扫描周期分为输入采样、程序执行、输出刷新三个环节。在这个过程中,元件映像寄存器的内容是随着程序的执行变化而变化的。
三、让学生熟悉PLC的工作环境
教师不能只教授学生如何编写程序,还要让学生熟悉PLC的工作环境。虽然PLC的抗干扰能力很强,但它对使用场合、环境等还是有一定的要求的,为了使PLC能更可靠地工作,延长其使用寿命,教师还要向学生讲解PLC工作环境中的一些注意事项。PLC工作环境的温度应控制在0℃~50℃,而且要做到阳光不能直射,相对湿度小于85%。在PLC设备使用过程中,周围不能有腐蚀性或易燃易爆气体,不能有能导电的粉尘。设备安装位置的振动频率小于55Hz、振幅小于0.5mm,这样可以保持PLC工作的稳定性。设备周围要留有用于扩展和通风散热的空间,必要时可安装风扇进行通风,在易燃易爆或有腐蚀性气体的场所应考虑在柜内正压通风,以便导出气体。
四、让学生掌握PLC系统的定期检查和维护
教师要教会学生定期巡视PLC各I/O板指示灯指示状态,查看控制点的状态信息,通过观察设备运行状态信息,判断PLC控制是否正常;观察散热风扇运行是否正常;观察PLC柜有无异味。除此之外,教师还要培养学生定期除尘的习惯,除尘时要把被控设备调到初始运行状态,要小心谨慎。因为定期除尘可以保持电路板的清洁,防止短路故障发生,提高元器件的使用寿命,这也是对PLC控制系统的一种很好的防护措施,另外出现故障时也便于查找故障点。
当设备出现故障的时候,要想快速、准确地查明故障并解决问题,教师在教学中要重点教会学生掌握以下要点。
首先,教师要向学生明确PLC控制回路和继电器控制回路的不同。PLC与继电接触器控制的主要区别之一,就在于二者的工作方式不同。继电接触器控制系统是按照并行方式工作的,即是按照同时执行命令的方式工作的,只要形成电流通路,就可能有几个电器同时动作。而PLC是以串行方式工作的,PLC在循环执行程序时,是按照语句的书写顺序自上而下进行逻辑运算的,而前面逻辑运算的结果会影响后面语句的逻辑运算结果。这一点教师必须要让学生知道,由于工作方式不同,这两种控制回路的故障应对方法也略有不同。
其次,教师还要让学生了解到PLC在运行程序判别触点通断状态时,只取决于其内部输入继电器线圈的状态,并不直接识别外部设备,而输入继电器线圈状态取决于外部设备,这是二者的又一个不同之处。PLC中使用的继电器并非实体继电器,而是软体继电器,每个软体继电器仅对应PLC存储单元中的“一位”,该状态为“1”时,表示继电器线圈通电,这时程序中有该继电器的触点就会动作。
篇6
关键词:IAP;自举程序;56F8013
DOI: 10.3969/j.issn.1005-5517.2012.8.018
智能汽车竞赛要求必须采用飞思卡尔公司的微控制器作为控制单元的核心芯片,数字信号控制器(DSC)系列具有运算速度快、功耗低、设备丰富等特点,非常适合智能汽车竞赛车模控制。在竞赛秘书处提供的直立车模控制参考方案中就采用了DSC56F8013芯片组成控制核心电路[1]。该芯片不仅内部硬件资源可以满足车模控制要求,而且它的软件开发环境Codewarrior中的PE(Processor Expert)可以自动生成芯片中各硬件模块的接口代码,使得开发者只需关注应用软件的开发,这样便可以提高软件的开发效率和准确性。
在DSC56F8013的程序开发和调试中,可以使用专用的JTEG调试工具,这种方式在车模控制系统开发中
根据上述代码空间划定,单片机在复位之后,首先执行Bootloader程序,在Bootloader程序中,先检查在一定时间内(一般设置为100ms左右)是否接受到用户通过串口发送的0x55数据。如果受到了0x55数据,并在最后由0xaa数据结束,便进入Bootloader命令状态,接受相应的程序下载指令,进行程序的更新。否则便从0x1AFF读取用户程序的起始地址,开始执行用户程序。具体的启动过程如图3所示。
也可以通过设定一定的触发条件
件格式,或者Motorola的S-Record的格式存储。安装这些文件格式标准,下载程序将单片机程序转化成可以对Flash进行编程的二进制数据。
(2)对于单片机二进制格式的程序前面两个跳转指令数据修改成两条JMP 0x1B00指令数据,并保存原有程序的起始地址;
(3)通过串口完成对单片机的复位,同时发送0x55和0xaa数据,引导单片机进入Bootloader命令状态。
(4)通过Bootloader的擦除和编程命令完成对单片机Flash的程序下载,并将单片机程序的首地址编程在0x1AFF位置。
篇7
1可编程序控制器起重机系统应用
1.1回转系统控制要求(1)港口潮湿多污,所以对轴承密封性能比较高,使用寿命必须达到和本机持平。滚动轴承有三大排,支撑着门机回转工作。(2)回转大轴联接处要进行机加工,不仅要有足够的过渡圆角,还要用热处理消除应力。做到精加工,轴承表面平直无翘曲。在刚度上做到合适且无透光现象。(3)做到360度全能回转,依靠变频电动机和行星减速箱运作回转支撑。
1.2PLC系统IO分配表及ABB变频器档位输入PLC系统IO分配表(如表1)。ABB变频器输入的档位输入(如表2)。IO分配表工作原理:(1)当风速达到22m/s时,YF6电接风速仪产生信号报警,报警信号使工作状态下的电机自动跳闸并停止旋转动作。风速仪可选用轮转式探头。(2)PCI1002-CHR起重机超载限制器和压电式传感器连接,PLC信号输入由超载限制器来完成。假设门机额定起重量为40T,工作状态下的物体重量超过百分之十,超载信号就由限制器发出PLC输入信号。这就是超载输入信号生产原理。(3)电机过载监测器使用热敏电,其原理是电阻急数字随着温度会逐步增加,当温度达到一定上限超额,电子电路可以检测出来。
1.3PLC控制系统流程门机对回转速度的控制是随变频器的反馈信号决定的。连接作用在于PLC,在控制手柄后控制变频器,这就是门机整个机构的工作流程。如图1:
1.4PLC元件组合门机的旋转电机选变频调速三相异步,1-100hz变频范围工频电压为380V,介于工作变化转速需要,YZP2系列可以满足1475r/min的转速。根据设备,PLC可选简单可靠的安装,不仅有丰富指令和灵活的系统,还有标准的编程语言和模拟处理。比如需要14输入和6输出的,可以选24输入16输出的设备。门机装卸任务可由PLC控制电路后,进行输入信号和运算过程完成旋转系统动作。
2实现港口自动化的可编程序控制系统发展
2.1可编程序发展中的问题目前我国可变程序控制器的发展存在三大足:在技术层面,由于不具备自主知识产权,所在芯片制造磨具加工等方面有诸多遗憾,也为我国港口发展带来束缚;在竞争层面上,目前95%的国内市场被国外的PLC程序占据,而且国外对一些中大型的控制器每年都会推成出新,如果我国继续没有自主的相关知识产权,在竞争中就不具备任何优势;在市场秩序方面,国外的控制器一般都以销售为主,这就造成了各部总经销商和分经销商及各个终端销售商的激烈竞争,市场的无序除去造成销售市场的混乱之外,无法获取高额利润更是成了大家的鸡肋。
2.2相关对策(1)集中资金和技术,研制自主的可编程序控制器。让芯片加工迅速发展,提高效益和利润。(2)在可编程序应用技术发展的同时,不仅将这项技术应用于国民领域,更要凭借技术力量和劳动优势,打入外商投资市场。制造国际应用的可编程序控制系统。只有形成只有这样的增值服务,才能带动我国经济发展。(3)生产设计自有特色的可编程序控制器,并提炼核心技术,在国际上形成不可复制的模块化软件。
2.3港口自动化的可编程序发展
2.3.1实现PLC控制网络技术可编程序有很强的数字计算功能,也有很强数据管理功能。在一个散货码头可以通过集中控制和分布控制这两个系统对港口进行全盘操控。PLC控制系统时效高,容错能力强大。而且它的可靠性和安全性能都比较优越。一个控制主机完成整个系统的运算,各个网络通信和信息数据由分布系统连接控制。实现港口信息通信自动化。工控管理网络和港口各部门互联,为管理信息提供相关数据,完成PLC在内的现场控制。向高效率的可靠性方向发展。
2.3.2实现PLC实时监控和在线管理实时监控系统对现场作业控制设备起着连接作用,它的结构硬件及软件,硬件安装PLC控制系统,提供各种相关数据,并连接上层和管理层的作用。它与管理系统组合。采用监控软件生成应用系统,实现数据库组织。能及时处理报警现场,并参与和干预生产过程,在线管理系统则可以为港口操作人员提供安全。
3结语
篇8
摘 要:分析了电磁干扰及其对PLC控制系统干扰的机理,指出在工程应用时必须综合考虑控制系统的抗干扰性能,并结合工程提出了几种有效的抗干扰措施。
关键词:可编程控制器 电磁干扰 电磁兼容性 控制系统 接地技术
可编程控制器(以下称PLC)是一种用于工业生产自动化控制的设备。尽管其制造厂采取了一些措施,使得它的可靠性较高,但还有许多外部因素也会使它产生干扰,造成程序误变或运算错误,从而产生误输入井引起误输出,这将会造成设备的失控和误动作。要提高PLC控制系统可靠性,一方面要求PLC生产厂家用提高设备的抗干扰能力;另一方面,要求工程设计、安装施工和使用维护中引起高度重视,多方配合才能完善解决问题,有效地增强系统的抗干扰性能。随着PLC应用的日渐广泛,其抗干扰问题也显得日益重要。本文就此问题提出一些抗干扰的措施。
一、 控制系统中干扰及其来源
1、 干扰源及一般分类
影响PLC控制系统的干扰源与一般影响工业控制设备的干扰源一样,大都产生在电流或电压剧烈变化的部位,这些电荷剧烈移动的部位就是噪声源,即干扰源。
点击查看全文
篇9
关键词:数控车 宏程序 非圆曲线 零件加工
经过近几年的发展,我国在数控专业技能鉴定方面增添了反对非圆曲线的加工以及严格的考察,在全国范围内也举办了四届数控技能比赛。我们从比赛的结果上可以看出非圆曲线的加工技能是一个非常重要的考点,并且所占的考核分值比较重。从企业发展的角度上来分析,宏程序不只使用在非圆曲线的加工方面,还可以扩展到同样类型、但是在型号方面存在很大差异性的零件加工上。这些方面我们都可以看出,对于当前职业院校的数控专业来讲,学习和掌握宏程序是非常重要的。
一、五步编程法的定义
在进行编程工作之前需要对已有的图样实施数学工作处理,这其中主要是需要解决两个方面的问题:依照实际的要求,选用X方向或者是Z方向上的变量来代替曲线上的开始和结束的位置,这样可以方便地确定具置;依照所选取的变量的大小,对曲线的标准方程依照实际加工的要求进行准确的计算。对图纸了解和掌握以及基本的数学处理之后就可以正式开始宏程序的编制,具体的五步编程法如下。
1.将变量进行初始化
第一步主要是依照具体的图纸来确定一个变量以及给定一个实际的变量,通常宏程序就是从这个加工点开始进行加工,所确定的这个点可以方便人们确定位置并且存在的误差相对较小。基本来讲,初始的变量值为曲线标准方程中坐标系靠下的值,通过简化的方式进行计算;对于实际的位置,在五步法中的第三步可以通过具体的坐标平移来实现。
2.公式计算
第二步是依照所选用的实际变量来对数学公式实施具体处理,将另外一个坐标轴上的数值用实际的变量值来具体表现出来。这个步骤之前应当具备一个程序段的段落号,这样可以方便对终点值的判断,这个语句可以组成一个循环性的语句来完成整体的加工过程。
3.对G01进行加工
第三步是在对G01实施直线近似值的处理过程中,需要完成单、双两方面量的转换以及对平面坐标实施平移,让图标可以处于坐标系当中具体所指定的位置。这其中单双两方面的转换主要是通过宏程序的编程来实现的。
4.自变量的增减
第四步是主要是推动刀具工作的驱动器。其中自变量就是通过第一步的变量初始化的定义变量,主要是控制增量的大小,提升量加大则出现的误差就比较大,但是实际的运行速度比较快,增效比较小,那么实际的误差就比较小,运行的速度就比较缓慢。
5.对终点进行判断
这是五步编程法中最后一个步骤,这个步骤主要是对判断宏程序是否真实执行到头,属于宏程序是继续执行还是进行终止的判断者。对变量是否达到了终点进行判断,如果没有到达终点,就通过跳转的语句将其转移到计算机计算语句补分来重新开始执行;如果已经到达了终点,那么就依照顺序继续进行接下来的程序。
二、数控车宏程序教学五步编程法的实际应用探究
一个比较简单的椭圆形的曲线,此时就可以采取五步编程的方式来实现精确的加工。首先我们需要分析的就是采取何种变量来作为具体的自变量,因为X的值通过象限的方式处理是比较繁琐的,而采取Z来作为自变量是相对比较容易的。Z在椭圆形的标准方程当中,采用Z来作为实际的自变量当中取值可以从30降低到-22.。
#1=30;其中Z为变量初始化的值,依照标准方程来具体确定。
N20 #2=[1/3]・sqrt[900-#1*#2];根据 Z 计算相应点 X 坐标。
G01 Z[2*#1] X[#0-30] F1.1;G01 进行加工,X 中开始单、双边变量的计算,Z 中完成横纵坐标系的准确平移。
#1=#2-0.2;自变量自减,增量为 0.2。
IF [#1GT-11] GOT20;对终点进行判断,要是不满足实际数值,马上返回到20号的程序段继续计算。运用非圆曲线中的宏程序的模板,这样就可以快速地实现零件加工公式的权限外部轮廓的编程以及加工。下面我们来具体介绍一个实际的应用案例。
在实际的教学过程当中,通过椭圆形的编程和加工居多的,椭圆形的编程具备较强的代表性,具体的椭圆形编程需要重点注意以下几个方面。
第一,工件的实际精度和在其编程过程中所选取的插补距离有着非常密切的关系,并且差距越来越小,实际的加工的精度就会有很大提升,但是这种方式就会造成数控系统中的实际工作量太大,严重影响到程序运行的效率,这样就会造成加工效率低下。在满足了这个加工条件的基础下,需要尽量选取步距较大的。
第二,椭圆形的中心和工件轴线出现不重合的零件的时候,就需要将工件的坐标系实施偏置之后,再依照上述的步骤来进行加工。
第三,以上所运行的程序具备一定的宏观性和通用性,每次只需要改变其中的变量所赋予的数值,比如椭圆的长轴和短轴的数值,就可以对同一类型和相似类型的零件进行加工。
具体的模板如下。
椭圆长半轴值为a。
椭圆短半轴值为b。
自变量初始值为c。
椭圆的曲线自起点到椭圆中心点的距离为Z。
自变量的终点值为P,也就是椭圆虚线的终点到椭圆中心距离Z的距离。
设#3位椭圆中自变量数值Z;#4作为椭圆中横轴变量X。
N20 #3=a作为自变量Z的初始值。
N11 WHILE[#3GEp]DOm;WHILE执行循环,当#3满足大于或等于p时,则程序在WHILE DOm和ENDm之间循环,否则跳出循环,p为椭圆终点至椭圆中心的Z向距离。
三、小结
通过对数控车宏程序教学中五步编程法的应用实践和探究,我们可以看出五步编程教学的方式主要是将一个比较完整的宏程序具体分解成五个步骤,数控车宏程序通常只需要依照一定的顺序去执行就可以得到实现。在数控车的教学中和高级工培养教学中,宏程序的教学是不可或缺的。对宏程序教学中的编程技巧进行有效掌握是对零件进行加工的关键所在。这种方式可以有效降低职业院校教师对学生传授普宏程序教学的实际难度,通过这种方式的教学可以给当前高职院校的数控教学带来质的改变,对数控车编程教学的发展起到推动作用。
参考文献:
[1]杜江,高俊川,孙道恒.宏程序在数控车削二次曲线中的应用[J].CAD/CAM与制造业信息化,2012(4).
[2]刘磊.数控车宏程序教学的五步编程法[J].成功(教育),2012(7).
[3]崔俊明.中等职业教育数控技术应用专业教材开发实践研究[D].河北师范大学,2013(5).
[4]陈曦.在数控编程教学中的宏程序教学[J].重庆与世界(学术版),2012(6).
[5]周金莲.基于华中系统数控车宏程序编程实例[J].商场现代化,2012(20).
篇10
【关键词】UG;Ncbrain;加工中心;程序优化
0 引言
加工具有自由曲面的复杂零件需要利用CAD/CAM软件进行自动编程,生成刀位文件,并利用软件的后置处理功能把刀位文件转换为满足加工中心结构和系统要求的NC程序,为了确保所产生的NC程序的正确性和合理性,在实际加工之前还需利用Ncbrain数控程序优化软件对加工程序进行优化和校验。
本文以某产品的冲压模具的凸模零件为例,利用UG软件对零件进行自动编程,并后置处理生成NC程序。利用NCbrain软件对NC程序进行优化并模拟零件真实加工过程,确保NC程序的正确及合理,提高数控机床的加工效率和安全使用率。
1 UG建模与自动编程
1.1 建模
根据凸模二维图纸,利用UG4.0软件的建模功能建立凸模的三维数模。
图1 凸模的三维图
1.2 加工工艺方案制定及参数设置
毛胚为350mm×250mm×120mm的锻打料,材料为Cr12MoV,在UG/CAM环境下,分别对其进行粗加工,半精加工,精加工,清根,刀具及参数设置见表1。
表1 UG自动编程参数设置
1.3 路径计算及生成刀位文件
利用UG进行编程生成刀具路径和刀位文件(CLSF),如图2所示为机身精加工刀路轨迹。
图2
2 UG后置处理生成NC代码
利用UG选择合适的后处理器,生成相应的NC代码,其中粗加工NC代码如下:
%
(C63XM YL=0.00mm )
(ToolName=BT63R8 D=63.00 R=8.00 L=75.00)
N00001 G40 G17 G90
N00002 G00 Z120.
N00003 G00 X-147.419 Y52.597 S1200 M03
N00004 G00 Z58.911
N00005 G00 Z58.115
N00006 G01 Z43.115 F300
N00007 G01 X-104.069
N00008 G01 Y73.907 F1800
N00009 G01 X104.069
…………
N06513 G00 Z120.
N06514 M05
N06515 M02
N06516 (加工时间::60.min)
3 NCbrain程序优化与校验
图3
3.1 构建毛胚
按照毛胚实际尺寸和加工坐标定义毛胚,如图3所示。
3.2 NC程序优化及验证
NC代码中常存在一些不合理现象:
(1)切削进给率过分保守。
(2)空行程时使用切削时的进给率。
(3)实际切削量大于或小于预期值。
(4)不合理的进退刀及过多的抬刀,这些现象影响了加工效率和加工质量,因此需要进行优化。
在NCbrain下设置优化参数,调入NC程序,启动优化自动输出优化结果。
优化及模拟后的状态如图4:
模拟加工后工件状态 优化后开粗程序
图4
优化后开粗程序:
N1(C63XM YL=0.00mm )
N2(ToolName=BT63R8 D=63.00 R=8.00 L=75.00)
N3G40G17G90
N4G00Z120.
N5G00X-147.419Y52.597S1000M03
N6G0Z66.016
N7G1Z52.016F650
N8Z49.016F250
N9X-144.323F1500
N10X-110.262
N11X-107.165F2000
N12X-104.069F3000
……
N7449G0Z120.
N7450M05
N7451M02
通过对优化前后的开粗程序对比可以发现:优化后,提高了空行程的速度,刀具轨迹的进给速度变化更加频繁,极大的提高了加工效率。
4 验证
对优化后的NC代码,在我厂加工中心上进行加工验证,将加工后的实物与仿真结果进行对比,两者结果几乎一致,这说明优化后的NC程序正确合理。
5 结语
本文基于UG和NCbrain软件对凸模零件进行程序编制和NC代码优化,可得出一下结论:
5.1 用UG和Ncbrain软件相结合对数控加工过程进行仿真是可靠的,保证实际加工的安全性,节省加工设备和材料的消耗。从而节省了实际和加工成本。
5.2 优化后加工省时效果显著提高了生产效率,减小刀具磨损,缩短生产周期,降低生产成本。