十年学会编程[最终定稿]

时间:2019-05-15 10:26:53下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《十年学会编程》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《十年学会编程》。

第一篇:十年学会编程

这里分享一篇 Peter Norvig的 《十年学会程序设计》(Peter Norvig系Google研究院主任、美国计算机协会(ACM)资深会员(Fellow))。全文如下:

十年学会程序设计

Peter Norvig(Copyright 2001)原文网址

为何大家如此匆忙?

走进任何一家书店,你会看到书架上一排不见尽头的放着如 <7天自学Java语言> 以及几天或者几小时学会Windows, 因特网或者Visual Basic 这类书。我在Amazon 网上书店用一下的方式进行高级搜索:

出版年份: 1992以后 书名包括:“天” 和 “学习” 或 “自学”

得到了268条搜索结果,其中前78条都是计算机书(第79条是 30天学会孟加拉语)。我用 “小时” 代替“天” 作为关键字,得到了神奇般类似的结果:这次有253本书,前77本是计算机书,第78本是 24小时自学语法和写作风格。排名前200的书中有96%是计算机书。

由此可见,人们要不就是急着想学会计算机,要不就是计算机相比于其他事情太容易学会了。比如说把,没有书是写在几天弹奏贝多芬或几天学会量子物理,甚至也没有几天学会帮小狗打扮这样的书。

让我们分析一下 三天学会Pascal语言 [英文网页] 这样的标题表达了什么意思:

•学会:

在 三天内,你没有时间去写几个有意义的程序,或者从成功和失败中学到东西。你也没时间跟有经验的程序员一起工作,所以也无法了解在真正编程是什么样子。简短 的说,就学会而言,时间显然不够。所以这些书只是浮于表面的熟悉,而不是深刻的理解。如同Alexander Pope 所说,一知半解是危险的。

•Pascal 语言:

三 天内你可能学会Pasacl语言的语法(如果你已经掌握一个类似的编程语言),但你无法学会如何合理运用这些语法。简言之,如果你是个Basic 程序员,你可以用Pascal 语言写出类似Basic 风格的程序,但你学不到Pascal语言的优点(还有缺点)到底在哪。重点是什么呢? Alan Perlis 曾说: “如果编程语言不能影响你的编程思维,那就不值得去学.” 另一个可能是,你必须学会一点点Pascal语言(或是像VB语言、Javascript等),因为你需要跟现成的工具组合完成特定的工作。不过这个时候,你实际上学的不是怎么写程序,而是要学着如何完成工作。

•三天

不幸的是三天根本不够;下面的章节会告诉你为什么

十年学会程序设计

研究者 Hayes, Bloom 的研究表明,在几乎所有的各种领域,大约要十年才能培养出专业技能。这些领域包括下西洋棋、音乐作曲、绘画、钢琴、游泳、网球,及神经心理学和数学拓

扑学。似乎没有真正的捷径--即便是莫扎特在四岁就展露出音乐天才,在他写出世界级的音乐之前仍然用了超过十三年的时间。

再看另一种类型的领域。披头士乐团似乎是在1964年的Ed Sullivan 剧场表演突然地火起来并成为第一乐队的。但其实他们从 1957 年开始,就在利物浦、汉堡等地的小型俱乐部表演。虽然他们很早就显现强大的吸引力,但他们决定性的成功作品 Sgt Pepper 也到1967年才发行。Samuel Johnson 则认为或许还不止十年才行,他说:任何领域的卓越成就都必须用一生的努力才能取得;稍微低一点的代价都是换不到的。Chaucer 则感叹道: “生命如此短促,学习技艺却要这么地长”

以下是我在编程上成功的秘诀:

•对编程产生感兴趣并因为乐趣而写程序。确信你自始至终都能乐在其中,这样你才愿意将十年光阴投入编程事业.•与其他程序员交流;阅读别人的代码。这比任何书任何培训都重要。

•不断地编写。最好的学习方法是在实践中学习。从技术角度说,”在特定领域的个人最高效率并不因为经验够多就会自动获得;但若有意识的通过努力去提升经验,个人效率会变高”(第336页)而 “高效的学习一般需要明确的任务和因人而异的适当难度,以及及时的反馈和重复或者修正错误的机会”(20~21页)Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life(实践中认知:心智、数学与日常文化)是这个观点的一本有趣参考书籍。

•如 果你愿意,你可以去读四年大学(或再读研究生)。这可以让你满足一些工作的学历要求,同时也可让你对这个领域有更深的认识。但如你不喜欢上学,你也能(得 有牺牲)通过工作获得类似的经验。无论如何,只读书是不够的。《New Hacker’s Dictionary》的作者Eric Raymond 曾经说过: “计算机的教育无法让人成为编程的专家,正如研究画笔与颜料不能让人成为专业画家一样.” 一个在我所有招聘过的人中属于最优秀之一的程序员只有高中毕业,但他写出很多很棒 的程序,他甚至有自己的新闻组。他获得的股票期权使得他可以拥有自己的午夜酒吧.•跟其他程序员一起完成项目。在一些项目中成为最好的程序员;在一些中则充当最差的一个。当你是最佳的,你要测试自己领导项目的能力,并以你的能力鼓励他人。当你是最差的,要看看高手做些什么,他们不喜欢做什么(因为他们会叫你去帮他们做).•接手别的程序员完成项目。全心投入并理解别人的程序。当原作者不在的时候,看看在理解与修改时有什么要注意的。想想如何设计你的程序使得后来维护的人容易上手。

•至 少学会六门编程语言。一种要支持类/对象(class abstractions)的语言, 如Java或C++;一种函数式(functional abstraction)语言, 如 LISP 或 ML;一种支持语法抽象(syntactic abstraction)的语言 如 LISP;一种声明式语言, 如Prolog或 C++模版;一种支持协同式(coroutines)编程, 如 Icon 或 Scheme;还有一种支持并行(parallelism)的语言, 如 Sisal.•记住在 “计算机科学” 中包括”计算机” 这个词。要知道你的计算机执行一条指令需要多久,到内存中取一个字需要多久(缓存是否击中), 到磁盘读取连续的字需要多久,而磁盘的定位又需要多久.(解答见文末)

•进行语言标准化的工作。可以像是由ANSI C++ 委员会,或由你自己的团队,来决定你们的编码风格,譬如说缩排是2或4个空格。不管怎样,你都能学到别人到底喜欢什么,对语言的感受有多深,甚至能了解到一点他们为什么有这样的感觉。

•并具备良好的判断力,也别老纠缠在语言标准化上.谈 了上面所有的想法后,我不禁要问究竟能从书上学到多少。在第一个孩子出生前,我读完了所有的 “怎样…” 的书,仍觉得自己是个一无所知的(照顾孩子的)菜鸟。30个月后,第二个孩子出世,我要重回这些书好好复习么? 不!取而代之的是,我开始相信自己的个人经验。这些难得的经验,比专家写的几千页手册还要有用,而且让我重新找到了自信.Fred Brooks(译注: <人月神话>作者)在他的文章 没有银弹 中指出,发掘卓越软体设计者的三部曲:

1.尽早尽可能地以系统化的方式发掘最佳设计人员。

2.给有潜力者指派生涯规划师,并谨慎地规划他们的职业生涯。

3.提供机会给正在成长的程序员,让他们能相互影响,彼此激励。

这里假定了某些人已具备成为卓越设计师的必要潜能;工作只是诱导他们前进。Alan Perlis 说得更简洁了,你可以教任何人学雕塑,但对米开朗基罗而言,要教他的反倒是有哪些事不要做, 卓越的程序员也一样。

所以,尽管买那些 Java 书吧!你或许能从中找到点有用的,但是在24小时,几天或者几个月中,这些都不会改变你的人生,你也不能掌握一个真正的程序员应该具备的真正的综合的技能。

参考文献:

Bloom, Benjamin(ed.)Developing Talent in Young People, Ballantine, 1985.Brooks, Fred, No Silver Bullets, IEEE Computer, vol.20, no.4, 1987, p.10-19.Hayes, John R., Complete Problem Solver Lawrence Erlbaum, 1989.Lave, Jean, Cognition in Practice: Mind, Mathematics, and Culture in Everyday Life, Cambridge University Press, 1988.________________________________

解答:

各种操作的时间,以2001年夏季,典型配置的 1GHz 个人计算机为标准:

执行单一指令 1 纳秒

从L1 高速缓存取一个字 2 纳秒

从内存取一个字 10 纳秒

从磁盘取连续存放的一个字 200 纳秒

磁盘寻址并取字 8 毫秒

________________________________

附录 I: 语言的选择

好几个人问过我一开始应该先学哪个计算机编程语言,这个问题没有唯一的答案,不过选择的时候可以从以下的几个方面考虑:

•朋友在用的.当 人们问我:”我该用什么操作系统的时候”,我通常的回答是:“用你朋友用的”.这样的好处是从朋友那儿学习可以弥补复杂的操作系统差异或者编程语言差异(给你造成的困惑)。这里也要考虑你未来的朋友:如果你一直使用的话,开发社区会 是你的朋友。你选择了一个具有有巨大的增长的开发社区还是一个小的快消失的开发社区的语言? 它有相关的书,网站和论坛可以获取解答么? 你喜欢那些论坛上的人么?

•保持简单.诸如C++和Java 是为那些关心代码执行效率的有经验的大型团队的开发人员设计的。因此这些语言中有些为这些特殊场合设计的部件。你只是关心编程而不需要关心复杂情况。你需要一个为新学编程的人设计的容易学习和理解的语言。

•实践.什么是学习钢琴的好方法呢? 是一边听音一边弹奏的“交互式” 的方法呢,还是全听完整首歌然后再弹奏的那种“批处理”方式呢? 很显然, 交互学习的方式能够让学钢琴变得简单–这也适用于编程.选取一种交互式的编程语言并且坚持使用.基于以上的这些标准,我对于第一次接触编程的人推荐 Python 或 Scheme.但是情况各有不同,或许也有其他的选择.如果你不满10岁,你可能会喜欢Alice 或者Squeak(年龄大的人或许也喜欢这些).重要的是在选择后, 立即开始学习和使用.附录II: 书和其他资源:

很多人问我该从什么书或者什么网页开始看起。我重申一句:“仅仅看书是不够的”,不过我也推荐一下的一些:

•Scheme: 计算机程序的结构和释义(Abelson & Sussman)可能是计算机科学最好的导论了, 他还告诉程序员怎么理解计算机科学, 你可以访问这本书的 在线视频讲座 和 全文在线.这本书也很有挑战性,可能会排除掉一些可能在其他领域成功的人.•Scheme: 怎样设计程序(Felleisen 等)是讲解怎样设计优雅的函数式语言的最好的书之一.•Python: Python 编程,面向计算机科学的导论(Zelle)是用Python 介绍计算机科学的好书.•Python: 一些关于Python的 入门教程 可以在 Python.org 上找到.•Oz: 计算机编程的概念,技术和模型(Van Roy & Haridi)可以视为第一本书的现代版.他是关于编程的一些总揽,包含了比第一本书更加广泛也更加容易阅读和理解的领域。这本书使用了一个不太为人所知的编程语言叫 Oz, 不过这个可以作为学习其他编程语言的一个基础。

________________________________

注: T.Capey 指出,在Amazon 的 问题彻底解决者 的页面上购买了这本书的人还买了: “21天学孟加拉语” 和 “自学语法和写作风格” 这两本书,我估计大部分是我这个页面带过去的用户.Peter Norvig(Copyright 2001)

Eric You XU 翻译,2007年4月

第二篇:人人都能学会的企业SHELL编程v2

人人都能学会的SHELL编程

目 录

1.Shell入门简介.......................................................................................................2 2.Shell编程之变量详解...........................................................................................5 3.If条件语句学习.....................................................................................................8 4.使用if条件语句编写MySQL备份脚本..............................................................10 5.IF条件综合Shell实战脚本编写.......................................................................11 6.循环语句for.........................................................................................................20 7.循环语句while.....................................................................................................22 8.Until循环语句.....................................................................................................23 9.Case选择语句.......................................................................................................23 10.select选择语句.................................................................................................25 11.Shell编程函数讲解...........................................................................................25 12.Shell数组编程...................................................................................................27 13.Shell编程之awk、sed命令案例分析.............................................................30 14.全备和增量备份Linux系统脚本......................................................................31 15.Shell编程之系统硬件信息数据库收集...........................................................34 16.Shell编程之磁盘报警高级脚本.......................................................................37 17.Shell编程之服务监控检查脚本.......................................................................40 18.Shell编程之实战WEB界面展示一...................................................................40 19.Shell编程之实战WEB界面展示二...................................................................40 20.Shell编程之学习心得分享及拓展...................................................................40

1.Shell入门简介

说到Shell编程,我想很多从事Linux运维工作的朋友都不陌生,都对Shell有基本的了解,可能大家刚开始接触Shell的时候,有各种想法? 能不能不学? 高大上?

到底是浮云?还是神马?

很难啊?

我想告诉大家的是,大家有这些想法一点都不觉得惊讶,为什么?这些都很正常,对于任何一件事情在未开始之前,肯定会有总总假设,那我今天想说的是,学完人人都会Shell编程后,我们会觉得一切的Shell都是浮云,我们每个人都能很好的使用它,驾驭它,更好的完成我们日常运维的工作。

