C++基础实例教学教育资料.doc

上传人:一*** 文档编号:808784 上传时间:2019-07-16 格式:DOC 页数:169 大小:612.50KB
返回 下载 相关 举报
C++基础实例教学教育资料.doc_第1页
第1页 / 共169页
C++基础实例教学教育资料.doc_第2页
第2页 / 共169页
点击查看更多>>
资源描述

《C++基础实例教学教育资料.doc》由会员分享,可在线阅读,更多相关《C++基础实例教学教育资料.doc(169页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、1.1 C+程序结构程序结构 (Structure of a program)下面我们从一个最简单的程序入手看一个 C+程序的组成结构。/ my first program in C+ #include using namespace std;int main() cout 以# #标志开始的句子是预处理器的指示语句。它们不是可执行代码,只是对编译器作出 指示。在本例中这个句子# include 告诉编译器的预处理器将输入输 出流的标准头文件(iostream.h)包括在本程序中。这个头文件包括了 C+中定义的基本 标准输入-输出程序库的声明。此处它被包括进来是因为在本程序的后面部分中将用到

2、它的功能。using namespace std;C+标准函数库的所有元素都被声明在一个名空间中,这就是 std 名空间。因此为了能 够访问它的功能,我们用这条语句来表达我们将使用标准名空间中定义的元素。这条语 句在使用标准函数库的 C+程序中频繁出现,本教程中大部分代码例子中也将用到它。int main()这一行为主函数(main function)的起始声明。main function 是所有 C+程序的运行的 起始点。 不管它是在代码的开头,结尾还是中间 此函数中的代码总是在程序开始 运行时第一个被执行。并且,由于同样的原因,所有 C+程序都必须有一个 main function。 ma

3、in 后面跟了一对圆括号(),表示它是一个函数。C+中所有函数都跟有一对圆括号 (),括号中可以有一些输入参数。如例题中显示,主函数(main function)的内容紧 跟在它的声明之后,由花括号 ()括起来。 cout int main () cout int main () cout using namespace std;int main () / declaring variables:int a, b;int result;/ process:a = 5;b = 2;a = a + 1;result = a - b;/ print out the result:cout using

4、 namespace std;int main ()6int a=5; / 初始值为 5int b(2); / 初始值为 2int result; / 不确定初始值a = a + 3;result = a - b;cout ,并且使用 using namespace 语句来使用标准名空间(std),如下面例子所示:/ C+字符串例题 #include #include using namespace std;int main () string mystring = “This is a string“;cout #include using namespace std;int main ()

5、 string mystring;mystring = “This is the initial string content“;cout using namespace std;int main () int a, b; / a:?, b:?a = 10; / a:10, b:?b = 4; / a:10, b:4a = b; / a:4, b:4b = 7; / a:4, b:7cout =, using namespace std;int main () int a, b=3;a = b;a+=2; / 相当于 a=a+2cout , =, 大于 Greater than= 大于等于 G

6、reater or equal than4)将返回 true.(3 != 2)将返回 true.(6 = 6)将返回 true.(5 = c)将返回 true 因为它实际是(2*3 = 6)(b+4 a*c)将返回 false 因为它实际是(3+4 2*6)(b=2) = a)将返回 true.注意注意: :运算符= = (单个等号)不同于运算符= (双等号)。第一个是赋值运算符(将等号右 边的表达式值赋给左边的变量);第二个(=)是一个判断等于的关系运算符,用来判断 运算符两边的表达式是否相等。因此在上面例子中最后一个表达式(b=2) = a),我们 首先将数值 2 赋给变量 b,然后把它和

