门户网站建设提案,做一组静态页面网站多少钱,广告公司推广平台,展馆展示设计公司一般做什么设计目录
前言
一、整体逻辑分析
二、实现步骤
1、创建菜单和多次操作问题
2、创建通讯录
3、初始化通讯录
4、添加联系人
5、显示联系人
6、删除指定联系人
7、查找指定联系人
8、修改联系人信息
9、排序联系人信息
三、全部源码 前言 我们上期已经详细的介绍了自定…目录
前言
一、整体逻辑分析
二、实现步骤
1、创建菜单和多次操作问题
2、创建通讯录
3、初始化通讯录
4、添加联系人
5、显示联系人
6、删除指定联系人
7、查找指定联系人
8、修改联系人信息
9、排序联系人信息
三、全部源码 前言 我们上期已经详细的介绍了自定义类型本期我们来用学过的知识来做个小项目来练习练习。本期我们将用C语言实现通讯录静态版后期介绍了动态内存管理和文件操作我们将会在此版本的基础上进行优化改进 一、整体逻辑分析 我们还和以前实现三子棋和扫雷小项目一样先对整体工程的逻辑尽可能详细的梳理否则一开就是一顿狂敲最后一走发现全是Bug这样就不好了我们一开始尽可能的分析清楚后面即使出现了问题也能快速确定本期还是和往期一样采用多文件编程OK我们下面一起来梳理一下这个小项目的基本实现逻辑 1、创建菜单和多次操作问题 2、创建通讯录 3、通讯录的初始化以及增删查改等操作 二、实现步骤
1、创建菜单和多次操作问题 我们期望当我们进行对通讯录操作时可以给我们在进行操作前给一个菜单功能我们操作考虑到后面还要多次操作通讯录增删查改等我们结合起来很快想到用do..while循环处理最为合理这里以前写过两三遍了我们直接上代码 #includecontact.hvoid menu()
{printf(*****************************************\n);printf(********* 1. add 2. del **********\n);printf(********* 3. search 4. modify **********\n);printf(********* 5. show 6. sort **********\n);printf(********* 0. exit **********\n);printf(*****************************************\n);
}void test()
{int input 0;do{menu();printf(请选择操作数: );scanf(%d, input);switch (input){case 1://addbreak;case 2://delbreak;case 3://searchbreak;case 4://modifybreak;case 5://showbreak;case 6://sortbreak;case 0:printf(退出成功!\n);break;default:printf(选择数非法!\n);break;}} while (input);
}int main()
{test();return 0;
}
看效果 2、创建通讯录 我们在对通讯录进行各种操作前先得有个通讯录吧通讯录的本质还是描述一个人的属性例如姓名、年龄、性别、电话、住址等这些都是不同的类型我们很容易想到用结构体就能解决但这只是描述一个人你的通讯录不可能只有一个人吧应该是有很多个而这些联系人又是同一类型因此采用结构体数组来创建通讯录 typedef struct PeoInfo
{char name[20];int age;char sex[5];char tele[15];char addr[20];
}PeoInfo; 这就是描述一个人基本属性的结构体当创建好了这个结构体后我们就可以在test.c这个文件中do..while循环那里可以创建结构体数组来作为通讯录了 但这样写会有个问题就是当你存入或删除联系人后想打印出来看看是此时通讯录中的联系人时应该打印多少我们还想不知道。所以这里我们还得再定义一个变量sz来记录通讯录的大小 其实我们发现sz不仅是可以记录通讯录的大小而且增加联系人的时候只需要增加到sz位置即可增加一个sz,当删除一个sz--;这样其实 sz和通讯录是绑定在一起的我们不妨在对通讯录进行一层封装把他也封装成一个结构体一个成员是PeoInfo结构体数组一个是记录通讯录大小的sz: typedef struct PeoInfo
{char name[20];int age;char sex[5];char tele[15];char addr[20];
}PeoInfo;typedef struct Contact
{PeoInfo data[100];int sz;
}Contact;
然后再在test.c文件中创建即可 OK这个创建通讯录记好了其实这里还可已在稍微优化一下我们发现两个结构体中都出现了大量的常数我们万一后期需求有变这些都得改因此为了后期修改方便我们把这些都改成#define的常量后期修改起来容易这里你可能会说上期不是介绍了枚举吗这里正好是多个常量枚举不是更好吗这里枚举确实可以达到目的但枚举是在没开始前就能列举出来所有可能我们这个可不是所以这里不用枚举 #define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 15
#define ADDR_MAX 20
#define MAX 100typedef struct PeoInfo
{char name[NAME_MAX];int age;char sex[SEX_MAX];char tele[TELE_MAX];char addr[ADDR_MAX];
}PeoInfo;typedef struct Contact
{PeoInfo data[MAX];int sz;
}Contact;
这样才是当前逻辑下的最优代码
3、初始化通讯录 当我们创建好了通讯录后我们先对其进行一个初始化把结构体数组的每个元素都初始化为0通讯录大小也置为0因为我们要改变结构体的内容所以应该传地址我们这里采用的是memset这个函数直接初始化为0也可以用个循环来初始化不了解memset的点击memset void InitContact(Contact* pc)
{assert(pc);memset(pc-data, 0, sizeof(pc-data));pc-sz 0;
}
4、添加联系人 我们前面已经说过了只需要在sz的位置增加即可但要考虑通讯录满的情况 void AddContact(Contact* pc)
{assert(pc);//通讯录已满if (pc-sz MAX){printf(通讯录已满无法添加!\n);return;}//添加联系人printf(请输入联系人姓名: );scanf(%s, pc-data[pc-sz].name);printf(请输入联系人年龄: );scanf(%d, pc-data[pc-sz].age);printf(请输入联系人性别: );scanf(%s, pc-data[pc-sz].sex);printf(请输入联系人电话: );scanf(%s, pc-data[pc-sz].tele);printf(请输入联系人住址: );scanf(%s, pc-data[pc-sz].addr);pc-sz;printf(添加成功!\n);
}
OK我们下面先来写一个显示联系人来验证一下是否添加成功
5、显示联系人 显示联系人就是把通讯录中的联系人打印在控制台 void ShowContact(Contact* pc)
{assert(pc);printf(%-s\t%-s\t%-5s\t%-15s\t%-20s\n, 姓名, 年龄, 性别, 电话, 住址);for (int i 0; i pc-sz; i){printf(%-s\t%-d\t%-5s\t%-15s\t%-20s\n,pc-data[i].name,pc-data[i].age,pc-data[i].sex,pc-data[i].tele,pc-data[i].addr);}
}
OK我们来看看是否添加成功以及显示联系人 OK添加联系人和显示联系人都成功了说明我们上面逻辑没有问题
6、删除指定联系人 我们输入要删除的人的姓名进行查找找到了删除否则输出没有此联系人注意考虑通讯录为空的情况这里提到了查找这个查找和通讯录的那个查找有点不一样这个是查找后返回下标即可那个是还要打印联系人信息功能不一样。因此我们单独在封装一个函数 //查找要删除的人并返回下标
int FindContact(const Contact* pc, const char* name)
{for (int i 0; i pc-sz; i){if (strcmp(pc-data[i].name, name) 0){return i;//找到了}}return -1;//没找到
}//删除联系人
void DelContact(Contact* pc)
{assert(pc);//通讯录为空if (pc-sz 0){printf(通讯录为空无法删除!\n);return;}char name[NAME_MAX] { 0 };printf(请输入要删除人的姓名: );scanf(%s, name);int pos FindContact(pc, name);if (pos ! -1){//删除for (int i pos; i pc-sz - 1; i){pc-data[i] pc-data[i 1];}pc-sz--;printf(成功删除联系人!\n);}else{printf(没有此联系人!\n);}
} 这里要注意的是比较字符串要用strcmp不能用 这个我们在字符串函数和内存函数那一期详细介绍过另外注意删除的时候那里下标越界问题 看效果 7、查找指定联系人 查找指定联系人还是先按指定方式进行查找 找到了打印否则输出没有此联系人这里显示一个联系人的这个里后面修改联系人也可能要用所以我们为了方便把他封装成一个函数后面直接调用即可 //显示单个联系人信息
void Print(const Contact* pc, int pos)
{assert(pc);printf(%-s\t%-s\t%-5s\t%-15s\t%-20s\n, 姓名, 年龄, 性别, 电话, 住址);printf(%-s\t%-d\t%-5s\t%-15s\t%-20s\n,pc-data[pos].name,pc-data[pos].age,pc-data[pos].sex,pc-data[pos].tele,pc-data[pos].addr);}//查找指定联系人
void Search(const Contact* pc)
{assert(pc);char name[NAME_MAX] { 0 };printf(请输入要查找联系人姓名: );scanf(%s, name);int pos -1;//初始化为-1表示没有此联系人for (int i 0; i pc-sz; i){if (strcmp(pc-data[i].name, name) 0){pos i;//找到了break;}}if (pos ! -1){Print(pc, pos);}else{printf(没有此联系人!\n);}
}
其实还可以在简洁一点上面已经实现了FindContact我们可以用一下
void Search(const Contact* pc)
{assert(pc);char name[NAME_MAX] { 0 };printf(请输入要查找联系人姓名: );scanf(%s, name);int pos FindContact(pc, name);if (pos ! -1){Print(pc, pos);}else{printf(没有此联系人!\n);}
}
看效果 8、修改联系人信息 修改联系人信息这块就有很多可能比如只修改一项例如名字或性别等也有可能修改多项例如名字、年龄等也有可能得全部修改这几种情况。当我们要修改之前群殴我们能还是期望有一个菜单供我们选择当修改完一项后我们可能还要继续修改。基于此我们采用和test.c文件中得do...while循环菜单 //修改联系人信息菜单
void menu1()
{system(cls);printf(*****************************************\n);printf(********* 1. name 2. age **********\n);printf(********* 3. sex 4. tele **********\n);printf(********* 5. addr 6. all **********\n);printf(********* 0. exit **********\n);printf(*****************************************\n);
}//修改名字
void ModName(Contact* pc, int ret)
{assert(pc);printf(请输入修改后联系人姓名: );scanf(%s, pc-data[ret].name);printf(修改成功!\n);
}//修改年龄
void ModAge(Contact* pc, int ret)
{assert(pc);printf(请输入修改后联系人年龄: );scanf(%d, pc-data[ret].age);printf(修改成功!\n);
}//修改性别
void ModSex(Contact* pc, int ret)
{assert(pc);printf(请输入修改后联系人性别: );scanf(%s, pc-data[ret].sex);printf(修改成功!\n);
}//修改电话
void ModTele(Contact* pc, int ret)
{assert(pc);printf(请输入修改后联系人电话: );scanf(%s, pc-data[ret].tele);printf(修改成功!\n);
}//修改住址
void ModAddr(Contact* pc, int ret)
{assert(pc);printf(请输入修改后联系人住址: );scanf(%s, pc-data[ret].addr);printf(修改成功!\n);
}void ModAll(Contact* pc, int ret)
{assert(pc);printf(请输入联系人姓名: );scanf(%s, pc-data[ret].name);printf(请输入联系人年龄: );scanf(%d, pc-data[ret].age);printf(请输入联系人性别: );scanf(%s, pc-data[ret].sex);printf(请输入联系人电话: );scanf(%s, pc-data[ret].tele);printf(请输入联系人住址: );scanf(%s, pc-data[ret].addr);printf(修改成功!\n);
}//修改联系人
void ModContact(Contact* pc)
{assert(pc);//判断是否为空if (pc-sz 0){printf(通讯录为空无法修改!\n);return;}char name[NAME_MAX] { 0 };printf(请输入要修改系人姓名: );scanf(%s, name);//判断是否有该联系人int ret FindContact(pc, name);//有该联系人if (ret ! -1){int n 0;do{menu1();printf(请选择修改内容: );scanf(%d, n);//修改switch (n){case 1:ModName(pc,ret);break;case 2:ModAge(pc, ret);break;case 3:ModSex(pc, ret);break;case 4:ModTele(pc, ret);break;case 5:ModAddr(pc, ret);break;case 6:ModAll(pc, ret);break;case 0:printf(修改结束!\n);break;default:printf(选择数非法!\n);break;}} while (n);}else{printf(没有此联系人!\n);}
}
看效果(小编做了清屏
修改前 修改后 OK还是比较成功的我们再来进行对他实现一下排序
9、排序联系人信息 我们上面已经实现了通讯录的增删查改的基本功能我们想让他再有一个排序功能比如按名字排序或年龄排序我们在指针进阶那块介绍过回调函数这里我们用qsort进行对通讯录排序我们期望还是和上面一样一开始有个菜单选择 //排序菜单
void menu2()
{system(cls);printf(**********************************\n);printf(***** 1. name 2. age **********\n);printf(**********************************\n);
}//名字比较函数
int cmp_name(const void* str1, const void* str2)
{//return strcmp(((PeoInfo*)str1)-name, ((PeoInfo*)str2)-name);return strcmp((((Contact*)str1)-data)-name, (((Contact*)str2)-data)-name);
}//名字排序
void SortName(Contact* pc)
{qsort(pc-data, pc-sz, sizeof(pc-data[0]), cmp_name);
}//年龄比较函数
int cmp_age(const void* str1, const void* str2)
{//return ((PeoInfo*)str1)-age - ((PeoInfo*)str2)-age;return (((Contact*)str1)-data)-age - (((Contact*)str2)-data)-age;
}
//年龄排序
void SortAge(Contact* pc)
{qsort(pc-data, pc-sz, sizeof(pc-data[0]), cmp_age);
}//排序联系人信息
void SortContact(Contact* pc)
{assert(pc);//判断为空if (pc-sz 0){printf(通讯录为空无法排序!\n);Sleep(3000);system(cls);return;}menu2();int n 0;printf(请选择排序方式: );scanf(%d, n);//排序switch (n){case 1:SortName(pc);system(cls);printf(排序成功!\n);break;case 2:SortAge(pc);system(cls);printf(排序成功!\n);break;default:printf(选择数非法!\n);Sleep(3000);system(cls);break;}
}
看效果
排序前年龄 排序后年龄 排序前名字 排序后名字 OK实现了排序
三、全部源码 contact.h
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#includestdio.h
#includestring.h
#includeassert.h
#includestdlib.h
#includewindows.h#define NAME_MAX 20
#define SEX_MAX 5
#define TELE_MAX 15
#define ADDR_MAX 20
#define MAX 100typedef struct PeoInfo
{char name[NAME_MAX];int age;char sex[SEX_MAX];char tele[TELE_MAX];char addr[ADDR_MAX];
}PeoInfo;typedef struct Contact
{PeoInfo data[MAX];int sz;
}Contact;//初始化通讯录
void InitContact(Contact* pc);//添加联系人
void AddContact(Contact* pc);//显示联系人
void ShowContact(const Contact* pc);//删除联系人
void DelContact(Contact* pc);//查找指定联系人
void Search(const Contact* pc);//修改联系人
void ModContact(Contact* pc);//排序联系人信息
void SortContact(Contact* pc);
contact.c
#includecontact.h//初始化通讯录
void InitContact(Contact* pc)
{assert(pc);memset(pc-data, 0, sizeof(pc-data));pc-sz 0;
}//增加联系人
void AddContact(Contact* pc)
{assert(pc);//通讯录已满if (pc-sz MAX){printf(通讯录已满无法添加!\n);Sleep(2000);return;}//添加联系人printf(请输入联系人姓名: );scanf(%s, pc-data[pc-sz].name);printf(请输入联系人年龄: );scanf(%d, pc-data[pc-sz].age);printf(请输入联系人性别: );scanf(%s, pc-data[pc-sz].sex);printf(请输入联系人电话: );scanf(%s, pc-data[pc-sz].tele);printf(请输入联系人住址: );scanf(%s, pc-data[pc-sz].addr);pc-sz;printf(添加成功!\n);Sleep(1000);
}//显示联系人
void ShowContact(const Contact* pc)
{assert(pc);printf(%-s\t%-s\t%-5s\t%-15s\t%-20s\n, 姓名, 年龄, 性别, 电话, 住址);for (int i 0; i pc-sz; i){printf(%-s\t%-d\t%-5s\t%-15s\t%-20s\n,pc-data[i].name,pc-data[i].age,pc-data[i].sex,pc-data[i].tele,pc-data[i].addr);}
}//查找要删除的人并返回下标
int FindContact(const Contact* pc, const char* name)
{for (int i 0; i pc-sz; i){if (strcmp(pc-data[i].name, name) 0){return i;//找到了}}return -1;//没找到
}//删除联系人
void DelContact(Contact* pc)
{assert(pc);if (pc-sz 0){printf(通讯录为空无法删除!\n);Sleep(2000);return;}char name[NAME_MAX] { 0 };printf(请输入要删除人的姓名: );scanf(%s, name);int pos FindContact(pc, name);if (pos ! -1){//删除for (int i pos; i pc-sz - 1; i){pc-data[i] pc-data[i 1];}pc-sz--;printf(成功删除联系人!\n);Sleep(1000);}else{printf(没有此联系人!\n);Sleep(2000);}
}//显示单个联系人信息
void Print(const Contact* pc, int pos)
{assert(pc);printf(%-s\t%-s\t%-5s\t%-15s\t%-20s\n, 姓名, 年龄, 性别, 电话, 住址);printf(%-s\t%-d\t%-5s\t%-15s\t%-20s\n,pc-data[pos].name,pc-data[pos].age,pc-data[pos].sex,pc-data[pos].tele,pc-data[pos].addr);}//查找指定联系人
void Search(const Contact* pc)
{assert(pc);char name[NAME_MAX] { 0 };printf(请输入要查找联系人姓名: );scanf(%s, name);int pos FindContact(pc, name);if (pos ! -1){Print(pc, pos);}else{printf(没有此联系人!\n);Sleep(2000);system(cls);}
}//修改联系人信息菜单
void menu1()
{system(cls);printf(*****************************************\n);printf(********* 1. name 2. age **********\n);printf(********* 3. sex 4. tele **********\n);printf(********* 5. addr 6. all **********\n);printf(********* 0. exit **********\n);printf(*****************************************\n);
}//修改名字
void ModName(Contact* pc, int ret)
{assert(pc);printf(请输入修改后联系人姓名: );scanf(%s, pc-data[ret].name);
}//修改年龄
void ModAge(Contact* pc, int ret)
{assert(pc);printf(请输入修改后联系人年龄: );scanf(%d, pc-data[ret].age);
}//修改性别
void ModSex(Contact* pc, int ret)
{assert(pc);printf(请输入修改后联系人性别: );scanf(%s, pc-data[ret].sex);
}//修改电话
void ModTele(Contact* pc, int ret)
{assert(pc);printf(请输入修改后联系人电话: );scanf(%s, pc-data[ret].tele);
}//修改住址
void ModAddr(Contact* pc, int ret)
{assert(pc);printf(请输入修改后联系人住址: );scanf(%s, pc-data[ret].addr);
}void ModAll(Contact* pc, int ret)
{assert(pc);printf(请输入联系人姓名: );scanf(%s, pc-data[ret].name);printf(请输入联系人年龄: );scanf(%d, pc-data[ret].age);printf(请输入联系人性别: );scanf(%s, pc-data[ret].sex);printf(请输入联系人电话: );scanf(%s, pc-data[ret].tele);printf(请输入联系人住址: );scanf(%s, pc-data[ret].addr);
}//修改联系人
void ModContact(Contact* pc)
{assert(pc);//判断是否为空if (pc-sz 0){printf(通讯录为空无法修改!\n);Sleep(2000);system(cls);return;}char name[NAME_MAX] { 0 };printf(请输入要修改系人姓名: );scanf(%s, name);//判断是否有该联系人int ret FindContact(pc, name);//有该联系人if (ret ! -1){int n 0;do{menu1();Print(pc, ret);printf(请选择修改内容: );scanf(%d, n);//修改switch (n){case 1:ModName(pc,ret);break;case 2:ModAge(pc, ret);break;case 3:ModSex(pc, ret);break;case 4:ModTele(pc, ret);break;case 5:ModAddr(pc, ret);break;case 6:ModAll(pc, ret);break;case 0:printf(修改结束!\n);Sleep(2000);system(cls);break;default:printf(选择数非法!\n);Sleep(2000);system(cls);break;}} while (n);}else{printf(没有此联系人!\n);Sleep(2000);system(cls);}
}//排序菜单
void menu2()
{system(cls);printf(**********************************\n);printf(***** 1. name 2. age **********\n);printf(**********************************\n);
}//名字比较函数
int cmp_name(const void* str1, const void* str2)
{//return strcmp(((PeoInfo*)str1)-name, ((PeoInfo*)str2)-name);return strcmp((((Contact*)str1)-data)-name, (((Contact*)str2)-data)-name);
}//名字排序
void SortName(Contact* pc)
{qsort(pc-data, pc-sz, sizeof(pc-data[0]), cmp_name);
}//年龄比较函数
int cmp_age(const void* str1, const void* str2)
{//return ((PeoInfo*)str1)-age - ((PeoInfo*)str2)-age;return (((Contact*)str1)-data)-age - (((Contact*)str2)-data)-age;
}
//年龄排序
void SortAge(Contact* pc)
{qsort(pc-data, pc-sz, sizeof(pc-data[0]), cmp_age);
}//排序联系人信息
void SortContact(Contact* pc)
{assert(pc);//判断为空if (pc-sz 0){printf(通讯录为空无法排序!\n);Sleep(3000);system(cls);return;}menu2();int n 0;printf(请选择排序方式: );scanf(%d, n);//排序switch (n){case 1:SortName(pc);system(cls);printf(排序成功!\n);break;case 2:SortAge(pc);system(cls);printf(排序成功!\n);break;default:printf(选择数非法!\n);Sleep(3000);system(cls);break;}
}
test.c
#includecontact.hvoid menu()
{printf(*****************************************\n);printf(********* 1. add 2. del **********\n);printf(********* 3. search 4. modify **********\n);printf(********* 5. show 6. sort **********\n);printf(********* 0. exit **********\n);printf(*****************************************\n);
}void test()
{int input 0;Contact con;InitContact(con);do{menu();printf(请选择操作数: );scanf(%d, input);switch (input){case 1:AddContact(con);system(cls);break;case 2:DelContact(con);system(cls); break;case 3:system(cls);Search(con);break;case 4:ModContact(con);break;case 5:system(cls);ShowContact(con);break;case 6:SortContact(con);break;case 0:printf(退出成功!\n);break;default:printf(选择数非法!\n);break;}} while (input);
}int main()
{test();return 0;
}
OK本期分享就到这里好兄弟我们下期再见 文章转载自: http://www.morning.dphmj.cn.gov.cn.dphmj.cn http://www.morning.pngfx.cn.gov.cn.pngfx.cn http://www.morning.qxkjy.cn.gov.cn.qxkjy.cn http://www.morning.mdjzydr.com.gov.cn.mdjzydr.com http://www.morning.duckgpt.cn.gov.cn.duckgpt.cn http://www.morning.cjxqx.cn.gov.cn.cjxqx.cn http://www.morning.yjprj.cn.gov.cn.yjprj.cn http://www.morning.dyzbt.cn.gov.cn.dyzbt.cn http://www.morning.qrpx.cn.gov.cn.qrpx.cn http://www.morning.xmyrn.cn.gov.cn.xmyrn.cn http://www.morning.qhmql.cn.gov.cn.qhmql.cn http://www.morning.hxrfb.cn.gov.cn.hxrfb.cn http://www.morning.wqrdx.cn.gov.cn.wqrdx.cn http://www.morning.wnhgb.cn.gov.cn.wnhgb.cn http://www.morning.knpbr.cn.gov.cn.knpbr.cn http://www.morning.qyhcm.cn.gov.cn.qyhcm.cn http://www.morning.nwczt.cn.gov.cn.nwczt.cn http://www.morning.paxkhqq.cn.gov.cn.paxkhqq.cn http://www.morning.nqmhf.cn.gov.cn.nqmhf.cn http://www.morning.qhvah.cn.gov.cn.qhvah.cn http://www.morning.ckxd.cn.gov.cn.ckxd.cn http://www.morning.ghpld.cn.gov.cn.ghpld.cn http://www.morning.ydmml.cn.gov.cn.ydmml.cn http://www.morning.kjtdy.cn.gov.cn.kjtdy.cn http://www.morning.rbknf.cn.gov.cn.rbknf.cn http://www.morning.qczjc.cn.gov.cn.qczjc.cn http://www.morning.qytyt.cn.gov.cn.qytyt.cn http://www.morning.cwqrj.cn.gov.cn.cwqrj.cn http://www.morning.cnqff.cn.gov.cn.cnqff.cn http://www.morning.hjrjy.cn.gov.cn.hjrjy.cn http://www.morning.zsgbt.cn.gov.cn.zsgbt.cn http://www.morning.lkcqz.cn.gov.cn.lkcqz.cn http://www.morning.jfwrf.cn.gov.cn.jfwrf.cn http://www.morning.qggcc.cn.gov.cn.qggcc.cn http://www.morning.rkfwr.cn.gov.cn.rkfwr.cn http://www.morning.mtqqx.cn.gov.cn.mtqqx.cn http://www.morning.nlqgb.cn.gov.cn.nlqgb.cn http://www.morning.807yy.cn.gov.cn.807yy.cn http://www.morning.aa1585.com.gov.cn.aa1585.com http://www.morning.rdtq.cn.gov.cn.rdtq.cn http://www.morning.hjjhjhj.com.gov.cn.hjjhjhj.com http://www.morning.wyrkp.cn.gov.cn.wyrkp.cn http://www.morning.wqfrd.cn.gov.cn.wqfrd.cn http://www.morning.fdmtr.cn.gov.cn.fdmtr.cn http://www.morning.bmbnc.cn.gov.cn.bmbnc.cn http://www.morning.gfjgq.cn.gov.cn.gfjgq.cn http://www.morning.ccjhr.cn.gov.cn.ccjhr.cn http://www.morning.wnkqt.cn.gov.cn.wnkqt.cn http://www.morning.khcpx.cn.gov.cn.khcpx.cn http://www.morning.btmwd.cn.gov.cn.btmwd.cn http://www.morning.tqsmg.cn.gov.cn.tqsmg.cn http://www.morning.tnktt.cn.gov.cn.tnktt.cn http://www.morning.kongpie.com.gov.cn.kongpie.com http://www.morning.gnghp.cn.gov.cn.gnghp.cn http://www.morning.zryf.cn.gov.cn.zryf.cn http://www.morning.rykmf.cn.gov.cn.rykmf.cn http://www.morning.bmpjp.cn.gov.cn.bmpjp.cn http://www.morning.csdgt.cn.gov.cn.csdgt.cn http://www.morning.yqsr.cn.gov.cn.yqsr.cn http://www.morning.lmpfk.cn.gov.cn.lmpfk.cn http://www.morning.lnwdh.cn.gov.cn.lnwdh.cn http://www.morning.gcqkb.cn.gov.cn.gcqkb.cn http://www.morning.mpwgs.cn.gov.cn.mpwgs.cn http://www.morning.qfdyt.cn.gov.cn.qfdyt.cn http://www.morning.clpdm.cn.gov.cn.clpdm.cn http://www.morning.rbjf.cn.gov.cn.rbjf.cn http://www.morning.qtrlh.cn.gov.cn.qtrlh.cn http://www.morning.fnssm.cn.gov.cn.fnssm.cn http://www.morning.wjhqd.cn.gov.cn.wjhqd.cn http://www.morning.mcpby.cn.gov.cn.mcpby.cn http://www.morning.kcbml.cn.gov.cn.kcbml.cn http://www.morning.hqjtp.cn.gov.cn.hqjtp.cn http://www.morning.yfnjk.cn.gov.cn.yfnjk.cn http://www.morning.pshpx.cn.gov.cn.pshpx.cn http://www.morning.drtgt.cn.gov.cn.drtgt.cn http://www.morning.yktwr.cn.gov.cn.yktwr.cn http://www.morning.flpjy.cn.gov.cn.flpjy.cn http://www.morning.rshs.cn.gov.cn.rshs.cn http://www.morning.trwkz.cn.gov.cn.trwkz.cn http://www.morning.pjxlg.cn.gov.cn.pjxlg.cn