PDA

View Full Version : [C++] problema grosso con esercizio


amandina
16-07-2010, 14:01
Ciao ragazzi sono nuova del forum..e ho un grosso problema:il professore di informatica dopo non aver tenuto il corso per 'sciopero' si è presentato e ci ha dato il programma da fare come elaborato per poter accedere all'esame. premesso che il C lo so usare questo programma per me è davvero impossibile. sono stata a impazzire quasi un mese per studiarmi da sola tutte le cose k non ha spiegato su classi e file ma a malapena comprendo le cose base. Qui vuole che usiamo liste concatenate e quant'altro,in pratica vuole in C++ un programma che faccia:

1)creazione di un database
2)inserimento dei record(accodamento)
3)ricerca/stampa di record(anke su più campi in modo dicotomico mediante file-index)
4)modifica/aggiornamento di record
5)eliminazione di record

e inoltre poi dobbiamo implementare il metodo grafico preferibilmente con qtcreator !questo è matto e mi manca questo esame che mi blocca altri essendo propedeutico :8...per caso qualcuno ha qualche dritta o programmi simili in modo da aiutarmi un po'?ve ne sarei immensamente grata grazie 1000

fero86
16-07-2010, 19:20
WTF?!? ma siamo matti, gestione di database a dei ragazzi che stanno imparando il C++ per la prima volta??? :D

e tramite cosa dovreste accedere ad un database? :stordita:
ed inoltre di quale database si tratta?

comunque confermo pienamente, il tuo professore é folle :asd:

fero86
16-07-2010, 19:21
tra l'altro vorrei capire cosa piffero c'entrano i database col C++.
questo corso é di C++ o di database?? io questa domanda gliela farei al professore.

tuccio`
16-07-2010, 21:14
no be', se non ho capito male, quello che deve fare è una linked list generica e metodi per aggiungere, ricercare, eliminare

amandina
16-07-2010, 23:10
allora quelle sono le specifiche ke ci ha dato quel matto ma penso k ad esempio bisogna gestire un magazzino k so di biscotti ocarne o una libreria o cose del genere per cui a ogni elemento si deve fare inserimento di nome codice,scadenza se c'è,prezzo e tutto ciò k serve...poi eventuale modifica (ricercando in modo dicotomico anke se nn vedo l'utilità) cancellazione e quant'altro :(...il problema è ke cmq si devono usare liste concatenate strutture classi e tutte le altre belle cose(per nn parlare del metodo grafico che non ha mai spiegato e dice ke lo dovremmo sapere fare :'( )....dannato esame e tutto ciò per 3 crediti sono disperata se avete idee o suggerimenti ben vengano...nel frattempo grazie a tutti quelli che hanno risposto almeno condividono la mia idea sul prof e mi tirano un pò su di morale ;)

fero86
16-07-2010, 23:28
3 crediti?!? o_o'
e devi fare un intero gestionale!! :|

no seriamente, non prendiamoci in giro: dev'essere una forma di protesta dovuta ai recenti disagi accademici (per caso sei di Roma?), vi ha dato apposta un progetto troppo difficile che sicuramente non siete in grado di fare. i progetti degli anni passati come erano? piu semplici?

comunque ribadisco, puoi darci qualche dettaglio ulteriore sulla specifica? che database devi usare, e come devi accederci? o c'é libertá totale?
non possiamo aiutarti se non ci dici queste cose.

anzi, un aiuto te lo do giá da ora: controlla se esiste la possibilitá di fare questo esame con un altro professore e con altre modalitá.

WarDuck
16-07-2010, 23:46
Se puoi scrivi esattamente cosa ti chiede.

Sicuramente non deve implementare un dbms ma semplicemente "simularlo".

Se hai già imparato le classi non è difficilissimo, le liste collegate anche non sono difficili da fare (ammesso che ti chieda di farle e non di usare le classi già pronte, cosa che credo).

Albi89
16-07-2010, 23:56
Sì, in effetti... è un problema grosso :D
Anche a me sembra che la questione si inquadri nella situazione di protesta generalizzata, un compito del genere è di sicuro non banale per studenti alle prime esperienze di programmazione (dato che gli argomenti sono basilari, es. liste concatenate, mi permetto di credere che sia un progetto del I/II anno).

Molto dipende da quanta libertà vi è stata data, ma dato che leggo di liste concatenate va a farsi friggere ogni suggerimento di SQLite + QTableView + QSqlTableModel (mi sembra di capire che i dati vadano in un'unica "tabella", dunque non dovrebbe esserci bisogno di gestire vincoli relazionali).

Che ci sia da utilizzare una lista dunque è scontato. Puoi utilizzare std::list o devi implementarla?
Altra questione: che tipo di dati devi conservare? Mi sembra di capire che i tuoi record possono avere un qualsiasi numero di campi, con un qualsiasi nome.
Probabilmente la strategia migliore è una struttura "campo" composta da nome e valore, ed una struttura record che contenga un certo numero di campi. La specifica non parla dei tipi dei valori: puoi semplificare molto usando semplici stringhe.

Il 90% delle operazioni si tradurrebbe in semplici operazioni su una lista di strutture di tipo record. Non capisco invece la ricerca "dicotomica": su una lista concatenata come si può gestire l'accesso casuale, necessario per una ricerca binaria?!

tuccio`
17-07-2010, 00:56
Se puoi scrivi esattamente cosa ti chiede.senza k magari anche :E

