第3章我编写过的最漂亮的代码

合集下载

Web程序设计第3章课后题

Web程序设计第3章课后题

Web程序设计第3章课后题注:课后题共7题(除第一题和第九题),其中5和8由于还有些问题没有解决,就没有将答案附上。

这里的答案仅供参考,希望在上机之前能自己练习一下。

程序有很多地方可以改,不要照搬。

(2)设计一个网页,其中包含TextBox和Button控件各一个。

当在TextBox中输入一个成绩,再单击Button控件时在网页上输出相应的等级信息。

【.aspx】<%@Page Language="C#"AutoEventWireup="true"CodeBehind="question2.aspx.cs"Inherits="homework_chap3.question2" %><!DOCTYPE html PUBLIC"-//W3C//DTD XHTML 1.0 Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><head runat="server"><title></title></head><body><form id="form1"runat="server"><div><asp:TextBox ID="TextBox1"runat="server">请输入一个成绩</asp:TextBox><asp:Label ID="Label1"runat="server"Text="Label">待显示</asp:Label><br/><asp:Button ID="Button1"runat="server"OnClick="btmSubmit_Click"Text="检测"/></div></form></body></html>【.aspx.cs】using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;namespace homework_chap3{public partial class question2 : System.Web.UI.Page{protected void btmSubmit_Click(object sender, EventArgs e){int iInput = int.Parse(TextBox1.Text);if (iInput > 100)Label1.Text = "请输入正确的分数";else if(iInput >= 90)Label1.Text = "优秀";else if (iInput >= 80)Label1.Text = "良好";else if (iInput >= 60)Label1.Text = "及格";else if (iInput >= 0)Label1.Text = "不及格";elseLabel1.Text = "请输入正确的分数";}}}【效果】(3)在网页上输出九九乘法表【.aspx.cs】(.aspx源文件可以不作处理)using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;namespace homework_chap3{public partial class question3 : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){for (int i=1; i<= 9; i++){for (int j = 1; j <= i; j++){Response.Write(i + "*" + j + "=" + (i * j) + "&nbsp;&nbsp;&nbsp;&nbsp;");}Response.Write("</br>");}}}}【效果】(4)在网页上输出如下形状:ABBBCCCCCDDDE【.aspx.cs】(.aspx源文件可以不作处理)using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;namespace homework_chap3.questions{public partial class question4 : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){String[] s = { "A", "B", "C", "D", "E" };for (int i = 1; i <= 3; i++){for (int j = 1; j <= 3 - i; j++){Response.Write("&nbsp;&nbsp;");}for(int k = 1; k <= 2*i-1; k++){Response.Write(s[i-1]);}Response.Write("</br>");}for (int i = 1; i < 3; i++){for (int j = 1; j <= i; j++){Response.Write("&nbsp;&nbsp;");}for (int k = 1; k <= 5 - 2*i; k++){Response.Write(s[i + 2]);}Response.Write("</br>");}}}}【效果】(6)设计一个网页,其中包含两个TextBox和一个Button控件。

上古卷轴5完全控制台代码

上古卷轴5完全控制台代码

贴是从3DM上复制来的给大家分享的!(略有修改完善)十字镐Pickaxe,代码是player.additem 00e3c16。

感谢xiaoma3000童鞋比如player.additem 0000000f 99999(增加金币99999)已测试:常用命令TGM - 无敌Tcl- 穿墙tcai - 开关NPC攻击反应tfc - 拍照用!自由视角!resurrect - 复活你鼠标所选择的人或怪lock * - 再控制台下将鼠标所选择的门或者箱子用等级为*的锁锁住。

#必须介于1到100之间,unlock - 再控制台下用鼠标选择门或箱子,输入指令即开。

kill –再控制台下用鼠标选择人或其它生物,输入指令秒杀。

set timescale to # - 时间流失速度!数字越大!时间流失越快!默认是7caqs - 完成所有任务(不要轻易尝试!一旦使用!恭喜你通关了~)ShowSubtitle - 开关NPC对话字幕SexChange - 改变性别advlevel - 立刻升级psb - 获得所有魔法!包括一些没有测试完成的BUG魔法!其它命令TM - 开关所有菜单~包括控制台TDETECT -开关人工智能探测TLL - 开关远景TS - 开关天空TLV - 开关树叶TWF -开关框架模式TAI - 开关人工智能(所有npc无法正常对话!)TG - 开关草丛TT - 开关树木tws - 开关水(有问题)player.AddItem FormID # - 得到代号FormID的物品#个000000f为金币player.AddSpell FormID - 得到代号FormID的法术PlaceAtMe formid, FormID, x, y - 在地图上生成代号为formid的物品或者生物#个player.removeitem FormID # - 从你身上移除代号为FormID的物品#个player.removespell FormID - 移除代号为FormID的法术modpcs 技能名称# - 技能名称对应的技能,比如sneak,增加#个技能点modpca 属性名称# - 属性名称对应的属性,比如luck,增加#点player.setlevel # - 改变角色的等级到#你想要的等级player.setA V - 技能或属性名称# - 将名称为技能或属性名称的技能或者属性的值设为#advskill 技能名称# - 技能名称对应的技能上升#个级别,比如advskill blade 5 ShowRaceMenu - 调出改变种族窗口TFOW - 开关战争迷雾FOV # - 改变视野为#度,缺省设定为75度setcamerafov # - 设置相机视野为#度。

大二java课程设计题目和代码

大二java课程设计题目和代码

大二java课程设计题目和代码简单投票管理系统、小学生数学练习题目自动生成系统、华容道-一个传统的智利游戏、用图形界面实现P208页,过桥问题、编写一个记事本程序、电子英汉词典、加密与解密、标准化考试系统、排球比赛计分系统、Hannoi塔、学籍管理系统、制作一个图形编辑系统、图书信息管理系统、ATM柜员机模拟系统、学生成绩管理信息系统、聊天**、记忆测试系统、超市收银系统、算法演示程序、网络聊天程序。

1、华容道-一个传统的智利游戏编写一个按钮的子类,使用该子类创建的对象代表华容道中的人物。

通过焦点事件控制人物颜色,当人物获得焦点时颜色为蓝色,当失去焦点时颜色为灰色。

通过键盘事件和鼠标事件来实现曹操、关羽等人物的移动。

当人物上发生鼠标事件或键盘事件时,如果鼠标指针的位置是在人物的下方(也就是组件的下半部分)或按下键盘的“↓“键,该人物向下移动。

向左、向右和向上的移动原理类似。

学习要点本程序主要练习使用布局管理器设计一个华容道游戏界面,并练习使用事件监听器(鼠标事件、键盘事件和焦点事件)实现按钮的移动。

设计思路首先是界面设计,该界面主要包括十个人物按钮(马、曹操、关羽等)以及旁边的四个边框按钮和重新开始按钮。

对于人物按钮,我们可以创建Button按钮的子类,在该类中定义按钮的一些新的属性和焦点事件监听器,如:按钮的标签名、按钮的颜色、按钮的排号(如这里有十个人物按钮,从1排到十,在程序中可以依靠这个属性区分人物按钮)、按钮颜色、按钮获得或失去焦点事件。

同时在设计该界面时要考虑到各个按钮的位置、大小等情况。

