Newsgroup: it.comp.lang.c++
Titolo: Circuito

Ciao a tutti
innanzi tutto premetto che è un esercizio per l'esame di c++ e
premetto che non voglio la soluzione ma solo dei suggerimenti...
Devo realizzare un programma che deve prendere i componenti di un
circuito (a una maglia sola) e crea il cicuito equivalente e calcola
tensione o corrente.
Ho creato una classe astratta componente. Nei componenti ho inserito
gli utilizzatori (resistori, condensatori e induttanze) e i
generatori.
Quindi ci sono due classi astratte che derivano da componenti e danno
le linee di comportamenti delle due categorie dei componenti.
Da li si derivano le classi concrete (condensatore, generatore...).
Il grosso problema è l'interazione con l'utente.
Non riesco a immaginare come il programma deve dialogare con l'utente
per costruire il circuito.
Inoltre non sono state date le specifiche per l'input (libertà
totale).
Come dite di procedere?
Grazie in anticipo
--
Ciao Neo

Il grosso problema è l'interazione con l'utente.
Ti è consentito usare la grafica?

 Ti è consentito usare la grafica?
Non c'è scritto di no quindi si... Anche se lui non l'ha fatta, ma non
è importante se facilita la risoluzione.
--
Ciao Neo

Neo ha scritto:

La grafica facilita l'uso ma complica di molto la programmazione, 
soprattutto in C++.
Il tipo di interfaccia utente piu' semplice da programmare, e quindi 
consigliabile se non ci sono requisiti sull'interfaccia utente, è l'uso 
degli stream stdin e stdout.
L'utente, usando un editor di testo, prepara un file contenente i dati 
di input in formato testuale, poi lancia il programma passandogli tale 
file come input e il nome di un altro file per l'output.
Il programma legge il primo file, fa i calcoli, e scrive i risultati nel 
secondo file.
Il file di output può essere letto con un editor di testo, o caricato in 
uno spreadsheet, o elaborato da un altro programma come Gnuplot.
-- 
     Carlo Milanesi
 
http://digilander.libero.it/carlmila

 secondo file.
In effetti la mia prima pensata è stata questa... Peccato che non so
come formattarlo in maniera da dire: qui ci sono 2 resistenze in
parallelo, qui 3 condensatori in esrie con una resistenza messa così
etc etc...
--
Ciao Neo

soprattutto in C++.
Non č affatto vero, dipende dall'ambiente usato. Con C++ Builder č
semplicissimo costruire un'interfaccia abbastanza usabile. Dal mio
punto di vista č molto piů complesso strutturare un file testuale che
rappresenti un circuito.

 parallelo, ...
Suggerisco di cominciare a pensare alla struttura dati in memoria, e poi 
il file di input risultera' il "salvataggio" (o serializzazione) di tale 
struttura dati.
Il formato piů potente č l'XML, ma bisogna saperlo manipolare, oppure 
puoi ispirarti ai file ".ini" di Windows 3, o ai file ".reg" di Windows 
95, NT e successivi, o ai file ".conf" di Unix.


 95, NT e successivi, o ai file ".conf" di Unix.
ok... Lavoro con linux. Anche xml potrebbe andare bene
--
Ciao Neo

 rappresenti un circuito.
Con la grafica come faresti? Al massimo potrei usare wxwidget (visto
che sono sotto linux) o le qt...
--
Ciao Neo

 Ciao Neo

 Come dite di procedere?
Un idea come un altra...
un file di testo con i seguenti campi
nome_componente; tipo; lista di nomi di componenti a cui è collegato; 
e via cosi per ogni componente del circuito
cosi dovresti riuscire ad avere tutte le informazioni che ti servono.
Ciao
-- 
Andrea Corradi | Debian User | 
www.debian.org
Fingerprint: A41E F6B0 DBDB F04C 4940 E411 30F3 CD62 57B1 8458
gpg --keyserver 
keyserver.linux.it
 --recv-key 57B18458
Please avoid sending me Word or PowerPoint attachments.
http://www.gnu.org/philosophy/no-word-attachments.html

 non ti servono tutte le sue feature )
