当前位置: 首页 > wzjs >正文

博艺园 网站建设灰色产业推广引流渠道

博艺园 网站建设,灰色产业推广引流渠道,ppt免费下载模板网站,seo联盟怎么赚钱《C程序设计基础教程》——刘厚泉,李政伟,二零一三年九月版,学习笔记 文章目录 1、一维数组的定义与初始化1.1、一维数组的定义1.2、一维数组的初始化 2、一维数组的使用3、一维数组与函数4、二维数组4.1、二维数组的定义4.2、二维数组的初始…

在这里插入图片描述

《C++程序设计基础教程》——刘厚泉,李政伟,二零一三年九月版,学习笔记


文章目录

  • 1、一维数组的定义与初始化
    • 1.1、一维数组的定义
    • 1.2、一维数组的初始化
  • 2、一维数组的使用
  • 3、一维数组与函数
  • 4、二维数组
    • 4.1、二维数组的定义
    • 4.2、二维数组的初始化
    • 4.3、二维数组的使用
  • 5、字符数组
    • 5.1、字符数组的定义
    • 5.2、字符数组的初始化
    • 5.3、字符数组的使用
    • 5.4、字符串常用函数
  • 6、string 类型
    • 6.1、字符串变量的定义与初始化
    • 6.2、字符串变量的使用
    • 6.3、字符串数组
  • 7、应用实例

1、一维数组的定义与初始化

1.1、一维数组的定义

把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组

数组相当于一次性定义出多个同类型的变量。

dataType arrayName[size];
  • dataType 是数组中元素的类型(如 int、float、char 等)。
  • arrayName 是数组的名称。
  • size 是数组中元素的数量,整型常量表达式

eg

int numbers[5];  // 定义一个包含5个整数的数组

在这里插入图片描述
eg

#include <iostream>
using namespace std;int main() 
{int a[10];for(int i=0; i<10; i++)cout << sizeof(a[i]) << ' ' << &a[i] << ' ' << a[i] << endl;return 0;
}

output

4 0x64b1bffaf0 0
4 0x64b1bffaf4 0
4 0x64b1bffaf8 560010489
4 0x64b1bffafc 32759
4 0x64b1bffb00 316807608
4 0x64b1bffb04 448
4 0x64b1bffb08 96
4 0x64b1bffb0c 0
4 0x64b1bffb10 316807664
4 0x64b1bffb14 448

1.2、一维数组的初始化

不初始化,数组空间里将是系统赋给的随机值(上面小节的例子中可以看出)

#include <iostream>
using namespace std;int main() 
{cout << "case 1" << endl;int s[6] = {1, 2, 3, 4, 5, 6};for(int i=0; i<6; i++)cout << s[i] << endl;cout << "case 2" << endl;int s1[] = {1, 2, 3, 4, 5, 6};for(int i=0; i<6; i++)cout << s1[i] << endl;cout << "case 3" << endl;int s2[6] = {1, 2, 3, 4};for(int i=0; i<6; i++)cout << s2[i] << endl;cout << "case 4" << endl;int s3[6] = {1};for(int i=0; i<6; i++)cout << s3[i] << endl;cout << "case 5" << endl;char s4[6] = "hello";  // 初始化字符数组为字符串 "hello",注意字符串末尾会自动加上空字符 '\0'for(int i=0; i<6; i++)cout << s4[i] << endl;return 0;
}

定义并初始化数组 char s4[6] = "hello!"; 会报错,因为字符数组在初始化时,末尾会自动加上空字符 \0 以标识字符串的结束。

output

case 1
1
2
3
4
5
6
case 2
1
2
3
4
5
6
case 3
1
2
3
4
0
0
case 4
1
0
0
0
0
0
case 5
h
e
l
l
o

注意,当离开了定义的语句,则不能用初始化列表对数组进行整体赋值。

error

int s[5];
s = {1,2,3,4,5}

error

int s[5];
s[5] = {1,2,3,4,5};

2、一维数组的使用

eg 5-1 从键盘输入 10 个整数,然后按输入的相反顺序输出

#include <iostream>
using namespace std;int main() 
{int a[10];for(int i=0; i<10; i++)cin >> a[i];for(int i=9; i>=0; i--)cout << a[i] << " ";return 0;
}

output

1 2 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1

