Hi!

For the past few months I've been self-learning C++ with the book "C++ Primer Plus" by Stephen Prata. After having gotten through chapter 7, I decided to check my progress by writing a little program, Baztro.

Baztro stands for Basic Astrology Tool. It asks you for birthdate(s) and will tell you what astrology sign you are, or how you get along with others, along with a simple menu system with a command-line user interface.

However, I did not create this to be a hardcore astrology software, but only to assess my coding progress. So, like the name has suggested, its astrology aspect is not very deep. The emphasis is on the code writing.

Because I'm new to the C++ scene, and I haven't been in any C++ class, I'd love to know if my coding practices are good and clear, whether the design is efficient, whether the code is easy to read. I'd love to know the opinions and critics from experienced coders. That's why I'm posting the code here, hoping others will give their voices and, heh, 'grade' me!

So, if you are interested, I've attached the source .cpp (I have yet to have a good grasp at multi-file source files, and after a few unsuccessful attempts I decided that I'll leave it as it is, one single .cpp. I try to make it as easy to read as possible ^^").
I've also packaged the files into archives (just to get a feel of distributing releases xD) and uploaded them into MediaFire, at http://preview.tinyurl.com/baztro. The Baztro_vx.x.x.x_publicXXXX.7z archives contain the binary, the source code, and the development log. The Baztro_v1.0_publicReleaseWithSRCs.7z archive contains all the above, along with the VC++ project folder. I would also like to know if the archives' structures are good enough and easy to understand, if anyone is willing =)

So, if you are interested (and are still reading lol), grade me!

Attachments
// **** BAZTRO - TDB'Z BASIC ASTROLOGY TOOL **** ==================================================
// A tool to obtain basic astrological information, created as a means to demonstrate the author's
// C++ skills, not as a professional Astrology tool.
// **** ==== **** =================================================================================


// **** ADDITIONAL INFORMATION **** ===============================================================
// Creation date: 05.03.11
// Version: 1.0.8.47
int bztVersion [4] = {1,0,8,47};

// Author: Tran Dat Ba		
// - Contact via email address tdba(dot)316(at)live(dot)com

// !!! LEGAL NOTICES !!!
// This work is placed in the PUBLIC DOMAIN, which means it belongs to the public. You are free and
// with no obligations to do with this program as you wish. The author created this program, yet
// holds no rights of ownership, guarantee, or the right to ask for royalty from personal, educational,
// or commercial uses.
// Yet there are copyrighted information taken from external sources, which, although posted on public
// media (the Internet), may not be available for commercialization. Consulting the owners is advised
// before any attempt of commercialization.
//
// External sources of copyrighted information including:
// - Keen.com, http://www.keen.com/documents/works/articles/astrology/the-quality-of-your-zodiac-element.asp, 
//   for information on Astrological Qualities and Elements;
// - AddisonPhillips.com, http://www.addisonphillips.com/ap/index.php?option=com_content&task=view&id=20&Itemid=1, 
//   for the copy of The Legend of the Zodiac;
// - DaniWeb.com, http://www.daniweb.com/code/snippet216489.html, for the CLEAR_CONSOLE code snippet.
// **** \ADDITIONAL INFORMATION **** ==============================================================


// *** INCLUDES *** ===============================================================================
#include <iostream>		// For Standard C++ console IO facilities
#include <string>		// for std::string
#include <Windows.h>	// For WinAPI facilities
// *** \INCLUDES *** ==============================================================================


// *** FUNCTION PROTOTYPES *** ====================================================================
int indicateSign(int birthDay, int birthMonth);
// Arguments: 2 ints, as birthDay-birthMonth
// Return: int, as the zodiac order number correspondent with birthDay-birthMonth

void zodiacInit();
// Function: Initializes zodiacSigns[], including each element's signQuality and signElement fields

void describeSign(int zodiacOrder);
// Argument: 1 int, as a zodiac order number
// Function: describes the zodiac with zodiacOrder order number

