Sti9nsky Skrevet 28. februar 2007 Del Skrevet 28. februar 2007 (endret) Gidder noen å titte over metoden min? Sliter litt med det matematiske, siden det er 10 år siden jeg satt på skolebenken. ( for sent å ta forkurs nå ) <sukk> Oppgaven lyder: "Write an application that reads a nonnegative integer and computes and prints its factorial" Factorial: n! = n * ( n - 1) * ( n -2 ) * ( n -3 ) * ... * 1 La oss bruke 5! = 5 * 4 * 3 * 2 * 1 = 120 ( fint rundt tall å bruke som eksempel) Her er metoden: Klikk for å se/fjerne innholdet nedenfor public int calculateInputValue() { i = inputValue; // set "i" = inputValue (making shorter code) // creating loop. while ( ( i - fact ) >= 0 ) // { if ( i >= 1 ) { result = i * ( i - fact ); fact++; } else if ( i == 0 ) result = 1; } // end loop return result; } // end method calculateInputValue Jeg har initialisert fact = 1; Jeg har stirra meg blind nå, så det er stor sjangs for at jeg ikke ser det åpenbare. Er det noen som tilfeldigvis har gjort samme oppgaven? Så kan vi sammenligne? Går på NKI nettskolen Java 1. Endret 28. februar 2007 av Sti9nsky Lenke til kommentar
pertm Skrevet 28. februar 2007 Del Skrevet 28. februar 2007 (endret) Klikk for å se/fjerne innholdet nedenfor public int calculateInputValue() { i = inputValue; // set "i" = inputValue (making shorter code) // creating loop. while ( ( i - fact ) >= 0 ) // { if ( i >= 1 ) { result = i * ( i - fact ); fact++; } else if ( i == 0 ) result = 1; } // end loop return result; } // end method calculateInputValue Jeg har initialisert fact = 1; 8044307[/snapback] Det første jeg ser er at du burde ha muligheten med 0 som faktisk er definert til at 0! = 1. jeg ville skrevet betingelsen i while setninga til while( i >= fact) som bare gjør det enklere Jeg kunne ikke dy meg så jeg skrev en liten kodesnutt som vel er litt mer efektiv Klikk for å se/fjerne innholdet nedenfor public int Facultet(int facultet) { if (facultet < 0) return -1;//feil if (facultet <= 1) return 1;//ved 0 og 1 return facultet* Facultet(facultet-1);//rekusiv metodekall } La inn en til nå uten rekursiv public int Facultet2(int facultet) { int i,result; if(facultet<0) return -1; result=1; for(i=0;i++;i<=facultet) result*=i; return result; } Men jeg har ikke oppgaven Endret 28. februar 2007 av pertm Lenke til kommentar
Sti9nsky Skrevet 28. februar 2007 Forfatter Del Skrevet 28. februar 2007 Takk for innspill: Jeg har nå også skrevet denne varianten som jeg trodde skulle få det til å fungere: public int fact(int i) { if ( i <= 1 ) result = 1; else result = i * fact( i - 1 ); return result; } // end method calculateInputValue Lenke til kommentar
Sti9nsky Skrevet 28. februar 2007 Forfatter Del Skrevet 28. februar 2007 Klikk for å se/fjerne innholdet nedenfor public int calculateInputValue() { i = inputValue; // set "i" = inputValue (making shorter code) // creating loop. while ( ( i - fact ) >= 0 ) // { if ( i >= 1 ) { result = i * ( i - fact ); fact++; } else if ( i == 0 ) result = 1; } // end loop return result; } // end method calculateInputValue Jeg har initialisert fact = 1; 8044307[/snapback] Det første jeg ser er at du burde ha muligheten med 0 som faktisk er definert til at 0! = 1. jeg ville skrevet betingelsen i while setninga til while( i >= fact) som bare gjør det enklere Jeg kunne ikke dy meg så jeg skrev en liten kodesnutt som vel er litt mer efektiv Klikk for å se/fjerne innholdet nedenfor public int Facultet(int facultet) { if (facultet < 0) return -1;//feil if (facultet <= 1) return 1;//ved 0 og 1 return facultet* Facultet(facultet-1);//rekusiv metodekall } La inn en til nå uten rekursiv public int Facultet2(int facultet) { int i,result; if(facultet<0) return -1; result=1; for(i=0;i++;i<=facultet) result*=i; return result; } Men jeg har ikke oppgaven 8044557[/snapback] Takk for den også, men vi har ikke "lært" for... do ... osv. Må forholde meg til While og if...else. Lenke til kommentar
Sti9nsky Skrevet 28. februar 2007 Forfatter Del Skrevet 28. februar 2007 (endret) 1000 takk igjen, men nå må jeg ta en liten pause. Øya går i kryss, og nesa er altfor nærme skjermen.. LOL Her er hele koden en så lenge. Tror jeg har modifisert den for mye nå. Jeg kan kun bruke "While" og "if...else". Ikke for, do, case...break osv. (neste kapittel) Programmet fungerer, men ikke utregningene. Klikk for å se/fjerne innholdet nedenfor public class ToToA { // create Scanner to obtain input from user: Scanner input = new Scanner( System.in ); // set ints hidden (and initialize) private int result = 0; private int i = 0; // starting method public int getInputValue() { System.out.print( "\n Please enter a nonnegative value to calculate: " ); // prompt user // keep asking until input is a nonnegative value while ( ( i = input.nextInt() ) < 0 ) { System.out.print( "\n Invalid value. (Value must be positive or zero) \n" + " Try again: " ); // error message) } return i; } // end method getInputValue public int calcInputValue(int i) { while ( i >= 0 ) { if ( i <= 1 ) { result = 1; } else { result = i * calcInputValue( i - 1 ); } } // end while return result; } // end int/(method) calcInputValue // creating method to display result public void displayResult() { System.out.printf( "\n Factorial result is: %d \n", result ); // Result message to user } // end method displayResult // starting main method: public static void main( String args[] ) { // Print starting message to user: System.out.print( "\n This program calculates the factorial of entered value\n "); // creating a new object ToToA calc = new ToToA(); // call objects methods: calc.getInputValue(); // REM: calc.calcInputValue(); calc.displayResult(); } // end main method } // end class ToToA <ute og tar en sigg> RED: Jeg har løst det! Måtte bare endre litt i display-metoden: public static int fac(int i) { if ( i > 1 ) return i * fac( i - 1 ); else return 1; } // end fac // creating method to display result public void displayResult() { System.out.printf( "\n Factorial result is: " + fac( i ) + "\n" ); // Result message to user } // end method displayResult Endret 28. februar 2007 av Sti9nsky Lenke til kommentar
pertm Skrevet 28. februar 2007 Del Skrevet 28. februar 2007 (endret) 1000 takk igjen, men nå må jeg ta en liten pause. Øya går i kryss, og nesa er . public int calcInputValue(int i) { while ( i >= 0 ) { if ( i <= 1 ) { result = 1; } else { result = i * calcInputValue( i - 1 ); } } // end while return result; } // end int/(method) calcInputValue 8044792[/snapback] Her det linja du sier result = i * calcInputValue( i - 1 ); som er problemmet du kaller metoden rekusivt, det er greit å gjøre, men da må du kutte ut while og bruke return. Jeg tenker dette er noe du kommer til senere. Det du får blir for feks 5 gir svar 5! * 5! * 3! * 2! * 1! noe som blir feil public int calcInputValue(int i) { if(i<0) result = -1;//feil i verdi else result = 1://setter en startverdi int teller = 0; whlie(teller<=i)//så lenge teller er mindre eller lik i { result *= teller;//eller result = result * teller; teller++;//Øker teller med 1 } return result; } //Denne kode starter med 1*2*3*4*5*6*.. osv Endret 28. februar 2007 av pertm Lenke til kommentar
Sti9nsky Skrevet 28. februar 2007 Forfatter Del Skrevet 28. februar 2007 Oppgaven ble løst. Men takk for flere eksempler. Ganske mange måter å gjøre denne oppgaven på også gett... Noen som har gjort oppgavene i Deitel & Deitel oppgave 4.38 a, b og c? (6. utgave av boka) Dette var oppgave a. pertm: En annen utfordring: "Write an application that estimates the value of the mathematical constant e by using the formula:" e = 1 + ( 1/ 1!) + ( 1/2!) + (1/3!) + ... Da er det jo bare og følge løsningen jeg har funnet på den første, men dele det opp litt? Her står det ingenting om å "use input from user", man trenger bare å lage en appl. som regner ut ... Lenke til kommentar
pertm Skrevet 28. februar 2007 Del Skrevet 28. februar 2007 pertm:En annen utfordring: "Write an application that estimates the value of the mathematical constant e by using the formula:" e = 1 + ( 1/ 1!) + ( 1/2!) + (1/3!) + ... Da er det jo bare og følge løsningen jeg har funnet på den første, men dele det opp litt? Her står det ingenting om å "use input from user", man trenger bare å lage en appl. som regner ut ... 8045365[/snapback] Et rpoblem der er jo at du må stoppe engang, selv om et prgram kan gå ganske nærme så blir det jo etterhver store tall som blir for store for int å handle. Husk på at fakultet øker verdi veldig fort. Jeg husker ikke hvor grensa i java er, men selv om en bruker en type som takler lengre tall vil en få samme problem tilslutt. Lenke til kommentar
Sti9nsky Skrevet 28. februar 2007 Forfatter Del Skrevet 28. februar 2007 (endret) pertm:En annen utfordring: "Write an application that estimates the value of the mathematical constant e by using the formula:" e = 1 + ( 1/ 1!) + ( 1/2!) + (1/3!) + ... Da er det jo bare og følge løsningen jeg har funnet på den første, men dele det opp litt? Her står det ingenting om å "use input from user", man trenger bare å lage en appl. som regner ut ... 8045365[/snapback] Et rpoblem der er jo at du må stoppe engang, selv om et prgram kan gå ganske nærme så blir det jo etterhver store tall som blir for store for int å handle. Husk på at fakultet øker verdi veldig fort. Jeg husker ikke hvor grensa i java er, men selv om en bruker en type som takler lengre tall vil en få samme problem tilslutt. 8045698[/snapback] Jeg tror meningen med oppgaven er at man får til koden/utregningen. Red: ( Max verdi er 2 147 483 647, hvis ikke jeg tar helt feil. ) Endret 1. mars 2007 av Sti9nsky Lenke til kommentar
Sti9nsky Skrevet 1. mars 2007 Forfatter Del Skrevet 1. mars 2007 (endret) Blir dette riktig? Deitel og Deitel - Java, how to program (6th edition) Oppgave 4.38b: Resultatet er 0.0. Da er det noe feil. Hvor "tenker jeg feil"? Klikk for å se/fjerne innholdet nedenfor // Exercise 4.38b: ToToB.java // Author: ****** // // Application that estimates the value of mathematical constan e // by using the formula e = 1 + ( 1/1! ) + ( 1/2! ) + ( 1/3! ) + ... public class ToToB { // set, hide ints: private int fac, i, n; // set, hide double: private double e; // making static/hidden int factorial: private static int factorial( int n ) { int fac = 1; // for repetition statement, with initialization and // increment of int i (counter) , and loop-continuation condition: for ( int i = 1; i >= 1; i++ ) { fac *= i; // fac = fac * i } // end loop for return n; } // end static int factorial // making static/hidden double e: private static double e() { // initialize e: double e = 1; // for repetition statement with initialization and // increment of int i (counter), and loop-continuation condition: for ( int i = 1; i >= 1; i++ ) { // calculation of e: e += ( 1 / factorial( i ) ); } // return result of calculation: return e; } // end double e // method to display result to user: public void displayResult() { // print out e: System.out.println(); System.out.println( e ); } // end method displayResult // main method: public static void main( String args[] ) { // creating new object "calc": ToToB calc = new ToToB(); // call display method in new object: calc.displayResult(); } // end main method } // end class ToToB Endret 1. mars 2007 av Sti9nsky Lenke til kommentar
Ric_H Skrevet 1. mars 2007 Del Skrevet 1. mars 2007 Jeg vil kommentere noen ting.. // set, hide ints: private int fac, i, n; // set, hide double: private double e; Disse deklarasjonene ser jeg ikke hensikten med. Variablene brukes ikke. Du deklarerer dem jo så vidt jeg kan se i alle fall før bruk lengre ned i koden. for ( int i = 1; i >= 1; i++ ) Hmm, det over blir vel en uendelig loop? Jeg mener factorial må være mer slik: // making static/hidden int factorial: private static int factorial( int n ) { int fac = 1; // for repetition statement, with initialization and // increment of int i (counter) , and loop-continuation condition: for ( int i = 1; i <= n; i++ ) { fac *= i; // fac = fac * i } // end loop for return fac; } // end static int factorial Og at e må kalkuleres mer slik: for ( int i = 1; i < 1000; i++ ) // eller et stort tall { // calculation of e: e += ( 1 / factorial( i ) ); } Og sist men ikke minst... System.out.println( e() ); // kaller e() og ikke variabelen e NB. Jeg har ikke prøvd noe av dette, men jeg tror jeg er nær sannheten. Lenke til kommentar
Sti9nsky Skrevet 5. mars 2007 Forfatter Del Skrevet 5. mars 2007 Du setter finger'n på mye ja, takk. Ser at jeg har oversett litt ift variablene. Men så er jeg ganske grønn da. :!: Til å være tidlig i kurset, synes jeg nivået på disse oppgavene er noe høyt. Progresjonen skulle gått noe saktere. Nivået er også mye høyere enn det som er satt i øvingsoppgavene som ikke skal leveres... <sukk> Lærer veldig mye da. Takk igjen Ric_H! Lenke til kommentar
Sti9nsky Skrevet 7. mars 2007 Forfatter Del Skrevet 7. mars 2007 (endret) Jeg skrev alt på nytt jeg, og her er et bedre resultat, (tror jeg): Denne kalkulerer og viser faktisk et resultat! public class ToToB { // set, hide double: private double e, topNumber = 1, denominator = 1; // set hide integers: private int maxLoop = 100000000, // setting maximum loops counter; // method to calculate result: public void calculateResult() { // creating loop with conditions and increment of loopcounter: for ( counter = 1; counter <= maxLoop; counter++ ) { e += topNumber / denominator; // increment the denominator denominator++; } // end loop } // end method calculateResult // method to display result to user: public void displayResult() { // print out e: System.out.println(); System.out.printf( "%.2f\n", e ); } // end method displayResult // main method: public static void main( String args[] ) { // creating new object "calc": ToToB calc = new ToToB(); // call display method in new object: // rem: calc.calculateResult(); calc.calculateResult(); calc.displayResult(); } // end main method } // end class ToToB Red: OOOooops! Jeg glemte å sette "nevner" som fakultet! LOL <Skrive koden på nytt> Endret 7. mars 2007 av Sti9nsky Lenke til kommentar
pertm Skrevet 8. mars 2007 Del Skrevet 8. mars 2007 Ser bra ut når du fikser fakultet. Har du laget en fakultetsfunksjon som gir som resultat double, hvis ikke kan du caste en int fra den til double når du får svaret. Lenke til kommentar
Sti9nsky Skrevet 14. mars 2007 Forfatter Del Skrevet 14. mars 2007 Uff. Føler meg skikkelig dum... men nå har jeg endret litt. Jeg for svar "infinity", men e = osv... er konstant. Så blir det ikke riktig da? Klikk for å se/fjerne innholdet nedenfor public class ToToB { // set, hide double: private double e, topNumber = 1; // making caculations of factorial of denominator: public double denominator(double i) { double e = 1; // loop for denominator: while ( i > 0 ) { e = i * denominator( i - 1 ); // calculate factorial i++; } return e; } // end denominator // method to display result to user: public void displayResult() { // print out e: System.out.println(); System.out.printf( "%.2f\n", 1 + ( topNumber / e ) ); } // end method displayResult // main method: public static void main( String args[] ) { // creating new object "calc": ToToB calc = new ToToB(); // call methods in new object: calc.displayResult(); } // end main method } // end class ToToB Hvis dette er feil, så er jeg i det minste i nærhetnen... (?) Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå