输入:N(整数) 输入:数据文件A.txt,不超过6条记录,字符串长度不超过15个字节 文件格式如下: 字符串\\t数字\\n 说明: 每行为1条记录;字符串中不含有\\t。 数字描述的是该字符串的出现概率,小于等于100的整数。 多条记录的出现概率之和为100,如果A.txt不满足该条件,程序则退出; 如果文件格式错误,程序也退出。 要求: 编写一个程序,输入为N(正整数),读入文件A.txt,按照字符串出现概率随机 地输出字符串,输出N条记录 例如: 输入文件A.txt abc\\t20 a\\t30 de\\t50 输入为:10 即 abc有20%的概率输出,a有30%的概率输出,de有50%的概率输出,输出10条记 录 以下为一次输出的结果,多次输出的结果可能不相同。 abc a de de abc de a de a de
/*
问题描述:http://www.nowcoder.com/questionTerminal/528ede425fbc43df99a3a92cdaec153d
个人说明:习惯性放宽条件,这个程序不受6条记录上限限制,最大字符串长度可以通过修改
MAX_STRING_LENGTH 的宏定义进行改变。
*/
#include "stdafx.h"
#include
#include
#include
#include
#include
#include
using namespace std;
#define MAX_STRING_LENGTH 30
typedef struct tagRecord
{
string strContent;
int iPercent;
} Record,*pRecord;
vector
string g_strSpilt("\t");
/*--------------------------------------------------------
GetRecords(string fileName):通过文件名得到文件的所有
记录,返回一个vector
*/
vector
ifstream inRead(fileName.c_str(),ios::in);
string str;
char szBuffer[MAX_STRING_LENGTH] = { 0 };
vector
if (!inRead){
return vReturnVector;
}
while (inRead.getline(szBuffer,sizeof(szBuffer)))
{
str.clear();
str.append(szBuffer);
vReturnVector.push_back(str);
}
return vReturnVector;
}
/***************************************************************************
判断得到的记录是否符合规则要求
*/
bool IsVectorValid(vector
int iStartPos, iEndPos, iPercentSum = 0;
for (vector
iStartPos = iEndPos = 0;
iEndPos = it->find(g_strSpilt.c_str(),iStartPos);
//没有找到分割字符串,返回false,否则判断分割得到的后半部分是不是全部是数字(0-100)
if (iEndPos == string::npos){
return false;
}
else
{
//后半部分为空,直接返回false
if (iEndPos + g_strSpilt.length() == it->length()){
return false;
}
else
{
char chAt;
int iPercentLen, iPercent;
for (int i = iEndPos + g_strSpilt.length(); i < it->length(); i++){
chAt = it->at(i);
//后半部分存在非法字符,返回false
if (i == iEndPos + g_strSpilt.length() && chAt == '-'){
continue;
}
if (chAt < '0' || chAt > '9'){
return false;
}
}
iPercentLen = it->length() - iEndPos - g_strSpilt.length();
iPercent = atoi((it->substr(iEndPos + g_strSpilt.length(),
iPercentLen).c_str()));
//percent数据范围不对,直接返回false
if (iPercent > 100 || iPercent < 0){
return false;
}
//累加和超过100,返回false
if ((iPercentSum += iPercent) > 100){
return false;
}
//这里将结构体第二部分设置为iPercentSum是划分各自被random访问的区间
Record record = { it->substr(iStartPos, iEndPos), iPercentSum };
g_RecordVector.push_back(record);
}
}
}
//总的percent不是100,不符合要求
if (iPercentSum != 100){
return false;
}
else
{
return true;
}
}
/******************************************
随机打印一条记录的内容
*/
void PrintOneRandomRedcordContent(){
int iRandom = rand() % 100;
for (vector
if (it->iPercent > iRandom){
cout << it->strContent << endl;
break;
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char szWorkSpaceDir[_MAX_PATH] = { 0 };
char *lpszFileName = "A.txt";
string fullOpenName;
int n;
//得到文件的全路径
_getcwd(szWorkSpaceDir, _MAX_PATH);
srand(time(NULL));
if (szWorkSpaceDir[strlen(szWorkSpaceDir) - 1] != '\\'){
strcat_s(szWorkSpaceDir, "\\");
}
fullOpenName.append(szWorkSpaceDir);
fullOpenName.append(lpszFileName);
//得到文件中的记录,随机打印n条记录内容
vector
cin >> n;
if (IsVectorValid(vet)){
for (int i = 0; i < n; i++){
PrintOneRandomRedcordContent();
}
}
vet.clear();
system("pause");
return 0;
}