Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C] Co wypisze program-problem.

Ostatnio zmodyfikowano 2017-02-08 09:16
Autor Wiadomość
gromko12
Temat założony przez niniejszego użytkownika
[C] Co wypisze program-problem.
» 2017-02-07 22:55:00
Witam, czy ktoś mógłby mi wytłumaczyć dlaczego dany kod:
C/C++
#include <stdio.h>
int a = 2, b = 3;

int Fun2( char * s ) {
   
    static int t = 1, b = 2;
    printf( "\nF: %c %c", * s + t, *( s + b ) );
    return( t += b ); }


int main()
{
    char txt[ 11 ] = "Ala ma kota";
    printf( "%d", b );
    b += Fun2( txt );
    printf( "\n M: %d %d", Fun2( txt ), b );
    return 0;
}
wypisuje następującą treść:
3
M: B a
F: D a
M: 5 6
Na czym polega dodawanie wartości do zdania, i jak to działa? Z góry dziękuje za pomoc ;)
P-157457
michal11
» 2017-02-07 23:05:07
Kto robi takie chore programy?

Najłatwiej prześledzić co robi ten program to będzie pewnie debuggerem, tam zobaczysz jaka linijka po linijce się wywołuje i jakie aktualnie wartości mają dane zmienne.
P-157458
Nazgul
» 2017-02-08 04:24:24
Nie wiem jakiego kompilatora używasz, ale nie jest najlepszy. Nie powinieneś móc skompilować kodu
C/C++
char txt[ 11 ] = "Ala ma kota";
gdyż "Ala ma kota" to tak naprawdę "Ala ma kota\0"(12 charów, nie 11). na końcu "\0" to jest jeden znak oznaczający koniec tekstu(żeby program orientował się kiedy skończyć czytanie łańcucha).

Do tego twój output jest błędny, także nie wiem czy moja pomoc będzie yy pomocna.

napiszę komentarze wyjaśniające co robi program, założę, że w tej błędnej linijce(patrz wyżej) kompilator po prostu nie wpisał znaku '\0'.
napiszę dwa razy funkcję Fun2(...), bo przez zmienne statyczne są inne wyjścia z programu.
zacznij czytać poniższy opis tak jak idzie program... od funkcji main()
C/C++
#include <stdio.h>
int a = 2, b = 3;

int Fun2( char * s ) { ///////////// pierwsze wywolanie
   
    static int t = 1, b = 2; // przykrywasz zmienną globalną (b = 3), przez co teraz dostępną w funkcji masz tylko tę statyczną
    printf( "\nF: %c %c", * s + t, *( s + b ) );
    /*
    %c konweruje wartość do unsigned char
    *s + t  to jest to samo co s[0] + t, gdyz s zawsze wskazuje na pierwszy element tablicy, a *s to wyłuskanie pierwszego elementu listy
    , wiec *s + t = s[0] + t = 'A' + t = 65 + 1 = 66   ('A' z tablicy ascii to 65), (66 z tablicy ascii to 'B')
    , wiec 66 jako unsigned char pokazuje się jako 'B'.
   
    następnie chcesz pokazać *(s+b) jako unsigned char
      s to wskaznik, b to zmienna int. wskaznik pokazuje miejsce w pamieci(numer konkretnej komórki pamięci)
    , wiec wskaźnik s przesuwasz o dwie komórki
    , wiec *(s + b) = *([NUMER KOMÓRKI W KTÓRYM JEST ZAPISANA WARTOSC s[0]] + 2)      zmienna char , wiec dodanie 2 do tego spowoduje:
    *([NUMER BAJTU W KTORYM JEST ZAPISANA WARTOSC s[2]]) = s[2] = 'a', a to jako unsigned char to 'a'.
   
     
    */
    // return( t += b );
    //to tak jakbyś napisał
    t = t + b; // wiec od teraz statyczne t = 1 + 2, wiec t = 3.
    return t // zwraca 3.
   
}


int Fun2( char * s ) { ///////////// drugie wywolanie
   
    static int t = 3, b = 2; // t = 3 bo to jest typ static(patrz na pierwszy obieg), poczytaj co robi zmienna statyczna...
    printf( "\nF: %c %c", * s + t, *( s + b ) );
    /*
    *s + t = s[0] + t = 'A' + t = 65 + 3 = 68, 68 jako unsigned char  to 'D' z tablicy ascii
    *(s + b) = *([NUMER KOMÓRKI od s[0]] + 2) =  s[2] = 'a' jako unsigned char to 'a'
    */
    // return( t += b );
    //to tak jakbyś napisał
    t = t + b; // wiec od teraz statyczne t = 3 + 2, wiec t = 5.
    return t // zwraca 5.
   
}

int main()
{ //WEJSCIE PROGRAMU
    char txt[ 11 ] = "Ala ma kota"; // char txt[11] = {'A', 'l', 'a', ' ', 'm', 'a', ' ', 'k', 'o', 't', 'a'}; // bardziej poprawnie
    printf( "%d", b ); // wyświetla zmienną globalną b jako (int) gdzie masz b = 3 wiec wyswietla 3
    b += Fun2( txt ); // wchodzi w funkcje Fun2(...)/////////pierwsze wywolanie(patrz na funkcję).. dopiero potem dodaje zwróconą przez funkcję wartość
    //, wiec b = 3(globalne) + 3(z funkcji) = 6
    printf( "\n M: %d %d", Fun2( txt ), b ); // wchodzi w funkcję Fun2(...)////// drugie wywolanie, dopiero potem wyswietla znaczki..
    // funkcja Fun2(...)//drugie wywolanie zwraca 5  przedstawiona jako int to "5", potem wyswietla b jako int, wiec wyswietla "6"
    return 0; // WYCHODZI Z PROGRAMU
}

Mam nadzieję że zczaisz... zrobiłeś taki bałagan w tym programie, że serio inaczej się nie dało.
P-157460
gromko12
Temat założony przez niniejszego użytkownika
» 2017-02-08 09:16:08
Jest to część z zadania z egzaminu, a używam CodeBlocks`a
P-157461
« 1 »
  Strona 1 z 1