eg 5-2,计算 Fibonacci 数列的前 10 个数据,用数组保存并打印出来

方法一,递归

#include <iostream>
using namespace std;int fibonacci(int x){if((x==1) || (x==2))return 1;elsereturn fibonacci(x-1) + fibonacci(x-2);}int main() 
{int a[10];for(int i=0; i<10; i++)a[i] = fibonacci(i+1);for(int i=0; i<10; i++)cout << a[i] << " ";return 0;
}

output

1 1 2 3 5 8 13 21 34 55

方法二,数组

#include <iostream>
using namespace std;int main() 
{int fibonacci[10] = {1, 1};for(int i=2; i<10; i++)fibonacci[i] = fibonacci[i-1] + fibonacci[i-2];for(int i=0; i<10; i++)cout << fibonacci[i] << " ";return 0;
}

output

1 1 2 3 5 8 13 21 34 55

3、一维数组与函数

由于数组名是一片连续空间的首地址,如果将其作为函数的实参,传递的内容将是一个地址。因此要求函数的形参是能够接受地址的变量,所以形参也需要声明一个数组。

eg 5-3,对数组的元素进行升序排序

#include <iostream>
using namespace std;void sort(int a[])
{for(int i=0; i<6; i++) // 进行6趟比较{for(int j=i+1; j<6; j++) // 每趟进行 5-i 次两两比较{if(a[i]>a[j])  // 如果前面的数字大于后面的数字,交换位置{int temp;temp = a[i];a[i] = a[j];a[j] = temp;}}}
}int main() 
{int a[6] = {8,3,6,1,9,7};sort(a);for(int i=0; i<6; i++)cout << a[i] << " ";return 0;
}

output

1 3 6 7 8 9 

上个例子展示了冒泡排序

系统没有为数组 a 开辟空间,而是让数组 a 和函数里面的数组 a 共用了同一块空间(因为是地址传递)

4、二维数组

二维数组是一种用于存储表格数据的结构,其中每个元素都是一个一维数组。

4.1、二维数组的定义

数据类型 数组名[整形常量表达式1][整形常量表达式2]

eg

int s[3][4];

error

int a[2,5];

二维数组虽然在形式上可以看作一个表格的形状,但在内存中的存放却是按照一维线性排列(行优先),这是由内存编址决定的
在这里插入图片描述

4.2、二维数组的初始化

按行

int s[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};

eg:

#include <iostream>
using namespace std;int main() 
{cout << "case1:"<<endl;int s[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};for(int i=0; i<3; i++){for(int j=0; j<4; j++)cout<<s[i][j] <<" ";cout << endl;}cout << "case2:"<<endl;int s2[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};for(int i=0; i<3; i++){for(int j=0; j<4; j++)cout<<s2[i][j] <<" ";cout << endl;}cout << "case3:"<<endl;int s3[3][4] = {1,2,3,4,5,6,};for(int i=0; i<3; i++){for(int j=0; j<4; j++)cout<<s3[i][j] <<" ";cout << endl;}cout << "case4:"<<endl;int s4[3][4] = {{1,2},{3,4,5},{6},};for(int i=0; i<3; i++){for(int j=0; j<4; j++)cout<<s4[i][j] <<" ";cout << endl;}return 0;
}

output

case1:
1 2 3 4
5 6 7 8
9 10 11 12
case2:
1 2 3 4
5 6 7 8
9 10 11 12
case3:
1 2 3 4
5 6 0 0
0 0 0 0
case4:
1 2 0 0
3 4 5 0
6 0 0 0

4.3、二维数组的使用

eg 5-4

#include <iostream>
using namespace std;int main() 
{int s[5][5] = {0};for(int i=0; i<5; i++){for(int j=0; j<5; j++)s[i][j] = 3*i +2*j - 8;}int sum1= 0;for(int i=0; i<5; i++){sum1 += s[3][i];}cout << "第四行所有元素之和为:" <<sum1 << endl;int avg= 0;for(int i=0; i<5; i++){avg += s[i][4];}cout << "第五列所有元素的平均值为:" << avg*1.0/5 << endl;int num =0;for(int i=0; i<5; i++){for(int j=0; j<5; j++){if ((i==j) && (s[i][j]<0))num += 1;}}cout << "主对角线负数的个数为:" << num << endl;return 0;
}

