2017-03-19 5 views
0

Ich schreibe ein einfaches Programm, um eine Box mit einem benutzerdefinierten Seitenlänge und Rand/Füllzeichen zu generieren. Alles funktioniert, wie ich es will, außer wenn es die Box an das Terminal druckt, erzeugt es ein seltsames Zeichen, das ich nirgends finden kann. Ich habe das Gefühl, wenn ich weiß, was es ist, könnte ich es vielleicht beheben. Meine Header-Datei ist hier:Welcher Charakter ist das?

#ifndef Box_h 
#define Box_h 

class Box 
{ 
private: 
    int pSidelength; 
    char pBorder; 
    char pFill; 

public: 
    Box(int pSidelength, char pBorder = '#', char pFill = '*'); 
    int Sidelength; 
    char Border; 
    char Fill; 

    int Area(); 
    int Perimeter(); 
    int GetSize(); 
    int Grow(); 
    int Shrink(); 

    char SetBorder(); 
    char SetFill(); 

    void Draw(); 
    void Summary(); 
}; 
#endif Box_h 

Meine Quelle für die Klasse ist:

#include <iostream> 
#include "box.h" 
#include <iomanip> 

using namespace std; 

Box::Box(int pSidelength, char pBorder, char pFill) 
{ 
    if (pSidelength < 1) 
     { 
      Sidelength = 1; 
     } 
    else if (pSidelength > 39) 
     { 
      Sidelength = 39; 
     } 
    else 
    { 
     Sidelength = pSidelength; 
    } 
    if (pBorder != '#') 
    { 
     SetBorder(); 
    } 
    if (pFill != '*') 
    { 
     SetFill(); 
    } 
} 

int main(void) 
{ 
    Box  MyBox1(3,'#','*'); 
    Box  MyBox2(7, '^', '*'); 
    Box  MyBox3(10, '$', '%'); 
    MyBox1.Grow(); 
    MyBox2.Shrink(); 

    MyBox1.Summary(); 
    MyBox2.Summary(); 
    MyBox3.Summary(); 

    return 0; 
    } 

int Box::Shrink() 
{ 
    if (Sidelength == 1) 
     { 
      Sidelength = Sidelength; 
     } 
    else 
     { 
      Sidelength = Sidelength - 1; 
     } 
    return Sidelength; 
} 

int Box::Grow() 
{ 
    if (Sidelength == 39) 
     { 
      Sidelength = Sidelength; 
     } 
    else 
     { 
      Sidelength = Sidelength + 1; 
     } 
    return Sidelength; 
} 

char Box::SetFill() 
{ 
Fill = pFill; 
    return Fill; 
} 

char Box::SetBorder() 
{ 
    Border = pBorder; 
    return Border; 
} 

int Box::Area() 
{ 
    int area = (Sidelength)*(Sidelength); 
    return area; 
} 

int Box::Perimeter() 
{ 
    int perimeter = 4 * (Sidelength); 
    return perimeter; 
} 

int Box::GetSize() 
{ 
    int size = Sidelength; 
    return size; 
} 

void Box::Draw() 
{ 
int j = 1; 
int k = 1; 

if (Sidelength == 1 || Sidelength == 2) 
{ 
    for (int i = 1; i <= Sidelength; i++) 
    { 
     while (j <= Sidelength) 
     { 
      cout << setw(2) << Border; 
      j++; 
     } 
     j = 1; 
    } 
    cout << endl; 
} 
else 
{ 
    for (int i = 1; i <= Sidelength; i++) 
     { 
      if (i == 1 || i == Sidelength) 
      { 
       while (k <= Sidelength) 
       { 
        cout << setw(2) << Border; 
        k++; 
       } 
       cout << endl; 
       k = 1; 
      } 
      else 
      { 
       while (j <= Sidelength) 
       { 
        if (j == 1 || j == Sidelength) 
        { 
         cout << setw(2) << Border; 
        } 
        else 
        { 
         cout << setw(2) << Fill; 
        } 
        j++; 
       } 
       cout << endl; 
       j = 1; 
      } 
     } 
     cout << endl; 
    } 
} 

void Box::Summary() 
    { 
    cout << "The Sidelength of the box is: " << Box::GetSize() << endl; 
    cout << "The Perimeter of the box is: " << Box::Perimeter() << endl; 
    cout << "The Area of the box is: " << Box::Area() << endl; 
    Box::Draw(); 
    } 

Das Programm hat ein Standard-Zeichen mit Border assoziiert/Füllen, wie in der Header-Datei angegeben. Wenn er gestartet wird, erzeugt es das:

Terminal Output

Welche Charakter ist das, und alle Ideen auf, warum es in erster Linie erscheinen würde?

+0

Bitte geben Sie ein [MCVE] zB in Ihrem Code über 'Box :: SetBorder()' wird nie aufgerufen. –

+0

Ja ist es, im Konstruktor für die Box. Wenn der für Border/Fill übergebene Parameter kein Leerzeichen ist, ruft er SetBorder/SetFill auf, um den öffentlichen Variablen Border/Fill einen Wert zuzuweisen. –

+1

'SetBorder' wird aufgerufen, setzt aber nicht den Wert von' pBorder', aus dem Ihr gefälschter Charakter stammt. – RichieHindle

Antwort

1

Das Zeichen ist zufällig und könnte theoretisch jedes Mal anders sein, wenn Sie das Programm ausführen.

Es kommt von der pBorder Mitglied, die nie auf etwas eingestellt ist.

+0

Ich änderte das Standardzeichen in #/* für Rahmen und Füllung (bzw.) und bekomme trotzdem die gleiche Ausgabe. Um es noch einmal zu wiederholen: Beide haben jetzt einen Standardwert, der kein Leerzeichen ist und immer noch diesen Charakter erzeugt. –

+1

@GrahamWilson Was meinst du, Standardzeichen? Das 'pBorder'-Element Ihres Box-Objekts ist nirgendwo festgelegt. – melpomene

+1

pBorder/pFill werden in der Header-Datei auf #/* initialisiert. –

0

Sie wurden mit dem gleichen Namen Variablen verwechselt.

Box::Box(int pSidelength, char pBorder, char pFill) 
{ 
    if (pSidelength < 1) 
     { 
      Sidelength = 1; 
     } 
    else if (pSidelength > 39) 
     { 
      Sidelength = 39; 
     } 
    else 
    { 
     Sidelength = pSidelength; 
    } 
    if (pBorder != ' ') //Here pBorder has '*' but this is local 
//      pBorder to this Function 
    { 
     SetBorder(); 
    } 
    if (pFill != ' ') 
    { 
     SetFill(); 
    } 
} 

Und Wenn Sie SetBorder();

nennen Es macht Border als pBorder wie die in der Klasse deklariert wurde, die noch unintialized ist.

char Box::SetBorder() 
{ 
    Border = pBorder; //This pBorder is not initialized 
    return Border; 
} 

Lösung 1

Dont Verwendung Funktion

if (pBorder != ' ') 

{ 
    Border = pBorder; 
} 

Lösung 2

Pass pBorder

if (pBorder != ' ') 

{ 
    SetBorder(pBorder); 
} 
char Box::SetBorder(char pBorder) 
{ 
    Border = pBorder; //This pBorder is not initialized 
    return Border; 
} 
+0

Nein, das Lesen einer initialisierten Variablen ist immer noch falsch, auch wenn Sie sie danach festlegen. –