void analyzeCompatibility(int zodiacOrder1, int zodiacOrder2);
// Arguments: 2 ints, as two's zodiac order numbers
// Function: analyze two's astrological compatibility having the corespondent zodiac order numbers.

void bztConsole(std::string command);
// Argument: a std::string stating the desired console-alteration command
// Function: alter the console using hard-coded std::string commands standing for desired operations.

void miscTexts(std::string textRequest);
// Argument: a std::string stating the desired text
// Function: displays texts that is not of Baztro's main functionalities

void featureDispatch(std::string featureRequest);
// Argument: a std::string stating the desired feature
// Function: acts as a dispatcher, calling the appropriate function('s front-end)

void frontEnd_indicateSign();
// Function: the front-end for sign indication

void frontEnd_analyzeCompatibility();
// Function: the front-end for compatibility analysis.
// *** \FUNCTION PROTOTYPES *** ===================================================================

// *** NOTE ON DATA DESIGN *** ====================================================================
// Each sun sign's information is dependent on its order number and day range, which indicateSign()
// covers.
// The only information to set manually are Qualities and Elements, which zodiacInit() covers.
// *** \NOTE OF DATA DESIGN *** ===================================================================

// *** DATA STRUCTURES *** ========================================================================
// ** SIGN QUALITY ** ===================================================================
// The enumeration acting as symbolic constants for the sign Qualities, whereas:
//		CARDINAL = 0;
//		FIXED = 1;
//		MUTABLE = 2	;
enum QUALITY {CARDINAL_QUALITY, FIXED_QUALITY, MUTABLE_QUALITY};
// ** \SIGN QUALITY ** ==================================================================

// ** SIGN ELEMENT ** ===================================================================
// The enumeration acting as symbolic constants for the sign Elements, whereas:
//		FIRE = 0;
//		EARTH = 1;
//		AIR = 2;
//		WATER = 3;
enum ELEMENT {FIRE_ELEMENT, EARTH_ELEMENT, AIR_ELEMENT, WATER_ELEMENT};
// ** \SIGN ELEMENT ** ==================================================================

// ** zodiacSign STRUCTURE ** ===========================================================
// The structure to store information on Quality and Element for each sign (as an element
// in the zodiacSigns[] array.
struct zodiacSign
{
	QUALITY signQuality;	// Quality of the sign
	ELEMENT signElement; // Element of the sign
};
// ** \zodiacSign STRUCTURE ** ==========================================================
// *** \DATA STRUCTURES *** =======================================================================


// *** ZODIACAL INFORMATION *** ===================================================================
// ** SIGN NAMES ** =====================================================================
// The names of the signs, placed accordingly to each's order number.
const std::string SIGN_NAMES[13] = 
{
	"ZERO_HOLDER","ARIES", "TAURUS", "GEMINI", "CANCER", "LEO", "VIRGO",
	"LIBRA", "SCORPIO", "SAGGITARIUS", "CAPRICORN", "AQUARIUS", "PISCES"
};
// ** \SIGN NAMES ** ====================================================================

// ** QUALITY NAMES ** ==================================================================
// The elaborate names of the qualities
const std::string QUALITY_DESCRIPTIONS[3] = 
{
	"Cardinal", "Fixed", "Mutable"
};
// ** \QUALITY NAMES ** =================================================================

// ** ELEMENT NAMES ** ==================================================================
// The elaborate names of the elements
const std::string ELEMENT_DESCRIPTIONS[4] =
{
	"Fire", "Earth", "Air", "Water"
};
// ** \ELEMENT NAMES ** =================================================================

