Sida 1 av 1

Hailstone Serien i C

Postat: 15 okt 2007, 20:33
av Aluhuru
Hejsan!
Jag vet inte riktigt hur jag ska få "The Hailstone" Serien att skrivas ut som denna text, någon som kan ge mig en vägledning?

Enter a Positive  Integer(startvalue) for Hailstone: 35
The Hailstone series is: 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1.


Reglerna för Hailstone är:
1. Den första heltalet i serien måste vara ett positivt tal.
2. Om första siffran är udda, ska det andra siffran i serien var = första / 2.
3. ... Men om första siffran är udda ska den andra siffran var 3x så stort som det första+1.
4. Samma regel gäller mellan andra och tredje siffran, dvs. om andra siffran är jämn så är 3:e siffran = 2:a/2, men om andra siffran är udda så är det tredje 3 ggr det 2:a+1
5. Dessa regler repeteras till siffran '1' visas.           

Min Källkod:

#include <stdio.h>
int main()
{
unsigned long int Value;
printf( "Enter a positive integer(startvalue) for Hailstone: \n");
scanf( "%d", &Value);
while (Value != 1)
{
if (Value%2 == 0)
{
Value/= 2;
}
else
{
Value = Value * 3 + 1;
}
}
printf( "The Hailstone series produced is: %d\n", Value);
system("Pause"); //Kan remmas bort!!!
return 0;
}

SV: Hailstone Serien i C

Postat: 15 okt 2007, 21:25
av gasol
outputen buffras så om du vill att den ska skrivas ut i varje steg så måste du antingen skriva ut en ny rad, eller flusha stdout med fflush(stdout);

Kod: Markera allt


#include <stdio.h>
int main()
{
   unsigned long int Value;
   printf( "Enter a positive integer(startvalue) for Hailstone:");
   fflush(stdout);
   scanf( "%d", &Value);
   printf( "The Hailstone series produced is: %d", Value);
   while (Value != 1)
   {
      if (Value%2 == 0)
      {
         Value/= 2;
      }
      else
      {
         Value = Value * 3 + 1;
      }
      printf("%d,", Value);
      fflush(stdout);
   }


   printf("\n");
   return 0;
}



SV: Hailstone Serien i C

Postat: 16 okt 2007, 16:51
av Aluhuru
Det var inte riktigt rad
för
rad
jag menade, utan snarare att de hänger ihop i ett mening, som detta:

The Hailstone series is: 35, 106, 53, 160, 80, 40, 20, 10, 5, 16, 8, 4, 2, 1.

Alltså, att han lägger alla utmatningar på samma rad.

Hoppas någon förstår mig bättre nu.
/Joakim

SV: Hailstone Serien i C

Postat: 16 okt 2007, 19:06
av gasol
Testade du koden som jag skrev i min förra post?
Den producerar följande resultat:

Kod: Markera allt

<arlong-park /home/gasol 
> gcc hal.c && ./a.out
Enter a positive integer(startvalue) for Hailstone:35
The Hailstone series produced is: 35106,53,160,80,40,20,10,5,16,8,4,2,1,
Enda felet emot vad du vill att den ska skriva ut är väl att det är ett komma tecken efter 1:an istället för en punkt? Eller har jag helt missuppfattat vad du vill göra?

SV: Hailstone Serien i C

Postat: 16 okt 2007, 20:03
av Aluhuru
Jag hade i förra posten bara försökt efterlikna, det du hade skrivit.
När jag tog bort min gamla kod och kopierade rakt av, fungerade det.
Tack!

SV: Hailstone Serien i C

Postat: 16 okt 2007, 21:07
av gasol
okey bra det som är lite klurigt är att linux buffrar din output så även om du kör printf("4") så kommer det inte att skrivas ut förens det är tillräckligt mycket i ut buffern eller tills du skriver en ny rad printf("\n"), eller tills du kör fflush(stdout).

SV: Hailstone Serien i C

Postat: 17 okt 2007, 09:50
av per9000
gasol skrev: okey bra det som är lite klurigt är att linux buffrar din output så även om du kör printf("4") så kommer det inte att skrivas ut förens det är tillräckligt mycket i ut buffern eller tills du skriver en ny rad printf("\n"), eller tills du kör fflush(stdout).
Är du säker på att den skriver efter varje ny rad? Det låter lite suboptimalt. Är det samma sak om man skriver till fil?

/Per

SV: Hailstone Serien i C

Postat: 17 okt 2007, 13:15
av gasol
User space buffering finns i 3 lägen

_IONBF unbuffered

_IOLBF line buffered

_IOFBF fully buffered

_IONBF gör att alla bytes som kommer kommer att skrivas direkt till filen/devicen
_IBLBF är default beteendet för stdout.
_IOFBF är jag inte riktigt säker, men jag tror att den innebär att en write endast gör om hela buffern är fylld.

Filer är normalt block buffrade, så att endast en skrivning görs när ett helt block är klart att skrivas.

Angående att stdout är line buffrat så går det liksom inte göra det på något mer optimalt sätt, utan om du vet att du ska skriva sjukt mycket (rader) till stdout så får du ändra till fully buffered och skicka med en egen buffer and sedan fflusha när du vill att output ska skrivas.

kolla setbuf(3) för mer info om du är sugen :)