长沙高升小区做汽车行业网站的网络公司论天心区网页设计,如何添加网站logo,wordpress嵌入视频,新华书店网站建设回调函数
//回调函数就是通过函数指针调用的函数
//这个在之前的转移表-计算器里面很明显#xff0c;通过函数指针数组内的函数指针进行函数的调用
//
//
// 将这四段代码分装成一个函数#xff0c;一个代码将这4个问题都解决
int Add(int x, int y)
{return x y;
}
int S…回调函数
//回调函数就是通过函数指针调用的函数
//这个在之前的转移表-计算器里面很明显通过函数指针数组内的函数指针进行函数的调用
//
//
// 将这四段代码分装成一个函数一个代码将这4个问题都解决
int Add(int x, int y)
{return x y;
}
int Sub(int x, int y)
{return x - y;
}
int Mull(int x, int y)
{return x * y;
}
int Div(int x, int y)
{return x / y;
}
void menu()
{printf(**************************************\n);printf(********** 1.add 2.sub***********\n);printf(********* 3.mull 4.div***********\n);printf(********* 0.exit *************\n);printf(**************************************\n);
}
void Calc(int (*pf)(int, int))//因为传过来的是函数的地址那么就要用函数指针进行接收
{int x 0, y 0,ret0;printf(请输入两个操作数);scanf(%d %d, x, y);ret pf(x, y);//当pf接收到的是加法函数的地址的时候我们直接用pf来调用//对于函数名就是函数的地址用指针变量存起来的就是函数地址那么指针变量的名字就是函数变量的地址//那么可以直接用指针变量的名字进行调用printf(%d\n, ret);
}
int main()
{int ret 0;int input 0;int x 0, y 0;do{menu();//菜单printf(请选择);scanf(%d, input);switch (input){case 1:Calc(Add); //将加法函数的地址传过去--函数名是地址 break;case 2:Calc(Sub); break;case 3:Calc(Mull); break;case 4:Calc(Div);break;case 0:printf(退出计算器\n);break;default:printf(选择错误,重新选择\n);break;}} while (input);return 0;
}//这4个代码的差异就是运算的方式不同
//
// Calc是中间商Add这些计算的函数是回调函数
//
// 通过函数调用另一个函数进行调用
//
//当你把函数的指针地址作为参数传递给另一个函数当这个指针被用来调用其
//所指向的函数时被调用的函数就是回调函数
//这个代码里面回调函数就是Add,Sub,Mull,Div回忆冒泡函数
//回忆冒泡排序---对一组整数进行排序
//void bubble_sort(int arr[], int sz)//接受一个整型数组
//{
// //趟数
// for (int i 0; i sz-1; i)
// {
// //一趟内部的两两比较
// for (int j 0; j sz - 1 - i; j)
// {
// if (arr[j] arr[j 1])
// {
// int tmp arr[j];
// arr[j] arr[j 1];
// arr[j 1] tmp;
// }
// }
// }
//}
//print(int arr[], int sz)
//{
// for (int i 0; i sz; i)
// {
// printf(%d , arr[i]);
// }
//}
//int main()
//{
// int arr[] { 3,1,7,9,4,2,6,8,0 };
// //进行排序--升序
// int sz sizeof(arr) / sizeof(arr[0]);
//
// //冒泡排序核心思想两两数字进行比较不满足我们要求的顺序的话我们可以对其进行交换
// //满足我们要求的顺序的话我们就换下一对数字进行比较
//
// //冒泡排序进行排序
// bubble_sort(arr,sz);
// print(arr,sz);
// return 0;
//}
//对于冒泡排序的话只能排序整型数组
//对于其他类型的数组无法排序
//字符串数组、字符数组、结构体数组、浮点数数组strcmp----字符串的大小比较
/字符串的比较
//应该使用strcmp进行比较
//int strcmp(const char* str1, const char* str2);
//char str1[]Hello;
//char str2[]hello;
//strcmp(str1, str2));
// 如果 strcmp 返回值大于 0
// 则表示第一个字符串str1在比较中大于第二个字符串str2。
// a,b,c,d,c,e,f
a,b,c,q
因为d的ASCII小于q的所以第一行的字符串就小于第二行的字符串
strcmp比较的不是长度比较的是对应位置的字符ASCII大小的
qsort的结构
而接下来介绍的qsort能适用于任意类型的数据的排序
void qsort(void* base,//指向待排序数组第一个元素的指针size_t num, //base指向的数组中的元素个数size_t size, //base指向的数组中每个元素的大小int(*com)(const void*, const void*)//函数指针--传递函数的地址//);利用qsprt进行整型数组的排序
//对于冒泡排序比较不同的类型的数据时两个循环没有什么差异但是对于不同的数据进行比较就有着差异
//对于整数是进行比较大小但是并不是所有的数据能能用比进行比较//既然不同数据的元素比较是有差异的那么就直接把两个元素比较的代码抽离出来
//谁要调用qsort来进行比较排序那就让谁提供比较的函数//下面的函数比较的是p1指向的元素和p2指向的元素
//对函数
//p1指向的元素比p2指向的元素小的时候返回的是小于0的数
//p1指向的元素等于p2指向的元素的时候返回的是0
//p1指向的元素比p2指向的元素打的时候返回的是大于0的数//咱么为了使用qsort函数我们必须提供一个比较2个整型的比较函数
//格式int cmp_int(const void*p1, const void*p2)那么这个函数的名字就是qsort函数的第四个条件
//int cmp_int(const void*p1, const void*p2)
//{
// //p1就指向了这个数组里面的3p2指向的就是1
// /*if(*p1*p2)*///不能这么写因为在函数的参数里面p1的类型是void*,p2是void*
// //void *指针不能进行解引用操作
// //将p1的类型强制转换成int*再进行解引用就行了 *(int*)p1
// //比较的三种情况
// if (*(int*)p1 *(int*)p2)
// {
// return 1;
// }
// else if (*(int*)p1 *(int*)p2)
// {
// return -1;
// }
// else
// {
// return 0;
// }
//
//}
//void print(int arr[], int sz)
//{
// for (int i 0; i sz; i)
// {
// printf(%d , arr[i]);
// }
//}
test这个函数测试qsort来排序整型数据
//void test1()
//{
// int arr[] { 3,1,7,9,4,2,6,8,0 };
// int sz sizeof(arr) / sizeof(arr[0]);
// qsort(arr, sz, sizeof(arr[0]), cmp_int);
// //(数组首元素地址数组长度每个元素字节大小进行比较大小的函数)
// print(arr, sz);//打印排序完后的数组
//}
//int main()
//{
// test1();
// return 0;
//}//提供想要排序的数组计算数组元素个数
//再利用qsort进行排序
//再利用qsort进行排序的时候要提供数组首元素的地址、数组长度、数组每个元素的字节大小、
//最后再提供一个比较的函数的函数名这个函数有固定的写法
//int cmp_int(const void*p1, const void*p2)
//因为p1和p2的类型都是void*不能对其进行解引用进行比较
//所以我们必须将其强制类型转换(int*)p1
//再对其进行解引用*(int*)p1
//再将*(int*)p1与*(int*)p2进行比较
//前者大于后者就返回大于0的数
//前者小于后者就返回小于0的数
//前者等于后者就返回0//对于qsort函数来说我们只需要额外构建一个比较函数就能利用qsort进行快速排列对于qsort函数来说我们只需要额外构建一个比较函数就能利用qsort进行快速排列
//对下面代码进行简化
// test1
int cmp_int(const void* p1, const void* p2)
{return *(int*)p1 - *(int*)p2;
}
//因为这里比较的是整数那么我们直接作差返回
void print(int arr[], int sz)
{for (int i 0; i sz; i){printf(%d , arr[i]);}
}
//test这个函数测试qsort来排序整型数据
void test1()
{int arr[] { 3,1,7,9,4,2,6,8,0 };int sz sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_int);//(数组首元素地址数组长度每个元素字节大小进行比较大小的函数)print(arr, sz);//打印排序完后的数组
}
int main()
{test1();return 0;
}利用qsprt进行结构体的排序
/*void qsort(void* base,//指向待排序数组第一个元素的指针size_t num, //base指向的数组中的元素个数size_t size, //base指向的数组中每个元素的大小int(*com)(const void*, const void*)//函数指针--传递函数的地址//);*/
//利用qsort函数对结构体进行排序
struct Stu//创建一个结构体
{char name[20];int age;
};//按照名字比较两个结构体的数据
int cmp_stu_by_name(const void* p1, const void* p2)//p1和p2分别指向数组中的结构体
{//先将p1强制类型转换//(struct Stu*)p1---结构体指针-----不能直接指向成员 错误写法(struct Stu*)p1-//要先括起来将强制类型转换后的结构阔起来才能找到成员//((struct Stu*)p1)-name, ((struct Stu*)p2)-name// //两个名字是字符串字符串比较是采用strcmp函数的return strcmp(((struct Stu*)p1)-name, ((struct Stu*)p2)-name);//因为strcmp函数的返回值和我们期望的qsort的第四个比较函数的返回值一样的//所以我们直接将strcmp的值返回//strcmp要包含头文件的include string.h
}
void print(struct Stu arr[], int sz)
{for (int i 0; i sz; i){printf(%s , arr[i].name);}
}
void test2()
{struct Stu arr[] { {zhangsan,20},{lisi,35},{wangwu,18}};//给了三个人的信息 //利用qsort对数组内的信息进行排序int sz sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_name);//传递的函数是进行比较两个结构体对象//但是我们现在是按照名字比较还是年龄比较呢print(arr, sz);
}int main()
{test2();return 0;
}//按照年龄排序
struct Stu//创建一个结构体
{char name[20];int age;
};
void print(struct Stu arr[], int sz)
{for (int i 0; i sz; i){printf(%d , arr[i].age);}
}//打印结果18 20 35
void cmp_stu_by_age(const void* p1, const void* p2)
{//return strcmp(((struct Stu*)p1)-age, ((struct Stu*)p2)-age);//因为age是两个整数所以不需要用strcmp了return ((struct Stu*)p1)-age-((struct Stu*)p2)-age;//将他们的值进行大小比较直接返回//前者大于后者直接返回大于0的数//前者小于后者直接返回小于0的数//前者等于后者直接返回0}
void test3()
{struct Stu arr[] { {zhangsan,20},{lisi,35},{wangwu,18} };int sz sizeof(arr) / sizeof(arr[0]);qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_age);print(arr, sz);}
int main()
{test3();return 0;
}关于结构体的补充知识点
利用结构体指针来访问结构体里面的成员对象
//结构体知识点补充,利用结构体指针来找到结构体里面的数据
struct Stu//创建一个结构体
{char name[20];int age;
};
int main()
{struct Stu s { zhangsan,20 };//第一种写法printf(%s %d\n, s.name, s.age);//这里的知识点就是利用结构体名字加点再加结构体对象就可以调用出对应的数struct Stu* pss;//将变量s的地址取出存放到结构体指针内//struct Stu*就是这个结构体指针ps的类型//ps里面存放的是s的地址ps就指向了s//第二种写法//那么我们利用ps来找到这个结构体数组里面的数据怎么找呢printf(%s %d\n, (*ps).name, (*ps).age);
//ps是里面存放的是这个结构体的地址对ps进行解引用得到的就是这个结构体s了//第三种写法printf(%s %d\n, ps-name, ps-age);//ps指向的对象的成员return 0;
}
//结构体成员访问操作符
// . 结构体变量.成员名
//- 结构体指针-成员名qsort函数的总结
对于qsort函数来说
主要的就是括号内的第四个元素也就是进行元素比较的函数的名字
对于qsort来说这个进行比较的函数只需要返回三种值
大于0小于0或者等于0只要传递回来就能直接快速排列
对于qsort函数来说
第一个元素是要排列的数组的首元素的地址就是数组名
第二个元素就是这个数组的元素个数sz
第三个元素就是每个元素的字节大小sizeof([0])
第四个元素就是这个比较的函数的函数名
对于这个比较函数就有说法了
这个就是固定格式
返回值是数字就是大于0的数0小于0的数所以函数前面是int
int cmp_int(const void* p1, const void* p2)
p1和p2的类型都是void*
p1和p2都指向的数组内的要进行比较的元素
如果要进行比较的话就需要对这个指针进行强制类型转换
假设
int*强制类型转换
(int*)p1
再对转换后的结果进行解引用就是p1指向的那个数
(int)p1
判断的是整型数组的话
那么我们直接写return* (int*)p1 - *(int*)p2;
两个数进行相减返回值三种情况大于0的数、0、小于0的数 假如说要判断结构体成员的年龄的话
return ((struct Stu)p1)-age-((struct Stu)p2)-age;
返回的就是年龄相减的值
先强制类型转换p1
(struct Stu*)p1
因为p1指向的是这个结构体数组那么我们直接通过箭头操作符直接访问数据
(struct Stu*)p1→age
假如说要判断结构体成员的姓名的话
对于这个结构体数组来说这个姓名就是字符串
对于字符串的比较我们要用到strcmp函数
因为我们想要的这个比较函数的返回值和这个strcmp的返回值一样的那么我们直接返回strcm函数的值
return strcmp(((struct Stu)p1)-name, ((struct Stu)p2)-name);
strcmp(((struct Stu)p1)-name, ((struct Stu)p2)-name)
在strcmp函数中进行比较的是((struct Stu)p1)-name和((struct Stu)p2)-name
qsort实现升序和降序的原理
因为qsort默认实现的是升序
对于数组的快排如果我们想实现数组的降序
因为qsort是固定死的
但是qsort里面的一个元素第四个元素比较函数
我们只能通过这个比较函数来实现降序
对于这个代码
return ((struct Stu)p1)-age-((struct Stu)p2)-age;
如果前者大于后者就返回大于0的数如果是升序的话那么就要将这个较大的数和这个较小的数进行交换因为我们要实现升序的效果就是从小到大
如果想实现降序的话我们将逻辑反过来
return ((struct Stu)p2)-age-((struct Stu)p1)-age;
后面的大于前面的返回值是小于0的数因为要实现降序那么我们就将较大的数与较小的数进行交换
咱们仔细想想
对于qsort函数来讲我们交换数组元素的条件是啥呢
就是这个返回的值
如果我们写的是前面的值减去后面的值大于0的话就进行交换就是前面的数大于后面的数把大的换后面去所以这种写法代表的排序顺序就是升序
假如后面的值大一些呢就是前面值减去后面的值小于0就是说后面的大前面的小就将这两个数进行交换那么大的值都在前面小的值在后面那么我们就实现了降序了
就是对于qsort来说我们这个快速排列需要交换满足条件的值那么这个比较函数里面的条件就是这个满足交换条件的值交换的条件就是return 后面的条件如果这个返回值大于0的话就将这两个数进行对调了
p1-p20我们就对调这两个数----大的换后面去---升序
p2-p10我们就对调这两个数----大的换前面去----降序
qsort函数的模拟实现
//我们是否能将bubble_sort函数改造成通用的算法可以排序任意类型的数据
//模仿qsort
struct stu
{char name[20];int age;
};
int cmp_stu_by_name(const void* p1, const void* p2)
{return strcmp(((struct stu*)p1)-name, ((struct stu*)p2)-name);
}int cmp_int(const void* p1, const void* p2)
{return *(int*)p1 - *(int*)p2;
}
int cmp_stu_by_age(const void* p1, const void* p2)
{return ((struct stu*)p1)-age - ((struct stu*)p2)-age;
}void Swap(char* buf1, char* buf2, size_t width)//传过来的是hcar*指针那么我们就用char*接受
{char tmp 0;for (int i 0; i width; i)//因为不知道两个元素之间有多少个字节那么我们就把每个字节进行交换{tmp *buf1;*buf1 *buf2;*buf2 tmp;//这里仅仅只是交换一对字节因为char类型是1个字节//交换完这一对字节那我们就换下一对字节进行交换因为buf1和buf2都是指针那么我们利用指针的加减来实现字节间的加加buf1;buf2;//这个循环总共进行width次每次一对字节交换}
}//size_t是无符号整型
void bubble_sort(void *base,size_t sz,size_t width,int(*cmp)(const void*p1, const void* p2))//将函数的形参改成void*因为我们不知道传过来的是什么类型的数据
//而恰好void*可以接收任意类型的地址,那么bubble_sort这个函数就能处理任意类型的数据了//这里的base指向的是数组的首元素的地址sz是数组元素个数
//仅仅知道这两个消息是仅仅不够的因为我们不知道每个元素的字节大小是多少因为不同类型的元素字节大小不同//解释一下这个函数第一个接收的是数组首元素的地址第二个是数组元素个数第三个是元素之间的宽度就是字节大小
//第四个就是比较函数
{//趟数for (int i 0; i sz-1; i){//一趟内部的两两比较for (int j 0; j sz - 1 - i; j){//唯一要改变的就是下面的比较的代码了//1.比较两个元素if (cmp((char*)base j * width, (char*)base (j 1) * width) 0)//如果比较函数的返回值大于0就进行交换//如果传过去的元素满足条件大于0满足交换的条件那么就进入条件语句进行交换//那么我们需要将arr[j]的地址和arr[j1]的地址传到比较函数进行大小比较//元素之间的字符大小根据j的变化来表示j*width//将base强制转换成char*指针因为对于char*来说加几就是跳过几个字节//(char)basewidth{//2.交换两个元素Swap((char*)base j * width, (char*)base (j 1) * width,width);//将起始地址传过去但是并不知道交换多宽的数据我们就一定得将宽度传过去//将两个交换的元素传过去还有宽度也传过去
//交换的是(char*)base j * width和 (char*)base (j 1) * width这两个地址指向的元素}}}
}
print(int arr[], int sz)
{for (int i 0; i sz; i){printf(%d , arr[i]);}
}void test1()
{int arr[] { 3,1,7,9,4,2,6,8,0 };int sz sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);//cmp_int就是最前面的比较函数print(arr, sz);
}void test2()
{struct stu arr[] { {zhangsan, 20},{lisi,35},{wangwu, 18} };int sz sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz, sizeof(arr[0]), cmp_stu_by_name);}
void test3()
{struct stu arr[] { {zhangsan, 20},{lisi,35},{wangwu, 18} };int sz sizeof(arr) / sizeof(arr[0]);bubble_sort(arr, sz, sizeof(arr[0]), cmp_stu_by_age);
}int main()
{test1();//对于整型数组//test2();//对于结构体--姓名//test3();//对于结构体--年龄return 0;
}//p1和p2指向的是我要比较的两个元素
//因为排序我们得知道他们的大小才能进行那么这个bubble_sort的第四个形参的那个比较函数的返回值就体现了他们的大小
//
//
//
//
// 对于不同的类型的数据间的比较我们要将内循环里面的比较条件语句进行改变
//
//
// 整理一下
// 拿这个整数数组排列来说
//
// 首先我们先创建了一个test函数test函数里面有数组的创建和数组长度的计算还有一个冒泡函数
//
// 对于冒泡函数
// 我们传过去了一个首元素的地址--就是数组名
// 还传过去数组的长度
// 还有数组元素之间的宽度因为我们不知道不同元素间的宽度
// 最后还传了一个比较数组函数的函数名字
//
//
//
// 在经典的冒泡函数中我们利用两层循环对数组进行排序
//
// 而面对不同的元素的时候这个比较的条件一定是要进行更换的但是两层循环可以不用动
//
//
// 在我们创建冒泡函数接受传来的实参的时候有这么几个元素
//
// 我们用void*base来接受传来的数组名因为我们并不知道传来的是什么类型的数据恰好void*类型就可以接待任何类型的数据了
//
// 在后面我们创建了size_t sz来接受数组长度size_t就是无符号整型的意思
//
// 在后面我们又创建了一个size_t width,用来接收传来的数组中元素之间的字节宽度
//
// 最后因为下面传来的实参是比较数组中两个相邻元素的函数那么我们就用一个函数指针进行接收一定是比较函数哦
// 在这个函数指针创建的时候可是有说法哦
// int(*cmp)(const void *p1,const void *p2)
//返回类型是整数的函数指针返回类型有三种大于0等于0小于0的整数
// 利用返回的值进行判断判断是否交换这两个相邻的元素的位置
//
// 而里面的const void *p1就是来接受任何类型的地址
//
// 说完冒泡排序的外面再说里面吧
//
// 出了基本的两层循环改变的就是里面的条件语句
// if (cmp((char*)base j * width, (char*)base (j 1) * width) 0)
// 利用传来的比较函数我们比较了数组中相邻的两个元素的大小如果返回值0,我们就让这两个相邻的元素进行交换
// 将base的指针类型强制转换成char*类型的指针
// (char*)base j * width这个就是这个比较函数的第一个元素也是起始点
// (char*)base (j 1) * width这个是第二个元素结束点
//
// 将两个元素传到比较函数里面返回的值就是return *int*p1-*int*p2
//
// 可能你们又忘了为什么这么写
// p1的类型在上面是void*类型我们就需要将其强制转换到整型元素再对其进行解引用操作返回的值就是这两个元素之间的差值反应两个元素的大小
//
//
// 为什么后面还有j*width呢
// 随着j的变化从0到sz-1-i,因为char类型的数据是1个字节的如果我们有了width了我们就知道我们该从哪里比较到哪里停止了
//
//
//
// 那么就进入这个if条件语句里面的Swap交换函数了
//
// 这个交换函数可有意思
// 传过来的元素地址(char*)base j * width, (char*)base (j 1) * width,width
//
// 因为传过来的是地址所以我们就用指针进行接收我们还接受了元素的宽度
// 在这个函数里面我们创建了一个临时变量tmp
// 还创建了一个循环 i从0开始到width结束就是循环width次有多少个字节就交换几次下面的就是很常见的交换的步骤了
// 但是是指针之间的交换这些指针都是1个字节因为传过来的是char*类型的指针
//
// 再后面就进行指针换另一个字节直到两个元素之间的字节都交换完成那么这两个元素就交换完成了
// 交换四对字节
//
//这些代码没有具体类型的要求你只要传一个数据我们都能接受
// 因为我们使用void*类型的指针进行存储的
文章转载自: http://www.morning.mhxlb.cn.gov.cn.mhxlb.cn http://www.morning.gqbtw.cn.gov.cn.gqbtw.cn http://www.morning.wnzgm.cn.gov.cn.wnzgm.cn http://www.morning.qmzwl.cn.gov.cn.qmzwl.cn http://www.morning.nwcgj.cn.gov.cn.nwcgj.cn http://www.morning.kjkml.cn.gov.cn.kjkml.cn http://www.morning.rfrxt.cn.gov.cn.rfrxt.cn http://www.morning.lrybz.cn.gov.cn.lrybz.cn http://www.morning.xrct.cn.gov.cn.xrct.cn http://www.morning.kfbth.cn.gov.cn.kfbth.cn http://www.morning.jtfsd.cn.gov.cn.jtfsd.cn http://www.morning.hxwhyjh.com.gov.cn.hxwhyjh.com http://www.morning.wmmtl.cn.gov.cn.wmmtl.cn http://www.morning.dxhdn.cn.gov.cn.dxhdn.cn http://www.morning.lyldhg.cn.gov.cn.lyldhg.cn http://www.morning.zzhqs.cn.gov.cn.zzhqs.cn http://www.morning.nfbkp.cn.gov.cn.nfbkp.cn http://www.morning.nqmkr.cn.gov.cn.nqmkr.cn http://www.morning.msbpb.cn.gov.cn.msbpb.cn http://www.morning.fmrd.cn.gov.cn.fmrd.cn http://www.morning.bfjyp.cn.gov.cn.bfjyp.cn http://www.morning.prls.cn.gov.cn.prls.cn http://www.morning.hwnnh.cn.gov.cn.hwnnh.cn http://www.morning.wfbs.cn.gov.cn.wfbs.cn http://www.morning.yqjjn.cn.gov.cn.yqjjn.cn http://www.morning.ybqlb.cn.gov.cn.ybqlb.cn http://www.morning.wgzgr.cn.gov.cn.wgzgr.cn http://www.morning.dhdzz.cn.gov.cn.dhdzz.cn http://www.morning.kfclh.cn.gov.cn.kfclh.cn http://www.morning.jygsq.cn.gov.cn.jygsq.cn http://www.morning.dtnjr.cn.gov.cn.dtnjr.cn http://www.morning.kdhrf.cn.gov.cn.kdhrf.cn http://www.morning.qpljg.cn.gov.cn.qpljg.cn http://www.morning.zzfqn.cn.gov.cn.zzfqn.cn http://www.morning.wpqcj.cn.gov.cn.wpqcj.cn http://www.morning.bwttp.cn.gov.cn.bwttp.cn http://www.morning.lxhgj.cn.gov.cn.lxhgj.cn http://www.morning.xpmhs.cn.gov.cn.xpmhs.cn http://www.morning.qrzqd.cn.gov.cn.qrzqd.cn http://www.morning.kwwkm.cn.gov.cn.kwwkm.cn http://www.morning.qhnmj.cn.gov.cn.qhnmj.cn http://www.morning.jjxxm.cn.gov.cn.jjxxm.cn http://www.morning.shyqcgw.cn.gov.cn.shyqcgw.cn http://www.morning.shxmr.cn.gov.cn.shxmr.cn http://www.morning.cfnsn.cn.gov.cn.cfnsn.cn http://www.morning.cwyrp.cn.gov.cn.cwyrp.cn http://www.morning.pxtgf.cn.gov.cn.pxtgf.cn http://www.morning.pwdrc.cn.gov.cn.pwdrc.cn http://www.morning.zrmxp.cn.gov.cn.zrmxp.cn http://www.morning.dtfgr.cn.gov.cn.dtfgr.cn http://www.morning.kxrld.cn.gov.cn.kxrld.cn http://www.morning.bpmtj.cn.gov.cn.bpmtj.cn http://www.morning.hnrqn.cn.gov.cn.hnrqn.cn http://www.morning.mxnrl.cn.gov.cn.mxnrl.cn http://www.morning.rqzyz.cn.gov.cn.rqzyz.cn http://www.morning.sqskm.cn.gov.cn.sqskm.cn http://www.morning.c7512.cn.gov.cn.c7512.cn http://www.morning.sldrd.cn.gov.cn.sldrd.cn http://www.morning.vvbsxm.cn.gov.cn.vvbsxm.cn http://www.morning.fbxdp.cn.gov.cn.fbxdp.cn http://www.morning.dmwck.cn.gov.cn.dmwck.cn http://www.morning.bhqlj.cn.gov.cn.bhqlj.cn http://www.morning.rtmqy.cn.gov.cn.rtmqy.cn http://www.morning.wdwfm.cn.gov.cn.wdwfm.cn http://www.morning.nspzy.cn.gov.cn.nspzy.cn http://www.morning.jfxdy.cn.gov.cn.jfxdy.cn http://www.morning.nbiotank.com.gov.cn.nbiotank.com http://www.morning.ftrpvh.cn.gov.cn.ftrpvh.cn http://www.morning.wtbzt.cn.gov.cn.wtbzt.cn http://www.morning.wmmqf.cn.gov.cn.wmmqf.cn http://www.morning.tgqzp.cn.gov.cn.tgqzp.cn http://www.morning.rwrn.cn.gov.cn.rwrn.cn http://www.morning.jcffp.cn.gov.cn.jcffp.cn http://www.morning.ykbgs.cn.gov.cn.ykbgs.cn http://www.morning.prysb.cn.gov.cn.prysb.cn http://www.morning.mngh.cn.gov.cn.mngh.cn http://www.morning.zmyzt.cn.gov.cn.zmyzt.cn http://www.morning.nbnq.cn.gov.cn.nbnq.cn http://www.morning.rbgqn.cn.gov.cn.rbgqn.cn http://www.morning.mkyny.cn.gov.cn.mkyny.cn