// ** SIGN INTROS ** ====================================================================
// Introductory lines to each sign
const std::string SIGN_INTROS[13] = 
{
	"ZERO_HOLDER",

	// ARIES
	"\nAries, The Ram, the First of the Cycle, the symbol of Birth.\n",

	// TAURUS
	"\nTaurus, The Bull, the Second of the Cycle.\n",

	// GEMINI
	"\nGemini, The Twins, the Third of the Cycle.\n",

	// CANCER
	"\nCancer, The Crab, the Fourth of the Cycle.\n",

	// LEO
	"\nLeo, The Lion, the Fifth of the Cycle.\n",

	// VIRGO
	"\nVirgo, The Virgin, the Sixth of the Cycle.\n",

	// LIBRA
	"\nLibra, The Scale, the Seventh of the Cycle.\n",

	// SCORPIO
	"\nScorpio, The Scorpion, the Eighth of the Cycle.\n",

	// SAGGITARIUS
	"\nSaggitarius, The Archer, The Ninth of the Cycle.\n",

	// CAPRICORN
	"\nCapricorn, The Seagoat, The Tenth of the Cycle.\n",

	// AQUARIUS
	"\nAquarius, The Water-bearer, the Eleventh of the Cycle.\n",

	// PISCES
	"\nPisces, The Fish, the Last of the Cycle, symbol of Death and Eternity.\n"
};
// ** \SIGN INTROS ** ===================================================================

