博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Upgrade Hole puncher Mathematical Modeling
阅读量:5856 次
发布时间:2019-06-19

本文共 23870 字,大约阅读时间需要 79 分钟。

// AntColony.cpp : 定义控制台应用程序的入口点。//#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;#include
#include
//使用stringstream需要引入这个头文件//打印系列//GD-E-B-AC-HF-FG-EGJ-DI-CIJ//孔坐标 double HoleA[660][2] = { (0, 0) };double HoleB[788][2] = { (0, 0) };double HoleC[270][2] = { (0, 0) };double HoleD[212][2] = { (0, 0) };double HoleE[95][2] = { (0, 0) };double HoleF[34][2] = { (0, 0) };double HoleG[20][2] = { (0, 0) };double HoleH[6][2] = { (0, 0) };double HoleI[10][2] = { (0, 0) };double HoleJ[28][2] = { (0, 0) };int N = 0;int L_n = 0;double Hole[1500][2] = { (0, 0) };double holeLength = 0; //定义数组长度。int HoleLength[11] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; //记录读入数组的长度 //从1-10,分别对应A,B-到-J//double C[N][2] = {0 };struct Point{ int x; int y;};FILE *fp;char buf[256];char *p;char X[10] = { '\0' };char Y[10] = { '\0' };int CoorX;int CoorY;char HolePattern = '0';//----------上面参数是固定的,下面的参数是可变的----------- //蚂蚁数量 #define M 75 //最大循环次数NcMax int NcMax = 1;//信息启发因子,期望启发式因子,全局信息素挥发参数,局部信息素挥发参数, 状态转移公式中的q0 double alpha = 2, beta = 5, rou = 0.1, alpha1 = 0.1, qzero = 0.1;//-----------问题三结束------------------------------------------------------------------------ //=========================================================================================================== //局部更新时候使用的的常量,它是由最近邻方法得到的一个长度 //什么是最近邻方法?:)就是从源节点出发,每次选择一个距离最短的点来遍历所有的节点得到的路径 //每个节点都可能作为源节点来遍历 double Lnn;//矩阵表示两孔之间的距离 double allDistance[1500][1500];//=========================================================================================================== //计算两个孔之间的距离 double calculateDistance(double Hole[][2], int i, int j){ return sqrt(pow((Hole[i][0] - Hole[j][0]), 2.0) + pow((Hole[i][1] - Hole[j][1]), 2.0));}//=========================================================================================================== //由矩阵表示两两城市之间的距离 void calculateAllDistance(){ for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (i != j) { allDistance[i][j] = calculateDistance(Hole, i, j); allDistance[j][i] = allDistance[i][j]; } } }}//获得经过n个城市的路径长度 double calculateSumOfDistance(int* tour){ double sum = 0; for (int i = 0; i< N; i++) { int row = *(tour + 2 * i); int col = *(tour + 2 * i + 1); sum += allDistance[row][col]; } return sum;}class ACSAnt;class AntColonySystem{private: double info[1500][1500], visible[1500][1500]; //节点之间的信息素强度,节点之间的能见度 public: AntColonySystem() { } //计算当前节点到下一节点转移的概率 double Transition(int i, int j); //局部更新规则 void UpdateLocalPathRule(int i, int j); //初始化 void InitParameter(double value); //全局信息素更新 void UpdateGlobalPathRule(int* bestTour, int globalBestLength);};//计算当前节点到下一节点转移的概率 double AntColonySystem::Transition(int i, int j){ if (i != j) { return (pow(info[i][j], alpha) * pow(visible[i][j], beta)); } else { return 0.0; }}//局部更新规则 void AntColonySystem::UpdateLocalPathRule(int i, int j){ info[i][j] = (1.0 - alpha1) * info[i][j] + alpha1 * (1.0 / (N * Lnn)); info[j][i] = info[i][j];}//初始化 void AntColonySystem::InitParameter(double value){ //初始化路径上的信息素强度tao0 for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { info[i][j] = value; info[j][i] = value; if (i != j) { visible[i][j] = 1.0 / allDistance[i][j]; visible[j][i] = visible[i][j]; } } }}//全局信息素更新 void AntColonySystem::UpdateGlobalPathRule(int* bestTour, int globalBestLength){ for (int i = 0; i < N; i++) { int row = *(bestTour + 2 * i); int col = *(bestTour + 2 * i + 1); info[row][col] = (1.0 - rou) * info[row][col] + rou * (1.0 / globalBestLength); info[col][row] = info[row][col]; }}class ACSAnt{private: AntColonySystem* antColony;protected: int startCity, cururentCity;//初始城市编号,当前城市编号 int allowed[1500];//禁忌表 int Tour[1500][2];//当前路径 int currentTourIndex;//当前路径索引,从0开始,存储蚂蚁经过城市的编号 public: ACSAnt(AntColonySystem* acs, int start) { antColony = acs; startCity = start; } //开始搜索 int* Search(); //选择下一节点 int Choose(); //移动到下一节点 void MoveToNextCity(int nextCity);};//开始搜索 int* ACSAnt::Search(){ cururentCity = startCity; int toCity; currentTourIndex = 0; for (int i = 0; i < N; i++) { allowed[i] = 1; } allowed[cururentCity] = 0; int endCity; int count = 0; do { count++; endCity = cururentCity; toCity = Choose(); if (toCity >= 0) { MoveToNextCity(toCity); antColony->UpdateLocalPathRule(endCity, toCity); cururentCity = toCity; } } while (toCity >= 0); MoveToNextCity(startCity); antColony->UpdateLocalPathRule(endCity, startCity); return *Tour;}//选择下一节点 int ACSAnt::Choose(){ int nextCity = -1; double q = rand() / (double)RAND_MAX; //如果 q <= q0,按先验知识,否则则按概率转移, if (q <= qzero) { double probability = -1.0;//转移到下一节点的概率 for (int i = 0; i < N; i++) { //去掉禁忌表中已走过的节点,从剩下节点中选择最大概率的可行节点 if (1 == allowed[i]) { double prob = antColony->Transition(cururentCity, i); if (prob > probability) { nextCity = i; probability = prob; } } } } else { //按概率转移 double p = rand() / (double)RAND_MAX;//生成一个随机数,用来判断落在哪个区间段 double sum = 0.0; double probability = 0.0;//概率的区间点,p 落在哪个区间段,则该点是转移的方向 //计算概率公式的分母的值 for (int i = 0; i < N; i++) { if (1 == allowed[i]) { sum += antColony->Transition(cururentCity, i); } } for (int j = 0; j < N; j++) { if (1 == allowed[j] && sum > 0) { probability += antColony->Transition(cururentCity, j) / sum; if (probability >= p || (p > 0.9999 && probability > 0.9999)) { nextCity = j; break; } } } } return nextCity;}//移动到下一节点 void ACSAnt::MoveToNextCity(int nextCity){ allowed[nextCity] = 0; Tour[currentTourIndex][0] = cururentCity; Tour[currentTourIndex][1] = nextCity; currentTourIndex++; cururentCity = nextCity;}//------------------------------------------ //选择下一个节点,配合下面的函数来计算的长度 int ChooseNextNode(int currentNode, int visitedNode[]){ int nextNode = -1; double shortDistance = 0.0; for (int i = 0; i < N; i++) { //去掉已走过的节点,从剩下节点中选择距离最近的节点 if (1 == visitedNode[i]) { if (shortDistance == 0.0) { shortDistance = allDistance[currentNode][i]; nextNode = i; } if (shortDistance < allDistance[currentNode][i]) { nextNode = i; } } } return nextNode;}//给一个节点由最近邻距离方法计算长度 double CalAdjacentDistance(int node){ double sum = 0.0; int visitedNode[1500]; for (int j = 0; j < N; j++) { visitedNode[j] = 1; } visitedNode[node] = 0; int currentNode = node; int nextNode; do { nextNode = ChooseNextNode(currentNode, visitedNode); if (nextNode >= 0) { sum += allDistance[currentNode][nextNode]; currentNode = nextNode; visitedNode[currentNode] = 0; } } while (nextNode >= 0); sum += allDistance[currentNode][node]; return sum;}//---------------------------------结束--------------------------------------------- //---------------------------------测试----------------------------------------------/********************************************************************************************************///函数名称:合并二维数组//参数1,2。要合并的两个二维数组,参数3,合并数组1的长度。参数4,合并数组2的长度。//返回:二维数组的首地址。/********************************************************************************************************/void combineArray(double arr_one[][2], double arr_two[][2], int combinelength_one, int combinelength_two, double Hole[][2]){ //申请空间 //double ** combine_array = new double *[combinelength_one + combinelength_two]; //for (int i = 0; i < (combinelength_one + combinelength_two); i++) //{ // combine_array[i] = new double[2]; //} //使用空间 for (int j = 0; j < combinelength_one + combinelength_two; j++) { for (int k = 0; k < 2; k++) { if (j < combinelength_one) { Hole[j][k] = arr_one[j][k]; } else { Hole[j][k] = arr_two[j - combinelength_one][k]; } } }}/********************************************************************************************************/void printCombineArray(double Hole[][2], int length){ cout << length << endl; for (int i = 0; i < length; i++) { for (int k = 0; k < 2; k++) { cout << i << "-" << k << " = " << Hole[i][k] << " "; } cout << endl; }}/********************************************************************************************************/void combineTest(){ //计算要合并的2个数组的总长度。 int combinelength_one = sizeof(HoleF) / (2 * 8); int combinelength_two = sizeof(HoleG) / (2 * 8); /*printf("HoleG\n"); for (int i = 0; i < 10; i++) { for (int k = 0; k < 2; k++) { cout << i << "-" << k << " = " << HoleG[i][k] << " "; } cout << endl; } printf("HoleD\n"); for (int i = 0; i < 10; i++) { for (int k = 0; k < 2; k++) { cout << i << "-" << k << " = " << HoleD[i][k] << " "; } cout << endl; }*/ //Hole = combineArray(HoleF, HoleG, combinelength_one, combinelength_two); //printCombineArray(Hole);}/********************************************************************************************************/void writeData(char name[], int globalTour[][2], int length, double cost, double globalBestLength){ char buf[50]; sprintf(buf, " 最后的总花费: %.4lf\0", cost); char globalLength[50]; sprintf(globalLength, " 全局路径长度: %f\0", globalBestLength); FILE *fp; char ch; int i; if ((fp = fopen("data.txt", "a+")) == NULL) { printf("Cannot open file strike any key exit!"); exit(1); } fwrite("\n", sizeof("\n"), 1, fp); fwrite("\n", sizeof("\n"), 1, fp); char discribut[] = "测试打孔的为:"; fwrite(discribut, sizeof(discribut), 1, fp); for (i = 0; name[i] != '\0'; i++) { ; } fwrite(name, sizeof(char), i, fp); fwrite("\n", sizeof("\n"), 1, fp); for (i = 0; i < length; i++) { //cout << globalTour[i][0] << "-"; char num[5] = "0"; _itoa(globalTour[i][0], num, 10); fwrite(num, sizeof(char), 5, fp); } fwrite("\n", sizeof("\n"), 1, fp); fwrite("\n", sizeof("\n"), 1, fp); for (i = 0; buf[i] != '\0'; i++) //打印花费 { ; } fwrite(buf, sizeof(char), i, fp); fwrite("\n", sizeof("\n"), 1, fp); for (i = 0; globalLength[i] != '\0'; i++) //打印全局路径长度 { ; } fwrite(globalLength, sizeof(char), i, fp); fwrite("\n", sizeof("\n"), 1, fp); fwrite("\n", sizeof("\n"), 1, fp); char point_xy[100]; sprintf(point_xy, " 起点 (x, y)—— (%.0f,%.0f) \n 终点 (x, y)—— (%.0f,%.0f) \n\0", Hole[0][0], Hole[0][1], Hole[length-1][0], Hole[length-1][1]); for (i = 0; point_xy[i] != '\0'; i++) //打印孔坐标 { ; } fwrite(point_xy, sizeof(char), i, fp); char coutStr[] = "按照输出的打孔数序,顺序打印坐标点的位置。\n"; for (i = 0; coutStr[i] != '\0'; i++) //打印孔坐标 { ; } fwrite(coutStr, sizeof(char), i, fp); fwrite("\n", sizeof("\n"), 1, fp); fwrite("\n", sizeof("\n"), 1, fp); int j = 0; //打印孔坐标的信息。 for (i = 0; i < length; i++) { //cout << "起点坐标X:" << Hole[0][0] << " " << "起点坐标Y:" << Hole[0][1] << endl; //char num[5] = "0"; //_itoa(globalTour[i][0], Hole[i][0], 10); char printGD_one[50] = "";// sprintf(printGD_one, "第%3d个 坐标是——X: %.3f", i, Hole[i][0]); sprintf(printGD_one, "%7.0f", Hole[i][0]); for (j = 0; printGD_one[j] != '\0'; j++) //打印孔坐标 { ; } fwrite(printGD_one, sizeof(char), j, fp); //_itoa(globalTour[i][0], Hole[i][1], 10); char printGD_two[50] = ""; //sprintf(printGD_two, " 坐标Y: %.3f\n", Hole[i][1]); sprintf(printGD_two, " %7.0f\n", Hole[i][1]); for (j = 0; printGD_two[j] != '\0'; j++) //打印孔坐标 { ; } fwrite(printGD_two, sizeof(char), j, fp); } printf("========================================================\n"); fclose(fp);}/********************************************************************************************************/void actionFunction(char str_Gd[]){ time_t timer, timerl; time(&timer); unsigned long seed = timer; seed %= 56000; srand((unsigned int)seed); //由矩阵表示两两城市之间的距离 calculateAllDistance(); //蚁群系统对象 AntColonySystem* acs = new AntColonySystem(); ACSAnt* ants[M]; //蚂蚁均匀分布在城市上 for (int k = 0; k < M; k++) { ants[k] = new ACSAnt(acs, (int)(k%N)); } calculateAllDistance(); //随机选择一个节点计算由最近邻方法得到的一个长度 int node = rand() % N; Lnn = CalAdjacentDistance(node); //各条路径上初始化的信息素强度 double initInfo = 1 / (N * Lnn); acs->InitParameter(initInfo); //全局最优路径 int globalTour[1500][2]; //全局最优长度 double globalBestLength = 0.0; for (int i = 0; i < NcMax; i++) { //局部最优路径 int localTour[1500][2]; //局部最优长度 double localBestLength = 0.0; //当前路径长度 double tourLength; for (int j = 0; j < M; j++) { int* tourPath = ants[j]->Search(); tourLength = calculateSumOfDistance(tourPath); //局部比较,并记录路径和长度 if (tourLength < localBestLength || abs(localBestLength - 0.0) < 0.000001) { for (int m = 0; m < N; m++) { int row = *(tourPath + 2 * m); int col = *(tourPath + 2 * m + 1); localTour[m][0] = row; localTour[m][1] = col; } localBestLength = tourLength; } } //全局比较,并记录路径和长度 if (localBestLength < globalBestLength || abs(globalBestLength - 0.0) < 0.000001) { for (int m = 0; m < N; m++) { globalTour[m][0] = localTour[m][0]; globalTour[m][1] = localTour[m][1]; } globalBestLength = localBestLength; } acs->UpdateGlobalPathRule(*globalTour, globalBestLength); //输出所有蚂蚁循环一次后的迭代最优路径 //cout<<"第 "<
"; printf("%3d ->", globalTour[m][0]); } } cout << endl; time(&timerl); int t = timerl - timer; double cost = globalBestLength / 100000 * 25.4* 0.06; //printf ("加工孔需要的花费%f", cost); cout << "加工--" << str_Gd << "--孔需要的花费" << cost << endl; writeData(str_Gd, globalTour, N, cost, globalBestLength);}bool testHole(){ if (Hole == NULL) { printf("Hole 初始化问题\n"); return 0; } else if (N < 0) { cout << "不存在点" << endl; return 0; } else if (N == 1) { cout << "因为在这个象限,该孔只有一个点,只存在起始点,不存在终止点,自己计算。" << endl << endl; return 0; } else { return 1; }}int TypeTest(){ bool singal_out = false; int num_choice = 0; while (!singal_out) { Hole[1500][2] = { (0.0, 0.0) }; cout << "input number , 0 is exit, others is next action \n " << endl << "1----GD" << endl << "2----E" << endl << "3----A" << endl << "4----B" << endl << "5----AC" << endl << "6----HF" << endl << "7----FG" << endl << "8----DI" << endl << "9----EGJ" << endl << "10----CIJ" << endl << "11----设置迭代次数,初始化,默认为1次。" << endl << "12---C" << endl << "13---D" << endl << "14---F" << endl << "15---G" << endl << "16---H" << endl << "17---I" << endl << "18---J" << endl << "19---CJ" << endl << "20---JC" << endl << "21---EJ" << endl << " ------------------------ " << endl; cin >> num_choice; switch (num_choice) { case 0: { singal_out = true; break; } case 1: //GD { int combinelength_one = HoleLength[7]; int combinelength_two = HoleLength[4]; N = combinelength_one + combinelength_two; //L_n = N - 1; cout << "点的总数: " << N << endl; combineArray(HoleG, HoleD, combinelength_one, combinelength_two, Hole); //printCombineArray(Hole, N); if (0 == testHole()) { return 0; } char str_Gd[3] = "GD"; actionFunction(str_Gd); break; } case 2: //E { int combinelength_one = HoleLength[5]; for (int j = 0; j < combinelength_one; j++) { for (int k = 0; k < 2; k++) { Hole[j][k] = HoleE[j][k]; } } N = combinelength_one; cout << "点的总数: " << N << endl; if (0 == testHole()) { return 0; } char str_Gd[2] = "E"; actionFunction(str_Gd); break; } case 3: //A { int combinelength_one = HoleLength[1]; for (int j = 0; j < combinelength_one; j++) { for (int k = 0; k < 2; k++) { Hole[j][k] = HoleA[j][k]; } } N = combinelength_one; cout << "点的总数: " << N << endl; if (0 == testHole()) { return 0; } if (N == 0) { cout << "因为一个点,只存在起始点,不存在终止点,自己计算" << endl; return 0; } char str_Gd[2] = "A"; actionFunction(str_Gd); break; } case 4: //B { int combinelength_one = HoleLength[2]; for (int j = 0; j < combinelength_one; j++) { for (int k = 0; k < 2; k++) { Hole[j][k] = HoleB[j][k]; } } N = combinelength_one; cout << "点的总数: " << N << endl; if (0 == testHole()) { return 0; } char str_Gd[2] = "B"; actionFunction(str_Gd); break; } case 5: //AC { int combinelength_one = HoleLength[1]; int combinelength_two = HoleLength[3] ; N = combinelength_one + combinelength_two; cout << "点的总数: " << N << endl; combineArray(HoleA, HoleC, combinelength_one, combinelength_two, Hole); if (0 == testHole()) { return 0; } char str_Gd[3] = "AC";; actionFunction(str_Gd); break; } case 6: //HF { int combinelength_one = HoleLength[8]; int combinelength_two = HoleLength[6] ; N = combinelength_one + combinelength_two; cout << "点的总数: " << N << endl; for (int j = 0; j < N; j++) { for (int k = 0; k < 2; k++) { if (j < combinelength_one) { Hole[j][k] = HoleH[j][k]; } else { Hole[j][k] = HoleF[j - combinelength_one][k]; } } } if (0 == testHole()) { return 0; } char str_Gd[3] = "HF"; actionFunction(str_Gd); break; } case 7: //FG { int combinelength_one = HoleLength[6]; int combinelength_two = HoleLength[7] ; N = combinelength_one + combinelength_two; cout << "点的总数: " << N << endl; combineArray(HoleF, HoleG, combinelength_one, combinelength_two, Hole); char str_Gd[3] = "FG"; actionFunction(str_Gd); break; } case 8: //DI { int combinelength_one = HoleLength[4]; int combinelength_two = HoleLength[9] ; N = combinelength_one + combinelength_two; cout << "点的总数: " << N << endl; combineArray(HoleD, HoleI, combinelength_one, combinelength_two, Hole); if (0 == testHole()) { return 0; } char str_Gd[3] = "DI"; actionFunction(str_Gd); break; } case 9: //EGJ { int combinelength_one = HoleLength[5]; int combinelength_two = HoleLength[7] ; int combinelength_thr = HoleLength[10] ; N = combinelength_one + combinelength_two + combinelength_thr; cout << "点的总数: " << N << endl; for (int j = 0; j < N; j++) { for (int k = 0; k < 2; k++) { if (j < combinelength_one) { Hole[j][k] = HoleE[j][k]; } else if (j >= combinelength_one && j
= combinelength_one && j
> number_max; NcMax = number_max; //最大迭代次数 break; } case 12: { int combinelength_one = HoleLength[3]; for (int j = 0; j < combinelength_one; j++) { for (int k = 0; k < 2; k++) { Hole[j][k] = HoleC[j][k]; } } N = combinelength_one; cout << "点的总数: " << N << endl; if (0 == testHole()) { return 0; } char str_Gd[2] = "C"; actionFunction(str_Gd); break; } case 13: { int combinelength_one = HoleLength[4]; for (int j = 0; j < combinelength_one; j++) { for (int k = 0; k < 2; k++) { Hole[j][k] = HoleD[j][k]; } } N = combinelength_one; cout << "点的总数: " << N << endl; if (0 == testHole()) { return 0; } char str_Gd[2] = "D"; actionFunction(str_Gd); break; } case 14: { int combinelength_one = HoleLength[6]; for (int j = 0; j < combinelength_one; j++) { for (int k = 0; k < 2; k++) { Hole[j][k] = HoleF[j][k]; } } N = combinelength_one; cout << "点的总数: " << N << endl; if (0 == testHole()) { return 0; } char str_Gd[2] = "F"; actionFunction(str_Gd); break; } case 15: { int combinelength_one = HoleLength[7]; for (int j = 0; j < combinelength_one; j++) { for (int k = 0; k < 2; k++) { Hole[j][k] = HoleG[j][k]; } } N = combinelength_one; cout << "点的总数: " << N << endl; if (0 == testHole()) { return 0; } char str_Gd[2] = "G"; actionFunction(str_Gd); break; } case 16: { int combinelength_one = HoleLength[8]; for (int j = 0; j < combinelength_one; j++) { for (int k = 0; k < 2; k++) { Hole[j][k] = HoleH[j][k]; } } N = combinelength_one; cout << "点的总数: " << N << endl; if (0 == testHole()) { return 0; } char str_Gd[2] = "H"; actionFunction(str_Gd); break; } case 17: { int combinelength_one = HoleLength[9]; for (int j = 0; j < combinelength_one; j++) { for (int k = 0; k < 2; k++) { Hole[j][k] = HoleI[j][k]; } } N = combinelength_one; cout << "点的总数: " << N << endl; if (0 == testHole()) { return 0; } char str_Gd[2] = "I"; actionFunction(str_Gd); break; } case 18: { int combinelength_one = HoleLength[10]; for (int j = 0; j < combinelength_one; j++) { for (int k = 0; k < 2; k++) { Hole[j][k] = HoleJ[j][k]; } } N = combinelength_one; cout << "点的总数: " << N << endl; if (0 == testHole()) { return 0; } char str_Gd[2] = "J"; actionFunction(str_Gd); break; } case 19: { int combinelength_one = HoleLength[3]; int combinelength_two = HoleLength[10]; combineArray(HoleC, HoleJ, combinelength_one, combinelength_two, Hole); if (0 == testHole()) { return 0; } N = combinelength_one + combinelength_two; cout << "点的总数: " << N << endl; if (0 == testHole()) { return 0; } char str_Gd[3] = "CJ"; actionFunction(str_Gd); break; } case 20: { int combinelength_one = HoleLength[10]; int combinelength_two = HoleLength[3]; combineArray(HoleJ, HoleC, combinelength_one, combinelength_two, Hole); if (0 == testHole()) { return 0; } N = combinelength_one + combinelength_two; cout << "点的总数: " << N << endl; if (0 == testHole()) { return 0; } char str_Gd[3] = "JC"; actionFunction(str_Gd); break; } case 21: { int combinelength_one = HoleLength[5]; int combinelength_two = HoleLength[10]; combineArray(HoleE, HoleJ, combinelength_one, combinelength_two, Hole); if (0 == testHole()) { return 0; } N = combinelength_one + combinelength_two; cout << "点的总数: " << N << endl; if (0 == testHole()) { return 0; } char str_Gd[3] = "EJ"; actionFunction(str_Gd); break; } default: return 0; break; } }}//--------------------------第二问-------------------------------------------------- //首先读分区文件。template
Type stringToNum(const string& str){ istringstream iss(str); Type num; iss >> num; return num;}//初始化数组,参数1是该行字符串,参数2是要初始化的数组。参数3是初始化那个数组void initHolo(string s_l, double init_hole[][2], int singal){ int Xs = s_l.find("X"); int Ys = s_l.find("Y"); string str = s_l.substr(Xs + 1, Ys); init_hole[HoleLength[singal]][0] = stringToNum
(str); str = s_l.substr(Ys + 1); init_hole[HoleLength[singal]][1] = stringToNum
(str);}//--------------------------第二问测试函数-------------------------------------------------- void Qusetion_init(string filename){ //string filename = "one.txt"; ifstream fin(filename, _IOS_Nocreate); if (!fin){ cout << "File open error!\n"; return; } char line[100]; string s_l = ""; int singal = 0; //信号 while (!fin.eof()) //判断文件是否读结束 { s_l = ""; fin.getline(line, 100); s_l = line; if (-1 != s_l.find("A")) { singal = 1; cout << s_l << endl; } else if (-1 != s_l.find("B")) { singal = 2; cout << s_l << endl; } else if (-1 != s_l.find("C")) { singal = 3; cout << s_l << endl; } else if (-1 != s_l.find("D")) { singal = 4; cout << s_l << endl; } else if (-1 != s_l.find("E")) { singal = 5; cout << s_l << endl; } else if (-1 != s_l.find("F")) { singal = 6; cout << s_l << endl; } else if (-1 != s_l.find("G")) { singal = 7; cout << s_l << endl; } else if (-1 != s_l.find("H")) { singal = 8; cout << s_l << endl; } else if (-1 != s_l.find("I")) { singal = 9; cout << s_l << endl; } else if (-1 != s_l.find("J")) { singal = 10; cout << s_l << endl; } else { switch (singal) { case 1: { initHolo(s_l, HoleA, singal); HoleLength[singal] = HoleLength[singal] + 1; //计数 break; } case 2: { initHolo(s_l, HoleB, singal); HoleLength[singal] = HoleLength[singal] + 1; //计数 break; } case 3: { initHolo(s_l, HoleC, singal); HoleLength[singal] = HoleLength[singal] + 1; //计数 break; } case 4: { initHolo(s_l, HoleD, singal); HoleLength[singal] = HoleLength[singal] + 1; //计数 break; } case 5: { initHolo(s_l, HoleE, singal); HoleLength[singal] = HoleLength[singal] + 1; //计数 break; } case 6: { initHolo(s_l, HoleF, singal); HoleLength[singal] = HoleLength[singal] + 1; //计数 break; } case 7: { initHolo(s_l, HoleG, singal); HoleLength[singal] = HoleLength[singal] + 1; //计数 break; } case 8: { initHolo(s_l, HoleH, singal); HoleLength[singal] = HoleLength[singal] + 1; //计数 break; } case 9: { initHolo(s_l, HoleI, singal); HoleLength[singal] = HoleLength[singal] + 1; //计数 break; } case 10: { initHolo(s_l, HoleJ, singal); HoleLength[singal] = HoleLength[singal] + 1; //计数 break; } default: break; } } } fin.close(); cout << "该分区所对应的————每个点孔的个数:" << endl; for (int m = 1; m < sizeof(HoleLength)/4; m++) { HoleLength[m] = HoleLength[m] - 1; cout << HoleLength[m] << ", "; } cout << endl;}void secondQusetion(){ //初始化数据。 string filename = ""; cout << "请选择分区测试 1————one, 2————two, 3————thr, 4————fur" << endl; int x; cin >> x; switch (x) { case 1: filename = "one.txt"; break; case 2: filename = "two.txt"; break; case 3: filename = "thr.txt"; break; case 4: filename = "fur.txt"; break; case 5: filename = "1.txt"; break; default: cout << "输入错误" << endl; break; } Qusetion_init(filename); TypeTest(); /*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/}void firstQuestion(){ //DataInit(); Qusetion_init("1.txt"); //combineTest(); //printCombineArray(Hole); TypeTest();}//--------------------------主函数-------------------------------------------------- int main(){ int x = 0; cout << "请输入1或者2,选择测试种类, 1是第一问,2是第二问 \n"; cin >> x; switch (x) { case 1: firstQuestion(); break; case 2: secondQusetion(); break; default: break; } return 0;}

 

转载于:https://www.cnblogs.com/hgonlywj/p/4842698.html

你可能感兴趣的文章
java 泛型初探
查看>>
在Linux中执行.sh脚本,异常/bin/sh^M: bad interpreter: No such file or directory
查看>>
就是一个表格
查看>>
CakePHP 2.x CookBook 中文版 第三章 入门 之 CakePHP 的结构
查看>>
Objective-C的算术表达式 .
查看>>
找回使用Eclipse删除的文件
查看>>
rabbitmq 消息系统 消息队列
查看>>
集成spring3、hibernate4、junit
查看>>
URL与ASCII
查看>>
Redis.conf 说明
查看>>
我的友情链接
查看>>
java读取properties配置文件
查看>>
LVS+keepalived负载均衡
查看>>
UITableview中cell重用引起的内容重复的问题
查看>>
stm32 ADC使用 单通道 多通道
查看>>
Windows7操作系统安装教程(图文)
查看>>
IOS Core Animation Advanced Techniques的学习笔记(三)
查看>>
除了模拟手术教学,VR在医疗领域如何应用?
查看>>
HashCode
查看>>
盘点5款Ubuntu监控工具解决CPU暴增问题
查看>>