Lists

I wrote this code, but I have problems with function afis(), which must display fruct from import that have the maximum price
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
#include<iostream>
#include<conio.h>
#include<string.h>
using namespace std;
class Lista;
class fruct
{
private:
	int tip;
	char *nume;
	int pret;
	int valabilitate;
	int cantitate;
	fruct *urm;
public:
	fruct(int tp, char *n, int p, int v, int c)
	{
		nume=new char[strlen(n)+1];
		tip=tp;
		strcpy(nume, n);
		pret=p;
		valabilitate=v;
		cantitate=c;
		urm=NULL;
	}
	virtual void afisare()
	{
		cout<<"\n------------------\n";
		cout<<"\nNume: "<<nume;
		cout<<"\nPret: "<<pret;
		cout<<"\nValabilitate: "<<valabilitate;
		cout<<"\nCantitate: "<<cantitate;
	}
	friend class Lista;
};
class autohtone : public fruct
{
private:
	char *judet;
	char *producator;
	int data;
public:
	autohtone(int tp, char *n, int p, int v, int c, char *j, char *pr, int d):fruct(tp, n, p, v,c)
	{
		judet=new char[strlen(j)+1];
		producator=new char [strlen(pr)+1];
		strcpy(judet, j);
		strcpy(producator, pr);
		data=d;
	}
	void afisare()
	{
		fruct::afisare();
		cout<<"\nJudet de provenniente: "<<judet;
		cout<<"\nProdecator: "<<producator;
		cout<<"\nData la care au fost culese: "<<data;
	}
	friend class Lista;
};
class import :public fruct
{
private:
	char *tara;
	char *importator;
public:
	import(int tp, char *n, int p, int v, int c, char *t, char *i):fruct(tp,n,p,v,c)
	{
		tara=new char[strlen(t)+1];
		importator=new char[strlen(i)+1];
		strcpy(tara,t);
		strcpy(importator,i);
	}
	void afisare()
	{
		fruct::afisare();
		cout<<"\nTara de provienienta: "<<tara;
		cout<<"\nImportator: ";
	}
	friend class Lista;
};
class Lista
{
public:
	fruct *head;
	void adaugare(fruct *f);
	void afisare_lista();
	void cautare(int v);
	void stergere(char *n);
	void afis();
};
void Lista:: adaugare(fruct *f)
{
	fruct *p;
	p=head;
	if(p)
	{
		if(strcmp(f->nume,p->nume)<0)
		{
			f->urm=head;
			head=f;
		}
		else
		{
		while(p->urm && strcmp((p->urm)->nume, f->nume)<0)
			p=p->urm;
		    f->urm=p->urm;
			p->urm=f;
		}
	}
	else
		head=f;
}
void Lista :: afisare_lista()
{
	fruct *f;
	f=head;
	if(!f)
		cout<<"Lista este vida";
	else
		while(f)
		{
			f->afisare();
			f=f->urm;
			getch();
		}
}
void introducere(Lista &l , int x)
{
	char nume[20];
	int pret;
	int valabilitate;
	int cantitate;
	char judet[20];
	char producator[20];
	int data;
	char tara[20];
	char importator[20];
	fruct *f;
	cout<<"\nDati nume: ";
	cin>>nume;
	cout<<"\nDati pret: ";
	cin>>pret;
	cout<<"\nDati valabilitate: ";
	cin>>valabilitate;
	cout<<"\nDAti cantitate: ";
	cin>>cantitate;
	if(x==0)
	{
		autohtone *a;
		cout<<"\\nDAti judet de provenienta: ";
		cin>>judet;
		cout<<"\nDati prodicator: ";
		cin>>producator;
		cout<<"\nDati data culegerii: ";
		cin>>data;
		a=new autohtone(1, nume, pret, valabilitate, cantitate, judet, producator, data);
		f=a;
		l.adaugare(f);
	}
	else
		if(x==1)
		{
			import *r;
			cout<<"\nDati tara de provienienta: ";
			cin>>tara;
			cout<<"\nDati importator: ";
			cin>>importator;
			r=new import(2, nume, pret, valabilitate, cantitate, tara, importator);
			f=r;
			l.adaugare(f);
		}
}

void Lista::afis()
{
	fruct *m;
	import *i;
	int oferta,max=0;
	char num[20];
	m=head;
	if(!m)
		cout << "Lista este goala." << endl;
	else
		while(m)
		{
			if(m->tip==2)
			{
				i=(import *)m;
				oferta=m->pret;
				if(max<oferta)
				{
					max=oferta;
					strcpy(num,m->nume);
				}
				m=m->urm;
			}
		}
		cout << "Fructul: " << num << " este cel mai scump." << endl;
}



