Шифр Цезаря

Шифр Цезаря — один из древнейших шифров. При шифровании каждый символ заменяется другим, отстоящим от него в алфавите на фиксированное число позиций. Шифр Цезаря можно классифицировать как шифр подстановки, при более узкой классификации — шифр простой замены.


Шифр назван в честь римского императора Гая Юлия Цезаря, использовавшего его для секретной переписки. Естественным развитием шифра Цезаря стал шифр Виженера. С точки зрения современного криптоанализа, шифр Цезаря не имеет приемлемой стойкости.


 Вот мой вариант реализации на С++:

#define SIZE 26

const char low_char[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};

const char high_char[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};

//
// Crypt algorithm
//
std::string crypt(std::string &InputString, int key){
bool OK;
std::string OutputString;
for(unsigned i=0; i OK=false;
for(int j=0; j if (InputString[i] == low_char[j]){
j += key;
while (j >= SIZE) j -= SIZE;
while (j < 0) j += SIZE;
OutputString += low_char[j];
OK=true;
break;
}
if (InputString[i] == high_char[j]) {
j += key;
while (j >= SIZE) j -= SIZE;
while (j < 0) j += SIZE;
OutputString += high_char[j];
OK=true;
break;
}
}
if(!OK)
OutputString +=InputString[i];
}
return OutputString;
}

//
// Decrypt algorithm
//
std::string decrypt(std::string &InputString, int key){
bool OK;
std::string OutputString;
for(unsigned i=0; i OK=false;
for(int j=0; j if (InputString[i] == low_char[j]){
j -= key;
while (j >= SIZE) j -= SIZE;
while (j < 0) j += SIZE;
OutputString += low_char[j];
OK=true;
break;
}
if (InputString[i] == high_char[j]) {
j -= key;
while (j >= SIZE) j -= SIZE;
while (j < 0) j += SIZE;
OutputString += high_char[j];
OK=true;
break;
}
}
if(!OK)
OutputString +=InputString[i];
}
return OutputString;
}

Исчезает консольное окно

Проблема многих новичков:  после компиляции исходного кода и запуска консольного  приложения результат выводившийся на экран невиден.  Говоря иными словами программа выполняется и сразу закрывается. Это потому что компилятор запущен в графическом режиме и на время выполнения программы вызывается консоль, а после завершения программы закрывается. Но если скомпилированную программу запустить через консоль, как это обычно делается, то результат никуда не исчезнет. Но чтобы не залезать каждый раз в консоль можно применять приёмы. Вот три способа :

_getch();   // надо подключить conio.h
system(“pause”);   // надо подключить stdlib.h
cout<<endl;  // надо подключить iostream и пространство имён std

Компьютерный сленг

Вот список часто используемых и общепринятых слов компьютерного сленга. Нужно обратить внимание, что большинство слов взято из английского языка и пишется так, как произносится.

