• Regolamento Macrocategoria DEV
    Prima di aprire un topic nella Macrocategoria DEV, è bene leggerne il suo regolamento. Sei un'azienda o un hosting/provider? Qui sono anche contenute informazioni per collaborare con Sciax2 ed ottenere l'accredito nella nostra community!

[Open Source] C - Calcolatore di BMI

rolandoz

Utente Attivo
Autore del topic
15 Settembre 2012
283
31
Miglior risposta
0
Salve a tutti ragazzi, volevo presentarvi questo software Open Source creato interamente da me. Sono consapevole che sono presenti numerose versioni di software simili (anche sviluppate in altri linguaggi) e per questo me ne scuso, ma essendo alle prime armi nella programmazione in C ho deciso di partire con qualcosa di "semplice".

Il Body Mass Index o BMI corrisponde all'indice di massa corporea, un numero che esprime la relazione tra il peso di una persona e la sua altezza e permette di stabilire quanto il nostro peso sia al disopra o al disotto della giusta proporzione. Storicamente deriva dal cosiddetto Indice di Quetelet descritto nel 1832 dal poliedrico matematico belga Adolphe Quetelet.

Questo software non è da considerarsi veritiero al 100% ma è in grado di fornire una valutazione generale sulla complessiva massa corporea. E' comunque consigliabile recarsi presso un personale esperto per effettuare dei test specifici e maggiormente dettagliati.

In seguito vi rilascio il codice sorgente visualizzabile su Paste Bin, la scansione Virus Total che non so perchè ma mi da due virus (suppongo siano dei falsi positivi perchè come potete vedere dal codice virus non ce ne sono!) e il download del pacchetto .rar contentente il file .exe e la licenza relativa al software.

Non so il motivo ma ogni tanto il programma (quando ha finito di eseguirsi) si chiude da solo senza errori. Il motivo non riesco a capirlo per questo aspetto i vostri consigli! >_>

j7xa0z.jpg


Source:
Perfavore, Entra oppure Registrati per vedere i Link!

Scansione:
Perfavore, Entra oppure Registrati per vedere i Link!

Download:
Perfavore, Entra oppure Registrati per vedere i Link!

 
Ultima modifica:
Riferimento: [Open Source] C - Calcolatore di BMI

Vedendolo solo come un esercizio ci sono almeno un paio di consigli generali che sarebbe meglio assimilare:

  • Controllo sui caratteri e numeri negativi attraverso un ciclo (loop) o con un semplice return 1;
  • La libreria stdlib.h, in questo caso, non ti serve proprio a niente e quindi è decisamente meglio farne a meno;
  • Potresti almeno risparmiare la variabile potenza in un programma così semplice, è un'inutile spreco di memoria.

EDIT:
Dimenticavo, l'uscita immediata del programma è del tutto normale se esegui direttamente l'eseguibile perché di fatto non c'è nessun artifizio per bloccarne l'esecuzione.
 
Ultima modifica:
Riferimento: [Open Source] C - Calcolatore di BMI

Vedendolo solo come un esercizio ci sono almeno un paio di consigli generali che sarebbe meglio assimilare:

  • Controllo sui caratteri e numeri negativi attraverso un ciclo (loop) o con un semplice return 1;
  • La libreria stdlib.h, in questo caso, non ti serve proprio a niente e quindi è decisamente meglio farne a meno;
  • Potresti almeno risparmiare la variabile potenza in un programma così semplice, è un'inutile spreco di memoria.

EDIT:
Dimenticavo, l'uscita immediata del programma è del tutto normale se esegui direttamente l'eseguibile perché di fatto non c'è nessun artifizio per bloccarne l'esecuzione.
@Scanetatore Ti ringrazio, cercherò di migliorare sicuramente i punti che mi hai esposto. Per quanto riguarda l'uscita immediata del programma come potrei fare per bloccarne l'esecuzione? Grazie mille! ;)
 
Riferimento: [Open Source] C - Calcolatore di BMI

