Binary Tree, function isn't reading in

I've got this program thats supose to translate morse code into the message.
I am having a problem with reading in. If I remove the "read functions" and place the code into main, it reads just fine.

Another thing I'd like advice on, is how to edit the code to make it cleaner. I previously did a Link-List code where I made a struct and a class, but this code I can't get it to function in the same context as for example,
1
2
3
4
5
6
7
class Tree
{
   tree();
};

Tree::tree()
{}


I tried to make it work in that aspect, but with the binary tree I have to make the class one huge function thats all messy.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>

using namespace std;

ifstream key("MorseKey.in");
ifstream cde("MorseCode.in");
ofstream out("Morse.out");

void header();
void footer();
void ReadKey();
void ReadCode();

//functions
class tree
{
private:
   struct node
  {
    char ch;
    string code;
    node *left;
    node *right;
  };

    newNode()
 {
    node *temp;
    temp->left = nullptr;
    temp->right = nullptr;
    temp->ch = 0;
 }
 node *root;

public:
  tree()
   {
       root = nullptr;
   }

   void insert(node *&current, string code, char ch)  //inserting the code into the tree
   {
       if(current == nullptr)
       {
           current = new node();
       }

       if(code.size() == 0)
       {
           current->ch = ch;
           current->code=code;
       }

       else
       {
           if(code[0] == '.')
           {
               insert(current->left, code.substr(1), ch);
           }

           else
           {
               insert(current->right, code.substr(1), ch);
           }
       }
   }

   char search(node *temp, string str)
   {
       if(temp->ch != 0 && str.size() == 0)
       {
           return temp->ch;
       }
       else
       {
           if(str[0] == '.')  //if there is a dot search left else search right
           {
               return search(temp->left, str.substr(1));
           }
           else
           {
               return search(temp->right, str.substr(1));
           }
       }
   }

   void insert(string code, char ch)
   {
       insert(root, code, ch);
   };

   char search(string code)
   {
       return search(root, code);
   }

   //prints the list in preorder by dots and dashes
   void printPreOrder()
   {
       printPreOrder(root);
   };

   void printPreOrder(node *root)
   {
       if (root==nullptr)
       {
           return;
       }

       else
       {
           out<<root->ch<<" ";
           printPreOrder(root->left);
           printPreOrder(root->right);
       }
   }

   //prints the list in order by dots and dashes
   void printInOrder()
  {
    printInOrder(root);
  };

    void printInOrder(node *root)
    {

     if(root==nullptr)
     {
         return;
     }
     else
     {
         printInOrder(root->left);
         out<<root->ch<<" ";
         printInOrder(root->right);
     }
    }

    void printPostOrder()
    {
        printPostOrder(root);
    };

    //prints the list in post order by dots and dashes
    void printPostOrder(node *root)
    {
        if (root==nullptr)
        {
            return;
        }

        else
        {
            printPostOrder(root->left);
            printPostOrder(root->right);
            out<<root->ch<<" ";
        }
    }

};


void header( )  //the top header for the program
{
    out << "***************************************\n"
        << "Output for Morse Code Program\n"
        << "***************************************\n\n";
}

void footer()  //the footer for the message header
{
    out << "\n\n************************************************************"
        << "******************************************************\n"
        << setw(60) << "Translated Message\n";
}
void ReadCode()
{
    string morse_text,code,message;
    char ch;
    tree t;
    int count = 0;

    //reading in the message
    getline(cde, morse_text);
    for(int i = 0; i < morse_text.size(); ++i)
    {
        ch = morse_text[i];
        if(ch == ' ')
        {
            if(code != "")
            {
                 message=message + t.search(code);
                code = "";
                ++count;
            }
                if(count == 3)  //3 blanks equals a word
                {
                   message=message + " ";
                }
        }
        else if(ch == '.' || ch == '-')
        {
            code=code + ch;
            count = 0;
        }
           else
           {
             out<<ch<<endl;
           }
    }
}

void ReadKey()
{
    char ch;
    tree t;
    string code;
     //reading in the letter and the morse code associated with it
       while(key)
       {
           key>>ch>>code;

           //inserting it into the binary tree
           t.insert(code, ch);
       }
}

