tags:

views:

91

answers:

2

I have tried removing various parts and building, but nothing makes the lnk2019 error go away, or even produces any normal errors.

Everything is in the one file at the moment (it won't be later when it is finished). The program has three lists of words and makes a jargon phrase out of them, and you are supposed to be able to add words, remove words, view the lists, restore defaults, save changes to file, and load changes from file.

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

using namespace std;

const int maxlist = 20;

string adj1[maxlist], adj2[maxlist], noun[maxlist];

void defaultlist(int list)
{
 if(list == 1)
 {
  adj1[0] = "green";
  adj1[1] = "red";
  adj1[2] = "yellow";
  adj1[3] = "blue";
  adj1[4] = "purple";

  int i = 5;
  while(i != maxlist)
  {
   adj1[i] = "";
   i = i + 1;
  }
 }

 if(list == 2)
 {
  adj2[0] = "shiny";
  adj2[1] = "hard";
  adj2[2] = "soft";
  adj2[3] = "spiky";
  adj2[4] = "furry";

  int i = 5;
  while(i != maxlist)
  {
   adj2[i] = "";
   i = i + 1;
  }
 }

 if(list == 3)
 {
  noun[0] = "cat";
  noun[1] = "dog";
  noun[2] = "desk";
  noun[3] = "chair";
  noun[4] = "door";

  int i = 5;
  while(i != maxlist)
  {
   noun[i] = "";
   i = i + 1;
  }
 }
return;
}


void printlist(int list)
{
 if(list == 1)
 {
  int i = 0;
  while(!(i == maxlist))
  {
   cout << adj1[i] << endl;
   i = i + 1;
  }
 }

 if(list == 2)
 {
  int i = 0;
  while(!(i == maxlist))
  {
   cout << adj2[i] << endl;
   i = i + 1;
  }
 }

 if(list == 3)
 {
  int i = 0;
  while(!(i == maxlist))
  {
   cout << noun[i] << endl;
   i = i + 1;
  }
 }
return;
}

string makephrase()
{
 int num1 = rand()%maxlist;
 int num2 = rand()%maxlist;
 int num3 = rand()%maxlist;
 int num4 = rand()%1;

 string word1, word2, word3;

 if(num4 = 0)
 {
  word1 = adj1[num1];
  word2 = adj2[num2];
 }
 else
 {
  word1 = adj2[num1];
  word2 = adj1[num2];
 }

 word3 = noun[num3];

return word1 + " ," + word2 + " " + word3;
}

string addword(string word, int list)
{
 string result;

 if(list == 1)
 {
  int i = 0;
  while(!(adj1[i] == "" || i == maxlist))
  {
   i = i + 1;
  }

  if(i == maxlist) result = "List is full. Please try again.";
  if(adj1[i] == "")
  {
   adj1[i] = word;
   result = "Word was entered successfully.";
  }
 }

 if(list == 2)
 {
  int i = 0;
  while(!(adj2[i] == "" || i == maxlist))
  {
   i = i + 1;
  }

  if(i == maxlist) result = "List is full. Please try again.";
  if(adj2[i] == "")
  {
   adj2[i] = word;
   result = "Word was entered successfully.";
  }
 } 

 if(list == 3)
 {
  int i = 0;
  while(!(noun[i] == "" || i == maxlist))
  {
   i = i + 1;
  }

  if(i == maxlist) result = "List is full. Please try again.";
  if(noun[i] == "")
  {
   noun[i] = word;
   result = "Word was entered successfully.";
  }
 }
return result;
}
string removeword(string word, int list)
{
 string result;

 if(list == 1)
 {
  int i = 0;
  while(!(adj1[i] == word || i == maxlist))
  {
   i = i + 1;
  }

  if(i == maxlist) result = "Word is not on the list. Please try again.";
  if(adj1[i] == word)
  {
   adj1[i] = "";
   result = "Word was removed successfully.";
  }
 }

  if(list == 2)
 {
  int i = 0;
  while(!(adj2[i] == word || i == maxlist))
  {
   i = i + 1;
  }

  if(i == maxlist) result = "Word is not on the list. Please try again.";
  if(adj2[i] == word)
  {
   adj2[i] = "";
   result = "Word was removed successfully.";
  }
 }

 if(list == 3)
 {
  int i = 0;
  while(!(noun[i] == word || i == maxlist))
  {
   i = i + 1;
  }

  if(i == maxlist) result = "Word is not on the list. Please try again.";
  if(noun[i] == word)
  {
   noun[i] = "";
   result = "Word was removed successfully.";
  }
 }

return result;
}



/////////////////////////////main///////////////////////////////////


int main()
{
 string mainselection;
 string makeselection;
 string phrase;

 defaultlist(1);
 defaultlist(2);
 defaultlist(3);

 cout << "This program generates jargon phrases made of two adjectives and one noun,";
 cout << " on three lists. Each list may contain a maximum of " << maxlist << "elements.";
 cout << " Please choose from the following menu by typing the appropriate number ";
 cout << "and pressing enter." << endl;

 cout << endl;

 cout << "1. Make a jargon phrase." << endl;
 cout << "2. View a list." << endl;
 cout << "3. Add a word to a list." << endl;
 cout << "4. Remove a word from a list." << endl;
 cout << "5. Restore default lists." << endl;
 cout << "More options coming soon!." << endl;

 cin >> mainselection

 if(mainselection == 1)
 {
  phrase = makephrase();

  cout << "Your phrase is " << phrase << "." << endl;
  cout << "To make another phrase, press 1. To go back to the main menu,";
  cout << " press 2. To exit the program, press 3." << endl;

  cin >> makeselection;

  while(!(makeselection == "1" || makeselection == "2" || makeselection == "3"))
  {
   cout << "You have entered an invalid selection. Please try again." << endl;
   cin >> makeselection;
  }

  while(makeselection == "1")
  {
   phrase = makephrase();
   cout << "To make another phrase, press 1. To go back to the main menu,";
   cout << " press 2. To exit the program, press 3." << endl;
  }

  if(makeselection == "2") main();
  if(makeselection == "3") return 0;
 }

return 0;
}

//Rest of the options coming soon!
+1  A: 

The problem according to gcc is that you haven't declared the correct include for the rand() function - I added #include <cstdlib> and the problem disappeared.

I should also add that in your main function you've done this:

cin >> mainselection;
if ( mainselection == 1 )

which doesn't work. Mainselection is a string and can only be compared using the class compare method, like so:

cin >> mainselection;
if ( mainselection.compare("1") )

that'll return 0 if they're equal.

Also, if you use std::vector you can have dynamically sized arrays very easily in C++, you just keep pushing items onto the back of the vector. Will mean you don't need to hard-code the limits.

Ninefingers
You can use == to compare strings in C++. But you can't compare a string to an int. So 'if ( mainselection == "1" )' would work.
mkj
+1  A: 

Some suggestions to help you:

  • Line 107: if(num4 = 0) (assignment operator) should be if(num4 == 0) (equal to operator).
  • Line 260: You're missing a semicolon after cin >> mainselection.
  • Line 261: if(mainselection == 1) is illegal, mainselection being a std::string.
  • Line 284: if(makeselection == "2") main(); You're not allowed to call the main() function recursively in C++.
Bertrand Marron
I softened your answer slightly. The OP used a compiler too. Not all compiler messages initially obvious, sometimes even to experienced developers.
Ninefingers
It's fine, but lnk2019 is a linker error and this code doesn't compile.
Bertrand Marron