output

第四行所有元素之和为:25
第五列所有元素的平均值为:6
主对角线负数的个数为:2

下面用函数的形式实现上例

注意,二位数组作为形参的时候,必须给出数组类型,数组的维度,以及第二维的大小int s[][] 会报错 an array may not have elements of this type

eg 5-5

#include <iostream>
using namespace std;void sum_row(int s[][5])
{int sum1= 0;for(int i=0; i<5; i++){sum1 += s[3][i];}cout << "第四行所有元素之和为:" <<sum1 << endl;
}void avg_col(int s[][5])
{int avg= 0;for(int i=0; i<5; i++){avg += s[i][4];}cout << "第五列所有元素的平均值为:" << avg*1.0/5 << endl;
}void num(int s[][5])
{int num =0;for(int i=0; i<5; i++){for(int j=0; j<5; j++){if ((i==j) && (s[i][j]<0))num += 1;}}cout << "主对角线负数的个数为:" << num << endl;
}int main() 
{int s[5][5] = {0};for(int i=0; i<5; i++){for(int j=0; j<5; j++)s[i][j] = 3*i +2*j - 8;}sum_row(s);avg_col(s);num(s);return 0;
}

output

第四行所有元素之和为:25
第五列所有元素的平均值为:6
主对角线负数的个数为:2

5、字符数组

用来存放字符的数组。

字符数组常用于表示字符串

5.1、字符数组的定义

char myArray[10]; // 声明一个包含10个字符的数组,未初始化
char str[3][10];

5.2、字符数组的初始化

#include <iostream>
using namespace std;int main() 
{char c1[4] = {'a', 'b', 'c', 'd'};for(int i=0; i<4; i++)cout<<c1[i]<<endl;char c2[4] = {'a', 'b', 'c',};for(int i=0; i<4; i++)cout<<c2[i]<<endl;char c3[] = {'c', 'h', 'i', 'n', 'a'};cout << sizeof(c3) / sizeof(c3[0]) << endl;char c4[6] = {"china"};//char c5[6] = {"china!"};  // errorreturn 0;
}

output

a
b
c
d
a
b
c5

注意,字符串总是用 \0 作为串的结束符,所以用字符串初始化字符数组的时候,注意初始化长度+1

注意 char c3[] = {'c', 'h', 'i', 'n', 'a'}; 这种初始化方法

5.3、字符数组的使用

eg 5-6,输入十个字符,反向输出来

#include <iostream>
using namespace std;int main() 
{char a[10] = {'\0'};for(int i=0; i<10; i++)cin >> a[i];for(int i=9; i>=0; i--)cout << a[i] << " ";return 0;
}

output

a b c d e f e r f g
g f r e f e d c b a 

eg 5-7,输入正整数 m,使用最少张数的人民币纸币,凑成上述钱数 m

#include <iostream>
using namespace std;int main() 
{int mon[7] = {100, 50, 20, 10, 5, 2, 1};int num[7] = {0};int money;cin >> money;for(int i=0; i<7; i++){num[i] = money / mon[i];money = money - num[i] * mon[i];}for(int i=0; i<7; i++){if(num[i])cout << "需要" << num[i] << "张" << mon[i] << endl;}return 0;
}

output

863
需要8100
需要150
需要110
需要12
需要11

eg 5-8 从键盘获取一串字符,分别统计出其英文、数字和其他字符的数量

#include <iostream>
using namespace std;int main() 
{char s[30];for(int i=0; i<30; i++)cout << s[i] << " ";cout << "\n请输入字符串:";cin >> s;int alph=0, num=0, other=0;for(int i=0; i<30; i++){if (s[i] == '\0')break;if(s[i]>='0' && s[i]<='9')num += 1;else if (('a'<=s[i] && 'z'>=s[i]) || ('A'<=s[i] && 'Z'>=s[i]))alph += 1;elseother += 1;}cout<< "输入的字符串为:"<< s << endl;cout << alph << " " << num << " " << other << endl;return 0;
}

output

                        �  � � �  
请输入字符串:2we!489rsou3#
输入的字符串为:2we!489rsou3#
6 5 2

注意字符串数组可以直接 cout << ,不用循环输出