7、变量 a 进行比较。因为变量 a 中存储的也是数值 2,所以整个运算的结果为 true。 在 ANSI-C+标准出现之前的许多编译器中,就像 C 语言中,关系运算并不返回 值为真 truetrue 或假 falsefalse 的 boolbool 值,而是返回一个整型数值最为结果,它的数值 可以为 0 0,代表“falsefalse“或一个非 0 0 数值(通常为 1 1)来代表“truetrue“。 逻辑运算符逻辑运算符 Logic operators ( !, int main () int a,b,c;a=2;b=7;c = (ab) ? a : b;7 cout b)运算值为假(fal

8、se),所以整 个表达式(ab)?a:b 要取分号后面的值,也就是 b 的值 7。因此最后输出 c 的值为 7。逗号运算符逗号运算符 ( , )逗号运算符 (,) 用来分开多个表达式,并只取最右边的表达式的值返回。例如有以下代码:a = (b=3, b+2); 这行代码首先将 3 赋值给变量 b,然后将 b+2 赋值给变量 a。所以最后变量 a 的值为 5,而变量 b 的值为 3。位运算符位运算符 Bitwise Operators ( float f = 3.14; i = (int) f; 以上代码将浮点型数字 3.143.14 转换成一个整数值(3 3)。这里类型转换操作符为(intin

9、t)。在 C+中实现这一操作的另一种方法是使用构造函数 constructor 的形式:在要转换的表 达式前加变量类型并将表达式括在括号中:i = int ( f );以上两种类型转换的方法在 C+中都是合法的。另外 ANSI-C+针对面向对象编程 (object oriented programming)增加了新的类型转换操作符 (参考 Section 5.4, Advanced class type-casting).sizeof()这个运算符接受一个输入参数,该参数可以是一个变量类型或一个变量自己,返回该变 量类型(variable type) 或对象(object)所占的字节数: a

10、= sizeof (char); 这将会返回 1 给 a,因为 char 是一个常为 1 个字节的变量类型。sizeof 返回的值是一个常数,因此它总是在程序执行前就被固定了。 其它运算符其它运算符在本教程后面的章节里我们将看到更多的运算符,比如指向指针的运算或面向对象编程 特有的运算,等等,我们会在它们各自的章节里进行详细讨论。运算符的优先度运算符的优先度 Precedence of operators当多个操作数组成复杂的表达式时,我们可能会疑惑哪个运算先被计算,哪个后被计算。 例如以下表达式: a = 5 + 7 % 2 我们可以怀疑它实际上表示:a = 5 + (7 % 2) 结果为

11、6 6,还是 a = (5 + 7) % 2 结果为 0 0?正确答案为第一个,结果为 6。每一个运算符有一个固定的优先级,不仅对数学运算符 (我们可能在学习数学的时候已经很了解它们的优先顺序了),所有在 C+中出现的运 算符都有优先级。从最从最高级到最低级,运算的优先级按下表排列:优先级优先级 LevelLevel操作符操作符 OperatorOperator说明说明 DescriptionDescription结合方向结合方向 GroupingGrouping 1:范围从左到右2() . - + - dynamic_cast static_cast reinterpret_cast con

12、st_cast typeid后缀从左到右+ - ! sizeof new delete一元(前缀)* cin age; 声明一个整型变量 age 然后等待用户从键盘输入到 cin 并将输入值存储在这个变量中。cincin 只能在键盘输入回车键(RETURN)后才能处理前面输入的内容。因此即使你只要求输 入一个单独的字符,在用户按下回车键(RETURN)之前 cincin 将不会处理用户的输入的字符。在使用 cincin 输入的时候必须考虑后面的变量类型。如果你要求输入一个整数, extraction () 后面必须跟一个整型变量,如果要求一个字符,后面必须跟一个字符 型变量,如果要求一个字符串

13、,后面必须跟一个字符串型变量。 / i/o example #include int main () int i; cout i; cout a b; 等同于:cin a; cin b; 在以上两种情况下用户都必须输入两个数据,一个给变量 a,一个给变量 b。输入时两 个变量之间可以以任何有效的空白符号间隔,包括空格,跳跃符 tab 或换行。cin 和字符串和字符串我们可以像读取基本类型数据一样,使用 cin 和操作符来读取字符串,例如:cin mystring;但是,cin 只能读取一个单词,一旦碰到任何空格,读取操作就会停止。在很多时 候这并不是我们想要的操作,比如我们希望用户输入一个英文

14、句子,那么这种方法就无 法读取完整的句子,因为一定会遇到空格。要一次读取一整行输入,需要使用 C+的函数 getline,相对于是用 cin,我们更建议 使用 getline 来读取用户输入。例如:/ 读取字符串例子 #include Whats your name? Aqua Hello Aqua.#include using namespace std;int main () string mystr;cout 定义了一个叫做 stringstream 的类,使用这个类可以对基于 字符串的对象进行像流()一样的操作。这样,我们可以对字符串进行抽 取和插入操作,这对将字符串与数值互相转换非常

15、有用。例如,如果我们想将一个字符 串转换为一个整数,可以这样写:string mystr (“1204“); int myint; stringstream(mystr) myint;这个例子中先定义了一个字符串类型的对象 mystr,初始值为“1204“,又定义了一个整 数变量 myint。然后我们使用 stringstream 类的构造函数定义了这个类的对象,并以 字符串变量 mystr 为参数。因为我们可以像使用流一样使用 stringstream 的对象,所 以我们可以像使用 cin 那样使用操作符 后面跟一个整数变量来进行提取整数数据。 这段代码执行之后变量 myint 存储的是数值

16、 1204 。/ 字符串流的使用示例 #include #include Enter price: 22.25 Enter quantity: 7 Total price: 155.75#include using namespace std;int main () string mystr;float price=0;int quantity=0;cout price;cout quantity;cout 0) cout int main () int n; cout “; cin n; while (n0) cout 8 8, 7, 6, 5, 4, 3, 2, 1, FIRE! 程序开始

17、时提示用户输入一个倒计数的初始值。然后 while 循环开始,如果用户输入 的数值满足条件 n0 (即 n 比 0 大),后面跟的语句块将会被执行一定的次数,直到条 件 (n0) 不再满足(变为 false)。以上程序的所有处理过程可以用以下的描述来解释:从 mainmain 开始:1.用户输入一个数值赋给 n. 2.while 语句检查(n0)是否成立,这时有两种可能: otrue: 执行 statement (到第 3 步) ofalse: 跳过 statement. 程序直接执行第 5 步. 3.执行 statement: cout int main () unsigned long n

18、; do cout n; cout int main () for (int n=10; n0; n-) cout int main () int n; for (n=10; n0; n-) cout int main () for (int n=10; n0; n-) if (n=5) continue; cout int main () int n=10;10, 9, 8, 7, 6, 5, 4, 3, 2, 1, FIRE! loop: cout 0) goto loop; cout int addition (int a, int b) int r;r=a+b;return (r);

