在while循环中将布尔值更改为true? C++

Posted

技术标签:

【中文标题】在while循环中将布尔值更改为true? C++【英文标题】:Boolean value being changed to true in while loop? C++ 【发布时间】:2021-06-09 00:13:57 【问题描述】:

我在单链表中有一副牌。我正在尝试随机交换没有重复的值。为此,我为每个节点添加了一个布尔变量“used”并将其设置为 false。每当我使用这些卡时,我都会将其更新为 true,因此它们不会再次使用。我正在尝试添加一个 while 循环以确保没有使用过的卡被交换。但是,一旦我开始 while 循环,每个节点的 used 变量都会设置为 true,因此 while 循环永远不会中断。我在 while 循环之前打印了使用的变量值,它们都设置为 false。任何帮助表示赞赏。

 void DeckOfCards::randomSwap()

    Card* ptr = head; 
    Card* n = NULL;
    Card* temp = NULL;
    srand((unsigned)(time(0)));

    for (int i = 1; i < 52; ++i)
    
        
        int r = rand() % 52 + 1;
        n = getNode(r);

        while(n->used != false)
        
            r = rand() % 52 + 1;
            n = getNode(r);
        

        temp = ptr;
        ptr->setRank(n->getRank());
        ptr->setSuit(n->getSuit());
        n->setRank(temp->getRank());
        n->setSuit(temp->getSuit());
        n->used = true;
        ptr->used = true;
        ptr = ptr->next;
    

    std::cout << "Cards randomly swapped." << std::endl;

#pragma once
#include <iostream>

class Card

private:
    int cardRank;
    std::string cardSuit;
public: 
    Card* next;
    bool used = false;

    Card();
    ~Card();
    void setRank(int);
    void setSuit(std::string);
    int getRank(); 
    std::string getSuit();

;
#include "Card.h"

Card::Card()

    cardRank = 0; 
    cardSuit = "Default"; 
    next = NULL;
    used = false;


Card::~Card()

    next = NULL; 
    delete next; 


void Card::setRank(int r)

    cardRank = r; 


void Card::setSuit(std::string s)

    cardSuit = s;


int Card::getRank()

    return cardRank;


std::string Card::getSuit()

    return cardSuit; 

#include "DeckOfCards.h"
#include <ctime>
#include <iostream>

DeckOfCards::DeckOfCards()

    head = NULL; 
    tail = NULL;


DeckOfCards::~DeckOfCards()

    head = NULL; 
    delete head; 
    tail = NULL; 
    delete tail; 


void DeckOfCards::addNode(int r, std::string s)

    Card* n = new Card; 
    n->setRank(r); 
    n->setSuit(s);
    n->used = false;
    n->next = NULL;

    if (head == NULL)
    
        head = n; 
        tail = n; 
    
    else
    
        tail->next = n; 
        tail = tail->next; 
    


void DeckOfCards::createDeck()

    for (int i = 0; i < 4; ++i)
    
        for (int j = 0; j < 13; ++j)
        
            addNode(rank[j], suit[i]);
        
    


void DeckOfCards::print()

    Card* temp = head;
    while (temp != NULL)
    
        std::cout << "(" << temp->getRank() << " of " << temp->getSuit() << ")\n";
        temp = temp->next;
    
    std::cout << std::endl;



bool DeckOfCards::CardExists(int r, std::string s)

    Card* temp = head; 
    for (int i = 0; i < 52; ++i)
    
        if (r == temp->getRank() && s == temp->getSuit())
            return true; 
        else
        
            temp = temp->next;
        
    
    return false; 


Card* DeckOfCards::getNode(int pos)

    Card* temp = head; 
    for (int i = 0; i < pos-1; ++i)
    
        temp = temp->next; 
    
    return temp; 



void DeckOfCards::randomSwap()

    Card* ptr = head; 
    Card* n = NULL;

    for (int i = 1; i < 52; ++i)
    
        
        int r = rand() % 52 + 1;
        n = getNode(r);

        while(n->used != false)
        
            std::cout << r << " " << n->used << std::endl;
            r = rand() % 52 + 1;
            n = getNode(r);
        

        int tempRank = ptr->getRank();
        std::string tempSuit = ptr->getSuit();
    
        ptr->setRank(n->getRank());
        ptr->setSuit(n->getSuit());
        n->setRank(tempRank);
        n->setSuit(tempSuit);

        n->used = true;
        ptr->used = true;

        ptr = ptr->next;
    

    std::cout << "Cards randomly swapped." << std::endl;


