|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Mar 2010
Messaggi: 5
|
[C]Problema di conversione da stringa a double
Buongiorno a tutti,in questo periodo mi sono dedicato all'apprendimento del C e vorrei riuscire a fare un programma completo che racchiuda tutto cio che bene o male ho letto.
Ho quindi deciso di impormi come obbiettivo la realizzazione di una calcolatrice scientifica e di costruirla e aggiungergli funzioni passo passo. Ora come ora sono passato dai semplici calcoli con 2 operandi a calcoli con un numero variabile di essi;ma nella funzione(di estrapolazione degli operandi degli operatori) che ho fatto non ho una regolare trasformazione tra caratteri e valore double,visto che,nonostante abbia messo dei controlli prende anche i caratteri(come + che vale 48)e li aggiunge ai valori numerici. Io lavoro col dev C++ su windows e qui c'è il mio file sorgente. ringrazio in anticipo per i chiarimenti |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Nov 2009
Messaggi: 57
|
non ho capito...xD
|
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Mar 2010
Messaggi: 5
|
allora mi spiego,il puntatore alla stringa che usavo nel ciclo non puntava a un solo valore della stringa ma puntava stranamente alla somma di 2 valori della stringa stessa,cioè:
stringa[0]=9; stringa[1]=8; p=stringa; dopo questo *p sarebbe dovuto essere uguale a 9 invece io avevo *p era uguale a 17 perchè mi contava i valori a 2 a 2 e non sapevo perchè. insomma era *p=stringa[0]+stringa[1]. Alla fine ho risolto ricopiando in un altro sorgente e ricompilando,era un errore del dev c++. |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
Quote:
Codice:
#include <iostream>
using namespace std;
int main() {
cin.exceptions(ios::failbit | ios::badbit);
try {
while (true) {
double fFirstOperand, fSecondOperand;
char chOperator;
cin >> fFirstOperand >> ws >> chOperator >> fSecondOperand;
switch (chOperator) {
case '+':
cout << " = " << (fFirstOperand + fSecondOperand) << endl;
break;
case '-':
cout << " = " << (fFirstOperand - fSecondOperand) << endl;
break;
case '*':
cout << " = " << (fFirstOperand * fSecondOperand) << endl;
break;
case '/':
cout << " = " << (fFirstOperand / fSecondOperand) << endl;
break;
default:
cout << "operatore non valido" << endl;
break;
}
}
} catch (ios::failure&) {
cerr << "input non valido" << endl;
}
return 0;
}
|
|
|
|
|
|
|
#5 | |
|
Junior Member
Iscritto dal: Mar 2010
Messaggi: 5
|
dici che mi conviene studiare il c++ umh...ci posso provare se non sbaglio vi è un tutorial su wikivideo,casomai puoi consigliarmi un testo completo(in italiano)?
dopo aver studiato il c++(domanda niubba)posso creare un progetto usando entrambi i linguaggi? P.S: Quote:
questa calcolatrice anche in C è banalissima perchè riceve in imput solo 2 operandi,l'ho gia realizzata con successo implementando oltre alle semplici 4 operazioni anche potenza,radice,seno e altre funzioni matematiche,ora come ora stavo ricominciando da capo proponendomi obbiettivi più ampi,per iniziare:ricevere in imput un numero di operandi variabile,poi riconoscere le priorità delle parentesi e cosi via. Ultima modifica di pspmaniaco : 25-03-2010 alle 15:14. |
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
ah be', se puoi scegliere il linguaggio da studiare a quel punto ti direi direttamente C#
se ti ho detto C++ é perché tutte le volte che vedo un programma in C penso "ma perché la gente sviluppa ancora in C? ma non vedono quanto viene piu semplice in C++?" peró se hai totale libertá di scelta il C# costituisce un compromesso di semplicitá, potenza e applicabilitá ineccepibile, e tra l'altro ha un'evoluzione molto piu rapida del C++. qui c'é la guida in italiano del linguaggio: http://msdn.microsoft.com/it-it/library/67ef8sbd.aspx ma ti consiglio di abituarti all'inglese. qui invece puoi scaricare Visual C# 2008 Express (gratis e legale): http://www.microsoft.com/express/Dow...2008-Visual-CS |
|
|
|
|
|
#7 |
|
Junior Member
Iscritto dal: Mar 2010
Messaggi: 5
|
grz dell'aiuto,in verità io ero propenso allo studio del C perchè con opportune modifiche era possibile applicarlo anche alla psp(mi sarebbe piaciuto lavorarci un o su),quindi il C lo continuerò a usare ma seguirò il tuo consiglio e studierò il C#(e anche il c++ se ho tempo).
P.S:mi resta cmq una domanda è possibile lavorare con più linguaggi in un solo progetto? |
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
ok, effettivamente con operandi multipli e con le parentesi viene un tantino piu complessa
![]() Codice:
#include <iostream>
#include <string>
using namespace std;
class skip {
private:
const string m_str;
public:
skip(string a_str)
:
m_str(a_str) {
}
skip(char ch)
:
m_str(1, ch) {
}
istream &operator () (istream &ris) {
for (string::const_iterator i = m_str.begin(); i != m_str.end(); i++) {
char ch;
ris >> ch;
if (ch != *i) {
ris.setstate(ios::failbit);
return ris;
}
}
return ris;
}
};
char Peek();
istream &operator >> (istream&, skip);
double EvaluateSubExpression();
double EvaluateFirstOperand();
double EvaluateExpression(char);
char Peek() {
return (cin >> ws).peek();
}
istream &operator >> (istream &ris, skip s) {
return s(ris);
}
double EvaluateSubExpression() {
cin >> ws >> skip("(");
return EvaluateExpression(')');
}
double EvaluateFirstOperand() {
if (Peek() != '(') {
double f;
cin >> f;
return f;
} else {
return EvaluateSubExpression();
}
}
double EvaluateExpression(char chTerminator) {
double fFirstOperand = EvaluateFirstOperand();
char ch;
cin >> ws >> ch;
switch (ch) {
case '+':
return fFirstOperand + EvaluateExpression(chTerminator);
case '-':
return fFirstOperand - EvaluateExpression(chTerminator);
case '*':
return fFirstOperand * EvaluateExpression(chTerminator);
case '/':
return fFirstOperand / EvaluateExpression(chTerminator);
default:
cin.putback(ch);
cin >> skip(chTerminator);
return fFirstOperand;
}
}
int main() {
cin.exceptions(ios::failbit | ios::badbit);
try {
while (true) {
cout << "\t" << EvaluateExpression('=') << endl;
}
} catch (ios::failure &e) {
cerr << "input non valido" << endl;
}
return 0;
}
l'ho sviluppata seguendo questa sintassi: Codice:
expression ::= first-operand [OPERATOR expression]
first-operand ::= NUMBER |
sub-expression
sub-expression ::= '(' expression ')'
__________________
3D Volley Demo (Facebook) | Reversi (Facebook) | Blockout (Facebook) | Puzzle15 (Facebook) Ultima modifica di fero86 : 25-03-2010 alle 16:40. |
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
questa domanda posta cosi in generale non ha senso; spesso é possibile, ma dipende dalle tecnologie che usi. per esempio se lavori in .NET é possibile creare un programma scritto in piu d'uno dei linguaggi della piattaforma (C#, Basic, F#, Managed C++), ed inoltre é possibile che quel programma usi una DLL scritta in qualunque altro linguaggio.
|
|
|
|
|
|
#10 | |
|
Junior Member
Iscritto dal: Mar 2010
Messaggi: 5
|
Quote:
|
|
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Oct 2006
Città: Roma
Messaggi: 1383
|
riesumo il topic per di che oggi ho avuto tempo di scrivere in C++ una calcolatrice per le quattro operazioni che rispetta l'ordine di precedenza degli operatori e ammette anche le parentesi tonde:
Codice:
#include <iostream>
using namespace std;
char Peek();
void Skip(char ch);
double EvaluateOperand();
double EvaluateProduct();
double EvaluateExpression();
int main() {
cin.exceptions(ios::failbit | ios::eofbit | ios::badbit);
try {
while (true) {
cout << '\t' << EvaluateExpression() << endl;
Skip('=');
}
} catch (const ios::failure&) {
cerr << "invalid input." << endl;
}
return 0;
}
char Peek() {
return (cin >> ws).peek();
}
void Skip(char ch) {
if (Peek() != ch) {
cin.setstate(ios::failbit);
}
cin.get();
}
double EvaluateOperand() {
if (Peek() != '(') {
double f;
cin >> f;
return f;
} else {
cin.get();
double f = EvaluateExpression();
Skip(')');
return f;
}
}
double EvaluateProduct() {
double f = EvaluateOperand();
char ch = Peek();
if (ch == '*') {
cin.get();
return f * EvaluateProduct();
} else if (ch == '/') {
cin.get();
return f / EvaluateProduct();
} else {
return f;
}
}
double EvaluateExpression() {
double f = EvaluateProduct();
char ch = Peek();
if (ch == '+') {
cin.get();
return f + EvaluateExpression();
} else if (ch == '-') {
cin.get();
return f - EvaluateExpression();
} else {
return f;
}
}
é basata su questa sintassi: Codice:
expression ::= product [ ( '+' | '-' ) expression ]
product ::= operand [ ( '*' | '/' ) product ]
operand ::= VALUE |
sub-expression
sub-expression ::= '(' expression ')'
spero sia utile. |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 02:47.





















