Подписка на блог

Ещё есть Тумблер и ЖЖ.

В  Телеграме пишу обо всяком и собираю по крупицам годноту, которая потом появляется в блоге.

А в  Твиттере иногда репощу всякие смехуечки и пишу о том, как всё плохо.

Все остальные соцсеточки только для того, чтобы пошарить ссылку на новый пост.

5 заметок с тегом

программирование

Годнота — 20

Сегодня про семантику, небоскрёбы, продюсирование и мультики.

Статьи

Видео

  • Роднянский в гостях у Дудя.
    Интересно послушать про российское и зарубежное кино с точки зрения продюсера.
  • Мне нравятся видео от Пушного, и сам он в целом интересный чувак, хоть и дико странный. Неделю назад он запустил на своём канале рубрику «Да ладно?!», где рассказывает обо всяких интересных фактах о песнях. Посмотрите: первый выпуск, второй и третий.

Однажды в Википедии

Книги

  • «Способный ученик», Стивена Кинга.
    Когда-то я попытался прочитать «Тёмную башню» от него же, но сдулся на второй книге. Читать большие серии от Кинга мне сложно, а вот небольшие рассказы вроде этого заходят «на ура». Здесь речь о том, что лучшие из нас могут быть лучшими во всём, в том числе и не в самых хороших делах. И, возможно, ваш соседский мальчик-отличник далеко не тот, кем он кажется.
  • «От хорошего к великому», Джима Коллинза.
    Я бы сказал, что это книга для руководителей и про руководителей. Про то, как стоит управлять компанией, и как не стоит. Как стоит подбирать команду, и как не стоит. Тут как и с большинством бизнес-книг: когда читаешь её кажется, что автор пишет о каких-то банальных истинах, а потом оглядываешься и понимаешь, что вокруг эти истины почему-то никто не использует. Заставляет задуматься.

Кино

  • Легенда №17.
    Один из немногих фильмов с Козловским, который оказался хорошим. Посмотрите, если ещё вдруг не видели.

Сериалы

  • Гравити Фолз.
    Не так давно досмотрел этот клёвый мультсериал и теперь всячески его советую. Он не очень большой, лёгкий и в то же время жутко интересный.

Прошлые подборки по тегу — годнота.

∗∗∗

Спонсор выпуска: Нетология — это образовательная онлайн-платформа, где ребята из Яндекса, Гугла, Мэйла, Альфы и пр. научат вас тому, что сейчас модно: маркетингу, управлению проектами, дизайну и, конечно, программированию. У них там сегодня, к слову, стартует курс по Джаваскрипту, а совсем скоро по Реакту и 8-месячный фронтендерский. Подключайтесь.

Программа для решения систем логических уравнений на Паскале

Этот пост из одного из моих старых блогов. Из песни слов не выкинешь, потому мне не стыдно за то, что он может быть слишком детским. Клёво, если он вам чем-то помог :-)

Хочу поделиться с вами программой, которая поможет 11-м классам (а кому-то может и раньше) в информатике, при условии, что вы изучаете язык программирования Паскаль.

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

Есть только пара минусов:

  1. Она не понимает такую операцию, как импликация, однако a → b всегда можно разложить как not(a) or b.
  2. К сожалению, моих знаний пока не достаточно, чтобы сделать ввод условий через графическую оболочку, скажем так. Это означает, что условия придётся редактировать в коде самой программы.

Сама программа выглядит следующим образом:

{Программа предназначена для решения
систем линейных уравнений по информатике.
Перед использованием разложите условие на and, or, not, xor, = и <>.
Не забудьте изменить условие и количество переменных (n).
Также можете поставить вывод переменных, если он нужен.

Igor Adamenko, 2011}

program logical_system;

type
  massive = array [1..1024, 1..10] of boolean;

var
  n, all, i, j, zn, zn0, x, k: integer;
  mass: massive;

procedure input(zn0, zn, n, x: integer; var mass: massive);
var
  i: integer;
begin
  for i := zn0 to zn do
    mass[i, n] := False;
  for i := (zn + 1) to zn + x do
    mass[i, n] := True;
end;

begin
  n := 10; //Количество переменных меняется тут.
  all := 2;
  for i := 2 to n do
    all := all * 2;
  zn := all div 2;
  input(1, zn, 1, zn, mass);
  for i := 2 to n do
  begin
    zn := zn div 2;
    zn0 := 0;
    x := zn;
    for j := 1 to (all div zn) div 2 do
    begin
      input(zn0 + 1, zn, i, x, mass);
      zn0 := zn0 + zn * 2;
      zn := zn + x * 2;
    end;
    zn := x;
  end;

  k := 0;
  for i := 1 to all do
    if
      {Здесь пишутся условия.
      Переменные принимают вид: mass[i, 1] - это x1}
    then
    begin
      // for j := 1 to n do   //Если нужен вывод вариантов, уберите //
      // begin
      //   write ('x', j, ' = ');
      //   if mass[i, j] = False then
      //     write ('0 ')
      //   else
      //     write ('1 ');
      // end;
      // writeln;
      inc (k);
    end;
  writeln ('Решений системы уравнений: ', k);
