Used a bunch of GOTO's, loop instead?

So after getting this far I visualized the flow of my program and thought "I think I just wrote spaghetti code". Being a noob I was aware it was bound to happen and want to learn from it. Now with the concept of trying to code clean and tight, and after doing a bit of reading, my question is this:

Is a loop my best option here? (ie: for, do while, ect)

I am basically creating a dos prompt that doesnt actually do anything, just mimics what would happen when you use common dos commands. I am visualizing having a very large loop if I am to insert all the commands and access to the folders that I am wanting to. Is this acceptable or is there a better way?

I am considering using a string array to contain all the commands and sections (folders and sub folders of each drive) instead of just a list of all the strings, which would be fairly long.

This is my second program not counting hello world.

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
#include "stdafx.h"
#include <iostream>
#include <sstream>
using namespace std;

int main()
{

	string answerc;
	string answerd;
	string answerw;

	        cout << "Microsoft Windows [Version 10.0.10586]\n";
	        cout << "(c)2015 Microsoft Corporation.All rights reserved.\n";
	        cout << endl;


startc: /* This is the beginning of the C:\ section */
		cout << "C:\\>";
	
	getline(cin, answerc);  /*using getline allows for spaces in input*/

	if (answerc == "exit") {
		goto exit;
	}
	else if (answerc == "cd d:") {
		cout << endl;
		goto startd;
	}
	else if (answerc == "dir/w") {

		cout << "Volume in drive C is Windows\n";
		cout << "Volume Serial Number is 2600 - 8R7G\n";
		cout << endl;

		cout << "Directory of C:\\\n";
		cout << endl;
		cout << "[Program Files]   [Program Files(x86)]   [Sandbox]   [Users]   [Windows]\n";
		cout << "         0 File(s)              0 bytes\n";
		cout << "         5 Dir(s)  200, 725, 024, 768 bytes free\n";
		goto startc;
	}
	else if (answerc == "cd windows") {
		cout << endl;
		goto cwindows;
	}
	else {
		cout << "Bad Command or Filename\n";
		cout << endl;
		goto startc;
	}

startd: /* This is the beginning of the D:\ section */
		cout << "D:\\>";

	getline(cin, answerd);

	if (answerd == "exit") {
		goto exit;
	}

	else if (answerd == "cd c:") {
		cout << endl;
		goto startc;
	}

	else if (answerd == "dir/w") {

		cout << "Directory of D: \n";
		cout << "Volume in drive D is System_DRV\n";
		cout << "Volume Serial Number is C003 - A242\n";
		cout << " " << endl;

		cout << "Directory of D:\\\n";
		cout << " " << endl;
		cout << "[System Dir]   [Void]   [Bin]   [Users]   [C_access]\n";
		cout << "         0 File(s)              0 bytes\n";
		cout << "         5 Dir(s)  104, 235, 024, 219 bytes free\n";
		cout << endl;
		goto startd;
	}
	else {
		cout << "Bad Command or Filename\n";
		cout << endl;
		goto startd;
	}

cwindows:

		cout << "C:\\Windows>";

	getline(cin, answerw);

	if (answerw == "exit") {
		goto exit;
	}

	else if (answerw == "cd c:") {
		cout << endl;
		goto startc;
	}

	else if (answerw == "cd\\") {
		cout << endl;
		goto startc;
	}

	else if (answerw == "dir/w") {

		cout << "Directory of C:\\Windows \n";
		cout << "Volume in drive C is Windows\n";
		cout << "Volume Serial Number is C003 - A242\n";
		cout << " " << endl;

		cout << "Directory of C:\\Windows\n";
		cout << " " << endl;
		cout << "[System]   [Backup]   [Bin]   [Users]   [Login_Doc]\n";
		cout << "         0 File(s)              0 bytes\n";
		cout << "         5 Dir(s)  104, 235, 024, 219 bytes free\n";
		cout << endl;
		goto cwindows;
	}
	else {
		cout << "Bad Command or Filename\n";
		cout << endl;
		goto cwindows;
	}

	exit:
	system("pause");
    return 0;
}
Last edited on
closed account (iGLbpfjN)
Maybe this is not the versatile way, but it's an option. Try completing the code with the same logic

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
int main()
{
	cout << "Microsoft Windows [Version 10.0.10586]\n";
	cout << "(c)2015 Microsoft Corporation.All rights reserved.\n";
	cout << endl;
	        
	string option;
	string C_Section = "C:\\>";
	string D_Section = "D:\\>";
	string W_Section = "C:\\Windows>";
	string outputMessage = C_Section;	// The message'll start as "C:\\>"
	
	do
	{
		cout << outputMessage;
		
		getline(cin, option);
		
		if(option == "cd d:")	// If you want to change to D:\\>
		{
			outputMessage = D_Section;	// The initial message'll change to "D:\\>"
			cout << endl;
			continue;	
// Jump to the end of do-while --> As option != "exit", it'll begin again
		}
		
		if(outputMessage == C_Section && option == "dir/w")
		// If you are in "C:\\>" and choose "dir/w"
		{
		cout << "Volume in drive C is Windows\n";
		cout << "Volume Serial Number is 2600 - 8R7G\n";
		cout << endl;
		cout << "Directory of C:\\\n";
		cout << endl;
		cout << "[Program Files]   [Program Files(x86)]   [Sandbox]   [Users]   [Windows]\n";
		cout << "         0 File(s)              0 bytes\n";
		cout << "         5 Dir(s)  200, 725, 024, 768 bytes free\n";
		continue;
		}
		
	}while (option != "exit");
	
}
Instead of usinggoto, you could also use functions. I. E. have an exit function, a cwindows function, and a startd function. Instead of using goto, simply call the function.
Too Explosive: So how is this different than using goto? Is there a reason calling functions is acceptable over using goto? Doesn't this still result in having spaghetti code?

Omni: Thank you, this worked out great.
+1 Too Explosive

As @Too Explosive said you can use functions... all your question will be answered when you learn function once

http://www.cplusplus.com/doc/tutorial/functions/
Topic archived. No new replies allowed.