自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(92)
  • 收藏
  • 关注

原创 OCP Java17 SE Developers 复习题14

====================== 答案 ============================================== 答案 ============================================== 答案 ============================================== 答案 ============================================== 答案 =======================

2024-04-19 15:00:00 391

原创 OCP Java17 SE Developers 复习题13

======================= 答案 ================================================== 答案 ================================================== 答案 ================================================== 答案 ==========================

2024-04-18 16:17:16 518

原创 OCP Java17 SE Developers 复习题12

=========================== 答案 ========================================================== 答案 ========================================================== 答案 ==============================

2024-04-15 09:40:10 900

原创 OCP Java17 SE Developers 复习题11

=========================== 答案 ========================================================== 答案 ========================================================== 答案 ==============================

2024-04-03 10:22:28 1119

原创 OCP Java17 SE Developers 复习题10

======================= 答案 ===================================================== 答案 ===================================================== 答案 ===================================================== 答案 =============================

2024-04-01 10:46:04 827

原创 OCP Java17 SE Developers 复习题09

======================= 答案 ===================================================== 答案 ===================================================== 答案 ===================================================== 答案 =============================

2024-03-05 10:57:21 1033

原创 C语言K&R圣经笔记 8.7样例 - 内存分配器 [全书完]

8.7 样例 - 内存分配器在第五章中,我们给出了一个非常受限的面向栈的内存分配器。这次我们要写一个不受限制的版本。使用者能够以任意顺序调用 malloc 和 free;malloc 按需向操作系统申请更多的内存。这些例程说明了以相对不依赖于机器的方式来写依赖于机器的代码时的一些注意事项,并展示了一个使用结构体、联合体和 typedef 的现实的应用程序。malloc 会在需要时向操作系统申请内存,而不是从编译好的固定大小的数组中申请。由于程序中的其他活动(代码)也可能不通过这个内存分配器来申请内存

2024-02-28 11:42:49 667

原创 C语言K&R圣经笔记 8.6 样例 - 列出目录内容

遗憾的是,目录的格式和确切内容并非在所有版本的 UNIX 系统中都相同。外层定义一个称为 Dirent 的结构和三个例程 opendir,readdir 和 closedir ,它们提供对目录条目中的文件名和 inode 的访问,不依赖具体的系统。对这样的程序,非常重要的一点是,只让这些信息的展示出现在标准头文件中,然后程序包含这些头文件,而不是把这些声明内嵌在程序内部。第二个观察到的点是,如果足够用心,就能够为依赖系统的对象创建一个相对不那么依赖系统的接口。这个文件也可能是子目录,因此这个过程是递归的。

2024-02-27 11:42:42 837

原创 C语言K&R圣经笔记 8.5样例 - fopen和getc的实现

然而,如果数量变为负,则 getc 调用 _fillbuf 来重新填充缓存,重新初始化结构体的内容,并返回一个字符。特别指出,这个版本的 fopen 不认识表示二进制模式的 “b”,因为在 UNIX系统上没有意义,也不认识表示同时允许读和写的 “+” 号。尽管并不准备讨论任何细节,我们还是把 putc 的定义包含进来,以说明它和 getc 的工作方式大致相同,在缓存满时调用 _flushbuf 函数。一旦缓存建立起来,_fillbuf 会调用 read 来填充缓存,设置数量和指针,并返回缓存头部的字符。

2024-02-26 11:18:33 521

原创 C语言K&R圣经笔记 8.3 open,creat,close,unlink 8.4随机访问-lseek

在 UNIX 系统中,有 9 个比特位的权限信息与文件关联,分别控制文件属主,属主所在的用户组,以及其他用户的读,写和执行。我们这个版本的 cp 只能拷贝一个文件,也不允许第二个参数为目录,还写死了文件权限,没有从原文件拷贝过来。open 非常像第七章讨论的 fopen,区别在于 open 不返回文件指针,而是返回文件描述符,后者仅仅是个 int。使用后面 8.6 节所述的 stat 系统调用,我们可以确定已存在文件的权限,并将同样的权限赋给要拷贝的文件。试图 open 一个不存在的文件是错误的。

