PDA

View Full Version : Richiesta esercizio


soulnafein
19-09-2002, 21:56
Una cosa che mi piace di questo forum allo stato attuale è che mi sembra più che altro una piccola scuola di magia, li allievi sono pochi e devono aspettare gli insegnamenti dei propri maestri.
Ragion per cui mi è venuta un idea.
Volevo testare la mia istintiva capacità di intuire un programma orientandomi agli oggetti. Non mi potete dare un esercizietto difficile risolvibile col solo ausilio del C++ standard senza STL?
P.S.
Il Visual C++ 6.0 Professional segue l'ultimo standard C++ che è quello usato nel libro ultimo di Shildt sul C++? Grazie ciauz

DM Ilweran
20-09-2002, 01:30
Scegli una forma geometrica e calcolane l'impossibile :)
Oppure, dato che nessuno si aspetta che tu tragga dallo spirito l'esperienza che ti devi fare, scarica da sourceforge, savannah o quel che vuoi dei sorgenti in C++ di un programma semplice e tenta di modificarli leggendo per bene il codice.

Nuitari
20-09-2002, 13:14
Alors te la do io una cosetta difficilotta ma non troppo :)

Senza utilizzare STL, crea una classe "stack" che funzioni allo stesso modo d'uno stack (se non sai come chiedi) e dimostrane il funzionamento con un programma d'esempio.

soulnafein
20-09-2002, 19:04
Praticamente devo fare una pila giusto? Memorizzo dati (naturalmente generici) e quando li richiedo li pesco dall'ultimo inserito giusto?

(Appena posso lo faccio, sto installando windowz 2000 e sto avendo una marea di problemi).

Nuitari
21-09-2002, 23:31
zi giussstissssimo

soulnafein
23-09-2002, 00:09
#include <iostream>

using namespace std;

const int DIM = 50;

template <class TipoStack>
class cStack
{
TipoStack stack[DIM];
int top; //cima dello stack
public:
cStack {top=0;};
void push(TipoStack elemento);
TipoStack pop();
};

template <class TipoStack> void push(TipoStack elemento)
{
if(top==DIM)
{
cout << "stack pieno";
return;
};
stack[DIM]=elemento;
DIM++;
}

template <class TipoStack> TipoStack pop();
{
if(!top) { cout << "stack vuoto"; return 0;};
DIM--;
return stack[DIM];
}


Questa dovrebbe essere la classe, non l'ho controllata nè compilata dato che ho l'altro pc fermo dato che l'installazione di windowz mi da problemi grossi.
Ditemi se sta bene. L'applicazione pratica fatela voi.

Reiser DarkSide
25-09-2002, 09:25
prova a tenre conto anche del Base Pointer oltre che allo Stack Pointer.

soulnafein
25-09-2002, 13:56
Cazz c'è un errore nel programma che ho scritto, mi sono dimenticato di definire l'appartenenza di quelle 2 funzioni alla classe.

DM Ilweran
25-09-2002, 13:58
Originally posted by Reiser DarkSide
prova a tenre conto anche del Base Pointer oltre che allo Stack Pointer.

Ma lo sai che ti chiami come il mio file system ?
Che figata :D :D :D

Nuitari
26-09-2002, 16:49
Allora ci sono una serie d'errori.

Il primo, + evidente, è il fatto che non hai dichiarato la classe d'appartenenza delle funzioni membro. Ma questo l'avevi già notato.

Il secondo è che hai dichiarato il costruttore della classe in questo modo:

cStack {top=0;};

Questo è errato, la forma corretta è:

cStack() {top=0;};

Tra l'altro è cosa gradita definire il codice del costruttore esternamente alla definizione della classe, risulta tutto + ordinato e leggibile.

Il terzo errore è che hai usato una costante come contatore del numero di elementi nello stack.

Nella funzione push:

stack[DIM]=elemento;
DIM++;

Nella funzione pop:

DIM--;
return stack[DIM];

Oltre ad essere un errore dal punto di vista tecnico, nel senso che non puoi modificare il valore d'una costante, è anche errato dal punto di vista logico, dato che DIM dovrebbe rappresentare la grandezza massima dello stack ed in quelle funzioni tu dovevi modificare il contatore del numero di elementi all'interno dello stack.
La forma corretta è:

stack[top]=elemento;
top++;

e

top--;
return stack[top];