在这给出了各按钮的位置和大小参数:(其中Person为继承Button按钮的人物按钮类)String name[]={"曹操","关羽","张","刘","马","许","兵","兵","兵","兵"}; for(int i=0;i<name.length;i++) {undefined person[i]=new Person(i,name[i]); person[i].addKeyListener(this);person[i].addMouseListener(this); // person[i].addFocusListener(new Person) add(person[i]); } person.setBounds(104,54,100,100);person.setBounds(104,154,100,50); person.setBounds(54,154,50,100);person.setBounds(204,154,50,100); person.setBounds(54,54,50,100);person.setBounds(204,54,50,100); person.setBounds(54,254,50,50);person.setBounds(204,254,50,50); person.setBounds(104,204,50,50);person.setBounds(154,204,50,50); 四个边框按钮的位置和大小参数为:left.setBounds(49,49,5,260); right.setBounds(254,49,5,260);above.setBounds(49,49,210,5); below.setBounds(49,304,210,5); 其次我们是对界面上的各人物按钮添加相应的相应事件(鼠标事件、键盘事件),通过这两种事件去完成界面上各人物按钮的移动。

CSS禅意花园

CSS禅意花园

CSS禅意花园(修订版)[美]Dave Shea Molly E. Holzschlag 著陈黎夫 山崺颋 译人民邮电出版社北京内容提要本书作者是世界著名的网站设计师,书中的范例来自网站设计领域最著名的网站——CSS Zen Garden(CSS禅意花园)。

全书分为两个主要部分。

第1章为第一部分,讨论网站“CSS禅意花园”及其最基本的主题,包含正确的标记结构和灵活性规划等。

第二部分包括6章,占据了本书的大部分篇幅。

每章剖析“CSS禅意花园”收录的6件设计作品,每章介绍的作品围绕一个主要的设计概念展开,如文字的使用等。

通过探索36件设计作品面临的挑战和解决的问题,读者将洞悉主要的Web设计原则以及它们运用的CSS布局技巧,理解CSS设计的精髓,恰当地处理图形和字体来创建界面优美、性能优良且具有强大生命力的网站。

本书原版书自出版以来持续畅销,受到众多网站设计师的推崇。

本书适合网站设计人员和网站设计爱好者阅读,更是专业网站设计师必读的经典著作。

作者简介Dave Shea是一位图像设计师,“CSS禅意花园”网站的创始人和耕耘者,该网站获得了很多奖项,包括SouthWest Interactive会议授予的“Best of Show”。

Dave Shea曾在全球的行业大会上发表演讲,其作品被世界各地的书籍和杂志广泛收录。

他还是Web标准项目(Web StandardsProject,WaSP)的成员,该项目是一个由We b开发人员和设计师组成的小组,致力于推广基于跨平台和标准技术的Web设计。

Dave还是Web设计机构Bright Creative的拥有者兼总监,其在线出版物中所有的Web内容几乎均为Dave所作。

Molly E.Holzschlag是一位作家、教师和Web设计师,编写了30多本有关We b设计和开发的图书。

她享有“最伟大的数字作家之一”的美誉,同时被认为是网上最有影响力的25位女性之一。

Visual_Basic6.0_基础知识(完整版教材)

Visual_Basic6.0_基础知识(完整版教材)

第1章Visual Basic 6.0 基础知识完整版教材§1 Visual Basic的基础知识一、概念和术语1,对象(Object)事物都可称作对象,比如桌椅就是对象,在Visual Basic里对象主要分为两类:Form和Control。

Form:窗体或称表单,其实指的就是window。

Control:控件,指的是各种按钮、标签等等。

2,属性(Property)指的是对象的属性,比如姓名、性别、民族、籍贯都是你这个对象的属性。

Caption、Left、Name是一个命令按钮的属性。

3,事件(Event)事件是发生在对象上的动作。

比如敲桌子是一个事件,它是发生在桌子这个对象上的一个动作。

比如Click、Dblclick或LostFocus是发生在文本框控件上的事件。

然而事件的发生不是随意的,某些事件仅发生在某些对象上而已,比如“逃避早操被抓住”可以发生在学生这个对象上,但它不会发生在老师这个对象上。

4,方法(Method)这是一个直译,是一个较难理解的概念,它是对象本身内含的函数或过程,它也是一个动作,但不称作事件,在Visual Basic 里,方法和事件是这样的:事件:Private Sub对象名_事件名(事件内容)End Sub方法:对象名.方法名所以方法是一个简单的不必知道细节的无法改变的事件,同样,方法也不是随意的,一些对象有一些特定的方法。

如果以上概念你记不住,不要紧,实践中你会明白一切,请继续学习。

二、Visual Basic 的开发周期1,想清楚你想做到什么;2,拿起笔在纸上画出你的用户界面;3,拿起鼠标在屏幕上画出你的用户界面,确定对象的属性;4,告诉计算机你要做的事;5,让程序运行,看看能否工作;6,如果不能工作,不必难过;7,找出那个错误,重新开始。

你应该养成一些良好的习惯,这样在你编大程序时不至于丢三落四,为一些本来可避免的错误反复做第六步和第七步。

三、Visual Basic的存储和运行1,编写的程序和对象的属性一块儿存在frm文件里;2,整个程序里包含着一个或许多frm文件,Visual Basic将所有frm文件名存入一个vbp文件里,若丢失了一个vbp文件,尽管frm文件仍在磁盘上,但程序将不能运行了;3,如果你的程序已经自以为成功了,你可以把它编译成EXE文件,这样做的好处是:(1)在没有Visual Basic 的环境下可以运行;(2)速度提高;(3)别人不知道你的编程方法,还以为你是个编程专家,对你的编程效率大加赞叹。

有趣的c语言代码

有趣的c语言代码

有趣的c语言代码在计算机编程领域中,C语言无疑是居于重要地位的一种语言。

它简洁明了,具有高度的灵活性,其语法规范和基本结构也有着非常强的适用性,依旧是很多应用领域的首选语言。

但是,除了作为一门实用的编程语言外,C语言也具备着不少有趣的面向场景和实现思路。

有时候我们不妨放开心态,花一点时间去探索一些优美、神奇或者古怪的代码,或许不仅可以带来好玩的游戏体验,还可以深刻领略计算机编程这一领域的魅力所在。

以下是几个有趣的C语言代码:1. Hello World!这是许多人接触编程时会碰到的第一行代码,既简单又经典。

用C 语言实现只需一行:include <stdio.h>int main(){printf("Hello, World!");return 0;}这段代码的功能很简单,输出 "Hello, World!"。

2. 回文字检测给定一个字符串,判断其是否为回文字符串。

这也是许多入门程序员接触的练手题。

bool isPalindrome(char *s){int len = strlen(s);for (int i = 0; i < len / 2; ++i)if (s[i] != s[len - 1 - i])return false;return true;}这段代码通过比较字符串中左右两端字符是否相同,完成回文检测。

3. 汉诺塔游戏汉诺塔是一个经典的数学谜题,至今仍是计算机课程和聚会游戏的热门选择之一。

在C语言中实现汉诺塔游戏的代码不仅具备实用价值,同时也挑战了程序设计师的算法思考能力。

void hanoi(int n, char A, char B, char C){if (n == 1)printf("%c -> %c\n", A, C);else{hanoi(n - 1, A, C, B);hanoi(1, A, B, C);hanoi(n - 1, B, A, C);}}这段代码通过递归实现了汉诺塔游戏的具体操作,将汉诺塔复杂的问题转化为简单的递归关系。

java程序设计第三版课后答案

java程序设计第三版课后答案

java程序设计第三版课后答案Java程序设计第三版课后答案在编写Java程序设计第三版的课后答案时,我们首先需要了解这本书的结构和内容。

通常,一本好的教科书会包含理论讲解、示例代码、练习题和课后习题。

课后习题是帮助学生巩固和应用所学知识的重要部分。

以下是一些可能的课后答案示例,但请注意,具体答案需要根据实际的习题来编写。

第一章:Java基础问题1:简述Java语言的特点。

答案:Java是一种面向对象的编程语言,具有跨平台性、健壮性、安全性、简单性、多线程和动态性等特点。

它的跨平台性主要得益于Java虚拟机(JVM)的存在,使得Java程序可以在任何安装有JVM的设备上运行。

Java的健壮性体现在其严格的类型检查和异常处理机制。

安全性则体现在其对内存的自动管理以及对网络编程的内置支持。

问题2:编写一个Java程序,输出“Hello, World!”。

答案:```javapublic class HelloWorld {public static void main(String[] args) {System.out.println("Hello, World!");}}```第二章:数据类型和运算符问题1:Java中的基本数据类型有哪些?答案:Java中的基本数据类型包括整型(byte, short, int, long),浮点型(float, double),字符型(char)和布尔型(boolean)。

问题2:编写一个Java程序,实现两个整数的加法,并输出结果。

答案:```javapublic class IntegerAddition {public static void main(String[] args) {int number1 = 5;int number2 = 10;int sum = number1 + number2;System.out.println("The sum is: " + sum);}}```第三章:控制流程问题1:Java中有哪些控制流程语句?答案:Java中的控制流程语句包括条件语句(if, switch),循环语句(for, while, do-while)以及跳转语句(break, continue, return)。

Java Web程序设计智慧树知到课后章节答案2023年下青岛职业技术学院

Java Web程序设计智慧树知到课后章节答案2023年下青岛职业技术学院

Java Web程序设计智慧树知到课后章节答案2023年下青岛职业技术学院青岛职业技术学院第一章测试1.Java诞生于()A:1995年1月B:1996年1月 C:1994年1月 D:1997年1月答案:1995年1月2.JSP是由()公司推出的。

A:微软 B:Macromedia C:IBM D:Sun答案:Sun3.以下哪种服务器不可运行JSP程序?()A:Tomcat B:Sun C:ASP D:Resin答案:Sun4.Tomcat是一种免费Web服务器,可以处理关于HTML、()和Servlet的请求。

A:C# B:ASP C:PHP D:JSP答案:JSP5.以下不属于3p语言的是()。

A:PHP B:JSP C:XML D:答案:XML6.html代码开始和结束的标记是()A:<body> </body> B: <style> </style> C: <javaScript> </javaScript> D:<html> </html>答案:<html> </html>7.<title></title>标记在<head></head>标记之间,<title></title>标记之间的内容将显示到()A:浏览器的标题栏上 B:浏览器的状态栏中 C:浏览器的页面上部 D:浏览器的页面下部答案:浏览器的标题栏上8.下列哪一个标签是换行标签()A:<br> B:<body> C:<tr> D:<p>答案:<br>9.在网页中,必须使用()标记来完成超级链接。

A:<a></a> B:<p></p> C:<li></li> D:<link></link>答案:<a></a>10.要在表单中创建一个多行文本输入框,初始值为:这是一个多行文本框。

Python编程500例快速构建可执行高质量代码

Python编程500例快速构建可执行高质量代码

在Python中,可以使用各种数据库进行编程。例如,可以使用SQLite数据库 进行本地存储和管理数据、使用MySQL数据库进行大型数据库管理等等。
爬虫编程是一种非常有用的技术,它可以帮助我们从互联网上获取大量的数 据。在Python中,有许多库可以用于爬虫编程,例如BeautifulSoup、Scrapy等 等。
在Python中,异常处理是一种非常有用的机制,它可以帮助我们处理程序中 出现的错误和异常情况。通过try-except语句块可以捕获异常并进行处理。
装饰器是一种非常有用的Python特性,它可以在不改变原函数的基础上增加 额外的功能。例如,可以使用装饰器来记录函数执行的时间、缓存函数结果等等。
Python编程500例快速构建可执行 高质量代码
读书笔记
01 思维导图
03 精彩摘录 05 目录分析
目录
02 内容摘要 04 阅读感受 06 作者简介
思维导图
关键字分析思维导图
高质量
python
内容
代码
技能
帮助
掌握
可执行
编程
编程 读者
提高
500
可以
高质量
例子
质量
进行
处理
内容摘要
《Python编程500例快速构建可执行高质量代码》是一本备受推崇的编程书籍,旨在帮助Python 开发者快速掌握编程技巧并提高代码质量。
《Python编程500例快速构建可执行高质量代码》是一本非常实用的编程书 籍,它通过500个示例向读者展示了如何快速构建可执行的高质量Python代码。 这本书不仅适合Python初学者,也适合有经验的Python开发者。虽然这本书有一 些不足之处,但它的实用性和价值仍然是不容忽视的。

java好玩的简单代码

java好玩的简单代码

Java好玩的简单代码一、介绍Java作为一门广泛应用于软件开发的编程语言,拥有着丰富的功能和强大的生态系统。

除了应用于复杂的企业级应用开发,Java也可以用来编写一些好玩的简单代码,让我们在编程的过程中感受到乐趣和创造力的发挥。

本文将介绍一些有趣的Java代码示例,帮助读者了解Java的一些有趣特性和编程技巧。

二、Java代码示例2.1 Hello Worldpublic class HelloWorld {public static void main(String[] args) {System.out.println("Hello World!");}}这是Java程序员入门必学的第一个示例代码。

通过这段代码,我们可以看到Java 的基本结构和语法。

运行这段代码后,控制台将输出”Hello World!“。

这简单的一行代码,展示了Java的输出功能。

2.2 计算器import java.util.Scanner;public class Calculator {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.print("请输入第一个数字: ");int num1 = scanner.nextInt();System.out.print("请输入第二个数字: ");int num2 = scanner.nextInt();System.out.println("请选择操作符 (+, -, *, /): ");String operator = scanner.next();int result = 0;switch (operator) {case "+":result = num1 + num2;break;case "-":result = num1 - num2;break;case "*":result = num1 * num2;break;case "/":result = num1 / num2;break;default:System.out.println("无效的操作符!");return;}System.out.println("计算结果: " + result);}}这是一个简单的计算器示例代码。

最强教程--写出自己的QQ彩色留言代码

最强教程--写出自己的QQ彩色留言代码

最强教程--写出自己的QQ彩色留言代码每次给别人留言时,不免会用到一些彩色留言,确实彩色留言看起来醒目好看。

有图案有文字。

只要在百度上输入“qq留言”就会有很多网站提供彩色留言。

复制粘贴代码即可,但是你可曾想过这些代码是什么意思?自己能不能写出彩色留言代码呢?下来看几个例子:代码中红色部分是我标记出来的,原代码没有。

[M][ftc=FFA000][fts=5] [ftc=#EF6EA8][ftf=Webdings]Y[/ft][/ft][/ft][fts=3][ftc=#EF6EA8][ftf=Webdings]Y[/ft][/ft][/ft][ftc=#F49BC1]━━━━━━━━━━━━[/ft][ftc=#EF6EA8][ftf=Webdings]=[/ft][/ft][ftc=#EF6EA8][ftf=Webdings]=[/ft][/ft][ftc=#F49 BC1]━━━━[/ft][ftc=FFA000]小猪猪放寒假咯多穿衣服别感冒了顺便踩两脚(*^__^*) [/ft][ftc=FFA000] [fts=3][ftf=Wingdings]l[/ft][/ft] [fts=3][ftf=Wingdings]l[/ft][/ft][fts=3][ftf=Wingdings]l[/ft][/ft] [fts=4][ftf=Webdings]n[/ft][/ft][/ft][ftc=FFA000] [fts=3][ftf=Wingdings]l[/ft][/ft] [fts=3][ftf=Wingdings]l[/ft][/ft] [fts=3][ftf=Wingdings]l[/ft][/ft] [fts=4][ftf=Webdings]n[/ft][/ft][/ft]留言中含有图案,文字,很漂亮。

有些图案相同但大小不同。

如爱心,圆。

从代码中可以看到,微笑的表情、横线就是输入法直接打出来的,而爱心、圆则是代码。

《Python程序设计教程》习题答案

《Python程序设计教程》习题答案

《Python程序设计教程》习题答案说明:以下习题答案是机械工业出版社出版的《Python程序设计教程》(作者:程细柱和程心怡)一书中各章节习题的答案,希望对读者有用。

第1章Python的开发平台(进入Python城堡)一、判断题1.(╳)2.(√)3.(╳)4.(√)5.(√)6.(╳)7.(√)二、单选题1.B 2.C 3.D 4.B 5.D 6.C7.C8.B9.C10.B11.B12.B13.C14.A15.B、D16.D三、填空题1.引用计数和垃圾收集器2.交互和脚本文件3.>>>4.help(“命令”)5..py四、简答题1.答:具体过程如下:1)用户选择“开始”菜单的“所有程序”,选择打开Python的IDLE窗口;2)在IDLE窗口选择“File/New File”菜单打开程序编辑窗口;3)在编辑窗口中输入程序源代码;4)输入完源代码后,选择编辑窗口的“File/Save”菜单保存Python程序文件;5)选择编辑窗口的“Run/Module”菜单或者按快捷键F5执行该程序。