5.4、字符串常用函数

  • strcpy:复制一个字符串到另一个字符串。
  • strncpy:将源字符串的部分内容复制到目标字符串中,可以指定长度。注意,如果指定的长度不足以容纳源字符串的所有字符,目标字符串将不会被空字符’\0’正确终止。
  • strcat:在目标字符串末尾追加源字符串。
  • strncat:在目标字符串末尾追加源字符串的部分内容,可以指定长度。同样,如果指定的长度加上目标字符串的当前长度超过了目标字符串的总容量,可能会导致缓冲区溢出。
  • strlen:计算字符串的长度,不包括空字符’\0’。
  • strcmp:依照 ASCII 码表中的大小,依次比较两个字符串中对应位置上的字符,相等0,
  • strncmp:比较两个字符串的部分内容,可以指定长度。比较规则与strcmp相同。
  • atof:将字符串转换为浮点数。
  • atoi:将字符串转换为整数。
  • atol:将字符串转换为长整型数。

(1)字符串连接函数 strcat

strcat(s1, s2); 把 s2 中的字符串连接到 s1 字符串后面,返回的是 s1 的首地址

#include <iostream>
#include <string.h>
using namespace std;int main() 
{char s1[] = {"Kobe "};char s2[] = {"Bryant!"};strcat(s1, s2); // 把 s2 中的字符串连接到 s1 字符串后面,返回的是 s1 的首地址cout << s1 << endl;cout << s2 << endl;return 0;
}

output

Kobe Bryant!
Bryant!

注意 s1 中的 \0 会被覆盖掉

(2)字符串拷贝函数 strcpy

复制一个字符串到另一个字符串

#include <iostream>
#include <string.h>
using namespace std;int main() 
{char s1[] = {"I love "};char s2[] = {"apple!"};cout << strcpy(s1, s2)<< endl;return 0;
}

output

apple!

(3)字符串比较函数 strcmp

strcmp:依照 ASCII 码表中的大小,依次比较两个字符串中对应位置上的字符,相等0,

#include <iostream>
#include <string.h>
using namespace std;int main() 
{char s1[] = {"Kobe "};char s2[] = {"Bryant!"};char s3[] = {"Kobe "};cout << strcmp(s1, s2) << endl;cout << strcmp(s2, s1) << endl;cout << strcmp(s1, s3) << endl;return 0;
}

output

1
-1
0

(4)计算字符串长度函数 strlen

不包括 \0

#include <iostream>
#include <string.h>
using namespace std;int main() 
{char s1[] = {"I love "};char s2[] = {"apple!"};cout << strlen(s1)<< " " << strlen(s2) <<endl;return 0;
}

output

7 6

eg 5-9 从键盘获取三个字符串
(1)计算长度
(2)找出最大的字符串
(3)将三个字符串连起来放在 s1 中,并输出
(4)将 s3 的内容拷贝到 s2 中

#include <iostream>
#include <string.h>
using namespace std;int main() 
{char s1[30], s2[15], s3[10];cin >> s1 >> s2 >> s3;cout << strlen(s1) << " " << strlen(s2) << " " << strlen(s3) << endl;if(strcmp(s1, s2) > 0){if(strcmp(s1, s3) > 0)cout << "max s1:" << s1 << endl;elsecout << "max s3:" << s3 << endl;}else{if(strcmp(s2, s3) > 0)cout << "max s2:" << s2 << endl;elsecout << "max s3:" << s3 << endl;}strcat(s1,s2);strcat(s1,s3);cout << "s1+s2+s3:" << s1 << endl; strcpy(s2, s3);cout << "copy s3 to s2:" << s2 << endl;return 0;
}

output

we  
are
student
2 3 7
max s1:we
s1+s2+s3:wearestudent
copy s3 to s2:student

6、string 类型

c++ 将字符数组和一些常用操作封装成一个字符串类——string

6.1、字符串变量的定义与初始化

#include<string>
string s1;
string s2="apple";

字符串变量空间是动态的,其根据存储内容自动调整空间大小,因此不用担心存放的内容超出变量的空间

6.2、字符串变量的使用

(1)赋值

(2)比较

(3)连接

#include <iostream>
#include <string.h>
using namespace std;int main() 
{string s1 = "hello!";string s2 = "world!";if (s1 >= s2)cout << "max is s1:" << s1 << endl;elsecout << "max is s2:" << s2 << endl;cout << s1 + s2 << endl;s2 = s1; cout << s2 << endl;return 0;
}

