Gå til innhold

Deitel oppgave 4.38 a, b og c:


Anbefalte innlegg

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. :ermm:

 

Er det noen som tilfeldigvis har gjort samme oppgaven? Så kan vi sammenligne?

Går på NKI nettskolen Java 1.

Endret av Sti9nsky
Lenke til kommentar
Videoannonse
Annonse
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 av pertm
Lenke til kommentar

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
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

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> :whistle:

 

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 av Sti9nsky
Lenke til kommentar
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 av pertm
Lenke til kommentar

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:

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
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 av Sti9nsky
Lenke til kommentar

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 av Sti9nsky
Lenke til kommentar

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

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

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 av Sti9nsky
Lenke til kommentar

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...