end.

Знающий человек также заметит, что в type описана матрица 1024×10, это значит, что максимальное количество переменных в условии может быть 10, однако, в любой момент вы можете изменить эти числа. Первое число это 2 в степени n, а второе n, где n — количество переменных.

Приведу маленький пример, как с ней работать. Допустим, что мне нужно найти количество решений для следующей системы уравнений (* — конъюнкция, + — дизъюнкция, <=> — эквивалентность):

x1 * x2 * x3 = 0
x4 + x5 = 1
(x1 + x2 + x3 + x4 + x5 + x6) * (x7 + x8) = 0
(x1 + x2+ x3) * (x4 + x5 + x6) * (x7 + x8) = 0
(x1 <=> x4) * (x7 <=> x8) = 1
(x2 <=> x5) * (x7 <=> x8) = 1
(x3 <=> x6) * (x7 <=> x8) = 1
(x4 + x5 + x6) * x4 * x5 * x6 = 0

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

Для начала считаем количество различных переменных. Их у нас 8, поэтому меняем значения параметра n на 8:

n := 8;

Вводим условия. В программе массив с данными объявлен как mass, поэтому все xN заменяем на mass[i, N]. К примеру, x1 будет mass[i, 1]. Значит, находим строчку, где вписывается условие (там написан соответствующий комментарий) и после if, но перед then, записываем данные условия, соединяя уравнения and-ом, ибо это же система. Равенство нулю заменяется на равенство False, а единице — True. Ну и естественно, конъюнкция — and, дизъюнкция — or, строгая дизъюнкция — xor, эквивалентность — =, инверсия эквивалентности — <>, инверсия — not(a), где a — инверсируемая переменная (или какое-то выражение).

Итог в примере будет вот такой:

((mass[i, 1] and mass[i, 2] and mass[i, 3]) = False) and
((mass[i, 4] or mass[i, 5]) = True) and
(((mass[i, 1] or mass[i, 2] or mass[i, 3] or mass[i, 4] or mass[i, 5] or mass[i, 6]) and (mass[i, 7] or mass[i, 8])) = False) and
(((mass[i, 1] or mass[i, 2] or mass[i, 3]) and (mass[i, 4] or mass[i, 5] or mass[i, 6]) and (mass[i, 7] or mass[i, 8])) = False) and
(((mass[i, 1] = mass[i, 4]) and (mass[i, 7] = mass[i, 8])) = True) and
(((mass[i, 2] = mass[i, 5]) and (mass[i, 7] = mass[i, 8])) = True) and
(((mass[i, 3] = mass[i, 6]) and (mass[i, 7] = mass[i, 8])) = True) and
(((mass[i, 4] or mass[i, 5] or mass[i, 6]) and mass[i, 4] and mass[i, 5] and mass[i, 6]) = False)

Запустив программу получим:

Решений у системы уравнений: 5

Если нам нужно будет ещё и вывести данные решения, то надо убрать // перед строками:

for j := 1 to n do   //Если нужен вывод вариантов, уберите //
begin
  write ('x', j, ' = ');
  if mass[i, j] = False then
    write ('0 ')
  else
    write ('1 ');
end;
writeln;

Вот и всё. Попозже ещё выложу подобную программу на C++, как только освою синтаксис, который мне здесь потребовался :-)

2011   информатика   логика   обучение   паскаль   программирование   уравнения

Почему не работают программы из книг по Си++ в Code::Blocks и других IDE

Этот пост из одного из моих старых блогов. Из песни слов не выкинешь, потому мне не стыдно за то, что он может быть слишком детским. Клёво, если он вам чем-то помог :-)

Читая книгу Пола и Харви Дейтелов «Как программировать на C++», я столкнулся с тем, что примеры, которые там есть по данному языку программирования, отказываются работать в Code::Blocks.

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

Вот пример обычной программы в примере из книги:

// Первая программа на C++
#include <iostream.h>

main()
{
    cout << "Добро пожаловать в C++!\n";

    return 0; //показывает, что программа успешно окончена
}

Эта программа при компиляции вызовет у вас кучу ошибок, а именно:

  1. iostream.h — неизвестная библиотека;
  2. main () — ожидалось int main ();
  3. cout — неизвестная операция.

За время, что прошло с момента выхода книги (примерно лет 30, я думаю), сменились, естественно, стандарты, поэтому теперь в названии библиотеки iostream.h отсутствует последняя .h, то есть, выглядит название так: iostream.

Перед функцией main() теперь надо добавлять int, пока не могу объяснить, с чем это связано, так что просто поверьте :) То есть в итоге должно получиться: int main().

Операции типа cout, cin, endl и прочие теперь используются с добавлением std:: перед ними, для того, чтобы показать, что они как бы входят в это самое std. То есть, вы можете использовать такие переменные, но сами операции будут с std:: перед ними: std::cout, std::cin и т. д.

В итоге ваша программа должна выглядеть следующим образом:

// Первая программа на C++
#include <iostream>