2024-02-23 10:28:48 1075

原创 C语言K&R圣经笔记 8.1文件描述符 8.2低级IO

UNIX 操作系统通过一系列“”来对外提供服务,实际上,系统调用是操作系统内可以被用户程序调用的函数。本章描述怎样在 C 程序中使用一些最重要的系统调用。如果你使用 UNIX,本章应当会有直接的帮助,因为有时需要使用系统调用以得到最大化的效率,或访问库中没有的一些功能。然而,即使你在其他操作系统上使用 C 语言,通过研究这些样例,你也能够对 C 语言编程有更深入的理解;尽管细节不同,但类似的代码在任何系统上都能找到。由于在很多情况下 ANSI C 库是以 UNIX 功能为原型的,这些代码也能帮助你理解库。

2024-02-20 10:34:25 750

原创 C语言K&R圣经笔记 7.7行输入和输出 7.8其他函数

空间的释放顺序是随意的,但释放并非由调用 calloc 或 malloc 得到的内存是非常可怕的错误。令人困惑的是,gets 删除结尾的 '\n',而 puts 在结尾添加 '\n'。system 从被执行的命令中返回一个依赖于系统的整数。在 UNIX 系统中,返回的状态是 exit 返回的值。返回一个指针,指向能容纳 n 个指定大小为 size 的对象的数组空间,若无法满足要求则返回 NULL。malloc 和 calloc 返回的指针为所需的对象提供了正确的对齐,但必须要转换成恰当的类型,例如。

2024-02-19 15:06:50 928

原创 C语言K&R圣经笔记 7.5文件访问 7.6错误处理-stderr和exit

试图读不存在的文件是错误的,另外还可能存在其他错误,例如试图读你无权访问的文件。,指向一个包含文件信息的结构体,例如:缓存的位置,缓存中当前字符的位置,文件是被还是写,是否遇到了错误或者文件结束,等等。如果输出到屏幕,这也许可以接受,但如果输出到文件,或者通过管道输出到另一个程序,就无法接受了。一旦文件被打开,下一件需要的事是读或写文件的方式。fopen 获取一个如 x.c 或 y.c 这样的外部名称,做一些杂活,并和操作系统协商(细节我们不关心),然后返回一个后续可以用来对文件进行读或写操作的指针。

2024-02-19 11:33:19 970

原创 C语言K&R圣经笔记 7.3变长参数列表 7.4标准输入-scanf

不仅如此,它在寻找输入值的时候,会跳过空白字符(空格,制表符,换行等)。转换字符d,i,o,u 和 x 前面,可以加上 h 来表明参数列表中出现的指针是指向 short 而不是 int ,或者加上字母 l 来表明参数列表中指针指向的是 long。由于我们主要对参数处理感兴趣,故 minprintf 只做格式化字符串和参数的处理,而格式转换调用真正的 printf 来处理。这个头文件的实现在不同的机器上是不同的,但它给出的接口是统一的。对应的参数必须是指针,这是由 C 语言的“值传递”语义要求的。

2024-02-06 10:07:52 1067

原创 C语言K&R圣经笔记 7.1标准输入和输出 7.2格式化输出-printf

输入和输出功能并不是 C 语言本身的一部分,故到目前为止,本书都没有对其着重说明。然而,程序与其环境之间交互的方式,比书中之前所展示的更为复杂。本章我们会详描述标准库,即一系列为 C 程序提供输入输出、字符串处理、内存管理、数学例程及其他各种服务的函数。ANSI 标准精确定义了这些库函数,因此在任何有 C 语言的系统中也都有这些标准库函数,并且是互相兼容的。如果一个程序只使用了标准库提供的功能来与系统进行交互,那么这个程序不用修改就可以从一个系统移植到另一个系统。

2024-02-04 16:37:25 1135

原创 C语言K&R圣经笔记 6.8联合体 6.9位域

