[Corsopoc] Esercizio 3 qualcosa comincia a funzionare
Emanuele Di Saverio
hazam@tiscalinet.it
Tue, 24 Dec 2002 02:06:50 +0100
This is a multi-part message in MIME format.
------=_NextPart_000_000A_01C2AAF1.1F024D40
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: 8bit
Ho buttato giù una funzione ricorsiva che permette di creare i menu a
piacere, basta mettere nel main le definizioni delle funzioni che si vuole
inserire, metterle in un array di puntatori a funzione e mettere una
descrizione (superflua) in un parallelo array di stringhe, e il metodo fa i
sottomenù a cascata, li fa depth first, non so perchè ma a me la roba
ricorsiva viene tutta depth first.
La funzione crea per ogni sottomenu una sua funzione "menu precedente", ho
dovuto fargliela fare per default perchè quando prendevo in input un
sottomenù perdevo il puntatore al padre, allora faccio tutto prima; la
stessa cosa per il Menu principale, tutto fatto a mano :(
Le funzioni definite sono UNA cioè add. Però si può aggiungerne quante ne
volete, io non l'ho fatto perchè non conosco il metodo di Jacobi, Gauss, e
in ogni caso qualsiasi metodo sia penso si dovrà fare un PARSER per le
equazioni, e qui mi arrendo: domani è Natale.
Emanuele Di Saverio
---------------------------------------------
Remove NOSPAM manually for reply
Scusate le scemenze se ne dico!
------=_NextPart_000_000A_01C2AAF1.1F024D40
Content-Type: application/octet-stream;
name="main.cpp"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="main.cpp"
#include <iostream>
#include <cstdlib>
#include <string>
#include "Menu.h"
void prec() {}
void esci(void)
{
cout << "Sto tornando al sistema.\n";
system("PAUSE");
exit (EXIT_SUCCESS);
}
void addizione(void)=20
{
cout << "immetti i numeri (double) da addizionare, quando terminato =
immettere 0\n";
double result=3D0;
double input=3D1;
while (input !=3D0)
{cin >>input;
result+=3Dinput;}
cout << "\nIl risultato e': " << result;
}
Opzione * riempiMenu(Menu* dariempire,int opz,void (**funzioni)(void))
{=20
for (int i=3D0; i< opz;i++)
{
int scelta;
do {
cout << "\n L'opzione e' un menu (1) o una azione? (2)\n";
cin >> scelta;
} while (scelta !=3D1 && scelta !=3D2);
if (scelta=3D=3D1){
int opzn;
string eti;
cout << "\nImmetti etichetta menu e numero opzioni\n";
cin >> eti >> opzn;
Menu* temp=3Dnew Menu(eti,opzn+1);
temp->defOpzione(new Azione ("menu precedente", prec, =
dariempire));
dariempire->defOpzione( riempiMenu( temp,opzn, funzioni));
}
else {
int funz;
string azi;
cout << "\nImmetti etichetta azione e numero funzione\n";
cin >> azi;
cin >> funz;
dariempire->defOpzione(new Azione (azi, funzioni[funz], =
dariempire));
}
} =20
return dariempire;
}
const int numeroFunc=3D1;
int main()
{
void (*funzioni[numeroFunc])(void);
string nomifunc[numeroFunc];
funzioni[0]=3Daddizione; nomifunc[0]=3D"ADD";
cout << "------------------------------------------\n";
cout << "|\n";
for (int i=3D0;i<numeroFunc;i++)
cout << "| " << i << ") " << nomifunc[i] << endl;
cout << "------------------------------------------\n"; =20
int menuscelte;
cout << "Quante opzioni deve avere il menu principale?\n";
cin >> menuscelte;
Menu* princ=3Dnew Menu("MENU PRINCIPALE",menuscelte+1);
princ->defOpzione(new Azione ("Esci", esci, princ));
riempiMenu(princ,menuscelte,funzioni);
princ->attiva();
}
------=_NextPart_000_000A_01C2AAF1.1F024D40
Content-Type: application/octet-stream;
name="Menu.h"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="Menu.h"
#ifndef MENU_H
#define MENU_H
#include <stdlib.h>
#include <string>
// Classe astratta
class Opzione {
public:
//Costruttore
Opzione() {};
Opzione(const string &etichettaOpzione){
etichetta=3D etichettaOpzione;}
//Segue metodo virtuale puro
virtual void attiva(void) =3D 0;
public:
string etichetta;
};
class Menu:public Opzione {
public:
Menu(const string &etichettaMenu,=20
int MaxNumOpzioni);
~Menu();
void defOpzione(Opzione *OpzPt);
void attiva(void);
private:
Opzione **listaOpzioni;
int numOpzioni, MxNumOpz;
};
class Azione:public Opzione {
public:
Azione(const string &etichettaAzione,=20
void (*funzPt)(void),=20
Opzione *opzPt=3DNULL);
void attiva(void);
// Stampa schermata e attiva il Menu
private:
Opzione *OPt;
void (*FPt)();
};
#endif;
Menu::Menu(const string &etichettaMenu,=20
int MaxNumOpzioni)
=20
//Nota chiamate del costruttore di Opzione
{
etichetta=3DetichettaMenu;
MxNumOpz =3D MaxNumOpzioni;
=20
if (MxNumOpz <=3D0) {
cout << "Errore in Menu(): Max Num.opzioni <=3D 0\n";
system("PAUSE");
exit (EXIT_FAILURE);
}
else {listaOpzioni=3D new Opzione *[MxNumOpz];
if (listaOpzioni =3D=3D NULL) {
cout << "Menu(): Mem. Dinamica Insufficiente\n";
exit (EXIT_FAILURE);
}
}
numOpzioni =3D0;
}
Menu::~Menu() {
for (int i=3D0; i<numOpzioni;i++)
delete listaOpzioni[i];
delete listaOpzioni;
cout << "distruzione totale \n";
}
=20
=20
void Menu::defOpzione(Opzione * OpzPt){
if (numOpzioni < MxNumOpz) {
listaOpzioni[numOpzioni]=3D OpzPt;
++numOpzioni;
}
else {
cout << "Menu.defOpzione: Fallimento/n";
exit(EXIT_FAILURE);
}
}
void Menu:: attiva(void){
// Stampa schermata e attiva Menu
int scelta;
do {
// Stampa schermata
cout<< "\n"<< etichetta << "\n";=20
for (int i=3D0; i <numOpzioni; ++i) {
cout << i << "\t";
if (listaOpzioni[i] !=3D NULL ) cout << listaOpzioni[i]->etichetta;
else cout << "NULL";
cout << "\n";
}
cout << "Selezionare la opzione: ";
cin >> scelta;
}
while (scelta< 0 || scelta >=3D numOpzioni|| listaOpzioni[scelta] =
=3D=3D NULL);
( listaOpzioni [scelta] )-> attiva ();
}
=20
Azione:: Azione(
const string &etichettaAzione,
void (*funzPt)(void),=20
Opzione *opzPt )=20
{
etichetta=3DetichettaAzione;
FPt =3D funzPt;
OPt =3D opzPt;
}
void Azione:: attiva(void) {
if (FPt !=3D NULL)
FPt();
else {cerr << "ERR:puntatore a funzione in Azione::attiva NULL\n"; =
system("PAUSE"); exit(EXIT_FAILURE);}
OPt -> attiva();
}
------=_NextPart_000_000A_01C2AAF1.1F024D40
Content-Type: application/octet-stream;
name="calcolatriceOOP.dev"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="calcolatriceOOP.dev"
[Project]
FileName=calcolatriceOOP.dev
Name=Console App
UnitCount=2
Type=1
Ver=1
ObjFiles=
Includes=
Libs=
PrivateResource=
ResourceIncludes=
MakeIncludes=
Resources=
Compiler=
Linker=
IsCpp=1
Icon=
ExeOutput=
ObjectOutput=
OverrideOutput=0
OverrideOutputName=
Folders=
CommandLine=
Focused=0
Order=0,1
[Unit2]
FileName=Menu.h
Open=1
Folder=
Top=0
CursorCol=37
CursorRow=72
TopLine=70
LeftChar=1
[Unit1]
FileName=main.cpp
Open=1
Folder=
Top=1
CursorCol=50
CursorRow=75
TopLine=55
LeftChar=1
[Views]
ProjectView=1
------=_NextPart_000_000A_01C2AAF1.1F024D40--