// ** QUALITY - ELEMENT DETAILED DESCRIPTIONS ** ========================================
// Copyright (C) Keen.com
const std::string QUALITY_ELEMENT_DETAILED_DESCRIPTIONS[13] = 
{
	"ZERO_HOLDER",

	// ARIES
	"\nThis Cardinal Fire sign is known as \"The Spark\" - it uses the Cardinal\n"
	"quality of starting new things and the Fire element of spreading energy quite\n"
	"fast. This might be perceived as an avoidant personality, always off to new\n"
	"things.\n",

	// TAURUS
	"\nThis Fixed Earth Sign is known as \"The Stone\" - it relies on the Fixed\n"
	"quality of stability and the Earth element's natural pragmatism to stay\n"
	"consistent. Some might even call this stubborn.\n",

	// GEMINI
	"\nThis Mutable Air sign is known as \"The Cool Breeze\" - it embodies the\n"
	"Mutable quality inherent in a refreshing shift of consciousness. This burst\n"
	"of insight is the core nature of the Air element. Some might consider this a\n"
	"personality that is a lot of flash and no substance.\n",

	// CANCER
	"\nThis Cardinal Water sign is known as \"The Rain\" - it manifests the\n"
	"Cardinal quality's invigorating nature with the nurturing possibilities\n"
	"inherent in Water signs. Others could consider the drenching of an otherwise\n"
	"good day to be morel like it.\n",

	// LEO
	"\nThis Fixed Fire sign is known as \"The Bonfire\" - the Fixed quality's\n"
	"stationary nature enlightens all those that gather around the warmth of its\n"
	"Fire element. A difference of opinion with a Leo could lead one to believe\n"
	"that the lion never wants to leave its throne.\n",

	// VIRGO
	"\nThis Mutable Earth sign is often referred to as \"The Landslide\" - the\n"
	"Mutable quality's nature of change and motion make a real impact in the Earth\n"
	"element's material world. Another viewpoint could see this as a capitulation\n"
	"to the elements.\n",

	// LIBRA
	"\nThis Cardinal Air sign is best described as \"Exhaling\" - the Cardinal\n"
	"quality of putting new energy out into the world combines with the Air\n"
	"element's nature of shared consciousness. Others might insist that it is all\n"
	"talk and no action.\n",

	// SCORPIO
	"\nThis Fixed Water sign can only be thought of as \"Ice\"

Now i am curious about few things.
1. why astrology? (casual question, no need for answer)
2. why not "using namespace std;"
3. how come i am the first one to appreciate this?

its definitely a good program, and so are your coding habits.

Your comments are a bit excessive, I know this is something very personal but generally you'll want to have few comments that help understand the code, not comments that repeat what the code says. Don't take this too harshly though, I am really a comment-minimalist.

E.g.

#include <iostream>		// For Standard C++ console IO facilities
#include <string>		// for std::string
#include <Windows.h>	// For WinAPI facilities

Any somewhat-experienced C++ coder will know what these headers are for

int indicateSign(int birthDay, int birthMonth);
// Arguments: 2 ints, as birthDay-birthMonth
// Return: int, as the zodiac order number correspondent with birthDay-birthMonth

Commenting function input/output is ok, but I'd suggest to use a 'standard' format like Doxygen, so that you could also easily generate project documentation just by running Doxygen. And people reading your code, who are familiar with Doxygen will know exactly where to look.

For me, personally(!), the massive // *** <something> *** ==================== is very cluttering. When I am looking for e.g. the declaration of QUALITY I'll either use the IDE's built-in 'goto declaration' or use a search anyway.


Another example of excessive comments - "CLEAR_CONSOLE" is obvious enough.

bztConsole("CLEAR_CONSOLE"); // Clear the screen

You compare userCommand to both upper and lowercase strings, e.g.:

if ((userCommand == "E") || (userCommand == "e"))

Why not first make userCommand all lower-case and just do if( userCommand == "e" ) ?

I usually prefer to write if( "e" == userCommand ), as this will generate an error when you accidentally write if( "e" = userCommand ). if( userCommand = "e" ) will compile without warnings, but is mostly not what you want.

In analyzeCompatibility there are some huuuge if statements, a good exercise would be to abstract this into classes, overloading the operator==. I don't know how feasible this is because I don't know exactly what the comparisons are for, though.


Your bztConsole works with strings, while this works fine I think it would be easier to use enums. This would also get rid of the if( command == "<something>" ) as you could just use a switch( command ) { case SET_TITLE: break; }


And like vinayakagarg said, why not using namespace std? You can 'safely' use this in .cpp files, as long as you remember not to put it in header files.

Now i am curious about few things.
1. why astrology? (casual question, no need for answer)
2. why not "using namespace std;"
3. how come i am the first one to appreciate this?

its definitely a good program, and so are your coding habits.

1. It's because I've always been interested in astrology. It's mysterious, intriguing and miraculously correct if you use it, heh, correctly. Just something for my passion =D

2. It's a feeling, actually. I feel that using namespace std; is wasteful. I mean, I'm not using everything in the namespace, so why would I include the whole thing in? That seems... lazy, and perhaps 'uncontrolled', lol.

3. That depends. What is it you appreciate?

Your comments are a bit excessive, I know this is something very personal but generally you'll want to have few comments that help understand the code, not comments that repeat what the code says. Don't take this too harshly though, I am really a comment-minimalist.

E.g.

#include <iostream>		// For Standard C++ console IO facilities
#include <string>		// for std::string
#include <Windows.h>	// For WinAPI facilities

Any somewhat-experienced C++ coder will know what these headers are for

int indicateSign(int birthDay, int birthMonth);
// Arguments: 2 ints, as birthDay-birthMonth
// Return: int, as the zodiac order number correspondent with birthDay-birthMonth

Commenting function input/output is ok, but I'd suggest to use a 'standard' format like Doxygen, so that you could also easily generate project documentation just by running Doxygen. And people reading your code, who are familiar with Doxygen will know exactly where to look.

For me, personally(!), the massive // *** <something> *** ==================== is very cluttering. When I am looking for e.g. the declaration of QUALITY I'll either use the IDE's built-in 'goto declaration' or use a search anyway.


Another example of excessive comments - "CLEAR_CONSOLE" is obvious enough.

bztConsole("CLEAR_CONSOLE"); // Clear the screen

You compare userCommand to both upper and lowercase strings, e.g.:

if ((userCommand == "E") || (userCommand == "e"))

Why not first make userCommand all lower-case and just do if( userCommand == "e" ) ?

I usually prefer to write if( "e" == userCommand ), as this will generate an error when you accidentally write if( "e" = userCommand ). if( userCommand = "e" ) will compile without warnings, but is mostly not what you want.

In analyzeCompatibility there are some huuuge if statements, a good exercise would be to abstract this into classes, overloading the operator==. I don't know how feasible this is because I don't know exactly what the comparisons are for, though.


Your bztConsole works with strings, while this works fine I think it would be easier to use enums. This would also get rid of the if( command == "<something>" ) as you could just use a switch( command ) { case SET_TITLE: break; }


And like vinayakagarg said, why not using namespace std? You can 'safely' use this in .cpp files, as long as you remember not to put it in header files.

Ahh, I see. There are comments that are unnecessary. It wouldn't hurt to remove them, really. Also doing that will help make the code easier to read! Yeah, comments should be only used to annotate, not to restate the obvious. Thanks =D

That is the first time I've heard of Doxygen, and also the first time I've heard of automated documentation! Oh man, there is lots to things to learn xD Looking for more on that now :3

The // *** <something> *** =================== is my idea of breaking the code into blocks ^^" I think with all the excessive comments cut out, those lines wouldn't really be cluttering.

Those are nice pointing-outs, really! lowercase-ize the userCommand, use switch case break, use enum as symbolic constants for bztConsole, and re-order the sides of =='s. I'll do those!
About classes, well, I've yet to reach that fortress, so that is not an available opton for me xD

Thanks!

Edited 5 Years Ago by tdba.316: n/a

This is the revised version of the program. I hope this will help if anyone happens to have interest in this thread =) The comments are trimmed out, the std::string commands replaced by handy enums <3, the easy-to-follow switch-case... Check them out if you are interested!

