所以它是一个星期五,我一直在使用这个应用程序,我的脑袋即将爆炸。我无法在任何地方找到问题!我是一个初学者编码器,所以我希望stackoverflow的众神可以指导我正确的方向或提供一些反馈! :
这个控制台应用程序只是一个简单的停车时间票。代码符合罚款,没有错误。但我的数学都搞砸了!
以下是一个示例结果:时间输入为3:50,退出5:29,车辆为T。
TIME-IN -858993460:858993460
TIME-OUT -858933460:-858993460
PARKING TIME 0:-858993460
TOTAL CHARGE -214748352.00
这是我的代码
#include <iostream> //used for cout/cin
#include <iomanip> //used to manipulate data
void getData(int* ehour, int* emin, int* exhour, int* exmin);
void rate(int exhour, int exmin, int ehour, int emin, int* thour, int* tmin, int* round);
void charge(char* vehic, float* rate1, float* rate2, int ehour);
void result(int exhour, int exmin, int ehour, int emin, int thour, float rate1, float rate2, int round, float total);
int main(void)
{
char vehic;
int ehour;
int emin;
int exhour;
int exmin;
int thour;
int tmin;
int round;
float rate1;
float rate2;
float total;
getData(&ehour, &emin, &exhour, &exmin);
rate(exhour, exmin, ehour, emin, &thour, &tmin, &round);
charge(&vehic, &rate1, &rate2, ehour);
total= rate1 + rate2;
result( exhour, exmin, ehour, emin, thour, rate1, rate2, round, total);
return 0;
}
void getData(int* ehour, int* emin, int* exhour, int* exmin)
{
char v;
printf("Enter C for car, B for bus, T for truck: ");
scanf("%c", &v);
printf("\nHour vehicle entered 0-24: ");
scanf("%d", &ehour);
printf("\nMinute vehicle entered 0-60: ");
scanf("%d", &emin);
printf("\nHour vehicle exited 0-24: ");
scanf("%d", &exhour);
printf("\nMinute vehicle exited 0-60: ");
scanf("%d", &exmin);
return;
}
void rate(int exhour, int exmin, int ehour, int emin, int* thour, int* tmin, int* round)
{
if(emin < exmin)
{
emin= emin + 60;
exhour= exhour - 1;
}
*thour = ehour - exhour;
*tmin = emin - exmin;
if ((*tmin > 0 && *tmin <= 60))
{
*thour = *thour + 1;
*round = *tmin * 0;
}
return;
}
void charge(char* vehic, float* rate1, float* rate2, int ehour)
{
switch (*vehic)
{
case 'c': if (ehour <= 3)
{
*rate1 = 0.00;
if (ehour > 3)
*rate2 = 1.25 * (ehour - 3);
}
break;
case 'b': if (ehour <= 2)
{
*rate1 = 2.00 * ehour;
if (ehour > 2)
*rate2 = 2.50 * (ehour - 2);
}
break;
case 't': if (ehour <= 1)
{
*rate1 = 3.75 * ehour;
if (ehour > 1)
*rate2 = 4.50 * (ehour - 1);
}
break;
}
return;
}
void result(int exhour, int exmin, int ehour, int emin, int thour, float rate1, float rate2, int round, float total)
{
printf("\n\t\t PARKING LOT CHARGE \t\t\n");
printf("\nType of vehicle: Car or Bus or Truck");
printf("\nTIME-IN\t\t %d:%d", ehour, emin);
printf("\nTIME-OUT\t\t %d:%d", exhour, exmin);
printf("\n\t\t\t --------");
printf("\nPARKING TIME\t\t %d:%d", thour, round);
printf("\n\t\t\t --------");
total= rate1 + rate2;
printf("\nTOTAL CHARGE\t\t %4.2f\n\n", total);
return;
}
对不起,这是很多代码!我很困惑!我的整数格式不正确吗?数学错了吗?
答案 0 :(得分:7)
char v;
printf("Enter C for car, B for bus, T for truck: ");
scanf("%c", &v);
printf("\nHour vehicle entered 0-24: ");
scanf("%d", ehour);
printf("\nMinute vehicle entered 0-60: ");
scanf("%d", emin);
printf("\nHour vehicle exited 0-24: ");
scanf("%d", exhour);
printf("\nMinute vehicle exited 0-60: ");
scanf("%d", exmin);
您获取了参数的地址,这些参数是已经指针。
作为一般的手指练习,这是你可以用更典型的C ++风格做的事情:
/////////////////////////////////////
// timepoint classes (booking.hpp)
struct timepoint
{
int hour, minute;
timepoint normalized() const;
int totalMinutes () const;
int roundedHours () const;
timepoint operator- (timepoint const& rhs) const;
};
struct booking_t
{
char vehicle;
timepoint enter, exit;
timepoint parked() const { return exit - enter; }
};
/////////////////////////////////////
// main program (main.cpp)
booking_t inputData();
void displayBill(booking_t const& booking);
int main(void)
{
auto booking = inputData();
displayBill(booking);
}
/////////////////////////////////////
// timepoint methods (booking.cpp)
timepoint timepoint::normalized() const
{
timepoint tmp { (hour + minute/60) % 24, minute % 60 };
while (tmp.minute < 0) tmp.hour--, tmp.minute+=60;
while (tmp.hour < 0) tmp.hour+=24;
return tmp;
}
int timepoint::roundedHours() const
{
return (totalMinutes()-1) / 60 + 1; // TODO check rounding logic
}
int timepoint::totalMinutes() const
{
return hour*60 + minute;
}
timepoint timepoint::operator-(timepoint const& rhs) const
{
return timepoint { 0, totalMinutes() - rhs.totalMinutes() } .normalized();
}
#include <iostream> //used for cout/cin
timepoint getTime(std::string label)
{
int hour, minute;
std::cout << "\nHour " << label << " 0-24: ";
std::cin >> hour;
std::cout << "\nMinute " << label << " 0-60: ";
std::cin >> minute;
return { hour, minute };
}
/////////////////////////////////////
// global functions - input
booking_t inputData()
{
std::cout << "Enter C for car, B for bus, T for truck: ";
char v;
std::cin >> v;
auto entered = getTime("vehicle entered");
auto exited = getTime("vehicle exited");
return { v, entered.normalized(), exited.normalized() };
}
/////////////////////////////////////
// calculation + billing
#include <sstream>
#include <iomanip> //used to manipulate data
#include <map>
static std::ostream& operator <<(std::ostream& os, timepoint const& tp)
{
std::ostringstream oss;
oss << std::setw(2) << std::setfill('0') << tp.hour << ':'
<< std::setw(2) << std::setfill('0') << tp.minute;
return os << oss.str();
}
std::pair<float,float> charge(booking_t const& booking)
{
struct tariff_t { int threshold; float rate1, rate2; };
const static auto tariffs = std::map<char, tariff_t> {
{ 'c', { 3, 0 , 1.25 } },
{ 'b', { 2, 2. , 2.5 } },
{ 't', { 1, 3.75, 4.5 } } ,
};
auto& tariff = tariffs.at(std::tolower(booking.vehicle));
auto parked = booking.parked().roundedHours();
return std::make_pair(
tariff.rate1 * std::min(tariff.threshold, parked) ,
tariff.rate2 * std::max(0, parked - tariff.threshold));
}
void displayBill(booking_t const& booking)
{
std::cout << "\n\n PARKING LOT CHARGE\n";
std::cout << "Type of vehicle: Car or Bus or Truck\n";
std::cout << "TIME-IN " << booking.enter << "\n";
std::cout << "TIME-OUT " << booking.exit << "\n";
std::cout << " " << "--------\n";
std::cout << "PARKING TIME " << booking.parked() << "\n";
std::cout << " ROUNDED " << booking.parked().roundedHours() << "\n";
std::cout << " " << "--------\n";
auto rates = charge(booking);
float total = rates.first + rates.second;
std::cout << "TOTAL CHARGE " << std::fixed << std::setw(7) << std::setprecision(2) << total << "\n\n";
}
答案 1 :(得分:3)
我找不到很多关于你的原始代码的赎回,所以这本身并不是一个答案,但也许你会觉得我在“纯C ++”中为你的问题编写代码会很有趣:
#include <string>
#include <iostream>
#include <sstream>
bool parse_time(std::string const & s, int & t)
{
int h, m;
char c;
std::istringstream iss(s);
if (iss >> h >> c >> m >> std::ws && c == ':' && iss.get() == EOF)
{
t = 60 * h + m;
return true;
}
return false;
}
int main()
{
int t_in, t_out;
std::string line;
if (!(std::cout << "Enter arrival time: " &&
std::getline(std::cin, line) &&
parse_time(line, t_in) &&
std::cout << "Enter departure time: " &&
std::getline(std::cin, line) &&
parse_time(line, t_out)))
{
std::cerr << "Input error! Aborting.\n";
return 0;
}
std::cout << "You spent " << t_out - t_in << " minutes.\n";
}
这是一个典型的会议:
Enter arrival time: 5:14
Enter departure time: 8:41
You spent 207 minutes.
答案 2 :(得分:1)
我注意到的一件事 - 您传递&ehour
和朋友,这是指向scanf
电话的指针(您可以从&
来电中删除scanf
当ehour
为int*
)时。
答案 3 :(得分:1)
取出&amp;在scanf中!他们已经是指针了!
答案 4 :(得分:1)
代码中的另一个错误是变量vehic
永远不会获得值。看起来你打算在getData
给它一个值,但不知何故搞砸了。
答案 5 :(得分:1)
规则1:在您第一次使用它们的位置附近声明变量。并在创建时初始化所有变量:
int main(void)
{
int ehour = 0;
int emin = 0;
int exhour = 0;
int exmin = 0;
getData(&ehour, &emin, &exhour, &exmin);
int thour = 0;
int tmin = 0;
int round = 0;
rate(exhour, exmin, ehour, emin, &thour, &tmin, &round);
char vehic = 0;
float rate1 = 0;
float rate2 = 0;
charge(&vehic, &rate1, &rate2, ehour);
float total = 0;
total= rate1 + rate2;
result( exhour, exmin, ehour, emin, thour, rate1, rate2, round, total);
return 0;
}
现在看到float total
?将变量的声明和初始化移动到同一行:
float total = rate1 + rate2;
规则2:如果您不需要,请不要使用指针。如果你有一个想要传入和传出函数的整数,请将参数作为参数参数,如下所示:
void getData(int& ehour, int& emin, int& exhour, int& exmin)
主要:
getData(ehour, emin, exhour, exmin);
在getData中:
void getData(int& ehour, int& emin, int& exhour, int& exmin)
{
char v;
printf("Enter C for car, B for bus, T for truck: ");
scanf("%c", &v);
printf("\nHour vehicle entered 0-24: ");
scanf("%d", &ehour);
printf("\nMinute vehicle entered 0-60: ");
scanf("%d", &emin);
printf("\nHour vehicle exited 0-24: ");
scanf("%d", &exhour);
printf("\nMinute vehicle exited 0-60: ");
scanf("%d", &exmin);
return;
}
现在,我发现了你的第一次搞砸了。你在哪里读取不是整数,而是指向整数的指针。现在我已经将它们作为引用(想想“别名”或传入的变量),&
运算符获取指向整数的指针,而不是指向整数指针的指针!
您要做的下一件事是不使用scanf。 Scanf很难使用。为什么要使用难以使用的东西?
第3步:您的程序应该帮助您调试它。
当您从输入中读取内容时,请将其重复出来以确保您正确阅读。也就是说,在你调用getData之后,接下来要做的就是重复你所读的内容。最后,当您的代码是可靠的时,您可以删除“重复它”,但在开发程序时,这种反馈是必不可少的。
有关更好的阅读方式,请参阅Kerrek SB,而不是使用scanf
。