Pokazywanie postów oznaczonych etykietą c#. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą c#. Pokaż wszystkie posty

sobota, 28 sierpnia 2010

Word i C# - cz. I

Dzisiaj trochę na temat automatyzacji Worda za użyciem platformy .NET. Powiedzmy, że nasz program ma automatycznie generować dyplomy uznania dla uczniów. Mają one powstawać na bazie dokumentu-szablonu w formacie Worda 2003. W szablonie miejsca, które mają zostać automatycznie zamienione na dane uczniów są zaznaczone specjalnymi znacznikami, takimi jak np. %UCZEN%. Dzisiaj będzie o "brzydkim" rozwiązaniu takiego zadania ;)

Brzydkie jest korzystanie z obiektów COM samo w sobie. Platforma .NET dostarcza ułatwienie do korzystania z takich obiektów - Interop (od interoperability). Nasz program dzięki korzystaniu z obiektów COM nie będzie działał na plikach "doc" - on będzie działał na samym Wordzie - uruchomi go, skopiuje szablon odpowiednią liczbę razy za każdym razem odpowiednio podmieniając znaczniki, dodając podziały stron i wypluwając wszystkie dyplomy jako jeden dokument. OK, to zaczynamy.

Najpierw trzeba dodać referencję do odpowiedniego komponentu COM - w "Add reference" i zakładce "COM" wybieramy "Microsoft Word Object Library". U mnie jest to wersja 12 (Word 2007), ale z Wordem 2003 też nie będzie problemów ;)

Dodany komponent siedzi w przestrzeni nazw Microsoft.Office.Interop.Word. Aby nie trzeba było pisać zawsze tak długiego kwalifikatora warto wykorzystać using - tylko że ta przestrzeń zawiera mnóstwo klas, których nazwy mogą kolidować np. z Interopem dla Excela (jeżeli go używamy). Dlatego najlepiej skrócić po prostu kwalifikator do samego Word:

using Word = Microsoft.Office.Interop.Word;

wtorek, 3 sierpnia 2010

"Sklepy cynamonowe" Markowa

Palił w piecach, studiował wielkimi skokami -- Pan bez fletu, cofający się w popiół. Będziemy wiecznie żałowali, żeśmy wtedy wyszli na chwilę musieli wesprzeć się o odrzwia, tak silnie szturmował wicher do bramy.

Nie, nie zacząłem pisać powieści ;) Powyższe zdania wygenerował automatycznie program komputerowy. I nie, nie jest to żadne przetwarzanie języka naturalnego, a bardzo prosty łańcuch Markowa. I prawdziwa powieść podana jako wejście, tutaj akurat "Sklepy cynamonowe" Bruno Schulza.

Jest to zbiór opowiadań opublikowany w 1933 roku. Dlaczego on? Bo to jeden z większych tekstów w języku polskim, jaki można znaleźć na stronach Projektu Gutenberg. OK, a o co chodzi z tym Markowem?

niedziela, 25 lipca 2010

Buddhabrot

Każdy chyba zna taki fraktal jak zbiór Mandelbrota. W 1993 został znaleziony inny fraktalo-podobny obraz, o wiele moim zdaniem ładniejszy ;)

Zbiór Mandelbrota to zbiór takich liczb zespolonych c, że ciąg zn definiowany jako
 z0 = 0
 zn+1 = (zn)2 + c
nie dąży do nieskończoności przy n -> ∞.

W rzeczywistych rozwiązaniach sprawdza się, czy w określonej liczbie iteracji (np. 1000) ciąg ten nie wykroczy poza okrąg o środku w punkcie (0, 0) i promieniu równym 2 - jeżeli kolejna liczba zespolona w ciągu ma moduł większy niż 2, to wiadomo już, że na pewno dla tej wartości c ciąg zn dąży do nieskończoności

Kiedy liczby c przedstawimy na płaszczyźnie zespolonej dostaniemy taki oto, znajomy obrazek:


W 1993 pani Melinda Green zadała sobie pytanie:
A co się dzieje z ciągiem zn, kiedy dąży on do nieskończoności? Jaką ścieżkę przebywa zanim "wyskoczy" na odległość większa niż 2 od środka płaszczyzny?

Odpowiedź jest niezwykle ładna.

wtorek, 13 lipca 2010

Program bez średników w C#

Do kompletu przykładów programów bez średników brakuje nam już tylko C#. C++ jest, Java jest, teraz czas na język Microsoftu ;)

Jeżeli ktoś nie zna jeszcze gry w "bum" niech zajrzy do tego posta:

http://wojtek-m.blogspot.com/2010/03/program-w-cc-bez-uzycia-srednikow.html.

Oryginalny program w C# grający w tą grę od 1 do 100 wygląda tak:

using System;

class BumGame
{
  public static void Main(string[] args)
  {
    for (int i = 1; i <= 100; i++)
    {
      if (i % 3 == 0 || i % 5 == 0)
      {
        Console.WriteLine("BUM");
        continue;
      }
      int j;
      for (j = 1; j <= i; j *= 10)
      {
        int digit = (i / j) % 10;
        if (digit == 3 || digit == 5)
        {
          Console.WriteLine("BUM");
          break;
        }
      }
      if (j > i)
      {
        Console.WriteLine(i);
      }
    }
  }
}


Czas usunąć średniki ;) Maina niestety nie udało mi się usunąć... jeszcze ;)

wtorek, 13 kwietnia 2010

C# i proste sortowanie

Często musimy posortować listę obiektów do których nie ma standardowych metod porównywania. Bo nam się nie chce ich pisać ;) Albo akurat musimy posortować po numerze PESEL, a nie nazwisku.

Wcześniej w C# jak i w Javie trzeba pisać specjalny komparator na tą jedną okazję - zazwyczaj pisało się go w miejscu, co nie było ani eleganckie, ani przejrzyste.

Na szczęście od pewnego czasu mogą nam przyjść na pomoc wyrażenia lambda. Po blisko 80 latach od wynalezienia teraz w Twoim domu! Lub biurze, jeżeli pracujesz w biurze.

niedziela, 27 września 2009

Claude Monet i składowa Y

Claude Monet to prekursor impresjonizmu. Impresjonizm chce "złapać uciekające chwile", które wydają się nieuchwytne oraz oddawaniu subiektywnych wrażeń (impresji). Monet miał talent do przedstawiania rozedrganego, ulotnego, migoczącego słońca i jego refleksów na statycznym obrazie. Jak tego dokonywał, a właściwie dlaczego mu się to udawało?

poniedziałek, 21 września 2009

Kolejka priorytetowa w C#

Ostatnio implementując A* w C# potrzebowałem kolejki priorytetowej.
W odmętach internetu odnalazłem następującą implementację:
http://blogs.msdn.com/ericlippert/archive/2007/10/08/path-finding-using-a-in-c-3-0-part-three.aspx
Wykorzystuje ona uporządkowany słownik (czyli drzewo BST) "zwykłych" kolejek. Oczywiście nie byłbym sobą, gdybym nie poprawił tego trochę ;)