Void function problem, confusion, etc.

Mar 25, 2013 at 5:15am
I'm trying to complete a void function problem, but I'm having difficulty.

Here's the problem: I have two variables, pattern_type and pattern_size. pattern_type can be anything from 1 - 3 and pattern_size can be anything from 1 - 10. That gives me 30 possible outcomes but there should only be 3 loops, that are nested.

I've begun with something like this to output the $ in a specific pattern outlined by my professor's guidelines:
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
//Begin function definition
void PrintPattern(int pattern_type, int pattern_size)
{
//Begin function body

	//pattern_type 1
	for (int i=0; i < pattern_size; i++)
	{
		for int (j=0; j < pattern_type; j++)
			if (i==j)
				cout << "$";
			cout << endl;
	}
	
	//pattern_type 2
	for (int i=0; i < pattern_size; i++)
	{
		for int (j=0; j < pattern_type; j++)
			if (i==j)
				cout << "$";
			cout << endl;
	}
	
	//pattern_type 3
	for (int i=0; i < pattern_size; i++)
	{
		for int (j=0; j < pattern_type; j++)
			if (i==j)
				cout << "$";
			cout << endl;
	}

	//End function body
}
//End function definition 


Now I know this is far from complete, it's logically incorrect. The output should be:
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
pattern_type=1: 
I:0 | J:0
I:1 | J:1
I:2 | J:2
I:3 | J:3

OR

$
 $
  $
   $

and so on until they reach a maximum pattern_size=10

for pattern_type=2:
$
$$
$$$
$$$$
$$$$$
$$$$$$

and finally, for pattern_type=3:
$$$$$$$$$
 $$$$$$$$
  $$$$$$$
   $$$$$$
    $$$$$
     $$$$
      $$$
       $$
        $


I've ALWAYS had problems with structuring the logical output in my programs, and this one is especially NOT an exception to my flaw. I understand the loop I need for the outside part of my program, which handles the basic output and input required to call the function "PrintPattern(int pattern_type, int pattern_size)" and so on, but the structure of the function is confusing me. I think the best approach would be to do something like:

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

void PrintPattern(int pattern_type, int pattern_size)
{
//if pattern_type is not valid, ie: 1-3 
cout << "Pattern type isn't valid!\n";
return false;
//if pattern_size is not valid, ie: 1-10
cout << "Pattern size isn't valid!\n";
return false;

switch (pattern_type)
{
case 1:
for (int i=0; i < pattern_size; i++)
	{
		for int (j=0; j < pattern_type; j++)
			if (i==j)
				cout << "\t" << "$";
			cout << endl;
	}
case 2:
for (int i=0; i < pattern_size; i++)
	{
		for int (j=0; j < pattern_type; j++)
			if (i==j)
				cout << "$";
			cout << endl;
	}
case 3:
//I have no clue 

default: 
}


Can anyone give me some guidance? I'm lost.

Thank you!

Mar 25, 2013 at 5:33am
a) you forgot break at the end of cases
b) for ( int ( j=0; j < pattern_type pattern_size; j++)
c) just print i spaces, and (pattern_size - i) '$' after
Mar 25, 2013 at 5:42am
Pattern type 1: if (i==j)
Pattern type 2: if (j <= i)
Pattern type 3: if (j >= i)
Mar 25, 2013 at 6:02am
Here's what I have so far, with errors:

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
#include <iostream>

using namespace std;

void PrintPattern(int pattern_type, int pattern_size); //function call

int main()
{
	int pattern_type;
	int pattern_size;
	char ans;



	ans='y'; //ans always y so continues to loop unless n 


	while (ans=='y' || ans == 'Y')
	{
		cout << "Please enter a pattern type.\n";
		cin >> pattern_type;
		cout << "Please enter a pattern size.\n";
		cin >> pattern_size;

		
		cout  << "Please enter y or Y to continue. Enter any other character to exi the program.\n";
		cin >> ans;
	}
	return 0;

}