a informatica alla sapienza si fanno progetti di quella complessità per avere i 9 crediti del secondo esame di programmazione, mi sembra strano onestamente

posta le specifiche se puoi

amandina
17-07-2010, 10:14
sì è un esame del I anno e tra parentesi è esame di laboratorio ovvero 3 crediti :s...cmq ha affisso alla porta un foglio con scritto precisamente:

<<
PER IL LABORATORIO DI INFORMATICA:PROGRAMMA IN C++

Importante che dopo aver scelto l'applicazione si fornisca:
1-definizione delle specifiche dell'applicazione
2-progetto:flow-chart complessivo e dei vari moduli da implementare(la ricerca dicotomica deve essere parte essenziale del processo)
3-sviluppo:codice sorgente del programma(con GUI) e dei vari moduli(ben commentati)
4-collaudo:definizione delle classi di equivalenza di input utilizzabili per la verifica di correttezza e il test dei moduli(seguire il metodo delle coperture)

PASSI RICHIESTI DAL PROGRAMMA:
1)creazione di un database
2)inserimento dei record(accodamento)
3)ricerca/stampa di record(anke su più campi in modo dicotomico mediante file-index)
4)modifica/aggiornamento di record
5)eliminazione di record
>>

ora non credo sia una maniera di protesta poichè ci avevano già tolto gli appelli fino a metà luglio :s..e questo professore è conosciuto per la sua ''stranezza'' anke se al mio corso è il primo anno k c'è...k sfortuna..