Interessante ma non mi pare ci sia molta doc... Ho guardato molto
velocemente però :)
--
Ciao Neo

 cosi dovresti riuscire ad avere tutte le informazioni che ti servono.
Guarda l'idea è bella ma non ho ancora avuto il tempo di pensare come
realizzarla in pratica...
Intanto aspetto la risposta di Andrea la grafica mi piaceva...
--
Ciao Neo

 rappresenti un circuito.
Fare un mini-CAD elettronico mi sembra di per se notevolmente piů
complesso che scrivere il semplice risolutore che deve fare. Oltretutto
io penso che non sia proprio quello che il professore ha in mente, e non
necessariamente la parte GUI gli verrebbe 'conteggiata' per l'esame.
Oltretutto io vedo *quasi sempre* vantaggi dal punto di vista
dell'organizzazione del codice e della struttura di programma a scrivere
un programma come un processore di linguaggi. Sicuramente lo vedo in un
caso in cui una forma di linguaggio viene quasi implicitamente
suggerita.
 
-- 
-riko

 Il formato piů potente č l'XML, ma bisogna saperlo manipolare
Mi sembra completamente un overkill.
Oltretutto a fronte di un discutibile vantaggio di programmazione gli
potrebbe cadere il cadibili a scrivere sti benedetti files.
-- 
-riko

complesso che scrivere il semplice risolutore che deve fare. 
Il risolutore è una cosa, l'input per il risolutore è un'altra.
Come già detto, non è troppo complesso usare C++ Builder per costruire
un'interfaccia. Non sto parlando di costruire un mini-CAD. Se non
conosci questo strumento perché dici che è "notevolmente complesso"?

che sono sotto linux) o le qt...
Pensavo stessi lavorando sotto Windows. E' per questo che ti suggerivo
C++ Builder. Su Linux le cose si complicano.


 > wrote:
 >> suggerisco di cominciare a pensare alla struttura dati in memoria,
 >> e poi il file di input risultera' il "salvataggio" (o
 >> serializzazione) di tale struttura dati.
 >
 > Ecco questo credo sia il grande problema... Riuscire a trovare la
 > struttura dati che possa contenere l'informazione sul circuito...
Questo e' un problema di design del software, piu' che di linguaggio C++.
 >> oppure puoi ispirarti ai file ".ini" di Windows 3, o ai file
 >> ".reg" di Windows 95, NT e successivi, o ai file ".conf" di Unix.
 >
 > ok... Lavoro con linux.
Non ha molta importanza su quale sistema operativo lavori, in quanto 
comunque un file di testo puo' avere qualunque formato.
Ma se hai gia' configurato Apache, puoi ispirarti al file "httpd.conf".


 Ma se hai gia' configurato Apache, puoi ispirarti al file "httpd.conf".
Mai configurato Apache. Ma è simile a xorg.conf?
--
Ciao Neo

 Ciao Neo

 per costruire il circuito.