2.答:Python语言具有简单易学、规范代码、能交互运行、免费开源、面向对象、可移植性好、可嵌入性强、丰富的标准库、高层的解释型语言等优点;它常常应用于人工智能、大数据、科学计算、云计算、云服务、网络爬虫、Web开发、桌面软件、游戏开发等领域。

第2章Python的基础知识(初遇城堡语言)一、判断题1.(√)2.(╳)3.(√)4.(╳)5.(√)6.(╳)7.(╳)8.(╳)9.(╳)二、单选题1.D2.B 3.D 4.A 5.A 6.D7.C8.A9.B10.D11.D12.B13.D14.B15.B16.D17.C18.A19.A20.C21.D22.A23.B24.C25.D26.C27.D28.C29.A30.B31.B32.D33.B34.C35.D36.C37.B38.C39.A40.B41.A42.D43.C44.B45.C46.B47.C48.A49.C50.B51.D52.D53.C54.B55.D56.B57.D三、填空题1.True和False2.83.74.浮点型(float)、布尔型(bool)和复数类型(complex)5.关系运算、逻辑运算、位运算四、名词解释1.是指在运行期间才去做数据类型检查的语言。

python有趣的编程代码200行

python有趣的编程代码200行

python有趣的编程代码200行Python是一种简单易学的编程语言,它以其简洁的语法和强大的功能而受到广泛的欢迎。

在这篇文章中,我将介绍一些有趣的Python编程代码,这些代码只有200行左右,但却能展示出Python的强大之处。

1. 猜数字游戏```pythonimport randomnumber = random.randint(1, 100)guess = int(input("猜一个1到100之间的数字:"))while guess != number:if guess < number:print("猜小了!")else:print("猜大了!")guess = int(input("再猜一次:"))print("恭喜你,猜对了!")```这段代码实现了一个猜数字的游戏。

程序会随机生成一个1到100之间的数字,然后要求玩家猜这个数字是多少。

如果猜错了,程序会提示玩家猜大了还是猜小了,直到猜对为止。

2. 斐波那契数列```pythondef fibonacci(n):if n <= 0:return []elif n == 1:return [0]elif n == 2:return [0, 1]else:fib = [0, 1]for i in range(2, n):fib.append(fib[i-1] + fib[i-2])return fibn = int(input("输入斐波那契数列的长度:"))print(fibonacci(n))```这段代码实现了一个生成斐波那契数列的函数。

用户可以输入一个正整数n,程序会生成一个长度为n的斐波那契数列并输出。

3. 简单的计算器```pythondef add(a, b):return a + bdef subtract(a, b):return a - bdef multiply(a, b):return a * bdef divide(a, b):if b == 0:return "除数不能为0!"else:return a / bprint("选择操作:")print("1. 相加")print("2. 相减")print("3. 相乘")print("4. 相除")choice = int(input("输入你的选择(1-4):"))num1 = float(input("输入第一个数字:"))num2 = float(input("输入第二个数字:"))if choice == 1:print(add(num1, num2))elif choice == 2:print(subtract(num1, num2))elif choice == 3:print(multiply(num1, num2))elif choice == 4:print(divide(num1, num2))else:print("无效的选择!")```这段代码实现了一个简单的计算器。

python下10个简单实例代码

python下10个简单实例代码

python下10个简单实例代码注意:我⽤的python2.7,⼤家如果⽤Python3.0以上的版本,请记得在print()函数哦!如果因为版本问题评论的,不做回复哦1.题⽬:有1、2、3、4个数字,能组成多少个互不相同且⽆重复数字的三位数?都是多少?程序分析:可填在百位、⼗位、个位的数字都是1、2、3、4。

组成所有的排列后再去掉不满⾜条件的排列。

程序源代码:# -*- coding: UTF-8 -*-for i in range(1,5):for j in range(1,5):for k in range(1,5):if (i != j) and (i != k) and (j != k):print i,j,k2.题⽬:企业发放的奖⾦根据利润提成。

利润(I)低于或等于10万元时,奖⾦可提10%;利润⾼于10万元,低于20万元时,低于10万元的部分按10%提成,⾼于10万元的部分,可可提成7.5%;20万到40万之间时,⾼于20万元的部分,可提成5%;40万到60万之间时⾼于40万元的部分,可提成3%;60万到100万之间时,⾼于60万元的部分,可提成1.5%,⾼于100万元时,超过100万元的部分按1%提成,从键盘输⼊当⽉利润I,求应发放奖⾦总数?程序分析:请利⽤数轴来分界,定位。

注意定义时需把奖⾦定义成长整型。