某个特定常量的值必须储存在正确类型的变量中,然而,如果不管该常量的值是什么类型,它都占有相同大小的内存而且保存在同一个位置,那么对表管理而言是最方便的。实际上,联合体就是一个结构体,其所有成员都是从其内存起始地址的偏移量零开始,而且结构体足够大以容纳“最宽”的成员,另外对齐方式也适用于联合体中所有成员。这些类型中不管哪一种都能被赋给 u ,然后用在表达式里,但注意使用方式必须是一致的:即取出的类型必须是最近存入的类型。访问结构体中联合体的成员(或联合体中的结构体成员)的表示法,与访问嵌套结构体是一样的。

2024-01-31 11:00:02 691

原创 C语言K&R圣经笔记 6.6 表查询 6.7 typedef

否则,创建一个新的项。lookup 和 install 都要使用的 hash 函数,会把字符串中每个字符值都加到对之前字符打散组合得到的值上,并返回对数组大小取模后得到的余数。练习6-6、基于本节的例程,写出一个适用于 C 程序的简单版本(即不带参数的)的 #define 预处理器。使用 typedef 的第二个目的是为程序提供更好的说明——名为 Treeptr 的类型,会比仅声明为指向复杂结构体类型的指针更好理解。链表中的块(元素)是一个结构体,包含了:名称的指针,替换文本的指针,链表中下一个块的指针。

2024-01-30 20:16:00 1083

原创 C语言K&R圣经笔记 6.4结构体指针 6.5自引用结构体

如果匹配,则答案是肯定的。新节点的存储空间通过 talloc 例程获取,它返回一个指针,指向一段适合保存树节点的可用内存空间,而新单词通过 strdup 被拷贝到一个隐藏的内存空间。在每个节点上,它打印左子树(所有比当前节点单词小的),然后是当前节点上的单词,然后是右子树(所有比当前节点单词大的)。如果 p 是指向结构体的指针,对 p 的指针运算会将结构体的大小考虑在内,因此 p++ 能正确地对 p 递增,使其指向结构体数组的下一个元素,而 for 循环中的判断条件能在正确的时候停止循环。

2024-01-30 11:21:54 1242

原创 C语言K&R圣经笔记 6.3结构体数组

函数的值是单词的首字母,或者是代表文件结束的EOF,或者是字符本身,如果该字符不是字母的话。)对象可以是变量或数组或结构体,类型名可以是基本类型如 int 或 double的名字,也可以是派生类型如结构体或指针的名字。每个单词都会在 keytab 中搜索,用的是我们在第三章写的二分搜索函数的字符串版本。但当初始化表达式是简单变量或字符串,而且都存在的情况下,内部的括号是不需要的。在我们的例子中,关键字的数量是数组的大小除以一个元素的大小。数组的大小是每个元素的大小乘以元素的个数,因此元素的个数就是。

2024-01-29 11:30:27 399

原创 C语言K&R圣经笔记 6.1结构体基础 6.2结构体和函数

结构体是一个或多个(可能是不同类型)的变量的集合,这些变量组合在单个名字下面,以便于处理。(结构体在其他语言中被称为“记录”,典型的有Pascal。)结构体有助于组织数据,特别是在大型的程序中,因为它们允许把一组相关的变量当作一个单元,而不是当作各自独立的几个实体来分别处理。结构体的一个传统例子是工资记录:雇员通过一组属性,如姓名、地址、社会安全号码和工资等来描述。其中的某些属性可能也是结构体:名字有多个组成部分,地址也是,甚至连工资也是。

2024-01-29 10:38:05 916

原创 C语言K&R圣经笔记 5.12 复杂声明

尽管真正复杂的声明在实际工作中很少出现,但明白如何理解复杂声明,以及在有需要时知道如何创建复杂声明,都是很重要的。由于这个 dcl 程序的目的是用来做讲解用,而不是要做成稳定可靠的解析器,因此它有着极大的限制。或是 direct-dcl 后面跟着一对方括号,其中的大小是可选的。在简单的情况下它的效果不错,但在更复杂的情况下会让人困惑,因为声明不能从左往右读,而且括号被过度使用了。dcl 程序的核心是一对根据这个语法来解析声明的函数,dcl 和 dirdcl。undcl 也使用了 dcl 使用的外部变量。