output

max is s2:world!
hello!world!
hello!

6.3、字符串数组

通过 string 类型也可以定义出字符串数组,用来存储多个字符串

#include <iostream>
#include <string.h>
using namespace std;int main() 
{string s[] = {"Apple", "Banana", "Color"};for(int i=0; i< sizeof(s)/sizeof(s[0]); i++)cout << s[i] << endl;return 0;
}

output

Apple
Banana
Color

eg 5-10 从键盘中获取三个字符串,存入字符串数组,找出最大字符串,将三个字符串连起来

#include <iostream>
#include <string.h>
using namespace std;int main() 
{string s[3];for(int i=0; i<3; i++)cin >> s[i];if(s[0] >= s[1]){if(s[0]>=s[2])cout << "max is s[0]:" << s[0] << endl;elsecout << "max is s[2]:" << s[2] << endl;}else {if(s[1]>=s[2])cout << "max is s[1]:" << s[1] << endl;elsecout << "max is s[2]:" << s[2] << endl;}s[0] = s[0] + s[1] + s[2];cout << "s[0]+s[1]+s[2]:" << s[0] << endl;return 0;
}

output

a
water
melon
max is s[1]:water
s[0]+s[1]+s[2]:awatermelon

7、应用实例

eg 5-11,利用选择排序的算法,将包含10个元素的无序数列按升序排序

选择排序的思想,当进行第 i 次交换时,先从 n-i+1 个待排序数据中找出最小值(或最大值),然后和第 i 个元素交换;反复进行,直至完成 n-1 次交换。

#include <iostream>
#include <string.h>
using namespace std;void sort(int a[])
{for(int i=0; i<10; i++){int min_index = i;for(int j=i+1; j<10; j++){if(a[j] < a[min_index]){min_index = j;}}int tmp;tmp = a[i];a[i] = a[min_index];a[min_index] = tmp;}
}int main() 
{int a[10] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1};sort(a);for(int i=0; i<10; i++)cout << a[i] << ' ';return 0;
}

output

9 5 12 3 7 1 34 21 56 2
1 2 3 5 7 9 12 21 34 56 

eg 5-12 利用折半查找的算法在有序的数列中进行查询,给出查找结果。

#include <iostream>
#include <string.h>
using namespace std;int search(int a[], int x)
{int high=14, low=0, mid;mid = (high + low) / 2;while(x != a[mid]){if(x < a[mid]){low = mid+1;mid = (high + low) / 2;}else{high = mid-1;mid = (high + low) / 2;}}return mid;}int main() 
{int a[] = {95, 88, 73, 67, 56, 49, 37, 31, 29, 27, 18, 15, 13, 11, 9};int result = search(a, 56);cout << result << endl;return 0;
}

注意 mid 更新的时候,-1 和 +1,这个例子是降序的例子,升序的话改变下判定条件即可

output

4

eg 5-13 找出一个二维数组的鞍点,即该位置上的元素在该行最大,在该列上值最小(也可能没有鞍点)

#include <iostream>
#include <string.h>
using namespace std;int main() 
{int a[4][5] = {{1,2,3,4,5}, {2,4,6,8,10}, {3,6,9,12,16}, {4,8,12,16,20}};bool flag;for(int i=0; i<4; i++) // 遍历每一行{int max_raw = 0;for(int j=0; j<5-1; j++) // 找出该行最大值的索引{if(a[i][j]<=a[i][j+1])max_raw = j+1;}int max_col = 0;for(int k=0; k<4-1; k++) // 找出该列中最小值的索引{if(a[k][max_raw]>=a[k+1][max_raw])max_col = k+1;}if (max_col == i)cout << "raw:" << max_col << ", col:" << max_raw << " is " << a[max_col][max_raw] << endl;}return 0;
}

output

raw:0, col:4 is 5

eg 5-14 输入字符串 is,输出字符串 os,遍历字符串 is,数字替换成字母,字母保留,0-a,1-b,2-c,…,9-j

