#include <stdlib.h>
#include <iostream>
#include <cstring>
#include <string>
#include <cctype>
#include <map>
#include "PhoneBookProcess.h"
using namespace std;
/*
功能: 检查是否有两个或多个公司拥有相同的电话号码,并统计输出
输入参数: inFileName - 包含个性电话号码个数与列表的源文件名 [格式请见题目说明PPT]
outFileName - 输出统计重复号码的结果的目标文件名 [格式请见题目说明PPT]
输出参数: 无
返回: 0 - 成功
1 - 其它各种错误,如文件不存在
*/
char CharCHange(char c) //个性化号码转换成原始号码
{
if (isdigit(c)) //数字保持不变
{
return c;
}
char temp = ' ';
switch(c) //字母转换成对应数字
{
case 'A':
case 'B':
case 'C':
temp = '2';
break;
case 'D':
case 'E':
case 'F':
temp = '3';
break;
case 'G':
case 'H':
case 'I':
temp = '4';
break;
case 'J':
case 'K':
case 'L':
temp = '5';
break;
case 'M':
case 'N':
case 'O':
temp = '6';
break;
case 'P':
case 'Q':
case 'R':
case 'S':
temp = '7';
break;
case 'T':
case 'U':
case 'V':
temp = '8';
break;
case 'W':
case 'X':
case 'Y':
case 'Z':
temp = '9';
break;
default:
temp = 'w';
break;
}
return temp;
}
string StringProcess(char *str) //输入的字符串处理
{
string result = "";
size_t len = strlen(str) - 1;
for (int i = 0; i < len; ++i)
{
if(str[i] != '-')
{
int temp = CharCHange(str[i]);
if(temp != 'w')
{
result += temp;
}
else
{
result = "wrong";
break;
}
}
}
//cout<<result<<endl;
return result; //返回去掉‘-’的字符串
}
int PhoneBookProcess(const char *inFileName,const char *outFileName)
{
if (inFileName == NULL || outFileName == NULL)
{
return 1;
}
map<int,int> output; //存储原始电话号码和重复次数
FILE *fr = fopen(inFileName,"r");
FILE *fw = fopen(outFileName,"w");
//FILE *fw = fopen(outFileName,"a");
if(fr == NULL || fw == NULL) //读取文件失败
{
return 1;
}
int line_num = 0;
char temp[50] = {0};
int phone_val = 0;
fgets(temp,50,fr);
sscanf_s(temp,"%d",&line_num);
while (line_num)
{
fgets(temp,50,fr);
string s = StringProcess(temp);
if(s != "wrong")
{
sscanf_s(s.c_str(),"%d",&phone_val);
}
else
{
line_num--;
continue;
}
if (phone_val < 999999999999 && phone_val > 0)
{
++output[phone_val];
}
else
{
line_num--;
continue;
}
line_num--;
}
map<int,int>::const_iterator map_it = output.begin();
bool flag = false;
while (map_it != output.end()) //map遍历升序输出
{
if(map_it->second > 1) //有重复的号码才输出,
{
flag = true;
fprintf(fw,"%d %d\n",map_it->first,map_it->second);
//cout<<map_it->first<<" "<<map_it->second<<endl;
}
++map_it;
}
if(!flag)
{
fputs("No duplicates.\n",fw);
}
fclose(fw); //记得关闭文件啊,不然测试用例一直不通过,做题的时候浪费了好多时间。。。
fclose(fr);
return 0;
}