Pages: 1 [2]   Go Down
Print
Author Topic: Calcoli Matematici  (Read 4100 times)
0 Members e 1 Utente non registrato stanno visualizzando questa discussione.
mafalda
Apprendista Forumista
**
Offline Offline

Posts: 430


CЯΣDΣЯCI SΣMPЯΣ, ΛЯЯΣПDΣЯSI MΛI!


« Reply #15 on: 23-06-2010, 14:43:07 »

Code:
confrontaInt( (Integer)x, (Integer)y);
confrontaInt( (Double)x, (Double)y);

Permettimi di dirti che così è ancora peggio, dato che io potrei confrontare un 3.5 con un 3...sempre numeri sono...

testate
Logged

...๔єςเ, ๔єςเ, ๔єςเ...
R3m
Apprendista Forumista
**
Offline Offline

Gender: Male
Posts: 486



« Reply #16 on: 23-06-2010, 14:45:36 »

senti, ascolta, prova a fare come dico io xD
implementa un semplicissimo long(o int) chiamato intero e un long/int chiamato decimale...è facilissimo xD
Logged

Ciò che è nostro è stato in campo sudato....ciò che vostro è stato in aula assegnato.
In serie B non sei mai stato perchè la prescrizione t'ha salvato.
aryanna
Apprendista Forumista
**
Offline Offline

Posts: 110



« Reply #17 on: 23-06-2010, 21:48:20 »

Vi posto anche il mio codice...
Code:
public class Numero<E> implements GenericNumber{
E valore;

public Numero(E valore){
this.valore=valore;
}
public E getVal(){
return valore;
}
// ritorna true se il valore dell'oggetto è un intero
public boolean isInteger(){
if (getVal() instanceof Integer) return true;
else return false;
}
// ritorna true se il valore è un numero in virgola mobile
public boolean isFloating(){
if (getVal() instanceof Double) return true;
else return false;
}
// assegna all'oggetto un valore intero pari a i
public void setValue(int i){
Integer tmp=i;
valore=(E) tmp;
}
// assegna all'oggetto un valore in virgola mobile pari a d
public void setValue(double d){
Double tmp=d;
valore=(E) tmp;
}
// ritorna il valore delloggetto, se è in virgola mobile,
// ritorna 0 altrimenti
public double getFloatingValue(){
Double d=(Double) valore;
double i=d.doubleValue();
if (isInteger())return 0;
else return i;
}
public int getIntValue(){
Integer d=(Integer) valore;
int i=d.intValue();
if (isFloating())return 0;
else return i;
}
// confronta il valore dell'oggetto
// con il valore del numero generico x
public boolean equals(GenericNumber x){
if (this.equals(x)) return true;
else return false;
}
// effettua la moltiplicazione con il numero generico x
// ritorna l'oggetto stesso
public GenericNumber mul(GenericNumber x){
Numero a=null;
if (x.isInteger() && this.isInteger()){
int tmp = getIntValue()*x.getIntValue();
a=new Numero(tmp);
}
if (x.isInteger() && this.isFloating()){
double tmp = getFloatingValue()*x.getIntValue();
a=new Numero(tmp);
}
if (x.isFloating() && this.isFloating()) {
double tmp = ((getFloatingValue())*x.getFloatingValue());
a=new Numero(tmp);
}
if (x.isFloating() && this.isInteger()){
double tmp = ((getIntValue())*x.getFloatingValue());
a=new Numero(tmp);
}
return a;
}
// divide il valore dell'oggetto per un numero generico x
// ritorna l'oggetto stesso
public GenericNumber div(GenericNumber x){
Numero a=null;
if (x.isInteger() && this.isInteger()){
int tmp = getIntValue()/x.getIntValue();
a=new Numero(tmp);
}
if (x.isInteger() && this.isFloating()){
double tmp = getFloatingValue()/x.getIntValue();
a=new Numero(tmp);
}
if (x.isFloating() && this.isFloating()) {
double tmp = ((getFloatingValue())/x.getFloatingValue());
a=new Numero(tmp);
}
if (x.isFloating() && this.isInteger()){
double tmp = ((getIntValue())/x.getFloatingValue());
a=new Numero(tmp);

}
return a;
}
// effettua l'addizione con il numero generico x
// ritorna l'oggetto stesso
public GenericNumber add(GenericNumber x){
Numero a=null;
if (x.isInteger() && this.isInteger()){
int tmp = getIntValue()+x.getIntValue();
a=new Numero(tmp);
}
if (x.isInteger() && this.isFloating()){
double tmp = getFloatingValue()+x.getIntValue();
a=new Numero(tmp);
}
if (x.isFloating() && this.isFloating()) {
double tmp = ((getFloatingValue())+x.getFloatingValue());
a=new Numero(tmp);
}
if (x.isFloating() && this.isInteger()){
double tmp = ((getIntValue())+x.getFloatingValue());
a=new Numero(tmp);
}
return a;
}
// sottrae al valore dell'oggetto il numero generico x
// ritorna l'oggetto stesso
public GenericNumber min(GenericNumber x){
Numero a=null;
if (x.isInteger() && this.isInteger()){
int tmp = getIntValue()-x.getIntValue();
a=new Numero(tmp);
}
if (x.isInteger() && this.isFloating()){
double tmp = getFloatingValue()-x.getIntValue();
a=new Numero(tmp);
}
if (x.isFloating() && this.isFloating()) {
double tmp = ((getFloatingValue())-x.getFloatingValue());
a=new Numero(tmp);
}
if (x.isFloating() && this.isInteger()){
double tmp = ((getIntValue())-x.getFloatingValue());
a=new Numero(tmp);
}
return a;
}
// converte il valore dell'oggetto in una stringa
public String toString(){
String tmp="";
return tmp+=valore;
}
}



