电话归属地查询系统

//求挑毛病
//这个项目的最大的收获就是汉字的编码和fputs()函数的应用
#include <stdio.h> #include <string.h> #define yidong_path "d:\\data\\yidong\\" #define liantong_path "d:\\data\\liantong\\" #define yidong_file_ext "移动.txt" #define liantong_file_ext "联通.txt" //通过运营商识别码,识别 返回1 移动 0 联通 int CheckCarrier(char char1, char char2); //i 代表移动或联通 char *ConnectPath(int carrier, int addr_order); //填充结构体 struct phone_num *ProcessStruct(char *phone_num, struct phone_num *num); //通过传入的结构体指针,读写文件,查找归属地 struct phone_num *SearchPlace(struct phone_num *); //将字符数字转换为数字 int Char2Int(char c); //用来拼接字符串 //一个汉字是两个字节,然后二维的话如果写5就会出错 char file_name[31][8] = {"安徽", "北京", "福建", "甘肃", "广东", "广西", "贵州",\ "海南", "河北", "河南", "黑龙江","山东", "湖北", "湖南","吉林", "江苏", "江西", "辽宁",\ "内蒙古", "宁夏", "青海", "山西", "陕西", "上海", "四川", "天津", "西藏",\ "新疆", "云南", "浙江", "重庆"}; struct phone_num { //把整个号码都保存在里面 char phone_num[12]; //运营商 就是开头1之后的两个数字 char carrier_id[2]; //之后的四位 真正的归属地识别 char city_id[4]; //运营商 1移动 0 联通 int carrier; // char province[10]; // char city[10]; }; int main() { char phone_num[12] = {'\0'}; char carrier[10]; //电话号码结构体 struct phone_num num; //电话号码结构体指针 struct phone_num *p_num = &num; printf("输入手机号码: "); scanf("%s", phone_num); if(strlen(phone_num) != 11) { //printf("%d",strlen(phone_num)); //printf("%s", phone_num); printf("Error1, 手机号码长度错误"); getchar(); getchar(); //错误处理省略 return 0; } //将结构体指针传过去,填充结构体 p_num = ProcessStruct(phone_num, p_num); //这个时候p_num就应该指向一个填充了电话号码,运营商识别码,运营商编号,归属地识别码的结构体 p_num = SearchPlace(p_num); if(p_num == NULL) { printf("ERROR3 没有记录"); } else { if(p_num -> carrier) { strcpy(carrier, "移动"); } else { strcpy(carrier, "联通"); } printf("%s %s %s", p_num -> city, p_num -> province, carrier); } getchar(); getchar(); getchar(); return 0; } char *ConnectPath(int carrier,int addr_order) { char path[60] = {'\0'}; if(carrier) { strcat(path, yidong_path); strcat(path, file_name[addr_order]); strcat(path, yidong_file_ext); } else { strcat(path, liantong_path); strcat(path, file_name[addr_order]); strcat(path, liantong_file_ext); } return path; } struct phone_num *ProcessStruct(char *phone_num, struct phone_num *p_num) { int j; //传过来的号码变量复制到结构体 strcpy(p_num -> phone_num, phone_num); //分离运营商识别码 p_num -> carrier_id[0] = p_num -> phone_num[1]; p_num -> carrier_id[1] = p_num -> phone_num[2]; //分离城市识别码 for(j = 0;j < 4;j++) { p_num -> city_id[j] = p_num -> phone_num[j + 3]; } //写入运营商信息 p_num -> carrier = CheckCarrier(p_num -> carrier_id[0], p_num -> carrier_id[1]); return p_num; } //移动的电话号码规律 //134 135 136 137 138 139 158 159 //联通的电话号码规律 //130 131 132 133 153 156 //移动 return 1 联通 return 0 int CheckCarrier(char char1, char char2) { //char char1, char2; //char1 = num.carrier_id[0]; //char2 = num.carrier_id[1]; if(char1 == '3') { if((char2 == '4')||(char2 == '5')||(char2 == '6')||(char2 == '7')||(char2 == '8')||(char2 == '9')) { return 1; } else { return 0; } } else { if((char2 == '8')||(char2 == '9')) { return 1; } else { return 0; } } } int Char2Int(char c) { int num; num = c - '0'; return num; } struct phone_num *SearchPlace(struct phone_num *p_num) { FILE *fp1, *fp2; int addr_order = 0; int i, j = 0; char path[60]; char line[35]; //p是用来处理汉字用的 char *p; char tmp[10]; int line_num = 0; int flag = 0; int number, number1, number2; //逐文件的的读取 for(addr_order = 0;addr_order < 31;addr_order++) { //获取文件夹中文件的路径 strcpy(path, ConnectPath(p_num -> carrier,addr_order)); //使用fp1和fp2是担心 fgets函数不知道把指针给移到哪去了。。 printf("读取文件 %s\n", path); fp1 = fopen(path, "r"); if(fp1 == NULL) { printf("ERROR2 %s 文件打开错误",path); getchar(); return 0; } //获取这个文件有多少行 while((fgets(line, 35, fp1)) != NULL) { if(line[strlen(line) - 1] == '\n') { line_num++; } } fclose(fp1); fp2 = fopen(path, "r"); //逐行的去读取文本内容 保存在line里面 for(i = 0;i < line_num;i++) { //获取的一行的信息应该是这样的 //13003000000-13003009999-合肥 //运营商识别是line[1]和[2] 然后3,4,5,6是归属地识别 // line[13]和[14] 15,16,17,18 fgets(line, 35, fp2); //如果运营商识别码不一致 就读取下一行 if(!(line[1] == p_num -> carrier_id[0] && line[2] == p_num -> carrier_id[1])) { continue; } else { //把手机号码的归属地识别转换为数字 number = Char2Int(p_num -> city_id[0]) * 1000 + Char2Int(p_num -> city_id[1]) * 100 + \ Char2Int(p_num -> city_id[2]) * 10 + Char2Int(p_num -> city_id[3]); //把读出来的归属地识别码转换成数字 number1 = Char2Int(line[3]) * 1000 + Char2Int(line[4]) * 100 + Char2Int(line[5]) * 10 + \ Char2Int(line[6]); number2 = Char2Int(line[15]) * 1000 + Char2Int(line[16]) * 100 + Char2Int(line[17]) * 10 + \ Char2Int(line[18]); //电话号码在那个范围内 if(number >= number1 && number <= number2) { //下面的要注意 汉字是双字节的 不能直接复制使用啊~~ //如果是len是29 说明城市是两个字的 //接下来把识别的归属地信息保存到结构体中 //p指向第24个位置,那是汉字第起点,然后这一行是以/n/0结束的,所以查找\n然后复制到tmp中 p = &line[24]; while(*p != '\n') { tmp[j] = *p; j++; p++; } tmp[j] = '\0'; strcpy(p_num -> city, tmp); //把省复制到结构体中 strcpy(p_num -> province, file_name[addr_order]); flag = 1; break; } else { continue; } } } if(flag == 1) { break; } } fclose(fp2); if(flag == 0) { return NULL; } else { return p_num; } }

 

 

