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.

Programowanie w C - Wieże Hanoi i inne zadania w C.

dicappo 01 Maj 2015 22:49 849 10
  • #1 01 Maj 2015 22:49
    dicappo
    Poziom 20  

    Pierwsze zadanie z jakim się spotkałam to napisanie programu, który miałby być tablicą 2 wymiarową gdzie liczba kolumn zawsze byłaby stała= 3 ( liczba słupków używanych w wieżach Hanoi), a liczba wierszy byłaby liczbą krążków podanych przez użytkownika. Program miałby pokazywać jak wygląda przekładanie elementów tablicy( klocków z wieży) dopóki na 2 albo 3 słupku nie pojawi się wieża. Jak o tym myślę to wydaje mi się to być proste, ale jak mam to napisać w C to nic mi nie wychodzi.

    Na razie jest tyle:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Nie wiem jak rozpisać te funkcję żeby działało wiem, że każdy krążek musi być przeniesiony w prawo o 1. I trzeba sprawdzać funkcją czy klocek komputer nie chce przenieść klocka większego na mniejszy.

    0 10
  • #3 01 Maj 2015 23:30
    dicappo
    Poziom 20  

    Ja bym chciała się przy okazji czegoś nauczyć, bo nawet nie wiem jak to porównać bo większość tych komend nie jest podobna do tych w C.

    0
  • #4 02 Maj 2015 00:16
    -psiak-
    Poziom 32  

    dicappo napisał:
    Ja bym chciała się przy okazji czegoś nauczyć ...

    To przeczytaj algorytm i zrób na jego podstawie swój kod.

    dicappo napisał:
    ... większość tych komend nie jest podobna do tych w C.
    większość - czyli 1 z 15 wierszy?
    Jeżeli widzisz więcej "nie podobnych" to wróć do podstaw C.

    0
  • #5 14 Maj 2015 15:54
    dicappo
    Poziom 20  

    Napisać program organizujący miejsce na tablice wielkości podanej przez użytkownika, będzie wypełniana losowymi liczbami, wyliczy średnią i wariancję każdego wiersza i kolumny(osobne funkcje) i wypisze je na ekran. Myślałam o funkcji malloc, ale nie wiem jak ja zastosowac. Czy ktoś wie? Pilnie potrzebne.

    0
  • #7 15 Maj 2015 09:41
    dicappo
    Poziom 20  

    Kolejne zadanie to program, który będzie odwracał napis. Znalazłam coś takiego:


    Kod: c
    Zaloguj się, aby zobaczyć kod
    #include <stdio.h>
    #include <string.h> // deklaracja bibliotek używanych i rozmiaru
    #define SIZE 1000

    char* reverse(char s[]); // funkcja, która będzie odwracała dane char w tablicy o nazwie s?


    int main()
    {
    char text[SIZE];
    fgets(text,SIZE-1,stdin);
    printf("%s",reverse(text));
    return 0;
    }


    char* reverse(char s[])
    {
    char* first=s;
    char* last=&s[strlen(s)-1];
    char temp=0;

    while(first<last)
    {
    temp=*first;
    *first=*last;
    *last=temp;
    ++first;
    --last;
    }

    return s;
    }[/syntax]

    I teraz nie wiem właśnie czy reverse to funkcja dostępna w którejś bibliotece i robiąca to automatycznie czy jak. W miejscach ze znakami zapytania mam problem i potem już ciężko mi wiedzieć co dalej. Czy mógłby mi ktoś napisać jak to zrozumieć, albo jak inaczej to zaprogramować, żeby było bardziej zrozumiałe dla kogoś początkującego? Dziękuję bardzo za odpowiedź.

    0
  • #8 15 Maj 2015 10:18
    Krzysztof Gustaw
    Poziom 23  

    Witam!
    Nazwa funkcji reverse napisana na w wierszu 5 programu, opatrzona komentarzem ze znakiem zapytania jest tak zwanym prototypem funkcji która będzie napisana gdzieś dalej bądź znajduje się w innym pliku (coś w rodzaju FORWARD dla języka PASCAL). Pliki nagłówkowe takie jak stdio.h, string.h zawierają właśnie prototypy funkcji, które znajdują się w plikach bibliotecznych (lib, obj itp). W Twoim programie który przedstawiłaś na forum funkcja main wywołująca funkcję reverse napisana została PRZED definicją funkcji reverse. Gdyby nie było deklaracji prototypowej (w wierszu 5); kompilator w trakcie kompilacji, w funkcji main natrafia na nazwę reverse. Ponieważ funkcja ta jeszcze nie jest kompilatorowi znana (bo nie ma prototypu) więc wyświetli błąd (nieznany identyfikator). Przecież kompilator jeszcze nie wie, że funkcja o tej nazwie jest napisana później, a co ważniejsze, nie zna typu wartości zwracanej oraz ilości i typów parametrów zatem nie jest w stanie zarezerwować właściwej ilości miejsca na stosie danych. W tym przypadku możliwości są dwie:
    1. funkcję reverse napisać przed funkcją main
    2. (wykorzystana w przedstawionym na forum programie) Przed pierwszym wywołaniem umieścić tzw prototyp funkcji, który jest solenną obietnicą dla kompilatora, że właściwa funkcja o tej nazwie zostanie zdefiniowana "gdzieś dalej". Ten prototyp został zdefiniowany w wierszu 5 w Twoim programie. Spróbuj go usunąć a zobaczysz co się stanie (poznasz komunikat o błędzie) Aha, funkcja reverse nie znajduje się w bibliotekach standardowych, trzeba ją sobie napisać.
    P.S.
    Chyba nie muszę dodawać, że ilość i typy odpowiednich parametrów jak też typ wartości zwracanej prototypu muszą być zgodne z funkcją właściwą :)

    0
  • #9 15 Maj 2015 11:09
    p.kaczmarek2
    Poziom 23  
  • #10 15 Maj 2015 11:28
    Krzysztof Gustaw
    Poziom 23  

    Witam!
    Do Kol. p.kaczmarek2; Zgadza się, jest to tzw przeciążanie funkcji (bardzo fajna możliwość :)) i dotyczy TYLKO C++. Mogą być też różne funkcje o tej samej nazwie i tych samych parametrach (oczywiście w tym samym programie). Sa to funkcje wirtualne i równiez dotyczy to TYLKO C++.
    Pozdrawiam
    KG

    -1
  • #11 15 Maj 2015 13:14
    mi14chal
    Poziom 28  

    Krzysztof Gustaw napisał:
    Sa to funkcje wirtualne i równiez dotyczy to TYLKO C++.

    Funkcje wirtualne to całkiem coś innego niż funkcje o tej samej nazwie i różnych parametrach.

    0