19、int main () int z;z = addition (5,3);cout int subtraction (int a, int b) int r;r=a-b;return (r); int main () int x=5, y=3, z;z = subtraction (7,2);cout using namespace std;void printmessage () cout void duplicate (int b*=2; c*=2; int main () int x=1, y=3, z=7; duplicate (x, y, z); cout z。这就是为什么上面的程序

20、中,主程序 mainmain 中的三个变量 x,x, y y 和 z z 在调用函数 duplicate 后打印结果显示他们的值增加了一倍。如果在声明下面的函数:void duplicate (int next = x+1; int main () int x=100, y, z; prevnext (x, y, z); cout int divide (int a, int b=2) int r; r=a/b; return (r); int main () cout 2 2.5 int divide (int a, int b) return (a/b); float divide (fl

21、oat a, float b) return (a/b); int main () int x=5,y=2; float n=5.0,m=2.0; cout long factorial (long a) if (a 1) return (a * factorial (a-1); else return (1); int main () long l; cout l; cout void odd (int a); void even (int a);int main () int i; do cout i; odd (i); while (i!=0); return 0; void odd (

22、int a) if (a%2)!=0) cout int billy = 16, 2, 77, 40, 12071; int n, result=0;int main () for ( n=0 ; n #define WIDTH 5 #define HEIGHT 3int jimmy HEIGHTWIDTH; int n,m;int main () for (n=0; n #define WIDTH 5 #define HEIGHT 3int jimmy HEIGHT * WIDTH; int n,m;int main () for (n=0; nvoid printarray (int ar

23、g , int length) for (int n=0; n #include int main () char szMyName 20; strcpy (szMyName,“J. Soulie“); cout void setstring (char szOut , char szIn ) int n=0; do szOutn = szInn; while (szInn+ != 0); int main () char szMyName 20; setstring (szMyName,“J. Soulie“); cout int main () char mybuffer 100; cou

24、t ) 来直接从标准输入设备接收数据。这个方法也同样可以被用来输入字符 串,例如,在上面的例子中我们也可以用以下代码来读取用户输入:cin mybuffer; 这种方法也可以工作,但它有以下局限性是 cin.getline 所没有的:它只能接收单独的词(而不能是完整的句子),因为这种方法以任何空白符为分隔 符,包括空格 spaces,跳跃符 tabulators,换行符 newlines 和回车符 arriage returns。 它不能给 buffer 指定容量,这使得程序不稳定,如果用户输入超出数组长度, 输入信息会被丢失。 因此,建议在需要用 cin 来输入字符串时,使用 cin.get

25、line 来代替 cin 。字符串和其它数据类型的转换字符串和其它数据类型的转换(Converting strings to other types)鉴于字符串可能包含其他数据类型的内容,例如数字,将字符串内容转换成数字型变量 的功能会有用处。例如一个字符串的内容可能是“1977“,但这一个 5 个字符组成序列, 并不容易转换为一个单独的整数。因此,函数库 cstdlib (stdlib.h) 提供了 3 个有用 的函数:atoi: 将字符串 string 转换为整型 int atol: 将字符串 string 转换为长整型 long atof: 将字符串 string 转换为浮点型 floa

26、t 所有这些函数接受一个参数,返回一个指定类型的数据(int, long 或 float)。这三个 函数与 cin.getline 一起使用来获得用户输入的数值,比传统的 cin 方法更可靠:/ cin and ato* functions #include #include int main () char mybuffer 100; float price; int quantity; cout int main ( ) int value1 = 5, value2 = 15; int * mypointer;value1=10 / value2=20mypointer = *mypoin

27、ter = 10; mypointer = *mypointer = 20; cout int main () int value1 = 5, value2 = 15; int *p1, *p2; p1 = / p1 = address of value1 p2 = / p2 = address of value2 *p1 = 10; / value pointed by p1 = 10 *p2 = *p1; / value pointed by p2 = value pointed by p1 p1 = p2; / p1 = p2 (value of pointer copied) *p1

28、= 20; / value pointed by p1 = 20 cout int main () int numbers5; int * p;10, 20, 30, 40, 50,p = numbers; *p = 10; p+; *p = 20; p = *p = 30; p = numbers + 3; *p = 40; p = numbers; *(p+4) = 50; for (int n=0; n6, 10, 13void increase (void* data, int type) switch (type) case sizeof(char) : (*(char*)data)

29、+; break; case sizeof(short): (*(short*)data)+; break; case sizeof(long) : (*(long*)data)+; break; int main () char a = 5; short b = 9; long c = 12; increase ( increase ( increase ( cout int addition (int a, int b) return (a+b); int subtraction (int a, int b) return (a-b); 8int (*minus)(int,int) = s

30、ubtraction; int operation (int x, int y, int (*functocall)(int,int) int g;g = (*functocall)(x,y);return (g); int main () int m,n;m = operation (7, 5, addition);n = operation (20, m, minus);cout title,50); cout year = atoi (buffer);cout title;Enter title: Matrix Enter year: 1999You have entered: Matr

31、ix (1999)cout year 。这是一个引用操作符,常与结构或类的指 针一起使用,以便引用其中的成员元素,这样就避免使用很多括号。例如,我们用:pmovie-title 来代替:(*pmovie).title 以上两种表达式 pmovie-title 和 (*pmovie).title 都是合法的,都表示取指针 pmovie 所指向的结构其元素 title 的值。我们要清楚将它和以下表达区分开:*pmovie.title 它相当于*(pmovie.title) 表示取结构 pmovie 的元素 title 作为指针所指向的值,这个表达式在本例中没有意义, 因为 title 本身不是指针

32、类型。下表中总结了指针和结构组成的各种可能的组合:表达式表达式描述描述等价于等价于pmovie.title结构 pmovie 的元素 titlepmovie-title指针 pmovie 所指向的结构其元素 title 的值(*pmovie).title *pmovie.title结构 pmovie 的元素 title 作为指针所指向的值*(pmovie.title)结构嵌套结构嵌套(Nesting structures)结构可以嵌套使用,即一个结构的元素本身又可以是另一个结构类型。例如:struct movies_t char title 50; int year; struct frien

33、ds_t char name 50; char email 50; movies_t favourite_movie; charlie, maria;friends_t * pfriends = 因此,在有以上声明之后,我们可以使用下面的表达式:charlie.name maria.favourite_movie.title charlie.favourite_movie.year pfriends-favourite_movie.year(以上最后两个表达式等价)本节中所讨论的结构的概念与 C 语言中结构概念是一样的。然而,在 C+中,结构的概 念已经被扩展到与类(class)相同的程度,只

34、是它所有的元素都是公开的(public)。在 后面的章节 4.1“类”中, 我们将进一步深入讨论这个问题。3.6 自定义数据类型自定义数据类型 (User defined data types)前面我们已经看到过一种用户(程序员)定义的数据类型:结构。除此之外,还有一些 其它类型的用户自定义数据类型:定义自己的数据类型定义自己的数据类型 (typedef)C+ 允许我们在现有数据类型的基础上定义我们自己的数据类型。我们将用关键字 typedef 来实现这种定义,它的形式是:typedef existing_type new_type_name;这里 existing_type 是 C+ 基本数

35、据类型或其它已经被定义了的数据类型, new_type_name 是我们将要定义的新数据类型的名称。例如:typedef char C; typedef unsigned int WORD; typedef char * string_t; typedef char field 50;在上面的例子中,我们定义了四种新的数据类型: C, WORD, string_t 和 field ,它 们分别代替 char, unsigned int, char* 和 char50 。这样,我们就可以安全的使 用以下代码:C achar, anotherchar, *ptchar1; WORD myword;

36、 string_t ptchar2; field name;如果在一个程序中我们反复使用一种数据类型,而在以后的版本中我们有可能改变该数 据类型的情况下,typedef 就很有用了。或者如果一种数据类型的名称太长,你想用一 个比较短的名字来代替,也可以是用 typedef。联合联合(Union)联合(Union) 使得同一段内存可以被按照不同的数据类型来访问,数据实际是存储在同 一个位置的。它的声明和使用看起来与结构(structure)十分相似,但实际功能是完全 不同的:union model_name type1 element1;type2 element2;type3 element3

37、;. object_name;union 中的所有被声明的元素占据同一段内存空间,其大小取声明中最长的元素的大小。 例如:union mytypes_t char c;int i;float f; mytypes;定义了 3 个元素:mytypes.c mytypes.i mytypes.f每一个是一种不同的数据类型。既然它们都指向同一段内存空间,改变其中一个元素的 值,将会影响所有其他元素的值。union 的用途之一是将一种较长的基本类型与由其它比较小的数据类型组成的结构 (structure)或数组(array)联合使用,例如:union mix_tlong l;struct short

38、hi;short lo; s;char c4; mix;以上例子中定义了 3 个名称:mix.l, mix.s 和 mix.c,我们可以通过这 3 个名字来访 问同一段 4 bytes 长的内存空间。至于使用哪一个名字来访问,取决于我们想使用什么 数据类型,是 long, short 还是 char 。下图显示了在这个联合(union)中各个元素在 内存中的的可能结构,以及我们如何通过不同的数据类型进行访问:匿名联合匿名联合(Anonymous union)在 C+ 我们可以选择使联合(union)匿名。如果我们将一个 union 包括在一 个结构(structure)的定义中,并且不赋予它

39、object 名称 (就是跟在花括号后 面的名字),这个 union 就是匿名的。这种情况下我们可以直接使用 union 中元素的名 字来访问该元素,而不需要再在前面加 union 对象的名称。在下面的例子中,我们可 以看到这两种表达方式在使用上的区别:unionunionanonymousanonymous unionunionstruct char title50;char author50;union float dollars;int yens; price;struct char title50;char author50;union float dollars;int yens;

40、book; book;以上两种定义的唯一区别在于左边的定义中我们给了 union 一个名字 price,而在右边 的定义中我们没给。在使用时的区别是当我们想访问一个对象(object)的元素 dollars 和 yens 时,在前一种定义的情况下,需要使用:book.price.dollars book.price.yens而在后面一种定义下,我们直接使用:book.dollars book.yens再一次提醒,因为这是一个联合(union),域 dollars 和 yens 占据的是同一块内存空 间,所以它们不能被用来存储两个不同的值。也就是你可以使用一个 dollars 或 yens 的价

41、格,但不能同时使用两者。枚举枚举 Enumerations (enum)枚举(Enumerations)可以用来生成一些任意类型的数据,不只限于数字类型或字符类型, 甚至常量 true 和 false。它的定义形式如下:enum model_name value1,value2,value3,. object_name;例如,我们可以定义一种新的变量类型叫做 color_t 来存储不同的颜色:enum colors_t black, blue, green, cyan, red, purple, yellow, white;注意在这个定义里我们没有使用任何基本数据类型。换句话说,我们创造了一种

42、的新的 数据类型,而它并没有基于任何已存在的数据类型:类型 color_t,花括号中包括了 它的所有的可能取值。例如,在定义了 colors_t 列举类型后,我们可以使用以下表达 式 :colors_t mycolor; mycolor = blue; if (mycolor = green) mycolor = red;实际上,我们的枚举数据类型在编译时是被编译为整型数值的,而它的数值列表可以是 任何指定的整型常量 。如果没有指定常量,枚举中第一个列出的可能值为 0 ,后面的 每一个值为前面一个值加 1。因此,在我们前面定义的数据类型 colors_t 中,black 相当于 0, blue

43、 相当于 1, green 相当于 2 ,后面依此类推。如果我们在定义枚举数据类型的时候明确指定某些可能值(例如第一个)的等价整数值, 后面的数值将会在此基础上增加,例如:enum months_t january=1, february, march, april,may, june, july, august,september, october, november, december y2k;在这个例子中,枚举类型 months_t 的变量 y2k 可以是 12 种可能取值中的任何一个, 从 january 到 december ,它们相当于数值 1 到 12,而不是 0 到 11 ,因

44、为我们已 经指定 january 等于 1。4.1 类(类(Classes)类(class)是一种将数据和函数组织在同一个结构里的逻辑方法。定义类的关键字为 class ,其功能与 C 语言中的 struct 类似,不同之处是 class 可以包含函数,而不像 struct 只能包含数据元素。类定义的形式是:class class_name permission_label_1:member1;permission_label_2:member2;. object_name;其中 class_name 是类的名称 (用户自定义的类型) ,而可选项 object_name 是一个 或几个对象(o

45、bject)标识。Class 的声明体中包含成员 members,成员可以是数据或函 数定义,同时也可以包括允许范围标志 permission labels,范围标志可以是以下三个 关键字中任意一个:private:, public: 或 protected:。它们分别代表以下含义:private :class 的 private 成员,只有同一个 class 的其他成员或该 class 的 “friend” class 可以访问这些成员。 protected :class 的 protected 成员,只有同一个 class 的其他成员,或该 class 的“friend” class,或该

46、 class 的子类(derived classes) 可以访问这 些成员。 public :class 的 public 成员,任何可以看到这个 class 的地方都可以访问这 些成员。 如果我们在定义一个 class 成员的时候没有声明其允许范围,这些成员将被默认为 private 范围。例如:class CRectangle int x, y;public:void set_values (int,int);int area (void); rect;上面例子定义了一个 class CRectangle 和该 class 类型的对象变量 rect 。这个 class 有 4 个成员:两个

47、整型变量 (x 和 y) ,在 private 部分 (因为 private 是默 认的允许范围);以及两个函数, 在 public 部分:set_values() 和 area(),这里只 包含了函数的原型(prototype)。注意注意 class 名称与对象(object)名称的不同:在上面的例子中,CRectangle 是 class 名称 (即用户定义的类型名称),而 rect 是一个 CRectangle 类型的对象名称。它们的 区别就像下面例子中类型名 int 和 变量名 a 的区别一样:int a; int 是 class 名称 (类型名) ,而 a 是对象名 object name (变量)。在程序中,我们可以通过使用对象名后面加一点再加成员名称(同使用 C structs 一样) ,来引用对象 rect 的任何 public 成员,就像它们只是一般的函数或变量。例如:rect.set_value (3,4); myarea = rect.area(); 但我们不能够引用 x 或 y ,因为它们是该 class 的 private 成员,它们只能够在该 class 的其它成员中被引用。晕了吗?下面是关于 class CRectangle 的一个复杂的例 子: / classes example#include class CRectan

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com