还剩58页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
编程语言教学课件欢迎各位同学参加编程语言课程学习!本课程将带领大家探索编程的奇妙世界,从基础的C语言开始,逐步过渡到C++、Java和Python等现代编程语言我们将系统地学习各种编程概念、语法结构和实际应用,培养大家的编程思维和实践能力无论您是编程新手还是有一定基础的学习者,本课程都将为您提供清晰的学习路径和丰富的实践机会通过本课程的学习,您将能够掌握多种编程语言的核心知识,为未来深入学习计算机科学和软件开发奠定坚实基础课程概述课程目标学习内容掌握多种编程语言的基础知识课程内容涵盖C、C++、Java和核心概念,培养编程思维和和Python等主流编程语言,从问题解决能力,能够独立完成基本语法到高级特性,包括数基础的程序设计任务通过系据类型、控制结构、函数、数统学习,建立完整的编程知识组、指针、面向对象编程等核体系,为进一步学习和应用奠心知识点,同时介绍算法设计、定基础网络编程和数据库操作等应用领域考核方式采用多元化考核方式,包括平时作业(30%)、实验报告(20%)、课程设计(20%)和期末考试(30%)重视理论与实践结合,评估学生的知识掌握程度和实际应用能力编程语言简介什么是编程语言1编程语言是用于编写计算机程序的形式语言,是人与计算机沟通的桥梁它由一套语法规则和语义规定组成,允许程序员精确地定义计算机应执行的操作和数据处理方式编程语言的发展历史2从20世纪40年代的机器语言和汇编语言,到50年代的高级语言如FORTRAN和COBOL,再到70年代的C语言,90年代的Java,直至现代的Python和Rust等,编程语言经历了从低级到高级、从面向过程到面向对象的演变过程常见编程语言类型3编程语言可分为多种类型低级语言(如汇编语言)和高级语言(如C++、Java);编译型语言(如C、C++)和解释型语言(如Python、JavaScript);命令式语言、函数式语言和逻辑式语言等,每种类型都有其特定的应用场景语言概述C语言的特点CC语言是一种通用的、过程式的编程语言,具有高效、可移植、功能强大、代码精炼等特点它提供了丰富的数据类型和运算符,支持多种控制结构,允许直接访问内存,是系统级开发的重要工具语言的应用领域CC语言广泛应用于操作系统开发(如UNIX、Linux)、嵌入式系统编程、硬件驱动程序、系统工具和数据库系统等它是许多高级语言的基础,对计算机科学的发展有着深远影响为什么学习语言C学习C语言有助于理解计算机系统的底层工作原理,培养严谨的编程思维C语言是许多其他语言的祖先,掌握它有助于学习其他编程语言同时,C语言在就业市场上一直有着稳定的需求开发环境搭建环境配置安装IDE配置开发环境,设置编译器路径、包含目录和编译器选择安装集成开发环境IDE以提高编程效率推荐库文件位置确保IDE能够正确识别编译器和为C语言开发选择合适的编译器,如GCC的IDE包括Visual StudioCode(搭配C/C++扩标准库测试安装是否成功,可以编写并运行(GNU CompilerCollection)是Linux和展)、Code::Blocks、Dev-C++或CLion等一个简单的Hello World程序进行验证macOS上的首选,而Windows用户可以使用这些工具提供代码编辑、自动补全、调试功能MinGW或Visual C++编译器编译器负责将C等,大大简化开发过程源代码转换为可执行文件第一个程序CHello World程序程序结构解析下面是经典的C语言Hello World程序该程序包含以下关键部分•预处理指令#include引入标准输入输出#include库•main函数程序的入口点,所有C程序必须int main{有printfHello,World!\n;•函数体花括号内的代码,包含printf函数return0;调用}•return语句表示程序正常结束这是学习任何编程语言的第一步,展示了程序的基本结构编译运行过程C程序的执行要经过以下步骤•预处理展开头文件和宏定义•编译将源代码转换为目标代码•链接将目标代码与库函数链接•执行运行生成的可执行文件基本数据类型浮点型浮点型用于表示实数整型•float单精度浮点数,4字节•double双精度浮点数,8字节整型用于表示整数值,包括•long double扩展精度浮点数•int基本整型,通常为4字节•short短整型,通常为2字节字符型•long长整型,通常为4或8字节char类型用于表示字符•unsigned无符号修饰符,用于表示非•占用1字节内存负数•可以存储ASCII码•也可以作为小整数使用•有signed和unsigned两种变体变量与常量变量定义和初始化常量的使用命名规则变量是计算机内存中存储数据的命名空间常量是不可修改的固定值,可通过以下方C语言的标识符(变量名、函数名等)必在C语言中,变量必须先声明后使用,声式定义须遵循以下规则明时需指定数据类型•只能包含字母、数字和下划线//使用#define预处理指令•必须以字母或下划线开头int age;//声明变量#define PI
3.14159int height=175;//声明并•区分大小写初始化//使用const关键字•不能使用关键字(如if,for等)float weight=
68.5,bmi;//const doublee=
2.71828;•应采用有意义的命名,反映其用途多个变量//字面常量变量的作用域取决于其声明位置,局部变hello//字符串常量量在函数内有效,全局变量在整个程序中42//整型常量有效
3.14//浮点常量运算符类别运算符描述示例算术运算符+,-,*,/,%基本的数学运算a+b,a*b,a%b关系运算符==,!=,,,=,=比较两个值的关系a==b,ab逻辑运算符,||,!执行逻辑AND、ab,!aOR和NOT操作赋值运算符=,+=,-=,*=,/=,将值赋给变量a=5,a+=2%=自增自减++,--将变量值增加或减a++,--b少1位运算符,|,^,~,,对整数的二进制位ab,a2进行操作表达式与语句表达式的构成语句类型复合语句表达式是由操作数和运算语句是程序的基本执行单复合语句是用花括号{}包符组成的序列,用于计算元,C语言中主要有以下围的语句序列,作为一个值操作数可以是常量、类型的语句整体处理它常用于需要变量或函数调用,运算符多条语句但语法上只允许•表达式语句表达式指定对操作数执行的操作一条语句的场合,如if条件后加分号,如x=5;表达式可以简单如单个变体或循环体复合语句内•控制语句if,switch,量(如x),也可以复杂如可以定义局部变量,这些for,while等多项运算(如a*b+c/变量的作用域仅限于该复d)•跳转语句break,合语句内continue,return等•复合语句用花括号包围的语句块•空语句只有一个分号的语句输入输出函数1scanf函数2printf函数scanf是C语言的标准输入函数,用于从printf是C语言的标准输出函数,用于向标准输入(通常是键盘)读取数据其基标准输出(通常是屏幕)打印数据其基本语法为scanf格式控制字符串,变量本语法为printf格式控制字符串,表达1,变量2,...例如,scanf%d%f,式1,表达式2,...例如,printfThenum,price会读取一个整数和一个浮sum is%d,sum会打印整数sum的值点数注意需要使用地址运算符,但字printf能够处理多种数据类型,并支持丰符数组名除外富的格式控制3格式控制符格式控制符用于指定数据的输入输出格式,以%开头,常见的有•%d整数•%f浮点数•%c字符•%s字符串•%x十六进制还可以指定宽度、精度和对齐方式,如%
10.2f表示宽度为10,小数点后保留2位的浮点数选择结构(上)if语句if语句是最基本的选择结构,用于在条件为真时执行特定代码块语法为if条件表达式{//条件为真时执行的代码}条件表达式的结果必须是一个逻辑值,非零值被视为真,零被视为假if-else语句if-else语句提供了两种执行路径,条件为真时执行一个代码块,为假时执行另一个代码块if条件表达式{2//条件为真时执行的代码}else{//条件为假时执行的代码}嵌套if语句嵌套if语句是在if或else内部再包含if语句,用于处理多条件情况if条件1{if条件2{//条件1和条件2都为真3}else{//条件1为真,条件2为假}}else{//条件1为假}选择结构(下)switch语句用于多分支选择,基于表达式的值选择执行路径break和default的使用break终止switch执行,default处理未匹配情况选择结构的嵌套在if或switch内部嵌套其他选择语句处理复杂条件switch语句允许基于变量的不同值执行不同的代码块语法如下switch表达式{case常量1:语句序列1;break;case常量2:语句序列2;break;default:默认语句序列;}表达式必须是整型或字符型,每个case后跟一个常量值执行时,表达式的值与各case值比较,若匹配则执行对应语句序列直到遇到break或switch结束若无匹配,则执行default部分(如果有)如果省略break,会继续执行下一个case,这称为穿透(fall-through)循环结构(上)while循环do-while循环循环的执行流程while循环是最基本的循环结构,语法为do-while循环与while类似,但保证循环体至少循环执行流程可分为三个部分执行一次,语法为•初始化在循环开始前设置初始条件while条件表达式{•条件测试决定是否执行循环体//循环体do{}//循环体•更新修改循环变量,为下次条件测试做准备}while条件表达式;执行流程良好的循环设计应该有明确的终止条件,避免无执行流程限循环循环体内应该包含使循环最终终止的代•先测试条件表达式码,例如递增或递减循环变量•执行循环体•若为真,执行循环体,然后返回第1步•测试条件表达式•若为假,跳过循环体,执行循环后的语句•若为真,返回第1步while循环特点是先判断后执行,如果条件一开•若为假,循环结束始就为假,循环体一次也不会执行do-while循环的特点是先执行后判断,无论条件如何,循环体至少执行一次循环结构(下)for循环循环嵌套集初始化、条件测试和更新于一体的循环结构在循环内部包含另一个循环,形成多层循环continue语句break语句跳过当前迭代的剩余部分,进入下一次迭代立即终止当前循环,继续执行循环后的语句for循环是最灵活的循环结构,适合已知迭代次数的情况语法如下for初始化表达式;条件表达式;更新表达式{//循环体}执行流程先执行初始化表达式;然后测试条件表达式,若为真则执行循环体,若为假则结束循环;执行完循环体后执行更新表达式,再返回条件测试for循环的三个表达式都可以省略,但分号必须保留,如for;;表示无限循环数组(上)一维数组的定义和使用数组初始化数组作为函数参数数组是相同类型元素的集合,通过下标访问各元素在数组可以在定义时进行初始化数组作为函数参数时,实际传递的是数组首元素的地址,C语言中,数组定义语法为而非整个数组副本int numbers
[5]={10,20,30,40,50};类型名数组名[元素个数];void processArrayintarr[],int size{如果初始化值数量少于数组大小,剩余元素会被初始化forint i=0;isize;i++{例如int scores
[100];定义了一个包含100个整数的数为0arr[i]*=2;//修改会影响原数组组}可以省略数组大小,由初始化列表决定}数组下标从0开始,访问元素使用数组名和方括号中的索引,如scores
[0]、scores
[99]int days[]={31,28,31,30,31,30,31,调用函数时只需传递数组名和大小31,30,31,30,31};int values
[5]={1,2,3,4,5};processArrayvalues,5;数组(下)20二维数组的维度下标起始值二维数组可视为数组的数组,有行和列两个维度C语言中所有数组的下标都从0开始计数26\0英文字母数字符串结束符字符数组常用于存储英文字母,标准ASCII表中共有26个字母C语言中字符串以空字符\0结尾,占用一个额外字节二维数组的定义语法为类型名数组名[行数][列数];例如,int matrix
[3]
[4]定义了一个3行4列的整型二维数组访问元素使用两个下标,如matrix
[1]
[2]访问第2行第3列的元素(因为下标从0开始)字符数组是一种特殊的数组,用于存储字符序列C语言中的字符串实际上是以空字符\0结尾的字符数组,例如char name
[20]=Zhang San;这里需要注意数组大小至少要比字符串长度大1,以存储结束符C语言提供了丰富的字符串处理函数,如strlen、strcpy、strcat等,需要包含头文件函数(上)函数的定义和调用函数是执行特定任务的代码块,可以重复使用函数定义的一般形式为返回类型函数名参数列表{函数体}函数调用通过函数名和参数进行,如result=adda,b函数参数传递C语言中函数参数传递有两种方式值传递和地址传递值传递将实参的副本传给形参,修改形参不影响实参;地址传递(通过指针)则允许函数修改调用者的变量函数原型函数原型告诉编译器函数的名称、返回类型和参数类型,通常放在头文件或源文件开头形式为返回类型函数名参数类型列表;函数原型让编译器可以在定义前调用函数函数(下)局部变量和全局变量递归函数内置函数局部变量在函数内部定义,只在函数内部可递归是函数调用自身的过程递归函数通常C标准库提供了许多内置函数,如math.h中见,函数执行结束后会被销毁全局变量在由两部分组成基本情况(终止条件)和递的数学函数(sqrt,sin,cos),函数外部定义,所有函数都可以访问,程序归情况经典示例如计算阶乘n!=n*n-string.h中的字符串处理函数(strlen,结束时才被销毁当局部变量和全局变量同1!递归必须有终止条件,否则会导致无限strcpy,strcmp),stdlib.h中的通用函名时,局部变量会覆盖全局变量递归和栈溢出错误数(malloc,free,rand)等使用这些函数需要包含相应的头文件指针基础指针的概念指针是一种特殊的变量,存储的是内存地址,而不是数据本身通过指针,可以间接访问和修改特定内存位置的数据指针是C语言的强大特性,但也是复杂性和潜在错误的来源理解指针需要掌握存储地址和指向数据的概念指针变量的定义和使用指针变量定义时需要指定其指向的数据类型类型名*指针变量名;例如int*p;定义了一个指向整型的指针主要操作包括运算符获取变量地址,*运算符解引用(访问指针指向的值)示例p=a;将变量a的地址赋给p,*p=10;通过p修改a的值指针与数组的关系数组名本质上是指向数组第一个元素的指针常量数组元素可以通过指针加偏移量访问*arr+i等价于arr[i]指针变量可以移动(如p++),而数组名不能修改指针算术运算考虑数据类型大小,如p+1实际上是加上一个元素的大小,而不是1字节指针进阶1指针与函数2指针数组指针作为函数参数可以实现传址调用,使函数能够指针数组是元素为指针的数组,可用于存储多个字修改调用者的变量符串或其他数据对象的地址void swapint*a,int*b{char*fruits[]={apple,banana,int temp=*a;orange};*a=*b;*b=temp;这里fruits是一个指针数组,包含三个指向字符串常}量的指针,访问第一个字符串printf%s,fruits
[0];调用时需传入变量地址swapx,y;指针数组在处理多个相关对象时非常有用,如命令函数也可以返回指针,但需要确保返回的地址在函行参数char*argv[]数结束后仍然有效,避免返回局部变量的地址3多级指针指针变量的地址可以存储在另一个指针中,形成多级指针int x=10;int*p=x;//指向整数的指针int**pp=p;//指向指针的指针通过解引用操作可以层层访问数据**pp等同于*p等同于x多级指针常用于动态分配二维数组,或在函数中修改指针变量本身结构体结构体的定义和使用结构体数组结构体指针结构体是C语言中用户自定义的复合数据类型,可以结构体数组是元素为结构体的数组,用于处理相同类结构体指针是指向结构体的指针,可以用于动态分配将不同类型的数据组合在一起结构体定义的基本语型的多个结构体对象结构体内存或作为函数参数法为struct Studentclass
[50];//50个学生的数组struct Student*ps=s1;//指向结构体的指针struct结构体名{成员类型1成员名1;访问和操作结构体数组元素通过结构体指针访问成员时使用箭头-运算符成员类型2成员名2;//...class
[0].id=101;ps-id=102;//等同于*ps.id=102;};class
[0].name=Wang Lei;printf%s\n,ps-name;class
[0].score=
95.5;定义结构体变量并访问其成员结构体作为函数参数时,通常使用指针传递,以避免forint i=0;i50;i++{复制整个结构体数据struct Students1;printf%s:%.1f\n,class[i].name,s
1.id=101;class[i].score;void updateScorestructStudent*s,s
1.name=Wang Lei;}float newScore{s
1.score=
95.5;s-score=newScore;}访问结构体成员使用点.运算符共用体与枚举共用体的概念和使用枚举类型的定义共用体union是一种特殊的数据类型,允许在同一内存位置存储不同类型的枚举enum是C语言中的用户定义类型,用于定义命名的整型常量集合枚数据共用体的所有成员共享同一块内存,因此同一时刻只能有一个成员保举使程序更易读,并提供编译时类型检查默认情况下,枚举常量从0开始持有效值共用体的大小由最大成员的大小决定递增,也可以显式指定值union Data{enum Weekday{int i;Monday,//值为0float f;Tuesday,//值为1char str
[20];Wednesday,//值为2};Thursday,//值为3Friday,//值为4union Datadata;Saturday,//值为5data.i=10;//使用整型成员Sunday//值为6printf%d\n,data.i;//输出10};data.f=
3.14;//现在使用浮点成员,整型成员的值被覆盖enum Weekdaytoday=Wednesday;printf%f\n,data.f;//输出
3.14iftoday==Wednesday{printf今天是星期三\n;}应用场景共用体常用于以下场景•需要节省内存空间•数据需要多种不同解释(如网络数据包)•实现类型安全的类型转换枚举常用于以下场景•表示一组相关的常量(如月份、颜色)•提高程序可读性,替代神秘数字•实现简单的状态机•定义错误码或返回状态文件操作文件的打开和关闭C语言通过中的函数操作文件打开文件使用fopen函数,它返回一个FILE指针FILE*fp=fopendata.txt,r;//只读模式打开第二个参数指定打开模式•r-只读•w-写入(创建新文件或覆盖)•a-附加(在文件末尾写入)•r+-读写•b-二进制模式(如rb,wb)使用完文件后,必须关闭fclosefp;文件的读写操作文件读写有多种函数字符级操作int ch=fgetcfp;//读取一个字符fputcA,fp;//写入一个字符行级操作char line
[100];fgetsline,100,fp;//读取一行fputsHello\n,fp;//写入一行格式化读写int id;char name
[50];fscanffp,%d%s,id,name;//格式化读取fprintffp,ID:%d,Name:%s\n,101,Zhang;二进制读写预处理命令预处理是C程序编译过程的第一阶段,由预处理器执行预处理命令以#开头,不是C语言语句,因此不需要分号结束#include指令用于包含头文件,有两种形式#include文件名用于系统头文件,如#include;#include文件名用于自定义头文件,如#includemylib.h#define指令用于定义宏,有简单替换和带参数两种形式简单替换如#define PI
3.14159;带参数的宏如#define MAXa,b aba:b宏可以提高代码效率和可维护性,但复杂宏可能导致难以预料的问题条件编译指令包括#if、#ifdef、#ifndef、#else、#elif和#endif,用于根据条件选择性编译代码常用于跨平台代码适配、调试代码控制、避免头文件重复包含(通过#ifndef HEADER_H配合#define HEADER_H)等场景动态内存分配malloc和free函数malloc函数从堆上分配指定字节数的内存,返回void*类型指针,需要转换为适当类型int*p=int*malloc10*sizeofint;//分配10个整数的空间ifp==NULL{printf内存分配失败\n;exit1;}使用完内存后,必须用free函数释放,否则会导致内存泄漏freep;//释放内存p=NULL;//避免悬挂指针calloc和realloc函数calloc函数分配内存并初始化为零int*p=int*calloc10,sizeofint;//分配10个整数,全部初始化为0realloc函数调整已分配内存的大小p=int*reallocp,20*sizeofint;//扩展到20个整数如果原地扩展不可能,realloc会分配新内存、复制数据并释放旧内存如果分配失败,原指针保持有效内存管理注意事项•总是检查内存分配是否成功•每次malloc/calloc必须有对应的free•避免在内存释放后使用指针(悬挂指针)•避免内存泄漏(忘记释放)•避免重复释放同一内存•避免缓冲区溢出(写入超出分配范围)•分配大内存前检查是否必要•考虑使用专业内存管理库链表链表的基本操作插入、删除、遍历和查找节点单链表的实现链表节点定义和创建操作链表应用实例实现栈、队列和动态数据管理链表是一种动态数据结构,由节点构成,每个节点包含数据和指向下一节点的指针单链表的节点结构定义如下struct Node{int data;//数据域struct Node*next;//指针域,指向下一节点};链表的主要操作包括创建链表,在链表头/尾/中间插入节点,删除节点,查找节点,遍历链表以及销毁链表相比数组,链表插入和删除操作效率高(O1复杂度),但随机访问效率低链表特别适合频繁插入删除而较少随机访问的场景算法基础算法的概念时间复杂度和空间复杂度常见算法类型算法是解决特定问题的明确步骤序列时间复杂度衡量算法执行时间随输入规常见的算法类型包括排序算法(如冒好的算法应具备五个特性输入(有零模增长的速率,通常用大O表示法,如泡、选择、插入、归并、快速排序)、个或多个输入)、输出(至少有一个输O1常数时间、Olog n对数时间、On查找算法(如顺序查找、二分查找、哈出)、确定性(每步操作明确定义)、线性时间、On log n、On²平方时间希查找)、图算法(如最短路径、最小有限性(在有限步骤内终止)和有效性等空间复杂度衡量算法运行所需额外生成树)、字符串处理算法、密码学算(每步操作可以实际执行)算法设计空间随输入规模增长的速率实际应用法、数值计算算法以及分治法、贪心法、需要考虑正确性、可读性、健壮性、效中需平衡时间和空间效率,根据具体场动态规划等算法设计范式不同类型的率和最优性景选择合适的算法算法适用于不同的问题领域排序算法冒泡排序选择排序插入排序冒泡排序是最简单的排序算法,通过重复比选择排序的基本思想是每次从未排序部分插入排序模拟了人们整理扑克牌的过程将较相邻元素并交换它们的位置实现排序其选择最小元素,放到已排序部分的末尾它一张新牌插入到已排好序的牌中它将数组基本思想是每次遍历数组,比较相邻元素,将数组分为已排序区和未排序区,每次在未分为已排序和未排序两部分,每次取出未排将较大元素冒泡到后面时间复杂度为排序区中找出最小(或最大)元素,与未排序部分的第一个元素,插入到已排序部分的On²,空间复杂度为O1虽然效率不高,序区的第一个元素交换时间复杂度为适当位置平均时间复杂度为On²,但对但实现简单,适用于小数据集或基本有序的On²,空间复杂度为O1相比冒泡排序,于接近有序的数据,性能接近On空间复数据选择排序减少了交换次数杂度为O1,适合小规模或基本有序的数据集查找算法顺序查找从头到尾逐一比较元素,适用于无序数据集二分查找2在有序数据集中比较中间元素来缩小查找范围哈希查找通过哈希函数直接计算元素位置,实现常数时间查找顺序查找(Linear Search)是最基本的查找算法,从列表的第一个元素开始,按顺序依次比较,直到找到目标元素或遍历完整个列表时间复杂度为On,空间复杂度为O1虽然效率不高,但适用于任何数据集,尤其是小型或无序数据集二分查找(Binary Search)要求数据集必须有序其基本思想是将目标值与数组中间元素比较,若相等则找到;若小于中间元素,则在左半部分继续查找;若大于中间元素,则在右半部分继续查找时间复杂度为Olog n,空间复杂度为O1(迭代版)或Olog n(递归版)二分查找在大型有序数据集中非常高效哈希查找(Hash Search)利用哈希表数据结构,通过计算哈希函数将关键字映射到表中位置,实现平均O1时间复杂度的查找哈希查找的核心是设计良好的哈希函数和冲突解决机制(如链地址法或开放地址法)它在需要频繁查找、插入和删除的场景中表现出色,是字典和集合实现的基础程序设计方法自顶向下的设计方法1从总体目标分解到具体模块和功能模块化程序设计将程序划分为独立、可复用的功能单元结构化程序设计3使用顺序、选择和循环三种基本结构自顶向下的设计方法从整体问题出发,逐步分解为更小、更易管理的子问题这种方法先确定程序的主要功能和整体结构,然后详细设计各个模块优点是便于理解整体架构,适合大型复杂系统;缺点是可能忽略底层实现细节实践中,通常结合自底向上的方法,从两个方向同时开发模块化程序设计将程序划分为相对独立的模块,每个模块完成特定功能,通过明确的接口相互调用模块化设计提高了代码的可维护性、可复用性和可靠性,便于多人协作开发良好的模块化设计应具有高内聚(模块内功能紧密相关)和低耦合(模块间依赖性低)的特点结构化程序设计强调使用三种基本控制结构顺序结构(语句按顺序执行)、选择结构(if-else,switch-case)和循环结构(for,while,do-while)这种方法避免使用goto语句和不规范的控制流,使程序逻辑清晰,易于理解和维护结构化设计是现代程序设计的基础,但随着面向对象编程的发展,已经融入更广泛的设计范式中代码规范命名规范注释规范代码格式化良好的命名是提高代码可读性的关键变量、注释应当解释为什么而不仅仅是做了什么,一致的代码格式有助于提高可读性和可维护函数和类的命名应当清晰表达其用途和含义,后者通常从代码本身就能看出良好的注释性关键的格式化规则包括避免使用晦涩缩写常见的命名风格包括实践包括•使用一致的缩进(通常是2-4个空格)•为每个函数编写文档注释,说明其功能、•在运算符前后、逗号后添加空格•驼峰命名法(camelCase)第一个单词参数和返回值•每行不超过80-120个字符首字母小写,其后单词首字母大写,如•解释复杂算法或不直观的代码逻辑•花括号的位置保持一致(同一行或下一行)studentName•说明代码中的假设、限制或潜在问题•帕斯卡命名法(PascalCase)每个单•使用TODO或FIXME标记需要改进的地方•相关代码块之间保留空行词首字母大写,如StudentName•下划线命名法(snake_case)单词间用许多IDE和编辑器提供自动格式化功能,团队注释应当与代码同步更新,过时的注释比没下划线连接,如student_name可以共享格式化配置文件确保一致性考虑有注释更有害避免无意义的注释,如仅重使用代码风格检查工具(如C语言的lint)自不同项目可能采用不同的命名约定,关键是复代码中已经明显的内容动检测格式问题在整个项目中保持一致常量通常使用全大写字母和下划线,如MAX_SIZE调试技巧常见错误类型调试工具使用断点和单步执行编程中常见的错误可分为三类语法错误现代IDE通常内置强大的调试工具GDB断点是调试的核心功能,允许程序在特定位(编译器能检测,如缺少分号)、运行时错(GNU Debugger)是Linux下的标准调试置暂停执行设置断点后,可以检查变量值、误(程序执行时发生,如除零、空指针引用)器,提供断点设置、单步执行、变量查看等调用栈和程序状态单步执行包括步入和逻辑错误(程序运行但结果不正确)C功能Windows下可使用Visual Studio调(step into,进入函数内部)、步过(step语言常见的错误包括数组越界、内存泄漏、试器或WinDbg内存错误检测工具如over,执行整个函数)和步出(step out,悬挂指针、整数溢出、未初始化变量等养Valgrind可以帮助发现内存泄漏和越界访问执行完当前函数)条件断点只在满足特定成良好的编程习惯可减少这些错误性能分析工具如gprof可以找出程序瓶颈条件时触发,适合循环中的特定迭代数据善用这些工具能显著提高调试效率断点(观察点)在变量值改变时触发,有助于找出谁修改了特定变量版本控制Git基础常用Git命令1分布式版本控制系统,跟踪文件变更历史add,commit,push,pull,branch,merge等核心操作工作流程GitHub使用分支策略、代码审查和合并冲突解决代码托管、协作开发和项目管理平台Git是目前最流行的分布式版本控制系统,由Linux之父Linus Torvalds创建与集中式版本控制系统(如SVN)不同,Git允许开发者在本地拥有完整仓库副本,即使离线也能进行版本控制Git的核心概念包括仓库(repository)、提交(commit)、分支(branch)和远程(remote)基本的Git工作流程是在工作目录修改文件;使用git add将修改添加到暂存区;使用git commit将暂存区内容提交到本地仓库;使用git push将本地提交推送到远程仓库其他常用命令包括git pull获取远程更新;git branch创建分支;git checkout切换分支;git merge合并分支;git status查看工作区状态;git log查看提交历史GitHub是基于Git的代码托管平台,提供了Issues(问题跟踪)、Pull Requests(代码审查与合并请求)、Actions(持续集成/部署)等协作功能开发者通常会fork项目仓库,在自己的副本中开发,然后通过Pull Request提交贡献GitHub已成为开源项目的主要托管平台,也被许多企业用于私有开发熟练使用Git和GitHub是现代程序员的基本技能概述C++C++与C的区别面向对象编程思想C++的新特性C++是C语言的超集,在保面向对象编程是一种程序设现代C++(C++11及以后)引留C语言全部特性的基础上计范式,将数据和操作数据入了许多新特性,如自动添加了面向对象编程OOP的方法组织在对象中OOP类型推导auto、基于范围和泛型编程功能主要区别的核心概念包括封装(信的for循环、lambda表达式、包括C++支持类和对象、息隐藏,通过访问控制保护智能指针unique_ptr,函数重载、运算符重载、继数据)、继承(代码重用,shared_ptr、右值引用和移承、多态、泛型编程(模建立类之间的层次关系)和动语义、nullptr关键字、板)、异常处理以及标准模多态(同一接口不同实现,initializer_list、constexpr、板库STLC++引入了新的增强灵活性)这种范式帮std::thread等这些特性极关键字和语法特性,如助开发者更自然地对现实世大提高了C++的表达能力和namespace、引用类型、界进行建模,提高代码的可安全性,同时保持了高性能new/delete操作符等,并增维护性和可扩展性C++标准每三年更新一次,强了C语言的类型系统不断增加新功能类和对象类的定义对象的创建和使用成员函数和数据成员类是C++面向对象编程的基本单元,是数据和方法的封装类的定义对象是类的实例,创建对象的方式包括数据成员(属性)定义对象的状态,成员函数(方法)定义对象的行由两部分组成声明(通常在头文件中)和实现(通常在源文件中)为成员函数可以访问对象的所有成员(包括私有成员)声明在类类定义的基本语法为内部并定义在外部的成员函数语法为//栈上创建对象ClassName obj1;//默认构造class ClassName{ClassName obj2arg1,arg2;//带参数构造//类定义中声明private://私有成员,只能在类内部访问ClassName obj3={arg1,arg2};//列表初始化class Rectangle{//数据成员private://堆上创建对象double width,height;protected://保护成员,可被派生类访问ClassName*ptr1=new ClassName;//需手动释放public://数据和方法ClassName*ptr2=new ClassName
[10];//数组Rectangledouble w,double h;//使用完后释放double area;public://公有成员,可在任何地方访问delete ptr1;};//构造函数和析构函数delete[]ptr2;//公共方法//类外部定义,使用范围解析运算符::};Rectangle::Rectangledouble w,double h{访问对象成员使用点运算符.,通过指针访问使用箭头运算符-width=w;height=h;C++中还有一种特殊的类结构体struct,它与class的唯一区别是默}认访问权限为publicobj
1.method;//通过对象调用方法ptr1-method;//通过指针调用方法double Rectangle::area{return width*height;}特殊成员函数包括成员初始化器列表、内联成员函数、const成员函数和静态成员函数等构造函数和析构函数构造函数的作用和类型析构函数的作用初始化列表构造函数是创建对象时自动调用的特殊成员函数,用于初始析构函数是对象销毁时自动调用的特殊成员函数,用于释放构造函数初始化列表是在函数体执行前初始化成员的机制,化对象构造函数的特点名称与类名相同、无返回类型、资源、执行清理操作析构函数的特点语法为可以重载主要类型包括•名称为类名前加~,如~ClassName•默认构造函数无参数或所有参数都有默认值•无参数、无返回类型ClassName::ClassNameparams:member1value1,member2value2{•带参构造函数接受一个或多个参数•一个类只能有一个析构函数(不能重载)//构造函数体•拷贝构造函数以同类型对象为参数,创建副本•对象离开作用域或被delete时调用}•移动构造函数C++11接受右值引用参数,高效转移资•调用顺序与构造函数相反源使用初始化列表的优点析构函数对于管理动态分配的资源(如内存、文件、网络连•转换构造函数接受其他类型参数,实现隐式类型转换接)尤为重要良好的析构函数设计是防止资源泄漏的关键•直接初始化而非赋值,更高效如果没有定义任何构造函数,编译器会生成默认构造函数当类管理资源时,通常需要定义析构函数,以及拷贝构造函•常量成员和引用成员必须使用初始化列表在C++11之后,可以使用=default显式要求生成默认版本,数、拷贝赋值运算符,遵循三/五法则•对象成员的初始化(调用其构造函数)或使用=delete禁止特定构造函数•派生类调用基类构造函数成员初始化顺序取决于它们在类定义中的声明顺序,而非初始化列表中的顺序,这是一个常见的潜在问题继承与多态继承的概念和类型1继承是面向对象编程的核心机制之一,允许从现有类(基类)派生新类(派生类),重用和扩展其功能C++支持三种继承方式公有继承(is-a关系,派生虚函数和多态类对象可以用作基类对象)、保护继承和私有继承(has-a关系,实现上的重用)C++还支持多继承(从多个基类派生),但这可能导致菱形继承问题,通多态允许使用基类指针或引用调用派生类的方法C++通过虚函数实现多态,在常通过虚拟继承解决基类声明函数时使用virtual关键字当派生类重写(override)虚函数,并通过基类指针调用该函数时,会根据指针所指对象的实际类型决定调用哪个版本在运行时确定调用的函数称为动态绑定或晚绑定虚函数机制通过虚函数表抽象类和接口3(vtable)实现,每个含有虚函数的类都有一个vtable纯虚函数是没有实现的虚函数,用=0表示virtual voidfunc=0;包含至少一个纯虚函数的类称为抽象类,不能直接实例化,只能作为基类使用抽象类通常用于定义接口—派生类必须实现的功能集合C++没有显式的接口关键字(如Java的interface),但可以创建只包含纯虚函数的抽象类作为接口多继承在实现多个接口时特别有用运算符重载运算符重载的概念重载为成员函数和非成员函数运算符重载是C++的一个重要特性,允许运算符可以重载为类的成员函数或全局函自定义类的对象使用C++内置运算符(如数成员函数形式的运算符重载隐含有一+,-,*,/,=,==等)进行操作通过运算符个this指针作为左操作数,而全局函数需重载,可以使自定义类型的行为更接近内要显式提供所有操作数某些运算符(如置类型,提高代码的直观性和可读性例赋值=、下标[]、函数调用、成员访问-)如,可以定义复数类的加法运算符,使得必须重载为成员函数选择哪种形式取决两个复数对象可以像数字一样简单地相加于多种因素,包括操作的对称性和是否需complex1+complex2要访问私有成员对于双目运算符,如果左操作数可能是其他类型,应使用全局函数常见运算符重载示例常见的运算符重载包括算术运算符+,-,*,/、赋值运算符=、复合赋值运算符+=,-=、比较运算符==,!=,,、自增自减++,--、下标运算符[]、函数调用运算符、流操作符,等重载操作符时应保持其原有语义,例如+应表示某种加法操作,==应测试相等性重载操作符的返回类型通常应与操作符的预期行为匹配,例如比较操作符应返回bool模板模板是C++支持泛型编程的核心机制,允许编写与类型无关的代码函数模板使用通用类型参数定义算法,编译器会根据调用时的实际类型生成具体函数版本函数模板语法为template//或templateT maxTa,T b{return aba:b;}类模板允许定义通用的数据结构,如容器类模板语法类似函数模板,但在使用时必须显式指定模板参数例如templateclass Stack{private:T*elements;int size;int capacity;public:Stackint capacity=10;void pushconstT element;T pop;//...};异常处理try-catch语句try块中包含可能抛出异常的代码,catch块处理特定类型的异常基本语法try{//可能抛出异常的代码}catch ExceptionType1e1{//处理ExceptionType1类型的异常}catch ExceptionType2e2{//处理ExceptionType2类型的异常}catch...{//处理任何类型的异常}catch块按顺序匹配异常类型,派生类异常应先于基类捕获,以避免基类catch块屏蔽派生类catch块throw语句throw语句用于抛出异常,将控制权转移给最近的匹配catch块语法throw expression;//expression是要抛出的异常对象//例如:if divisor==0throw std::runtime_error除数不能为零;//重新抛出当前异常catch std::exception e{logErrore.what;throw;//不带参数表示重新抛出}未捕获的异常会导致程序终止,调用std::terminate函数C++17引入了嵌套异常,允许在处理一个异常时抛出新异常,同时保留原始异常信息异常处理机制C++异常处理基于栈展开stack unwinding机制当抛出异常时,程序从抛出点开始沿调用栈向上查找匹配的catch块在展开过程中,栈上的局部对象会被析构,保证资源正确释放这是RAII资源获取即初始化设计模式的基础异常规范exception specification在早期C++中用于声明函数可能抛出的异常类型,但由于实践问题,C++11引入了noexcept说明符,简单指示函数是否会抛出异常C++17起,动态异常规范throwtype已被弃用概述STL容器、算法、迭代器容器是STL的核心,分为序列容器vector,list,deque、关联容器set,map和无序容器unordered_set,unordered_map每种容器都有特定的性能特征和适用场景算法是独立于容器的通用函数,包括排序、搜索、转换和数STL的组成部分值运算等算法通过迭代器操作容器,实现了容器和算法的标准模板库STL是C++标准库的核心部分,包含六大组解耦件迭代器是连接容器和算法的桥梁,提供了类似指针的接口•容器Containers存储和组织数据的对象迭代器分为输入、输出、前向、双向和随机访问五种类型,•迭代器Iterators用于遍历容器元素的接口不同容器支持不同类型的迭代器•算法Algorithms对容器数据进行操作的函数STL的优势•函数对象Functors行为类似函数的对象•适配器Adapters修改接口的包装器使用STL的主要优势包括•分配器Allocators管理内存分配的对象•可复用性避免重复实现基本数据结构和算法•效率高度优化的实现,通常比自定义代码更高效•类型安全通过模板机制确保类型安全•一致性统一的接口设计,易于学习和使用•可扩展性可以自定义容器和算法与STL协同工作•跨平台标准库的一部分,确保可移植性常用容器vector listvector是最常用的STL容器,实现为动态数组主要特性list实现为双向链表,每个元素包含前向和后向指针主包括要特性•随机访问元素,常数时间复杂度O1•不支持随机访问,访问元素需要遍历,On复杂度•在末尾插入/删除元素,均摊常数时间复杂度•在任何位置插入/删除元素,常数时间复杂度O1•在中间插入/删除元素,线性时间复杂度On•内存不连续,迭代器在插入/删除操作后仍有效•内存连续,缓存友好,但可能因扩容导致重新分配•每个元素需要额外内存存储指针,空间开销较大适用场景需要频繁随机访问、主要在末尾添加/删除元适用场景需要频繁在任意位置插入/删除元素、迭代器素、需要内存连续性的场合常用操作push_back,稳定性重要的场合常用操作push_back,pop_back,at,[],size,reserve,resize push_front,pop_back,pop_front,insert,erase,splice,sortmap和setmap和set是关联容器,通常实现为红黑树map存储键值对,set只存储键主要特性•元素自动排序(按键的运算符)•查找、插入、删除操作的对数时间复杂度Olog n•不允许重复键(multimap和multiset允许)•map通过[]运算符或at访问值,set没有这些操作C++11引入了无序版本unordered_map和unordered_set,基于哈希表实现,提供平均常数时间复杂度的操作,但不保持排序适用场景需要快速查找和自动排序的场合,或需要映射关系的数据算法库查找算法排序算法其他常用算法STL提供了多种高效的查找算法,主要包括STL提供了多种排序和顺序相关的算法STL还包含许多其他有用的算法•find在范围内线性查找元素,返回第一个•sort对范围内元素进行排序,平均On•for_each对范围内每个元素应用函数匹配元素的迭代器logn复杂度•transform变换元素并存储结果•find_if使用谓词函数查找满足条件的元素•stable_sort稳定排序,保持相等元素的•copy/copy_if复制元素相对顺序•binary_search在有序范围内进行二分查•remove/remove_if移除元素(需配合找,返回布尔值•partial_sort部分排序,只排序前n个元素erase使用)•lower_bound/upper_bound在有序范•nth_element部分排序,使第n个元素处•replace/replace_if替换元素围内查找边界于正确位置•unique移除连续重复元素•count/count_if计算元素出现次数或满•reverse反转范围内元素的顺序•merge合并有序序列足条件的元素数量•shuffle随机打乱元素顺序•accumulate计算总和(在头文件中)•search查找子序列排序算法需要随机访问迭代器,因此主要用于C++17引入了并行算法执行策略,允许指定算法这些算法需要包含头文件,大多数接受迭代器范vector、deque等容器list提供了自己的sort成的执行方式(顺序、并行或向量化),进一步提围作为参数,因此可用于任何容器对于关联容员函数排序算法可通过提供自定义比较函数或高性能C++20引入了范围库Ranges,提供更器,通常应优先使用成员函数版本的查找方法,函数对象来控制排序规则C++11引入的lambda简洁、更有表现力的算法接口它们利用容器特定的优化表达式使得定义排序规则更加简洁语言简介JavaJava的特点平台无关、面向对象、安全可靠、高性能JDK、JRE和JVM开发工具包、运行环境和虚拟机构成Java平台Java程序的编译和运行3源代码编译为字节码,在JVM上解释执行Java是由Sun公司(现为Oracle)开发的一种广泛使用的编程语言,具有许多突出特点首先,Java是平台无关的一次编写,到处运行的理念使其成为跨平台开发的理想选择其次,Java是完全面向对象的,除了基本数据类型外,所有内容都是对象此外,Java提供了自动内存管理(垃圾回收),消除了手动内存分配和释放的麻烦,提高了程序稳定性Java平台由三个主要组件构成JDK(Java DevelopmentKit)是面向开发者的软件开发包,包含编译器、调试器和开发工具;JRE(Java RuntimeEnvironment)是运行Java程序所需的环境,包含JVM和标准库;JVM(Java VirtualMachine)是执行Java字节码的虚拟机器,实现了平台独立性这三者的关系是JDK包含JRE,JRE包含JVMJava程序的编译和运行过程与C/C++不同Java源代码.java文件首先被编译器javac转换为字节码.class文件,而不是直接编译为机器码然后,这些字节码在JVM上解释执行,JVM将字节码转换为特定平台的机器码现代JVM使用即时编译JIT技术,将频繁执行的字节码编译为本地机器码,提升性能这种编译执行模式是Java平台独立性的关键基础语法Java数据类型和变量控制流程数组和字符串Java有两类数据类型基本类型和引用类型基本类型Java的控制流程语句与C/C++类似,主要包括数组在Java中是对象,创建后长度固定包括•条件语句if-else,switch-case•整数类型byte8位,short16位,int32位,•循环语句for,while,do-while int[]numbers=new int
[10];//创建长度long64位为10的整型数组•跳转语句break,continue,returnString[]names={Alice,Bob,•浮点类型float32位,double64位Java增加了增强型for循环for-each,简化了集合和Charlie};//初始化•字符类型char16位Unicode字符数组的遍历•布尔类型booleantrue/false访问数组元素使用方括号和从0开始的索引,Java会自引用类型包括类、接口和数组变量声明语法为类型forElementType element:collection{动检查数组边界,防止越界访问变量名=初始值;Java中的变量必须先声明再使用,//处理elementString是Java内置的不可变字符串类,提供了丰富的字且类型一旦确定不能改变Java还提供了自动装箱和拆}符串操作方法箱,在基本类型和对应包装类之间自动转换switch语句在Java7后可以使用String类型,Java12引String s1=Hello;入了switch表达式Java不支持goto语句,但保留了String s2=s1+World;//字符串连接goto关键字String s3=s
2.substring0,5;//提取子串boolean equals=s
1.equalss3;//字符串比较对于频繁修改的字符串,应使用StringBuilder非线程安全或StringBuffer线程安全类面向对象编程()Java类和对象封装、继承和多态接口和抽象类Java的类定义包括字段(属性)和方法(行为)封装通过访问修饰符(public,protected,default,抽象类用abstract关键字声明,可以包含抽象方法类是对象的模板,对象是类的实例在Java中,类private)控制字段和方法的可见性,隐藏实现细(无实现)和具体方法抽象类不能实例化,但可定义通常放在单独的.java文件中,文件名必须与节,只暴露必要接口继承使用extends关键字,以被继承接口使用interface关键字声明,定义公共类名匹配创建对象使用new关键字调用构造Java只支持单继承(一个类只能有一个直接父类),一组方法签名,实现类必须提供这些方法的具体实函数Java中所有对象都是通过引用访问,对象本但可以实现多个接口子类可以重写(覆盖)父类现接口可以实现多继承,一个类可以实现多个接身存储在堆内存中对象不再被引用时,会被垃圾方法,使用@Override注解标记多态允许使用父口Java8引入了默认方法和静态方法,允许接口回收器自动回收类引用指向子类对象,方法调用在运行时根据实际提供方法实现Java9引入了私有方法,进一步增对象类型决定强了接口的功能异常处理Java异常类型1Java异常体系的根类是Throwable,下分为Error和Exception两大类try-catch-finally使用try包围可能抛出异常的代码,catch捕获处理特定异常,finally确保资源释放自定义异常通过继承Exception或RuntimeException创建应用特定的异常类型Java的异常分为两大类检查型异常Checked Exceptions和非检查型异常Unchecked Exceptions检查型异常继承自Exception类(但不包括RuntimeException及其子类),必须在代码中显式处理或声明抛出非检查型异常包括Error(表示严重系统问题,通常不需捕获)和RuntimeException及其子类(表示程序逻辑错误,如空指针、数组越界等)良好的异常处理应当只捕获能够实际处理的异常,并保持异常的层次结构Java使用try-catch-finally语句处理异常try块包含可能抛出异常的代码;catch块捕获并处理特定类型的异常,多个catch按顺序匹配;finally块无论是否发生异常都会执行,通常用于资源清理Java7引入了try-with-resources语句,简化了资源管理实现AutoCloseable接口的资源在语句结束时自动关闭多个异常可以通过异常链接exception chaining保留,使用Throwable.getCause方法获取原始异常创建自定义异常通常继承Exception(检查型)或RuntimeException(非检查型)自定义异常应当有描述性名称,提供多种构造函数,包括默认构造函数、带消息的构造函数和带原因的构造函数异常类应当是不可变的,并且覆盖toString方法提供有用的错误信息选择检查型还是非检查型异常取决于调用者是否应该预期并处理该异常情况集合框架JavaList、Set和Map Iterator和泛型常用集合类Java集合框架提供了三种主要接Iterator接口提供了遍历集合的统除了基本的List、Set和Map实现口类型List(有序集合,允许重一方法,支持hasNext、next外,Java集合框架还包括复元素,如ArrayList、和remove操作Java5引入的Queue和Deque接口(队列和双LinkedList)、Set(不允许重复泛型使集合能够在编译时检查类端队列,实现如LinkedList、元素的集合,如HashSet、型安全,消除了显式类型转换的ArrayDeque);线程安全集合类TreeSet)和Map(键值对映射,需要使用泛型定义和使用集合(如Vector、Hashtable、如HashMap、TreeMap)每种的示例List names=new ConcurrentHashMap);不可修接口都有多种实现,适用于不同ArrayList;增强型for循环改集合(通过场景ArrayList基于动态数组,for-each简化了集合遍历Collections.unmodifiableXXX方随机访问快;LinkedList基于双向forString name:names{...}法创建);同步集合包装器(通链表,插入删除快HashSet基于Java8引入的Stream API提供了过Collections.synchronizedXXX哈希表,提供常数时间的基本操更强大的集合处理能力,支持函方法创建);NavigableSet和作;TreeSet基于红黑树,保持元数式风格的操作如filter、map和NavigableMap接口(支持导航方素有序reduce法的有序集合)Java9引入了便捷的集合工厂方法List.of、Set.of和Map.of,用于创建不可变集合语言简介PythonPython的特点和应用Python解释器变量和数据类型Python是一种高级、解释型、通用编程语言,以Python是解释型语言,程序运行时由解释器逐行Python使用动态类型系统,变量无需声明类型简洁易读的语法和强大的生态系统著称Python执行CPython是最常用的Python解释器,用C变量创建简单变量名=值Python的主要内置的主要特点包括强大的可读性(使用缩进表示代语言实现其他实现包括PyPy(注重性能,使数据类型包括数值类型(int,float,complex)、码块)、动态类型(无需显式声明变量类型)、跨用JIT编译)、Jython(在JVM上运行)、布尔类型(True,False)、字符串(str,支持平台兼容性和丰富的标准库Python遵循IronPython(在.NET平台上运行)Python解释Unicode)、列表(list,可变序列)、元组batteries included理念,标准库提供了丰富的模器可交互使用(REPL模式),便于快速测试代码(tuple,不可变序列)、字典(dict,键值对映块,使开发者能够快速实现各种功能片段和学习语言特性Python程序可以作为脚本射)、集合(set,无序不重复集合)Python3直接运行,也可以编译为字节码.pyc文件以加快中整数范围不受限制,可处理任意大小的整数加载速度控制结构Python条件语句循环语句函数定义和调用Python的条件语句使用if、elif和else关键字,语法简洁明Python提供for和while两种循环结构for循环用于遍历任Python函数使用def关键字定义了何可迭代对象(如列表、元组、字符串等)def函数名参数1,参数2,...:if条件1:for元素in可迭代对象:文档字符串,描述函数功能#条件1为真时执行的代码块#循环体#函数体elif条件2:return返回值#可选#条件1为假且条件2为真时执行的代码块while循环根据条件表达式重复执行代码块else:Python函数支持灵活的参数机制#所有条件都为假时执行的代码块while条件:•位置参数按位置传递的必选参数#循环体Python使用缩进来标识代码块,通常是4个空格条件表•默认参数有默认值的可选参数,如def funca,达式的结果会被自动转换为布尔值,其中空字符串、数值b=10两种循环都可以使用break语句提前退出循环,continue
0、None、空列表等会被视为False,其他值视为True•可变参数接收任意数量的位置参数,如def语句跳过当前迭代Python的for循环通常与range函数Python还提供条件表达式(三元运算符)值1if条件func*args配合使用生成数字序列for iin range5循环还可以包else值2含else子句,在循环正常完成(不是通过break退出)时•关键字参数接收任意数量的关键字参数,如def执行func**kwargsPython
3.5引入了类型提示,可以指定参数和返回值的预期类型def adda:int,b:int-int函数是一等公民,可以赋值给变量、作为参数传递和作为返回值数据结构Python列表和元组字典和集合列表推导式列表list是Python最常用的数据结构,字典dict是键值对的集合,通过键快速列表推导式是Python的强大特性,提供表示有序项目的集合列表是可变的,查找值创建字典my_dict={name:了创建列表的简洁方法基本语法[表可以添加、删除和修改元素创建列表Alice,age:25}或my_dict=dict达式for元素in可迭代对象if条件]例my_list=[1,2,3]或my_list=list常字典键必须是不可变类型(如字符串、如,创建平方数列表squares=[x**2用列表操作包括append添加元素、数字、元组),值可以是任意类型字for xin range10]带条件的列表推导extend合并列表、insert插入元素、典操作包括my_dict[key]访问值、式even_squares=[x**2for xinremove删除元素、pop弹出元素、my_dict[key]=value添加或修改项、range10if x%2==0]列表推导式通sort排序等列表支持切片操作popkey删除项、keys获取所有键、常比等效的for循环更简洁高效my_list[1:4]元组tuple与列表类似,values获取所有值、items获取所有Python还支持字典推导式和集合推导式,但是不可变的创建元组my_tuple=键值对集合set是无序不重复元素的语法类似字典推导式{key:value for1,2,3或my_tuple=tuple元组一集合创建集合my_set={1,2,3}或元素in可迭代对象}集合推导式{表旦创建不能修改,适用于表示固定关系my_set=set集合支持交集、并达式for元素in可迭代对象}推导式可的数据集合集|、差集-、对称差集^等数学操以包含多个for子句,形成嵌套循环作面向对象编程Python类和对象Python中使用class关键字定义类class Person:人类定义#类变量(所有实例共享)species=Homo sapiens#初始化方法(构造函数)def__init__self,name,age:#实例变量(每个实例独有)self.name=nameself.age=age#实例方法(第一个参数总是self)def introduceself:return f我是{self.name},今年{self.age}岁创建对象(实例化)person=Person张三,30访问属性和方法person.name、person.introduceself参数表示实例本身,类似其他语言的this,但在Python中必须显式声明继承和多态Python支持单继承和多继承,子类可以继承父类的属性和方法class StudentPerson:学生类,继承自Persondef__init__self,name,age,student_id:#调用父类的__init__方法super.__init__name,ageself.student_id=student_id#重写父类方法def introduceself:return f{super.introduce},学号是{self.student_id}多态允许不同类的对象对相同方法做出不同响应Python的鸭子类型(duck typing)不要求严格的继承关系,只需对象实现了所需的方法isinstance和issubclass函数可用于检查类型关系多继承语法class ChildClassParent1,Parent2,Python使用C3线性化算法解决多继承的方法解析顺序(MRO)问题模块和包Python模块的导入和使用包的概念和结构模块组织和重用代码的基本单位包是模块的集合,形成层次结构第三方库管理常用标准库使用pip和虚拟环境管理依赖Python内置的功能丰富的标准模块Python模块是包含Python代码的文件,通常以.py为扩展名导入模块的主要方式有import module导入整个模块;from moduleimport name导入特定名称;from moduleimport*导入所有名称(不推荐);importmodule asalias使用别名模块搜索路径由sys.path定义,包括当前目录、PYTHONPATH环境变量指定的目录和安装特定的目录每个模块在第一次导入时执行,后续导入使用缓存的结果模块的__name__属性在直接运行时为__main__,被导入时为模块名包是模块的组织方式,实现为包含__init__.py文件的目录包形成层次结构,使用点表示法引用package.module.name__init__.py文件在包首次导入时执行,可以为空,也可以包含包级变量和导入语句相对导入使用点前缀from.import module(同级)或from..import module(上级)Python3引入了命名空间包,不需要__init__.py文件,可以跨多个目录包通常以发行版distribution形式分发,包含setup.py文件,使用setuptools构建Python标准库提供了丰富的模块,包括os和sys(操作系统接口)、datetime(日期和时间处理)、math和random(数学和随机数)、re(正则表达式)、json和csv(数据序列化)、sqlite3(数据库访问)、threading和multiprocessing(并发编程)、unittest(单元测试)、logging(日志记录)等第三方库使用pip安装pip installpackage_name虚拟环境venv或virtualenv用于创建隔离的Python环境,避免依赖冲突requirements.txt文件用于记录项目依赖网络编程基础TCP/IP协议互联网核心通信协议族,分为四层结构Socket编程网络编程的基础接口,支持多种通信模式HTTP协议超文本传输协议,Web应用的标准通信协议TCP/IP协议是互联网通信的基础,分为四层链路层(处理物理传输,如以太网)、网络层(IP协议,负责寻址和路由)、传输层(TCP和UDP,提供端到端通信)和应用层(如HTTP、FTP、SMTP等)TCP(传输控制协议)提供可靠的、面向连接的通信,适合要求可靠性的应用;UDP(用户数据报协议)提供无连接服务,更轻量但不保证可靠性IP(互联网协议)负责数据包的寻址和路由,IPv4使用32位地址,IPv6使用128位地址以解决地址短缺问题Socket(套接字)是网络编程的基本接口,提供了应用程序访问网络协议的机制Socket编程中的基本概念包括地址族(如AF_INET表示IPv4)、套接字类型(如SOCK_STREAM表示TCP,SOCK_DGRAM表示UDP)、端口号(标识主机上的特定服务)和主机地址(如IP地址或域名)典型的TCP服务器流程包括创建套接字、绑定地址、监听连接、接受连接、收发数据、关闭连接典型的TCP客户端流程包括创建套接字、连接服务器、收发数据、关闭连接HTTP(超文本传输协议)是Web应用的基础协议,基于TCP,默认端口为80(HTTPS为443)HTTP是无状态协议,每个请求/响应是独立的HTTP请求由请求行(方法、URI、版本)、请求头和可选的请求体组成;HTTP响应由状态行(版本、状态码、状态文本)、响应头和响应体组成常见的HTTP方法包括GET(获取资源)、POST(提交数据)、PUT(上传资源)、DELETE(删除资源)等HTTP/2引入了多路复用、服务器推送等特性,HTTP/3基于QUIC协议,进一步改善性能和可靠性数据库编程数据库基本概念SQL语句数据库连接和操作数据库是结构化信息的有组织集合,SQL(结构化查询语言)是关系型数在编程语言中操作数据库通常需要以分为关系型数据库(如MySQL、据库的标准语言,分为几类下步骤PostgreSQL、Oracle)和非关系型•DDL(数据定义语言)•建立数据库连接(需提供主机、数据库(如MongoDB、Redis)关CREATE、ALTER、DROP(创端口、用户名、密码等)系型数据库基于关系模型,数据存储建、修改、删除表结构)•创建游标或查询对象在表中,表由行(记录)和列(字段)组成表之间可以通过外键建立关系•DML(数据操作语言)•执行SQL语句(查询或修改数据)INSERT、UPDATE、DELETE数据库管理系统(DBMS)提供创建、•处理结果(对于查询操作)(添加、修改、删除数据)查询、更新和管理数据库的功能数•提交事务(对于修改操作)据库设计考虑规范化(减少冗余)、•DQL(数据查询语言)•关闭游标和连接索引(提高查询性能)和事务(保证SELECT(查询数据)一致性)等方面•DCL(数据控制语言)SQL注入是一种常见的安全漏洞,通GRANT、REVOKE(授权和撤过在用户输入中插入恶意SQL代码攻击数据库防范方法包括使用参数化销权限)查询或预处理语句,避免直接拼接•TCL(事务控制语言)SQL字符串ORM(对象关系映射)COMMIT、ROLLBACK(提交框架如SQLAlchemyPython、和回滚事务)HibernateJava简化了数据库操作,SELECT语句是最常用的SQL命令,将数据库表映射为编程语言中的对象基本语法SELECT列名FROM表名WHERE条件GROUP BY分组HAVING分组条件ORDER BY排序LIMIT限制开发入门Web3Web三要素HTML、CSS和JavaScript构成现代Web前端开发的三大核心技术7HTTP状态码类别HTTP响应状态码分为信息响应、成功响应、重定向、客户端错误和服务器错误五大类2Web开发模式现代Web开发分为前端和后端两大部分,通过API进行通信4常见Web框架每种编程语言都有多种Web框架选择,如Python的Django和FlaskHTML(超文本标记语言)是Web页面的标准标记语言,定义页面结构和内容HTML文档由元素(开始标签、内容、结束标签)组成,形成树状结构HTML5引入了语义化标签(如header、nav、section)和新特性(如本地存储、视频音频支持)CSS(层叠样式表)用于控制页面外观和布局,通过选择器和声明设置元素样式CSS3增加了动画、弹性布局和网格布局等特性JavaScript是一种脚本语言,为网页添加交互功能,可以操作DOM、处理事件、发送AJAX请求等前后端交互的核心是HTTP协议和API(应用编程接口)RESTful API是一种常见的架构风格,基于HTTP方法(GET、POST、PUT、DELETE)对资源进行操作数据交换格式主要有JSON(JavaScript对象表示法)和XML(可扩展标记语言),其中JSON因简洁性和易用性更为流行AJAX(异步JavaScript和XML)技术允许网页在不刷新的情况下与服务器交换数据,提升用户体验现代Web应用还广泛使用WebSocket实现全双工通信,支持实时功能如聊天和通知后端开发使用服务器端语言(如Java、Python、PHP、Node.js)处理业务逻辑和数据访问Web框架简化了常见任务,如URL路由、模板渲染、会话管理和ORM部署Web应用通常需要Web服务器(如Nginx、Apache)和应用服务器安全性是Web开发的重要方面,常见安全问题包括跨站脚本攻击(XSS)、跨站请求伪造(CSRF)、SQL注入、会话劫持等HTTPS(HTTP安全版本)使用SSL/TLS加密通信内容,保护数据传输安全移动应用开发Android开发基础iOS开发基础Android是全球市场份额最大的移动操作系统,由Google开iOS是Apple移动设备的操作系统,应用传统上使用发,基于Linux内核Android应用传统上使用Java开发,现Objective-C开发,现在Swift语言更受欢迎iOS应用基于在也广泛采用Kotlin语言Android应用的基本组件包括MVC(模型-视图-控制器)架构,主要构建块包括•View Controller管理视图和交互•Activity用户界面的单个屏幕•Storyboard可视化界面设计•Service后台任务•Auto Layout自适应布局系统•Content Provider数据共享•Core Data数据持久化•Broadcast Receiver接收系统广播•UIKit用户界面框架•Intent组件间通信Xcode是官方IDE,包含Interface Builder、iOS模拟器和各Android Studio是官方IDE,提供模拟器、调试工具和性能种开发工具iOS开发要求macOS系统,应用需经Apple审分析器应用布局使用XML定义,支持多种视图组件和自适核后才能在App Store发布开发者账户年费99美元,但允应设计Google Play商店是主要的应用分发渠道许访问所有Apple平台跨平台开发工具为了减少开发和维护多个平台的成本,跨平台工具越来越受欢迎•React Native使用JavaScript和React开发,生成原生UI组件,性能接近原生•Flutter使用Dart语言,有自己的渲染引擎,提供一致的跨平台外观和性能•Xamarin使用C#,直接调用原生API,适合.NET开发者•Ionic基于Web技术HTML/CSS/JS,使用Cordova包装,适合Web开发者跨平台开发权衡了开发效率与原生性能和功能访问现代跨平台框架缩小了与原生开发的差距,但复杂或高性能要求的应用可能仍需考虑原生开发混合开发方法(部分原生,部分跨平台)在某些情况下是合理的折衷人工智能与机器学习机器学习基本概念机器学习是人工智能的一个子领域,专注于开发能从数据中学习的算法和模型不同于传统编程方法(明确规则和指令),机器学习系统通过训练数据学习模式,形成能对新数据做出预测或决策的模型机器学习主要分为三类监督学习(使用标记数据训练,如分类和回归问题)、无监督学习(在无标签数据中发现模式,如聚类和降维)和强化学习(通过试错和奖励机制学习策略)主要应用领域包括计算机视觉、自然语言处理、推荐系统和异常检测等常用算法简介机器学习算法种类繁多,常见的包括线性回归(预测连续值)和逻辑回归(二分类问题);决策树(基于特征划分数据)和随机森林(多个决策树的集成);支持向量机(SVM,寻找最佳分隔超平面);K-means(基于距离的聚类算法);主成分分析(PCA,降维技术);朴素贝叶斯(基于概率的分类器)每种算法有其适用场景和局限性,选择合适的算法需考虑数据特性、问题类型、计算复杂度和可解释性等因素模型评估使用交叉验证等技术,通过准确率、精确率、召回率等指标衡量性能深度学习入门深度学习是机器学习的子领域,使用多层神经网络处理复杂模式神经网络受人脑启发,由神经元(节点)和连接(权重)组成深度神经网络包含多个隐藏层,能学习数据的层次特征常见架构包括卷积神经网络(CNN,适用于图像处理);循环神经网络(RNN,处理序列数据);长短期记忆网络(LSTM,RNN的改进版,更好地处理长期依赖);变换器(Transformer,基于注意力机制,在NLP中表现卓越);生成对抗网络(GAN,生成逼真数据)深度学习需要大量数据和计算资源,通常使用GPU加速训练TensorFlow和PyTorch是主流深度学习框架课程总结本课程全面介绍了多种主流编程语言的基础知识和核心概念,从C语言的底层内存操作到Python的高级抽象特性,帮助学生建立了完整的编程知识体系我们学习了各种语言的语法结构、数据类型、控制流程、函数和模块化编程,以及面向对象编程的核心思想同时,我们也探讨了算法设计、数据结构、网络编程、数据库操作和Web开发等应用领域,为学生提供了广泛的技术视野高效的学习编程需要理论与实践相结合建议学生选择一门语言深入学习,通过完成小项目巩固知识;培养阅读代码的习惯,学习优秀开源项目的设计模式和编码风格;积极参与编程社区,与他人交流学习心得;养成记录学习过程的习惯,如编写技术博客;采用主动学习方法,如实现算法、解决编程挑战等重要的是保持耐心和持续性,编程能力的提升是一个渐进过程编程学习是一个持续的旅程,本课程只是起点未来学习方向可考虑深入特定领域,如Web全栈开发、移动应用开发、数据科学、人工智能等;学习软件工程实践,如敏捷开发、测试驱动开发、持续集成;掌握云计算和DevOps技能;关注新兴技术如区块链、物联网、增强现实等保持技术敏感度和学习热情,适应技术的快速发展,将是成功的关键希望本课程为您的编程之旅奠定坚实基础!。
个人认证
优秀文档
获得点赞 0