void DeckOfCards::shuffleCards()

    Card* tail = NULL;
    Card* temp = NULL;
    Card* ptr = head;

    while (ptr != NULL)
    
        tail = ptr;
        ptr = ptr->next;
    

    ptr = head;
    temp = tail;

    for (int i = 0; i < 26; ++i)
    
        int tempRank = temp->getRank();
        std::string tempSuit = temp->getSuit();

        temp->setSuit(ptr->getSuit());
        temp->setRank(ptr->getRank());

        ptr->setSuit(tempSuit);
        ptr->setRank(tempRank);

        temp = getNode(51-i);
        ptr = ptr->next;
    

    std::cout << "Cards shuffled.\n" << std::endl;

#pragma once
#include "Card.h"
#include <iostream>

class DeckOfCards

private: 
    Card *head, *tail; 
    int rank[13] = 1,2,3,4,5,6,7,8,9,10,11,12,13;
    std::string suit[4] =  "Hearts", "Diamonds", "Spades", "Clubs" ;

public: 

    DeckOfCards();
    ~DeckOfCards();
    void addNode(int,std::string);
    void createDeck(); 
    void randomSwap();
    void print();
    void shuffleCards();
    Card* getNode(int);
    bool CardExists(int r, std::string s);


;
#include <iostream>
#include "DeckOfCards.h"    
#include "CircularList.h"
#include <ctime>
int main()


    srand((unsigned)(time(0)));

    DeckOfCards d; 
    d.createDeck(); 
    d.randomSwap();
    d.shuffleCards();

    return 0;

【问题讨论】:

我们需要看看 Card 类。这很可能是由于未初始化的变量。 我的水晶球告诉我getNode改变了值。 我添加了卡片类。我以为我正确初始化了它 另外,srand 应该在 main 中调用一次 好的,我会解决的,谢谢。我还添加了getNode,它会如何改变值? 【参考方案1】:
    temp = ptr;

好的,所以tempptr 都是指向同一个对象的指针。

    ptr->setRank(n->getRank());
    ptr->setSuit(n->getSuit());

现在,tempptr 都指向对象,n 指向具有相同的点数和花色。

    n->setRank(temp->getRank());
    n->setSuit(temp->getSuit());

糟糕,现在您将对象n 的点数设置回相同的等级并适合它最初的位置。那不是你想做的。

您一定认为ptr-&gt;setRanktemp-&gt;SetRank 做不同的事情。但是他们做同样的事情,因为他们都在同一个对象上调用setRank。所以temp 在这里毫无用处。您需要一个临时对象或其他可以在交换操作期间保持排名和花色的临时对象。临时指针对您没有帮助。

还有:

Card::~Card()

    next = NULL; 
    delete next; 

这无济于事。将next 设置为NULL 没有任何作用,因为该对象即将停止存在。在NULL 上调用delete 没有任何作用。那么这个析构函数的目的是什么?

【讨论】:

好的,我删除了 temp ptr,而是创建了 temp 变量,然后将 n 设置为等于变量。但是,这仍然没有让代码运行。还有其他建议吗? @ZachSal 学习自己的调试技能会对你的生活有很大帮助。 我试了好几个小时,我是 CS 一年级的学生,谢谢你的帮助。 @ZachSal 你必须给我足够的代码来复制这个问题。如果没有一些代码就无法复制问题,则问题可能出在该代码中。请记住,循环中的每次传递都会设置 两张 牌! 感谢您的回复,我认为问题肯定是 randomSwap 功能,但我不确定,我对编程还是很陌生。我已经上传了整个代码。

以上是关于在while循环中将布尔值更改为true? C++的主要内容,如果未能解决你的问题,请参考以下文章

使用 np.where() 在 pandas 数据框中将 True/False 值更改为离散值

将布尔值更改为与初始值相反

KeyError:在熊猫中尝试使用.loc方法将布尔列值更改为字符串时

简析Java中while循环与do/while循环的区别

在分类/聚类任务中将文本值更改为 int

React-Admin 在 SelectInput 中将值更改为自定义值