python版本

 

这就是python和c语言的区别,同一个项目,使用c开发使用了半天,300多行代码(包括注释),而python开发,30多行代码,用了一个 小时。不过python也有自己的缺点,就是运行慢啊,而且一些方面不能代替别的语言。选择合适的开发工具和环境是多么的重要,这就是在节省生命啊~~

 

# -*- coding: UTF-8 -*-
import os
#手机号码
phone_num=raw_input("请输入手机号码: ")
while(len(phone_num) != 11):
    print"Error1 手机号码长度错误"
    phone_num=raw_input("请重新输入手机号码: ")
#将手机号码中归属地识别码转换为数字  方便进行比较
num_id = int(phone_num[3])*1000+int(phone_num[4])*100+\
         int(phone_num[5])*10+int(phone_num[6])
#用来保存文件路径
file_path=[]
#将这个文件夹中所有的文件名保存在列表中
file_path.extend(os.listdir("d:\\phone_num_data"))
flag=0
#逐个的读取文件
for i in range(0, 61, 1):
    f=open("d:\\phone_num_data\\"+file_path[i], "r")
    print "Reading %s"%file_path[i]
    line_text=f.readlines()
    #这就是一行的内容
    for line in line_text:
        #要识别两个归属地识别码,然后转换为数字
        num_id1=int(line[3])*1000+int(line[4])*100+int(line[5])*10+int(line[6])
        num_id2=int(line[15])*1000+int(line[16])*100+int(line[17])*10+\
                 int(line[18])
        if (num_id>=num_id1 and num_id<=num_id2):
            flag=1
            break
    if flag==1:
        break
print "%s的归属地是 %s%s%s"%(phone_num, file_path[i][0:len(file_path[i])-8].decode('gbk').encode('utf-8'),\
                       line[24:len(line)].decode('gbk').encode('utf-8'),file_path[i][len(file_path[i])-4:len(file_path[i])-8].decode('gbk').encode('utf-8'))


 

 

但是呢,今天又看到别人写的代码,这么短,,,慢慢的学习 先记下来~~

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
    FILE *fp1,*fp2;
    int i=0;
    char num1[20],num2[20],des[20];
    char num[20],s[50],temp[50],t[30];
    system("DIR /D D:\\手机归属地查询\\Debug\\文件/s /B >> D:\\手机归属地查询\\Debug\\文件路径.txt");
    
    if((fp1=(fopen("d:\\手机归属地查询\\Debug\\文件路径.txt","r")))==NULL)
    {
        printf("没有找到文件fp1!\n");
        exit(1);
    }
    printf("输入电话号码:");
    gets(num);
    while(feof(fp1)==NULL)
    {        
        fscanf(fp1,"%s",s);

        if((fp2=(fopen(s,"r")))==NULL)
        {
            printf("没有找到文件fp2!\n");
            exit(1);
        }        
        while(!feof(fp2))
        {
            fscanf(fp2,"%[0-9]-%[0-9]-%s\n",num1,num2,des);
            if(strcmp(num1,num)<=0 && strcmp(num2,num)>=0)
            {
                printf("%s\n",des);
                sscanf(s,"%29s%s",t,temp);
                printf("%s\n",temp);
                return 0;
            }
        }
    }
    printf("找不到!\n");
    fclose(fp1);
    fclose(fp2);
    return 0;
}

 

posted @ 2013-09-29 15:47  virusdefender  阅读(621)  评论(0编辑  收藏  举报