⽅法⼀: 这种⽅法是我⽤数学的原理做的,就是把每种情况都列出⼀个表达式,最后简化表达式,然后直接根据输⼊的利润 I 来计算表达式的值,也就是奖⾦总数。

就是把奖⾦叠加起来,具体算法还是要在纸上计算,这种⽅法适⽤于初学编码的⼈,⽐如我,⽤最笨的数学思路解决问题,就是说在数学上你是按照什么⽅法做的,然后把他转化成代码,就⽐较容易理解了。

# -*- coding: UTF-8 -*-while True:I = input("pls input the lirun:")if I <= 10:a = I * 0.01print aelif I <= 20 and I > 10:b =0.25 + I * 0.075print belif I <= 40 and I > 20:c = 0.75 + I * 0.05print celif I <= 60 and I > 40:d = 0.95 + I * 0.03print delif I <= 60 and I > 100:e = 2 + I * 0.015print eelse:f = 2.95 + I * 0.01print f⽅法⼆:这种⽅法就⽐较难懂了,适合于基础好的⼈。

如何写出优雅漂亮的c#代码(一)

如何写出优雅漂亮的c#代码(一)

如何写出优雅漂亮的c#代码(⼀)作为⼀个参加⼯作近⼗年的“⽼鸟”,也是从“菜鸟”阶段被“⽼鸟”虐过来。

最近这些年带了不少部门⾥⾯的新⼈,新⼈嘛难免缺乏经验,写出的代码难免有不合理之处,接下来本系列将介绍⼀些不合理的代码,以及如何优化。

废话不多说,开撸。

1. 变量声明及命名c#是⼀门严谨的语⾔,他会对程序员的编写进⾏有⼒的强约束,绝⽆其它弱类型语⾔中“模棱两可的概念”。

所以变量声明也要本着严谨的原则。

c#常⽤的命名规则驼峰式命名⽅法(Camel-Case),共有两种⽅式。

(1)⼩驼峰命名法第⼀个单词以⼩写字母开始,第⼆个单词的⾸写字母⼤写,如:firstName、studentId(2)⼤驼峰命名法每⼀个单词的⾸字母都⼤写,也成为Pascal命名法。

如:FirstName、StudentId例:⼩驼峰bool stopFlag = true;int mumAge = 40;string[] studentsArray = {"⼟跟","钢蛋","铁柱"};⼤驼峰public string GetName();public void SetAge();public void Select();接下来我们谈谈如何取名,不要⼩看取名这是最、最、最重要的。

1. 变量命名最重要的:见名知意例:定义⼀个家庭类,包含⽗母孩⼦的名字、性别、年龄信息错误⽰范public class Family{public string Name1="建国";public int Age1= 54;public Sex sex1 = Sex.Male;public string Name2="⾬姗";public int Age2= 26;public Sex sex2 = Sex.Female;public string Name3="紫萱";public int Age3= 2;public Sex sex3 = Sex.Female;}咳咳,请告诉我哪个是爸爸,哪个是妈妈,哪个是孩⼦。

《明解c语言》已看完,练习代码此奉上

《明解c语言》已看完,练习代码此奉上

《明解c语⾔》已看完,练习代码此奉上2016年9⽉20⽇⾄2016年11⽉12⽇,从学校图书馆借来的《明解c语⾔》看完了。

⼤三第⼀个学期,前8周,有c语⾔程序设计的课。

课本是学校⾥的⽼师编写出版的,为了压缩空间,减少页⾯,书中的代码都挤成了⼀团,⼀点⼉美感都没有。

课后习题的参考代码输⼊电脑后,运⾏错误,仔细看⼀遍,是最基本的逻辑问题,最最不应该出现的错误。

再加上授课⽼师的教法未得我⼼。

因此,这8周来,都是课上睡觉,课下《明解c语⾔》。

书中的每⼀⾏代码都被我敲进过电脑,前8章的练习也依次做过。

第9、10、11、12、13章,为赶时间,跟上学校课程的进度,便只敲了代码来回看了⼏遍,未做练习。

下下周c语⾔考试,基础知识已经过了⼀遍。

⽽备考,则靠做课本上的习题吧。

以下,是我所做的《明解c语⾔》前8章的练习答案。

答案不全,只是将个⼈觉得有点动脑⼉的代码给存了下来。

练习2-1:#include <stdio.h>int main(){int n1, n2;puts("请输⼊两个整数:");printf("整数A:"); scanf("%d", &n1);printf("整数B:"); scanf("%d", &n2);printf("A的值是B的值的%d%%\n", (n1*100)/n2);}练习2-5:#include <stdio.h>int main(){int n1, n2;puts("请输⼊两个整数:");printf("整数A:"); scanf("%d", &n1);printf("整数B:"); scanf("%d", &n2);printf("A是B的%f%%。

房间最新广播代码

房间最新广播代码