L'interfaccia grafica che ti hanno suggerito altri è una buona idea solo
se sei già esperto in Qt, WxWidgets o quant'altro; se devi impararti
tutto per un esercizio, lascia stare - troppo lavoro (anche se utile).
Io userei un file di testo con un formato relativamente semplice per
dichiarare i componenti, secondo lo schema:
<Tipo> <Nome> <Valore>
Per esempio:
- ------------
Resistore R1 10
Induttore Ind1 4
Condensatore Cap3 0.2
- ------------
Implementare un parser non dovrebbe essere un'impresa difficile.
Poi, per implementare le connessioni, puoi definire una serie di
dichiarazioni tipo:
- ------------
Connessione R1-1 Cap3-2
- ------------
Per dire che il primo polo della resistenza è connesso al secondo polo
del condensatore.
In alternativa potresti usare iostream e presentare un menù testuale del
tipo:
1 - Aggiungi elemento
2 - Aggiungi connessione
3 - Risolvi
4 - Esci
con i vari sottomenù del caso.
Ovviamente non è un problema banale verificare che, una volta inseriti i
dati, il problema sia ben posto. Dovresti porre il problema in forma
matriciale e controllare che il determinante non sia zero (non mi
ricordo la procedura e sono troppo pigro per riprendere il mio libro di
elettrotecnica, ma mi ricordo che una procedura abbastanza gestibile c'è).
NOTA:
Questo approccio è abbastanza generale, però se hai una maglia sola come
dici, potrebbe bastare per convenzione partire da uno dei poli del
circuito e risalire fino all'altro, visto che (se ho capito bene) tutti
gli elementi sono allegramente in fila. Anzi, ora che ci penso è una
banalissima somma di impedenze, ti basta usare i numeri complessi,
creare un metodo «virtual complex componente::impedenza() const = 0»,
implementarlo per ogni sottoclasse, e sei a posto; quindi potresti anche
lasciare stare la parte delle connessioni.
Ciao,
- -Federico
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.5 (GNU/Linux)
Comment: Using GnuPG with SUSE - 
http://enigmail.mozdev.org
iD8DBQFIX2U7BIpu+y7DlLcRAgFsAKCwr1/ygTf5od1UovG9Dk4lKvEHUwCdGShe
hUcl5wB5CKISzo6H9gpxiH4=
=Hnts
-----END PGP SIGNATURE-----

   
Ti conviene vedere i formati delle netlist dei programmi di sbrogliatura.
In realtà il formato (quasi sempre testuale) è abbastanza semplice:
ogni 'filo' (net) viene nominato con un identificatore univoco (es: 
N000, Nxxx)
e ogni 'componenete' viene descritto da un blocco dati con i suoi  suoi 
attrubuti
(ad esempio i reofori o pin, ma anche molte altre proprietà ) specifici 
a cui fa capo
la net (il filo).
Se ti appoggi ad un formato standard di net, puoi disegnare la parte
grafica del circuito con un tools tipo ORCAd o CIRCAD(che e' gratuito).
Ti conviene crercare un formato di net list 'standard' e free
Ti allego un esempio di netlist (PCB orcad. Formato Proprietario) 
composta da:
1. Batteria
2. Un pulsante in serie
3. una Resistenza serie al pulsante
4. Un condensatore
-----
 ( 00000003 BATTERY BT1 BATTERY
  ( 1 N00022 )
  ( 2 N00005 )
 )
 ( 0000002D 10uF C1 10uF
  ( 1 N00012 )
  ( 2 N00022 )
 )
 ( 00000011 10K R1 10K
  ( 1 N00012 )
  ( 2 N00022 )
 )
 ( 0000004B PULSANTE SW1 PULSANTE
  ( 1 N00005 )
  ( 2 N00012 )
 )
)
Nell'  esempio i componenti sono descritti da blocchi racchiusi da tonde
che contengono i loro attributi: ogni pin del componenete è numerato e a
fianco riporta il nome del filo (net) a cui è collegato. Ad esempio la
resistenza (R1, 10KOhm) ha due pin 1 collegato al filo N0012 e il due
al filo N0022...........
Bye
brix

 conosci questo strumento perché dici che è "notevolmente complesso"?
Perchè conosco svariati strumenti analoghi. Fare una GUI che ti permetta
di disegnare un circuito (la cui rappresentazione poi passerai ad un
altro componente) è *indubbiamente* un compito che prende tempo. Ed è
indubbiamente qualcosa che non gli viene richiesto.
Oltretutto è piuttosto notorio che le GUI sono particolarmente 'ardue'
da testare, perchè il testing automatico diventa un problema. Questo,
per dire, lo dicono quelli di Adobe, fra gli altri. Buona parte dei
bachi nei loro sw, li trovano precisamente nelle GUI.
Per cui di fatto dovrebbe *comunque* scrivere un oggetto che processa
dei files di testo per potere testare il motore del programma senza
dannarsi. E a quel punto la GUI è qualcosa di non richiesto e non utile.
Deve solo fare un esame e mostrare che sa arrivarci in fondo.
-- 
-riko

 specifica struttura dati, anche perche' non e' stata ancora definita.
Certo. E' completamente sensato che tu suggerisca XML. E allo stesso
modo io posso ritenere che sia un po' eccessivo. Dopotutto è un gruppo
di discussione. :)
-- 
-riko

Grazie a tutti
valuterò con attenzione le proposte
--
Ciao Neo