Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C] reczna symulacja programu

maly_mis 25 Kwi 2010 16:39 1260 6
  • #1 25 Kwi 2010 16:39
    maly_mis
    Poziom 8  

    Witam !
    Zaczynam właśnie swoja przygodę z językiem C. Jednak już na starcie napotykam trudności związane z zagadnieniem 'Jak działa program? - przeprowadź ręczną symulację.' No właśnie...

    Program,który rozpracowuje wygląda następująco:

    Code:
    #define N 10
    
    . . .
    int a[N], i, j;
    for (i=0; i<N; i=i+1)
    a[i] = i;
    for (i=N-1; i>=0; i=i-1) {
    a[i]=0;
    for (j=0; j<i; j=j+1)
    a[i] = a[i]+a[j];
    }
    for (i=0; i<N; i=i+1)
    printf(" %i", a[i]);
    printf("\n");


    I pytanie... Co wydrukuje program ?

    Udało mi się dojsć do tego, że dwa pierwsze wydruki będą '0' , '0', a co dalej ?

    Mógłby mnie ktoś wspomóc i rozpisać jak to ma wyglądać dokładnie z tą ręczną symulacją ?

    Z góry dziękuję.

    0 6
  • #2 25 Kwi 2010 17:10
    serpent
    Poziom 11  

    Wg mnie wydruk będzie wyglądał tak:
    0 0 1 3 6 10 15 21 28 36

    Po pierwszej pętli for tablica a wypełniona jest kolejnymi liczbami całkowitymi:
    a={0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

    W następnej pętli w każdym elemencie a[i] umieszczana jest suma wszystkich elementów od a[0] do a[i-1].

    a[9]=0+1+2+3+4+5+6+7+8=36
    a[8]=0+1+2+3+4+5+6+7=28
    a[7]=0+1+2+3+4+5+6=21
    a[6]=0+1+2+3+4+5=15
    a[5]=0+1+2+3+4=10
    a[4]=0+1+2+3=6
    a[3]=0+1+2=3
    a[2]=0+1=1
    a[1]=0
    a[0]=0

    0
  • #3 25 Kwi 2010 17:14
    Dżyszla
    Poziom 42  

    najpierw tablica wypełniana jest kolejnymi wartościami od 0 na pozycji 0 do N-1 na pozycji N-1. Następnie od końca tablicy do początku wypełniana jest wypełniana tak: na pozycję trafia 0, a następnie na pozycje od początku do analizowanej trafia suma pozycji analizowanej i wszystkich poprzednich.
    W efekcie tablica będzie ciągiem o wzorze

    Code:

               n-1
    a(n)  = Σ a(i) = 0 + 1 + ... + n-1
               i=0   

    Pierwsza pętla po prostu nie ma znaczenia., raz jeszcze:
    1. 0 1 2 3 ... N-1
    2: wej: .... 0
    wew: 0+1+2+...+N-2+0

    Przyznaję, że pokręcone ;p

    0
  • #4 25 Kwi 2010 17:39
    netsecurite.pl
    Poziom 13  

    wynik :

    Code:
    0 0 1 3 6 10 15 21 28 36

    0
  • #5 25 Kwi 2010 18:48
    maly_mis
    Poziom 8  

    serpent dziękuję bardzo za oświecenie, normalnie teraz już wiem, co robię źle. Nie traktuje tego jak tablice tylko oddzielne cyfry... Teraz sprawa jasna. Dziękuję !

    0
  • #6 26 Kwi 2010 10:54
    maly_mis
    Poziom 8  

    Witam ponownie !!

    Dzisiaj z zajęć wynoszę kolejne, że tak powiem po...głupie...walone programy.
    Ręczna symulacja:

    Code:
    #define N 7
    
    #define K 3
    #define L -2
    . . .
    for (i=-2*N; i<2*N; i=i+1) {
    for (j=-2*N; j<2*N; j=j+1)
    if ((i-L)*(i-L)+(j-K)*(j-K) > N*N)
    printf("*");
    else
    printf(" ");
    printf("\n");
    }


    co wydrukuje program ?

    Może podpowie mi ktoś z Was jakiś mądry i logiczny sposób, jak się do takich zadanek zabierać ? Poproszę !

    Dodano po 24 [minuty]:

    Rozpoczynam rozpracowywać ten program i tak:
    wartości startowe
    Code:
     i=-2*7 (czyli -14) j=-2*7 (czyli też -14)

    wchodzę z tymi wartościami do pętli if i sprawdzam czy
    Code:
    ((i-L)*(i-L) + (j-K)*(j-K) > N*N) czyli dla tych pierwszych wartości wychodzi, że
    
    (-14+2)*(-14+2)+(-14-3)*(-14-3) > 49
    wychodzi, że 144+289=433 co jest większe od 49, stąd warunek spełniony, program rysuje
    Code:
    *
    i przechodzi do nowego wiersza.
    W drugim "obrocie"
    Code:
    i = -13 (gdyż zwiększa się o 1) j=-13 (również)

    i ponownie sprawdza warunek. i tak robię kilka "obrotów"...
    Udało mi się wywnioskować, że narysuje coś takiego
    Code:

    *
    *
    *
    *
    *
    *
    *
    *
    *
    *
    *
    czyli 11 gwiazdek jedna pod drugą, potem przechodzi do następnej kolumny... I tutaj nie wiem, co dalej... :-(

    Dodano po 31 [minuty]:

    żeby aż tak bardzo nie rozwlekać jednego "posta" od razu wrzucę wszystkie programy z listy, z którymi mam problem...

    PROGRAM 4
    Code:
    #define N 7
    
    . . .
    for (i=0; i<N; i=i+1) {
    for (j=0; j<N-i; j=j+1)
    printf(" ");
    printf("*");
    if (i == 0) printf("\n");
    else {
    if (N-i == N/2)
    for (j=0; j<2*i-1; j=j+1)
    printf("*");
    else
    for (j=0; j<2*i-1; j=j+1)
    printf(" ");
    printf("*\n");
    }
    }


    PROGRAM 5
    Code:

    #define N 10
    #define K 8
    #define L 16
    ...
    for (i=-2*N; i<2*N; i=i+1) {
    for (j=-2*N; j<2*N; j=j+1) {
    if (i==0 && j == 0) printf("+");
    else
    if (i==0) printf("-");
    else
    if (j==0) printf("|");
    else {
    ij = i*j;
    if (K<=ij && ij<=L)
    printf("*");
    else printf(" ");
    }
    }
    printf("\n");
    }


    PROGRAM 6
    Code:

    #include <stdio.h>
    float f(float a, float b){
    float x;
    if (b-a < 0.25) return a;
    else {
    x = (a+b)/2.0;
    if (x*x + 6.0*x + 3.0 < 0.0) return f(x, b);
    else return f(a,x);
    }
    }
    main(){
    printf("%f\n",f(-3.0, 0.0));
    }

    0
  • #7 28 Kwi 2010 15:26
    arnoldziq
    Moderator Programowanie

    Widzę że temat zmierza w złym kierunku. Nie usunę go, ponieważ zawiera ciekawe materiał.
    Autora proszę, o uważanie na lekcjach, a nie zawracanie głowy na forum.
    Nikt nie będzie za Ciebie odrabiał zadań domowych.

    Kolejny tego tupu post "nagrodzę" ostrzeżeniem.

    Zamykam.

    0