cmq x quello ke abbiamo capito con le altre persone si dovrebbe fare un programma in modo che gestisca un magazzino,ora provo a fare un esempio con i biscotti: quindi ogni elemento deve avere diversi campi(io avevo pensato a 1 struttura) con ad esempio nome(es gocciole),codice(con questo avevo pensato di fare la ricerca dicotomica per ricercare l'elemento e modificare ecc se serve....sempre se è quello k vuole con quella ricerca XD),prezzo,quantità,iva,scadenza,e tante belle cose che si possono mettere..e poi fare in modo k si possano aggiungere nuovo elementi(con tutti i rispettivi campi) modificare8tutti o alcuni campi in base alla necessità) o cancellare elementi esistenti,ecc...non so se sono riuscita a spiegarmi un pò di più:(...cmq alla fine penso k se il programma funziona e fa queste cose non gli importerà se è fatto solo con classi,liste,strutture puntatori e simili..il problema è k sinceramente on le conoscenze base di C ke abbiamo(if,for ecc) e quelle in C++ base come costruttore lista,apertura e chiusura file mi diventa un pò difficile riuscire a fare quello richiesto...che dite qualcuno ha una soluzione?

das
17-07-2010, 10:20
Conosco poco il c++ ma ho provato a buttarti giù una traccia.
L'ho scritta in pochi minuti ed è solo una traccia, non escludo ci siano bug, però credo che possa aiutarti.

#include <cstdlib>
#include <iostream>
#include <string>
#include <list>
using namespace std;

struct campi{
string nome;
string cognome;
};
string nome;
string cognome;

int main (){
list<campi> miodatabase;
list<campi>::iterator i;

while(true) {
cout << "1 per inserire nuovo record\n";
cout << "2 per cancellare record\n";
cout << "3 per cercare\n";
cout << "0 per uscire\n";
int numero=0;
cin >> numero;

while (!cin >> numero) {
cout << "Inserimento non valido\n";
cin.clear();
string c;
cin >> c;
cin >> numero;
}
while ((numero < 0 ) ||(numero > 4 )) {
cout << "Inserimento non valido\n";
cin >> numero;
}
if (numero==1) {
campi campo;
cout << "Nome?\n";
cin >> nome;
campo.nome=nome;
cout << "Cognome?\n";
cin >> cognome;
campo.cognome=cognome;
miodatabase.push_back(campo);
}
if (numero==3) {
cout << "Nome da cercare?\n";
cin >> nome;
bool trovato;
trovato=false;
int a=0;
for (i = miodatabase.begin(); i != miodatabase.end(); ++i) {
if ((*i).nome==nome) {
cout << "Trovato, il cognome di " << nome << " è " << (*i).cognome << endl;
cout << "Record numero " << a << endl;
trovato=true;
}
a++;
}
if (!trovato) {
cout << "Non trovato\n";
}
}

if (numero==2) {
if (miodatabase.size()>0){
cout << "numero di record presenti ";
cout <<miodatabase.size() << "\n";
cout << "Numero record da eliminare?\n";
int numrecord=0;
cin >> numrecord;
while (!cin >> numrecord) {
cout << "Inserimento non valido\n";
cin.clear();
string c;
cin >> c;
cin >> numrecord;}
while ((numrecord < 0 ) ||(numrecord > miodatabase.size() )) {
cout << "Numero record inesistente\n";
cin >> numrecord;
}
i=miodatabase.begin();
advance(i,numrecord);
cout << (*i).nome << " " << (*i).cognome << " cancellato" << endl;
miodatabase.erase(i);
} else { cout << "Nessun record da cancellare\n\n"; }
}

if (numero==0){

miodatabase.clear();
miodatabase.~list<campi>();
system("PAUSE");
return EXIT_SUCCESS;}
}
}


L'ho provata con wxDev-C++ ma dovrebbe essere compatibile con qualsiasi compilatore.
Usa le liste concatenate(già implementate nella STL), crea record, ricerca e cancella.
Non usa la programmazione strutturata ma nel caso ti fosse richiesta dimmelo che te lo modifico.
Non so che cosa sia il metodo grafico ma credo che il professore non ti richieda una cosa molto più complicata di questa per soli 3 crediti.

Ciao

cionci
17-07-2010, 11:36
anke su più campi in modo dicotomico mediante file-index

Per favore non usare le "k" :D
E' un po' strana questa richiesta: l'uso di file indice implica che la ricerca binaria dopo al massimo la puoi fare su un gruppo ristretto.

Quello che non capisco è se per "Creazione del database" intende che l'utente possa creare un database come meglio vuole o che il database con campi fissi venga creato alla prima esecuzione del programma.
Nel prima caso la cosa diventa tutt'altro che semplice.

Il consiglio che ti posso dare è farti tutto da shell e dopo implementarti l'interfaccia grafica. Con l'interfaccia grafica alla fine si tratterà solamente di utilizzare le funzioni che hai implementato senza interfaccia. Quindi è importante separare le parti del codice che fanno input e output da quelle che lavorano veramente sul database.

das
17-07-2010, 11:49
anke su più campi in modo dicotomico mediante file-index

Per favore non usare le "k" :D
E' un po' strana questa richiesta: l'uso di file indice implica che la ricerca binaria dopo al massimo la puoi fare su un gruppo ristretto.

Quello che non capisco è se per "Creazione del database" intende che l'utente possa creare un database come meglio vuole o che il database con campi fissi venga creato alla prima esecuzione del programma.
Nel prima caso la cosa diventa tutt'altro che semplice.

Il consiglio che ti posso dare è farti tutto da shell e dopo implementarti l'interfaccia grafica. Con l'interfaccia grafica alla fine si tratterà solamente di utilizzare le funzioni che hai implementato senza interfaccia. Quindi è importante separare le parti del codice che fanno input e output da quelle che lavorano veramente sul database.

Mi era sfuggito il discorso della ricerca dicotomica, allora l'algoritmo che ho messo sopra non va più bene.
Ma per metodo grafico si intende semplicemente 'con interfaccia grafica?'
In tal caso conviene usare un ambiente RAD come wxdev

cionci
17-07-2010, 11:51
Suppongo si intenda "tramite interfaccia grafica".
In tal caso conviene usare un ambiente RAD come wxdev
Se provi QtCreator (quello che devono usare loro), wxDev lo butti nella discarica dopo meno di 10 minuti :D

das
17-07-2010, 12:02
Suppongo si intenda "tramite interfaccia grafica".

Se provi QtCreator (quello che devono usare loro), wxDev lo butti nella discarica dopo meno di 10 minuti :D

E' la mia solita mania di leggere i thread al volo, mi sono perso la ricerca dicotomica e l'uso di QTCreator.

Mai utilizzato, è parecchio migliore ?
Le QT le ho sempre un po' snobbate per il loro 'background commerciale' però se semplificano la vita...

cionci
17-07-2010, 12:04
Le QT le ho sempre un po' snobbate per il loro 'background commerciale' però se semplificano la vita...
Ora sono GPL e LGPL anche su Windows ;)