#include <iostream>
#include <string.h>
using namespace std;int main() 
{char is[80];char os[80];cin >> is;int i;for(i=0; i<80; i++){if(is[i] == '\0')break;if(is[i]>'9' || is[i]<'0')os[i] = is[i];else{os[i] = 'a' + is[i] - '0';}}os[i] = '\0'; // 加上变成字符串,方便 cout 输出cout << os << endl;return 0;
}

注意最后 os[i] = '\0'; 操作,是为了服务于 cout 的输出

output1

s1k02
sbkac

output2

abc5uf20t
abcfufcat

eg 5-15 存储 5 位学生的姓名,以及每个学生 4 门课的成绩,编写程序实现
(1)计算并输出每个同学的总成绩和平均成绩;
(2)根据学生的姓名进行查询,将姓名、各科成绩以及平均成绩输出,如果查不到,输出查无此人

#include <iostream>
#include <string.h>
using namespace std;int main() 
{string name[5]; // 存名字的字符串数组string find_name; // 待查找的名字int a[5][4]; // 存学生成绩的数组int sum[5]={0}; // 计算学科总分数组,记得初始化为 0float avg[5]; // 计算学科的平均分数组for(int i=0; i<5; i++){cin >> name[i]; // 输入学生名字int total = 0;for(int j=0; j<4; j++)  // 输入学生各科成绩{cin >> a[i][j];sum[i] += a[i][j];  // 计算总分}avg[i] = sum[i]*1.0/4; // 计算平均分}for(int i=0; i<5; i++){cout << name[i] << " " << sum[i] << " " << avg[i] << endl; // 输出}cout << endl << "请输入查找的名字:";cin >> find_name;  // 输入待查找的名字for(int i=0; i<5; i++){if(name[i]==find_name)cout << name[i] << " " << sum[i] << " " << avg[i] << endl;  // 查到输出}if(i==5)cout<<"查无此人" << endl; // 查不到输出return 0;
}

output1

wangli
76 78 89 80
liya
87 86 90 70
zhangli
79 76 80 90
jikai
79 90 86 69
xialin
89 79 68 90
wangli 323 80.75
liya 333 83.25
zhangli 325 81.25
jikai 324 81
xialin 326 81.5请输入查找的名字:zhangli
zhangli 325 81.25

output2

wangli
76 78 89 80
liya
87 86 90 70
zhangli
79 76 80 90
jikai
79 90 86 69
xialin
89 79 68 90
wangli 323 80.75
liya 333 83.25
zhangli 325 81.25
jikai 324 81
xialin 326 81.5请输入查找的名字:bryant
查无此人!
http://www.dtcms.com/wzjs/30215.html

相关文章:

  • 建公司网站流程免费发布信息的网站平台
  • 个人简历自我评价怎么写广州网站优化页面
  • 做微信平台图片网站腾讯新闻潍坊疫情
  • wordpress代码编辑插件trinseo公司
  • 金耀网站建设网站制作电商平台哪个最好最可靠
  • 广西网站建设建议企业推广文案
  • 平台如何做推广青岛网站seo
  • oss可以做网站根目录吗免费设计模板网站
  • 做英文的小说网站有哪些免费制作logo的网站
  • 常州哪家做网站好关键词seo价格
  • 日本做a的动画视频网站有哪些自己建网站怎么建
  • 政府单位建设微网站的好处百度网盘客服
  • 永康做企业网站的公司今天国际新闻最新消息
  • 佛山网站建设开发免费seo网站优化
  • 新手如何做英文网站赚美元网络营销策划书的结构
  • 阿坝北京网站建设怎么让客户主动找你
  • 建设网站用什么软件排版上海网站排名seo公司哪家好
  • 家用电脑桌面做网站农产品网络营销
  • wordpress大前端1.9长沙专业竞价优化首选
  • 音乐网站建设论文的目的和意义优化网络的软件下载
  • 青岛做网站哪里好明年2024年有疫情吗
  • 网站建设价格差异好大网站优化外包费用
  • 菜谱wordpress快速优化工具
  • 什么做书籍的网站google官网入口手机版
  • 商务网站建设综合实训报告温州seo网站推广
  • 自媒体平台怎么注册自动app优化最新版
  • wordpress core主题广州网站优化系统
  • 网站 关键词 挖掘百度手机导航官方新版
  • 用vs做网站后台竞价账户托管公司哪家好
  • 成都网站制作公司电话手机一键优化