Varför fastnar programmet i en loop? C++ (Nybörjare)
Hej!
Har för 1 vecka sedan satt igång med att försöka självlära mig programmering och har då gått igenom SoloLearns enkla kurs i C++ grunder.
Nu är det så att jag försöker öva på det jag lärt mig genom att koda ett första program som ska dela ut kort ur en kortlek men jag har råkat på ett problem jag inte förstår.
Av någon anledning fastnar programmet i en loop när man försöker printa ca 45+ kort ur kortleken samtidigt. Förklara gärna varför detta händer men se till att jag då också förstår förklaringen d.v.s. om ni använder komplicerade ord så vill jag gärna att det förklaras så en nybörjare i min nivå har lätt för att förstå.
Om ni vill påpeka hur jag kan struktura koden bättre eller ett bättre sätt till att koda detta programmet så skulle det gärna uppskattas.
#include <iostream>
#include "Deck.h"
#include "string"
#include <cstdlib>
deck::deck() :card{ "Ace", "King", "Queen", "Jack","Ten","9","8","7","6","5","4","3","2" }, suit{"Clubs","Diamonds","Spades","Hearts"},
card_short{ "A", "K", "Q", "J","T","9","8","7","6","5","4","3","2" }, suit_short{ "c","d","s","h" }
{
check = 0;
}
deck::~deck()
{
}
void deck::deal()
{
cards = shuffle();
std::cout << cards;
}
std::string deck::shuffle()
{
failsafe = 0; //Är bara till för att förhindra en oändlig loop tills problemet är löst.
c = rand() % 12; //Bestämmer vilket värde kortet har som printas.
s = rand() & 3; //Bestämmer vilken färg kortet har som printas.
while (dup_check(c, s)) { //Denna while loop säkerställer att vi inte printar en kopia på något kort men fastnar av någon anledning i en loop när vi försöker printa 40+ kort.
c = rand() % 12;
s = rand() & 3;
}
return card_short[c]+suit_short[s]+" - "+card[c]+" of "+suit[s];
}
bool deck::dup_check(int x, int y) {
if (failsafe > 52) { //Denna if funktion kontrollerar så ingen oändlig loop är igång men bara tillfälligt tills problemet är löst.
std::cout << "----- ----- ----- dup_check() stuck in infinite loop detected.\n";
return false;
}
for (int z = 0; z < check; z++) {
if (dupx[z] == x && dupy[z] == y) { //Av någon anledning när vi försöker printa 40+ kort så loopas denna if funktion hela tiden.. varför?
failsafe++; //Berättar för programmet hur många gånger vi loopat utan att komma vidare (tillfällig lösning).
return true;
}
}
dupx[check] = x;
dupy[check] = y;
check++;
return false;
}
#pragma once
class deck
{
public:
deck();
~deck();
std::string hand;
std::string cards;
std::string shuffle();
void deal();
bool dup_check(int x, int y);
private:
std::string const card[13];
std::string const suit[4];
std::string const card_short[13];
std::string const suit_short[4];
int c;
int s;
int check;
int dupx[52];
int dupy[52];
int failsafe;
};
#include <iostream>
#include <string>
#include "Deck.h"
#include <time.h>
void deal(deck x) {
int n;
std::cout << "\nHow many cards do you want to deal?\n";
std::cin >> n;
while (std::cin.fail()) {
std::cin.clear();
std::cin.ignore();
std::cout << "No symbols or letters allowed. Try again.\n";
std::cin >> n;
}
if (n != 1)
std::cout << "\nDealing your cards:\n";
else
std::cout << "\nDealing your card:\n";
for (int z = 0; z < n; z++) {
x.deal();
std::cout << std::endl;
}
std::cout << "\n\nDo you want to deal again?\n";
}
int main() {
srand(time(NULL));
std::string input;
deck hand;
deck *phand = &hand;
std::cout << "Welcome to Card Generator 2017! Have fun generating cards.\n";
while (input != "quit"&&input != "n"&&input != "no") {
deal(*phand);
do {
std::cin >> input;
if (input != "yes"&&input != "quit"&&input != "y"&&input != "n"&&input != "no")
std::cout << "'" << input << "'" << " is not a valid answer, please try again or type 'quit' to quit.\n";
}
while (input != "yes"&&input != "quit"&&input !="y"&&input != "n"&&input != "no");
}
}
PS: Är du en duktig programmerare som antingen har lust att lära mig programmering eller kan hjälpa mig få ihop en bra självstudieplan som t.ex. tar upp att nästa steg är att kolla på x video för att lära dig y och sedan försöker du koda z program med det du lärt dig så vill jag gärna att du tar kontakt med mig via pm.
Anledningen till att jag behöver självlära mig är det att jag tyvärr saknar möjligheten att gå en riktig programmeringsutbildning i min situation.
i7 3930K - Noctua NH-D14 - MSI 1080 - Asus Sabertooth x79 - Corsair Vengeance DDR3 LP 4x4GB - Crucial MX100 256GB - AOC q2770Pqu 1440p - Corsair RM650x - Fractal Design R5 - Logitech G403 - Filco Majestouch-2 - Denon AVR-2113 - Dali Zensor 1