2024-01-28 17:07:37 688

原创 C语言K&R圣经笔记 5.11函数指针

正如 qsort 的函数原型所指示的,它期望接收一个指针数组、两个整数,以及一个有两个指针参数的函数。排序通常包含三部分:用于确定两个对象顺序的比较操作,用于交换两个对象顺序的交换操作,以及进行比较和交换直到所有对象都有序的排序算法。练习5-17、增加域处理能力,根据行中的域(列)进行排序,每个域的排序选项是独立的。用来交换两个指针的 swap 函数,除了把声明改为 void * 之外,其他部分和我们本章之前给出的是一样的。与声明是一致的:comp 是函数的指针,而 *comp 是函数,而。

2024-01-19 15:19:00 382

原创 C语言K&R圣经笔记 5.10命令行参数

在循环结束时,如果没有错误,则 argc 告诉我们还剩多少参数未处理,而 argv 指向这些剩余参数中的第一个。第一个是程序被调用时带的命令行参数个数(按惯例称为 argc,即参数个数 argument count 的缩写),第二个是指向包含所有参数的字符串数组的指针(argv,参数向量 argument vector 的缩写),数组里每个字符串对应一个参数。第一个可能存在的参数是 argv[1],最后一个是 argv[argc -1],另外,C 标准要求 argv[argc] 必须是空指针。

2024-01-19 12:14:23 937

原创 C语言K&R圣经笔记 5.7多维数组 5.8指针数组初始化 5.9指针vs多维数组

name 是一个字符串指针的数组,它的声明与前面文本行排序例子中 lineptr 的声明一样。行数是无关紧要的,因为依旧传递的是一个指向行的指针,而每行是一个数组。我们把它的类型定义为 char, 是为了说明,用 char 来保存非字符的小整数,是一种正当的用法。虽然我们上面是拿整数来讨论,但目前为止最常用的指针数组是用来保存不同长度的字符串,例如函数 month_name 中保存各月份名称的 name 数组。元素是按行来存的,因此最右边的下标,或者说列,在以存储顺序访问数组元素时,变化最快。

2024-01-05 11:06:31 913

原创 C语言K&R圣经笔记 5.6指针数组;指针的指针

在第三章中,我们介绍了对一个整数数组进行排序的 Shell 排序函数,而在第四章中,我们用快速排序对其进行改进。同样的算法在这里也还能用,差异之处在于,现在我们要处理的是文本行,每行有不同的长度,而且文本行不像整数,没法用单个操作来比较或者移动。当两个错序的行需要交换时,交换的是指针数组里面的指针,而不是文本行本身。也就是说,lineptr[i] 是一个字符指针,而 *lineptr[i] 是它指向的字符,即所保存的第 i 个文本行的首字符。输入例程必须收集和保存每行的字符,并创建一个指向每行的指针数组。

2024-01-04 11:58:22 421

原创 C语言K&R圣经笔记 5.5字符串指针与函数

t++ 的值是 t 在递增之前指向的字符;我们要审视的第二个例程是 strcmp(s, t),它比较两个字符串 s 和 t,当 s 的字典顺序小于、等于或大于 t 的时候,分别返回负数、0 和 正数。返回值的获取,是将 s 和 t 第一个不相同的字符进行相减得到的。在这里,它们都是已经初始化好的指针,每次都分别在各自的数组上前进一个字符,直到 t 结尾的 '\0' 拷贝到 s 后才停止。练习5-4、写个函数 strend(s, t),如果字符串 t 出现在字符串 s 的末尾,则返回 1,否则返回 0。

2024-01-03 11:54:45 842

原创 C语言K&R圣经笔记 5.3指针和数组 5.4地址运算

合法的指针操作有:将指针赋给相同类型,一个指针与一个整数的加减,指向相同数组的两个指针的减法或比较,以及与零的赋值和比较。其他所有指针运算都是非法的。对两个指针相加是非法的,非法的还有相乘或相除,移位或者掩码,以及将指针与 float 或 double 相加,甚至,在没有强制类型转换的情况下,将一个类型的指针赋给另一个类型的指针。如果 pa 指向数组的某个特定元素,则根据定义,pa + 1 会指向下一个元素,pa + i 指向 pa 之后的第 i 个元素, pa - i 指向 pa 之前的第 i 个元素。