房间最新广播代码第一部分:房间提示声音麦克风没有声音!请调整!<TABLE bgColor=#F75000 border=6><TR><TD></div>你好朋友,你的麦克风没有声音!请调整!^_^ ^_^!<bgsound src= //ruanjian/13.mp3 loop=1><font size=7麦克风声音太小了<TABLE bgColor=#F75000 border=6><TR><TD></div>你好朋友,你的伴奏声音小点了!.^_^ ^_^!<bgsound src= //ruanjian/13.mp3 loop=1><font size=7电流声太大了<TABLE bgColor=#F75000 border=6><TR><TD></div>你好朋友,你的麦克风电流声太大了!.^_^ ^_^!.^_^ ^_^!<bgsound src= //ruanjian/13.mp3 loop=1><font size=7音量太大<TABLE bgColor=#F75000 border=6><TR><TD></div>你好朋友,你的音量太大,请调整!.^_^ ^_^!.^_^ ^_^!<bgsound src= //ruanjian/13.mp3 loop=1><font size=7第二部分:歌曲、朗诵、舞蹈、文字广播文字广播(镶边淡黄色底的字)<TABLE bgColor=#F75000 border=6><TR><TD></div>绿色的白杨没有时间参加今天的晚会,因为在边防线上,越是过节我们越是没有时间!在这儿,在这遥远的边防线上,白杨祝福房间所有的朋友们节日快乐、幸福安康、合家欢乐!预祝晚会取得圆满成功!<bgsound src= //ruanjian/13.mp3 loop=1><font size=7歌曲广播<TABLE height=150 width=580 background=http://www./e/15.jpg ><tr><td><MARQUEE style="FONT-SIZE:30pt; FILTER:shadow(color=red); COLOR:yellow;FONT-FAMILY:楷体" FONT><B>请欣赏歌曲:《花的海洋》演唱:你我她舞蹈广播<TABLE height=150 width=580 background=http://www./e/d6.jpg ><tr><td><MARQUEE style="FONT-SIZE:30pt; FILTER:shadow(color=red); COLOR:yellow;FONT-FAMILY:楷体" FONT><B>请欣赏舞蹈:《花的海洋》伴舞:你我她朗诵广播<TABLE height=150 width=580 background=http://www./e/d13.jpg ><tr><td><MARQUEE style="FONT-SIZE:30pt; FILTER:shadow(color=red); COLOR:yellow;FONT-FAMILY:楷体" FONT><B>请欣赏朗诵:《花的海洋》诵读:你我她第三部分:图片加声音狗叫声加图片<bgsound src=/ruanjian/10.mp3 loop=1><font size=4 color=red><imgsrc="http://www./e/31.gif"></b></font></marquee></table>猪叫声加图片<bgsound src=/ruanjian/11.mp3 loop=1><font size=4 color=red><imgsrc="http://www./e/29.gif"></b></font></marquee></table>鸡叫声加图片<bgsound src=/ruanjian/09.mp3 loop=1><font size=4 color=red><imgsrc="http://www./e/37.gif"></b></font></marquee></table>是谁呀加图片(童声板)<bgsound src=//ruanjian/12.mp3 loop=1><font size=4 color=red><imgsrc="http://www./e/36.gif"></b></font></marquee></table>生日祝福声加图片<bgsound src=//ruanjian/15.mp3 loop=1><font size=4 color=red><imgsrc="http://www./e/11.gif"></b></font></marquee></table>枪声加图片<bgsound src=//ruanjian/08.mp3 loop=2><font size=4 color=red><imgsrc="http://www./e/30.gif"></b></font></marquee></table>炮声加图片<bgsound src=//ruanjian/07.mp3 loop=2><font size=4 color=red><imgsrc="http://www./e/1.gif"></b></font></marquee></table>小孩笑声加图片<bgsound src=//ruanjian/06.mp3 loop=1><font size=4 color=red><imgsrc="http://www./e/6.gif"></b></font></marquee></table>毛主席语录加图片<bgsound src=//ruanjian/14.mp3 loop=1><font size=4 color=red><imgsrc="http://www./e/d16.jpg"></b></font></marquee></table>我担心你不会来了(有声音没图片)<bgsound src= /ruanjian/01.wav loop=1><font size=7亲爱的奔一个(有声音没图片)<bgsound src= /ruanjian/02.mp3 loop=1><font size=7我的小宝贝呗我一下(有声音没图片)<bgsound src= /ruanjian/03.mp3 loop=1><font size=7老公接电话(有声音没图片)<bgsound src= /ruanjian/04.mp3 loop=1><font size=7鼓掌、口哨(有声音没图片)<bgsound src= /ruanjian/05.mp3 loop=1><font size=7第四部分:文字加图片代码给你发点工资(5元)<imgsrc="http://www./e/q1.jpg"></b></font></marquee></table>你上麦唱歌挺辛苦的,给你发点工资吧!请笑纳!给你发点工资(100元)<imgsrc="http://www./e/q2.jpg"></b></font></marquee></table>你上麦唱歌挺辛苦的,给你发点工资吧!请笑纳!给你发点工资(1000元)<imgsrc="http://www./e/q3.jpg"></b></font></marquee></table>你上麦唱歌挺辛苦的,给你发点工资吧!请笑纳!房间祝福词<imgsrc="http://www./e/d13.jpg"></b></font></marquee></table>献花图片<imgsrc="http://www./e/d14.jpg"></b></font></marquee></table >下雨图片<imgsrc="http://www./e/3.gif"></b></font></marquee></table>银河鹊桥会图片<imgsrc="http://www./e/4.gif"></b></font></marquee></table>思考图片<imgsrc="http://www./e/7.gif"></b></font></marquee></table>小猫晃脑袋图片<imgsrc="http://www./e/8.gif"></b></font></marquee></table>我去吃饭了图片<imgsrc="http://www./e/10.gif"></b></font></marquee></table>生日快乐图片<imgsrc="http://www./e/11.gif"></b></font></marquee></table>祝福你朋友图片<imgsrc="http://www./e/12.gif"></b></font></marquee></table>祝福生日图片<imgsrc="http://www./e/15.gif"></b></font></marquee></table>给你拍个照图片<imgsrc="http://www./e/17.gif"></b></font></marquee></table>小破孩献花图片<imgsrc="http://www./e/23.gif"></b></font></marquee></table>我真服你了图片<imgsrc="http://www./e/24.gif"></b></font></marquee></table>欢迎光临图片<imgsrc="http://www./e/32.gif"></b></font></marquee></table>我舍不得你走图片<imgsrc="http://www./e/33.gif"></b></font></marquee></table> 陪你去听风图片<imgsrc="http://www./e/34.gif"></b></font></marquee></table>会移动的献花图片<marquee scrollamount="2" style="background-image: url('http://www./e/25.gif'); font-size: 100pt; font-family: 隶书; color: #FFF000; border-style: ridge; border-width: 1"><BR> </marquee>会移动的跳舞图片<marquee scrollamount="2" style="background-image: url('http://www./e/35.gif'); font-size: 100pt; font-family: 隶书; color: #FFF000; border-style: ridge; border-width: 1"><BR> </marquee>移动的马儿跑图片<marquee scrollamount="2" style="background-image: url('http://www./e/9.gif'); font-size: 100pt; font-family: 隶书; color: #FFF000; border-style: ridge; border-width: 1"><BR> </marquee>第五部分:镶边的图片(图片可以更换修改,很漂亮的)(一)<CENTER><TABLE height=150 border=4><TR><TD background= http://www./e/s1.jpg <DIV style="FILTER: shadow(color=RED strength=3);WIDTH: 600px"><center><FONT color=FF0000size=4><BR><BR><B><BR> </TD>(二)<CENTER><TABLE height=150 border=4><TR><TD background= http://www./e/s2.jpg <DIV style="FILTER: shadow(color=RED strength=3);WIDTH: 600px"><center><FONT color=FF0000 size=4><BR><BR><B><BR> </TD>(三)<CENTER><TABLE height=150 border=4><TR><TD background= http://www./e/s3.jpg <DIV style="FILTER: shadow(color=RED strength=3);WIDTH: 600px"><center><FONT color=FF0000 size=4><BR><BR><B><BR> </TD>(四)<CENTER><TABLE height=150 border=4><TR><TD background= http://www./e/s4.jpg <DIV style="FILTER: shadow(color=RED strength=3);WIDTH: 600px"><center><FONT color=FF0000 size=4><BR><BR><B><BR> </TD>(五)<CENTER><TABLE height=150 border=4><TR><TD background= http://www./e/s5.jpg <DIV style="FILTER: shadow(color=RED strength=3);WIDTH: 600px"><center><FONT color=FF0000 size=4><BR><BR><B><BR> </TD>(六)<CENTER><TABLE height=150 border=4><TR><TD background= http://www./e/s6.jpg <DIV style="FILTER: shadow(color=RED strength=3);WIDTH: 600px"><center><FONT color=FF0000 size=4><BR><BR><B><BR> </TD>(七)<CENTER><TABLE height=150 border=4><TR><TD background= http://www./e/s7.jpg <DIV style="FILTER: shadow(color=RED strength=3);WIDTH: 600px"><center><FONT color=FF0000 size=4><BR><BR><B><BR> </TD>(八)<CENTER><TABLE height=150 border=4><TR><TD background= http://www./e/s8.jpg <DIV style="FILTER: shadow(color=RED strength=3);WIDTH: 600px"><center><FONT color=FF0000 size=4><BR><BR><B><BR> </TD>(九)<CENTER><TABLE height=150 border=4><TR><TD background= http://www./e/s9.jpg <DIV style="FILTER: shadow(color=RED strength=3);WIDTH: 600px"><center><FONT color=FF0000 size=4><BR><BR><B><BR> </TD>(十)<CENTER><TABLE height=150 border=4><TR><TDbackground= http://www./e/s10.jpg <DIV style="FILTER: shadow(color=RED strength=3);WIDTH: 600px"><center><FONT color=FF0000 size=4><BR><BR><B><BR> </TD>(十一)<CENTER><TABLE height=150 border=4><TR><TD background= http://www./e/s11.jpg <DIV style="FILTER: shadow(color=RED strength=3);WIDTH: 600px"><center><FONT color=FF0000 size=4><BR><BR><B><BR> </TD>(十二)<CENTER><TABLE height=150 border=4><TR><TD background= http://www./e/s12.jpg <DIV style="FILTER: shadow(color=RED strength=3);WIDTH: 600px"><center><FONT color=FF0000 size=4><BR><BR><B><BR> </TD>(十三)<CENTER><TABLE height=150 border=4><TR><TD background= http://www./e/s13.jpg <DIV style="FILTER: shadow(color=RED strength=3);WIDTH: 600px"><center><FONT color=FF0000 size=4><BR><BR><B><BR> </TD>第六部分图片固定字幕移动(文字图片可以修改)(一)字幕移动(文字可以修改)<marquee style="color: #FF0000; font-size: 24pt; font-weight: bold" bgcolor="#FFFF00">当我想你的时候,我会轻轻进入你的梦乡,在你耳边柔柔地唱;当我想你的时候,也会把思念写成诗行,挂在花瓣上,连同温柔里的忧伤,一起默默的珍藏,当我想你的时候,愿能插起飞翔的翅膀 ... </marquee>(二)图片固定由下往上的字幕(文字图片可以修改)<TABLE width=100% height=60><TR><TD background=<TABLE width=100% height=60><TR><TD background=/e/d1.jpg><B><marqueescrollAmount=1 direction=up height=150 ><CENTER><FONT size=+3 隶书color=RED font-family:>欢迎您的到来朋友!您的开心就是我们的快乐,希望您在这儿找到家的感觉!<BR>(说明:上面代码可以修改,图片从/e/d1.jpg------/e/d16.jpg之间的图片你可以随意添加,太累我就不一一的写出来了,自己用的时候更换就可以了。