@Scanetatore Ti ringrazio, cercherò di migliorare sicuramente i punti che mi hai esposto. Per quanto riguarda l'uscita immediata del programma come potrei fare per bloccarne l'esecuzione? Grazie mille! ;)
Ci sono vari metodi utilizzati. Uno dei più usati, in ambiente Windows, è sicuramente
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!
O una semplice variante pensata da me, sicuramente non sono l'unico, che sfrutta proprio la sintassi del CMD di Windows, visto che system() ci permette di inviare un comando vero e proprio:
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!
Altrimenti un metodo multipiattaforma e leggero (non devi includere l'header dedicato a Windows) è quello di chiedere un nuovo input (fasullo ovviamente):
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!
Visto che la libreria windows.h risulta molto dispendiosa è consigliabile,
Perfavore, Entra oppure Registrati per vedere i Link!
, rimuovere API che in questo caso non servono con:
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!
 
Riferimento: [Open Source] C - Calcolatore di BMI

Ci sono vari metodi utilizzati. Uno dei più usati, in ambiente Windows, è sicuramente
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!
O una semplice variante pensata da me, sicuramente non sono l'unico, che sfrutta proprio la sintassi del CMD di Windows, visto che system() ci permette di inviare un comando vero e proprio:
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!
Altrimenti un metodo multipiattaforma e leggero (non devi includere l'header dedicato a Windows) è quello di chiedere un nuovo input (fasullo ovviamente):
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!
Visto che la libreria windows.h risulta molto dispendiosa è consigliabile,
Perfavore, Entra oppure Registrati per vedere i Link!
, rimuovere API che in questo caso non servono con:
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!


allora la cosa che puoi usare la chiamata system() usando windows.h (tale funzione è assente in windows.h) bensì esiste nel header stdio.h

2) la librerie windows.h è dispensiosa (mah un header di 2,80kb strutturato anche bene x giunta ) ... e per rimuovere le API devi creare una macro :emoji_relieved: :emoji_relieved: :emoji_relieved: #define è una direttiva ,appunto rappresenta la funzione di preprocessore e serve per assegnare un determinato dato costante a un nome (può anche ricevere argomenti xo) :

Esempio banale:
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

come vedi sostituisce la costante && (che rappresenta l'and) con la parola and !! informati per lo meno patpat
 
Ultima modifica:
Riferimento: [Open Source] C - Calcolatore di BMI

allora la cosa che puoi usare la chiamata system() usando windows.h (tale funzione è assente in windows.h) bensì esiste nel header stdio.h

2) la librerie windows.h è dispensiosa (mah un header di 2,80kb strutturato anche bene x giunta ) ... e per rimuovere le API devi creare una macro :emoji_relieved: :emoji_relieved: :emoji_relieved: #define è una direttiva ,appunto rappresenta la funzione di preprocessore e serve per assegnare un determinato dato costante a un nome (può anche ricevere argomenti xo) :

Esempio banale:
Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

come vedi sostituisce la costante && (che rappresenta l'and) con la parola and !! ma prima di scrivere st..... informati per lo meno patpat

Ti ringrazio per avermi corretto su Windows.h, non usavo system() da molto tempo e mi son confuso. ^^ Per quando riguarda le istruzioni microprocessore so esattamente cosa sono e come si usano, non capisco cosa c'entri l'esempio con quanto scritto da me però. Riportavo proprio la pagina della Microsoft per approfondire nel caso volesse disabilitare funzionalità aggiuntive.

Per quanto riguarda la formazione sono diplomato in Informatica e sto studiando quest'ultima all'università, anche il linguaggio C quindi.

EDIT:
Se pensi che abbia confuso il #define, invece, ti sbagli e ti invito a leggere sempre il link che ho riportato, oltre a scrivere un'applicazione in questo modo notando la riduzione del peso dell'eseguibile e dei tempi di esecuzione con un debugger.
 
Ultima modifica:
Riferimento: [Open Source] C - Calcolatore di BMI

Ti ringrazio per avermi corretto su Windows.h, non usavo system() da molto tempo e mi son confuso. ^^ Per quando riguarda le istruzioni microprocessore so esattamente cosa sono e come si usano, non capisco cosa c'entri l'esempio con quanto scritto da me però. Riportavo proprio la pagina della Microsoft per approfondire nel caso volesse disabilitare funzionalità aggiuntive.

Per quanto riguarda la formazione sono diplomato in Informatica e sto studiando quest'ultima all'università, anche il linguaggio C quindi.


ah bene , beato te, che studi all'università informatica, e per questo quando hai visto #define : dovresti sapere che non può eliminare un API di windows , cmq essendo una libreria una qualcosa che non può modificarsi (in quanto non siamo in programmazione OOP) non vedo una soluzione come eliminare tali funzioni , cioè dico ammenochè non apri l'header e modifichi tu manualmente non si può fà! #define come detto serve solo per creare macro o rappresentazioni di dati costanti :

questo è tratto dal sito :
#define _WIN32_WINNT 0x0502 definisce il codice 0x0502 di una chiamata (non so quale)

quindi equivale a scrivere una "costante" in questo caso (ho messo costante tra virgolette in quanto non è proprio così) cioe una direttiva #define non può eliminare funzioni da una libreria!
se usassimo cwindows del C++ potremmo modificare i membri poliformici ! è quello che volevo dire :emoji_smiley: , con quello esempio!
N.b proprio perché stai all'università potresti evitare di scrivere che un pre processore elimina dalla libreria windows.h( statica per giunta xk importa da altre librerie) delle funzioni o API il link postato non parla per niente di come eliminare API da tale libreria !
 
Riferimento: [Open Source] C - Calcolatore di BMI

Vi ringrazio per le innumerevoli risposte, correggerò immediatamente il programma e cercherò di postarlo il prima possibile alla nuova versione!
 
Riferimento: [Open Source] C - Calcolatore di BMI

ah bene , beato te, che studi all'università informatica, e per questo quando hai visto #define : dovresti sapere che non può eliminare un API di windows , cmq essendo una libreria una qualcosa che non può modificarsi (in quanto non siamo in programmazione OOP) non vedo una soluzione come eliminare tali funzioni , cioè dico ammenochè non apri l'header e modifichi tu manualmente non si può fà! #define come detto serve solo per creare macro o rappresentazioni di dati costanti :

questo è tratto dal sito :
#define _WIN32_WINNT 0x0502 definisce il codice 0x0502 di una chiamata (non so quale)

quindi equivale a scrivere una "costante" in questo caso (ho messo costante tra virgolette in quanto non è proprio così) cioe una direttiva #define non può eliminare funzioni da una libreria!
se usassimo cwindows del C++ potremmo modificare i membri poliformici ! è quello che volevo dire :emoji_smiley: , con quello esempio!
N.b proprio perché stai all'università potresti evitare di scrivere che un pre processore elimina dalla libreria windows.h( statica per giunta xk importa da altre librerie) delle funzioni o API il link postato non parla per niente di come eliminare API da tale libreria !
Scrivevo in maniera molto semplice per un neofita, non gli serve conoscere adesso come funziona un programma interamente. Scusa, ma che #define hai riportato? Non è certo quello che avevo scritto io e a cui mi riferivo. Vai al paragrafo "Faster Builds with Smaller Header Files" e noterai
Define WIN32_LEAN_AND_MEAN to exclude APIs such as Cryptography, DDE, RPC, Shell, and Windows Sockets.
#define WIN32_LEAN_AND_MEAN
Come ho detto se non sei d'accordo devi dirlo alla Microsoft, al linguaggio e al compilatore. Se provi a scrivere un programma in questo modo lo analizzi con strumenti appositi noterai, giustamente, la differenza. In ogni caso io di certo non sono onnisciente, infatti sbaglio come tutti ed è dimostrato col mio errore sulla libreria, ma mi baso sempre sui fatti che puoi verificare tu stesso.

Ovviamente per rimuovere intendevo escludere in senso di sinonimo, so di cosa sto parlando e, ancora, basta leggere le argomentazioni che ho portato. In base a cosa ho riportato, non a caso.

Vi ringrazio per le innumerevoli risposte, correggerò immediatamente il programma e cercherò di postarlo il prima possibile alla nuova versione!
Mi scuso per l'OT, noto che purtroppo non sta prendendo una piega troppo costruttiva.
 
Riferimento: [Open Source] C - Calcolatore di BMI

Come ho detto se non sei d'accordo devi dirlo alla Microsoft, al linguaggio e al compilatore. Se provi a scrivere un programma in questo modo lo analizzi con strumenti appositi noterai, giustamente, la differenza. In ogni caso io di certo non sono onnisciente, infatti sbaglio come tutti ed è dimostrato col mio errore sulla libreria, ma mi baso sempre sui fatti che puoi verificare tu stesso.

Ovviamente per rimuovere intendevo escludere in senso di sinonimo, so di cosa sto parlando e, ancora, basta leggere le argomentazioni che ho portato. In base a cosa ho riportato, non a caso.

ah si , hai ragione xo non sei stato x niente chiaro ho dovuto aprire l'header (volevo sapere il xk l'escludeva altrimenti usare #define così significa come dicevo io :P) invece c'è la direttiva #ifndef x tanto chiedo scusa :emoji_smiley: , hai RAGIONE !!!

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

me lo potevi dire da prima che controllava se era definita #ifndef WIN32_LEAN_AND_MEAN aggiungeva solo quello e non il resto , sul link postato c'è scritto solo definirla ma non il perché e io quello volevo capì solo che non me lo dicevi ... ho dovuto aprire l'header alla fine x capirlo , cmq discussione costruttiva anche se siamo andati un pò in OT!
 
Riferimento: [Open Source] C - Calcolatore di BMI

ah si , hai ragione xo non sei stato x niente chiaro ho dovuto aprire l'header (volevo sapere il xk l'escludeva altrimenti usare #define così significa come dicevo io :P) invece c'è la direttiva #ifndef x tanto chiedo scusa :emoji_smiley: , hai RAGIONE !!!

Codice:
Perfavore, Entra oppure Registrati per vedere i codici!

me lo potevi dire da prima che controllava se era definita #ifndef WIN32_LEAN_AND_MEAN aggiungeva solo quello e non il resto , sul link postato c'è scritto solo definirla ma non il perché e io quello volevo capì solo che non me lo dicevi ... ho dovuto aprire l'header alla fine x capirlo , cmq discussione costruttiva anche se siamo andati un pò in OT!
Anche qui un'altra mia dimenticanza, avrei infatti potuto riportare direttamente il codice, giuro che non c'ho pensato. xD Allora ti ringrazio nuovamente per la tua correzione e alla fine, hai ragione, è venuto fuori qualcosa d'interessante dai. :emoji_slight_smile:
 
Riferimento: [Open Source] C - Calcolatore di BMI

C'è anche chi usa la getch() per evitare che il programma si chiuda immediatamente, ma non è molto consigliata..
Per le variabili io personalmente preferisco dichiate tutte quelle dello stesso tipo insieme (in questo caso float kg, statura, potenza, calcolo;), ma comunque non è che cambi qualcosa. :emoji_relieved:
Invece come ti hanno già detto la variabile potenza è inutile, puoi fare direttamente calcolo = kg/(statura*statura);