For循环不打印C++中的最后一个向量值

Posted

技术标签:

【中文标题】For循环不打印C++中的最后一个向量值【英文标题】:For loop not printing last vector value in C++ 【发布时间】:2018-01-25 02:23:31 【问题描述】:

我只是在学习 C++ 类,并试图比较和排序向量值(时间比另一个早),虽然其他一切正常,但我在向量中的最后一个值没有被打印出来。我猜这与我的 main 函数中的 for 循环有关,但我自己无法弄清楚。

感谢您的帮助!

main.cpp

#include <iostream>
#include "Time.h"
#include <vector>
#include <algorithm>

int main() 
    std::cout << "Please enter hour, minute, second: ";
    int hour, minute, second;
    std::cin >> hour >> minute >> second;
    Time now(hour, minute, second);
        //random time values
    Time now1(13,1,45);
    Time now2(23,47,12);
    Time now3(1,8,8);
    Time now4(19,4,13);

    std::vector<Time> times;
    times.push_back(now1);
    times.push_back(now);
    times.push_back(now2);
    times.push_back(now3);
    times.push_back(now4);
    sort(times.begin(), times.end(), IsEarlierThan);

    for(unsigned int i = 0; i < times.size(); i++)
        //std::cout << times[i] << std::endl;
        times[i].PrintAmPm();
    

    return 0;

时间.cpp

#include <iostream>
#include <string>
#include "Time.h"

Time::Time() 
    hour = 0;
    minute = 0;
    second = 0;


Time::Time(int theHour, int theMinute, int theSecond)
    hour = theHour;
    minute = theMinute;
    second = theSecond;


int Time::getHour() const 
    return hour;


int Time::getMinute() const 
    return minute;


int Time::getSecond() const
    return second;


void Time::PrintAmPm() const 
    int hour1;
    std::string amOrPm;
    if ((hour >= 0) && (hour <= 11))
        amOrPm = "am";
    else
        amOrPm = "pm";

    if ((hour > 12) && (hour <= 23))
        hour1 = hour - 12;
    if (hour == 0)
        hour1 = hour + 12;
    if ((hour > 0) && (hour <= 12))
        hour1 = hour;

    if ((minute < 10) && (second >=10))
        std::cout << hour1 << ":0" << minute << ":" << second << amOrPm << std::endl;
    if ((minute < 10) && (second < 10))
         std::cout << hour1 << ":0" << minute << ":0" << second << amOrPm << std::endl;
    if ((minute >= 10) && (second < 10))
        std::cout << hour1 << ":" << minute << ":0" << second << amOrPm << std::endl;


bool IsEarlierThan(const Time& t1, const Time& t2)
    if (t1.getHour() < t2.getHour())
        return true;
    if ((t1.getHour() == t2.getHour()) && (t1.getMinute() < t2.getMinute()))
        return true;
    if ((t1.getHour() == t2.getHour()) && (t1.getMinute() == t2.getMinute()) 
            && (t1.getSecond() < t2.getSecond()))
        return true;
    else
        return false;

时间。 h

class Time 
public:
    Time();
    Time(int theHour, int theMinute, int theSecond);

    int getHour() const;
    int getMinute() const;
    int getSecond() const;

    void PrintAmPm() const;

private:
    int hour;
    int minute;
    int second;
;

bool IsEarlierThan(const Time& t1, const Time& t2);

【问题讨论】:

【参考方案1】:

您没有看到您的输出之一,因为您的测试在 minutes &gt;= 10second &gt;= 10 时永远不会打印。

if ((minute < 10) && (second >=10))
if ((minute < 10) && (second < 10))
if ((minute >= 10) && (second < 10))
// None of these handle minute >= 10 && second >= 10!

now2 有两位数的分和秒,所以你的打印方法对它没有任何作用。

确实,这里正确的解决方案是使用 cout 替换这些测试,这些测试使用 std::setfillstd::setw 来对齐输出,而无需手动/有条件地置零。

    std::cout << std::setfill('0')
              << hour1 << ':'
              << std::setw(2) << minute << ':'
              << std::setw(2) << second << amOrPm << std::endl;

无需检查minute/second 的范围,您只需无条件告诉cout 应使用0 完成填充,并设置所需的填充宽度(每次都需要设置因为输出 char 会重置宽度)。

【讨论】:

我不会称它为 正确 解决方案。这是更简单的解决方案(也是正确的),但提问者的方法也是正确的,并且在他们的学习水平上可能更容易。 @immibis:提问者的方法非常容易出错(正如他们遇到这个问题的事实所证明的那样)。 DRY 是一个指导方针是有原因的。很容易一遍又一遍地编写相同的代码,但会出现您不会遇到的细微错误,因为您的各种带有错误的代码路径都不会被命中。即使 OP 还没有为 IO 操纵器做好准备,违反 DRY 也无济于事;在最坏的情况下,他们可以为每个值执行一次手动字符串操作,而不是将其嵌入到 3-4 个不同的输出行中。 重点是,我通常认为“正确”不仅包括工作,而且包括可维护和(轻松)可验证的。反复复制和粘贴并进行细微调整与可维护/可验证相反;太容易忽视了。 确实,但是我不喜欢阻止新程序员以明显的方式做事,因为否则他们会因为人们告诉他们不要做的所有事情而感到不知所措。一旦您编写和调试了几次相同的代码然后,您就可以“哇,这样做更容易!”但在那之前,你会觉得你的创造力被扼杀了。我不希望人们知道他们总是必须“按规定”做事,事实上。他们可以自己得出这个结论。 我不知道 DRY - 谢谢你指点我。我现在才刚刚开始,这是一个数据结构讲座作业,旨在帮助我们更好地了解课程的运作方式。感谢您的帮助!

以上是关于For循环不打印C++中的最后一个向量值的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中使用 for 循环打印数组

从 for 循环 matlab 内部生成的变量分配向量值

js 如何保存循环内的变量,然后循环外使用这个变量?

python中for循环前面换行最后不换行

为啥我在 PL/SQL 中的 for 循环没有打印出最后一次迭代

我们是不是需要 C++ 中的向量化或 for 循环已经足够快?