int main( )
{
    string code, message;
    tree t;
  if(!key)
  {
      cout<<"File [MorseKey.in] did not open. Please try again.";
      return 0;
  }

  if(!cde)
  {
      cout<<"File [MorseCode.in] did not open. Please try again.";
      return 0;
  }
   header();
   ReadKey();

        //printing the letters in preorder by dots and dashes
       out<<"Letters in preorder"<<endl;
       t.printPreOrder();
       out<<endl;

       //printing the letters in order by dots and dashes
       out<<"\nLetters in order"<<endl;
       t.printInOrder();
       out<<endl;

       //printing the letters in postorder by dots and dashes
       out<<"\nLetters in postorder"<<endl;
       t.printPostOrder();

       code = "";
       message = "";
   ReadCode();

       //printing out the translated message
        footer();
        out<<message<<endl;

key.close();
cde.close();
out.close();
return 0;
}
1
2
void ReadKey();
void ReadCode();

your functions don't receive any parameter and don't return any value, ¿how do you expect that to work?

also, there is no good reason for `key', `cde' (awful name) and `out' to be global
ne555, I have created many of functions that don't pass any parameters into a read function that work flawlessly.

This code isn't complete, I have them global for the time being until I have finalized my program.
totally unhelpful fun: this one hard codes the tree into an array rather than fool with the tree mechanics.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

struct mctx
{
  char c;
  unsigned char dot;
  unsigned char dash;	
};

class mc
{
	
  mctx mct[50]; //left room for numbers later.   	
  string tbl[256];
  public:	
  mc()
  {
	char init[] = "\0etianmsurwdkgohvf\0l\0pjbxcyzq";
	for(int dx = 0; dx < 30; dx++)
	{
	  mct[dx].c = init[dx];	
	  mct[dx].dot = (dx*2)+1;
	  mct[dx].dash = (dx*2)+2;
	}
	  tbl['e'] = ". ";   tbl['t'] = "- ";  tbl['i'] = ".. ";  tbl['a'] = ".- ";
	  tbl['n'] = "-. ";  tbl['m'] = "-- ";  tbl['s'] = "... ";  tbl['u'] = "..- ";
	  tbl['r'] = ".-. ";  tbl['w'] = ".-- ";  tbl['d'] = "-.. ";  tbl['k'] = "-.- ";
	  tbl['g'] = "--. ";  tbl['o'] = "--- ";  tbl['h'] = ".... ";  tbl['v'] = "...- ";
	  tbl['f'] = "..-. ";  tbl['l'] = ".-.. ";  tbl['p'] = ".--. ";  tbl['j'] = ".--- ";
	  tbl['b'] = "-... ";  tbl['x'] = "-..- ";  tbl['c'] = "-.-. ";  tbl['y'] = "-.-- ";
	  tbl['z'] = "--.. ";  tbl['q'] = "--.- ";
	}
		
  string txt2code(string in)
  {
	string out;
    for(int i = 0; i < in.length(); i++)
     out += tbl[in[i]];
    return out; 
  }  
  string code2txt(string in)
  {
	in += ' '; 
    string out = "";
   for(int i=0, dx = 0; dx < in.length(); dx++)
	{      
		switch(in[dx])
		{
		case '.': 
		i = mct[i].dot;
		break;
		case '-': 
		i = mct[i].dash;
		break;
		case ' ': 		
		out += mct[i].c;
		i = 0;
		break;
        default: //reset stream
         i = 0; 		
		}	
	}
    return out;	
  }
};
Last edited on
Thank you jonnin, but i'm not allowed to use arrays, must be pointers.

That is some useful information Duthomhas
this one hard codes the tree into an array

I did the same thing last month:
http://www.cplusplus.com/forum/beginner/268622/#msg1155805
> I have created many of functions that don't pass any parameters into a read
> function that work flawlessly.
that doesn't seem to be the case here
go read those functions and figure out the difference, then


> I have them global for the time being until I have finalized my program.
¿what for?
if you plan them to be passed as parameters, ¿what do you gain making them global now?
I have altered the code and it returns 0, but the output isn't correct. It isn't decoding the message, it just prints the morse code. I added a function call to main for function Message, but it returns Process returned -1073741819 (0xC0000005). I deleted that in this code so it does at least return 0.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>

using namespace std;

ofstream out("Morse.out");

struct node
{
	char letter;
    string code;
    node *lchild;
    node *rchild;
};