int main ()
{
    std::cout << "Добро пожаловать в C++!\n";

    return 0; //показывает, что программа успешно окончена
}

Однако, операций может быть много, и если перед каждой писать std::, то это займёт уйму времени. Если вы не собираетесь использовать переменные, созвучные данным операциям (т. е. пишущиеся так же), то можно добавить до int main() строчку using namespace std;. Этим вы укажете программе, что используете все рабочие имена из std, только учтите, что там их очень много и программа будет работать довольно долго из-за этого. Поэтому эффективнее лишь объявлять те имена, что нужны. И лучше это делать в теле функции следующим образом: using std::cout;. То есть код выглядит вот так:

// Первая программа на C++
#include <iostream>

int main ()
{
    using std::cout;
    cout << "Добро пожаловать в C++!\n";

    return 0; //показывает, что программа успешно окончена
}

Аналогично можно объявлять остальные функции. endl там, и прочее. Также я решил проблему с кодировкой, то есть, с отображением русских символов в консоли Code::Blocks. Ибо, если вы сейчас запустите данную программу, то вместо «Добро пожаловать» получите каракули.

2011   code blocks   ide   ошибки   программирование   си++

Как исправить кодировку в консоли Code::Blocks, или Русские символы как всегда кракозябры

Этот пост из одного из моих старых блогов. Из песни слов не выкинешь, потому мне не стыдно за то, что он может быть слишком детским. Клёво, если он вам чем-то помог :-)

Как я уже писал в предыдущей статье, у меня возникла проблема с отображением русских символов в консоли Code::Blocks. И я, как вы поняли, нашёл как с этим бороться.

Моя программа выглядела следующим образом:

// Первая программа на C++
#include <iostream>

int main()
{
    using std::cout;

    cout << "Добро пожаловать в C++!\n";

    return 0; //показывает, что программа успешно окончена
}

Однако, когда я её запускал, то получал следующее:

Проблема в кодировке, как вы понимаете. А если быть точнее, то в несоответствии кодировок консоли Виндоус и редактора среды разработки Code::Blocks. Я так предполагаю, что если бы я работал в юниксах, то было бы легче, но у меня как раз пока цель — научиться программировать в Виндоус, ибо именно она используется на олимпиадах и пр. Итак, выход прост:

  1. Подключаем библиотеку clocale.
  2. Добавляем строчку using std::setlocale; в теле функции main(), для использования операции setlocale без std:: в начале.
  3. В начале функции main(), но после объявления из п. 2 прописываем строчку setlocale(LC_ALL, ’’);, которая согласовывает кодировки консоли и редактора.
  4. Меняем операцию cout на wcout, чтобы указать, что здесь требуется замена кодировки. И не забудьте в объявлении using std::cout; тоже сделать замену!

В итоге получаем следующий код:

// Первая программа на C++
#include <iostream>
#include <clocale> //подключаем для использования setlocale

int main ()
{
    using std::wcout;
    using std::setlocale;

    setlocale(LC_ALL, ""); //прописываем, для согласования кодировок
    wcout << "Добро пожаловать в C++!\n"; 

    return 0; //показывает, что программа успешно окончена
}

И вот такую выдачу:

Теперь вы можете спокойно использовать русские символы в Code::Blocks.

2011   code blocks   ide   виндоус   ошибки   программирование   си++

Не работает «Hello, world!» в Code::Blocks

Этот пост из одного из моих старых блогов. Из песни слов не выкинешь, потому мне не стыдно за то, что он может быть слишком детским. Клёво, если он вам чем-то помог :-)

Расскажу вам немножечко сейчас о проблеме, с которой столкнулся сейчас, на досуге.

Так как я решил чуть-чуть подучить C++, то скачал IDE под названием Code::Blocks. Ну, а так как я вообще не в курсе пока (только чуть-чуть) ни синтаксиса, ни.. ни вообще ничего в общем. Решил я попробовать протестировать «Hello, world», который достал в Википедии, специально для C++. Вот этот, собственно:

#include <iostream>

int main()
{
    std::cout << "Hello, world!" << std::endl;
    return 0;
}

Итак, что я сделал? Я скачал IDE, запустил, создал новый проект, скопировал в него код, нажал на кнопочку с запуском, она предложила сначала собрать программу, а потом уже её запускать. Я, естественно, согласился.

В итоге я получил ошибку, которая нагло обвиняла меня в том, что компилятор не знает библиотеки iostream. Я аж опешил :) Но, надо было искать, в чём проблема.

Погуглив немного я понял, в чём дело. Изначально, когда я собирал программу, IDE предложила мне сохранить её как файл, и сразу назвала файл Untitled1.c, а так как я ни сном, ни духом, в чём суть — так и сохранил, даже не переименовывал. Так вот, библиотека iostream есть только в C++, а следовательно и файл надо было называть Untitled1.cpp.

На этой ноте «Эврика!» я ухожу дальше ковыряться, читать и придумывать, чего бы вам ещё такого написать, а вы тут читайте пока, читайте :)

P. S.: Кто не помнит или не знает, я тут конкурс запустил. Не упустите свой шанс получить бесплатно 500 и более рублей!