Avatar billede fido26 Praktikant
28. august 2003 - 20:47 Der er 7 kommentarer og
1 løsning

Hvad udfører flg. C kode??

Jeg er ved at lave en opgave hvor man skal bruge flg. kode. Jeg kan bare ikke rigtigt gennemskue hvad funktionerne stair_impl og sum_impl egentlig udfører. Koden ser således ud:

// #include "dynamic.h"
#include <stdio.h>
#define STAIRS (5)

// dynamic_t stair;
// dynamic_t sum;

int stair_impl( int x ) {
  return x % STAIRS;
}

int sum_impl( int x ) {
  int i;

  if( x==0 )
      return 0;

  return stair_impl(x) + sum_impl(x-1);
}

main() {
  int afbryd, dobbel_sum, i;

//  stair = register_dynamic( stair_impl );
//  sum = register_dynamic( sum_impl );

  for( i=0; i<10000; i++ )
      dobbel_sum += sum_impl(i);

  printf("sum{i=0:10000}(sum{j=0:i})=%d\n",dobbel_sum);
 
  scanf("%d", &afbryd);
}

Og hvis jeg kører med i<10000 får jeg flg. 104196592 og hvis jeg kører løkken med i<1 så får jeg 4206592.

Hvad er det der sker når disse funktioner køres??

/Fido26
Avatar billede arne_v Ekspert
28. august 2003 - 21:06 #1
stair_impl returnerer x modulus 5 altså rest ved division med 5.

sum_impl ligger stair_impl værdien for alle tal 0..x sammen.

Og jeg kan ikke se hvad det kan bruges til.
Avatar billede arne_v Ekspert
28. august 2003 - 21:08 #2
Og dobbel_sum er uinitialiseret d.v.s. at det er helt tilfældigt hvad
programmet udskriver.
Avatar billede soreno Praktikant
28. august 2003 - 21:15 #3
Dette sker:
stair_impl(1) = 1 % 5 = 1
stair_impl(2) = 2 % 5 = 2
stair_impl(3) = 3 % 5 = 3
stair_impl(4) = 4 % 5 = 4
stair_impl(5) = 5 % 5 = 0
stair_impl(6) = 6 % 5 = 1
                                                              res              sum
sum_impl(0) = 0                                        0                  0
sum_impl(1) = (1 % 5) + 0                          1 + 0 = 1        1
sum_impl(2) = (2 % 5) + sum_impl(1)            2 + 1 = 3        4
sum_impl(3) = (3 % 5) + sum_impl(2)            3 + 3 = 6      10
sum_impl(4) = (4 % 5) + sum_impl(3)            4 + 6 = 10      20
sum_impl(5) = (5 % 5) + sum_impl(4)            0 + 10 = 10    30
sum_impl(6) = (6 % 5) + sum_impl(5)            1 + 10 = 11    41
sum_impl(7) = (7 % 5) + sum_impl(6)            2 + 11 = 13    54
sum_impl(8) = (8 % 5) + sum_impl(7)            3 + 13 = 16    70 
sum_impl(9) = (9 % 5) + sum_impl(8)            4 + 16 = 20    90 
sum_impl(10) = (10 % 5) + sum_impl(9)          0 + 20 = 20    110
sum_impl(11) = (11 % 5) + sum_impl(10)        1 + 20 = 21    131
sum_impl(12) = (12 % 5) + sum_impl(11)        2 + 21 = 23    154
Avatar billede fido26 Praktikant
28. august 2003 - 21:18 #4
Ja jeg er godt nok også helt forvirret. Hvis jeg ligger en løkke ind og kører programmet flere gange, så får jeg større og større resultat. Jeg lader den lige stå åben lidt længere for at se om der skulle komme nogle andre forslag.......

Fido26
Avatar billede fido26 Praktikant
28. august 2003 - 21:21 #5
Ja soreno jeg kan godt se at det er sådan den burde gøre men hvordan kan det så være at hvis jeg kører løkken med i<1 så får jeg 4206592????
Avatar billede soreno Praktikant
28. august 2003 - 21:24 #6
Som Arne skriver har du ikke initialiseret dobbelt_sum. Derfor er det mere eller mindre tilfældigt hvad start værdien er.

Se dette:
#include <stdio.h>

int main()
{
    int test;
    printf("test har værdien: %i\n", test);

    return 0;
}


Output (hos mig):
test har vµrdien: 2013298418
Avatar billede fido26 Praktikant
28. august 2003 - 21:27 #7
Nå ja det er da egentlig klart nok. Jeg opdeler pointene mellem jer....
Tak for hjælpen.....

Fido26
Avatar billede fido26 Praktikant
28. august 2003 - 21:29 #8
Ups dette lykkedes ikke for mig. Jeg opretter et spm med titlen c kode svar og så får du (soreno) 60 point når du svarer på den......

Fido26
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester