




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
高质量程序设计指南C+/C第三版第一刷中已经完成的修订:1 Page 7:倒数第13行,“啰里啰唆”印刷有点儿问题;2 Page 15:表1-2有些许印刷问题;3 Page 27:第2.1节的内容除了图2-1外,其他文字全部用下列文字替换(红色部分是修改过的):1822年,英国人Charles Babbage设计了差分机。该差分机利用卡片输入程序和数据,类似于百年后的电子计算机。1834年,Babbage 设计了一台分析机,在穿孔卡片(只读存储器)中存储程序和数据,基本实现了控制中心(类似于今天的CPU)和存储程序的设想。而且程序可以根据条件进行跳转,这有些类似于今天的程序控制。1848年,英国数学家George Boole创立了二进制代数学,约提前一个世纪为现代二进制计算机铺平了道路。此后,计算机的研制大约沉寂了40年,自然也没有什么人来设计程序。1890年,美国进行人口普查。由于1880年的普查用了7年的时间进行统计分析,这意味着1890年的统计分析可能会超过10年。人口普查部门希望能有一台机器,帮助他们提高统计分析的效率。Herman Hollerith借鉴了Babbage的设计,用穿孔卡片存储数据和程序,并制造了处理机器。结果该机器仅仅用了6周就得出了人口普查的统计分析结果。Herman Hollerith因此大发横财,他的公司后来发展成了IBM公司,真乃时势造英雄。1896年,Herman Hollerith创办了IBM公司的前身,开始大量制造穿孔卡片处理机。当真正意义上的电子计算机出现时,穿孔卡片自然地成为最早的程序载体。1906年,美国的Lee De Forest发明了电子管。在这之前的计算机都基于机械运行方式,而在这之后计算机开始进入电子时代。1924年2月,IBM公司成立了。从那时起直到今天,IBM公司始终在计算机工业界占据重要地位。1937年,英国剑桥大学的Alan M. Turing出版了他的论文。没错,就是那个著名的图灵,他在论文中提出了“图灵机”数学模型。现在几乎所有的编程语言都建立在图灵机模型之上。1937年,贝尔实验室的George Stibitz首先用继电器来表示二进制。如果你是那个时代的先知,也许可以预见到今天的编码方式。1939年1月1日,加利福尼亚的David Hewlet和William Packard 在他们的车库里造出了Hewlett-Packard计算机。机器的名字是两人用投硬币的方式决定的。这两个人后来成立了著名的HP公司。世界上第一台真正意义上的电子数字计算机实际上是在19351939年间由美国衣阿华州立大学物理系副教授约翰文森特阿塔那索夫(John Vincent Atanasoff)和其合作者克利福特贝瑞(Clifford Berry,当时还是物理系的研究生)研制成功的,用了300个电子管,取名为ABC(Atanasoff-Berry Computer)。不过这台机器还只是个样机,并没有完全实现阿塔那索夫的构想。1942年,太平洋战争爆发,阿塔那索夫应征入伍,ABC的研制工作也被迫中断。但是ABC计算机的逻辑结构和电子电路的新颖设计思想却为后来电子计算机的研制工作提供了极大的启发。所以,阿塔那索夫应该是公认的“电子数字计算机之父”。1943年,从这一年开始到1959年相继出现了大量使用电子真空管的计算机,包括ENIAC(Electronic Numerical Integrator and Computer)(它曾一直被人们误认为是世界上第一台真正意义上的电子计算机)。ENIAC于1943年开始制造,完成于1946年2月,它的设计思想基本来源于ABC,只是采用了更多的电子管,运算能力更强大。ENIAC重30吨,占地170平方米,体积3000立方英尺,用了18 000个电子管,功率25KW,主要用于计算弹道和研制氢弹。它的负责人是John W. Mauchly和J. Presper Eckert。如果你有幸成为ENIAC的程序员,你将不得不用机器码和穿孔卡片编写所有的程序,并且直接在内存中读写指令和数据,安排和维护内存的分配。即使增加一行代码,也必须重新考虑所有指令和数据在内存中的分配。编制的程序完全像天书,全由0和1组成。关于“谁是世界上第一台真正意义上的电子数字计算机之父”的争论及其专利诉讼历程,读者可上Internet搜索一下“Atanasoff-Berry Computer”即可得知历史的真相。现在,比较客观的结论是:世界上第一台通用电子数字计算机是由阿塔那索夫设计并由莫克利和艾克特完全研制成功的。1949年的EDVAC(Electronic Discrete Variable Computer)是第一台使用磁带的计算机。这是一个突破,专家们可以在其上多次编写和存储程序。不过你还是必须使用机器码。这一年的科学杂志做了一个大胆的预测:“未来的计算机不会超过1.5吨”。1952年,对于程序设计来说是具有重要里程碑意义的一年。MIT(美国麻省理工学院)在Whirlwind 系统上使用了符号地址,开始使用汇编语言来编写程序。Whirlwind被美国空军用于控制实时防御系统。1954年,IBM公司的John Backus和他领导的研究小组开始研制Fortran(Formula Translation)语言,这是一种用于科学计算的编程语言。Fortran语言于1957年研制完成。Fortran支持一些最常用的编码方式,如算术表达式、逻辑运算、过程调用、循环和条件等。相对于汇编语言来说,Fortran可以被称为高级语言,它提高了程序员的编程效率。Fortran历经变迁,如今演变成为Visual Fortran。1958年,Robert Noyce(Intel公司的创始人)发明了集成电路。1959年 Grace Murray Hopper开始研制COBOL(Common Business-Oriented Language)语言,并于1961年完成。COBOL在银行系统和许多大型企业中得到了广泛的应用。直到今天,仍然有许多用COBOL编制的程序在大型机上运行。1960年,来自丹麦、英国、法国、德国、荷兰、瑞士和美国的13名代表举行了一次国际会议,会后在计算机权威刊物CACM上发表了关于算法语言Algol 60的报告。Algol是一种用日常英语及与常用数学表达式相近的形式表现算法的语言,没有输入输出语句,全部以过程的形式进行描述,并以块结构为基础。Algol是第一个结构化编程语言。1961年,IBM的Kennth Iverson推出APL编程语言,专门用于矩阵运算。1965年,Thomas E. Kurtz和John Kemeny研制了BASIC(Beginners All Purpose Symbolic Instruction Code)语言。BASIC特别适合于计算机教育和初学者使用,后来发展成为Visual Basic,为Microsoft公司挣了很多钱。1967年,Niklaus Wirth开始在Algol基础之上开发Pascal语言,于1971年研制完成。Pascal后来成为Borland公司用来对抗Microsoft公司的利器。但是这个时候,无论是Microsoft还是Borland都还没有出世。1968年,Seymour Paper和他的研究小组在MIT开发了LOGO语言。LOGO语言非常有趣,适用于教育领域。LOGO语言的标志是一个有趣的忍者神龟。1969年,ARPANET计划启动(Advanced Research Projects Agency Network),这是现代Internet的雏形。1970年,许多大学和商业部门开始接入ARPANET。Internet的发展又带动了一批新的语言,但这是20年之后的事了。1970年,Ken Thomson和Dennis Ritchie开始研制UNIX操作系统。1971年11月15日,Intel公司的Marcian E. Hoff研制成功第一块微处理器4004。它包含2300个晶体管,是一个4位系统,时钟频率108kHz,每秒执行6万条指令。1972年 ,贝尔实验室发明了C语言。C兼有低级语言和高级语言的功能,被人们称为中级语言。C是一个功能强大的编程语言,它最初因被用于开发UNIX系统而闻名于世。到20世纪80年代,贝尔实验室又发明了C+语言。C和C+被誉为是程序员的“正宗编程语言”,它们的广泛应用极大地推动了软件业的发展。1974年这一年发生了许多重大的事件。4月1日Intel发布了8位微处理器芯片8080。12月,MITS发布了Altair 8800,这是第一台商用个人计算机,价值397美元,内存只有256字节。同年,Bill Gates和Paul Allen开始开发第一个在MITS 的Altair计算机上运行的BASIC程序,他们手头甚至没有Altair计算机。1975年,Bill Gates和Paul Allen创办了Microsoft公司。要是那个时候人们买了Microsoft公司的股票该有多好啊!1976年,Zilog推出Z80处理器,这是一个8位的微处理器。CP/M就是基于Z80的操作系统。1979年,Jean Ichbiah 研制了Ada语言,被广泛用于美国军方。同年,IBM公司眼看着个人计算机市场被苹果等电脑公司占有,决定开发自己的个人计算机。Microsoft公司不但提供了用于IBM-PC的BASIC语言,还承担了操作系统的开发。1981年8月,IBM推出了首款IBM-PC,同时也为Microsoft的崛起铺平了道路。在IBM-PC发布的同时,MS-DOS 1.0和PC-DOS 1.0也一起发布。Microsoft受IBM委托开发DOS操作系统,他们从Tim Paterson那里购买了一个叫86-DOS 的程序并加以改进。从IBM卖出去的叫PC-DOS,从Microsoft卖出去的叫MS-DOS,Microsoft精明地保留了继续开发的权利。DOS的最初版本里Bug很多,以至于被称为“Dirty Operation System”,但这却是Microsoft独霸PC操作系统的开始。1983年,Borland公司成立,其创始人是Philippe Kahn和Anders Hejlsberg,他们合作研制了Turbo Pascal,并在著名的Byte杂志上登广告。售价49.99美元的Turbo Pascal是一个革命性的产品,它能够在RAM中常驻运行,又具有闪电般的编译速度,成为当时PC上最流行的开发工具。Borland也由此迈上了其影响PC软件开发工具十几年的道路。1985年,Microsoft发布了Windows 1.0。最初的Windows存在很多严重的Bug,不仅少有人用而且被人讥笑。一直熬到1993年,Windows 3.1才获得成功。Windows的图形用户界面与Apple公司的类似,以致被Apple公司控告。诉讼一直持续到1997年8月,Apple遇到了严重的财务危机,Microsoft伸出资本的双手,向Apple注资1.5亿美元,换来了Apple撤销其控诉。1989年,欧洲物理粒子研究所的Tim Berners-Lee 创造了World Wide Web的雏形,HTML语言开始流行,大大地推动了Internet的发展。1994年,Netscape 1.0 浏览器发布。1995年8月,Microsoft发布了32位的多任务操作系统Windows 95,该版本取得了巨大的成功。同年,号称“一次编译,到处运行”的Java语言诞生。1995年12月,Netscape发布了JavaScript。1996年1月,Netscape Navigator 2.0发布,这是第一个支持JavaScript的浏览器。2002年,Microsoft发布了.NET,开始与Java阵营竞争。有人绘制了一张比较直观的编程语言关系图,如图2-1所示。4 Page 56:“4.3 类型转换”一节上面一段末尾应从“关于复合.”处另起一行并缩进两个字;5 Page 58:示例4-6,代码用下列代码替换:class Baseprivate:int m_a;int m_b;/ 示例Derived objD1;Base objB1 = objD1; / 见图4-3左图Derived *pD1 = &objD1;class Derived : public Base int m_c ;Base *pB1 = pD1; / 见图4-3右图6 Page 76:示例4-13上半部分最后一行“delete a;”要右移4格对齐;下半部分最后一行左移4格对齐;7 Page 78:示例4-15的代码完全替换为下列代码:int main()unsigned long a, b, c = 0; /* 两个整数和临时变量 */unsigned long lcm = 0, gcd = 0; /* 最小公倍数和最大公约数 */while (1) printf ( Please input two positive integers(spacebar as separator): ); scanf ( %lu %lu, &a, &b ); if (a = 0 | b = 1 E = 0 |(E = 1 & A = 1 & D = 1)我们用另一个变量sum来表示组合空间中某一个组合能够同时满足的论断个数,如果出现了这样一个组合它同时满足了这5条论断那么它就是我们要找的组合。当然,同时满足所有论断的组合可能不止一个,因此我们有必要搜索整个组合空间(虽然在本案中这种情况不应该存在,但是在做其它类似的搜索时不要忘记这一点)。程序见示例4-21。示例4-21#include int main (void) int count = 0; / 满足所有条件的答案个数 int sum = 0; / 累计满足的条件个数 int A, B, C, D, E; for ( A = 0; A 2; A+) for ( B = 0; B 2; B+) for ( C = 0; C 2; C+) for ( D = 0; D 2; D+) for ( E = 0; E = 1 ) ? 1 : 0; sum += ( E = 0 | ( E = 1 & A = 1 & D = 1 ) ) ? 1 : 0; if ( sum = 5 ) / 找到一个满足所有条件的组合 count+; printf (/ This is the %d th answer:n, count); printf (Suspect A is %s.n, ( A = 1 ) ? a criminal : not a criminal); printf (Suspect B is %s.n, ( B = 1 ) ? a criminal : not a criminal); printf (Suspect C is %s.n, ( C = 1 ) ? a criminal : not a criminal); printf (Suspect D is %s.n, ( D = 1 ) ? a criminal : not a criminal); printf (Suspect E is %s.n, ( E = 1 ) ? a criminal : not a criminal); printf (n); return 0;输出结果如下:/ This is the 1 th answer:Suspect A is not a criminal.Suspect B is not a criminal.Suspect C is a criminal.Suspect D is a criminal.Suspect E is not a criminal.10 Page 83:在“最后我们举一个数值计算.。”一行前面插入“例5:数值计算。”;11 Page 88:建议5-1中的示例代码:两个MAX和PI应该垂直对齐,后面的注释也垂直对齐;12 Page 91:“C+程序”所在一行中:右边的方法二和左边的方法二要水平对齐,调整后后面的方法三和方法四也要分别与左边的方法三和方法四水平对齐;13 Page 93:倒数第10行,将“定义和初始化每一个常量时,一次一个样。”修改为“定义和初始化每一个常量一次。”;14 Page 96:示例6-1:将“T是形参”修改为“_T是形参”;15 Page 103:将最后一行中的“chat”改为“char”;16 Page 104:倒数第三行,将“取值范围是”改为“取值范围是”,即将最后的右圆括号改为右方括号即可;17 Page 107:示例6-8中,后面的注释行要垂直对齐;18 Page 115:示例6-16的代码完全替换为下列代码:#include / 求两个整数a和b的最大公约数unsigned long gcd_2(unsigned long a, unsigned long b) if(b = 0) return a;else return gcd_2(b, a % b);int main(void)unsigned long a, b; /*两个整数*/unsigned long lcm = 0, gcd = 0; /*最小公倍数和最大公约数*/ while (1) printf ( Please input two positive integers(spacebar as separator): ); scanf ( %lu %lu, &a, &b ); if (a = 0 | b = 0) printf ( Input error!n ); continue; else break; gcd = gcd_2(a, b);lcm = (a * b) / gcd;printf(Their Greatest Common Divisor is %lu.n, gcd);printf(Their Least Common Multiple is %lu.n, lcm);return 0;19 Page 122:示例7-1中,所有“cout .”行中的“:0x”要垂直对齐;20 Page 144:示例8-5右半边“char ch; ”一行要缩进4格垂直对齐;21 Page 147:上方代码中最后一个“:8”中间插入一个空格;22 Page 149:示例8-9中,将“sizeof(X) = 4”修改为“sizeof(X) = 8”;23 Page 154/155:图8-6和图8-7中m_price的长度应该是8字节而不是4字节,这是个笔误,所以分别用下面的图替换即可:图8-6图8-724 Page 167:第(7)条中,“#define SQUARE(x)(x)*(x)”中间要插入几个空格,即修改为:#define SQUARE(x) (x)*(x)“#define SQUARE(x)x * x”的中间也插入几个空格,即修改为:#define SQUARE(x) x * x25 Page 168:第(8)条中,把“否则将导致变量的多次求值”替换为“否则可能导致变量多次求值,且结果可能与预期不符,因为复合表达式中子表达式的求值顺序可能因具体编译器的不同而不同。”;26 Page 168:第(8)条中,把“其结果将是30而不是期望的25,这是因为展开的结果为:int x = (n+) * (n+);”替换为“其结果可能是30,也可能是25。”;27 Page 170:示例9-2中,将下列代码:#define FLAG_DOS2#define FLAG_UNIX1#define FLAG_WIN0#define OS1修改为:#define FLAG_DOS 2#define FLAG_UNIX 1#define FLAG_WIN 0#define OS 128 Page 181:建议10-5中,把“t”修改为t;29 Page 183:示例10-6用下面的代码替换(主要是对齐问题):/* * 函数头注释 */void Function(float x, float y, float z) .if (.) . while (.) . / end of while . / end of if30 Page 193:将示例12-3的代码替换为下面的代码:typedef unsigned char BYTE;templateclass RingBuffer public: typedef size_t size_type; typedef GenericLocker _BufferLocker; RingBuffer() : m_pushPos(0), m_popPos(0), m_count(0) assert(N 0); m_pRingBuffer = new BYTEN; RingBuffer() delete m_pRingBuffer; RingBuffer(const RingBuffer& copy) : m_popPos(0) assert(N 0); m_pRingBuffer = new BYTEN; size_type rearLen = N - copy.m_popPos; if (rearLen = copy.m_count) :memmove(m_pRingBuffer, ©.m_pRingBuffercopy.m_popPos, copy.m_count); else :memmove(m_pRingBuffer, ©.m_pRingBuffercopy.m_popPos, rearLen); :memmove(m_pRingBuffer + rearLen, copy.m_pRingBuffer, copy.m_count - rearLen); m_pushPos = m_count = copy.m_count; RingBuffer& operator=(const RingBuffer& other) if (this != &other) _BufferLocker guard(m_mutex); RingBuffer temp(other); / invoke copy constructor _Swap(temp); / this-_Swap(); return (*this); bool is_full() const _BufferLocker guard(m_mutex); return (m_count = N); bool is_empty() const _BufferLocker guard(m_mutex); return (m_count = 0); size_type size() const _BufferLocker guard(m_mutex); return m_count; size_type capacity() const return N; size_type push(const BYTE *data, size_type length) assert(data != NULL); _BufferLocker guard(m_mutex); if (length = 0 | length (N - m_count) return 0; size_type rearLen = N - m_pushPos; / 尾部剩余空间 if (length m_count) return 0; size_type rearLen = N - m_popPos; / 尾部剩余数据 if (length = rearLen) :memmove(buf, &m_pRingBufferm_popPos, length); m_popPos += length; m_popPos %= N; / 调整新的pop位置 else :memmove(buf, &m_pRingBufferm_popPos, rearLen); :memmove(buf + rearLen, m_pRingBuffer, length - rearLen); m_popPos = length - rearLen; / 调整新的pop位置 m_count -= length; return (length); void clear() _BufferLocker guard(m_mutex); m_pushPos = 0, m_popPos = 0, m_count = 0; private: BYTE *m_pRingBuffer; / buffer size_type m_pushPos; / 新的push位置:pushPos=(popPos+count)% N size_type m_popPos; / 新的pop位置 size_type m_count; / 有效字节数 CriticalSectionm_mutex;31 Page 196:示例12-6中,三个class所在行对齐有问题,后面两个class行要左移4空格垂直对齐;32 Page 199:图12-1用下图替换(原图没有使用斜体):33 Page 200:示例12-11中,class Eye的“public:”所在行左移4格垂直对齐,同时“void”所在行向右缩进4格;正数第13行“.返回其中任意一个接口指针”修改为“.返回其中任意一个接口的指针”;34 Page 201:上方class Head的private部分以m_打头的部分要垂直对齐;35 Page 207:倒数第12和13行,请把“/(3)”和“/ OK!”垂直对齐;36 Page 210:示例12-19,最后一行向左移4格垂直对齐;37 Page 224:在“最后,我们来想一想:”之前插入如下的文字段落:这里还有几个关于vptr的问题,读者肯定想搞明白,那就是:“vptr在哪里被初始化?它的值会不会改变?为什么需要改变?在哪里改变?”。很显然,由于vptr并非static成员,因此只能在构造函数中初始化在哪个类的构造函数中就被初始化为指向哪个类的vtable。由于一个派生类对象的构造函数会从每一个继承分支的根类开始向下依次调用它的每一个基类的构造函数,所以除了在根类的构造函数中vptr是被初始化的外,在后来的基类构造函数中实际上都是在不断地被改写以指向当前构造函数对应的基类的vtable。编译器必须保证在类的每一个构造函数中(包括拷贝构造函数)都要重新初始化或改写vptr。vptr必须随着对象类型的变化而不断地改变它的指向,以保证其值和当前对象的实际类型是一致的。(你可以说Derived d;对象是Base类型的,但它更加是Derived类型的对象,所以d的真实类型是Derived,虽然它同时也是Base类型的)另外读者肯定想知道:在构造函数和析构函数中能不能调用虚函数?如果调用了虚函数,它们能按照我们期望的那样执行吗?这就取决于vptr的初始化和改写的时机了。试想,如果在构造函数中调用某个虚函数之前还没有把vptr初始化或改写为指向当前类的vtable,那么这个虚函数恐怕80%的情况下不是你期望调用的那个虚函数体,甚至会导致程序崩溃。另外20%的情况就是你在当前类中根本没有改写基类的那个虚函数。所以说,vptr肯定是第一个被初始化和改写的成员在所有用户代码执行之前进行。我几乎可以肯定地说,如果有程序员在某个多态类的构造函数中调用了某个虚函数,不管这个虚函数是新增的还是来自于多态基类亦或是改写自多态基类,那他肯定是想让这个虚函数执行动态绑定。这是没有问题的,因为当程序执行到这个构造函数中的时候,可以肯定当前对象已经存在了,而且vptr已经被正确初始化了,只要保证这个虚函数使用到的所有其他数据成员都在它被调用之前初始化好即可。那么在析构函数中,vptr则应该是在所有用户代码执行完之后被改写为指向其直接基类的vtable,或者说在所有用户代码执行之前被重新改写为指向当前类的vtable。这是必须要做的,因为一个对象在析构的过程中是沿着继承分支向上依次退化为各个基类型对象直至根类对象的,所以析构函数中的虚函数调用不应该绑定到当前类的某个派生类的该虚函数的改写版本上。程序员在一个类的析构函数中调用虚函数,他可能会想:“呀!要是这个虚函数还能够把当前类的派生类的这个虚函数的改写版本调用起来,那就太酷了!”比如以Shape:Shape()为例,如果他打算这样实现:Shape:Shape() Draw(); / 他期望调用Rectangle:Draw()而不是Shape:Draw()!那么我可以毫不犹豫地告诉他:他的美梦会落空!这肯定将调用Shape:Draw()(假设Shape:Draw()不是纯虚的或者有一个函数体)。其实大家从与构造函数执行顺序的相反顺序去推理,就很容易明白这一点。如果上述调用真的如他所期望的那样执行了的话,很可能会导致程序崩溃!比如你定义了一个Rectangle对象如下:Rectangle rect; / 这里将调用Rectangle:Rectangle(),进而调用Shape:Shape()那么当执行到Shape:Shape()的时候,rect对象已经不再是Rectangle类型了,而是退化为Shape对象了(假设Shape不是抽象类)。虽然Rectangle:Draw()函数仍然存在,但是Rectangle新增的成员都已经不存在了,此时如果再调用Rectangle:Draw(),肯定会出问题,所以编译器不可能那样去实现。所以,为了安全起见,建议大家尽量避免在构造函数和析构函数中调用虚函数。如果你真的想调用的话,我想总是可以找到其他的途径来实现你的意图,没有必要铤而走险。38 Page 233:上方“class B”行向左移4格垂直对齐;39 Page 235:将表13-1内文字的字号都改为“小五”号,如果已经是小五号那就不用改了;40 Page 270:把示例15-3中第8行到第13行分别左移4格;41 Page 275:把建议15-1中的“比如反跟踪”修改为“(比如反跟踪)”;42 Page 285:示例15-19的代码用下列代码替换(在第10行第一个Television后面加&字符):示例15-19void DeviceControllor:ControlThem(HomeElectricDevice& device)Command cmd = GetCommand();switch(cmd)case OPEN:case PLAY_VCD:try Television& tv = dynamic_cast(device);tv.PlayVCD(); / 现在能够处理Television对象和任何派生自它的对象!catch(std:bad_cast&) MsgBox(This device cannot play VCD!);break;43 Page 297:示例16-10:最后的“catch”一行向左移4格对齐;44 Page 301:正数第6行末尾句号改为冒号;45 Page 3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 ISO 80000-7:2019/AMD1:2025 EN Amendment 1 - Quantities and units - Part 7: Light and radiation
- 【正版授权】 ISO 17666:2025 EN Space systems - Programme management - Risk management
- 【正版授权】 IEC 60068-3-14:2025 EN Environmental testing – Part 3-14: Supporting documentation and guidance – Developing a climatic sequential test
- 校园师生消防知识培训课件
- 绝食减肥测试题及答案
- 甲乳外科考试题及答案
- 自律作息测试题及答案
- 桂林社工面试题及答案
- 胰腺炎考试试题及答案
- 锁骨护理试题及答案
- 2025年云南省高校大学《辅导员》招聘考试题库及答案
- 消费品市场2025年消费者对绿色包装认知及需求调研可行性研究报告
- 台球厅消防知识培训课件
- 充电桩运维服务协议
- 2025至2030中国防砸安全鞋行业运营态势与投资前景调查研究报告
- 2025年医疗器械仓库管理培训试题及答案
- 2024年湖南省古丈县事业单位公开招聘工作人员考试题含答案
- 卵巢性索间质肿瘤课件
- 2025甘肃行政执法资格考试模拟卷及答案(题型)
- 2025-2026年秋季第一学期学校德育工作安排表:德润心田、智启未来、行塑栋梁
- 成人零基础英语教学课件
评论
0/150
提交评论