Czy dostaliście kiedyś zadanie napisać program w C++ (lub C) tak, aby nie użyć ani jednego średnika?
Jak to możliwe? Przecież średnik w prawie każdym języku zajmuje ważne miejsce - a to rozdziela instrukcje (SQL, Pascal, Perl), a to musi kończyć każdą instrukcję (C, C++, C#, Java) - jak więc sobie dać radę bez niego.
Jak zobaczymy - bez problemowo można. Jako przykładowy program-pomocnik do gry w "BUM". Jeżeli ktoś nie zna tej gry (zna ktoś?), to krótki przypomnienie:
1. Grają dwaj gracze. Na przemian mówią kolejne liczby naturalne.
2. Jeżeli gracz ma wypowiedzieć liczbę podzielną przez 3 lub przez 5 to zamiast tej liczby gracz mówi "BUM".
3. Tak samo jeżeli liczba do wypowiedzenia zawiera w sobie cyfrę 3 lub 5 to zamiast tej liczby gracz mówi "BUM".
Napiszmy na początku "klasycznie" program-pomocnik, który wypisze nam liczby od 1 do 100 wypisując "BUM" tam gdzie powinien:
#include <cstdio>
int main() 
{
  for (int i = 1; i <= 100; i++) 
  {
    if (i % 3 == 0 || i % 5 == 0) 
    {
      printf("BUM\n");
      continue;
    }
    int j;
    for (j = 1; j <= i; j *= 10) 
    {
      int digit = (i/j) % 10;
      if (digit == 3 || digit == 5) 
      {
        printf("BUM\n");
        break;
      }
    }
    if (j > i) 
    {
      printf("%d\n", i);
    }
  }
}
A teraz trochę magii. Zastosujemy parę prostych zasad:
1. Zmienna zadeklarowana w if obowiązuje w całym tym bloku.
2. Instrukcja wywołana w if się wykona.
3. Instrukcja if kończy się nawiasami klamrowymi, a nie średnikiem ;)
4. Pętla while nie zawiera w sobie średników ;)
Voila:
#include <cstdio>
int main() 
{
  if (int i = 1) 
  {
    while (i <= 100) 
    {
      if (i % 3 == 0 || i % 5 == 0) 
      {
        if (printf("NUM\n")) { }
      } 
      else 
      {
        if (int j = 1) 
        {
          if (int flag = 1) 
          {
            while (flag && j <= i) 
            {
              if ((i/j) % 10 == 3 || (i/j) % 10 == 5) 
              {
                if (printf("BUM\n")) { }
                if (flag = 0) { }
              }
              if (j *= 10) { }
            }
            if (flag) 
            {
              if (printf("%d\n", i)) { }
            }
          }
        }
      }
      if (i++) {}
    }
  }
}
Ominąłem jeden problem: funkcje zwracające void. Powiedzmy, że mamy funkcję:
void f(int x)
{
  if (printf("hello %d\n", x)) { }
}
Nie możemy jej wywołać tak:
if (f(5)) { }
Ponieważ if nie przyjmuje typu void. Na ratunek przychodzi nam kolejny znak interpunkcyjny, powodujący chaos i zamieszanie (zwłaszcza w double pi = 3,14;) przecinek:
if (f(5), 1) { }
So cool.
wtorek, 2 marca 2010
Subskrybuj:
Komentarze do posta (Atom)
 

To ja mam podobne zadanie dla Ciebie - napisz powyższy program w javie bez użycia funkcji main. Da się (sprawdzałem i chyba kiedyś Ci nawet o tym mówiłem:P)
OdpowiedzUsuńChallenge accepted!
OdpowiedzUsuń