小的开发笔记

小的开发笔记

小的开发笔记开发,在很多人眼里是个神秘又高大上的事儿。

就像魔术师在后台捣鼓那些神奇的道具一样,我们开发者也在自己的小天地里捣鼓代码这玩意儿。

我刚开始做开发的时候,那真叫一个一头雾水。

看着那些代码,就像看外星文字一样。

我就想啊,这一行行的字母和符号,怎么就能变成一个个能跑能跳、有用的程序呢?比如说我第一次接触做一个简单的网页,那些HTML标签啊,就像是一群调皮的小娃娃,你得按照特定的规则把它们摆弄好。

我那时候老是把标签的顺序弄错,结果网页显示出来就是个四不像,要么图片跑到不该去的地方,要么文字叠在一起,乱得像被龙卷风席卷过的房间。

后来我慢慢明白了,开发就像是盖房子。

代码就是那些砖头、水泥啥的。

你得先有个规划,就像盖房子得有个蓝图一样。

不能说今天想起来在这儿加个房间,明天又想把那边的墙拆了。

在开发软件的时候,这个规划就是需求分析。

要搞清楚用户到底想要个啥样的东西,是想要个像宫殿一样华丽的软件,还是只要个简单的小茅屋能遮风挡雨就行。

这需求要是没搞对,后面的活儿就全白搭了。

就像你盖房子,人家要的是个中式的四合院,你给盖成了欧式的城堡,那可不行。

再说到代码的调试,这可太折磨人了。

有时候一个小错误,能让你找半天。

就像在一堆沙子里找一颗特别小的钻石一样。

你觉得可能是这儿的问题,改了半天,结果发现错误在另外一个角落里。

我记得有一次,我的程序老是崩溃,我在代码里找啊找,眼睛都看花了。

我把所有可能出错的地方都看了个遍,最后才发现是一个变量的命名出了问题。

就这么个小细节,差点把我整疯了。

这就告诉我们,在开发的时候,细节真的很重要。

一个小小的标点符号,一个不恰当的变量名,都可能引发大问题。

还有就是代码的复用性。

这就好比是做衣服,你不能每次做一件新衣服都重新去织布、做扣子吧。

好的代码就应该像那些做好的布料和扣子一样,可以在不同的项目里用。

这样既能节省时间,又能保证质量。

我以前傻啊,每个项目都从头开始写代码,累得要死不说,还老是出问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第3章我编写过的最漂亮的代码Jon Bentley我曾经听一位大师级的程序员这样称赞到,“我通过删除代码来实现功能的提升。

”而法国著名作家兼飞行家Antoine de Saint-Exupéry的说法则更具代表性,“只有在不仅没有任何功能可以添加,而且也没有任何功能可以删除的情况下,设计师才能够认为自己的工作已臻完美。

”某些时候,在软件中根本就不存在最漂亮的代码,最漂亮的函数,或者最漂亮的程序。

当然,我们很难对不存在的事物进行讨论。

本章将对经典Quicksort(快速排序)算法的运行时间进行全面的分析,并试图通过这个分析来说明上述观点。

在第一节中,我将首先根据我自己的观点来回顾一下Quicksort,并为后面的内容打下基础。

第二节的内容将是本章的重点部分。

我们将首先在程序中增加一个计数器,然后通过不断地修改,从而使程序的代码变得越来越短,但程序的功能却会变得越来越强,最终的结果是只需要几行代码就可以使算法的运行时间达到平均水平。

在第三节将对前面的技术进行小结,并对二分搜索树的运行开销进行简单的分析。

最后的两节将给出学完本章得到的一些启示,这将有助于你在今后写出更为优雅的程序。

3.1 我编写过的最漂亮代码当Greg Wilson最初告诉我本书的编写计划时,我曾自问编写过的最漂亮的代码是什么。

这个有趣的问题在我脑海里盘旋了大半天,然后我发现答案其实很简单:Quicksort算法。

但遗憾的是,根据不同的表达方式,这个问题有着三种不同的答案。

当我撰写关于分治(divide-and-conquer)算法的论文时,我发现 C.A.R. Hoare的Quicksort算法(“Quicksort”,Computer Journal 5)无疑是各种Quicksort算法的鼻祖。

这是一种解决基本问题的漂亮算法,可以用优雅的代码实现。

我很喜欢这个算法,但我总是无法弄明白算法中最内层的循环。

我曾经花两天的时间来调试一个使用了这个循环的复杂程序,并且几年以来,当我需要完成类似的任务时,我会很小心地复制这段代码。

虽然这段代码能够解决我所遇到的问题,但我却并没有真正地理解它。

我后来从Nico Lomuto那里学到了一种优雅的划分(partitioning)模式,并且最终编写出了我能够理解,甚至能够证明的Quicksort算法。

William Strunk Jr.针对英语所提出的“良好的写作风格即为简练”这条经验同样适用于代码的编写,因此我遵循了他的建议,“省略不必要的字词”(来自《The Elements of Style》一书)。

我最终将大约40行左右的代码缩减为十几行的代码。

