logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

łatwy program w języku C a nie wiem co w nim źle

hjkl3 11 Mar 2006 11:22 2420 12
REKLAMA
  • #1 2401127
    hjkl3
    Poziom 16  
    Posty: 267
    Pomógł: 1
    Ocena: 5
    1. program ma działać w ten sposób:
    wyświetlenie napisu: "jak się czujesz?"
    jeśli wpiszę "dobrze" to powinien wyświetlić się komunikat: "no to super"
    jeśli wpiszę cokolwiek innego to powinien wyświetlić się komunikat: "zle?dlaczego?"

    oto kod programu - co w nim jest źle:

    #include<stdio.h>
    #include<conio.h>
    int main ()
    {
    int a,dobrze;
    printf ("jak sie czujesz?\n");
    scanf ("%d%d", &a,&dobrze);
    if (a==dobrze)
    printf ("no to super\n");
    else
    printf ("zle? dlaczego?\n");
    getch ();
    return 0;
    }

    2. I dlaczego w poniższym programie nie mogę użyć tak jak powyżej komendy "getch()" jaka jest różnica między getch a getchar ??

    // wyświetlanie napisu "Witaj!"
    #include<stdio.h>
    int main ()
    {
    printf ("Witaj!");
    getchar ();
    return 0;
    }
  • REKLAMA
  • #2 2401156
    Konto nie istnieje
    Konto nie istnieje  
  • #3 2401169
    hjkl3
    Poziom 16  
    Posty: 267
    Pomógł: 1
    Ocena: 5
    kompilator bloodshed dev C ++
    a czym to sie objawia? najlepiej jakbyscie wkleili kod do kompilatora i sami zobaczyli - w przypadku pytania nr 1 zawsze wyswietla sie komunikat "zle?dlaczego?" nawet jak wpisze "dobrze"
    a w przypadku pytania nr 2 to po prostu wyjasnijcie mi roznice miedzy getch a getchar
  • REKLAMA
  • #4 2401242
    JanuszPulit
    Poziom 17  
    Posty: 175
    Pomógł: 14
    Ocena: 4
    Program nie działa zgodnie z twoim założeniem bo jest bez sensu:
    na początek deklarujesz sobie zmienne:
    
     int a,dobrze; 
    

    to zmienne int mogą przechowywać 32bitową liczbę ze znakiem a nie tekst
    jaki chcesz wprowadzać z klawiatury

    dalej masz:
    
    scanf ("%d%d", &a,&dobrze); 
    if (a==dobrze) 
    printf ("no to super\n"); 
    else 
    printf ("zle? dlaczego?\n"); 
    getch (); 
    

    podałeś funkcji scanf "%d%d" - funkcja zakłada ze uzytkownik wprowadza liczby dziesiętne, ty wpiszujesz słowo 'dobrze' - jaki jest wynik?? ciężko przewidzieć, ale raczej nic sensownego ci sie do zmiennych 'a' i 'dobrze' nie podstawi. Dalej to już proste ponieważ te wartości są różne to program zawsze wypisuje ci "zle? dlaczego?\n".

    W drugim przypadku brakuje ci dołączenia pliku nagłówkowego conio.h w którym jest zadeklarowana funkcja getch(). Nie ma pomiędzy tymi funkcjami raczej żadnej różnicy poza nazwą i tym że są zadeklarowane w innych nagłówkach.

    Sugeruję lekturę podręcznika do C bo na razie nie masz pojęcia niestety o tym co robisz.... Zacznij od typów zmiennych, potem dokumentacja do funkcji scanf, a dopiero potem pisz program.
    A i do tego czy słyszałęś kiedykolwiek o czymś takim jak debugger? Przecież gdybyś wykonał ten swój program krok po kroku podglądając zawartość zmiennych to od razu byś zauważył w czym problem.
  • #5 2401365
    johny_84
    Poziom 16  
    Posty: 235
    Pomógł: 13
    Ocena: 3
    Witam,

    zamiast getch(), czy getchar() uzylbym system("PAUSE");

    Pozdro ;)
  • #6 2402170
    hjkl3
    Poziom 16  
    Posty: 267
    Pomógł: 1
    Ocena: 5
    ale moglibyście powiedzieć jak prawidłowo powinien wyglądać ten 1. program
    a co do książki to jeden student informy mi polecił książkę Prata "szkoła programowania język C" niedługo przyjdzie z allegro - chyba dobra na zupełny początek z programowaniem co?
  • Pomocny post
    #7 2402198
    Faust
    Poziom 17  
    Posty: 135
    Pomógł: 22
    Ocena: 4
    zamiast:
    scanf ("%d%d", &a,&dobrze);
    if (a==dobrze)

    zrob tak:

    char bufor[20];
    scanf("%19s",bufor);
    if(strcmp(bufor,"dobrze"))
    printf ("no to super\n");
    reszta po staremu.

    A co do książki to "Szkoła programowania" jest dobrym wyborem.
  • REKLAMA
  • #8 2402280
    hjkl3
    Poziom 16  
    Posty: 267
    Pomógł: 1
    Ocena: 5
    dzięki - faus jestes wielki :)

    Dodano po 11 [minuty]:

    ej a żeby wyświetlanie napisu "Witaj"
    działało nie w dosie a w windows to trzeba zupełnie inny kod zastosować czy jak?
    bo jak naciskam w dev c ++ na "new project - windows application" to wyświetla się taki kod:
    #include <windows.h>

    /* Declare Windows procedure */
    LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

    /* Make the class name into a global variable */
    char szClassName[ ] = "WindowsApp";

    int WINAPI WinMain (HINSTANCE hThisInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpszArgument,
    int nFunsterStil)

    {
    HWND hwnd; /* This is the handle for our window */
    MSG messages; /* Here messages to the application are saved */
    WNDCLASSEX wincl; /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure; /* This function is called by windows */
    wincl.style = CS_DBLCLKS; /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL; /* No menu */
    wincl.cbClsExtra = 0; /* No extra bytes after the window class */
    wincl.cbWndExtra = 0; /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
    return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
    0, /* Extended possibilites for variation */
    szClassName, /* Classname */
    "Windows App", /* Title Text */
    WS_OVERLAPPEDWINDOW, /* default window */
    CW_USEDEFAULT, /* Windows decides the position */
    CW_USEDEFAULT, /* where the window ends up on the screen */
    544, /* The programs width */
    375, /* and height in pixels */
    HWND_DESKTOP, /* The window is a child-window to desktop */
    NULL, /* No menu */
    hThisInstance, /* Program Instance handler */
    NULL /* No Window Creation data */
    );

    /* Make the window visible on the screen */
    ShowWindow (hwnd, nFunsterStil);

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
    /* Translate virtual-key messages into character messages */
    TranslateMessage(&messages);
    /* Send message to WindowProcedure */
    DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
    }


    /* This function is called by the Windows function DispatchMessage() */

    LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    switch (message) /* handle the messages */
    {
    case WM_DESTROY:
    PostQuitMessage (0); /* send a WM_QUIT to the message queue */
    break;
    default: /* for messages that we don't deal with */
    return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
    }



    I TERAZ JAK DOPISUJE:
    #include<stdio.h>
    #include<conio.h>
    int main ()
    {
    printf ("Witaj!");
    getch ();
    return 0;
    }
    TO NIE DZIAŁA - czy to znaczy że programowanie w windows wymaga innego kodu czy jak ?
  • #10 2402428
    hjkl3
    Poziom 16  
    Posty: 267
    Pomógł: 1
    Ocena: 5
    ale wytłumaczcie mi tylko czy jak tworzę program w windowsie to czy kod na np. wyświetlanie napisu "witaj" jest zupełnie inny czy jak - proszę napiszcie mi aplikację do wyświetlania napisu "witaj" w windows żebym zobaczył o co w tym biega :)
  • REKLAMA
  • Pomocny post
    #11 2402498
    Faust
    Poziom 17  
    Posty: 135
    Pomógł: 22
    Ocena: 4
    No pewnie, że jest zupełnie inny. Aby wyświetlić jakiś tekst musisz zastosować jakąś kontrolkę np. edit, albo użyć do tego GDI. Ewentualnie możesz to zrobić jako MessageBox. Ogólnie Winapi jest w tej chwili poza twoim zasięgiem, opanuj dobrze C/C++. Po tym zajmij się winapi. Krok po kroku, nie da się tego przeskoczyć.
  • #12 2402530
    hjkl3
    Poziom 16  
    Posty: 267
    Pomógł: 1
    Ocena: 5
    faust twoje rady sa najlepsze - dzieki wielkie - dostosuje sie do tego co mi powiedziales - najpierw C w dosie skoro w windowsie to wyzszy stopien trudnosci - dzieki - dam ci te punkt za pomoc :D
  • #13 2402964
    avallac
    Poziom 2  
    Posty: 2
    A getchar() różni się od getch() dosyć istotnie, zainteresowanych odsyłam do stosownej dokumentacji.

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z prostym programem w języku C, który ma pytać użytkownika "jak się czujesz?" i reagować na wpis "dobrze" komunikatem "no to super", a na inne odpowiedzi "zle?dlaczego?". Błąd wynika z nieprawidłowego użycia zmiennych typu int oraz formatu "%d%d" w funkcji scanf, co powoduje, że program nie odczytuje poprawnie tekstu. Zalecane jest użycie tablicy znaków (char bufor[20]) i funkcji scanf z formatem "%s" oraz porównanie wprowadzonego tekstu z "dobrze" za pomocą funkcji strcmp. W kwestii różnicy między getch() a getchar() wskazano, że getch() wymaga dołączenia nagłówka conio.h i działa inaczej niż getchar(), który jest standardową funkcją z stdio.h. Zaproponowano także alternatywę system("PAUSE") do zatrzymania programu. Poruszono również temat tworzenia aplikacji okienkowych w Windows, gdzie kod do wyświetlania tekstu jest zupełnie inny i wymaga użycia WinAPI, np. kontrolki lub MessageBox, co jest bardziej zaawansowane i wymaga wcześniejszej nauki podstaw C/C++. Polecono książkę "Szkoła programowania język C" autorstwa Prata jako dobry materiał dla początkujących.
Wygenerowane przez model językowy.
REKLAMA