经典指数          
原因
1570
浏览数
0
收藏数
 

输入: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

     举报   纠错  
 
切换
1 个答案

/*

问题描述: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 g_RecordVector;

string g_strSpilt("\t");

/*--------------------------------------------------------

GetRecords(string fileName):通过文件名得到文件的所有

记录,返回一个vector集合

*/

vector GetRecords(string fileName){

ifstream inRead(fileName.c_str(),ios::in);

string str;

char szBuffer[MAX_STRING_LENGTH] = { 0 };

vector vReturnVector;

if (!inRead){

return vReturnVector;

}

while (inRead.getline(szBuffer,sizeof(szBuffer)))

{

str.clear();

str.append(szBuffer);

vReturnVector.push_back(str);

}

return vReturnVector;

}

/***************************************************************************

判断得到的记录是否符合规则要求

*/

bool IsVectorValid(vector &vet){

int iStartPos, iEndPos, iPercentSum = 0;

for (vector::iterator it = vet.begin(); it < vet.end(); it++){

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::iterator it = g_RecordVector.begin(); it < g_RecordVector.end(); it++){

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 vet = GetRecords(fullOpenName);

cin >> n;

if (IsVectorValid(vet)){

for (int i = 0; i < n; i++){

PrintOneRandomRedcordContent();

}

}

vet.clear();

  system("pause");

return 0;

}

 
切换
撰写答案