Hailstone Serien i C

Här diskuteras programmering och utveckling
Aluhuru
Inlägg: 34
Blev medlem: 26 apr 2007, 18:46
OS: PCLinuxOS
Ort: Hallstahammar

Hailstone Serien i C

Inlägg 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;
}
Användarvisningsbild
gasol
Inlägg: 405
Blev medlem: 27 jul 2007, 14:57
Kontakt:

SV: Hailstone Serien i C

Inlägg 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;
}


Senast redigerad av 1 gasol, redigerad totalt 15 gånger.
The Black Mountain Scorpion Hoedown Bluegrass Experience Gang
From Left to Right: Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle.
Aluhuru
Inlägg: 34
Blev medlem: 26 apr 2007, 18:46
OS: PCLinuxOS
Ort: Hallstahammar

SV: Hailstone Serien i C

Inlägg 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
Användarvisningsbild
gasol
Inlägg: 405
Blev medlem: 27 jul 2007, 14:57
Kontakt:

SV: Hailstone Serien i C

Inlägg 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?
The Black Mountain Scorpion Hoedown Bluegrass Experience Gang
From Left to Right: Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle.
Aluhuru
Inlägg: 34
Blev medlem: 26 apr 2007, 18:46
OS: PCLinuxOS
Ort: Hallstahammar

SV: Hailstone Serien i C

Inlägg 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!
Användarvisningsbild
gasol
Inlägg: 405
Blev medlem: 27 jul 2007, 14:57
Kontakt:

SV: Hailstone Serien i C

Inlägg 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).
The Black Mountain Scorpion Hoedown Bluegrass Experience Gang
From Left to Right: Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle.
Användarvisningsbild
per9000
Inlägg: 931
Blev medlem: 07 maj 2007, 11:06
OS: Ubuntu
Utgåva: 23.04 Lunar Lobster
Ort: Västerås
Kontakt:

SV: Hailstone Serien i C

Inlägg 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
--
Per Erik Strandberg
Yet Another IT Consultant
Användarvisningsbild
gasol
Inlägg: 405
Blev medlem: 27 jul 2007, 14:57
Kontakt:

SV: Hailstone Serien i C

Inlägg 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 :)
The Black Mountain Scorpion Hoedown Bluegrass Experience Gang
From Left to Right: Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle, Wizard on Bicycle.
Skriv svar

Återgå till "Programmering och webbdesign"