Админ - администратор.
Аська - прграмма общения ICQ.
Апгрейдить - улучшить что-либо. Сделать Апгрейд.
Батон - клавиша на клавиатуре. Отсюда выражение "топтать батоны."
Баг - ошибка в программе.
Белая сборка - компьютер, собранный на территории Европы или Северной Америки, то есть качественный компьютер.
Бета-тестер - человек, на котором испытывают новую программу для того, чтобы выявить ошибки и узнать мнение пользователя.
Брякпойнт - точка прерывания, то есть место, где может быть прервано выполнение программы.
Бэд-сектор - некачественный поврежденный сектор, куда нельзя записать информацию.
Винда - OS Windows.
Вир, Вирь - компьютерный вирус.
Вирмэйкер - человек, создающий вирусы.
Всосать - принять полностью что-либо по модему.
Вырубить - выключить.
Варез - нелицензионная программа (от англ. Warez).
Винт - винчестер, жесткий диск.
Видюха - видеокарта.
Висельник - системный программист.
Вес - размер файла, папки, программы.
Гестбук - гостевая книга (от англ. Guestbook).
Глюк - сбой в программе.
Глючить - работать со сбоями.
Глюкало - удобная программа, имеющая красивый внешний вид и развернутую панель с прекрасными кнопочками, но ничего полезного не делающая. Дерьмо, одним словом.
Гиг, Гига - гигабайт (примерно миллиард байтов).
Глюкодром - сбойное аппаратное обеспечение.
Дедик - выделенный сервер (dedicate).
Дельфин - язык программирования Borland Delphi.
Дельфинист - программист на Borland Delphi.
Док, Дока - документация.
Доска - клавиатура.
Домен - членораздельный адрес в интернете. Например www.narod.ru. Здесь ".ru" - домен 1-го уровня, ".narod" - домен 2-го уровня, "www" - домен 3-го уровня.
Директория - папка (directory).
Дебаггер, Долбаггер - программа для поиска, исправления глюков, а так же для взлома.
Дрова - драйвер.
Жертва - компьютер в руках у чайника.
Железо - материнская, звуковая и прочие платы. "Начинка" компьютера.
Живность - вирусы.
ЗЫ - буквы "З" и "Ы" расположены на клаве там же, где латинские "P" и "S", то есть PS.
Захачить - взламывать, переделывать прогу.
Зверь - вирус.
Зухель - модем фирмы Zyxel.
Интерпретатор, Интертрепатор - программа, выполняющая определенные действия на команды, записанные в текстовом файле.
Исходники - исходные тексты прграмм, для некоторых - исходящая почта.
Инет - интернет.
Клава - клавиатура, Клавка.
Коннект - связь с интернетом.
Комп - компьютер.
Кебарда, Кеборда - клавиатура.
Клацнуть педалью - нажать на клавишу Кебарды.
Компилятор - программа, переводящая текстовые файлы в двоичные исполняемые.
Компильнуть - провести компиляцию.
Крэк - программа взломщик.
Ламер - чайник, возомнивший себя крутым.
Лист - список рассылки, используется для оповещения широких масс одним простым письмом (от англ. Mailing List).
Левый - купленный у черта на рогах, без гарантии.
Лич - выкачивание файлов.
Личер - человек, который подсел с потрохами на скачивание варезов. Такие люди могут с легкостью заработать Клизму.
Ломиться в сеть - настойчиво дозваниваться до провайдера.
Лузер - юзер, дела которого оставляют желать лучшего. Дай такому человеку комп - он его по четырем задницам пустит.
Ляп - сбой, баг.
Мессага - сообщение, письмо (от англ. Message).
Мыло - e-mail, адрес электронной почты, почтовый ящик.
Метр - мегабайт.
Мазерборд - мать.
Маздай - OS Windows (от англ. "Must Die!" - должен умереть).
Мелкософт - фирма Microsoft.
Набить текст - создать текстовый файл.
Обои - бэкграунд, фоновый рисунок на рабочем столе.
ОЗУ - Оперативное Запоминающее Устройство, озушка, оперативная память.
Окна - винды.
Ось, Оса - операционная система OS/2.
Отлаживать - приводить программу в рабочее состояние.
Отпачить - исправить.
Отформатировать - разметить диск.
Оффтопик - брякнуть что-то мимо кассы.
Пень - Pentium.
Прога - программа.
Пассворд - пароль.
Повиснуть - зависнуть.
Полуось - OS/2.
Полетел - испортился.
Порезать диск - разделить физический диск на несколько логических.
Портабильный - переносной компьютер.
Похерить - сделать ксерокопию.
Поюзанный - бывший в употреблении
Пофиксить баги - исправить ошибки.
Приаттачить - присоединить файл к письму.
Привинтить - установить что-нибудь на компьютер.
Прикрутить - привинтить.
Проц - процессор.
Релиз - окончательная версия программы.
Ругается - выдает сообщения. Вроде ничего такого не говорит, а злит как х... моржовый! Имеются в виду сообщения об ошибках.
Русь'инфицировать - перевести на русский язык, русифицировать.
Сдохнуть - прекратить работать.
Спам - непрошенная рекламная почта.
Сервак - сервер.
Слить - скачать файло с сервака.
Сбросить на диск - переписать на носитель информацию.
Сетка - сеть Internet.
Сисадмин - системный администратор.
Слот - разъем для контроллеров.
Смайлик - динамичный рисунок, совершенно бесполезный, кстати.
Софт - прога.
Сорец - исходник.
Тоссировать - готовить почту к отправке.
Тулза - утилита.
Тюкнуть файл - удалить файл.
Убить - удалить файл.
Унитаз - виндовозная Корзина.
Упал - сервер, прекративший отвечать на запросы пользователей.
Утоптать - заархивировать.
Флудить - порождать бессмысленные потоки информации. Например, в ЧАТах, если повторяете одну и ту же фразу несколько раз. Обычно это слегка бесит. Забава для безголовых ламеров.
Флоп, Флоповод - дисковод.
Фонт - шрифт.
Фиксить - исправлять ошибки.
Форточки - OS Windows.
FAQ - ответы на часто задаваемые вопросы (от англ. Frequently Asked Questions).
Хакер - взломщик, преступник. Обычно с хорошими знаниями и соответствующим оборудованием
Хачить - взламывать, портить людям жизнь, заниматься хакерством
Хак - взломанная прога.
Халява - Freeware.
Хард - винчестер.
ЧАВО - обрусевший FAQ.
Чайник - 1. Человек, ничего не понимающий в компах. 2. Металлическая посуда с вытянутым горлышком и чрезвычайно удобной ручкой. Служит для повышения температуры воды в связи с ее нагреванием.
Чатить - безвылазно тусоваться в ЧАТах.
Шаровары - программы ShareWare.
Шуршать - искать что-либо на дисках.
Эвент - событие.
Экзешник - файл с расширением .ехе.
Юзер, Юзверь, Юзверг - пользователь, user.
Юниксоид - пользователь операционной системы Unix.
Юзать - пользоваться.
Яха - компьютер Yamaha.

Задача: Интересное число

Для заданного числа    N  найти наименьшее положительное число с суммой цифр равной  N, которое делится на  N.

Входные данные

Входные данные состоят из нескольких тестов. Для каждого теста в одной строке  записано одно число  N (1< N<109). Тесты заканчиваются строкой с единственным числом  0.

Выходные данные

В каждой строке выходных данных содержится единственное искомое число. Выходные данные заканчиваются строкой с числом 0.

Вот и решение:

#include "stdafx.h"
#include
using namespace std;

#define SIZE 1000000000
#define SIZE1 1000000000000000


int _tmain(int argc, _TCHAR* argv[])
{
    unsigned long long N,i,b[20],summa,a[20];
    bool sss=false;
    int j,k;
    while (1) 
   {
       cout<<"Vvedite chislo: ";
       cin>>N;

       if (N==0) 
         exit(1);
       else
          if (N>1 && N
          {
                   
               for (i=N; i<=SIZE1 ;i++) 
              {
                          
                   if (i%N==0) 
                  {
                      summa=0;
                      b[0]=i;
                      for (j=0; j<=15. ; j++) 
                      {
                           a[j]=b[j] % 10;
                           b[j+1]=b[j] / 10;
                           if (b[j+1]==0) 
                           {
                               for (k=0; k<=j ;k++) 
                                               {
                                                      summa=summa+a[k];
                                               }
                                               if (summa==N) 
                                                      sss=true;
                                               else
                                                      sss=false;
                                        break;
                                        }
                                  }
                           }

                           if (sss)
                           {     
                                  cout<'\n';
                                  break;
                           }
                    }
            
             }
             else
                    cout<<"\nVvedite chislo bolshe 1 i menshe 1000000000.\nEsli vvedete 0 proqramma zavershitsa!\n\n";
       }
       return 0;
}




Форматирование ввода/вывода в С++

В С++ информацию можно вводить и выводить в широком диапазоне форм. Можно изменять определённые параметры ввода и вывода  информации. Каждый поток (cin и cout) имеет набор флагов формата (format flags), которые предназначены для управления форматированием информации и представляют собой битовые маски(bitmasks), т.е каждый флаг занимает один бит. Стандартная библиотека  ввода/вывода С++ (Standard C++) создаёт два класса шаблона: одна для 8-ми битных символов, а другая для 16-ти битных символов. К 16-ти разрядным относятся символы уникода, каждый из которых хранится в 2-х байтах. Здесь речь пойдёт о 8-ми разрядных потоках, так как они используются чаще всего. К ним относятся потоки: cout, cin, cerr, clog. Да, в отличии от языка С (stdout, stdin, stderr) в С++ открываются целых четыре потока. Битовые маски объявлены в классе ios (производный от класса basic_ios) как данные типа fmtflags (аналогичен типу long). Вот список флагов: 

  • ·         adjustfield (ставит флаги left, right и internal)
  • ·         basefield (ставит флаги oct,dec и hex)
  • ·         boolalpha (данные типа bool выводятся в виде “true” и “false”)
  • ·         dec (вывод в десятичной системе счисления, установлен по умолчанию)
  • ·         fixed (вещественные числа выводятся в обычной форме)
  • ·         floatfield (ставит флаги scientific и fixed)
  • ·         hex (вывод в шестнадцатеричной системе счисления)
  • ·         internal (для заполнения поля вставляется пробел между цифрами)
  • ·         left (выравнивание по левому краю)
  • ·         oct (вывод в восьмеричной системе счисления)
  • ·         right (выравнивание по правому краю)
  • ·         scientific (вывод вещественных чисел с использованием “E”)
  • ·         showbase (показывает основание типа системы счисления)
  • ·         showpoint (показывает десятичную точку и последующие нули для вещественных чисел)
  • ·         showpos (показывает знак “+” перед положительными числами)
  • ·         skipws (отбрасываются невидимые символы(пробел, перенос строки, табуляция))
  • ·         unitbuf (освобождает буфер)
  • ·         uppercase  (переводит регистр в верхний уровень)  
  
Внутри класса ios имеются три функции для работы с вышеперечисленными флагами: setf(), unsetf(), flag().  Теперь по порядку об использовании этих функций.
Функция setf() устанавливает флаг, который передаётся в функцию как параметр. Объявлена эта функция следующим следующим образом:
fmtflags setf (fmtflags flag);
Здесь вместо “flag” нужно подставить флаг который надо установить. НО! Флаги являются членами класса ios и просто к ним не обратиться. Поэтому надо использовать оператор глобального разрешения
“::”. Например: ios::showbase. Возвращает функция старое значение переданного в параметре флага. Важно понять, что установив тот или иной флаг он будет распространяться на каждый поток создаваемый этим классом, то есть на потоки cout и cin.  Пример использования:
cout.setf (ios::hex);
Функция unsetf() предназначена для снятия флажка. Объявлена так:
void unsetf (fmtflags flag);
Как видно функция ничего не возвращает. Пример использования:
 
cout.unsetf(ios::dec);
 При использовании функций setf и unsetf в качестве параметра можно передавать несколько флагов. Для этого достаточно разделять их оператором побитового ИЛИ. Например:
cout.setf (ios::showpos | ios::showpoint | ios::hex);
cout.unsetf (ios::showpos | ios::showpoint | ios::hex);
Приведу пример с использованием обеих функций.

 #include "stdafx.h"
 #include "iostream"
 #include
 using namespace std;
  
 void main ()
 {
       cout<<-10<<' '<<10<<' '<<123.4<<"\n\n";
       cout.setf (ios::showpoint | ios::showpos | ios::scientific);
       cout<<-10<<' '<<10<<' '<<123.4<<"\n\n";
       cout.unsetf(ios::showpoint | ios::showpos | ios::scientific);
       cout<<-10<<' '<<10<<' '<<123.4<<"\n\n";
       _getch();
 }

И наконец последняя функция flags(). Объявлена она следующим образом:
fmtflags flags (fmtflags flags);
Эту функцию можно использовать двояко. Первый способ это получение информации о всех полях. Пример:
ios::fmtflags OldFlags;
OldFlags=cout.flags ();
Второй способ заключается в том, что с помощью этой функции можно установить все флажки формата. Для этого функции нужно передать переменную с информацией о всех полях. При этом предыдущие поля перезаписываются на новые. Пример:
cout.flags(OldFlags);
В качестве примера простая программа:

 #include "stdafx.h"
 #include
 #include
 using namespace std;
 void main()
 {
        cout<<-10<<' '<<10<<' '<<123.4<<"\n\n";
        ios::fmtflags OldFlags;
        OldFlags=cout.flags();
        cout.setf (ios::showpoint | ios::showpos | ios::scientific);
        cout<<-10<<' '<<10<<' '<<123.4<<"\n\n";

        cout.flags(OldFlags);
        cout<<-10<<' '<<10<<' '<<123.4<<"\n\n";
        _getch();
 } 

Если будете практиковаться с флажками формата, то очень кстати придётся вот эта функция:

 void showflags()
 {
     ios::fmtflags flags;
     flags=cout.flags();
     if (flags & ios::skipws) cout<< "skipws enable\n";
     else cout<< "skipws disable\n";
     if(flags & ios::left) cout << "left enable\n";
     else cout << "left disable\n";

     if(flags & ios::right) cout << "right enable\n";
     else cout << "right disable\n";

     if(flags & ios::internal) cout << "internal enable\n";
     else cout << "internal disable\n";
     if(flags & ios::dec) cout << "dec enable\n";
     else cout << "dec disable\n";
     if(flags & ios::oct) cout << "oct enable\n";
     else cout << "oct disable\n";
     if(flags & ios::hex) cout << "hex enable\n";
     else cout << "hex disable\n";
     if(flags & ios::showbase) cout << "showbase enable\n";
     else cout << "showbase disable\n";

     if(flags & ios::showpoint) cout << "showpoint enable\n";
     else cout << "showpoint disable\n";

     if(flags & ios::showpos) cout << "showpos enable\n";
     else cout << "showpos disable\n";

     if(flags & ios::uppercase) cout << "uppercase enable\n";
     else cout << "uppercase disable\n";

     if(flags & ios::scientific) cout << "scientific enable\n";
     else cout << "scientific disable\n";

     if(flags & ios::fixed) cout << "fixed enable\n";
     else cout << "fixed disable\n";

     if(flags & ios::unitbuf) cout << "unitbuf enable\n";
     else cout << "unitbuf disable\n";

     if(flags & ios::boolalpha) cout << "boolalpha enable\n";
     else cout << "boolalpha disable\n";

    cout << "\n";
}

Она выводит информацию о полях. 

Notepad++ на Азербайджанском

Месяц назад скачал Notepad++ для семёрки с официального сайта. Так вот решил собственноручно перевести его на родной азербайджанский. Перевод занял почти месяц, так как меню в программе не бедствует. Скачать патч можно отсюда 


А вот и скрин:

Хэндл окна консольной программы

При написании кода консольной программы иногда бывает, что приходится работать с функциями, в которорых один из параметров это хендл текущего приложения. А может и вообще в собственных функциях понадобится. Понятно что для консольного приложения его просто не получить. Это в оконных программах он получается автоматом. Например:

 int WINAPI WinMain (
 HINSTANCE hInstance,
 HINSTANCE hPrevInstance, 
 PSTR lpCmdLine, 
 int nCmdShow)

Задесь hInstance это хендл оконного приложения. А как же получить хендл консольной программы?

Вот простая функция:

 HANDLE GetConsoleHANDLE  ( ) {
 HANDLE handleConsoleWindow; 
 SetConsoleTitle (NAME_CONSOLE_APPLICATION);
 handleConsoleWindow = FindWindow (NULL, NAME_CONSOLE_APPLICATION);
 if ( handleConsoleWindow==0 )
 printf ("Error Find Window");
 return handleConsoleWindow;
 }

Итак функция имеет тип HANDLE потому, что  возвращает переменную именно такого типа. Функция начинается с того что обьявляется переменная handleConsoleWindow типа HANDLE и именно её впоследствии  после обработки будет возвращать функция. Затем вызываем функцию SetConsoleTitle, которой в качестве параметра передаём заголовок окна консоли. Т.е эта функция устанавливает заголовок NAME_CONSOLE_APPLICATION консольному окну, где запущенна программа. Затем вызывается функция FindWindow, которая ищет окно с заголовком NAME_CONSOLE_APPLICATION, для этого он передаётся в качестве параметра функции. Если функция находит окно, т.е окно вашей программы, она возвращает хендл программы (окна). Если не находит, то возвращает ноль. И в конце возвращаем переменную handleConsoleWindow. Да, кстати незабудьте определить макрос NAME_CONSOLE_APPLICATION.
Например:


 #define NAME_CONSOLE_APPLICATION      "This is my program!"

Как обновить eset nod32 без интернета


С этим столкнулся когда устанавливал антивирус на компьютерах не имеющих подключения к интернету или имеющих, но технологией dial-up. Понятно что на dial-up далеко не уедешь и обновление будет занимать много времени. Ну вот собственно как раз на такой случай жизни есть простое и безотказное решение, которое я опишу снизу. Кстати способ этот действует как для ESET NOD32 (антивирус), так и для ESET NOD32 Smart Security (антивирус+файервол), для 3-й и 4-й версий.

Первым делом нужно достать сигнатурную базу ESET NOD32. Как бы это громо не звучало, делаеся это очень просто. Достаточно скачать архив вот с этой страницы. Внимание!!! Предварительно нужно временно отключить интернет защиту или полную защиту NOD-а, так как он блокирует сайт, считая его опастным для пользователей. На самом деле сайт не опастный, просто предоставлет базу NOD-а бесплатно. Вот как отключить защиту:


  
Или вот так:


База небольшая, весит всего около 30 мегабайт. Итак после того как архив скачали, распакуем его в папку, например:
C:\NOD32_3_4_UPD
 Затем нужно указать NOD-у  откуда надо обновляться. Для этого сделайте следущее:
Нужно включить расширенную настройку.


Затем надо перейти в настройки.



Теперь перейдём в раздел с настройками обновления и добавим сервер обновлений. В качестве адреса сервера будет путь к папке, в которую мы распаковали базу.


Путь к папке, куда распаковали базу, в качестве примера у нас
 C:\NOD32_3_4_UPD
Вписываем это значение в поле  "Серверы обновлений" и нажимаем на кнопку "Добавить", затем нажимаем на кнопку "ОК", потом ещё раз "OK".


Всё, готово! Теперь нужно всего лишь обновить антивирус. Проблем не должно быть. Но если возникли, проверьте правильность указанного до папки пути и посмотрите добавлен ли он в список серверов. Этот метод не требует ключей. После обновления нужно удалить путь до папки из списка серверов, так как папка уже использованна и блокирует обновление из интернета.