//Prototypes
void header();
void footer();
void Insert(node*&, string, char);
char Search(node*,string);
void PrintPreOrder(node*);
void PrintInOrder(node*);
void PrintPostOrder(node*);
bool ReadKey(node*&);
bool ReadCode(string&);

//inserting the code into the tree
void Insert(node *&root, string code, char letter)
{
    if(root == nullptr)
    {
		root = new node();
		root->letter = letter;
        root->code = code;
        root->lchild = nullptr;
        root->rchild = nullptr;
    }

    else
    {
        node* child = root;
        node* parent = nullptr;
        node* temp = nullptr;

        while(child)
        {
            parent = child;
            if(letter < child->letter)
                child = child->lchild;
            else
                child = child->rchild;
        }

        temp = new node;
        temp->letter = letter;
        temp->code = code;
        temp->lchild = nullptr;
        temp->rchild = nullptr;

        if(letter < parent->letter)
            parent->lchild = temp;
        else
            parent->rchild = temp;
    }

}

void Message(node* current, string decode) //I believe the issue is within this function
{
    char ch;
    string message,code;
    int count=0;
     for(int i = 0; i < decode.size(); ++i)
       {
           ch = decode[i];
           if(ch == ' ')
           {
               if(code != "")
               message = message + Search(current,code);
               code = "";
               ++count;

               if(count == 3)  //3 blanks equals a word
               {
                   message = message + " ";
               }
           }
           else if(ch == '.' || ch == '-')
           {
               code=code + ch;
               count = 0;
           }
           else
           {
             out << ch << endl;
           }
       }
}

char Search(node *temp, string str)
{
    if(temp->letter != 0 && str.size() == 0)
    {
        return temp->letter;
    }
    else
    {
        //if there is a dot search lchild else search rchild
        if(str[0] == '.')
        {
            return Search(temp->lchild, str.substr(1));
        }
        else
        {
            return Search(temp->rchild, str.substr(1));
        }
    }
}

   //prints the list in preorder by dots and dashes
void PrintPreOrder(node *root)
{
    if (root == nullptr)
    {
        return;
    }
    else
    {
        out << root->letter << " ";
        PrintPreOrder(root->lchild);
        PrintPreOrder(root->rchild);
    }
}

//prints the list in order by dots and dashes
void PrintInOrder(node *root)
{
    if(root==nullptr)
    {
        return;
    }
    else
    {
        PrintInOrder(root->lchild);
        out << root->letter << " ";
        PrintInOrder(root->rchild);
    }
}

//prints the list in post order by dots and dashes
void PrintPostOrder(node *root)
{
    if (root==nullptr)
    {
        return;
    }
    else
    {
        PrintPostOrder(root->lchild);
        PrintPostOrder(root->rchild);
        out << root->letter << " ";
    }
}

void header( )  //the top header for the program
{
    out << "***************************************\n"
        << "Output for Morse Code Program\n"
        << "***************************************\n\n";
}

void footer()  //the footer for the message header
{
    out << "\n\n************************************************************"
        << "******************************************************\n"
        << setw(60) << "Translated Message\n";
}
bool ReadCode(string& message)
{
    ifstream code("MorseCode.in");
	if(!code)
	{
		cout<<"Error opening MorseCode.in";
		return 0;
	}

    char letter;
    while(code.get(letter))
        message += letter;

    code.close();
    return 1;
}

bool ReadKey(node*& root)
{
    ifstream key("MorseKey.in");
	if(!key)
	{
		cout<<"Error opening MorseKey.in";
		return 0;
	}

	string MorseCode;
    char letter;

    while(key >> letter >> MorseCode)
        Insert(root,MorseCode,letter);

    key.close();
    return 1;
}

int main( )
{
	node* root = nullptr;

    string code, message;

    header();
    ReadKey(root);

    //printing the letters in preorder by dots and dashes
    out<<"Letters in preorder"<<endl;
    PrintPreOrder(root);
    out<<endl;

    //printing the letters in order by dots and dashes
    out<<"\nLetters in order"<<endl;
    PrintInOrder(root);
    out<<endl;

    //printing the letters in postorder by dots and dashes
    out<<"\nLetters in postorder"<<endl;
    PrintPostOrder(root);

    ReadCode(message);

    //printing out the translated message
    footer();
    out<<message<<endl;


out.close();
return 0;
}