amandina
17-07-2010, 12:11
ringrazio per le risposte :)..il problema è che oltre alla ricerca dicotomica che io abbia capito dobbiamo fare in modo che il tutto venga salvato su un file così una volta chiuso il programma a posteriori si possa risalire ai dati inseriti e nel caso cancellare modificare ecc(e forse per questo funge la ricerca dicotomica poichè se assegniamo un codice a posteriori sappiamo a cosa corrisponde ma non so se è giusta la mia idea) e in questo caso le cose si complicano parecchio :(

tuccio`
17-07-2010, 12:18
QtCreator è clamorosamente facile, veloce e comodo

Albi89
17-07-2010, 12:25
ringrazio per le risposte :)..il problema è che oltre alla ricerca dicotomica che io abbia capito dobbiamo fare in modo che il tutto venga salvato su un file così una volta chiuso il programma a posteriori si possa risalire ai dati inseriti e nel caso cancellare modificare ecc(e forse per questo funge la ricerca dicotomica poichè se assegniamo un codice a posteriori sappiamo a cosa corrisponde ma non so se è giusta la mia idea) e in questo caso le cose si complicano parecchio :(

Per quanto riguarda Qt + QtCreator dai un occhio al libro che ho postato nel topic sui migliori libri di programmazione.
Sulla ricerca dicotomica mi appello a qualcuno più esperto: ha senso implementarla su una lista concatenata? :eek:

tuccio`
17-07-2010, 12:26
Per quanto riguarda Qt + QtCreator dai un occhio al libro che ho postato nel topic sui migliori libri di programmazione.
Sulla ricerca dicotomica mi appello a qualcuno più esperto: ha senso implementarla su una lista concatenata? :eek:non si può proprio

Albi89
17-07-2010, 12:30
non si può proprio

mh e quel "ricerca dicotomica mediante file-index" come lo interpreti?
questo testo mi sembra pieno di punti oscuri, capisco il nervosismo :O

cionci
17-07-2010, 12:42
No, guarda, il file non rende il tutto più difficile. Semplicemente nel file indice avrai il punto del file dati in cui si trova il dato al quale l'indice si riferisce. O meglio, l'indice del record. Visto che mi immagino utilizzerai record a dimensione fissa:

indice del record * dimensione = posizione nel file

Non ho ben capito quella storia dei file indice sinceramente. Si possono definire decine di indicizzazioni diverse su un file di dati, ma nessuna di queste indicizzazioni ha a che fare con una ricerca binaria. La ricerca binaria si fa su una sequenza di dati ordinata, ma proprio quando non hai a disposizione alcun indice sui dati su cui svolgi la ricerca ;)

Si può pensare ad un approccio misto...
In un file indice per il campo i-esimo, mantieni, ad esempio, la lista degli indici dei record ordinati secondo il campo i-esimo.
In cima al file avrai una struttura che ti indicherà la posizione da cui iniziano i record con la lettera "a", quelli con la lettera "b" etc etc.
Questo lo puoi fare per ogni campo.

Per fare una ricerca su un dato campo i-esimo, ti vai a prendere la prima lettera da cercare, trovi la posizione del file indice in cui sono memorizzati i record che iniziano per quella lettera. Ti leggi anche la posizione nel file indice dell'ultimo record con quella lettera (corrisponde alla posizione del primo elemento della lettera successiva - 1).
A questo punto sai da dove risiede il primo indice, dove risiede l'ultimo indice, ora puoi fare una ricerca dicotomica.
Dividi l'intervallo a metà e leggi l'indice alla posizione risultante (corrisponde a quella del primo indice + ((numero di indici / 2) * dimensione dell'indice)).
A questo punto leggi il file dei dati nella posizione corrispondente all'indice trovato. Confronti le stringhe, se è maggiore dividi l'intervallo in due all'indietro, se è minore in avanti...e così via come la normale ricerca dicotomica.

fero86
17-07-2010, 13:15
vedo che la cosa si é molto ridimensionata: leggendo i post iniziali io, in tutta sinceritá, avevo capito che andasse usato un vero DBMS giá pronto (tipo Firebird), ma leggendo i post successivi vedo che non c'é alcun requisito di efficienza (un database gestito con liste linkate?? :D :D).

in questo modo tale progetto rientra molto meglio nei 3 crediti, inoltre non ho mai usato QtCreator ma dargli una GUI con quello dovrebbe essere poco piu di un gioco (certo, comunque se la poteva risparmiare).

amandina
18-07-2010, 09:20
ok provo a smanettarci un pò ;)....se ci sono altre idee aiuti fatemi sapere