(1936-2001)Robert W.Floyd
历届图灵奖得主基本上都有高学历、高学位,绝大多数有博士头衔。这是可以理解的,因为创新型人才需要有很好的文化素养,丰富的知识底蕴,因而必须接受良好的教育。但事情总有例外,1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德就是一位“自学成才的计算机科学家”(a Self-Taught Computer Scientist)。
弗洛伊德1936年6月8日生于纽约。说他“自学成才”并不是说他没有接受过高等教育,他是芝加哥大学的毕业生,但学的不是数学或电气工程等与计算机密切相关的专业,而是文学,1953年获得文学士学位。
20世纪50年代初期美国经济不太景气,找工作比较困难,因学习文学而没有任何专门技能的弗洛伊德在就业上遇到很大麻烦,无奈之中到西屋电气公司当了二年计算机 *** 作员,在IBM650机房值夜班。我们知道,早期的计算机都是以批处理方式工作的,计算机 *** 作员的任务就是把程序员编写好的程序在卡片穿孔机(这是脱机的辅助外部设备)上穿成卡片,然后把卡片叠放在读卡机上输入计算机,以便运行程序。因此, *** 作员的工作比较简单,同打字员类似,不需要懂计算机,也不需要懂程序设计。但弗洛伊德毕竟是一个受过高等教育的人,又是一个有心人,干了一段时间的 *** 作员,很快对计算机产生了兴趣,决心弄懂它,掌握它,于是他借了有关书籍资料在值班空闲时间刻苦学习钻研,有问题就虚心向程序员请教。白天不值班,他又回母校去听讲有关课程。这样,他不但在1958年又获得了理科学士学位,而且逐渐从计算机的门外汉变成计算机的行家里手。
1956年他离开西屋电气公司,到芝加哥的装甲研究基金会(Armour Research Foundation),开始还是当 *** 作员,后来就当了程序员。1962年他被马萨诸塞州的Computer Associates公司聘为分析员。此时与Warsall合作发布Floyd-Warshall算法。1965年他应聘成为卡内基—梅隆大学的副教授,3年后转至斯坦福大学。1970年被聘任为教授。
之所以能这样快地步步高升,关键就在于弗洛伊德通过勤奋学习和深入研究,在计算机科学的诸多领域:算法,程序设计语言的逻辑和语义,自动程序综合,自动程序验证,编译器的理论和实现等方面都作出创造性的贡献。其中包括:1962年,弗洛伊德完成了Algol 60编译器的开发,成功投入使用,这是世界上最早的Algol 60编译器之一,而且弗洛伊德在这个编译器的开发中率先融入了优化的思想,使编译所生成的目标代码占用空间少,运行时间短。弗洛伊德优化编译的思想对编译器技术的发展产生了深刻的影响。随后,他又对语法分析进行了系统研究,优先文法(precedence grammar),限界上下文文法(bounded context grammar)等都是弗洛伊德在首先提出来的。优先文法解决了自底向上的语法分析中的首要任务:如何找到“句柄”,也就是当前需要进行归约的符号串。弗洛伊德通过对不同的符号定义不同的优先级,解决了这个问题。限界上下文文法则通过对上下文无关文法G中的两个推导:
S→βArβαγ
+
S→δαε
进行比较以确定α是否是δαε的句柄,以及产生方式A→α是否是唯一可进行归约的产生式。弗洛伊德经过研究,给出其充分必要条件为:β和δ的最后m个符号相同,丁和o/的最初n个终结符相同。这样一个上下文无关文法G就称为(m,n)限界上下文文法。
在算法方面,弗洛伊德和威廉姆斯(J.Williams)在1964年共同发明了著名的堆排序算法HEAPSORT,这是与英国学者霍尔 (CARHoare,1980年图灵奖获得者)发明的QUICKSORT齐名的高效排序算法之一。此外还有直接以弗洛伊德命名的求最短路的算法,这是弗洛伊德利用动态规划(dynamic programming)的原理设计的一个高效算法。
在程序设计方面,计算机科学家非常关心的一个重要问题是如何表达和描述程序的逻辑,如何验证程序的正确性。1967年,在美国数学会AMS举行的应用数学讨论会上,弗洛伊德发表了那篇引起轰动并产生了深远影响的论文,即“如何确定程序的意义”(Assigning Meanings to Programs)。这篇论文在程序逻辑研究的历史上,是继麦卡锡(J.McCarthy,1971年图灵奖获得者)在1963年提出用递归函数作为程序的模型这一方法以后最重大的一个进展。
麦卡锡倡导的方法对于一般程序,包括大型软件确实是行之有效的,但它有一个不足,即对于许多以命令方式编写的软件,其中包括赋值语句,条件语句,用While实现循环的语句……对这样的程序用递归定义的函数去证明其正确性就很不方便了。正是为了解决这个问题,弗洛伊德在上述论文中提出了一种基于流程图的表达程序逻辑的方法。这个方法的主要特点就是在流程图的每一弧线上放置一个“标记”(tag),也就是一个逻辑断言,并且保证只要当控制经过这个弧线时该断言一定成立。弗洛伊德的主要贡献在于解决了基于这种标记的形式系统的细节,证明了这种系统的完备性,解决了如何证明程序终结的问题。弗洛伊德还引入了验证条件的概念,包括流程图的一个组成部分(方框、圆框等)及其人口和出口处的标记。为了证明带标记的流程图的正确性,只要证明其中每一组成部分的验证条件成立就行了。弗洛伊德提出的方法被叫做“归纳断言法”(inductive assertion method),或前后断言法(pre·and post-assertion method)。在框图每个断点i上所加的逻辑断言即标记就叫i点的归纳断言,说明程序执行经过此点时在各输入变量x和各程序变量丁之间应存在的关系,以谓词Pi(x,y)的形式表示。若程序从断点i经过路段。到下一断点j的验证条件以Ra(x,y)表示,丁的值在。上的变化以ha(x,y)表示,则只要能证明下式恒真:
(∨x)(∨y)[pi(x,y)∧Ra(x,y) Pj(x,ha(x,y))]
程序从i到j的部分正确性也就证明了。
虽然用归纳断言法不能证明程序的完全正确性,因为它必须以程序能够终结为前提,但由于弗洛伊德在论文中同时也考虑了如何证明程序终结的问题,因此弗洛伊德的归纳断言法也就有了普遍的意义。
C语言概述11C语言出现的历史背景112C 语言的特点213简单的C语言程序介绍414运行C程序的步骤与方法7141运行C程序的步骤7142上机运行C程序的方法8习题12程序的灵魂——算法21算法的概念142.2简单算法举例1523算法的特性1924怎样表示一个算法20241用自然语言表示算法20242用流程图表示算法202433种基本结构和改进的流程图24244用N\|S流程图表示算法27245用伪代码表示算法30246用计算机语言表示算法3325结构化程序设计方法34习题36数据类型、运算符与表达式31C语言的数据类型3732常量与变量37321常量和符号常量373.2.2变量383.3整型数据403.3.1整型常量的表示方法40332整型变量40333整型常量的类型443.4浮点型数据453.4.1浮点型常量的表示方法453.4.2浮点型变量45343浮点型常量的类型473.5字符型数据483.5.1字符常量483.5.2字符变量493.5.3字符数据在内存中的存储形式及其使用方法503.5.4字符串常量523.6变量赋初值5337各类数值型数据间的混合运算5438算术运算符和算术表达式553.8.1C语言运算符简介553.8.2算术运算符和算术表达式553.9赋值运算符和赋值表达式593.10逗号运算符和逗号表达式65习题66最简单的C程序设计——顺序程序设计4.1C语句概述6942赋值语句7143数据输入输出的概念及在C语言中的实现724.4字符数据的输入输出73441 putchar函数73442 getchar函数744.5格式输入与输出74451printf函数754.5.2scanf函数8246顺序结构程序设计举例86习题88选择结构程序设计5.1关系运算符和关系表达式915.1.1关系运算符及其优先次序915.1.2关系表达式925.2逻辑运算符和逻辑表达式925.2.1逻辑运算符及其优先次序925.2.2逻辑表达式935.3if 语句955.3.1if语句的3种形式955.3.2if语句的嵌套995.3.3条件运算符1025.4switch语句1045.5程序举例106习题111循环控制61概述11362goto语句以及用goto语句构成循环11363用while语句实现循环11464用do…while语句实现循环11565用for 语句实现循环11866循环的嵌套12167几种循环的比较12268break语句和continue语句122681break语句122682continue语句12369程序举例124习题129数组71一维数组的定义和引用131711一维数组的定义131712一维数组元素的引用132713一维数组的初始化132714一维数组程序举例13372二维数组的定义和引用135721 二维数组的定义135722二维数组的引用136723二维数组的初始化137724二维数组程序举例13873字符数组140731字符数组的定义140732字符数组的初始化140733字符数组的引用141734字符串和字符串结束标志142735字符数组的输入输出144736字符串处理函数146737字符数组应用举例150习题152函数8.1概述1558.2函数定义的一般形式156821无参函数定义的一般形式156822有参函数定义的一般形式157823空函数1578.3函数参数和函数的值1588.3.1形式参数和实际参数158832函数的返回值1608.4函数的调用1618.4.1函数调用的一般形式1618.4.2函数调用的方式1628.4.3对被调用函数的声明和函数原型1638.5函数的嵌套调用1678.6函数的递归调用1718.7数组作为函数参数177871数组元素作函数实参178872数组名作函数参数179873多维数组名作函数参数1828.8局部变量和全局变量1848.8.1局部变量184882全局变量1858.9变量的存储类别1888.9.1动态存储方式与静态存储方式1888.9.2auto变量189893用static声明局部变量189894register变量1918.9.5用extern声明外部变量193896用static声明外部变量195897关于变量的声明和定义1968.9.8存储类别小结197810内部函数和外部函数1998101内部函数1998102外部函数199习题202预处理命令9.1宏定义2049.1.1不带参数的宏定义2049.1.2带参数的宏定义2079.2“文件包含”处理21193条件编译214习题217指针10.1地址和指针的概念21910.2变量的指针和指向变量的指针变量22110.2.1定义一个指针变量22110.2.2指针变量的引用22210.2.3指针变量作为函数参数22510.3数组与指针22910.3.1指向数组元素的指针22910.3.2通过指针引用数组元素2301033用数组名作函数参数23510.3.4多维数组与指针24210.4字符串与指针25110.4.1字符串的表示形式25110.4.2字符指针作函数参数25410.4.3对使用字符指针变量和字符数组的讨论25710.5指向函数的指针26010.5.1用函数指针变量调用函数26010.5.2用指向函数的指针作函数参数26210.6返回指针值的函数26510.7指针数组和指向指针的指针26810.7.1指针数组的概念26810.7.2指向指针的指针27110.7.3指针数组作main函数的形参27310.8有关指针的数据类型和指针运算的小结2751081有关指针的数据类型的小结2761082指针运算小结2761083void指针类型277习题278结构体与共用体111概述281112定义结构体类型变量的方法282113结构体变量的引用28411.4结构体变量的初始化28511.5结构体数组2861151定义结构体数组2861152结构体数组的初始化2871153结构体数组应用举例28711.6指向结构体类型数据的指针28911.6.1指向结构体变量的指针28911.6.2指向结构体数组的指针29011.6.3用结构体变量和指向结构体的指针作函数参数29211.7用指针处理链表29411.7.1链表概述2941172简单链表2951173处理动态链表所需的函数2961174建立动态链表29711.7.5输出链表30011.7.6对链表的删除 *** 作30111.7.7对链表的插入 *** 作3031178对链表的综合 *** 作30511.8共用体30811.8.1共用体的概念30811.8.2共用体变量的引用方式30911.8.3共用体类型数据的特点31011.9枚举类型31211.10用typedef定义类型315习题318位运算12.1位运算符和位运算3191211“按位与”运算符(&)3191212“按位或”运算符(|)3201213“异或”运算符(∧)3211214“取反”运算符(~)3221215左移运算符(<<)3231216右移运算符(>>)3231217位运算赋值运算符3241218不同长度的数据进行位运算324122位运算举例324123位段326习题329文件13.1C文件概述33013.2文件类型指针33113.3文件的打开与关闭33213.3.1文件的打开(fopen函数)33213.3.2文件的关闭(fclose函数)33413.4文件的读写33413.4.1fputc函数和fgetc函数(putc函数和getc函数)33513.4.2fread函数和fwrite函数33913.4.3fprintf函数和fscanf函数34213.4.4其他读写函数34313.5文件的定位34413.5.1rewind函数34413.5.2fseek函数和随机读写34513.5.3ftell函数34613.6出错的检测34613.6.1ferror函数34713.6.2clearerr函数34713.7文件输入输出小结347
答案为A
switch语句的执行方式是:按照用户提供的K值到下面进行匹配,但程序中没有容许匹配,直接把所有可能的情况归结到default,并且执行了break之后,退出switch语句,所以没有改变变量n的值。所以n的值还为0。
流程图:
c语言代码:
#include <stdioh>
int main()
{
int i,sum=0;
for(i=1;i<=100;i++)
sum+=i;
printf("%d\n",sum);
return 0;
}
扩展资料:
基本特性
1、高级语言:它是把高级语言的基本结构和语句与低级语言的实用性结合起来的工作单元。
2、结构式语言:结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。
C 语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。
3、代码级别的跨平台:由于标准的存在,使得几乎同样的C代码可用于多种 *** 作系统,如Windows、DOS、UNIX等等;也适用于多种机型。C语言对编写需要进行硬件 *** 作的场合,优于其它高级语言。
4、使用指针:可以直接进行靠近硬件的 *** 作,但是C的指针 *** 作不做保护,也给它带来了很多不安全的因素。
C++在这方面做了改进,在保留了指针 *** 作的同时又增强了安全性,受到了一些用户的支持,但是,由于这些改进增加语言的复杂度,也为另一部分所诟病。
Java则吸取了C++的教训,取消了指针 *** 作,也取消了C++改进中一些备受争议的地方,在安全性和适合性方面均取得良好的效果,但其本身解释在虚拟机中运行,运行效率低于C++/C。
一般而言,C,C++,java被视为同一系的语言,它们长期占据着程序使用榜的前三名。
特有特点:
1、C语言是一个有结构化程序设计、具有变量作用域(variable scope)以及递归功能的过程式语言。
2、C语言传递参数均是以值传递(pass by value),另外也可以传递指针(a pointer passed by value)。
3、不同的变量类型可以用结构体(struct)组合在一起。
4、只有32个保留字(reserved keywords),使变量、函数命名有更多d性。
5、部份的变量类型可以转换,例如整型和字符型变量。
6、通过指针(pointer),C语言可以容易的对存储器进行低级控制。
7、预编译处理(preprocessor)让C语言的编译更具有d性。
参考资料:
第一个:
#include
#include
using namespace std;
const double PI=3141592654;
const int SZ=1000;
int MKAC=0;
double STP=1;
template
class STACK{
private:
Type base[SZ];
int Size;
public:
STACK(){Size=0;};
void push(Type a) //入栈
{
base[Size]=a;
Size++;
}
Type pop() //出栈
{
return base[--Size];
}
int size()
{return Size;}
};
bool IsData(char ch)
{
return ((ch>='0'&&ch<='9')||ch=='')true:false;
}
bool IsSym(char ch)
{
return (ch=='+'||ch=='-'||ch==''||ch=='/')true:false;
}
int IsPar(char ch)
{
return ch=='\x28'1:ch=='\x29'-1:0;
}
int Priority(char ch) //符号的优先极别
{
switch(ch)
{
case '+':
return 0;
case '-':
return 0;
case '':
return 1;
case '/':
return 1;
default:
return -1;
}
}
bool Check(char ch)
{
int a=0;
for(int i=0;i<strlen(ch);i++)
if(ch[i]=='')
a++;
if(a>1)
return false;
return true;
}
double ToArc(double alpha){return (PIalpha/1800);}
double ToDgr(double arc){return (180arc/PI);}
double ToData(char ch)
{
int i,j,sumn=0;
double sum=00;
if(!Check(ch)) return 00;
for(i=0;i<strlen(ch);i++)
{if(ch[i]!='')
sumn=sumn10+(ch[i]-'0');
else break;
}
if(i<strlen(ch))
for(j=i+1;j<strlen(ch);j++)
sum=sum10+(ch[j]-'0');
sum/=pow(100,(double)(strlen(ch)-1-i));
return (sum+sumn);
}
double Call(double sum,double data,char ch)//根据运算计算数据
{
double ans=00;
switch(ch)
{
case '+':
ans=sum+data;
break;
case '-':
ans=sum-data;
break;
case '':
ans=sumdata;
break;
case '/':
ans=sum/data;
break;
default:ans=00;
break;
}
return ans;
}
int GetMatch(char buffer,int pos)//找到匹配的括号
{
STACK Temp;
int i;
for(i=pos;i<strlen(buffer);i++)
{if(IsPar(buffer[i])==1)
Temppush('0');
if(IsPar(buffer[i])==-1)
{Temppop();
if(Tempsize()==0) return i;
}
}
return -1;
}
int NL(int n)
{
if(n==0)
return 1;
else return nNL(n-1);
}
void Opr(STACK& symbol,STACK& data,int& mark)
{
double sum;
while(symbolsize()!=0)
{char tem=symbolpop();
int temp=Priority(tem);
symbolpush(tem);
if(temp<mark)
break;
else{
sum=Call(datapop(),datapop(),symbolpop());
datapush(sum);
}
}
}
double Calculate(char buffer,double& sum)//主运算部分
{
STACK data;
STACK symbol;
double ans;
char temp[SZ];
int ct=0,mark=0,tp=0;
datapush(sum);
while(ct<=strlen(buffer))
{
if(IsData(buffer[ct]))
{
while(ct<strlen(buffer)&&IsData(buffer[ct]))
temp[tp++]=buffer[ct++];
temp[tp]='\0';
tp=0;
ans=ToData(temp);
datapush(ans);
if(buffer[ct]=='!') {datapush(NL((int)datapop()));ct++;}
if(ct==strlen(buffer))
{mark=0;
Opr(symbol,data,mark);
sum=datapop();
return sum;
}
else{
int mark=Priority(buffer[ct]);
Opr(symbol,data,mark);
}
}
else if(IsSym(buffer[ct]))
symbolpush(buffer[ct++]);
else{
char BF[100];int k=0;
while(IsPar(buffer[ct])!=1&&ct<=strlen(buffer))
BF[k++]=buffer[ct++];
BF[k]='\0';
if(IsPar(buffer[ct])==1)
{int i,j;
char Temp[100];
for(i=ct+1,j=0;i<GetMatch(buffer,ct);i++,j++)
Temp[j]=buffer[i];
Temp[j]='\0';
datapush(Calculate(Temp,sum));
ct+=(strlen(Temp)+1);
if(ct+1==strlen(buffer))
{mark=0;
Opr(symbol,data,mark);
sum=datapop();
return sum;
}
else{
mark=Priority(buffer[ct+1]);
Opr(symbol,data,mark);
}
ct++;
}
}
}
return 0;
}
int main()
{
char buffer[SZ];
double sum=00;
coutprecision(12);
while(cin>>(buffer)) //输入
{
cout<<Calculate(buffer,sum)<<endl;//计算和输出
}
return 0;
}
//编译环境:Dev C++,VC++
//运行示例:
输入:1+23-4
输出:3
第二个:#include
#include
#include
typedef struct BiTNode{
char data;
struct BiTNode lchild,rchild;
}BiTNode,BiTree;
void CreateBiTree(BiTree &T){
//按先序次序输入二叉树中结点的值(字符型),空格字符表示空树
//构造二叉树表表示的二叉树T
char ch;
ch = getchar();
if(ch==' ') T=NULL;
else
{
T=(struct BiTNode)malloc(sizeof(struct BiTNode));
T->data=ch; //生成根结点
CreateBiTree(T->lchild); //构造左子树
CreateBiTree(T->rchild); //构造右子树
}
}
void PreOrderTraverse(BiTree &T){//先序遍历二叉树
if(T){ //递归条件非空
printf("%c",T->data);
PreOrderTraverse(T->lchild);
PreOrderTraverse(T->rchild);
}
}
void MidOrderTraverse(BiTree &T){//中序遍历二叉树
if(T){ //递归条件非空
MidOrderTraverse(T->lchild);
printf("%c",T->data);
MidOrderTraverse(T->rchild);
}
}
void AftOrderTraverse(BiTree &T){//后序遍历二叉树
if(T){ //递归条件非空
AftOrderTraverse(T->lchild);
AftOrderTraverse(T->rchild);
printf("%c",T->data);
}
}
void PrintBiTree(BiTree &T){//输出二叉树
if(T){
printf("%c",T->data);
if(T->lchild!=NULL||T->rchild!=NULL)
{printf("(");
PrintBiTree(T->lchild);
if(T->rchild!=NULL)
printf(",");
PrintBiTree(T->rchild);
printf(")");
}
}
}
int depth(BiTree &T){//求二叉树的深度
int d1,d2;
if(T==NULL) return(0);
else{
d1=depth(T->lchild);
d2=depth(T->rchild);
if (d1>d2)return(d1+1);
else return(d2+1);
}
}
int leafs(BiTree &b){//求二叉树的叶子结点数
int n1,n2;
if(b==NULL)return(0);
else if(b->lchild==NULL&&b->rchild==NULL)return(1);
else{n1=leafs(b->lchild);
n2=leafs(b->rchild);
return(n1+n2);
}
}
void copytree(BiTree &b,BiTree &t){//复制树
if(b) {t=(struct BiTNode)malloc(sizeof(struct BiTNode));
t->data=b->data;
t->lchild=t->rchild=NULL;
copytree(b->lchild,t->lchild);
copytree(b->rchild,t->rchild);
}
}
void mirrtree(BiTree &b,BiTree &t){//造镜像树
if(b) {t=(struct BiTNode)malloc(sizeof(struct BiTNode));
t->data=b->data;
t->lchild=t->rchild=NULL;
mirrtree(b->lchild,t->rchild);
mirrtree(b->rchild,t->lchild);
}
}
void main()
{
BiTree t,h,k;
CreateBiTree(t);
printf("先序遍历序列为:");
PreOrderTraverse(t);
printf("\n中序遍历序列为:");
MidOrderTraverse(t);
printf("\n后序遍历序列为:");
AftOrderTraverse(t);
printf("\n按先序打印二叉树t=:");
PrintBiTree(t);
printf("\n二叉树的深度为:");
printf("%d\n",depth(t));
printf("二叉树的叶子结点数为:");
printf("%d\n",leafs(t));
copytree(t,h);
printf("复制所得的二叉树h=:");
PrintBiTree(h);
mirrtree(t,k);
printf("\n镜像二叉树k=:");
PrintBiTree(k);
}
运行结果:
输入:abcd e f gh i j
abcd e f gh i j
先序遍历序列为:abcdefghij
中序遍历序列为:dcebfahigj
后序遍历序列为:decfbihjga
按先序打印二叉树t=:a(b(c(d,e),f),g(h(,i),j))
二叉树的深度为:4
二叉树的叶子结点数为:5
复制所得的二叉树h=:a(b(c(d,e),f),g(h(,i),j))
镜像二叉树k=:a(g(j,h(i)),b(f,c(e,d)))
第三个:#include
#include
typedef struct node{//定义节点类型
float coef;
int expn;
struct node next;
}PLOY;
void start()//用户选择界面
{printf("\n");
printf(" 两个一元多项式的相加\n");
printf(" 北京航空航天大学 机械设计系\n");
printf("\n");
printf("请选择 *** 作:\n");
printf("0退出\n");
printf("1两个一元多项式相加\n");
printf("2帮助\n");
}
void notice()//用户帮助界面
{printf("帮助\n");
printf("1输入时只输入多项式的系数与指数,以0 0结束\n");
printf("2例如输入“1 1”然后回车,代表“1X^1”\n");
}
void insert(PLOY head,PLOY inpt)//查找位置插入新链节程序
{PLOY pre,now;
int signal=0;
pre=head;//pre定义为现在的前一个链节
if(pre->next==NULL) {pre->next=inpt;}
else {now=pre->next;
while(signal==0)
{if(inpt->expnexpn)//当新链节小于现在的连接时向后移一个链节
{if(now->next==NULL) {now->next=inpt;signal=1;}
else {pre=now;now=pre->next;}}
else if(inpt->expn>now->expn)//如果发现比现在的链节大了就插入到这个连接的前面
{inpt->next=now;pre->next=inpt;signal=1;}
else {now->coef=now->coef+inpt->coef;signal=1;free(inpt);//与当前链节相等指数
if(now->coef==0) {pre->next=now->next;free(now);}}}}
}
PLOY creat(char ch) //输入多项式
{PLOY head, inpt;
float x; int y;
head=(PLOY )malloc(sizeof(PLOY));//创建链表头
head->next=NULL;
printf("请输入一元多项式%c:(格式:系数 指数,以0 0结束)\n",ch);
scanf("%f %d",&x,&y);
while(x!=0)
{inpt=(PLOY )malloc(sizeof(PLOY));//创建新链节
inpt->coef=x;
inpt->expn=y;
inpt->next=NULL;
insert(head,inpt);//不然就查找位置并且插入新链节
scanf("%f %d",&x,&y);
}
return head;
}
void addPLOY(PLOY head,PLOY pre)//多项式相加
{PLOY inpt;
int flag=0;
while(flag==0)
{if(pre->next==NULL) flag=1;//当现在指向空时跳出循环
else {pre=pre->next;
inpt=(PLOY )malloc(sizeof(PLOY));//创建新链节
inpt->coef=pre->coef;
inpt->expn=pre->expn;
inpt->next=NULL;
insert(head,inpt);}//否则把当前“g(x)”的链节插入到“y(x)”中
}
}
void print(PLOY fun)//输出多项式
{PLOY printing;
int flag=0;
printing=fun->next;//正在被打印的链节
if(fun->next==NULL)//如果函数为空打印0
{printf("0\n"); return;}
while(flag==0)
{if(printing->coef>0&&fun->next!=printing) printf("+");//为正数时打印“+”号
if(printing->coef==1);//如果为“1”就不用打印系数了
else if(printing->coef==-1) printf("-");//如果为“-1”就打印“-”号就行了
else printf("%f",printing->coef);//其余情况都得打印
if(printing->expn!=0) printf("x^%d",printing->expn);//如果指数为“0”不打印指数项
else if((printing->coef==1)||(printing->coef==-1)) printf("1");
if(printing->next==NULL) flag=1;//如果现在的链节没有下一个就结束
else printing=printing->next;
}
printf("\n");
}
void main()
{PLOY f,g;
int sign=-1;//设置标志
start();
while(sign!=0)
{scanf("%d",&sign);
switch(sign)
{case 0:break;//退出
case 1:{printf("你选择的 *** 作是多项式相加:\n");
f=creat('f');//输入多项式f(x)
printf("f(x)=");
print(f);
g=creat('g');//输入多项式g(x)
printf("g(x)=");
print(g);
printf("F(x)=f(x)+g(x)=");
addPLOY(f,g);//两个多项式相加
print(f);
sign=-1;//复位标志
start();//回复用户选择界面
break;}
case 2:{notice();
sign=-1;//复位标志
start();//回复用户选择界面
break;}
default:{printf("输入有误!请重新选择 *** 作!\n");//选择错误,返回选择界面
start();break;}}
}
printf("谢谢使用!\n");
}
41分支结构
[目的及要求] 掌握if语句的使用和switch多分支选择结构的实现,并能熟练的进行应用。
程序1、任意输入一个年份,判断是否是闰年。闰年的条件是符合下面条件之一:
(1)能被4整除,但不能被100整除;
(2)能被4整除,又能被400整除。
程序2、输入三角形的三边长,求三角形的面积。
程序3、任意输入一个成绩,给出评语:
90-100:优秀; 80-89:良好; 60-79:及格; 0-59:不及格。
实训题目
1、用if语句实现菜单功能。
1---成绩输入
2—成绩插入
3---成绩查询
4---成绩排序
5---成绩删除
6---成绩输出
0---退出
请输入你的选择(0---6):
2、任意输入三个数据按从大到小的顺序输出。
3、编程实现:读入两个整型数据及一个运算符(+ - /),计算表达式的值。
4、用switch语句实现菜单功能。
5、用switch语句编程实现:读入两个整型数据及一个运算符(+ - /),计算表达式的值。
6、用switch开关语句实现猜词游戏。
42循环结构
[目的及要求] 掌握循环语句for、while和do-while的使用和break和continue的功能,并能熟练的进行应用。
程序1、编程求1+2+3+···+100的和。
程序2、求1到100之间的奇数之和,偶数之积 。
程序3、把输入的一行字符原样输出,若是大写字母需要转换成小写的。
程序4、编写程序求 20+21+22+23+···+263 的和 。
程序5、从键盘上任意输入一个正整数,判断其是否为素数。
素数:除了1和它本身之外没有其他因子的数。换句话说只要有因子(除了1和它本身之外)则该数一定不是素数
实训题目
1、任意输入两个整数,求它们的最大公约数。
2、打印形状为直角三角形的乘法口诀。
3、输入一个包含有三个数字字符的字符串,把该字符串转换为整形数据输出。(如:输入字符串123,则输出整形数据123)
43数组的构造与应用
[实训目的及要求] 数组是一种构造类型,在解决问题中使用非常普遍,通过本次实训内容,使学生对数组类型有一个系统的认识,并能灵活的在具体问题中进行应用。
程序1:一个班有30个同学,通过键盘输入成绩,并打印输出,每行输出10个同学的成绩。
程序2:一个班有n个同学,通过键盘输入成绩,并进行以下处理:
(1)求平均成绩;(数组求和)
(2)添加m个同学的成绩;(数组添加)
(3)把不及格同学的成绩更新为60分;(数组更新)
(4)求成绩的最高分和最低分,并记住对应元素的下标;(数组求极值)
(5)对成绩进行排序。(数组排序)
两种基本算法:
1起泡法:将相邻两个数比较,小的调到前面。 2选择法:将前面的数和后面的所有数依次进行比较,记住小数的下标,当比较完一遍,用前面的数和该小数进行交换。
程序3:对已经排好序的成绩数组进行以下 *** 作:把一个新成绩按照顺序插入到数组的合适位置。(提高)。
算法分析:
1 从键盘接收一个数据,存入变量m;
2 根据变量m的大小进行定位,其对应下标为k;
3 把score[9]到score[k]的元素依次后移,为新数据腾出空间;
4 把m存入下标为k的空间中:score[k]=m;
5 输出处理完后的新数组。
程序4:编程实现求一个3行4列整型数组的平均数。
算法分析:
1定义一个二维数组a[3][4];
2为数组赋值;
3累加元素的和,存入变量s中;
4求平均数ave=s/12;
5输出平均数ave。
程序5:编程实现把一个三行三列的二维数组转置输出。
算法分析:
1定义一个二维数组a[3][3];
2为数组赋值;
3交换a[i][j]与a[j][i]的值;
4输出交换后的数组a。
程序6:某学习小组有4名同学,学习了5门课程,求每个同学的平均分和每门课程的平均分。
算法分析:
1定义一个二维数组score[5][6](最后一行和最后一列存放平均数);
2为数组赋值;
3求行平均数,把平均数存入score[i][5]中(i=0-3);
4求列平均数,把平均数存入score[4][j]中(j=0-4);
5输出整个数组。
程序7:从键盘输入一行字符,要求删除第一次出现的某个字符(要删除的字符也由键盘输入)。
算法分析:
1定义存放字符串的字符数组str和存放单个字符的字符变量ch;
2输入字符串str和要删除的字符ch;
3对要删除的ch定位;
4从该位置开始,开始把后续字符依次前移;
5检查字符串的结束标记。
程序8:编一程序,将两个字符串连接起来。
算法分析:
1定位:第一个字符串的‘\0’的位置;
2从‘\0’开始把第二个字符串的字符依次放入第一个字符串的后端,直至第二个字符串的‘\0’;
3检验第一个字符串的末端是否有结束符’\0’,若没有,修正所得的字符串,在它的末端加上‘\0’。
程序9:有三个字符串(长度不超过20),要求找出其中最大者。
算法分析:
1输入三个字符串,存入二维字符数组中;
2先取前两个字符串比较,找出大的存入string 数组中;
3用string和后续的依次进行比较,当出现比string的时更新string的值;
4输出string中的字符串。
实训题目
1、从键盘输入20个整型数据,统计其中正数的个数,并计算它们的求和。
2、把1000之内的素数存放在数组中,并输出素数的个数和各个素数。
3、在第一题的基础上找出最大数和最小数并输出对应的下标。
4、任意输入10个数据,对其进行排序(用选择法小到大)。
5、在第4题的基础上,从键盘上接收一个数据,如果该数不存在,把该数按照顺序放在数组中,若存在则把和该数相等的元素删除。
6、某学习小组有4名同学,学习了5门课程,编程求出最高分和最低分及其对应的行号和列号。
7、输入一行字符,统计字母、数字、空格和其它字符的个数。
44 函数的应用
[实训目的及要求] 函数体现了程序设计的模块化思想,可以把复杂的问题简单化,并可实现代码共享。通过本次实训内容,使学生对函数的定义及应用能系统认识,并能熟练地在编程中体现出来。
程序1:利用自定义函数输出两个数中的大数。
程序2:编写以下功能函数,并写出main()函数。
(1)求两个数的和
(2)求两个数的差
(3)求两个数的积
(4)求两个数的商
程序3:用递归法计算n!(通过函数的递归调用计算阶乘)
算法分析:
递归数学模型
程序4:编写函数实现由小到大排序。
算法思路:
1.多个数据用数组存放,在主函数中接收数据。
2.把数据传送到用户自定义函数中。
3.在用户自定义函数中实现排序过程。
4.在主函数中输出排好序的数据。
实训题目
1、定义函数fun_a()判断某数是否为素数,若是素数返回值为1,不是则返回值为0。
2、编写一个加减乘除运算的小系统,当输入为0时退出,用函数实现各项功能。
1---------加法
2---------减法
3---------乘法
4---------除法
0---------退出
请输入你的选择(0-4):
3、编写函数实现求一维数组最大数的功能。
4、编写函数实现字符串连接功能。
5、模块二:综合实训
总 要 求
1、分组讨论,全面透彻的认识问题;
2、找出问题的解决算法;
3、根据算法画出流程图;
4、根据流程图写出代码。
51 综合设计一
一、编程打印所有的水仙花数,所谓水仙花数是指一个3位数,其各位数字立方和等于该数本身。如:153是水仙花数,因为153=1^3+5^3+3^3。
本实训要求
1、正确定义变量及正确使用算术运算符;
2、采用合适的程序控制结构完成所需的功能;
3、选择合适的算法,以最优的方式实现设计;
4、深刻理解循环结构和分支结构的用法。
二、猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃掉了一半,还不过瘾,又多吃了一个。第二天早上又将剩下的吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上再吃时,就只剩下一个桃子了。求第一天共摘下多少个桃子。
52 综合设计二
编程实现任意输入年月日,计算出该天是当年的第几天。如:
请输入日期(年月日的格式):2007 1 31
该天是本年的第31天。
本实训要求
1、正确定义数组并能进行合理的初始化 *** 作;
2、熟练掌握访问数组的方法及引用方式;
3、深刻理解数组在应用过程中的重要作用。
53 综合设计三
按要求打印杨辉三角形。编写一个函数yang(int n),按参数n的要求打印出杨辉三角。
例如:n=4,则杨辉三角的输出形式为:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
54 综合设计四
约瑟夫问题。M个人围成一个圈,从第一个人开始报数,数到n的人出去。再由下一个人开始报数,数到n的人出去。……打印出出圈的人的编号。M值预先选定,n的值由键盘输入。
例如:M=8,n=5
依次出去的编号是:5,2,8,7,……。
55 综合设计五
1写几个函数:(1)输入10个职工的姓名和职工号;(2)按职工号由小到大排序,姓名顺序也随之调整;(3)要求输入一个职工号,用折半查找法找出该职工的姓名。从主函数输入要查找的职工号,输出该职工姓名。
2Hanoi(汉诺塔)问题。这是一个古典的数学问题,是一个只有递归方法解决的问题。问题是这样的:古代有一个梵塔,塔内有3个座A、B、C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到C座,但每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。有移动过程中可以利用B座,要求编写程序打印出移动的步骤。
最受大家推崇的 Python 书籍有哪些?
GitHub上有一位叫皮埃尔·德·沃尔夫(Pierre de Wulf)的童鞋,通过以下方法,检索到了25本网上引用最多的 Python 书籍。
检索方法:
1在搜索引擎检索相关词语;
2爬虫爬取检索结果;
3检索结果去重;
4根据页面标题快速删除不符条件的链接;
5浏览器访问链接,并通过CSS选择器提取文章标题;
6统计引用次数……(检索方法的详解版见文末传送门)
一起看看都有哪些经典 Python 书吧~
希望这些经典的 Python 书籍能够让题主的 Python 学习之路更高效,更踏实!
1《Python学习手册(第4版)》
作者: [美] Mark Lutz
——内容简介——
这本书全面、深入地介绍了 Python 语言,不管你是编程新手还是 Python 初学者,它将帮助你快速实现使用 Python 编写高质量,且易于与其他语言和工具集成的代码。本书每一章都是关于Python语言独立的内容,并且带有练习和测试,简单易学,适合入门。
因为工作了经常要用到Python,才开始真正学习起来,可以说是目前市面上最好的Python技术书。
——豆瓣评价
2《Python Cookbook 中文版(第 3 版)》
作者:[美]David Beazley, Brian K Jones
——内容简介——
这本独特的“食谱”介绍了 Python 语言应用在各个领域中的使用技巧和方法,其主题涵盖了数据结构和算法,字符串和文本,迭代器和生成器,数据编码与处理,模块和包,网络和Web编程,并发,实用脚本和系统管理,测试、调试以及异常,C语言扩展等等内容。
每个“配方”均包含可立即在项目中使用的代码示例,以及Python应用中常见的问题和通用的解决方案。非常适合具有一定编程基础的Python程序员阅读。
基础阶段所有的知识点结合起来就是一个项目。问题――解决方案――知识点。书写(阅读)逻辑与解决问题的逻辑是相反的。方法的使用,多写多试就行了。个人学习会纠结概念和思想,而实际应用主要是例子和业务逻辑。
——豆瓣评价
3《流畅的Python》
作者: [巴西] Luciano Ramalho
——内容简介——
Python的简单性可以使你快速提高生产力,但这通常意味着你没有使用它所提供的一切。
本书致力于帮助Python开发人员挖掘这门语言及相关程序库的优秀特性,避免重复劳动,同时写出简洁、流畅、易读、易维护,并且具有地道Python风格的代码。本书尤其深入探讨了Python语言的高级用法,涵盖数据结构、Python风格的对象、并行与并发,以及元编程等不同的方面。通过本书,Python程序员将全面学习如何精通Python 3。
对于想要扩充知识的中级和高级Python程序员来说,这本书是充满了实用编程技巧的宝藏。
——Daniel Greenfeld 和 Audrey Roy Greenfeld,Two Scoops of Django 作者
流畅的Python
4《Python编程:从入门到实践》
作者: [美] Eric Matthes
——内容简介——
本书是一本针对所有层次的 Python 读者而作的 Python 入门书。
全书分两部分:第一部分介绍用Python 编程所必须了解的基本概念,包括matplotlib、NumPy 和Pygal 等强大的Python 库和工具介绍,以及列表、字典、if 语句、类、文件与异常、代码测试等内容;第二部分将理论付诸实践,讲解如何开发三个项目,包括简单的 Python 2D 游戏开发,如何利用数据生成交互式的信息图,以及创建和定制简单的 Web 应用,并帮读者解决常见编程问题和困惑。
从编程小白的角度看,入门极佳。手把手教的感觉,却绝不啰嗦。什么叫入门书?一本书读下来,行文上不卡壳,逻辑上不跳跃,读者如爬楼梯,一步一步即可登楼。
——豆瓣读者
5《深入浅出Python(影印版)》
作者:Paul Barry
——内容简介——
你是否想学习 Python 而不用费心地看手册?
本书通过一种独特的超越语法手册的方式来帮助你学习Python。你将能够快速掌握 Python 的基础知识,然后扩展到持久化、异常处理、Web开发、SQLite、数据处理和Google应用引擎中去。你也将学会如何为 Android 编写移动应用,这要感谢Python带给你的强大能力。本书融合了完备的学习经验,它将帮助你快速成为一名真正的 Python 程序员。
超赞的入门书!有趣,有序,有重点;通过对一个案例设计的逐渐丰富把许多知识点都带了出来;涉及的应用面也很广。不过内容不够丰富,也不适合当作工具书来查阅。不过考虑到本系列图书的定位,已经写得真是超赞了!
——豆瓣评价
6《Python编程快速上手》
作者: [美]Albert Sweigart
——内容简介——
如果你花了数小时重命名文件或更新了数百个电子表格单元格,你就会知道像这样的任务多么繁琐。 但是,如果可以让你的计算机为你做这些事情呢?可能只用几分钟吧。
本书是一本面向实践的Python编程实用指南。你将学习 Python 的基础知识,并探索用 Python 丰富的模块库来执行任务,例如从网站上抓取数据,阅读PDF和Word文档以及自动执行单击和键入任务等。
通过阅读本书,读者将学会利用强大的 Python 语言和工具,并且会体会到 Python 编程的快乐。
讲的不错。编程就是要边看边练,这本书值得一看。
——豆瓣评价
购买
7《"笨办法"学Python 3》
作者: [美] Zed AShaw
——内容简介——
本书是一本 Python 入门书籍。作者 Zed Shaw 完善了这个堪称世上最好的 Python 学习系统。只要跟着学习,你就会和迄今为止数十万 Zed 教过的初学者一样获得成功。
这本书以习题的方式引导读者一步一步学习编程,从简单的打印一直讲到完整项目的实现,让初学者从基础的编程技术入手,最终体验到软件开发的基本过程。你将学会怎样阅读、编写、思考代码,以及如何用专业程序员的技巧来找出并修正错误。
从现在开始,当你犯错时,请在纸上写下你犯了什么样的错误。当你进行下一个练习时,请查看你上一次犯的错误,并尽量不要在新的错误中犯错。
——引自章节:练习7:更多印刷
8《利用Python进行数据分析》
作者:Wes McKinney
——内容简介——
本书由 Python pandas 项目创始人 Wes McKinney 亲笔撰写,详细介绍利用 Python 进行 *** 作、处理、清洗和规整数据等方面的具体细节和基本要点。虽然“数据分析”是本书的标题,但重点是Python编程,库和工具,而不是数据分析方法。这是数据分析所需的 Python 编程。
工具书,快速略读。挺好的。有需求再仔细翻。
——豆瓣评价
9《Effective Python:编写高质量 Python 代码的59个有效方法》
作者: [美]布雷特·斯拉特金(Brett Slatkin)
——内容简介——
用 Python 编写程序是相当容易的,所以这门语言非常流行。但若想掌握 Python 所特有的优势、魅力和表达能力,则相当困难,而且语言中还有很多隐藏的陷阱,容易令开发者犯错。本书可以帮你掌握真正的 Pythonic 编程方式,令你能够完全发挥出 Python 语言的强大功能,并写出健壮而高效的代码。
python进阶的书,虽然很薄但是很有收获。
——豆瓣评价
10《像计算机科学家一样思考Python (第2版)》
作者: [美] 艾伦 B 唐尼
——内容简介——
本书以培养读者以计算机科学家一样的思维方式来理解Python语言编程。贯穿全书的主体是如何思考、设计,以及开发的方法。
全书详细介绍了 Python 编程语言的方方面面,从基本的编程概念到函数,递归,数据结构和面向对象编程等等。每一章都配有术语表和练习题,方便读者巩固所学的知识和技巧。此外,作者针对每章所专注的语言特性,或者相关的开发问题,总结了调试的方方面面。
非常好的 Python 入门书,即使对编程一无所知的人也能相对容易地读懂,有编程基础自不必说,可以很快地读完。
——豆瓣评价
11《深入理解Python特性》
作者:[德]达恩·巴德尔(Dan Bader)
——内容简介——
这本书将通过简单的示例和分步说明来介绍 Python 的最佳实践以及 Python 代码的强大魅力。借助本书,你将专注于真正重要的实践技能,在 Python 的标准库中发现“隐藏的金子”,距离精通 Python 更近一步!
茴字的四种写法不是没有用的;对语言了解的越多,用起来越顺。
——豆瓣评价
12Python Machine Learning
作者:[美]Sebastian Raschka, Vahid Mirjalili
——内容简介——
本书是关于使用 Python 进行机器学习和深度学习的综合指南。 它既是分步教程,又是构建机器学习系统时不断翻阅的参考书。
本书包含清晰的注释,可视化效果和工作示例,深入介绍了基本上所有的机器学习技术。 虽然有些书只教您遵循说明,但在本书中,作者讲授了机器学习的原理,这使你可以自己构建模型和应用程序。
13Dive Into Python 3
作者: Mark Pilgrim
——内容简介——
有很多 python 开发人员需要学习将代码移植到python 3,而本书是为他们提供最新版本 python 介绍的最佳书籍。它独特的风格是先提供大量代码然后将其分解,非常适合希望快速了解新版本语言的现有开发人员。
重新翻看这本书,我真的认为它不是一个很好的入门选择,但是本入门后值得读的书。
——豆瓣评价
14《Python参考手册(第4版)》
作者: [美] David MBeazley
——内容简介——
本书是 Python 编程语言的权威参考指南,内容涉及核心 Python 语言和 Python 库的最重要部分,内容简洁扼要、可读性强。书中还包括了一些没有在 Python 官方文档或其他资料中出现过的一些高级主题的详细信息。
这一版在内容上进行了全面更新,介绍了 Python 26 和 Python 3 新引入的编程语言特性和库模块,同时还分析了Python程序员面临的如下难题:是应继续使用现有的 Python 代码,还是应制定计划将其移植到Python 3?
很好的参考手册,对于新手来说,常用的库都有涉及,推荐常备手边。
——豆瓣评价
15《Python编程(第4版)》
作者: 卢茨 (Mark Lutz)
——内容简介——
当掌握 Python 的基础知识后,你要如何使用 Python?本书为这门语言的主要应用领域提供了深度教程,譬如系统管理、GUI 和 Web,并探索了其在数据库、网络、前端脚本、文本处理等方面的应用。你将学到清晰、简洁明了的语法和编程技巧,并伴随大量的示例来展示正确的用法和惯例。
适合有经验的程序员看, 涉及范围很广, 内容偏高级。
——豆瓣评价
16《 Python 机器学习基础教程》
作者: [德]安德里亚斯·穆勒,[美]莎拉·吉多
——内容简介——
本书是机器学习入门书,以 Python 语言介绍。
书中重点讨论机器学习算法的实践而不是背后的数学,全面涵盖在实践中实现机器学习算法的所有重要内容,帮助读者使用 Python 和 scikit-learn 库一步一步构建一个有效的机器学习应用。
本书将向所有对机器学习技术感兴趣的初学者展示,自己动手构建机器学习解决方案并非难事!
机器学习的入门书,通过这本书可以对机器学习建立感性认识。如果只是学习机器学习的理论推导,无法深刻理解各种数据处理方法带来的效果,通过Scikit-Learn和这本书可以快速建立起这种理解。
——豆瓣评价
17Python in a Nutshell
作者: [美] Alex Martelli,Anna Ravenscroft,Steve Holden
——内容简介——
本书适合具有一定 Python 编程经验或者有其他语言编程基础的程序员阅读,它涵盖了广泛的应用领域,包括 Web和网络编程,XML处理,数据库交互以及高速数值计算。该实用手册的第三版提供了对该语言的快速参考(包括Python 35、27和36的亮点)。
对于涉及到的内部机制有一定的详细阐述而不是像很多入门书籍和大全书籍那样只有应用。对于想要透过表象更深入了解 Python 的读者,该书是一本很好的入门读物。
——豆瓣评价
18《Python游戏编程快速上手(第4版)》
作者: [美] Al Sweigart
——内容简介——
本书通过编写一个个小巧、有趣的游戏来教授Python编程,并且采用直接展示游戏的源代码并通过实例来解释编程的原理的方式。首先构建 猜数字 和 Tic Tac Toe 这样的经典游戏,然后逐步开发更高级的游戏,在此过程中,你将学习关键的编程和数学概念,这将帮助你在轻松有趣的过程中,掌握 Python 游戏编程的基本技能。
全书共21章,12个游戏程序和示例贯穿其中,介绍了Python基础知识、数据类型、函数、流程控制、程序调试、流程图设计、字符串 *** 作、列表和字典、笛卡尔坐标系、密码学基础、游戏AI模拟、动画图形、碰撞检测、声音和图像等方方面面的程序设计知识。
与一般的编程入门书不同,本书以练代学,在一个个小的游戏项目中逐步熟悉并掌握基本的python编程方法,有趣有效。
——豆瓣评价
19《Python袖珍指南》
作者:Mark Lutz
——内容简介——
对于新的Python 34 和 27 而言,这款便捷的袖珍指南是完美的实战快速参考书。你将会从中学习有关Python类型和语句,特殊方法名,内建函数与异常,常用的标准库模块及其他卓越的Python工具。
当做随身备忘手册吧,毕竟健忘。
——豆瓣评论
20《Python编程之美:最佳实践指南》
作者:[美] Kenneth Reitz,Tanya Schlusser
——内容简介——
本书是 Python 用户的一本百科式学习指南,本书由 Python 社区的大神 Kenneth Reitz 发起并组织编写,由社区数百名开发者集体奉献。其特色在于,近乎完整地总结了在 Python 编程中会用到的各种实践技巧和经验,涵盖众多主流的应用场景,并告诉你如何提高效率、避免踩坑、编写高质量的代码。
本书着重于可重用的代码,重于设计理念,将读者引向已存在的优秀资源,适合有一定Python基础的人员学习,帮助你迅速从小工修炼成专家,编写出高质量的代码!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)