OUTPUT:
***************************************
Output for Morse Code Program
***************************************

Letters in preorder
a 1 0 2 3 4 5 6 7 8 9 b c d e f g h i j k l m n o p q r s t u v w x y z 

Letters in order
0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z 

Letters in postorder
0 9 8 7 6 5 4 3 2 1 z y x w v u t s r q p o n m l k j i h g f e d c b a 
Last edited on
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

******************************************************************************************************************
                                         Translated Message
- .- -..-   .-..
 . -.-. --- .-. -.. ...   ..-. --- .-.   . .- -.-. ....   .--. ..- .-. -.-. .... .- ... .   .- -. -..   ... .- 
.-.. .   .. ..-.   -.-- --- ..-   -... ..- -.--   ...-- ----- -----   ... .... .- .-. . ...   --- ..-.   .. 
-... --   .---- ----- -----   ... .... .- .-. . ...   .- -   .-   - .. -- .   .-- .   .-- --- ..- .-.. -..  
 -.- . . .--.   ...--   .-. . -.-. --- .-. -.. ...   .. -. ... - . .- -..   --- ..-.   .--- ..- ... -   --- -. .   . .- -.-. ....   .---- ----- -----   ... .... .- .-. .   .--. ..- .-. -.-. .... .- ... .   .. ...   -.-. .-
 .-.. .-.. . -..   .-   - .- -..-   .-.. --- -   .- --. .- .. -.   - .... .   ..- - .. .-.. .. - -.--   ---
..-.   - .- -..-   .-.. --- -   .- -.-. -.-. --- ..- -. - .. -. --.   -... . -.-. --- -- . ...   .- .--. .--.
 .- .-. . -. -   .- -   - .- -..-   - .. -- .   ... ..- .--. .--. --- ... .   -.-- --- ..-   -... --- ..- --. 
.... -   - .... --- ... .   ...--   .---- ----- -----   ... .... .- .-. .   .-.. --- - ...   .- -   - .... .
   -.-. --- ... -   --- ..-.   .---- ..... ----- ----- -----   ..-. --- .-.   - .... .   ..-. .. .-. ... -
   .---- ----- ----- ----- -----   ..-. --- .-.   - .... .   ... . -.-. --- -. -..   .- -. -..   ..... ----- ----- -----   ..-. --- .-.   - .... .   - .... .. .-. -..   .. ..-.   -.-- --- ..-   -. --- .--   ...
 . .-..
 .-..   .---- ----- -----   ... .... .- .-. . ...   --- ..-.   .. -... --   ..-. --- .-.   --... ..... -----
 -----   -.-- --- ..-   -.-. .- -.   .--. .. -.-. -.-   .-- .... .. -.-. ....   .-.. --- -   - ---   ... . 
.-.. .-..   -... .- ... . -..   --- -.   -.-- --- ..- .-.   - .- -..-   -. . . -.. ...   --. . -. . .-. .- - ..
 -. --.   .-   .-.. --- ... ...   --- ..-.   --... ..... ----- -----   -.. --- .-.. .-.. .- .-. ...   .-   
.-.. --- ... ...   --- ..-.   ..--- ..... ----- -----   -.. --- .-.. .-.. .- .-. ...   --- .-.   .-   --. .-
 .. -.   --- ..-.   ..--- ..... ----- -----   -.. --- .-.. .-.. .- .-. ...   -- .- -. -.--   .. -. ...- . ... 
- --- .-. ...   -.-. .... --- --- ... .   - ---   .- .-.. .-- .- -.-- ...   ... . .-.. .-..   - .... .   -- 
--- ... -   . -..- .--. . -. ... .. ...- .   .-.. --- -   ..-. .. .-. ... -   - .- -.- .. -. --.   .-.. --- ...
 ... . ...   .- ...   ... --- --- -.   .- ...   .--. --- ... ... .. -... .-.. .   -... ..- -   .- .-.. .-- .- 
-.-- ...   -.. . ..-. . .-. .-. .. -. --.   - .... .   -. . . -..   - ---   .--. .- -.--   - .- -..- . ...   
--- -.   --. .- .. -. ... 
Last edited on
Topic archived. No new replies allowed.