how to make for statement correct?

My for loop is not allowing two separate places for input. I am very new to C++ and do not speak english as my native language, and do not understand what my book is explaining!
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
//lab seven

#include<iostream>
#include<string>
#include<iomanip>

using namespace std;

//structure
struct BookInfo
{
    string title;
    double price;
};

struct Author
{
    string author;
    BookInfo books[3];
};

//prototypes
void showInfo(Author a[], int size);
void getInfo(Author a[], int size);

int main()
{
    int inventory = 3;
    
    //This is where I run into the problem, I cannot figure out how to initialize the whole array
    Author list[3] =
    {
        "NONE",
        {"NONE", 0},
        "NONE",
        {"NONE", 0},
        "NONE",
        {"NONE", 0}
        };
    
    cout << "Here is the data after initialization:\n";
   
    showInfo(list,inventory);
    
    cout << "\nGet users input:";
    
    getInfo(list,inventory);
    
    cout << "\nHere is the data after the users input:";
    
    showInfo(list,inventory);
    
    system("pause");
    return 0;
}

void showInfo(Author a[], int size)
{
    cout << fixed << showpoint << setprecision(2);
    
    for(int i = 0; i < size; i++)
    {
        cout << "The author: " << a[i].author << endl;
        
    for(int j = 0; j < size; j++)
    {
        cout << "\tThe title: " << a[i].books[j].title << ", the price: $" << a[i].books[j].price << endl;
        }
    }
}

void getInfo(Author a[], int size)
{
    for(int i = 0; i < size; i++)
    {
        cout << "\nEnter the author's name: ";
        cin >> a[i].author;
        
        if(a[i].author == "NONE")
            break;
        else
            
        for(int j = 0; j < size; j++)
            
        {
            cout << "\nEnter title " << j+1 << ": ";
           
            cin >> a[i].books[j].title;
            
            if(a[i].books[j].title == "NONE")
                    break;
            else
            cout << "\nEnter price " << j+1 << ": ";
            cin >>a[i].books[j].price;
            
            }
    }
}

Here is the output. The first bit is correct. When it ask for the title and I press the enter button, it print all the rest out. I want it to go for each step? And stop if I say "NONE".
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
Here is the data after initialization:
The author: NONE
	The title: NONE, the price: $0.00
	The title: , the price: $0.00
	The title: , the price: $0.00
The author: NONE
	The title: NONE, the price: $0.00
	The title: , the price: $0.00
	The title: , the price: $0.00
The author: NONE
	The title: NONE, the price: $0.00
	The title: , the price: $0.00
	The title: , the price: $0.00

Get users input:
Enter the author's name: Mr.ABC

Enter title 1: Intro to C++

Enter price 1: 
Enter title 2: 
Enter price 2: 
Enter title 3: 
Enter price 3: 
Enter the author's name: 
Here is the data after the users input:The author: Mr.ABC
	The title: Intro, the price: $0.00
	The title: , the price: $0.00
	The title: , the price: $0.00
The author: NONE
	The title: NONE, the price: $0.00
	The title: , the price: $0.00
	The title: , the price: $0.00
The author: NONE
	The title: NONE, the price: $0.00
	The title: , the price: $0.00
	The title: , the price: $0.00


Thank you. I appreciate all help provided.
1
2
3
4
5
//This is where I run into the problem, I cannot figure out how to initialize the whole array
    Author list[3] =
    {
        "NONE",
        {"NONE", 0},  //3 books for each author{"NONE", 0, "NONE", 0, "NONE", 0}, 


or you could initialize in the struct definition

1
2
3
4
5
struct BookInfo
{
    string title="NONE";
    double price=0;
};


Since there will probably be spaces in both the name and title, you can use getline for the strings. cin by itself won't get a whole string like "John Doe".

getline(cin, a[i].books[j].title);

http://www.cplusplus.com/reference/string/string/getline/

And add cin.ignore after the price input, so the newline character after the number entered is ignored.

1
2
cin >>a[i].books[j].price;
cin.ignore(1000, '\n');
ahh so now i have this
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

    //lab seven




#include<iostream>
#include<string>
#include<iomanip>




using namespace std;




//structure
struct BookInfo
{
    string title;
    double price;
};




struct Author
{
    string author;
    BookInfo books[3];
};




//prototypes
void showInfo(Author a[], int size);
void getInfo(Author a[], int size);




int main()
{
    int inventory = 3;
    
       Author list[3] =
    {
        "NONE",
        {"NONE", 0},
        "NONE",
        {"NONE", 0},
        "NONE",
        {"NONE", 0}
        };
    
    cout << "Here is the data after initialization:\n";
   
    showInfo(list,inventory);
    
    cout << "\nGet users input:";
    
    getInfo(list,inventory);
    
    cout << "\nHere is the data after the users input:";
    
    showInfo(list,inventory);
    
    
    return 0;
}




void showInfo(Author a[], int size)
{
    cout << fixed << showpoint << setprecision(2);
    
    for(int i = 0; i < size; i++)
    {
        cout << "The author: " << a[i].author << endl;
        
    for(int j = 0; j < size; j++)
    {
        cout << "\tThe title: " << a[i].books[j].title << ", the price: $" << a[i].books[j].price << endl;
        }
    }
}




void getInfo(Author a[], int size)
{
    for(int i = 0; i < size; i++)
    {
        cout << "\nEnter the author's name: ";
        getline(cin,a[i].author);
        
        if(a[i].author == "NONE")
            break;
        else
            
        for(int j = 0; j < size; j++)
            
        {
            cout << "Enter title " << j+1 << ": ";
           
             getline(cin, a[i].books[j].title);
            
            if(a[i].books[j].title == "NONE")
                    break;
            else
            cout << "Enter price " << j+1 << ": $";
            
          
      
        cin.ignore(1000, '\n');
        
            }
    }
}








Here is the data after the users input:The author: Mr.ABC
The title: Intro to C++, the price: $0.00
The title: Intro to Blac, the price: $0.00
The title: NONE, the price: $0.00
The author: Mr.DEF
The title: Intro to Wha, the price: $0.00
The title: , the price: $0.00
The title: Boop, the price: $0.00
The author: Mr.GHI
The title: Intro to C#, the price: $0.00
The title: NONE, the price: $0.00
The title: , the price: $0.00

it does not copy the prices!!
Last edited on
I think you're just missing the input line for the price before the cin.ignore line.

1
2
cin >>a[i].books[j].price;
cin.ignore(1000, '\n');
Topic archived. No new replies allowed.