void PrintPattern(int pattern_type, int pattern_size)
{
//if pattern_type is not valid, ie: 1-3 
if (pattern_type > 3 || pattern_type < 1)
{
	cout << "Pattern type isn't valid!\n";
	return false;
}
//if pattern_size is not valid, ie: 1-10
if (pattern_size > 10 || pattern_size < 1)
{
	cout << "Pattern size isn't valid!\n";
	return false;
}

switch (pattern_type)
{
case 1:
for (int i=0; i < pattern_size; i++)
	{
		for int (j=0; j < pattern_size; j++)
			if (i==j)
				cout << "\t" << "$";
			cout << endl;
	}
	break;
case 2:
for (int i=0; i < pattern_size; i++)
	{
		for int (j=0; j < pattern_size; j++)
			if (j <= i)
				cout << "$";
			cout << endl;
	}
	break;
case 3:
for (int i=0; i < pattern_size; i++)
	{
		for int (j=0; j < pattern_size; j++)
			if (j >= i)
				cout << "$";
			cout << endl;
	}
	break;
}


Errors:

1
2
3
4
5
6
7
8
9
10
08_Lab_Test2.cpp: In function ‘void PrintPattern(int, int)’:
08_Lab_Test2.cpp:39:9: error: return-statement with a value, in function returning 'void' [-fpermissive]
08_Lab_Test2.cpp:45:9: error: return-statement with a value, in function returning 'void' [-fpermissive]
08_Lab_Test2.cpp:53:7: error: expected ‘(’ before ‘int’
08_Lab_Test2.cpp:53:12: error: ‘j’ was not declared in this scope
08_Lab_Test2.cpp:62:7: error: expected ‘(’ before ‘int’
08_Lab_Test2.cpp:62:12: error: ‘j’ was not declared in this scope
08_Lab_Test2.cpp:71:7: error: expected ‘(’ before ‘int’
08_Lab_Test2.cpp:71:12: error: ‘j’ was not declared in this scope
08_Lab_Test2.cpp:77:1: error: expected ‘}’ at end of input


Ugh...
Mar 25, 2013 at 6:09am
Look at the line mentioned in error, then look two posts above
Last edited on Mar 25, 2013 at 6:09am
Mar 25, 2013 at 6:23am

a) you forgot break at the end of cases
b) for ( int ( j=0; j < pattern_type pattern_size; j++)
c) just print i spaces, and (pattern_size - i) '$' after


I completed A and B, though I don't think I understand step C.

The new line of errors is:

1
2
3
4
5
6
08_Lab_Test2.cpp: In function ‘void PrintPattern(int, int)’:
08_Lab_Test2.cpp:39:9: error: return-statement with a value, in function returning 'void' [-fpermissive]
08_Lab_Test2.cpp:45:9: error: return-statement with a value, in function returning 'void' [-fpermissive]
08_Lab_Test2.cpp:53:13: error: ‘j’ was not declared in this scope
08_Lab_Test2.cpp:62:13: error: ‘j’ was not declared in this scope
08_Lab_Test2.cpp:71:13: error: ‘j’ was not declared in this scope


I'm a bit lost as to why j was not declared. I know j is basically the pattern_type, right? And for errors on 39 and 45, I'm not completely sure what's going on. I removed the return, however, that doesn't solve my problem to begin the while loop once the error text is output.

My new function:

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
switch (pattern_type)
{
case 1:
for (int i=0; i < pattern_size; i++)
	{
		for (int (j=0; j < pattern_size; j++)
			if (i==j)
				cout << "\t" << "$";
			cout << endl;
	}
	break;
case 2:
for (int i=0; i < pattern_size; i++)
	{
		for (int (j=0; j < pattern_size; j++)
			if (j <= i)
				cout << "$";
			cout << endl;
	}
	break;
case 3:
for (int i=0; i < pattern_size; i++)
	{
		for (int (j=0; j < pattern_size; j++)
			if (j >= i)
				cout << "$";
			cout << endl;
	}
	break;
}


Mar 25, 2013 at 6:42am
I'm a bit lost as to why j was not declared
for (int (j=0;
Because of excess parenthesis
Two lines above you did everything right. Why after writing two lines you suddenly forgot correct syntax for for-loops?
Last edited on Mar 25, 2013 at 6:43am
Mar 25, 2013 at 6:55am
Ah, that was simple enough. Well I'm glad the program now compiles! Thanks for your help. Now I feel there are many other problems ahead of me in order to get this functioning properly.

A)Doesn't output anything
B)Doesn't handle error's (ie: pattern_type > 3 || pattern_type < 1 OR pattern_size > 10 || pattern_size < 1)

Hmm... Luckily I have until midnight to figure this out. I do appreciate the pointers you've given me thus far.
Mar 25, 2013 at 6:58am
Two lines above you did everything right. Why after writing two lines you suddenly forgot correct syntax for for-loops?


Beginner mistakes, that's all. Keep in mind, I've only had about 6-8 weeks of study in ANY programming language at an academic level. It's bound to happen, especially for me.
Mar 25, 2013 at 7:09am
pattern_type > 3 || pattern_type < 1

Make a default case in your switch:
1
2
3
4
5
6
case 3:
    //...
    break;
default:
    std::cout << "Pattern type should be in [1; 3]";
}

pattern_size > 10 || pattern_size < 1

make condition in the begiinning of function:
1
2
3
4
if(pattern_size > 10 || pattern_size < 1) {
    std::cout << "pattern size should be in [1; 10]"
    return; //Stops function prematurely
}
Mar 25, 2013 at 7:23am
Hmm, not working. I can still enter anything outside of the parameters specified. I'll put some more work into this project later on today. Once again, thanks for your help!
Mar 25, 2013 at 7:46am
Hm, show your function now.
Mar 25, 2013 at 12:51pm
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
#include <iostream>

using namespace std;

void PrintPattern(int pattern_type, int pattern_size); //function call

int main()
{
    int pattern_type;
    int pattern_size;
    char ans;



    ans='y'; //ans always y so continues to loop unless n


    while (ans=='y' || ans == 'Y')
    {
        cout << "Please enter a pattern type.\n";
        cin >> pattern_type;
        cout << "Please enter a pattern size.\n";
        cin >> pattern_size;


        cout  << "Please enter Y or y to continue. Enter any other character to exit the program.\n";
        cin >> ans;
    }
    return 0;

}

void PrintPattern(int pattern_type, int pattern_size)
{

    if(pattern_size > 10 || pattern_size < 1)
    {
        cout << "Pattern size should be between (1-10).\n";
        return;
    }

    switch (pattern_type)
    {

    case 1:
        for (int i=0; i < pattern_size; i++)
        {
            for (int j=0; j < pattern_size; j++)
                if (i==j)
                    cout << "\t" << "$";
            cout << endl;
        }
        break;

    case 2:
        for (int i=0; i < pattern_size; i++)
        {
            for (int j=0; j < pattern_size; j++)
                if (j <= i)
                    cout << "$";
            cout << endl;
        }
        break;

    case 3:
        for (int i=0; i < pattern_size; i++)
        {
            for (int j=0; j < pattern_size; j++)
                if (j >= i)
                    cout << "$";
            cout << endl;
        }
        break;

    default:
        cout << "Pattern type should be beween (1-3).\n";

    }
}


The only thing that "really" works is the while loop, which is good, but the void function seems to not really work as intended. I'm sure it's something simple, I'm still picking through it to see if it's something simple.
Mar 25, 2013 at 2:00pm
You are never calling your PrintPattern function. Place function call in line 24.
Mar 25, 2013 at 5:04pm
Ah, so something along the lines of

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 while (ans=='y' || ans == 'Y')
    {
        cout << "Please enter a pattern type.\n";
        cin >> pattern_type;
        cout << "Please enter a pattern size.\n";
        cin >> pattern_size;

        PrintPattern(pattern_type, pattern_size);

        cout  << "Please enter Y or y to continue. Enter any other character to exit the program.\n";
        cin >> ans;
    }

Mar 25, 2013 at 5:10pm
Yes
Mar 25, 2013 at 5:19pm
Looks good, but my function -- not so much. I'm glad I've gotten this far though! It doesn't seem to properly function if you enter an incorrect value.

I believe the incorrect output lied within your tip earlier:

c) just print i spaces, and (pattern_size - i) '$' after
Mar 25, 2013 at 5:23pm
in your case 3:
after lines
1
2
if (j >= i)
    cout << "$";

add
1
2
else
    cout << ' ';
Mar 25, 2013 at 5:41pm
case 1:
1
2
3
4
if (i == j)
    cout << '$';
else
    cout << ' ';
Mar 25, 2013 at 6:00pm
1
2
3
4
5
case 1:
if (i == j)
    cout << '$';
else
    cout << ' ';




Thanks, I figured that one out. :) I feel like I should play Sudoku when learning programming. Programming is very mind challenging for me, I need to exercise my intellect.
Topic archived. No new replies allowed.