I will now stop developing Baztro. It had been fun ^0^, produced a little handy and stable program which I am content with, and I am ready to move on =D

I attached the latest cpp in this post.

If anyone is interested, (s)he can download the latest package at http://tinyurl.com/baztro or http://www.mediafire.com/?827paotar1faw. (S)he can also download the GoldenPackage which contains EVERYTHING Baztro xD

Thanks for the two who took time to read my work and commented!

Attachments
// **** BAZTRO - TDB'Z BASIC ASTROLOGY TOOL **** ==================================================
// A tool to obtain basic astrological information, created as a means to demonstrate the author's
// C++ skills, not as a professional Astrology tool.
// **** ==== **** =================================================================================


// **** ADDITIONAL INFORMATION **** ===============================================================
// Creation date: 05.03.11
// Finish date: 12.04.11
// Version: 1.1.9.53
int bztVersion [4] = {1,1,9,53};

// Author: Tran Dat Ba		
// - Contact via email address tdba(dot)316(at)live(dot)com

// !!! LEGAL NOTICES !!!
// This work is placed in the PUBLIC DOMAIN, which means it belongs to the public. You are free and
// with no obligations to do with this program as you wish. The author created this program, yet
// holds no rights of ownership, guarantee, or the right to ask for royalty from personal, educational,
// or commercial uses.
// Yet there are copyrighted information taken from external sources, which, although posted on public
// media (the Internet), may not be available for commercialization. Consulting the owners is advised
// before any attempt of commercialization.
//
// External sources of copyrighted information including:
// - Keen.com, http://www.keen.com/documents/works/articles/astrology/the-quality-of-your-zodiac-element.asp, 
//   for information on Astrological Qualities and Elements;
// - AddisonPhillips.com, http://www.addisonphillips.com/ap/index.php?option=com_content&task=view&id=20&Itemid=1, 
//   for the copy of The Legend of the Zodiac;
// - DaniWeb.com, http://www.daniweb.com/code/snippet216489.html, for the screen clearing code snippet.
// **** \ADDITIONAL INFORMATION **** ==============================================================


// *** INCLUDES *** ===============================================================================
#include <iostream>		
#include <string>
#include <cctype>
#include <Windows.h>	// Used only to enable the DaniWeb code snippet of screen clearing
// *** \INCLUDES *** ==============================================================================