2024-01-03 10:24:12 962

原创 C语言K&R圣经笔记 5.1指针和地址 5.2指针和函数参数

指针是包含变量地址的变量。在 C 语言中,指针被大量使用,部分原因是有时只能用指针来表达某种计算,而部分原因是相比其他方式,指针通常能带来更紧凑和高效的代码。指针和数组是紧密关联的;本章也讲探讨它们的关系,并演示如何利用这个关系。指针曾经和 goto 语句一起,被归结为用于创建“让人不可能理解”的程序的绝妙方式。如果粗心大意地使用指针,这个说法当然是对的,而且很容易创建指向不可预料位置的指针。然而,通过训练和规范约束,指针可以用来得到清晰性和简洁性。这正是我们在本书中尽量展示的方面。

2023-12-27 18:44:39 981

原创 C语言K&R圣经笔记 4.10递归 4.11 C预处理

C 语言的某些机制是以预处理的方式提供的,预处理从概念上来说,是在编译过程中单独的第一步。两个最常用的预处理特性分别是 #include,用于在编译期间包含一个文件的内容,以及 #define,用来将一个标识符替换成为任意的字符序列。如果替换文本中的参数与 ## 相连,则参数会被替换成实参,## 及其两边的空格会被删除,得到的结果会被再次扫描。在双引号字符串内的形参是不会被替换的。然而,如果在替换文本中,形参以 # 开头,则这个组合(即 # 和形参)会被扩展成一个双引号字符串,其中的参数被替换为实参。

2023-12-27 13:29:51 1047

原创 C语言K&R圣经笔记 4.7寄存器变量 4.8块结构 4.9初始化

当数组为外部,静态或是自动的时候,如果数组的初始化表达式数量比指定的数组长度要少,则没有对应初始化表达式的元素会为0。在块中声明和初始化的自动变量,在每次进入块的时候被初始化。以这种方式声明的变量,可以隐藏外部块中任何相同名字的变量,而且它一直会存在,直到遇到匹配的右大括号。对于自动和寄存器变量,初始化表达式不限于是常量:可以是包含之前定义过的值的任意表达式,甚至是函数调用。在没有显式初始化的情况下,外部和静态变量会保证初始化为0,自动和寄存器变量有未定义(即垃圾)的初始值。字符数组是初始化的特例;

2023-12-18 15:46:36 939

原创 C语言K&R圣经笔记 4.4作用域规则 4.5头文件 4.6静态变量

和。

2023-12-18 12:00:46 1017

原创 OCP Java17 SE Developers 复习题08

======================= 答案 ================================================ 答案 ================================================ 答案 ================================================ 答案 ========================

2023-12-05 20:23:12 1197

原创 C语言K&R圣经笔记 4.3 外部变量

此后,每当程序多读了一个字符,它就能将该字符推回给输入,因此对后面的代码来说,就像该字符没被读过一样【即后面的代码再次能读到这个字符,而不会丢失】。比如,在上面的例子中,首先推入栈的是 1 和 2,然后栈上内容被替换为它们的差 -1。然而,正如第一章中所指出的,这个做法要谨慎使用,因为它对程序结构有害,并且会导致我们写出函数间存在过多数据关联(耦合)的程序。入栈和出栈操作是简单的,但当加入错误检测和恢复之后,这些代码就会变得很长,所以最好是把每个操作都放在单独的函数中,而不是在程序里到处重复相同的代码。

2023-12-05 11:40:17 1231

原创 C语言K&R圣经笔记 4.2返回非整数的函数

因此,当出现在这个 return 里面时,atof 的值 ,一个 double,会自动被转换成 int,因为 atoi 函数返回一个 int。但如果(更有可能)atof 是分开编译的,无法检测到两者不匹配,atof 返回 double 而 main 将它当作 int,就会得到无意义的结果。如果一个没有被事先声明的名称出现在表达式中,而且名字后面还跟着左括号,则它被根据上下文声明为一个函数名称,该函数被假定返回int,且对其参数不做任何假定。首先,因为不返回int,故atof 必须声明它的返回值。

2023-12-02 17:59:03 411

原创 C语言K&R圣经笔记 4.1函数基础

函数将大的计算任务拆分成小份,还能让我们在他人已完成的基础上开发,而不必从头开始。恰当的函数隐藏了程序中那些不需要知道操作细节的部分,这样就使整体更加清晰,并且能减少修改的痛苦。C的设计使得函数的使用高效而简单;C程序通常由很多小函数,而不是由几个大函数构成。一个程序可以放在一个或多个源文件中。多个源文件可以分开编译,并与库中早已编译好的函数一起加载。然而我们这里不会介绍这个过程,因为各个系统的细节都不一样。函数声明和定义是ANSI标准对C语言做出最显著改动的地方。

2023-12-01 22:17:16 1182

原创 java类库的废弃API

java语言一直在进化,java类库也越来越庞大,给人的感觉是一直在做加法。有没有做减法呢?当然也有,一些是设计失误需要撤回的,如可能引起线程安全问题的Thread.stop()等方法;还有是随着时代发展而被淘汰的,比如曾被寄予厚望的Applet。java类库中这些废弃的内容有没有地方统一归档,方便我们的查找?假如我们要升级java版本,而找出当前代码中使用了哪些新版本废弃的API,就能让准备更加充分。答案是有的。java9之后的java API文档,贴心地单独为废弃的内容做了一个页面。

2023-12-01 15:00:11 1086

原创 OCP Java17 SE Developers 复习题07

======================== 答案 ====================================================== 答案 ====================================================== 答案 ====================================================== 答案 =============================

2023-11-28 10:18:02 1287

原创 P95陷阱

不一会,你收到了系统A同事回复:“哥们,我们接口没那么慢的,看看你们自己有没有别的问题吧。不过这个要求实在不合理,下游系统不可能接受,现在的P95指标已经不错了,继续提升的成本太高,没人会买单。于是你分别给系统A、B、C的同事发消息,内容都差不多:“你们系统的XX接口有点慢,影响了我们给上游的响应时间,看看啥时能帮忙给解决。用图表来简单表示(D表示按顺序简单相加的错误结果,E为响应时间随机打乱后的正确结果),可以看到在这个非常简陋的模型下,P95比三个系统P95之和都高很多,P99则比三者之和低不少。

2023-11-16 11:10:06 102

原创 C语言K&R圣经笔记 3.6 do-while循环 3.7 break和continue 3.8 goto和标号

这里用 do-while 是必要的,至少是方便的,因为至少要有一个字符被放到数值 s 中,即使 n 是 0。练习3-4、在数字用2的补码表示的机器上,我们的 itoa 版本无法处理最大的负数,即当 n = -(2的字长 -1 次方)。下面的函数 trim 从字符串末尾删除结尾的空格,制表符和换行符,当发现最右边的非空格、非制表符、非换行符时,它使用 break 从循环中退出。涉及 goto 的代码总是能写成不带 goto的,尽管可能的代价是一些重复的检查或一个额外的变量。标号的作用域是整个函数。

2023-11-10 10:25:53 186

原创 C语言K&R圣经笔记 3.4 switch 3.5 while和for循环

然而,把不相干的多个计算分别硬塞到 for 循环的初始化和递增部分中,会是糟糕的代码风格,这些位置最好保留给循环控制操作来使用。所有 case 的表达式都必须不同。这个1959年由 D.L.Shell 发明的排序算法,其基本思想是在早期对相隔较远的元素进行比较,而不像那些简单的交换排序算法是对相邻的元素进行比较。注意最外层的循环,尽管它不是等差数列,但 for 的通用性仍然使它与其他的循环保持相同的形式。当有一个简单的初始化和自增时,for 是更合适的,因为它将循环控制语句紧密结合在一起,放在循环的头部。

2023-11-10 10:01:31 238

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除