se non è chiaro qualcosa chiedete
Logged

Rappresentante studenti Corso di Laurea in Informatica - arianna317@gmail.com

write once, run everywhere..
mafalda
Apprendista Forumista
**
Offline Offline

Posts: 430


CЯΣDΣЯCI SΣMPЯΣ, ΛЯЯΣПDΣЯSI MΛI!


« Reply #18 on: 26-06-2010, 15:25:06 »

Ok...tutto chiarissimo...grazie mille aryanna e anche r3m 
Logged

...๔єςเ, ๔єςเ, ๔єςเ...
mafalda
Apprendista Forumista
**
Offline Offline

Posts: 430


CЯΣDΣЯCI SΣMPЯΣ, ΛЯЯΣПDΣЯSI MΛI!


« Reply #19 on: 28-06-2010, 10:18:49 »

Qualcuno ha implementato il main?
Logged

...๔єςเ, ๔єςเ, ๔єςเ...
aryanna
Apprendista Forumista
**
Offline Offline

Posts: 110



« Reply #20 on: 29-06-2010, 16:16:10 »

Questo è il mio main...
Code:
import java.io.*;
import java.util.*;


public class main {
public static void main(String [] args) throws IOException{
Scanner in=null;
FileWriter out=null;
try{
in=new Scanner(new FileReader("input.txt"));
out= new FileWriter("output.txt");
while(in.hasNext()){
Numero [] A= new Numero [in.nextInt()];
String [] oper = new String [A.length-1];
byte k=0;
int i=0;
while(i<A.length){
if(in.hasNextInt()){
int n=in.nextInt();
A[i]= new Numero(n);
i++;
}
if (in.hasNextDouble() && i<A.length){
double nn=in.nextFloat();
A[i]=new Numero(nn);
i++;
}
if(in.hasNext()&& i<A.length){
oper[k]=in.next();
k++;
}
}
k=0;
Numero result=null;


for(int j=0; j<A.length-1 && k<oper.length;j++){
if (oper[k].equals("*")){
if(result==null)result= (Numero) A[j].mul((GenericNumber)A[j+1]);
else result= (Numero) (result.mul((GenericNumber)A[j+1]));
}
if (oper[k].equals("/")){
if(result==null)result= (Numero) A[j].div((GenericNumber)A[j+1]);
else result=(Numero) result.div((GenericNumber)A[j+1]);
}
if (oper[k].equals("+")){
if(result==null)result= (Numero) A[j].add((GenericNumber)A[j+1]);
else result=(Numero) result.add((GenericNumber)A[j+1]);
}
if (oper[k].equals("-")){
if(result==null)result= (Numero) A[j].min((GenericNumber)A[j+1]);
else result=(Numero) result.min((GenericNumber)A[j+1]);
}
k++;
}
if(result.isFloating()) out.write("(floating) ");
else out.write("(integer) ");
out.write(""+result+"\n");
}
}
catch(Exception e){
System.out.println("Errore "+e.getMessage());
}
finally{
if(in!=null) in.close();
if(out!=null) out.close();
}

}
}
al solito se non è chiaro qualcosa postate..
Logged

Rappresentante studenti Corso di Laurea in Informatica - arianna317@gmail.com

write once, run everywhere..
mafalda
Apprendista Forumista
**
Offline Offline