Il quarto errore è che nel momento in cui viene eseguito un push od un pop oltre i limiti consentiti viene restituito un messaggio d'errore ma nessuna variabile che permetta di accorgersi dell'errore all'interno del programma.
Ad esempio, potevi definire push come bool e non void e restituire false nel caso fosse stato già raggiunto il limite dello stack.
Inoltre potevi all'interno di pop lanciare un eccezione (con throw) nel caso in cui si fosse tentato di pescare un valore inesistente dallo stack, eccezione che poteva poi essere gestita dal programma.

Addirittura, e questo è il quinto errore, nella pop viene restituito uno 0 in caso d'errore, questo non tenendo conto che il tipo restituito dalla funzione è indefinito. Anche questo problema era risolvibile con il throw.
Ti consiglio d'usare molto la gestione strutturata delle eccezioni, se programmi in C++.

Comunque questi sono tutti errori di cui ti saresti potuto rendere conto se avessi provato a compilare il sorgente almeno una volta.
La prossima volta che ti viene dato un esercizio, esegui la compilazione e fai ANCHE un applicazione pratica, dato che il tempo che abbiamo a disposizione è poco, ok? :)

soulnafein
26-09-2002, 17:42
Un paio di giorni altri e dovrei avere il mio pc funzionante e con il VC++ .
Appena ce l'ho lo rifaccio ad hoc e lo riposto.
Grazie

soulnafein
02-10-2002, 22:38
#include <iostream.h>


const int DIM = 100;

template <class TipoStack> class CStack
{
TipoStack stack[DIM];
int top;

public:
CStack();
void push(TipoStack elemento);
TipoStack pop();
};

template <class TipoStack> CStack<TipoStack>::CStack()
{
top=0;
}

template <class TipoStack> void CStack<TipoStack>::push(TipoStack elemento)
{
if(top==DIM) throw 1;

stack[top] = elemento;
top++;
}

template <class TipoStack> TipoStack CStack<TipoStack>::pop()
{
if(top==0) throw 0;

top--;
return stack[top];
}


int main()
{
CStack<char> stack1, stack2;
int i;

try
{
stack1.push('a');
stack1.push('b');
stack2.push('x');
stack2.push('y');
cout << "Contenuto stack 1: " << stack1.pop() << ',' << stack1.pop() << endl;
cout << "Contenuto stack 2: " << stack2.pop() << ',' << stack2.pop() << endl;
}
catch(int i)
{
switch(i)
{
case 0:
cout << "Stack vuoto";
break;
case 1:
cout << "Stack Pieno";
break;
};
}

return 0;
}


Questa versione del programma è funzionante, l'ho compilato con Visual C++ 6.0. Ho dovuto sostituire le righe
#include <iostream>
using namespace std;

con la riga
#include <iostream.h>

in quanto nel primo caso mi dava un sacco di errori ovvero questi
Compiling...
main.cpp
c:\programmi\microsoft visual studio\vc98\include\iosfwd(184) : warning C4552: '-' : operator has no effect; expected operator with side-effect
c:\programmi\microsoft visual studio\vc98\include\istream(434) : error C2143: syntax error : missing ';' before '*'
c:\programmi\microsoft visual studio\vc98\include\istream(434) : error C2059: syntax error : 'public'
c:\programmi\microsoft visual studio\vc98\include\istream(434) : error C2065: '_E' : undeclared identifier
c:\programmi\microsoft visual studio\vc98\include\istream(434) : error C2065: '_Tr' : undeclared identifier
c:\programmi\microsoft visual studio\vc98\include\istream(435) : error C2143: syntax error : missing ';' before '{'
c:\programmi\microsoft visual studio\vc98\include\istream(435) : error C2447: missing function header (old-style formal list?)
Error executing cl.exe.

main.obj - 6 error(s), 1 warning(s)

dove ho sbagliato? E perchè ha dato quegli errori?

Nuitari
03-10-2002, 03:40
uhm strano non avrebbe dovuto darteli..
puoi fare 2 cose:

1) provare ad aggiornare il Visual Studio come prima cosa. C'è un service pack disponibile sul sito della microsoft, se usi solo il Visual C++ puoi scaricarti solo la sua parte invece di tutto.

2) provare a spedirmi il progetto per intero così che possa dargli un occhiata come si deve.

Cmq, la sintassi corretta è quella che hai dovuto mettere.
Quando usi il C++ non devi usare gli header .h della standard library, ma bensì le controparti senza .h

L'header originale è <iostream> non <iostream.h>. La versione .h è inclusa solo per una questione di compatibilità con i vecchi prog.

Per quanto riguarda la necessità di definire un namespace quando usi classi ed oggetti, riguardati il libro che hai che li spiega decentemente.