int main()
{
	int opt;
	Lista l;
	l.head=NULL;
	do
	{
		system ("CLS");
		cout<<"\n1.Adaugare fructe autohtone";
		cout<<"\n2.Adaugare fructe import";
		cout<<"\n3.Afisare fructe";
		
		cout<<"\n4 Afisare fructe cu pret maxim";
		cout<<"\nDati optiunea:";
		cin>>opt;
		switch(opt)
		{
		case 1:
			introducere(l,0);
			break;
		case 2:
			introducere(l,1);
			break;
		case 3:
			l.afisare_lista();
			break;
		
		case 4:
			l.afis();
			getch();
			break;

		case 0:
			break;
		default:
			cout<<"EROARE";
			break;
		}
	}
	while(opt!=0);
	return 0;
}

Please help me!
It's not clear how you intend to distinguish between autohtone and import. What did you have in mind with this design?
Hi,

After going through and identifying the problems below, I am not sure whether this will compile. If you have compilation errors & warnings, then please post them here in full - it saves us having to do "in brain compiling" :+)

Just noticed your Lista class doesn't seem to have a constructor, that's a problem.

The only member variable for that class is a pointer to a fruct type which you have named head (line 84). But the fruct class does not have a default constructor, so nothing is initialised for that member variable. The constructor you have on line 16 won't be called.

Now, in your Lista::afis() function, you have a local variable m which is a pointer to fruct again (not related to the member variable head), so nothing is initialised there either.

174
175
176
void Lista::afis()
{
	fruct *m; 


In these situations, default constructor that is implicitly created by the compiler is called, but that will initialise things to or nullptr etc

On line 180 m = head;, but I am guessing these will be null, for the reasons given above.

On lines 221 & 224 you call the introducere function with 2 ints, but the definition on line 127 looks like this:

void introducere(Lista &l , int x)

I don't see an overloaded function that takes those arguments.

So, some advice to make things easier:

Name your class member variables with a leading m_, so we can see that is what it is. I also name my classes with a leading C, but that is a matter of preference.

Try to avoid taking a C approach in C++ programming, I know it's hard to make the transition. Investigate using std::string rather than char arrays if you can. You shouldn't need pointers if using the STL, unless they are smart pointers. Avoid C functions like strcpy if you can.

Put your class definitions into a .h or .hpp header file named after the class - for example Lista.hpp, and put class member functions in a .cpp file - Lista.cpp say.

In the files #include whatever .hpp file is needed.

Put main() in a .cpp file of it's own, named after whatever you application is called.

Hope all is well at your end, and hopefully my comments help you out a bit :+)
> The only member variable for that class is a pointer to a fruct type which you have named head (line 84).
> But the fruct class does not have a default constructor
The member variable is a pointer, so the constructor for pointers would be called (which does nothing). The constructors of `fruct' are irrelevant.

Also, it is not always a good idea to provide a default constructor.


> you have a local variable m which is a pointer to fruct again (not related to the member variable head)
as you notice later m=head. That's the relationship, although it may have be better to put it in the initialization.

> In these situations, default constructor that is implicitly created by the compiler is called,
> but that will initialise things to or nullptr etc
no, the constructor for pointers does nothing. It will have garbage at that point.


> On lines 221 & 224 you call the introducere function with 2 ints,
introducere(l,0);
change your font, that's an `l' (but I do think that the name is not appropriate)


> i=(import *)m;
don't cast away error messages.
¿what if `m' was an `autohtone'?
Last edited on
I do not have errors.
Functions add void Lista :: adaugare(fruct *f) ,
introducere(Lista &l, int x) and display void Lista :: afisare_lista() works.
Function afis() do not works.
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
void Lista::afis()
{
	fruct *m; 
	import *i;
	int oferta,max=0;
	char num[20];
	m=head; //initialize m with head of list
	if(!m) //if list is empty
		cout << "Lista este goala." << endl;
	else
		while(m) //list is not empty
		{
			if(m->tip==2) //if node is import
			{
				i=(import *)m; //is cast from import to access
// to information derived class				
                                oferta=m->pret;
				if(max<oferta)
				{
					max=oferta;
					strcpy(num,m->nume);
				}
				m=m->urm;
			}
		}
		cout << "Fructul: " << num << " este cel mai scump." << endl;
}
Last edited on
Nice, comments.

> Function afis() do not works.
be a little more descriptive (crash, garbage, wrong output)
provide example input
Topic archived. No new replies allowed.