// *** INTERNAL ENUMERATIONS *** ==================================================================
// Use enums to symbolizes constants used in functions, instead of having to use statements like
// bztConsole("MAIN_MENU"); with bztConsole(std::string) - error prone and inconvinient.
enum CONSOLE_COMMAND {CLEAR_SCREEN, SET_TITLE, MAIN_MENU, FLUSH_INPUT, INPUT_PROMPT, EXIT_INFORM};
enum MISC_TEXTS {THIRTEENTH_SIGN, COMPAT_LOGIC, ABOUT, NOT_JUST_SUN};

// *** \INTERNAL ENUMERATIONS *** =================================================================


// *** FUNCTION PROTOTYPES *** ====================================================================
int indicateSign(int birthDay, int birthMonth);
void zodiacInit();
void describeSign(int zodiacOrder);
void analyzeCompatibility(int zodiacOrder1, int zodiacOrder2);
void bztConsole(CONSOLE_COMMAND command);
void miscTexts(MISC_TEXTS textSubject);
void featureDispatch(char featureRequest);
void frontEnd_indicateSign();
void frontEnd_analyzeCompatibility();
// *** \FUNCTION PROTOTYPES *** ===================================================================


// *** NOTE ON DATA DESIGN *** ====================================================================
// Each sun sign's information is dependent on its order number and day range, which indicateSign()
// covers.
// The only information to set manually are Qualities and Elements, which zodiacInit() covers.
// *** \NOTE OF DATA DESIGN *** ===================================================================


// *** DATA STRUCTURES *** ========================================================================
// ** SIGN QUALITY ** ===================================================================
// The enumeration acting as symbolic constants for the sign Qualities, whereas:
//		CARDINAL = 0;
//		FIXED = 1;
//		MUTABLE = 2	;
enum QUALITY {CARDINAL_QUALITY, FIXED_QUALITY, MUTABLE_QUALITY};
// ** \SIGN QUALITY ** ==================================================================

// ** SIGN ELEMENT ** ===================================================================
// The enumeration acting as symbolic constants for the sign Elements, whereas:
//		FIRE = 0;
//		EARTH = 1;
//		AIR = 2;
//		WATER = 3;
enum ELEMENT {FIRE_ELEMENT, EARTH_ELEMENT, AIR_ELEMENT, WATER_ELEMENT};
// ** \SIGN ELEMENT ** ==================================================================

// ** zodiacSign STRUCTURE ** ===========================================================
// The structure to store information on Quality and Element for each sign (as an element
// in the zodiacSigns[] array.
struct zodiacSign
{
	QUALITY signQuality;	// Quality of the sign
	ELEMENT signElement; // Element of the sign
};
// ** \zodiacSign STRUCTURE ** ==========================================================
// *** \DATA STRUCTURES *** =======================================================================


// *** ZODIACAL INFORMATION *** ===================================================================
// ** SIGN NAMES ** =====================================================================
// The names of the signs, placed accordingly to each's order number.
const std::string SIGN_NAMES[13] = 
{
	"ZERO_HOLDER","ARIES", "TAURUS", "GEMINI", "CANCER", "LEO", "VIRGO",
	"LIBRA", "SCORPIO", "SAGGITARIUS", "CAPRICORN", "AQUARIUS", "PISCES"
};
// ** \SIGN NAMES ** ====================================================================

// ** QUALITY NAMES ** ==================================================================
// The elaborate names of the qualities
const std::string QUALITY_DESCRIPTIONS[3] = 
{
	"Cardinal", "Fixed", "Mutable"
};
// ** \QUALITY NAMES ** =================================================================

// ** ELEMENT NAMES ** ==================================================================
// The elaborate names of the elements
const std::string ELEMENT_DESCRIPTIONS[4] =
{
	"Fire", "Earth", "Air", "Water"
};
// ** \ELEMENT NAMES ** =================================================================