Posts: 430


CЯΣDΣЯCI SΣMPЯΣ, ΛЯЯΣПDΣЯSI MΛI!


« Reply #21 on: 30-06-2010, 09:13:47 »

Grazie aryanna...gentilissima come sempre!!!  ok
 ciao
Logged

...๔єςเ, ๔єςเ, ๔єςเ...
zElOtO
Forumista
***
Offline Offline

Gender: Male
Posts: 845



WWW
« Reply #22 on: 18-03-2011, 13:31:01 »

Qualcuno potrebbe postare per favore tutto l'esercizio svolto?  pray
Logged

I computer sono incredibilmente veloci, accurati e stupidi. Gli uomini sono incredibilmente lenti, inaccurati e intelligenti. Insieme sono una potenza che supera l'immaginazione. (A. Einstein)

Damiano Cancemi
www.damianocancemi.com
www.nerdbren.com
www.nerdbren.com/blog
zElOtO
Forumista
***
Offline Offline

Gender: Male
Posts: 845



WWW
« Reply #23 on: 28-04-2011, 14:39:45 »

Questo è il mio codice..va..ma non per tutte le righe.
Code:
import java.io.*;
import java.util.StringTokenizer;
interface GenericNumber {
// ritorna true se il valore dell'oggetto è un intero
public boolean isInteger();
// ritorna true se il valore è un numero in virgola mobile
public boolean isFloating();
// assegna all'oggetto un valore intero pari a i
public void setValue(int i);
// assegna all'oggetto un valore in virgola mobile pari a d
public void setValue(double d);
// ritorna il valore delloggetto, se è in virgola mobile, // ritorna 0 altrimenti
public double getFloatingValue();
// ritorna il valore dell'oggetto, se è un intero, 0 altrimenti
public int getIntValue();
// confronta il valore dell'oggetto // con il valore del numero generico x
public boolean equals(GenericNumber x);
// effettua la moltiplicazione con il numero generico x // ritorna l'oggetto stesso
public GenericNumber mul(GenericNumber x);
// divide il valore dell'oggetto per un numero generico x // ritorna l'oggetto stesso
public GenericNumber div(GenericNumber x);
// effettua l'addizione con il numero generico x // ritorna l'oggetto stesso
public GenericNumber add(GenericNumber x);
// sottrae al valore dell'oggetto il numero generico x // ritorna l'oggetto stesso
public GenericNumber min(GenericNumber x);
// converte il valore dell'oggetto in una stringa
public String toString();
}
public class CalcoliMatematici implements GenericNumber {
private String value;
public static void main(String args[]) throws IOException {
BufferedReader input = new BufferedReader(new FileReader("CalcoliMatematici.txt"));
BufferedWriter out = new BufferedWriter(new FileWriter("CalcoliMatematiciOutput.txt"));
String x;
while ((x = input.readLine()) != null) {
StringTokenizer st = new StringTokenizer(x);
int operandi = Integer.parseInt(st.nextToken());
CalcoliMatematici num1 = new CalcoliMatematici(), num2 = new CalcoliMatematici();
String token = "";
char operazione;
token = st.nextToken();
if (isInt(token)) { num1.setValue(getInt(token)); }
else { num1.setValue(getDouble(token)); }
for (int i = 0; i < operandi-1; i++) {
operazione = st.nextToken().charAt(0);
token = st.nextToken();
if (isInt(token)) { num2.setValue(getInt(token));}
else { num2.setValue(getDouble(token)); }
//System.out.print("Eseguo " + num1 + " " + operazione + " "+ num2 + " = ");
esegui(num1,operazione,num2);
//System.out.println(num1.toString());
}
if (num1.isInteger()) { out.write("(integer) "); }
else { out.write("(floating) "); }
out.write(num1.toString() + "\n");
}
input.close();
out.close();
}
private static GenericNumber esegui(CalcoliMatematici num1, char operazione , CalcoliMatematici num2) {
switch(operazione) {
case '+':
return num1.add(num2);
case '-':
return num1.min(num2);
case '*':
return num1.mul(num2);
case '/':
return num1.div(num2);
}
return num1;
}
public static boolean isInt(String x) {
for (int i = 0; i < x.length(); i++) {
if (x.charAt(i) == ',' || x.charAt(i) == '.') { return false; }
}
return true;
}
public static int getInt(String x) {
return Integer.parseInt(x);
}
public static double getDouble(String x) {
String res = "";
for (int i = 0; i < x.length(); i++) {
if (x.charAt(i) == ',') { res += "."; }
else { res += x.charAt(i); }
}
return Double.parseDouble(res);
}
public CalcoliMatematici() {
value = "0";
}
public boolean isInteger() {
for (int i = 0; i < value.length(); i++) {
if (value.charAt(i) == '.') { return false; }
}
return true;
}
public boolean isFloating() {
return !isInteger();
}
public void setValue(int i) {
value = Integer.toString(i);
}
public void setValue(double d) {
value = Double.toString(d);
}
public double getFloatingValue() {
if (!isInt(value)) { return getDouble(value); }
return 0;
}
public int getIntValue() {
if (isInt(value)) { return getInt(value); }
return 0;
}
public boolean equals(GenericNumber x) {
if (isInteger() && x.isInteger()) {
return getIntValue() == x.getIntValue();
}
else if (isInteger() && x.isFloating()) {
return getIntValue() == x.getFloatingValue();
}
else if (isFloating() && x.isInteger()) {
return getFloatingValue() == x.getIntValue();
}
else if (isFloating() && x.isFloating()) {
return getFloatingValue() == x.getFloatingValue();
}
return false;
}
public GenericNumber mul(GenericNumber x) {
if (isInteger() && x.isInteger()) {
setValue(getIntValue() * x.getIntValue());
}
else if (isInteger() && x.isFloating()) {
setValue(getIntValue() * x.getFloatingValue());
}
else if (isFloating() && x.isInteger()) {
setValue(getFloatingValue() * x.getIntValue());
}
else if (isFloating() && x.isFloating()) {
setValue(getFloatingValue() * x.getFloatingValue());
}
return this;
}
public GenericNumber div(GenericNumber x) {
if (isInteger() && x.isInteger()) {
setValue((double)(getIntValue() / x.getIntValue()));
}
else if (isInteger() && x.isFloating()) {
setValue((double)(getIntValue() / x.getFloatingValue()));
}
else if (isFloating() && x.isInteger()) {
setValue((double)(getFloatingValue() / x.getIntValue()));
}
else if (isFloating() && x.isFloating()) {
setValue((double)(getFloatingValue() / x.getFloatingValue()));
}
return this;
}
@Override
public GenericNumber add(GenericNumber x) {
if (isInteger() && x.isInteger()) {
setValue(getIntValue() + x.getIntValue());
}
else if (isInteger() && x.isFloating()) {
setValue(getIntValue() + x.getFloatingValue());
}
else if (isFloating() && x.isInteger()) {
setValue(getFloatingValue() + x.getIntValue());
}
else if (isFloating() && x.isFloating()) {
setValue(getFloatingValue() + x.getFloatingValue());
}
return this;
}
public GenericNumber min(GenericNumber x) {
if (isInteger() && x.isInteger()) {
setValue(getIntValue() - x.getIntValue());
}
else if (isInteger() && x.isFloating()) {
setValue(getIntValue() - x.getFloatingValue());
}
else if (isFloating() && x.isInteger()) {
setValue(getFloatingValue() - x.getIntValue());
}
else if (isFloating() && x.isFloating()) {
setValue(getFloatingValue() - x.getFloatingValue());
}
return this;
}
public String toString(){
return value;
}
}
Questo è l'OUTPUT:
(floating) 2584.5503448275863
(integer) -92240
(integer) -56
(floating) 219.4147903726708

(floating) 36.0
(floating) 0.020544427324088343

(floating) -47994.549999999996
(floating) -45.0

Quelli in rosso sono quelli errati.
Il problema sta se nella divisione di un intero con un intero vi è resto resto, ovvero se num1%num2 == 1
Ad esempio 37/27=1.3703703704 a me lo segna come 1, nonostante nel metodo della divisione abbia fatto un casting a double della divisione.

EDIT: Risolto. Ho solamente aggiunto un piccolo controllo:
Code:
if (getIntValue() % x.getIntValue() == 0) { setValue((double)(getIntValue() / x.getIntValue())); }
else { setValue((double)((double)getIntValue() / x.getIntValue())); }
Vedi la soluzione.
« Last Edit: 28-04-2011, 16:44:50 by zElOtO » Logged

I computer sono incredibilmente veloci, accurati e stupidi. Gli uomini sono incredibilmente lenti, inaccurati e intelligenti. Insieme sono una potenza che supera l'immaginazione. (A. Einstein)

Damiano Cancemi
www.damianocancemi.com
www.nerdbren.com
www.nerdbren.com/blog
Pages: 1 [2]   Go Up
Print
Jump to: