вторник, 29 сентября 2009 г.

Преобразование из инфиксной нотации в Обратную польскую запись

Девиз функциональны программистов - "Больше думай меньше пиши" как ниде хорошо оправдывает себя в следующем примере: Преобразование из инфиксной нотации в Обратную польскую запись.

Код Delphi:
program calc;

{$apptype console}

type
real=double;

const
prs='+-*/(';
pri:array [1..5] of byte = (1,1,2,2,0);

var
s1,s2:string;
q:array[0..500] of real;
w:array[0..500] of char;
n,len,len2,i,j:longint;
t:real;
ch:char;

procedure push(x:real);
begin
  inc(len);
  q[len]:=x;
end;

function pop:real;
begin
  pop:=q[len];
  q[len]:=0;
  dec(len);
end;

procedure pushc(x:char);
begin
  inc(len2);
  w[len2]:=x;
end;

function popc:char;
begin
  popc:=w[len2];
  w[len2]:=#0;
  dec(len2);
end;

function oper(s1,s2:real;s3:char):real;
var
s:string;
x,y,z:real;
tmp:integer;
begin
  x:=s1;
  y:=s2;
  case s3 of
    '+':z:=x+y;
    '-':z:=x-y;
    '*':z:=x*y;
    '/':z:=x/y;
  end;
  oper:=z;
end;

procedure prechange(var s:string);
var
i:longint;
begin
  if s[1]='-' then s:='0'+s;
  i:=1;
  while i<=n do if (s[i]='(')and(s[i+1]='-') then insert('0',s,i+1) else inc(i);
end;

function change(s:string):string;
var
i:longint;
rezs:string;
c:boolean;
begin
  c:=false;
  for i:=1 to n do begin
    if not(s[i] in ['+','-','*','/','(',')']) then begin
      if c then rezs:=rezs+' ';
      rezs:=rezs+s[i];
      c:=false;
    end
    else begin
      c:=true;
      if s[i]='(' then pushc(s[i]) else
      if s[i]=')' then begin
        while w[len2]<>'(' do begin
          rezs:=rezs+' '+popc;
        end;
        popc;
      end else
      if s[i] in ['+','-','*','/'] then begin
        while pri[pos(w[len2],prs)]>=pri[pos(s[i],prs)] do rezs:=rezs+' '+popc;
        pushc(s[i]);
      end;
    end;
  end;
  while len2<>0 do rezs:=rezs+' '+popc;
  change:=rezs;
end;

function count(s:string):real;
var
ss:string;
x,s1,s2:real;
chh,s3:char;
p,i,j:longint;
tmp:integer;
begin
  i:=0;
  repeat
    j:=i+1;
    repeat inc(i) until s[i]=' ';
    ss:=copy(s,j,i-j);
    chh:=ss[1];
    if not(chh in ['+','-','*','/']) then begin
      val(ss,p,tmp);
      push(p);
    end
    else begin
      s2:=pop;
      s1:=pop;
      s3:=chh;
      push(oper(s1,s2,s3));
    end;
  until i>=n;
  x:=pop;
  count:=x;
end;

procedure writeL(x:real);
var
y,a,b:longint;
q:real;
begin
  y:=trunc(x);
  b:=0;
  if abs(x-y)<(1e-12) then
  writeln(y)
  else begin
    if y>0 then a:=round(ln(y)/ln(10))+1 else a:=1;
    q:=x;
    repeat
      q:=q*10;
      inc(b);
    until abs(q-trunc(q))<(1e-12);
    writeln(x:a+b:b);
  end;
end;

begin

repeat
    writeln('Enter expression');
    readln(s1);
    n:=length(s1);
    prechange(s1);
    n:=length(s1);
    s2:=change(s1);
    if s2[1]=' ' then delete(s2,1,1);
    s2:=s2+' ';
    n:=length(s2);
    t:=count(s2);
    writeL(t);
    writeln('One more expression?(Y/N)');
    readln(ch);
until upcase(ch)='N';

end.

Colored with dumpz.org

Colored with dumpz.org


Код Haskell:
calc :: String -> [Float]
 calc = foldl f [] . words
   where
     f (x:y:zs) "+" = (y + x):zs
     f (x:y:zs) "-" = (y - x):zs
     f (x:y:zs) "*" = (y * x):zs
     f (x:y:zs) "/" = (y / x):zs
     f xs y         = read y : xs

Colored with dumpz.org

Colored with dumpz.org

понедельник, 28 сентября 2009 г.

Haskell IDE

Давно выбирал себе инструмент в лице IDE с подсветкой синтаксиса, встроенным интерпритатором, адекватным отладчиком и т.д. для Haskell. Остановил свой выбор на Leksah, одна из немногих IDE для Haskell, которая удовлетворяет всем моим требованиям.


суббота, 26 сентября 2009 г.