因此,如果要回答“你曾编写过的最漂亮代码是什么?”这个问题,那么我的答案就是:在我编写的《Programming Pearls, Second Edition》(Addison-Wesley)一书中给出的Quichsort算法。

在示例3-1中给出了用C语言编写的Quicksort函数。

我们在接下来的章节中将进一步地研究和改善这个函数。

【示例】 3-1 Quicksort函数void quicksort(int l, int u){ int i, m;if (l >= u) return;swap(l, randint(l, u));m = l;for (i = l+1; i <= u; i++)if (x[i] < x[l])swap(++m, i);swap(l, m);quicksort(l, m-1);quicksort(m+1, u);}如果函数的调用形式是quicksort(0, n-1),那么这段代码将对一个全局数组x[n]进行排序。

函数的两个参数分别是将要进行排序的子数组的下标:l是较低的下标,而u是较高的下标。

函数调用swap(i,j)将会交换x[i]与x[j]这两个元素。

第一次交换操作将会按照均匀分布的方式在l和u之间随机地选择一个划分元素。

在《Programming Pearls》一书中包含了对Quicksort算法的详细推导以及正确性证明。

在本章的剩余内容中,我将假设读者熟悉在《Programming Pearls》中所给出的Quicksort 算法以及在大多数初级算法教科书中所给出的Quicksort算法。

如果你把问题改为“在你编写那些广为应用的代码中,哪一段代码是最漂亮的?”我的答案还是Quicksort算法。

在我和M. D. McIlroy一起编写的一篇文章("Engineering a sort function," Software-Practice and Experience, Vol. 23, No. 11)中指出了在原来Unix qsort函数中的一个严重的性能问题。

随后,我们开始用C语言编写一个新排序函数库,并且考虑了许多不同的算法,包括合并排序(Merge Sort)和堆排序(Heap Sort)等算法。

在比较了Quicksort的几种实现方案后,我们着手创建自己的Quicksort算法。

在这篇文章中描述了我们如何设计出一个比这个算法的其他实现要更为清晰,速度更快以及更为健壮的新函数——部分原因是由于这个函数的代码更为短小。

Gordon Bell的名言被证明是正确的:“在计算机系统中,那些最廉价,速度最快以及最为可靠的组件是不存在的。

”现在,这个函数已经被使用了10多年的时间,并且没有出现任何故障。

考虑到通过缩减代码量所得到的好处,我最后以第三种方式来问自己在本章之初提出的问题。

“你没有编写过的最漂亮代码是什么?”。

我如何使用非常少的代码来实现大量的功能?答案还是和Quicksort有关,特别是对这个算法的性能分析。

我将在下一节给出详细介绍。

3.2 事倍功半Quicksort是一种优雅的算法,这一点有助于对这个算法进行细致的分析。

大约在1980年左右,我与Tony Hoare曾经讨论过Quicksort算法的历史。

他告诉我,当他最初开发出Quicksort时,他认为这种算法太简单了,不值得发表,而且直到能够分析出这种算法的预期运行时间之后,他才写出了经典的“Quicksoft”论文。

我们很容易看出,在最坏的情况下,Quicksort可能需要n2的时间来对数组元素进行排序。

而在最优的情况下,它将选择中值作为划分元素,因此只需nlgn次的比较就可以完成对数组的排序。

那么,对于n个不同值的随机数组来说,这个算法平均将进行多少次比较?Hoare对于这个问题的分析非常漂亮,但不幸的是,其中所使用的数学知识超出了大多数程序员的理解范围。

当我为本科生讲授Quicksort算法时,许多学生即使在费了很大的努力之后,还是无法理解其中的证明过程,这令我非常沮丧。

下面,我们将从Hoare的程序开始讨论,并且最后将给出一个与他的证明很接近的分析。

我们的任务是对示例3-1中的Quicksort代码进行修改,以分析在对元素值均不相同的数组进行排序时平均需要进行多少次比较。

我们还将努力通过最短的代码、最短运行时间以及最小存储空间来得到最深的理解。

为了确定平均比较的次数,我们首先对程序进行修改以统计次数。

因此,在内部循环进行比较之前,我们将增加变量comps的值(参见示例3-2)。

【示例3-2】修改Quicksort的内部循环以统计比较次数。

for (i = l+1; i <= u; i++) {comps++;if (x[i] < x[l])swap(++m, i);}如果用一个值n来运行程序,我们将会看到在程序的运行过程中总共进行了多少次比较。

如果重复用n来运行程序,并且用统计的方法来分析结果,我们将得到Quicksort在对n个元素进行排序时平均使用了1.4 nlgn次的比较。

在理解程序的行为上,这是一种不错的方法。

通过十三行的代码和一些实验可以反应出许多问题。

这里,我们引用作家Blaise Pascal和T. S. Eliot的话,“如果我有更多的时间,那么我给你写的信就会更短。

”现在,我们有充足的时间,因此就让我们来对代码进行修改,并且努力编写出更短(同时更好)的程序。

我们要做的事情就是提高这个算法的速度,并且尽量增加统计的精确度以及对程序的理解。

由于内部循环总是会执行u-l次比较,因此我们可以通过在循环外部增加一个简单的操作来统计比较次数,这就可以使程序运行得更快一些。

在示例3-3的Quicksort算法中给出了这个修改。

【示例3-3】 Quicksort的内部循环,将递增操作移到循环的外部comps += u-l;for (i = l+1; i <= u; i++)if (x[i] < x[l])swap(++m, i);这个程序会对一个数组进行排序,同时统计比较的次数。

不过,如果我们的目标只是统计比较的次数,那么就不需要对数组进行实际地排序。

在示例3-4中去掉了对元素进行排序的“实际操作”,而只是保留了程序中各种函数调用的“框架”。

【示例3-4】将Quicksort算法的框架缩减为只进行统计void quickcount(int l, int u){ int m;if (l >= u) return;m = randint(l, u);comps += u-l;quickcount(l, m-1);quickcount(m+1, u);}这个程序能够实现我们的需求,因为Quichsort在选择划分元素时采用的是“随机”方式,并且我们假设所有的元素都是不相等的。

现在,这个新程序的运行时间与n成正比,并且相对于示例3-3需要的存储空间与n成正比来说,现在所需的存储空间缩减为递归堆栈的大小,即存储空间的平均大小与lgn成正比。

虽然在实际的程序中,数组的下标(l和u)是非常重要的,但在这个框架版本中并不重要。

因此,我们可以用一个表示子数组大小的整数(n)来替代这两个下标(参见示例3-5)【示例3-5】在Quicksort代码框架中使用一个表示子数组大小的参数void qc(int n){ int m;if (n <= 1) return;m = randint(1, n);comps += n-1;qc(m-1);qc(n-m);}现在,我们可以很自然地把这个过程整理为一个统计比较次数的函数,这个函数将返回在随机Quicksort算法中的比较次数。

在示例3-6中给出了这个函数。

【示例3-6】将Quicksort框架实现为一个函数int cc(int n){ int m;if (n <= 1) return 0;m = randint(1, n);return n-1 + cc(m-1) + cc(n-m);}在示例3-4、示例3-5和示例3-6中解决的都是相同的基本问题,并且所需的都是相同的运行时间和存储空间。

相关文档
最新文档