У меня есть программа, которая рассчитывает стоимость телефонных звонков с разными расценками на разные дни и часы. Показатели являются следующие:Почему вычисляется неправильное значение?
Любой вызов между 8:00 и 6:00 вечера, с понедельника по пятницу, оплачивается в размере $ 0,40 за минуту.
Любые звонки до 8:00 утра или после 18:00 с понедельника по пятницу оплачиваются по 0,25 доллара США в минуту.
Любые звонки в субботу или воскресенье оплачиваются по цене 0,15 доллара США в минуту.
Любой вызов, продолжительность которого распространяется на несколько зон с тарификацией, взимается в зависимости от фактических минут в соответствующих зонах скорости.
Мой код дает правильные значения для каждого журнала, за исключением последнего, который должен составлять 6,50 доллара США, но вместо этого составляет 4,50 доллара США.
Код выглядит следующим образом:
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <algorithm>
#include <iterator>
using namespace std;
string makeTimeIntoInt(string line[]) {
string temp = "";
string time = line[1];
for (char a : time) {
if (a == ':')
continue;
else
temp += a;
}
return temp;
}
string nextDay(string day){
if(day == "Mo") return "Tu";
else if(day == "Tu") return "We";
else if(day == "We") return "Th";
else if(day == "Th") return "Fr";
else if(day == "Fr") return "Sa";
else if(day == "Sa") return "Su";
else if(day == "Su") return "Mo";
return day;
}
int convertSixtySecondsToHour(int time){
if(time == 060) time = 100;
else if(time == 160) time = 200;
else if(time == 260) time = 300;
else if(time == 360) time = 400;
else if(time == 460) time = 500;
else if(time == 560) time = 600;
else if(time == 660) time = 700;
else if(time == 760) time = 800;
else if(time == 860) time = 900;
else if(time == 960) time = 1000;
else if(time == 1060) time = 1100;
else if(time == 1160) time = 1200;
else if(time == 1260) time = 1300;
else if(time == 1360) time = 1400;
else if(time == 1460) time = 1500;
else if(time == 1560) time = 1600;
else if(time == 1660) time = 1700;
else if(time == 1760) time = 1800;
else if(time == 1860) time = 1900;
else if(time == 1960) time = 2000;
else if(time == 2060) time = 2100;
else if(time == 2160) time = 2200;
else if(time == 2260) time = 2300;
else if(time == 2360) time = 000;
return time;
}
float calculateCost(string line[]) {
int time = stoi(makeTimeIntoInt(line));
int duration = stoi(line[2]);
string day = line[0];
float totalCost = 0;
for(int i = 1; i <= duration; i++){
if (line[0] == "Mo" || line[0] == "Tu" || line[0] == "We" ||
line[0] == "Th" || line[0] == "Fr") {
if (time < 800 || time > 1800) {
totalCost += 0.25;
} else
totalCost += 0.4;
}
else if (line[0] == "Sa" || line[0] == "Su") {
totalCost += 0.15;
}
time++;
time = convertSixtySecondsToHour(time);
if(time == 000){
day = nextDay(day);
}
}
return totalCost;
}
int main() {
ifstream inputFile;
string line;
int cnt = 0;
inputFile.open("/Users/wonder-intern/Documents/C++ Workspace/PhoneRecords/PhoneRecords/calls_history.txt"); //change this to the path of the txt file
string arr[18];
string line1[3], line2[3], line3[3], line4[3], line5[3], line6[3];
float costLine1, costLine2, costLine3, costLine4, costLine5, costLine6;
if (!inputFile.is_open()) {
cout << "file could not be opened\n\n";
return 0;
}
while (getline(inputFile, line) && cnt < 18) {
istringstream split(line);
split >> arr[cnt];
cnt++;
split >> arr[cnt];
cnt++;
split >> arr[cnt];
cnt++;
}
inputFile.close();
line1[0] = arr[0];
line1[1] = arr[1];
line1[2] = arr[2];
line2[0] = arr[3];
line2[1] = arr[4];
line2[2] = arr[5];
line3[0] = arr[6];
line3[1] = arr[7];
line3[2] = arr[8];
line4[0] = arr[9];
line4[1] = arr[10];
line4[2] = arr[11];
line5[0] = arr[12];
line5[1] = arr[13];
line5[2] = arr[14];
line6[0] = arr[15];
line6[1] = arr[16];
line6[2] = arr[17];
costLine1 = calculateCost(line1);
costLine2 = calculateCost(line2);
costLine3 = calculateCost(line3);
costLine4 = calculateCost(line4);
costLine5 = calculateCost(line5);
costLine6 = calculateCost(line6);
cout << "Day Time Duration Cost\n\n";
cout << line1[0] << " " << line1[1] << " " << line1[2] << " $" << costLine1
<< "\n";
cout << line2[0] << " " << line2[1] << " " << line2[2] << " $" << costLine2
<< "\n";
cout << line3[0] << " " << line3[1] << " " << line3[2] << " $" << costLine3
<< "\n";
cout << line4[0] << " " << line4[1] << " " << line4[2] << " $" << costLine4
<< "\n";
cout << line5[0] << " " << line5[1] << " " << line5[2] << " $" << costLine5
<< "\n";
cout << line6[0] << " " << line6[1] << " " << line6[2] << " $" << costLine6
<< "\n";
cout << "Total: $"
<< costLine1 + costLine2 + costLine3 + costLine4 + costLine5 + costLine6
<< "\n\n";
return 0;
}
Текстовый файл с помощью журнала вызовов можно найти здесь: https://drive.google.com/open?id=0Bysk6_x4B46uQko4dEpMNXZtY2M
Вы пытались отладить этот код? – meJustAndrew
Это 'if (time == 060)' фактически 'if (time == 48)'. – DimChtz
Да, я знаю, что новый курс не применяется, но я не знаю, почему –