曾经有人说过,玩Linux不知道Shell,那就是不懂Linux;现在细细品味确实是这样。为了让更多的人能接触Shell、了解Shell,使用Shell,所以今天开设了这样一个网络课程,让我们的Shell飞起来。

好的,其他不多说了,我们正式进入主题,什么是Shell呢? Shell是操作系统的最外层,Shell可以合并编程语言以控制进程和文件,以及启动和控制其它程序。shell 通过提示您输入,向操作系统解释该输入,然后处理来自操作系统的任何结果输出来管理您与操作系统之间的交互。简单来说Shell就是一个用户跟操作系统之间的一个命令解释器。

Shell是用户与Linux操作系统之间沟通的桥梁。用户可以输入命令执行,又可以利用 Shell脚本编程去运行。

Linux Shell种类非常多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh)等。不同的Shell语言的语法有所不同,所以不能交换使用。

最常用的shell是Bash,也就是Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用,也是大多数Linux系统默认的Shell。接下来我们来写一个简单的shell脚本。(shell脚本一般文件名以.sh结尾,同时文件第一行定义该脚本为shell脚本)vi first_shell.sh #!/bin/bash #This is my First shell echo “Hello World!”

这就是我们的第一个脚本,是不是很简单呢,注解如下:

#!/bin/bash //表示定义该脚本是一个shell脚本(固定格式)。#This is my First shell //这里的#号属于注解,没有任何的意义,SHELL不会解析它。

echo “Hello World!” //shell脚本主命令,我们执行这个脚本讲看到: Hello World!信息。

脚本编写完毕,如何来执行呢,首先执行shell脚本需要执行权限,赋予执行权限:

chmod o+x first_shell.sh 然后./first_shell.sh执行即可;也可以直接使用命令执行: /bin/sh first_shell.sh,显示效果一样。2.Shell编程之变量详解

Shell编程语言是非类型的解释型语言,不像C++/JAVA语言编程时需要事先声明变量,SHELL给一个变量赋值,实际上就是定义了变量,在Linux支持的所有shell中,都可以用赋值符号(=)为变量赋值。SHELL变量可分为两类:局部变量和环境变量。局部变量只在创建它们的shell脚本中使用。而环境变量则可以在创建它们的shell及其派生出来的任意子进程中使用。有些变量是用户创建的,其他的则是专用shell变量。

例如在脚本里面定义A=123 ,定义这样一个变量,前面变量名,后面是变量的值。

引用变量可以使用$A,把变量放在脚本里面会出现什么样的效果呢?如下: #!/bin/bash #Author wugk 2014-06-10 A=123 echo “Printf variables equal is $A” 执行脚本:sh test.sh,结果将会显示: Printf variables equal is 123 简单的理解变量,相当于定义一个别名-名称,引用的时候加上$符号就可以了。

例如定义变量 name=wuguangke 执行echo $name 将会显示wuguangke SHELL常见的系统变量解析: $0 当前程序的名称

$n 当前程序的第n个参数,n=1,2,„9 $* 当前程序的所有参数(不包括程序本身)$# 当前程序的参数个数(不包括程序本身)$? 命令或程序执行完后的状态,一般返回0表示执行成功。$UID 当前用户的ID $PWD 当前所在的目录

我们来测试一个常用变量的脚本:vi auto_var.sh #!/bin/bash #auto print variables #by wugk 2014-09 echo-e '33[32m-----------------------------33[0m' echo “This is $0 param!” echo “This $1 is $1 param!” echo “This $2 is $2 param!” echo-e '33[32m-----------------------------33[0m' echo “This $* is $* param!” echo “This $# is $# param!” echo “This $? is $? param!” echo

紧接着我们来编写一个简单的echo打印菜单: #!/bin/bash #auto install httpd #by wugk 2014-09 echo-e '33[32m-----------------------------33[0m' FILES=httpd-2.2.17.tar.bz2 URL=http://mirrors.cnnic.cn/apache/httpd/ PREFIX=/usr/local/apache2/ echo-e “33[36mPlease Select Install Menu:33[0m” echo echo “1)官方下载Httpd文件包.” echo “2)解压apache源码包.” echo “3)编译安装Httpd服务器.” echo “4)启动HTTPD服务器.” echo-e '33[32m-----------------------------33[0m' sleep 20

3.If条件语句学习

在Linux Shell编程中,if、for、while、case等条件流程控制语句用的非常多,把这些学好,对提升脚本的功力有非常大的帮助。下面将逐个来讲解具体的用法:  If条件判断语句

if(表达式)#if(Variable in Array)语句1 else 语句2 fi 案例一,测试数字大小 #!/bin/sh NUM=100 if(($NUM > 4));then echo “this num is $NUM greater 4!” fi 案例二,测试目录是否存在,不存在则新建(注意,中括号之间必须要空格)#!/bin/sh #judge dir exist if [!-d /data/20140515 ];then mkdir-p /data/20140515 else echo “This DIR is exist,Please exit „..” fi 逻辑运算符解析:

-f 判断文件是否存在 eg: if [-f filename ]-d 判断目录是否存在 eg: if [-d dir ]-eq 等于 应用于:整型比较-ne 不等于 应用于:整型比较-lt 小于 应用于:整型比较-gt 大于 应用于:整型比较-le 小于或等于 应用于:整型比较-ge 大于或等于 应用于:整型比较

-a 双方都成立(and)逻辑表达式 –a 逻辑表达式-o 单方成立(or)逻辑表达式 –o 逻辑表达式-z 空字符串

案例三,多个条件测试判断 #!/bin/sh scores=80 if [[ $scores-gt 85 ]];then echo “very good!”;elif [[ $scores-gt 75 ]];then echo “good!”;elif [[ $scores-gt 60 ]];then echo “pass!”;else echo “no pass!” fi 4.使用if条件语句编写MySQL备份脚本 a)自动备份Mysql数据库脚本 #!/bin/sh #auto backup mysql #wugk 2012-12-12 #Define PATH定义变量

BAKDIR=/data/backup/mysql/`date +%Y-%m-%d` MYSQLDB=webapp MYSQLPW=backup MYSQLUSR=backup #must use root user run scripts 必须使用root用户运行,$UID为系统变量 if

[ $UID-ne 0 ];then echo This script must use the root user!!sleep 2 exit 0 fi #Define DIR and mkdir DIR 判断目录是否存在,不存在则新建 if [!-d $BAKDIR ];then mkdir-p $BAKDIR else echo This is $BAKDIR exists....fi #Use mysqldump backup mysql 使用mysqldump备份数据库 /usr/bin/mysqldump-u$MYSQLUSR-p$MYSQLPW-d $MYSQLDB >$BAKDIR/webapp_db.sql echo “The mysql backup successfully ” 5.IF条件综合Shell实战脚本编写

通过if语句和之前变量的学习,今天我们将把我们所学的综合在一起来讲解一个实战运维脚本,一键安装LAMP环境的脚本: 一键源码安装LAMP脚本,先分解脚本的各个功能: 打印菜单:

1)安装apache WEB服务器 2)安装Mysql DB服务器 3)安装PHP 服务器

4)整合LAMP架构并启动服务

1、Apache服务器安装部署。

下载httpd-2.2.27.tar.gz版本,下载URL,解压,进入安装目录,configure;make;make install

2、Mysql服务器的安装。

下载mysql-5.5.20.tar.bz2版本,下载URL,解压,进入安装目录,configure;make;make install

3、PHP服务器安装。

下载php-5.3.8.tar.bz2版本,下载URL,解压,进入安装目录,configure;make;make install

4、LAMP架构的整合和服务启动。

/usr/local/apache2/bin/apachectl start vi htdocs/index.php vi auto_lamp.sh内容如下: #!/bin/bash #auto install LAMP #by wugk 2014-11 #Httpd define path variable H_FILES=httpd-2.2.27.tar.bz2 H_FILES_DIR=httpd-2.2.27 H_URL=http://mirrors.cnnic.cn/apache/httpd/ H_PREFIX=/usr/local/apache2/

#MySQL define path variable M_FILES=mysql-5.5.20.tar.gz M_FILES_DIR=mysql-5.5.20 M_URL=http://down1.chinaunix.net/distfiles/ M_PREFIX=/usr/local/mysql/

#PHP define path variable P_FILES=php-5.3.28.tar.bz2 P_FILES_DIR=php-5.3.28 P_URL=http://mirrors.sohu.com/php/ P_PREFIX=/usr/local/php5/ echo-e '33[32m-----------------------------33[0m' echo

if [-z “$1” ];then