Yet another blog

Создал еще один блог в сервие yaproger.

Так что милости просим по адресу - Yet another blog

суббота, 12 сентября 2009 г.

C днем программиста!!!

13.09.2009, Москва 00:12:27 Россия впервые отмечает День программиста. Накануне президент РФ Дмитрий Медведев своим указом установил профессиональный праздник программистов, который отмечается 13 сентября (в 256-й день года), если год високосный - 12 сентября.

Неофициально День программиста отмечается в мире уже много лет на 256-й день каждого года. Число 256 выбрано потому, что это количество целых чисел, которое можно выразить с помощью одного восьмиразрядного байта и также это максимальная степень числа 2, которая меньше 365, сообщает ИТАР-ТАСС.

Так что с праздником коллеги!!!

среда, 9 сентября 2009 г.

uzbl - *nix браузер

Вышла альфа версия браузера поддерживающая философию *nix:
Релиз-инженер Arch Linux Дитер Платинк (Dieter Plaetinck) некоторое время назад загорелся идеей создать браузер, который бы отвечал философской концепции Unix: «программа, должна уметь делать одну операцию, но делать ее хорошо, должна интегрироваться с другими программами, и использовать стандартные потоки ввода/вывода для обмена данными». В результате появился легкий и быстрый браузер Uzbl, который в тесте Acid3 показывает впечатляющие результаты. Основанный на WebKit, он управляется горячими клавишами, на манер редактора Vim, а его функциональность расширяется за счет скриптов.

Основные особенности браузера:

* Минималистичный графический интерфейс. На панели отображается только то, что пользователь желает видеть.
* Все, что напрямую не относится к навигации по сети, в Uzbl отсутствует. Такие операции, как смена URL, управление загрузками, работа с закладками, история посещения, выполняются с помощью внешних скриптов, которые пользователь пишет сам.
* Управление браузером может осуществляться с помощью таких средств, как клавиатура, stdin, fifo и файлы-сокеты.
* Расширенный настраиваемый интерфейс горячих клавиш позволяет создавать привязки, к каким привык пользователь, делая браузер похожим на vim, emacs или любую другую программу.
* Все настройки хранятся в простом текстовом файле в формате, удобном для чтения.
* Приоритетом Uzbl является простота и конфигурируемость абсолютно всех аспектов его работы.

Uzbl находится в стадии активной разработки и текущий релиз нужно рассматривать как альфа версию. (с) opennet.ru
Oффициальный сайт uzbi

суббота, 5 сентября 2009 г.

Проблемы с переключением раскладки Debian

После настройки системы заметил что не переключается раскладка клавиатуры, хотя в Control Center все вроде бы выставлено и раскладки и горячие клавиши. Проблема решилась давольно простым способом, добавлением 2 строчек в /etc/X11/xorg.conf в секцию InputDevice:
Option "XkbLayoout" "us,ru"
Option "XkbOptions" "grp:alt_shift_toggle

И все после этого заработало

пятница, 4 сентября 2009 г.

Настройка wi-fi в Debian

Случилось мне сегодня устанавливать Debian Lenny на одну из машин. Установилась система вроде бы правильно, начал проверять оказалось все в порядке кроме подключения по беспроводной сети, ну ни в какую не мог обнаружить модем. Начал разбираться в чем проблема, оказалось в ядре 2.26 нет драйверов для моей карточки Intel WIFI Link 5100... Решается данная проблема следующим образом:

1. Для начала убедитесь что в /etc/apt/sources.list есть зеркало:                                                
 #Backported packages for Debian Lenny
deb http://www.backports.org/debian lenny-backports main contrib non-free

2. Затем обновим список пакетов
  # aptitude update
  # aptitude -t lenny-backports install debian-backports-keyring
3. Установим ядро версии 2.6.30 или более поздне версии, а также следующие пакеты: wireless-tools, firmware-iwlwifi.
# aptitude update
# aptitude -t lenny-backports install linux-image-2.6.30-bpo
# aptitude -t firmware-iwlwifi
# aptitude -t wireless-tools
4.Reboot системы.
5. Если модуль не загрузился автоматически то сделаем это вручную:
#modprobe iwlagn
6. Активируем интерфейс:
# ifconfig wlan0 up
И напоследок осталось сконфигурировать подключение в KNetworkManager и наслаждаться интернетом.

вторник, 1 сентября 2009 г.

Проблемы с временем в Arch Linux

При обновлении системы Arch Linux на домашнем компьютере, возникли проблемы с временем, при каждом включении машины время отставало на пять часов. Вылечить оказалось  очень просто. В файле /etc/rc.conf, закомментируем строчку - TIMEZONE = "YOUR_TIME_ZONE" и в HARDWARECLOCK должно быть значение local.

Поиск по этому блогу

Powered By Blogger