2016-07-27 3 views
-7

У меня есть программа, которая рассчитывает стоимость телефонных звонков с разными расценками на разные дни и часы. Показатели являются следующие:Почему вычисляется неправильное значение?

  • Любой вызов между 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

+2

Вы пытались отладить этот код? – meJustAndrew

+2

Это 'if (time == 060)' фактически 'if (time == 48)'. – DimChtz

+0

Да, я знаю, что новый курс не применяется, но я не знаю, почему –

ответ

1

Два вопроса:

1) 060 фактически восьмеричной, который в десятичной системе счисления равно 48. Таким образом, удалите все ведущие нули.
2) Внутри calculateCost изменения:

if (line[0] == "Mo" || line[0] == "Tu" || line[0] == "We" || 
    line[0] == "Th" || line[0] == "Fr") 

к:

if (day == "Mo" || day == "Tu" || day == "We" || 
    day == "Th" || day == "Fr") 

и

else if (line[0] == "Sa" || line[0] == "Su") 

к

else if (day == "Sa" || day == "Su") 

, поскольку WH en Вы звоните day = nextDay(day); очевидно вы меняете day и не line[0]. Вы получаете 4.5, потому что line[0] остается "Su". Только day изменяется на "Mo".

+0

Вот что я искал, огромное спасибо! –

Смежные вопросы