echo-e “33[36mPlease Select Install Menu follow:33[0m” echo-e “33[32m1)编译安装Apache服务器33[1m” echo “2)编译安装MySQL服务器” echo “3)编译安装PHP服务器” echo “4)配置index.php并启动LAMP服务” echo-e “33[31mUsage: { /bin/sh $0 1|2|3|4|help}33[0m” exit fi

if [[ “$1”-eq “help” ]];then echo-e “33[36mPlease Select Install Menu follow:33[0m” echo-e “33[32m1)编译安装Apache服务器33[1m” echo “2)编译安装MySQL服务器” echo “3)编译安装PHP服务器” echo “4)配置index.php并启动LAMP服务” echo-e “33[31mUsage: { /bin/sh $0 1|2|3|4|help}33[0m” exit fi

### #Install httpd web server if [[ “$1”-eq “1” ]];then

wget-c $H_URL/$H_FILES && tar-jxvf $H_FILES && cd $H_FILES_DIR &&./configure--prefix=$H_PREFIX if [ $?-eq 0 ];then

make && make install

echo-e “n33[32m----------------33[0m”

echo-e “33[32mThe $H_FILES_DIR Server Install Success!33[0m” else

echo-e “33[32mThe $H_FILES_DIR Make or Make install ERROR,Please Check......”

exit 0 fi fi

#Install Mysql DB server if [[ “$1”-eq “2” ]];then

wget-c $M_URL/$M_FILES && tar-xzvf $M_FILES && cd $M_FILES_DIR &&yum install cmake-y;cmake.-DCMAKE_INSTALL_PREFIX=$M_PREFIX-DMYSQL_UNIX_ADDR=/tmp/mysql.sock-DMYSQL_DATADIR=/data/mysql-DSYSCONFDIR=/etc-DMYSQL_USER=mysql-DMYSQL_TCP_PORT=3306-DWITH_XTRADB_STORAGE_ENGINE=1-DWITH_INNOBASE_STORAGE_ENGINE=1-DWITH_PARTITION_STORAGE_ENGINE=1-DWITH_BLACKHOLE_STORAGE_ENGINE=1-DWITH_MYISAM_STORAGE_ENGINE=1-DWITH_READLINE=1-DENABLED_LOCAL_INFILE=1-DWITH_EXTRA_CHARSETS=1-DDEFAULT_CHARSET=utf8-DDEFAULT_COLLATION=utf8_general_ci-DEXTRA_CHARSETS=all-DWITH_BIG_TABLES=1-DWITH_DEBUG=0 make && make install

/bin/cp support-files/my-small.cnf /etc/my.conf /bin/cp support-files/mysql.server /etc/init.d/mysqld chmod +x /etc/init.d/mysqld chkconfig--add mysqld chkconfig mysqld on

if [ $?-eq 0 ];then make && make install echo-e “n33[32m----------------33[0m” echo-e “33[32mThe $M_FILES_DIR Server Install Success!33[0m” else echo-e “33[32mThe $M_FILES_DIR Make or Make install ERROR,Please Check......” exit 0 fi fi

#Install PHP server if [[ “$1”-eq “3” ]];then

wget-c $P_URL/$P_FILES && tar-jxvf $P_FILES && cd $P_FILES_DIR &&./configure--prefix=$P_PREFIX--with-config-file-path=$P_PREFIX/etc--with-mysql=$M_PREFIX--with-apxs2=$H_PREFIX/bin/apxs if [ $?-eq 0 ];then make ZEND_EXTRA_LIBS='-liconv' && make install echo-e “n33[32m----------------33[0m” echo-e “33[32mThe $P_FILES_DIR Server Install Success!33[0m” else echo-e “33[32mThe $P_FILES_DIR Make or Make install ERROR,Please Check......” exit 0 fi fi

#

if [[ “$1”-eq “4” ]];then

sed-i '/DirectoryIndex/s/index.html/index.php index.html/g' $H_PREFIX/conf/httpd.conf $H_PREFIX/bin/apachectl restart

echo “AddType application/x-httpd-php.php” >>$H_PREFIX/conf/httpd.conf IP=`ifconfig eth1|grep “Bcast”|awk '{print $2}'|cut-d:-f2` echo “You can access http://$IP/”

cat >$H_PREFIX/htdocs/index.php < EOF Fi 6.循环语句for For 变量 in 字符串 do 语句1 done 案例一,打印seq数字循环

#!/bin/sh for i in `seq 15` do

echo “NUM is $i”

done 案例二,求和1-100的值 #!/bin/bash #auto sum 1 100 j=0 for((i=1;i<=100;i++))do j=`expr $i + $j` done echo $j 案例三,找到相关log,然后批量打包 #!/bin/sh for i in `find /var/log-name “*.log”` do

tar –czf 2014log.tgz $i done 案例四,远程主机批量传输文件: #!/bin/bash #auto scp files for client #by authors wugk 2014 for i in `seq 100 200` do scp-r /tmp/test.txt root@192.168.1.$i:/data/webapps/www.xiexiebang.comnic.cn/apache/httpd/ H_PREFIX=/usr/local/apache2/ function Apache_install(){ #Install httpd web server if [[ “$1”-eq “1” ]];then

wget-c $H_URL/$H_FILES && tar-jxvf $H_FILES && cd $H_FILES_DIR &&./configure--prefix=$H_PREFIX if [ $?-eq 0 ];then

make && make install

echo-e “n33[32m----------------33[0m”

echo-e “33[32mThe $H_FILES_DIR Server Install Success!33[0m” else

echo-e “33[32mThe $H_FILES_DIR Make or Make install ERROR,Please Check......”

exit 0 fi fi } Apache_install直接调用函数就会去运行函数里面定义的代码了。12.Shell数组编程

数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字成为数组名,编号成为下标。

今天这里我们来探讨一维数组的定义、统计、引用和删除等操作。首先来定义一个一维数组:

A=(test1 test2 test3),定义数组一般以括号的方式来定义,数组的值可以随机定义。如何来引用呢? echo ${A[0]},代表引用第一个数组变量,结果会显示test1,数组引用从0开始,代表第一个数组,依次类推。

echo ${A[1]},代表引用第二个数组变量,结果会显示test2,数组引用也是从0开始计算的。

如何显示该数组所有参数呢?echo ${A[@]} 将显示所有参数test1 test2 test3。

如何显示该数组参数个数呢?echo ${#A[@]} 将显示该数组的参数个数3。

如果替换某个数组呢?例如替换第二个test2数组为test5:echo ${A[@]/test2/test5} 如何删除一个数组呢?例如删除test3数组命令为:unset A[2];echo ${A[@]}查看效果。

那输入如何在编程来使用呢?请看下面例子: #!/bin/sh #Auto Make KVM Virtualization #Auto config bond scripts eth_bond(){ NETWORK=(HWADDR=`ifconfig eth0 |egrep “HWaddr|Bcast” |tr “n” “ ”|awk '{print $5,$7,$NF}'|sed-e 's/addr://g'-e 's/Mask://g'|awk '{print $1}'` IPADDR=`ifconfig eth0 |egrep “HWaddr|Bcast” |tr “n” “ ”|awk '{print $5,$7,$NF}'|sed-e 's/addr://g'-e 's/Mask://g'|awk '{print $2}'` NETMASK=`ifconfig eth0 |egrep “HWaddr|Bcast” |tr “n” “ ”|awk '{print $5,$7,$NF}'|sed-e 's/addr://g'-e 's/Mask://g'|awk '{print $3}'` GATEWAY=`route-n|grep “UG”|awk '{print $2}'`)cat >ifcfg-bond0<

在我们日常的Shell编程中我们会用到很多的一些语句,有的语句,如果用好了,可以让我们的脚本更上一层楼,让我们的功能更容易满足企业的需求。Sed命令:

sed 's/192/10/g' test.txt 把文件里面的192字符替换为10

在文件开头或者结尾添加字符:

Awk命令: Find命令: Grep正则: 14.全备和增量备份Linux系统脚本

在Linux中,我们经常需要备份系统重要文件,例如/etc、/boot分区、重要网站数据等等,如果每天都完整备份的话,会占用很大的空间,那我们改如何来备份呢? 这里采用如下方法来备份:

每周日进行完整备份,其余每天为增量备份。那使用什么命令来备份呢,我们使用tar命令: 全备份:tar-g /tmp/snapshot-czvf /tmp/2014_full_system_data.tar.gz /data/sh/ 增量备: tar-g /tmp/snapshot-czvf /tmp/2014_add01_system_data.tar.gz /data/sh/

#!/bin/sh #Automatic Backup Linux System Files #Author wugk 2013-11-22 #Define Variable SOURCE_DIR=($*)TARGET_DIR=/data/backup/ YEAR=`date +%Y` MONTH=`date +%m` DAY=`date +%d` WEEK=`date +%u` A_NAME=`date +%H%M` FILES=system_backup.tgz CODE=$? if [-z “$*” ];then echo-e “33[32mUsage:nPlease Enter Your Backup Files or Directoriesn-------------nnUsage: { $0 /boot /etc}33[0m” exit fi #Determine Whether the Target Directory Exists if [!-d $TARGET_DIR/$YEAR/$MONTH/$DAY ];then mkdir-p $TARGET_DIR/$YEAR/$MONTH/$DAY echo-e “33[32mThe $TARGET_DIR Created Successfully!33[0m” fi #EXEC Full_Backup Function Command Full_Backup(){ if [ “$WEEK”-eq “7” ];then rm-rf $TARGET_DIR/snapshot cd $TARGET_DIR/$YEAR/$MONTH/$DAY;tar-g $TARGET_DIR/snapshot-czvf $FILES ${SOURCE_DIR[@]} [ “$CODE” == “0” ]&&echo-e “-------------n33[32mThese Full_Backup System Files Backup Successfully!33[0m” fi } #Perform incremental BACKUP Function Command Add_Backup(){ if [ $WEEK-ne “7” ];then cd $TARGET_DIR/$YEAR/$MONTH/$DAY;tar-g $TARGET_DIR/snapshot-czvf $A_NAME$FILES ${SOURCE_DIR[@]} [ “$CODE” == “0” ]&&echo-e “----------n33[32mThese Add_Backup System Files $TARGET_DIR/$YEAR/$MONTH/$DAY/${YEAR}_$A_NAME$FILES Backup Successfully!33[0m” fi } sleep 3 Full_Backup;Add_Backup 15.Shell编程之系统硬件信息数据库收集

首先我们创建数据库表,格式如下: CREATE TABLE `audit_audit_system`(`id` int(11)NOT NULL AUTO_INCREMENT,`ip_info` varchar(50)NOT NULL,`serv_info` varchar(50)NOT NULL,`cpu_info` varchar(50)NOT NULL,`disk_info` varchar(50)NOT NULL,`mem_info` varchar(50)NOT NULL,`load_info` varchar(50)NOT NULL,`mark_info` varchar(50)NOT NULL,PRIMARY KEY(`id`),UNIQUE KEY `ip_info`(`ip_info`),UNIQUE KEY `ip_info_2`(`ip_info`));然后编写脚本如下: #!/bin/sh #auto get system info #author wugk 2014-08-29 echo-e “33[34m 33[1m” cat <

++++++++++++++++++++++++++++++++++++++++++++++ ++++++++Welcome to use system Collect+++++++++ ++++++++++++++++++++++++++++++++++++++++++++++ EOF ip_info=`ifconfig |grep “Bcast”|tail-1 |awk '{print $2}'|cut-d:-f 2` cpu_info1=`cat /proc/cpuinfo |grep 'model name'|tail-1 |awk-F: '{print $2}'|sed 's/^ //g'|awk '{print $1,$3,$4,$NF}'` cpu_info2=`cat /proc/cpuinfo |grep “physical id”|sort |uniq-c|wc-l` serv_info=`hostname |tail-1` disk_info=`fdisk-l|grep “Disk”|grep-v “identifier”|awk '{print $2,$3,$4}'|sed 's/,//g'` mem_info=`free-m |grep “Mem”|awk '{print “Total”,$1,$2“M”}'` load_info=`uptime |awk '{print “Current Load: ”$(NF-2)}'|sed 's/,//g'` mark_info='BeiJing_IDC'

echo-e “33[32m------------33[1m” echo IPADDR:${ip_info} echo HOSTNAME:$serv_info echo CPU_INFO:${cpu_info1} X${cpu_info2} echo DISK_INFO:$disk_info echo MEM_INFO:$mem_info echo LOAD_INFO:$load_info echo-e “33[32m------------33[0m”

echo-e-n “33[36mYou want to write the data to the databases? 33[1m”;read ensure if “Y” ];then echo “-------------” [ “$ensure” == “yes”-o “$ensure” == “y”-o “$ensure” == echo-e '33[31mmysql-uaudit-p123456-D audit-e ''' “insert into audit_audit_system values('','${ip_info}','$serv_info','${cpu_info1} X${cpu_info2}','$disk_info','$mem_info','$load_info','$mark_info')” ''' 33[0m ' else

fi 读取数据库信息:

mysql-uroot-p123-e 'use wugk1;select * from audit_audit_system;'|sed 's/-//g'|grep-v “id” 这样,我们可以把数据库的内容在shell脚本里面调用出来。16.Shell编程之磁盘报警高级脚本 echo “wait exit......” exit 脚本分析:

1、磁盘达到85%发送报警邮件。

2、发送邮件命令格式。

3、多个报警设置。

4、把分区的信息写入文件。

Mail-s “邮件主题”-c”抄送地址”-b “密送地址”-f 发送人邮件地址 –F 发件人姓名 < 要发送的邮件内容 #!/bin/sh #auto monitor disk #by authors wugk 2014 echo-e “33[31m 33[1m” rm-rf list.txt LIST=`df-h |grep “^/dev/” >>list.txt` cat << EOF +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++welcome to use auto monitor system++++++++++++++++ +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ EOF echo-e “33[32m----------------------------33[0m” echo sleep 2 while read line do

IP_ADDR=`ifconfig eth1|grep “Bcast”|awk '{print $2}'|cut-d:-f 2`

D_Name=`echo $line|awk '{print $1,$NF“分区”}'`

D_Total=`echo $line|awk '{print $2}'`

D_Avail=`echo $line|awk '{print $4}'`

D_Percent=`echo $line|awk '{print $5}'|sed 's/%//g'`

if [ “$D_Percent”-ge 50 ];then cat >email.txt <

日期/时间: 周二 2014年11月11日 15时:15分:53秒 CST 额外信息: CRITICAL-DISK Monitor:$D_Name Used more than ${D_Percent}% EOF EOF

echo-e “33[32mThe $D_Name has been used for more than ${D_Percent}% ,Please Check.33[0m” mail-s “$D_Name Warning” wgkgood@163.com

#echo “The $D_Name has been used for more than ${D_Percent}% ,Please Check.”|mail-s “$D_Name Warning” wgkgood@163.com

fi done

第三篇:编程感想

编程感想

从C学到C++,就是从面向过程到对象,又从C++到JAVA,就是从静态语言到动态语言。编程语言的学习无怪乎多写代码,多参考,多了解,那些所谓的牛人,又有多牛呢 ? 我想开始时也跟我们刚学时一样,但人家坚持住了,所以被牛了!编程要养成好的习惯!

下面是我在一篇博文上看到的,很受用,与大家分享 态度篇

1.做实事 不要抱怨,发牢骚,指责他人,找出问题所在,想办法解决。对问题和错误,要勇于承担。

2.欲速则不达 用小聪明、权宜之计解决问题,求快而不顾代码质量,会给项目留下要命的死角。

3.对事不对人 就事论事,明智、真诚、虚心地讨论问题,提出创新方案。4.排除万难,奋勇前进 勇气往往是克服困难的唯一方法。学习篇

5.跟踪变化 新技术层出不穷并不可怕。坚持学习新技术,读书,读技术杂志,参加技术活动,与人交流。要多理解新词背后的所以然,把握技术大趋势,将新技术用于产品开发要谨慎。

6.对团队投资打造学习型团队,不断提高兄弟们的平均水平。7.懂得丢弃 老的套路和技术,该丢,就得丢。不要固步自封。

8.打破砂锅问到底 不断追问,真正搞懂问题的本质。为什么?应该成为你的口头禅。9.把握开发节奏 控制好时间,养成好习惯,不要加班。开发流程篇

10.让客户做决定 让用户在现场,倾听他们的声音,对业务最重要的决策应该让他们说了算。

11.让设计指导而不是操纵开发 设计是前进的地图,它指引的是方向,而不是目的本身。设计的详略程度应该适当。

12.合理地使用技术 根据需要而不是其他因素选择技术。对各种技术方案进行严格地追问,真诚面对各种问题。

13.让应用随时都可以发布 通过善用持续集成和版本管理,你应该随时都能够编译、运行甚至部署应用。

14.提早集成,频繁集成 集成有风险,要尽早尽量多地集成。15.提早实现自动化部署 16.使用演示获得频繁反馈 17.使用短迭代,增量发布

18.固定价格就意味着背叛承诺 估算应该基于实际的工作不断变化。用户篇 19.守护天使 自动化单元测试是你的守护天使。20.先用它再实现它 测试驱动开发其实是一种设计工具。21.不同环境,就有不同问题 要重视多平台问题。22.自动验收测试

23.度量真实的进度 在工作量估算上,不要自欺欺人。24.倾听用户的声音 每一声抱怨都隐藏着宝贵的真理。编程篇

25.代码要清晰地表达意图

代码是给人读的,不要耍小聪明。26.用代码沟通 注释的艺术。

27.动态地进行取舍 记住,没有最佳解决方案。各种目标不可能面面俱到,关注对用户重要的需求。

28.增量式编程 写一点代码就构建、测试、重构、休息。让代码干净利落。

29.尽量简单 宁简勿繁。如果没有充足的理由,就不要使用什么模式、原则和特别的技术。30.编写内聚的代码 类和组件应该足够小,任务单一。31.告知,不要询问 多用消息传递,少用函数调用。32.根据契约进行替换 委托往往优于继承。调试篇

33.记录问题解决日志)不要在同一地方摔倒两次。错误是最宝贵的财富。34.警告就是错误 忽视编译器的警告可能铸成大错。

35.对问题各个击破

分而治之是计算机科学中最重要的思想之一。但是,要从设计和原型阶段就考虑各部分应该能够很好地分离。

36.报告所有的异常 37.提供有用的错误信息

稍微多花一点心思,出错的时候,将给你带来极大便利。团队协作篇

38.定期安排会面时间 常开会,开短会。

39.架构师必须写代码

不写代码的架构师不是好架构师。好的设计都来自实际编程。编程可以带来深入的理解。

40.实行代码集体所有制 让开发人员在系统不同区域中不同的模块和任务之间轮岗。41.成为指导者 教学相长。分享能提高团队的总体能力。

42.让大家自己想办法

指引方向,而不是直接提供解决方案。让每个人都有机会在干中学习。

43.准备好后再共享代码 不要提交无法编译或者没有通过单元测试的代码!44.做代码复查 复查对提高代码质量、减少错误极为重要。45.及时通报进展与问题

主动通报,不要让别人来问你。

第四篇:编程小结

编程小结

(一)一.累加:加数1+加数2+加数3+„„+加数n(n个加数相加)假设我们用i表示我们的加数数目,例如:当i=9时,就表示加数9 模版:int i,sum=0;(注意:如果是分数或者小数sum就是float类型)

for(i=1;i<=n;i++)(注意:循环变量的初值和递变规律,也有

可能是i--,或者i+=2等等){通项a;(通项:用一个通用的式子表示所有的加数)sum+=a;} printf(“%d”,sum);(注意:如果是float类型就是%f)

1、求1+2+3„„+100的和,则通项a就是i。

分析:因为a就是i的值,所以这里不需要通项这一行了,因此整个大括号中间就只有一句话,所以大括号可以省略。整理之后就是: int i,sum=0;for(i=1;i<=100;i++)sum+=i;printf(“%d”,sum);

2、求2+4+6„„+100的和。

分析:因为a就是i的值,所以这里不需要通项这一行了,因此整个大括号中间就只有一句话,所以大括号可以省略,再分析,再分析我们发现每个加数都是偶数,那么i的变化就是i+=2,并且i是从2开始变化,那么在赋值的时候就应该是i=2。整理之后就是: int i,sum=0;for(i=2;i<=100;i+=2)sum+=i;printf(“%d”,sum);

3、求1+3+5„„+99的和。

分析:因为a就是i的值,所以这里不需要通项这一行了,因此整个大括号中间就只有一句话,所以大括号可以省略,再分析,再分析我们发现每个加数都是奇数,那么i的变化就是i+=2。整理之后就是: int i,sum=0;for(i=1;i<=100;i+=2)sum+=i;printf(“%d”,sum);

4、求1+5+9+13+17+„„的前100项的和,则通项为j+4,则程序为: int i,sum=0,j=1;for(i=1;i<=100;i++){ sum+=j;j=j+4; } printf(“%d”,sum);因为加数的第一项是1,所以赋初值的时候j=1,然后加数进行变化,变成5加到sum里面,所以这里要将通项和求和这两句话互换位置。

5、求1+4+9+16+„„的前100项的和

分析可知:每个加数就是对应的加数数目的平方,则通项为i*i,则程序为: int i,sum=0;for(i=1;i<=100;i++)sum+= i*i;printf(“%d”,sum);

6、求1+(1+2)+(1+2+3)+(1+2+3+4)+„„的前100项的和。

分析可知每一个加数本身又是一个累加的式子,进一步观察可以发现,每个累加的式子都是加到这个加数所在的加数数目,即第35个加数就是1+2+3„„+35,并且是在前面一个加数的基础上加上这个加数所在的加数数目,也就是说第36个加数就是在前一个加数的基础上加上36,即:1+2+3„„+35+36。假设第k个加数是j,那么第k+1个加数就可以表示为j+(k+1),然后第k+2个加数就是j+(k+1)+(k+2)„„那么我们的通项就可以表示为a=a+i,则程序为: int i,sum=0, a=0;for(i=1;i<=100;i++){ a+=i;sum+=a;} printf(“%d”,sum);

7、求1+1+2+3+5+8+13+21+„„的前100项的和。

分析可知从第三个加数开始,每一个加数是其前两个加数之和,假设第k个加数是m,第k+1个加数是n,然后第k+2个加数就是m+n,那么我们的通项就可以表示为a=m+n,但是要注意每次加数所对应的m和n不一样,所以我们要在求出每个加数之后,找出其对应的m和n;再分析我们可以发现当前的n是下一次的m,当前的加数a是下一次的n,假设接着上面的推导,那么第k+3个加数就是n+(m+n),对应我们的通项a=m+n,理解前面一句话。则程序为: int i,sum=0, m=1,n=1,a;for(i=3;i<=100;i++){ a=m+n;sum+=a;m=n;n=a;} printf(“%d”,sum);

8、求1+1/2+1/3+„„+1/100 分析可知每一个加数就是我们的加数数目的倒数,则通项a就是1/i,我们说循环变量i一般定义为整型,那么1/i的结果就是整型,这样的话小数点后面的就会被省略,所以正确的应该写为a=1.0/i,则程序为:

int i;float sum=0;for(i=1;i<=100;i++){a=1.0/i;sum+=a;} printf(“%f”,sum);

9、求1+1/2+2/3+3/5+5/8+„„的前100项的和。

分析可从第三个加数开始观察,每一个加数的分母是其前一个加数的分子和分母之和,每一个加数的分子是其前一个加数的分母。可以将第一个加数看成1/1,那么第二个加数也符合我们的规律,只有第一个不符合,那么我们可以先将第一个加数加到sum,然后再变下一个加数,但是要注意每次加数所对应的分子和分母不一样,所以我们要在求出每个加数之后,找出下一个加数所对应的分子和分母。设通项表示为a=m/n, 那么下一个加数是n/(m+n),然后下下一个加数就是(m+n)/(m+n+n);再分析我们可以发现当前的分子和分母之和(m+n)是下一次的分母n,当前的分母n是下一次的分子m,注意这里在做数据交换的时候需要中间变量,对应我们的通项a=m/n,理解前面一句话。则程序为: int i;float sum=0, m=1,n=1,t;for(i=1;i<=100;i++){ sum+=m/n;t=m+n;m=n;n=t;} printf(“%f”,sum);

二.累乘:乘数1*乘数2*乘数3*„„*乘数n(n个乘数相乘)假设我们用i表示我们的乘数数目,例如:当i=9时,就表示乘数9 模版:int i,sum=1;(注意:如果是分数或者小数sum就是float类型)

for(i=1;i<=n;i++)(注意:循环变量的初值和递变规律,也有

可能是i--,或者i+=2等等){通项a;(通项:用一个通用的式子表示所有的乘数)sum*=a;} printf(“%d”,sum);(注意:如果是float类型就是%f)

1、求1*2*3„„*100的积,则通项a就是i。

分析:因为a就是i的值,所以这里不需要通项这一行了,因此整个大括号中间就只有一句话,所以大括号可以省略。整理之后就是: int i,sum=1;for(i=1;i<=100;i**)sum*=i;printf(“%d”,sum);

2、求2*4*6„„*100的和。分析:因为a就是i的值,所以这里不需要通项这一行了,因此整个大括号中间就只有一句话,所以大括号可以省略,再分析,再分析我们发现每个乘数都是偶数,那么i的变化就是i+=2,并且i是从2开始变化,那么在赋值的时候就应该是i=2。整理之后就是: int i,sum=1;for(i=2;i<=100;i+=2)sum*=i;printf(“%d”,sum);

3、求1*3*5„„*99的和。

分析:因为a就是i的值,所以这里不需要通项这一行了,因此整个大括号中间就只有一句话,所以大括号可以省略,再分析,再分析我们发现每个乘数都是奇数,那么i的变化就是i+=2。整理之后就是: int i,sum=1;for(i=1;i<=100;i+=2)sum*=i;printf(“%d”,sum);

4、求1*5*9*13*17*„„的前100项的积,则通项为j*4,则程序为: 分析:因为乘数的第一项是1,所以赋初值的时候j=1,然后乘数进行变化,变成5乘到sum里面,所以这里要将通项和求积这两句话互换位置。

int i,sum=1,j=1;for(i=1;i<=100;i**){ sum*=j;j=j*4; } printf(“%d”,sum);

5、求1*4*9*16*„„的前100项的积

分析可知:每个乘数就是对应的乘数数目的平方,则通项为i*i,则程序为: int i,sum=1;for(i=1;i<=100;i**)sum*= i*i;printf(“%d”,sum);

6、求1*(1*2)*(1*2*3)*(1*2*3*4)*„„的前100项的积。分析可知每一个乘数本身又是一个累乘的式子,进一步观察可以发现,每个累乘的式子都是乘到这个乘数所在的乘数数目,即第35个乘数就是1*2*3„„*35,并且是在前面一个乘数的基础上乘上这个乘数所在的乘数数目,也就是说第36个乘数就是在前一个乘数的基础上乘上36,即:1*2*3„„*35*36。假设第k个乘数是j,那么第k+1个乘数就可以表示为j*(k+1),然后第k+2个乘数就是j*(k+1)*(k+2)„„那么我们的通项就可以表示为a=a*i,则程序为: int i,sum=1, a=0;for(i=1;i<=100;i**){ a*=i;sum*=a;} printf(“%d”,sum);

7、求1*1*2*3*5*8*13*21*„„的前100项的积。

分析可知从第三个乘数开始,每一个乘数是其前两个乘数之和,假设第k个乘数是m,第k+1个乘数是n,然后第k+2个乘数就是m+n,那么我们的通项就可以表示为a=m+n,但是要注意每次乘数所对应的m和n不一样,所以我们要在求出每个乘数之后,找出其对应的m和n;再分析我们可以发现当前的n是下一次的m,当前的乘数a是下一次的n,假设接着上面的推导,那么第k+3个乘数就是n*(m+n),对应我们的通项a=m*n,理解前面一句话。则程序为: int i,sum=1, m=1,n=1,a;for(i=3;i<=100;i**){ a=m+n;sum*=a;m=n;n=a;} printf(“%d”,sum);

8、求1*1/2*1/3*„„*1/100 分析可知每一个乘数就是我们的乘数数目的倒数,则通项a就是1/i,我们说循环变量i一般定义为整型,那么1/i的结果就是整型,这样的话小数点后面的就会被省略,所以正确的应该写为a=1.0/i,则程序为:

int i;float sum=1;for(i=1;i<=100;i**){a=1.0/i;sum*=a;} printf(“%f”,sum);

9、求1*1/2*2/3*3/5*5/8*„„的前100项的积。

分析可从第三个乘数开始观察,每一个乘数的分母是其前一个乘数的分子和分母之和,每一个乘数的分子是其前一个乘数的分母。可以将第一个乘数看成1/1,那么第二个乘数也符合我们的规律,只有第一个不符合,那么我们可以先将第一个乘数乘到sum,然后再变下一个乘数,但是要注意每次乘数所对应的分子和分母不一样,所以我们要在求出每个乘数之后,找出下一个乘数所对应的分子和分母。设通项表示为a=m/n, 那么下一个乘数是n/(m+n),然后下下一个乘数就是(m+n)/(m+n+n);再分析我们可以发现当前的分子和分母之和(m+n)是下一次的分母n,当前的分母n是下一次的分子m,注意这里在做数据交换的时候需要中间变量,对应我们的通项a=m/n,理解前面一句话。则程序为: int i;float sum=1, m=1,n=1,t;for(i=1;i<=100;i**){ sum*=m/n;t=m+n;m=n;n=t;} printf(“%f”,sum);

10、求1+(1*2)+(1*2*3)+(1*2*3*4)+„„的前100项的和。

分析可知每一个加数本身是一个累乘的式子,进一步观察可以发现,每个累乘的式子都是乘到这个乘数所在的乘数数目,即第35个乘数就是1*2*3„„*35,并且是在前面一个乘数的基础上乘上这个乘数所在的乘数数目,也就是说第36个乘数就是在前一个乘数的基础上乘上36,即:1*2*3„„*35*36。假设第k个乘数是j,那么第k+1个乘数就可以表示为j*(k+1),然后第k+2个乘数就是j*(k+1)*(k+2)„„那么我们的通项就可以表示为a=a*i,再利用累加的模版,则程序为:

int i,sum=0, a=1;for(i=1;i<=100;i**){ a*=i;sum+=a;} printf(“%d”,sum);

11、求1*(1+2)*(1+2+3)*(1+2+3+4)*„„的前100项的积。

分析可知每一个乘数本身又是一个累加的式子,进一步观察可以发现,每个累加的式子都是加到这个乘数所在的乘数数目,即第35个乘数就是1+2+3„„+35,并且是在前面一个乘数的基础上加上这个乘数所在的乘数数目,也就是说第36个乘数就是在前一个乘数的基础上加上36,即:1+2+3„„+35+36。假设第k个乘数是j,那么第k+1个乘数就可以表示为j+(k+1),然后第k+2个乘数就是j+(k+1)+(k+2)„„那么我们的通项就可以表示为a=a+i, 再利用累乘的模版,则程序为:

int i,sum=1, a=0;for(i=1;i<=100;i**){ a+=i;sum*=a;} printf(“%d”,sum);

三.最大值和最小值:数字0,数字1,数字2,„„数字n-1(一共n个数字)假设我们用i表示我们的数字所在的位置,并且第一个位置是0,例如:当i=9时,就表示这个数字在第10个位子

模版: int i,max,a[n];(注意:如果是分数或者小数max和a[n]就是float

类型,注意这里定义的时候根据题目所给的具体数字把n换掉,千万不可以写a[n]o哦~~~~)

for(i=0;i

了数字,就在定义的时候直接赋值,这个循环就不需要了;如果要求产生给数组赋a到b之间的随机数,那么就用a[i]= a + rand()%(b-a);这句话代替这句。注意如果是float类型就是%f)max=a[0];for(i=0;i”)max=a[i];} printf(“%d”, max);(注意:如果是float类型就是%f)

1、求20个数字的最大值和最小值,要求赋1到100之间的随机数,并且输出它们及其下标。

分析:因为这里还要输出其下标,所以还有定义一个row来存放,并且要对其赋值为0,因为我们给max赋值为a[0],则程序为:

int i,max,min,a[20],row1=0,row2=0;for(i=0;i<20;i++)a[i]= 1+rand()%99;max=a[0];min=a[0];for(i=0;i<20;i++){ if(maxa[i])(这里是找出最小值){ min=a[i];row2=i;} } printf(“max =%d, row=%dn min =%d, row=%dn”, max,row1,min,row2);

2、求4*5矩阵的最大值和最小值,要求赋值随机数,并且输出它们及其下标。分析:虽然这是一个二维的数组,但是其思路仍然和一维数组的一样,区别只是这里需要用嵌套循环。要求还要输出其下标,二维数组的下标是两个,所以还要定义一个row和一个col来存放,并且要对它们赋值为0,因为我们给max赋值为a[0] [0],则程序为:

int i,j,max,min,a[4] [5],row1=0,row2=0,col1=0,col2=0;for(i=0;i<4;i++)for(j=0;j<5;j++)a[i] [j]=rand();max=a[0] [0];min=a[0] [0];for(i=0;i<4;i++)for(j=0;j<5;j++){ if(maxa[i] [j])(这里是找出最小值){ min=a[i] [j];row2=i;col2=j;} } printf(“max =%d, row=%d, col=%d n min =%d, row=%d, col=%d n”, max,row1, col1, min,row2, col2);

3、求4*5矩阵的每一行最大值和最小值,要求赋值随机数,并且输出它们及其下标。

分析:虽然这是一个二维的数组,但是要求的是每一行的最大最小值,我们知道二维数组的每一行本身就是一个数组,那么我们就还需要一个控制行数的循环。要求还要输出其下标,二维数组的下标是两个,每一行的最大最小值其行号不就是i,所以还要定义一个存放列号的col,并且要对它赋值为0,因为我们给max赋值为每一行的第一个元素,也就是a[i] [0],则程序为: int i,j,max,min,a[4] [5],col1=0,col2=0;for(i=0;i<4;i++)for(j=0;j<5;j++)a[i] [j]=rand();for(i=0;i<4;i++)(这个循环是控制行的,里面的循环体本身就是一个求

一维数组的最大最小值的程序)

{max=a[i] [0];min=a[i] [0];for(j=0;j<5;j++){ if(maxa[i] [j])(这里是找出最小值){ min=a[i] [j];col2=j;} } printf(“max =%d, row=%d, col=%d n min =%d, row=%d, col=%d n”,max,i, col1, min,i, col2);}

4、求4*5矩阵的每一列最大值和最小值,要求赋值随机数,并且输出它们及其下标。

分析:虽然这是一个二维的数组,但是要求的是每一列的最大最小值,二维数组的每一列可以看成一个数组,那么我们就还需要一个控制列数的循环。要求还要输出其下标,二维数组的下标是两个,每一列的最大最小值其列号不就是j,所以还要定义一个存放行号的row,并且要对它赋值为0,因为我们给max赋值为每一列的第一个元素,也就是a[0] [j],则程序为: int i,j,max,min,a[4] [5],row1=0,row2=0;for(i=0;i<4;i++)for(j=0;j<5;j++)a[i] [j]=rand();for(j=0;j<5;j++)(这个循环是控制列的,里面的循环体本身就是一个求

一维数组的最大最小值的程序){max=a[0] [j];min=a[0] [j];for(i=0;i<4;i++){ if(maxa[i] [j])(这里是找出最小值){ min=a[i] [j];row2=i;} } printf(“max =%d, row=%d, col=%d n min =%d, row=%d, col=%d n”,max, row1,j, min, row2,j);}

5、排序(冒泡法)比如说 对于5个数字排序,首先要把5个数字放到一个一维的数组里面去 所以编程的前几句为:int a[5]

for(i=0;i<5;i++)scanf(“%d”,&a*i+);

那接下来就是排序了,为了方便理解就将数组实际化:比如 a[5]里面放着{7,9,0,12,3}那画图出来就是

a[5]

a[0]

a[1]

a[2]

a[3]

a[4] 那我们排序的方法是这样的采用这样几步:

1,用a[0]与后面的(a[1]~a[4]里面的每一个成员比较即是说:a[0]~a[1]比较

a[0]~a[2]比较 a[0]~a[3]比较 a[0]~a[4]比较)当后面的成员只要发现比a[0]小的就与他的位置交换 这部做完之后数组就应 该是这个样子:

a[0]

a[1]

a[2]

a[3]

a[4] 2,用a[1]与后面的(a[2]~a[4]里面的每一个成员比较即是说: a[1]~a[2]比较

a[1]~a[3]比较 a[1]~a[4]比较)当后面的成员只要发现比a[1]小的就与他的位置交换 这部做完之后数 组该是这个样子:这个时候的a1不是我们赋初值时候的a1老就是我们改变后的数组所以这个时候的a1=9哦。

a[0]

a[1]

a[2]

a[3]

a[4] 3,用a[2]与后面的(a[3]~a[4]里面的每一个成员比较即是说: a[2]~a[3]比较

a[2]~a[4]比较)当后面的成员只要发现比a[2]小的就与他的位置交换 这部做完之后数组就应 该是这个样子:

a[0]

a[1]

a[2]

a[3]

a[4] 4,用a[3]与后面的(a[4]~a[4]里面的每一个成员比较即是说: a[3]~a[4]比较)当后面的成员只要发现比a[2]小的就与他的位置交换 这部做完之后数组就应 该是这个样子:

a[0]

a[1]

a[2]

a[3]

a[4] 循环就是 写成这个样子的哦:

for(i=0;i<4;i++)

for(j=i+1;j<5;j++)if(a[i]

{c=a[i];a[i]=a[j];a[j]=c;}(这个复合语句表示交换a[i]与a[j]进行交换)你把这个 循环好好的分析一下,当i=0 j可以取(1 2 3 4)那if是不是就是a0跟a1—a4之间的所有进行比较并且交换。其他的以此类推。

最后是不是要对排好序的数组进行输出:

for(i=0;i<5;i++)printf(“%d”,a*i+);

6、排序(选择法)比如说 对于5个数字排序,首先要把5个数字放到一个一维的数组里面去 所以编程的前几句为:int a[5]

for(i=0;i<5;i++)scanf(“%d”,&a*i+);

那接下来就是排序了,为了方便理解就将数组实际化:比如 a[5]里面放着{7,9,0,12,3}那画图出来就是

a[5]

a[0]

a[1]

a[2]

a[3]

a[4] 那我们排序的方法是这样的采用这样几步:

1,先把a[0]的下标储存起来,即赋值给k,然后用a[0]与后面的比较

(a[1]~a[4]里面的每一个成员比较即是说:a[0]~a[1]比较 a[0]~a[2]比较 a[0]~a[3]比较 a[0]~a[4]比较)当后面的成员只要发现比a[0]小的就把他的下标赋值给k,最后将a[0]和a[k]的位置交换,这步做完之后数组就应该是这个样子:

a[0]

a[1]

a[2]

a[3]

a[4] 2,先把a[1]的下标储存起来,即赋值给k,然后用a[1]与后面的比较

(a[2]~a[4]里面的每一个成员比较即是说: a[1]~a[2]比较 a[1]~a[3]比较 a[1]~a[4]比较)当后面的成员只要发现比a[1]小的就把他的下标赋值给k,最后将a[1]和a[k]的位置交换 这步做完之后数组就应该是这个样子:

a[0]

a[1]

a[2]

a[3]

a[4] 3,先把a[2]的下标储存起来,即赋值给k,然后用a[2]与后面的比较

(a[3]~a[4]里面的每一个成员比较即是说:a[2]~a[3]比较 a[2]~a[4]比较)当后面的成员只要发现比a[2]小的就把他的下标赋值给k,最后将a[2]和a[k]的位置交换 这步做完之后数组就应该是这个样子:

a[0]

a[1]

a[2]

a[3]

a[4]

4,先把a[3]的下标储存起来,即赋值给k,然后用a[3]与后面的比较(a[4]里面的每一个成员比较即是说: a[3]~a[4]比较)当后面的成员只要发现比a[3]小的就把他的下标赋值给k,最后将a[3]和a[k]的位置交换 这步做完之后数组就应该是这个样子:

a[0]

a[1]

a[2]

a[3]

a[4]

循环就是 写成这个样子的哦:

for(i=0;i<4;i++)

{k=i;for(j=i+1;j<5;j++)

if(a[i]

k=j;if(k!=i)

{c=a[i];a[i]=a[j];a[j]=c;} }(这个复合语句表示交换a[i]与a[j]进行交换)把这个循环好好的分析一下,当i=0, j可以取(1 2 3 4)那if是不是就是a0跟a1—a4之间的所有进行比较并且交换。其他的以此类推。

最后是不是要对排好序的数组进行输出:

for(i=0;i<5;i++)printf(“%d”,a*i+);

四.寻找特殊的数字或解应用题:输出a到b之间的所有的具有某个特点的数字 模版: int n,a,b;(注意:如果是分数或者小数a和b就是float类型)

scanf(“%d,%d”,&a,&b);(从键盘输入查找的范围;如果题目已经给

了范围,就在循环的时候直接带值,这句话就不需要了。注意如果是float类型就是%f。注意如果运行程序,在输入数据验证的时候注意格式要匹配)for(n=a;n<=b;n++)(如果题目已经给了具体的范围,那么这里就根

据题目把a和b换掉){if(条件)(注意:这句话是这类题目的核心,有时候也许不是一

句话,这句话放在这的意思是判定是否是特殊数字)printf(“%d”, n);(注意:如果是float类型就是%f)}

1、输出3到1000之间的所有素数

分析:在做本题之前,先要搞明白什么是素数,它又是如何判定的。补充:

素数 又叫质数,如果一个数只能被1和它本身整除,那么我们就说它是素数。分析:既然一个素数只可以被1和它本身整除,那么当我们判断一个数n是不是素数的时候,就用这个数去除2到(n-1),一旦我们发现可以整除这个区间的某一个数,那么我们就不再去除别的数了,因为在2到(n-1)这个范围内,n可以整除其中的某一个数,那么就肯定不是素数。这个过程需要一个循环和停止循环的break来实现。继续分析,当我们在2到(n-1)这个范围内找不到n可以整除的数,那么就说明这个数是素数,那么我们就判断上面的循环时候做完了,如果中间就跳出循环,则说明不是素数,反之,如果做完了,那么就是素数。P判断能否整除,就是求余看是否为0,则程序如下:

int n;(n是要判断的数,具体根据题意赋值或从键盘输入)for(i=2;i=n)(也可以填i==n,因为如果上面的循环做完了,那么循环变量i=n)printf(“%d is a primenumber!n”,n);else printf(“%d is not a primenumber!n”,n);(这个if„else结构是判断

上面的循环有没有做完)本题分析:只要用上面的程序替换掉模版的那个if就可以了,注意这里不再需要else了,因为题目只要求输出素数,输出语句也只需要一句,则程序如下: int n,i;for(n=3;n<=1000;n++){ for(i=2;i=n)printf(“%d is a primenumber!n”,n);}

2、输出1到100之间的所有同构数

分析:在做本题之前,先要搞明白什么是同构数,它又是如何判定的。补充:

同构数 如果一个数出现在自己的平方数的右边,那么我们就说它是同构数。分析:既然一个同构数会出现在它自己的平方数的右边,那么当我们判断一个数n是不是同构数的时候,先要做的就是求出这个数的平方,然后该怎么判断是不是出现在右边呢?我们人有眼睛,可以直接看,但是电脑不长眼睛的,它看不到,它只能分析,那么它怎么分析呢?1到100之间的所有数只有一位或者两位,那么我们在取平方数右边的时候,只要取这个平方数的最右边的一位或者两位,与我们的数进行比较,看是否一样,如果一样就是同构数,反之就不是。怎么取一个数的最右边一位或者两位呢?求余!!一个数对10求余就是取它的最右边一位,也就是个位;如果对100求余就是取它的最右边两位,也就是十位和个位。则程序如下:

int n;(n是要判断的数,具体根据题意赋值或从键盘输入)if(n*n%10==n|| n*n %100==n)printf(“%d is a isomorphic number!n”,n);本题分析:直接带模版,则程序如下: int n;for(n=1;n<=100;n++){ if(n*n%10==n|| n*n %100==n)printf(“%d is a isomorphic number!n”,n);}(这里的大括号实际是可以去掉的,不去掉也没有关系)

3、输出1到1000之间的所有回文数

分析:在做本题之前,先要搞明白什么是回文数,它又是如何判定的。补充:

回文数 如果一个数字正读和倒读一样,那么这个数字就是回文数。例如:98789, 这个数字正读是98789,倒读也是98789,所以这个数字就是回文数。

分析:既然一个回文数正读和倒读一样,也就是它的最高位和最低位一样,它的次高位和次低位一样,那么当我们判断一个数n是不是回文数的时候,先要确定这个数有几位,才可以确定谁与谁进行比较,然后确定这个数每一位都是谁。1到1000之间的数,除了1000其余最多三位数,显然1000不是回文数,先不考虑,怎么确定这个数是几位呢?如果它的百位是0,那么肯定不是三位数,如果百位和十位都是0,那么肯定是一位数,我们知道一位数肯定都是回文数;对于一个两位数,只要判断它的个位和十位是不是一样就可以了,如果一样,那么肯定是回文数;对于一个三位数只要判断他的个位和百位就可以了,如果一样就是回文数。求一个最多是三位数的每一位,就是将这个数对10求余得到个位;然后这个数除以10,再对10求余得到十位;最后除以100得到百位。则程序如下: int n;(n是要判断的数,具体根据题意赋值或从键盘输入)if(n>0&&n<10)printf(“%d is a huiwen number!n”,n);else if(n/100==0){if(n/10==n%10)printf(“%d is a huiwen number!n”,n);} else if(n/100==n%10)printf(“%d is a huiwen number!n”,n);本题分析:只要用上面的程序替换掉模版的那个if就可以了,则程序如下: int n;for(n=1;n<=1000;n++){ if(n>0&&n<10)printf(“%d is a huiwen number!n”,n);else if(n/100==0){if(n/10==n%10)printf(“%d is a huiwen number!n”,n);} else if(n/100==n%10)printf(“%d is a huiwen number!n”,n);}

4、输出1到1000之间的所有完数

分析:在做本题之前,先要搞明白什么是完数,它又是如何判定的。补充:

再做完数之前先讲怎么求两个数的最大公约数和最小公倍数。

分析:假设求a和b两个数的最大公约数和最小公倍数,并且a>b,如果a0&&n<10)printf(“%d is a wanshu!n”,n);else if(n/100==0){if(n/10==n%10)printf(“%d is a wanshu!n”,n);} else if(n/100==n%10)printf(“%d is a wanshu!n”,n);本题分析:只要用上面的程序替换掉模版的那个if就可以了,则程序如下: int n;for(n=1;n<=1000;n++){ if(n>0&&n<10)printf(“%d is a wanshu!n”,n);else if(n/100==0){if(n/10==n%10)printf(“%d is a wanshu!n”,n);} else if(n/100==n%10)printf(“%d is a wanshu!n”,n);}

5、输出1到999之间的所有水仙花数

分析:在做本题之前,先要搞明白什么是水仙花数,它又是如何判定的。补充:

水仙花数 如果一个三位数的各个位数字的立方和等于该数字本身,那么这个数就是水仙花数。例如:153,1*1*1+5*5*5+3*3*3=153,所以这个数字就是回文数。分析:既然一个水仙花数的各个位数字的立方和等于该数字本身,那么当我们判断一个数n是不是水仙花数的时候,先要求出各个位数字,然后求其立方和,判断是不是和该数本身一样,如果一样就是水仙花数,否则就不是。求一个三位数的每一位,就是将这个数对10求余得到个位;然后这个数除以10,再对10求余得到十位;最后除以100得到百位。则程序如下:

int n,a,b,c;(n是要判断的数,具体根据题意赋值或从键盘输入)a=n/100;b=n/10%10;c=n%10;if(a*a*a+b*b*b+c*c*c==n)printf(“%d is the shuixianhua number!n”,n);本题分析:只要用上面的程序替换掉模版的那个if就可以了,则程序如下: int n;for(n=1;n<=1000;n++){ a=n/100;b=n/10%10;c=n%10;if(a*a*a+b*b*b+c*c*c==n)printf(“%d is the shuixianhua number!n”,n);}

6、用一张100的钱换100张零钞,假设面额有5元,3元,1/2元三种,问有多少种方法?

分析:这是一道解方程组的题,根据我们的小学知识可以列出方程组,其中有三个未知数,所以应该是三层嵌套循环,再分析题目我们知道1/2的张数只能是偶数张,则程序为: int i,j,k,n;for(i=0;i<=20;i++)for(j=0;j<=33;j++)for(k=0;k<=100;k++)if(5*i+3*j+k/2==100&&i+j+k==100&&k%2==0){ printf(“%d,%d,%dn”,i,j,k);n++;} printf(“There are %d changes!n”,n);

7、爱因斯坦阶梯问题。设有一阶梯,每步跨2阶,最后剩1阶;每步跨3阶,最后剩2阶;每步跨5阶,最后剩4阶;每步跨6阶,最后剩5阶;每步跨7阶,正好到阶梯顶。问满足条件的最少阶梯数是多少?

分析:这道题的实质是找满足上述条件的数,而且要最小的,那么我们就写一个循环,循环变量从最小的数开始递增,分析题目我们可知从7开始递增即可(如果不从7,从1开始也是可以的),一旦满足上述条件,循环变量就不需要增加了,输出循环变量即可,所以我们选择while循环结构,当不满足上述条件我们就做循环变量的递增,如果满足就输出,则程序为: int n=7;while(!(n%2==1&&n%3==2&&n%5==4&&n%6==5&&n%7==0)){ n++;} printf(“%dn”,n);

8、求一句英文所含有的单词数。

分析:一句英文里面每个单词之间都用空格隔开,所以我们只要数空格的个数即可,但是注意最后一个单词后面是没有空格的。一句英文肯定要存放在数组中,我们选择简单的一维数组。从字符数组中的第一个元素开始查看,先查看第一个元素,如果不是空格,那就证明是第一个单词,单词个数加一,然后一直做循环,直到遇到空格,就说明这个单词结束了,然后再判断是不是到数组的结尾,如果没有就继续查找,直到数组结束为止,则程序如下: #include #include void main(){char s[100];int i=0,j,num=0;gets(s);j=strlen(s);while(i

}

五.图案:输出n行的具有规律的字符,组成我们所想要的图案。模版: int i,j,k;for(i=0;i

具体对待)for(k;;)printf(“%d”,);(注意:如果是char类型就是%c)}

1、输出下列图案

* *** *****

printf(“ There are %d words.n”,num);******* ********* ******* ***** *** * 分析:这种图案一般我们会将其分为两部分,从最多一行隔开,分为上下两个部分,先输出上面的图案,再输出下面的。通过分析我们可以发现每行既要输出空格,又要输出*,所以循环体里面需要两个循环,循环体里面的循环变量的控制最好和外层的控制行数的循环变量相关联。我们用i控制行数,用j控制每行的空格数,用k控制每行的*数,通过观察我们发现如下规律: i j k 0 4 1 1 3 3 2 2 5 3 1 7 4 0 9 那么,i+j=4,k均为奇数,再分析发现k=2i+1,每行输完还要输出换行,则程序如下: int i,j,k;for(i=0;i<5;i++){ for(j=0;j<4-i;j++)printf(“ ”);for(k=0;k<2*i+1;k++)printf(“*”);printf(“n”);} for(i=0;i<4;i++){ for(j=0;j

2、输出下列图案

A BBB CCCCC DDDDDDD EEEEEEEEE FFFFFFF GGGGG HHH I 分析:这种图案一般我们会将其分为两部分,从最多一行隔开,分为上下两个部分,先输出上面的图案,再输出下面的。通过分析我们可以发现每行既要输出空格,又要输出字母,所以循环体里面需要两个循环,循环体里面的循环变量的控制最好和外层的控制行数的循环变量相关联。我们用i控制行数,用j控制每行的空格数,用k控制每行的字母数,通过观察我们发现如下规律: i j k 0 4 1 1 3 3 2 2 5 3 1 7 4 0 9 那么,i+j=4,k均为奇数,再分析发现k=2i+1。每行的字母相同但是和上下行的不相同,观察发现字母是按照顺序递增的,那么我们就先把字母存放在一个变量里面,然后在输出每行所需的字符之后,改变字母。每行输完还要输出换行,则程序如下: int i,j,k;char c=’A’;for(i=0;i<5;i++){ for(j=0;j<4-i;j++)printf(“ ”);for(k=0;k<2*i+1;k++)printf(“%c”,c);c++;printf(“n”);} for(i=0;i<4;i++){ for(j=0;j

3、输出下列图案 121 12321 1234321 123454321 1234321 12321 121 1 分析:这种图案一般我们会将其分为两部分,从最多一行隔开,分为上下两个部分,先输出上面的图案,再输出下面的。通过分析我们可以发现每行既要输出空格,又要输出数字,所以循环体里面需要两个循环,循环体里面的循环变量的控制最好和外层的控制行数的循环变量相关联。我们用i控制行数,用j控制每行的空格数,用k控制每行的数字数,每行的数字还不相同,观察发现数字是按照顺序递增递减的,那么我们输出数字的循环又要分为两个循环,继续观察我们发现每次输出的数字和循环变量k有关,通过观察我们发现如下规律: i j k 0 4 1 1 3 2 2 2 3 3 1 4 4 0 5 那么,i+j=4,k均为奇数,再分析发现k的递增从1开始到i+1为止,递减是从i开始到1为止。每行输完还要输出换行,则程序如下: int i,j,k;for(i=0;i<5;i++){ for(j=0;j<4-i;j++)printf(“ ”);for(k=1;k<=i+1;k++)printf(“%d”,k);for(k=i;k>0;k--)printf(“%d”,k);printf(“n”);} for(i=0;i<4;i++){ for(j=0;j0;k--)printf(“%d”,k);printf(“n”);}

4、输出九九乘法表

1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 1*4=4 2*4=8 3*4=12 4*4=16 „„ „„

分析:如果用i表示行,j表示列,那么每行输出i个式子,分析发现每个式子可以用j*i表示。每行输完还要输出换行,则程序如下: int i,j;for(i=1;i<10;i++){ for(j=1;j<=i;j++)printf(“%d*%d=%dt”,j,i,j*i);printf(“n”);}

5、输出杨辉三角的前10行 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 7 21 35 35 21 7 1 8 28 56 70 56 28 8 1 9 36 84 126 126 84 36 9 1 分析:如果用i表示行,j表示列,那么每行输出i个数字,分析发现除了两头的数字为1以外,其余的每个数字每个数字等于上一行的左右两个数字之和,所以用二维数组比较简单。每行输完还要输出换行,则程序如下: int a[10][10],i,j;for(i=0;i<10;i++){ for(j=0;j<=i;j++){ if(i==j||j==0)a[i][j]=1;else a[i][j]=a[i-1][j]+a[i-1][j-1];printf(“%dt”,a[i][j]);} printf(“n”);}

五.字符串操作:

1.函数的原型说明为int chrn(char *s,char c);,其功能是测试c在s中出现的次数,编制该函数并用相应的主调函数对其进行测试。#include int chrn(char *s,char c){ int n=0,i;for(i=0;s[i];i++)if(s[i]= =c)n++;return n;} void main(){ int k=0;char a[100],b;gets(a);getchar(b);k=chrn(a,b);printf(“%d”,k);} 2.编写函数void fun(char *s),实现将字符串s逆序存放,例如:“abcd”改为“dcba”,请完成程序,并在主函数中实现调用 #include #include void fun(char *s){ int k,i;char t;k=strlen(s);for(i=0;i #include void mystrcat(char *str1, char *str2){ int i,j;i=strlen(str1);for(j=0;j<=strlen(str2);j++,i++)str1[i]=str2[j];} main(){ int i,j;char a[50],b[50];gets(a);gets(b);mystrcat(a , b);puts(a);} 4.自编函数实现比较字符串大小函数mystrcmp(char *str1,char *str2),要求在主函数中进行验证当str1与str2相等时返回0,当str1大于str2时返回一个正整数,否则返回一个负整数。#include #include int mystrcmp(char *str1,char*str2){ int i=0;while(*(str1+i)= =*str(str2+i))if(*(str1+i++)= =’’)return 0;return *(str1+i)-*(str2+i);} void main(){ char a[100],b[100];int n;gets(a);gets(b);n=mystrcmp(a,b);pirntf(“%d”,n);}

第五篇:编程教案

常用编程指令的应用

车削加工编程一般包含X和Z坐标运动及绕Z轴旋转的转角坐标C。

(1)快速定位(G00或G0)刀具以点位控制方式从当前所在位置快速移动到指令给出的目标位置。

指令格式:G00 X(U)Z(W);(2)直线插补(G01或G1)

指令格式:G01 X(U)Z(W)F ;

图1 快速定位 图2 直线插补

G00 X40.0 Z56.0; G01 X40.0 Z20.1 F0.2;

/绝对坐标,直径编程; /绝对坐标,直径编程,切削进给率0.2mm/r G00 U-60.0 W-30 G01 U20.0 W-25.9 F0.2;

/增量坐标,直径编程 /增量坐标,直径编程,切削进给率0.2mm/r(3)圆弧插补(G02或G2,G03或G3)1)指令格式: G02 X(U)_Z(W)_I_K_F_ ; G02 X(U)Z(W)R F ;

G03 X(U)_Z(W)_I_K_F_ ; G03 X(U)Z(W)R F ;

2)指令功能: 3)指令说明: ①G02为顺时针圆弧插补指令,G03为逆时针圆弧插补指令。圆弧的顺、逆方向判断见图3左图,朝着与圆弧所在平面相垂直的坐标轴的负方向看,顺时针为G02,逆时针为G03,图3右图分别表示了车床前置刀架和后置刀架对圆弧顺与逆方向的判断;

图3 圆弧的顺逆方向

②如图4,采用绝对坐标编程,X、Z为圆弧终点坐标值;采用增量坐标编程,U、W为圆弧终点相对圆弧起点的坐标增量,R是圆弧半径,当圆弧所对圆心角为0°~180°时,R取正值;当圆心角为180°~360°时,R取负值。I、K为 圆心在X、Z轴方向上相对圆弧起点的坐标增量(用半径值表示),I、K为零时可以省略。

图4 圆弧绝对坐标,相对坐标

图5 圆弧插补

G02 X50.0 Z30.0 I25.0 F0.3; G03 X87.98 Z50.0 I-30.0 K-40.0 F0.3;

G02 U20.0 W-20.0 I25.0 F0.3; /绝对坐标,直径编程

G02 X50.Z30.0 R25.0 F0.3; G03 U37.98 W-30.0 I-30.0 K-40.0 F0.3; G02 U20.0 W-20.0 R25.0 F0.3; /相对坐标,直径编程

(4)主轴转速设置(S)车床主轴的转速(r/min)为:

式中υ为圆周切削速度,单位缺省为m/min、D为工件的外径,单位为mm。

例如,工件的外径为200mm,要求的切削速度为300m/min,经计算可得

因此主轴转速应为478r/min,表示为S478。(5)主轴速度控制指令

数控车削加工时,按需要可以设置恒切削速度(例如,为保证车削后工件的表面粗糙度一致,应设置恒切削速度),车削过程中数控系统根据车削时工件不同位置处的直径计算主轴的转速。

恒切削速度设置方法如下:G96 S ; 其中S后面数字的单位为r/min。

设置恒切削速度后,如果不需要时可以取消,其方式如下:G97 S ; 其中S后面数字的单位为r/min。

在设置恒切削速度后,由于主轴的转速在工件不同截面上是变化的,为防止主轴转速过高而发生危险,在设置恒切削速度前,可以将主轴最高转速设置在某一个最高值。切削过程中当执行恒切削速度时,主轴最高转速将被限制在这个最高值。设置方法如下:G50 S ; 其中S的单位为r/min。

图6 主轴速度控制

例如:在刀具T01切削外形时用G96设置恒切削速度为200m/min,而在钻头T02钻中心孔时用G97取消恒切削速度,并设置主轴转速为1100r/min。这两部分的程序头如下:

G50 S2500 T0101 M08; /G50限定最高主轴转速为2500r/min;

G96 S200 M03; / G96设置恒切削速度为200m/min,主轴顺时针转动 G00 X48.0 Z3.0; / 快速走到点(48.0,3.0)G01 Z-27.1 F0.3; /车削外形 G00 Ul.0 Z3.0; /快速退回 T0202; /调02号刀具

G97 Sll00 M03; /G97取消恒切削速度,设置主轴转速为ll00r/min G00 X0.0 Z5.0 M08; /快速走到点(0,5.0),冷却液打开 G01 Z-5.0 F0.12; /钻中心孔(6)进给率和进给速度设置指令

在数控车削中有两种切削进给模式设置方法,即进给率(每转进给模式)和进给速度(每分钟进给模式)。

1)进给率,单位为mm/r,其指令为: G99; / 进给率转换指令,G01 X Z F ; / F的单位为mm/r 2)进给速度,单位为mm/min,其指令为: G98; / 进给速度转换指令

G01 X Z F ; / F的单位为mm/min

图7 进给率和进给速度

a:G99 G01 Z-27.1 F0.3;b:G98 G01 Z-10.0 F80;表示进给率为0.3mm/r 表示进给速度为80mm/min CNC系统缺省进给模式是进给率,即每转进给模式。(7)工件原点设置

工件坐标系的原点有两种设置方法。

1)用G50指令进行工件原点设置,分以下两种设置情况:

图8 工件原点设置 ①坐标原点设置在卡盘端面

如图8a所示,这种情况下z坐标是正值。工件原点设置在卡盘端面:

G50 X85.Z210.;/* 将刀尖当前位置的坐标值定为工件坐标系中的一点(85.,210.)。②坐标原点设置在零件右端面

如图8b所示,这种情况下Z坐标值是负值。工件原点设置在工件右端面:G50 X85.0 Z90.0; 则刀尖当前位置即为工件坐标系原点。(8)端面及外圆车削加工

端面及外圆的车削加工要用到插补指令G01。

为正确地编写数控程序,应在编写程序前根据工件的情况选择工件原点。确定好工件原点后,还必须确定刀具的起始点。

编程时还应考虑车削外圆的始点和端面车削的始点,这两点的确定应结合考虑工件的毛坯情况。如果毛坯余量较大,应进行多次粗车,最后进行一次精车,因而每次的车削始点都不相同。

图9 确定车削原点

a)工件原点在左端面时 b)工件原点在右端面时 1)工件原点在左端面 o0001 /* 程序编号o0001 N0 G50 X85.0 Z210.0; /* 设置工件原点在左端面 N1 G30 U0 W0; /* 返回第二参考点

N2 G50 S1500 T0101 M08; /* 限制最高主轴转速为1500r/min,调01号刀具,M08为打开冷却液

N3 G96 S200 M03; /* 指定恒切削速度为200m/min N4 G00 X40.4 Z153.0; /* 快速走到外圆粗车始点 N5 G01 Z40.2 F0.3; /* 以进给率0.3mm/r车削外圆 N6 X60.4; /* 台阶车削

N7 Z20.0; /*φ60.4mm处长度为20.0mm的一段外圆 N8 G00 X62.0 Z150.2; /* 刀具快速退到点(62.0,150.2)N9 X41.0; /*刀具快速走到点(41.0,150.2)N10 G01 X-1.6; /* 车削右端面

N1l G00 Zl52.0; /* 刀具快速退到点(-1.6,152.0)N12 G30 U0 W0; /* 直接回第二参考点以进行换刀 N13(Finishing); /*精车开始,括号为程序说明

N14 G50 S1500 T0202; /*限制最高主轴转速为1500r/min,调02号刀具 N15 G96 S250; /* 指定恒切削速度为250m/min N16 G00 X40.0 Z153.0 ;/*快速走到外圆精车始点(40.0,153)N17 G42 G01 Z151.0 F0.15;/*调刀尖半径补偿,右偏 N18 Z40.0; /*φ40.4mm一段外圆的精车 N19 X60.0; /*台阶精车

N20 Z20.0; /*φ60.0mm处长度为20.0mm外圆的精车 N21 G40 G00 X62.0 Z150.0; /*取消刀补 N22 X41.0; /*刀具快速走到点(41.0,150.0)N23 G41 G01 X40.0; /*调刀尖半径补偿,左偏 N24 G01 X-1.6; /*精车右端面

N25 G40 G00 Zl52.0 M09; /*取消刀补,切削液关

N26 G30 U0 W0 M05; /*返回第二参考点,主轴停止 N27 M30; /*程序结束 2)工件原点在右端面:工件原点设置在右端面与设置在左端面的区别仅在于Z坐标为负值,程序编写过程完全相同。O0002 ; /* 程序编号

N0 G50 X85.0 Z90.0 /* 设置工件原点在右端面 N2 G30 U0 W0; /* 返回第二参考点

N4 G50 S1500 T0101 M08; /* 限制最高主轴转速 N6 G96 S200 M03; /* 指定恒切削速度为 200m/min,主轴逆时针旋转

N8 G00 X30.4 Z3.0; /*快速走到点(30.4,3.0)N10 G01 W-33.0 F0.3; /*以进给率0.3mm/r粗车φ30.4处外圆 N12 U30.0 W-50.0; /*粗车锥面

N14 W-10.0; /*粗车φ60.4mm处长度为10的一段外圆 N16 G00 Ul.6 W90.2;/*刀具快速走到点(62.0,0.2)N18 U-31.0; /*刀具快速走到点(3l,0.2)N20 G01 U-32.6; /*粗车端面

N22 G00 W2.0; /*刀具快速走到点(-1.6,2)N24 G30 U0 W0; /*返回第二参考点 N26(Finishing); /*精车开始

N28 G50 S1500 T0202;/*设置主轴最高转速1500r/min,调2号刀具 N30 G96 S250; /* 指定恒切削速度为250m/min N32 G00 X30.0 Z3.0;/*刀具快速走到精车始点(30.0,3.0)N34 G42 G01 W-2.0 F0.15;/*调刀尖半径补偿,右偏 N36 W-31.0; /*精车ф30.4mm处外圆 N38 U30.0 W-50.0; /*精车锥面

N40 W-10.0; /*精车ф60.0mm处外圆

N42 G40 G00 U2.0 W90.0; /*取消刀补,刀具快速走到点(62,0.0)N44 U-31.0; /*刀具快速走到点(31,0.0)N46 G41 G01 U-1.0; /*调刀尖半径补偿,左偏

N48 G01 U-32.6; /*精车端面

N50 G40 G00 W2.0 M09; /*取消刀补,刀具快速走到点(1.6,2.0)N52 G30 U0 W0 M30; /*返回参考点,程序结束 实例:

如图10所示零件

图10 数控车削综合编程实例

N0050 G01 X32 Z0;N0110 G02 X16 Z-15 R2;N0060 G01 X-0.5;N0120 G01 X20;

N0070 G00 Z1;N0130 G01 Z35;N0080 G00 X10;N0140 X26;N0090 G01 X12 Z1;N0150 Z50;N0100 G01 X12 Z1;N0160 X32;为1500r/min,调1号刀具,M08为打开冷却液在这种情况下,如果设置指令写成: G50 X0 Z0;

G02、G03指令表示刀具以F进给速度从圆弧起点向圆弧终点进行圆弧插补。刀具以一定的进给速度从当前所在位置沿直线移动到指令给出的目标位置。

2.循环加工指令

当车削加工余量较大,需要多次进刀切削加工时,可采用循环指令编写加工程序,这样可减少程序段的数量,缩短编程时间和提高数控机床工作效率。根据刀具切削加工的循环路线不同,循环指令可分为单一固定循环指令和多重复合循环指令。(1)单一固定循环指令

对于加工几何形状简单、刀具走刀路线单一的工件,可采用固定循环指令编程,即只需用一条指令、一个程序段完成刀具的多步动作。固定循环指令中刀具的运动分四步:进刀、切削、退刀与返回。

1)外圆切削循环指令(G90)

指令格式 : G90 X(U)_ Z(W)_ R_ F_ 指令功能: 实现外圆切削循环和锥面切削循环。

刀具从循环起点按图11与图12所示走刀路线,最后返回到循环起点,图中虚线表示按R快速移动,实线表示按F指定的工件进给速度移动。

图11 外圆切削循环

图12 锥面切削循环

指令说明: ① X、Z 表示切削终点坐标值;

② U、W 表示切削终点相对循环起点的坐标分量;

③ R 表示切削始点与切削终点在X轴方向的坐标增量(半径值),外圆切削循环时R为零,可省略;

④F表示进给速度。例题 如图13所示,运用外圆切削循环指令编程。

G90 X40 Z20 F30

A-B-C-D-A X30

A-E-F-D-A X20

A-G-H-D-A

图13 外圆切削循环例题

例题 如图14所示,运用锥面切削循环指令编程。

G90 X40 Z20 R-5 F30 A-B-C-D-A X30

A-E-F-D-A X20

A-G-H-D-A

图14 锥面切削循环例题

2)端面切削循环指令(G94)

指令格式: G94 X(U)_ Z(W)_ R_ F_ 指令功能: 实现端面切削循环和带锥度的端面切削循环。

刀具从循环起点,按图15与图16所示走刀路线,最后返回到循环起点,图中虚线表示按R快速移动,实线按F指定的进给速度移动。

图15 端面切削循环 图16 带锥度的端面切削循环

① X、Z表示端平面切削终点坐标值;

② U、W表示端面切削终点相对循环起点的坐标分量;

③ R 表示端面切削始点至切削终点位移在Z轴方向的坐标增量,端面切削循环时R为零,可省略;

④ F表示进给速度。

例题: 如图17所示,运用端面切削循环指令编程。

G94 X20 Z16 F30

A-B-C-D-A Z13

A-E-F-D-A Z10

A-G-H-D-A

图17 端面切削循环例题 图18 带锥度的端面切削循环例题

例题: 如图18所示,运用带锥度端面切削循环指令编程。

G94 X20 Z34 R-4 F30

A-B-C-D-A Z32

A-E-F-D-A Z29

A-G-H-D-A(2)多重复合循环指令(G70——G76)运用这组G代码,可以加工形状较复杂的零件,编程时只须指定精加工路线、径向轴向精车留量和粗加工背吃刀量,系统会自动计算出粗加工路线和加工次数,因此编程效率更高。

在这组指令中,G71、G72、G73是粗车加工指令,G70是G71、G72、G73粗加工后的精加工指令,G74 是深孔钻削固定循环指令,G75 是切槽固定循环指令,G76是螺纹加工固定循环指令。

1)外圆粗加工复合循环(G71)指令格式 : G71 UΔd Re G71 Pns Qnf UΔu WΔw Ff Ss Tt

指令功能: 切除棒料毛坯大部分加工余量,切削是沿平行Z轴方向进行,如图19所示。A为循环起点,A-A'-B为精加工路线。

图19 外圆粗加工复合循环 图20 端面粗加工复合循环 指令说明:①Δd表示每次切削深度(半径值),无正负号; ② e表示退刀量(半径值),无正负号;

③ ns表示精加工路线第一个程序段的顺序号; ④ nf表示精加工路线最后一个程序段的顺序号;

⑤ Δu表示X方向的精加工余量,直径值;

例题 :如图21所示,运用外圆粗加工循环指令编程。

图21 外圆粗加工复合循环例题 N010 G50 X150 Z100 N020 G00 X41 Z0 N030 G71 U2 R1 N040 G71 P50 Q120 U0.5 W0.2 F100 N050 G01 X0 Z0 N060 G03 X11 W-5.5 R5.5 N070 G01 W-10 N080 X17 W-10 N090 W-15 N100 G02 X29 W-7.348 R7.5 N110 G01 W-12.652 N120 X41 N130 G70 P50 Q120 F30

2)端面粗加工复合循环(G72)指令格式: G72 WΔd Re

G72 Pns Qnf UΔu WΔw Ff Ss Tt

指令功能: 除切削是沿平行X轴方向进行外,该指令功能与G71相同,如图20所示。指令说明 :

Δd、e、ns、nf、Δu、Δw的含义与G71相同。例题:如图22,运用端面粗加工循环指令编程。

图22 端面粗加工复合循环例题 图23 固定形状切削复合循环 N010 G50 X150 Z100 N020 G00 X41 Z1 N030 G72 W1 R1 N040 G72 P50 Q80 U0.1 W0.2 F100 N050 G00 X41 Z-31 N060 G01 X20 Z-20 N070 Z-2 N080 X14 Z1 N090 G70 P50 Q80 F30 3)固定形状切削复合循环(G73)指令格式: G73 UΔi WΔk Rd G73 Pns Qnf UΔu WΔw Ff Ss Tt

指令功能:适合加工铸造、锻造成形的一类工件,见图23所示。指令说明: Δi 表示X轴向总退刀量(半径值); ΔK 表示Z轴向总退刀量; d 表示循环次数;

ns 表示精加工路线第一个程序段的顺序号; nf 表示精加工路线最后一个程序段的顺序号; Δu 表示X方向的精加工余量(直径值); Δw 表示Z方向的精加工余量。

①固定形状切削复合循环指令的特点:

a.刀具轨迹平行于工件的轮廓,故适合加工铸造和锻造成形的坯料;b.背吃刀量分别通过X轴方向总退刀量Δi和Z轴方向总退刀量ΔK除以循环次数d求得;c.总退刀量Δi与ΔK值的设定与工件的切削深度有关。

②使用固定形状切削复合循环指令,首先要确定换刀点、循环点A、切削始点A’和切削终点B的坐标位置。分析上图,A点为循环点,A’→B是工件的轮廓线,A→A’→B为刀具的精加工路线,粗加工时刀具从A点后退至C点,后退距离分别为Δi+Δu /2,Δk+Δw,这样粗加工循环之后自动留出精加工余量Δu /

2、Δw。

③顺序号ns至nf之间的程序段描述刀具切削加工的路线。例题: 如图14所示,运用固定形状切削复合循环指令编程。

图24 固定形状切削复合循环例题 图25 复合固定循环举例

N010 G50 X100 Z100 N020 G00 X50 Z10 N030 G73 U18 W5 R10 N040 G73 P50 Q100 U0.5 W0.5 F100 N050 G01 X0 Z1 N060 G03 X12 W-6 R6 N070 G01 W-10 N080 X20 W-15 N090 W-13 N100 G02 X34 W-7 R7 N110 G70 P50 Q100 F30 4)精车复合循环(G70)指令格式: G70 Pns Qnf

指令功能:用G71、G72、G73指令粗加工完毕后,可用精加工循环指令,使刀具进行A-A`-B的精加工,(如图24)

指令说明:

ns表示指定精加工路线第一个程序段的顺序号; nf表示指定精加工路线最后一个程序段的顺序号;

G70~G73循环指令调用N(ns)至N(nf)之间程序段,其中程序段中不能调用子程序。5)复合固定循环举例(G71与G70编程)

加工图25所示零件,其毛坯为棒料。工艺设计参数为:粗加工时切深为7mm,进给速度0.3mm/r,主轴转速500r/min;X向(直径上)精加工余量为4 mm,z向精加工余量为2mm,进给速度为0.15mm/r,主轴转速800mm/min。程序设计如下: N01 G50 X200.0 Z220.0;N02 G00 X160.0 Z180.0 M03 S800;N03 G71 P04 Q10 U4.0 W2.0 D7.0 F0.3 S500;N04 G00 X40.0 S800;N05 G01 W-40.0 F0.15;N06 X60.0 W-30.0;N07 W-20.0;N08 X100.0 W-10.0;N09 W-20.0;N10 X140.0 W-20.0;N11 G70 P04 Q10;N12 G00 X200.0 Z220.0;N13 M05;N14 M30;3.螺纹加工自动循环指令

(1)单行程螺纹切削指令G32(G33,G34)指令格式 : G32 X(U)_ Z(W)_ F_

指令功能:切削加工圆柱螺纹、圆锥螺纹和平面螺纹。指令说明:

格式中的X(U)、Z(W)为螺纹中点坐标,F为以螺纹长度L给出的每转进给率。L表示螺纹导程,对于圆锥螺纹(图26),其斜角α在45°以下时,螺纹导程以Z轴方向指定;斜角α在45°~90°时,以X轴方向指定。

①圆柱螺纹切削加工时,X、U值可以省略,格式为: G32 Z(W)_ F _ ; ②端面螺纹切削加工时,Z、W值可以省略,格式为: G32 X(U)_ F_;

③螺纹切削应注意在两端设置足够的升速进刀段δ1和降速退刀段δ2,即在程序设计时,应将车刀的切入、切出、返回均应编入程序中。

图26 螺纹切削 图27 螺纹切削应用 螺纹切削例题: 如图27所示,走刀路线为A-B-C-D-A,切削圆锥螺纹,螺纹导程为4mm , δ1 = 3mm,δ2 = 2mm,每次背吃刀量为1mm,切削深度为2mm。G00 X16 G32 X44 W-45 F4 G00 X50 W45 X14 G32 X42 W-45 F4 G00 X50 W45(2)螺纹切削循环指令(G92)

指令格式 : G92 X(U)_ Z(W)_ R_ F_ 指令功能: 切削圆柱螺纹和锥螺纹,刀具从循环起点,按图28与图29所示走刀路线,最后返回到循环起点,图中虚线表示按R快速移动,实线按F指定的进给速度移动。

图28 切削圆柱螺纹 图29 切削锥螺纹 指令说明:

①X、Z表示螺纹终点坐标值;②U、W表示螺纹终点相对循环起点的坐标分量;

③R表示锥螺纹始点与终点在X轴方向的坐标增量(半径值),圆柱螺纹切削循环时R为零,可省略;

④F表示螺纹导程。

例题: 如图30所示,运用圆柱螺纹切削循环指令编程。

图30 切削圆柱螺纹例题 图31 切削锥螺纹例题 G50 X100 Z50 G97 S300 T0101 M03 G00 X35 Z3 G92 X29.2 Z-21 F1.5 X28.6 X28.2 X28.04 G00 X100 Z50 T0000 M05 M02

例题 : 如图31所示,运用锥螺纹切削循环指令编程。G50 X100 Z50 G97 S300 T0101 M03 G00 X80 Z2 G92 X49.6 Z-48 R-5 F2 X48.7 X48.1 X47.5 X47.1 X47 G00 X100 Z50 T0000 M05 M02

(3)螺纹切削复合循环(G76)

指令格式 : G76 Pm r a QΔdmin Rd G76 X(U)_ Z(W)_Ri Pk QΔd Ff

指令功能:该螺纹切削循环的工艺性比较合理,编程效率较高,螺纹切削循环路线及进刀方法如图32所示。

图32 螺纹切削复合循环路线及进刀法 指令说明:

②r表示斜向退刀量单位数,或螺纹尾端倒角值,在0.0f—9.9f之间,以0.1f为一单位,(即为0.1的整数倍),用00—99两位数字指定,(其中f为螺纹导程); ③a表示刀尖角度;从80°、60°、55°、30°、29°、0°六个角度选择;

④Δdmin:表示最小切削深度,当计算深度小于Δdmin,则取Δdmin作为切削深度; ⑤d:表示精加工余量,用半径编程指定;Δd :表示第一次粗切深(半径值); ⑥X、Z:表示螺纹终点的坐标值; ⑦U:表示增量坐标值; ⑧W:表示增量坐标值;

⑨I:表示锥螺纹的半径差,若I=0,则为直螺纹; ⑩k:表示螺纹高度(X方向半径值); G76螺纹车削实例

图33所示为零件轴上 的一段直螺纹,螺纹高度为3.68,螺距为6,螺纹尾端倒角为1.1L,刀尖角为60°,第一次车削深度1.8,最小车削深度0.1,精车余量0.2,精车削次数1次,螺纹车削前先精车削外圆柱面,其数控程序如下:

图33 螺纹切削多次循环G76指令编程实例 O0028 /程序编号

N0 G50 X80.0 Z130.0;/设置工件原点在左端面 N2 G30 U0 W0;/返回第二参考点

N4 G96 S200 T0101 M08 M03;/指定切削速度为200m/min,调外圆车刀 N6 G00 X68.0 Z132.0;/快速走到外圆车削起点(68.0,132.0)N7 G42 G01 Z130.0 F0.2;N8 Z29.0 F0.2;/外圆车削 N9 G40 G00 U10.0;N10 G30 U0 W0;N12 G97 S800 T0202 M08 M03;/取消恒切削速度,指定主轴转速800r/min,调螺纹车刀 N14 G00 X80.0 Z130.0;/快速走到螺纹车削循环始点(80.0,130.0)N16 G76 P011160 Q0.1 R0.2;/循环车削螺纹 N18 G76 X60.64 Z25.0 P3.68 Q1.8 F6.0;N20 G30 U0 W0 M09;N22 M30;①m表示精车重复次数,从1—99;

下载十年学会编程[最终定稿]word格式文档
下载十年学会编程[最终定稿].doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    编程员

    1、大学生活丰富多彩,会令你一生都难忘,但难忘有很多种,你可以学了很多东西而难忘,也会因为什么都没学到而难忘! 2、计算机专业是一个很枯燥的专业,但即来之、则安之,只要你努力学,......

    编程心得

    1. 对于液晶点阵,做任何图形的子函数,一定要注意,必须为整数,即像素必须为整数, 否则将出现错误,比如划三角形,必须让三角形的斜率为直线,不然不能得到预期的结果。 2. 对于变量的定义......

    编程经验

    1. 当性能遇到问题时,如果能在应用层进行计算和处理,那就把它从数据库层拿出来。排 序和分组就是典型的例子。在应用层做性能提升总是要比在数据库层容易的多。就像对于MySQL,s......

    软件编程学习心得

    软件编程学习心得 随着计算机技术的发展和工作的需要,为了能够更好的维护公司生产管理系统;公司安排我们到北大青鸟APTECH进修。我们选择了时下最流行、发展速度较快的语言C#......

    JAVA编程心得体会

    JAVA编程心得计算机3班 窦金霞 20104773 最近几周一直在弄程序,说实话真的很累,但累中也有成功的快乐。我觉得学到了很多东西,这是只看课本知识所不能学到的。说实话,以前我一直......

    Windows编程教案

    Windows编程教案 第一课 最简单的Windows程序(2学时) Windows编程是一个很大的主题,涉及的方面也非常的多。Windows始于90年代,至今Windows编程的发展已经非常成熟了,而单独直接......

    Scratch(编程教案)

    辅 导 计 划 第( )周 辅导内容:Scratch移动的小猫 辅导过程: 1、 介绍scrather软件,让学生scrather软件主要功能和作用 2、 学生自己探索scrather软件。 3、 学生汇报scrather软......

    编程大赛感想

    (本人技术一般,所写只为给新人介绍一下西工大acm如何入门,大牛请无视本贴) ACM竞赛作为大学阶段计算机学生的最高荣誉在咱学校竟然不受重视,也没人提起,让那些高中转战NOIP,IOI的同......