// ** SIGN INTROS ** ====================================================================
// Introductory lines to each sign
const std::string SIGN_INTROS[13] = 
{
	"ZERO_HOLDER",

	// ARIES
	"\nAries, The Ram, the First of the Cycle, the symbol of Birth.\n",

	// TAURUS
	"\nTaurus, The Bull, the Second of the Cycle.\n",

	// GEMINI
	"\nGemini, The Twins, the Third of the Cycle.\n",

	// CANCER
	"\nCancer, The Crab, the Fourth of the Cycle.\n",

	// LEO
	"\nLeo, The Lion, the Fifth of the Cycle.\n",

	// VIRGO
	"\nVirgo, The Virgin, the Sixth of the Cycle.\n",

	// LIBRA
	"\nLibra, The Scale, the Seventh of the Cycle.\n",

	// SCORPIO
	"\nScorpio, The Scorpion, the Eighth of the Cycle.\n",

	// SAGGITARIUS
	"\nSaggitarius, The Archer, The Ninth of the Cycle.\n",

	// CAPRICORN
	"\nCapricorn, The Seagoat, The Tenth of the Cycle.\n",

	// AQUARIUS
	"\nAquarius, The Water-bearer, the Eleventh of the Cycle.\n",

	// PISCES
	"\nPisces, The Fish, the Last of the Cycle, symbol of Death and Eternity.\n"
};
// ** \SIGN INTROS ** ===================================================================

// ** QUALITY - ELEMENT DETAILED DESCRIPTIONS ** ========================================
// Copyright (C) Keen.com
const std::string QUALITY_ELEMENT_DETAILED_DESCRIPTIONS[13] = 
{
	"ZERO_HOLDER",

	// ARIES
	"\nThis Cardinal Fire sign is known as \"The Spark\" - it uses the Cardinal\n"
	"quality of starting new things and the Fire element of spreading energy quite\n"
	"fast. This might be perceived as an avoidant personality, always off to new\n"
	"things.\n",

	// TAURUS
	"\nThis Fixed Earth Sign is known as \"The Stone\" - it relies on the Fixed\n"
	"quality of stability and the Earth element's natural pragmatism to stay\n"
	"consistent. Some might even call this stubborn.\n",

	// GEMINI
	"\nThis Mutable Air sign is known as \"The Cool Breeze\" - it embodies the\n"
	"Mutable quality inherent in a refreshing shift of consciousness. This burst\n"
	"of insight is the core nature of the Air element. Some might consider this a\n"
	"personality that is a lot of flash and no substance.\n",

	// CANCER
	"\nThis Cardinal Water sign is known as \"The Rain\" - it manifests the\n"
	"Cardinal quality's invigorating nature with the nurturing possibilities\n"
	"inherent in Water signs. Others could consider the drenching of an otherwise\n"
	"good day to be morel like it.\n",

	// LEO
	"\nThis Fixed Fire sign is known as \"The Bonfire\" - the Fixed quality's\n"
	"stationary nature enlightens all those that gather around the warmth of its\n"
	"Fire element. A difference of opinion with a Leo could lead one to believe\n"
	"that the lion never wants to leave its throne.\n",

	// VIRGO
	"\nThis Mutable Earth sign is often referred to as \"The Landslide\" - the\n"
	"Mutable quality's nature of change and motion make a real impact in the Earth\n"
	"element's material world. Another viewpoint could see this as a capitulation\n"
	"to the elements.\n",

	// LIBRA
	"\nThis Cardinal Air sign is best described as \"Exhaling\" - the Cardinal\n"
	"quality of putting new energy out into the world combines with the Air\n"
	"element's nature of shared consciousness. Others might insist that it is all\n"
	"talk and no action.\n",

	// SCORPIO
	"\nThis Fixed Water sign can only be thought of as \"Ice\" - The Fixed quality\n"
	"of a certain position is manifested by the solid nature of the Water element.\n"
	"Others will, of course, point out that this very consistency can be... oh,\n"
	"so cold.\n",

	// SAGGITARIUS
	"\nThis Mutable Fire sign is understandably referred to as \"The Wildfire\" -\n"
	"the Mutable quality of raging unhindered energy manifests in the Fire element\n"
	"as a sudden engulfing sensation. Others might note that the unbridled
This question has already been answered. Start a new discussion instead.