Wieże Hanoi i inne zadania

0

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:

#include <stdio.h>

int jeden(int n, int tab[n][3], int b)
{
    if n=1
    {
        tab[n][3]=0
        printf ("konic ukladania")
    }

}

int main()
{
    int n,b,c;

    printf ("Podaj n-liczbę krążków: ");
    scanf ("%d", &n);

    int tab[n][3];
    int i,k;

    // inicjalizacja
    for (k = 0; k < n; k++)
    {
        tab[k][0] = k + 1; // w kolumnie 0 sa krażki, niech beda od 1 do n
        tab[k][1] = 0;
        tab[k][2] = 0;
    }

    // wypisanie
    for (k = 0; k < n; k++) // k-ty kr¹¿ek
    {
        for (i = 0; i < 3; i++) // i-ty s³upek
        {
            printf ( " %d |" , tab[ k ][ i ]);
        }

        printf ("\n");
    }

    return 0;
}

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.

1

Zadanie najprościej można rozwiązać używając rekursji. Przykład algorytmu w C++ wraz z wyjaśnieniem znajdziesz tu:
http://runnable.com/UqfbDH51LRNwAAHE/solve-towers-of-hanoi-using-recursion-in-c%2B%2B-for-recursive

Ma on swoje wady ale jeżeli ilość elementów w wieży nie będzie zbyt duża, zadziała. Wystarczy go przerobić tak, aby korzystał z tablicy i po kłopocie:)

0

Teraz mam kolejny problem: 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. Czy ktoś ma pomyśl jak to wykonać? Myślałam o funkcji malloc, ale nie wiem jak jej użyć.

0

http://pl.wikibooks.org/wiki/C/malloc

Jeżeli tablica ma być dwuwymiarowa to jako argument podaj iloczyn liczby wiersz, kolumn i rozmiaru typu danych, który umieszczasz w tablicy (słowo kluczowe sizeof), funkcja zwróci ci wskaźnik do zaalokowanego obszaru pamięci, który trzeba zrzutować na wskaźnik na Twój typ danych. Potem możesz się takim wskaźnikiem posługiwać jak nazwą tablicy.

0

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

 #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;
}

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

Tego się nie da napisać tak by było jeszcze bardziej zrozumiałe niż jest:

#include <stdio.h>
#include <string.h>                 // deklaracja bibliotek używanych i rozmiaru
#define SIZE 1000
 
char* reverse(char s[]);         // deklaracja funkcji, której nazwa wskazuje na to że coś będzie odwaracać.
                                         // C wymaga aby funkcja była zadeklarowana przed pierwszym użyciem
 
 
int main()
{
  char text[SIZE];
  fgets(text,SIZE-1,stdin);
  printf("%s",reverse(text));  //tutaj ta funkcja jest wywoływana
  return 0;
}
 
char* reverse(char s[])      // a tu zaczyna się jej definicja
{
  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;
}

W bibliotece C (ale nie w standardowej) jest funkcja odwracająca tablicę znaków(strrev()) ale autor tego programiku napisał swoją i nazwał ją reverse.

1 użytkowników online, w tym zalogowanych: 0, gości: 1