Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Программирование с нуля - это совсем просто! 50) Где логика и где разум


Информационный Канал Subscribe.Ru

 
Школа программирования

Программирование с нуля - это совсем просто!

50) Где логика и где разум.

У многих, делавших задания с обработкой строк и символов, выявилась интересная вещь. Неожиданно раздавались, как написал один из подписчиков, "непонятные сигналы от биоса". Непонятные сигналы от биоса - это просто есть символы, по-моему код 007, который при выводе издает звук :) Это его назначение такое - не показываться на экране, а издать звук через спикер. Так что все в порядке.

* Что такое div в Си

Это хитрая вещь, возвращает целую и дробную части от деления двух параметров. Результат - особый сложный тип div_t (со временем доберемся до таких типов, нечто немного более простое, чем объекты :).

div_t x;

x = div(10,3);

x.quot будет целая часть деления (3, 10/3 = 3), x.rem - остаток (1).

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

Для текущего проекта выбираем Project - Options, на вкладке Application нажимаем кнопку LoadIcon, и загружаем из внешнего файла иконку (расширение .ico).

* Чтобы удалить из списка строку с индексом i...

можно воспользоваться методом Delete:

ListBox1.Items.Delete( i );

* У меня возникла проблема. Надо нарисовать график бегущей синусойды и еще 2 синусойды смещенные относительно друг друга. (есть 360 точек . Рисуем их. Затем получаем 361 точку. 1-ую точку викидываем.
361 становится 360. 360 - 359-ой и т.д. Выводим новый массив на экран. Такую программу я писал с помощью Tcharta но получил малое быстродействие. Может посоветуете с помощью чего писать. Может есть библиотеки. Необходимо максимальное быстродействие.
Дмитрий

В принципе достаточно и обычного PaintBox, хотя он тоже не очень быстрый. А TChart сильно тормозит, да...

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

* Я подписался совсем недавно , но первые выпуски Вашей рассылки я на сайте не нашёл . Где их можно взять ?
Алексей

Все выпуски рассылки тут:

http://russianenterprisesolutions.com/sbo/

Вообще накопилось от вас уже много замечательных материалов, и программ, но пока мы должны Базовый курс завершить прежде всего. Поэтому это все готовится! Но сегодня рассмотрим, как вызвать из одной формы другую. Делается это в общем случае так. После того, как главная форма создана, вы можете добавить в проект еще одну (или не одну, сколько хотите) форму командой File - New - Form или просто кнопочкой New Form. В дизайнере появится новая чистая форма (по умолчанию - Form2 и Unit2). Также создаете на ней все, что хотите. Только вызываться она не будет автоматически.

А как?

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

  procedure TForm1.Button1Click(Sender: TObject);
  begin
  Form2.ShowModal;
  end;

ShowModal - это метод показа формы как модального диалога, а Form2 - название нашей второй формы (новый объект программы). Во второй форме неплохо также указать в свойстве BorderStyle значение bsDialog - в стиле окон-диалогов, менять их размеры мышкой нельзя.

Однако если попробовать откомпилировать этот код, возможно будет ошибка - компилятор не найдет описание формы Form2. Естественно, ведь она в другом файле, Form2.pas описана. Дельфи 7 предложит поставить ссылку на другой файл автоматически, а в старых версиях можно вручную указать

implementation

uses Unit2; // вот это добавить, ссылку на модуль Unit2 с описанием второй формы

Название модуля мы можем задать сами - когда в первый раз новую форму сохраняем, Дельфи предложит ввести название файла. По умолчанию Form2, но если назовем MoyaForma, то и файл, и модуль так переобзовутся. То есть тогда надо будет указывать:

implementation

uses MoyaForma;

При этом сам объект формы, Form2 ( var Form2: TForm2; ), останется с именем по умолчанию. Его можно изменить, напоминаю, выбрав в инспекторе для соответствующей формы в свойстве Name новое имя (фактически - просто новое имя переменной для формы).

Теперь запустим, нажмем кнопку - появится вторая форма.

Второй способ. Формы можно делать видимыми и невидимыми на лету. Для этого положено использовать методы Hide (спрятать) и Show (показать). Тогда в основной форме можно так написать:

  procedure TForm1.Button1Click(Sender: TObject);
  begin
  Hide;
  Form2.Show;
  end;

Hide вызывается без явного указания объекта, префикса, потому что записано внутри метода формы Form1 и относится к ней самой.

А во второй форме можно на ее кнопке аналогично сделать возврат к первой:

  procedure TForm2.Button1Click(Sender: TObject);
  begin
  Hide;
  Form1.Show;
  end;

Переключаться между формами одного проекта можно так. Вызываем так называемый менеджер проекта, View - Project Manager, и если раскрыть дерево Project1, то в нем окажутся две формы Unit1 и Unit2. При этом каждую из них тоже можно раскрыть, там будут ссылки и на форму, и на программный код. Переключиться к нужной форме - двойной щелчок.

В Си, надо просто добавить еще один заголовочный файл, рядом с текущим:

#include "Unit1.h" // этот уже был
#include "Unit2.h" // этот добавили

И в другом файле, Unit2.cpp, также ссылку на Unit1 добавить (если второй способ используется).


Элемент управления Переключатель (Radio).

Обычно переключатель RadioButton (кружочек такой, внутри которого точка или есть, или нету) не используется в одиночку, как минимум должно быть два или более таких элементов, так как они предназначены для единственного выбора из множества альтернатив. Поэтому более удобен компонент RadioGroup с панели Standard. Поместим его на форму, после чего зайдем в свойство Items - там справа будет три точки-кнопочка, вызовем ее - диалог появится, и в каждой строке запишем название одного из вариантов выбора.

Например, предлагаем выбрать язык Си, Паскаль или Бейсик. Так и записываем в три строчки, после чего жмем ОК - и на форме готовый элемент выбора из трех вариантов. Узнать, какой элемент выбран, можно, обратившись к свойству под названием ItemIndex компонента RadioGroup. Если оно равно -1, значит, ни один не выбран из доступных. Кстати, в это свойство можно записать -1, чтобы сбросить текущее выделение. Если больше или равно нулю (нумерация переключателей с нуля!), значит, есть выбор. А получить название выделенного элемента можно например так:

var s: String;
...
s := RadioGroup1.Items[ RadioGroup1.ItemIndex ];

Только предварительно надо проверить, что что-то выбрано.

И задания.

Задание 42. Камень-Ножницы-Бумага.

Сделайте игру "Камень-Ножницы-Бумага". Человеку предлагается выбрать свой вариант хода из трех возможных переключателей (radioGroup), после чего компьютер случайно выдает свой ответ (по честному!) и проверяет, кто у кого выиграл. Надо вести статистику матча -какой общий счет между человеком и компьютером. Кстати, будет интересный эффект - человек не может абсолютно случайно предлагать варианты, обязательно неправильно работающий ум будет какие-то закономерности выискивать. И в результате честный случайный компьютер обыграет человека на большом числе партий!

Предусмотрите также уровни сложности (с помощью скроллбара - а лучше, есть его неплохой и более наглядный аналог TrackBar с панели Win32, тоже Max, Min и Position главные свойства) - например, чем выше сложность, тем компьютер чаще начинает жульничать :) Типа, сначала смотрит, что человек ответил, а затем выбирает выигрышный для себя ответ.

Напоминаю, Камень ломается о Ножницы, Ножницы режут Бумагу, а Бумага заворачивает Камень.

Задание 43. Приближение к Курсу второго этапа :) Школе программирования с Единицы :)

724. Нумерология
Автор идеи: Алекс
Расскажу немного подробнее о том, что я делаю. Хочу поделиться идеей, которая, может быть, даже не моя, но весьма интересна! Есть такая наука, называется она НУМЕРОЛОГИЯ. По дате рождения и Ф.И.О. можно рассчитать и узнать о человеке очень много интересной информации! Вот такие расчеты я и произвожу. Образно говоря, получается что-то вроде гороскопа на всю жизнь!
Я разместил свои объявления в местных газетах, на бесплатных досках объявлений в Интернете. Всё, что мне нужно - это Ф.И.О. человека и дата рождения. Люди присылают мне на адрес may28@yandex.ru свои данные, либо данные своих знакомых. Ничего больше мне не нужно. Я ни у кого не спрашиваю данные паспорта, место работы или что-то ещё! Люди просто присылают мне свой электронный адрес. В ответ я высылаю им совершенно бесплатно файл, в котором приведен пример расчета одного человека.
По нумерологии существует множество литературы, в которой изложены различные методики расчетов. Я взял один из наиболее удачных (на мой взгляд) вариантов расчета и, следуя ему, произвожу вычисления. Складываю цифры по формулам и получаю ответ в виде конкретной цифры, а она в свою очередь имеет свою характеристику. Все характеристики цифр и букв взяты из литературы.
Нумерология позволяет вычислить много информации. Число жизненного пути, число выражения и много чего ещё. Можно построить жизненный график на любой год. Узнать, что ждет тебя в каком месяце. По объему - это примерно 30 листов печатного текста. Проще самому ознакомиться с примером расчета, а потом принять решение - нужна ли тебе подобная информация или нет?
Те, кому это интересно, присылают свои данные и просят сделать расчет. Я высылаю им свои реквизиты для почтового перевода и после получения денег отправляю файл с расчетом. Для местных делаю в распечатанном виде. Кому как нравится.
За свои расчеты я беру всего лишь 150 руб. Если кому-то нужно распечатать = 150 руб.+50 руб. за печать.
Не хочу сказать, что этот бизнес делает меня богатым, но он приносит мне небольшой доход на мелкие расходы. По сути дела, это мое хобби, которое приносит удовольствие и небольшой материальный бонус!
Так как у меня есть основное место работы, то все расчеты я делаю в свободное время по вечерам. Примерно 1-2 расчета за вечер. Иногда бывает 2-3 расчета в неделю. Когда как. Всякое бывает. Сколько на этом можно заработать, можете подсчитать сами.
Домашний Бизнес
http://www.homebusiness.ru/

На самом деле алгоритм такой немногим сложнее, подозреваю, рассмотренного нами расчета триграмм :)

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

Кстати, у кого есть желание, может оформить и по триграммам в красивом интерфейсе.

Задание 44. Пивной завод.

Это два задания с одной из областных Пермских олимпиад, но так как они для нас уже легкие :) объединяем их в одно. Точнее, первое будет просто для разминки.

44.0. “Лямзики”. Лямзики — это протобионтные организмы, обитающие на далекой планете. Существует три вида лямзиков — красные, зеленые и голубые. Изначально в колонии могут находиться представители двух или всех трех видов. Но если два лямзика разных цветов встречаются, то они сливаются, образуя организм третьего цвета (например, встреча голубого и красного приводит к образованию зеленого). Наступает момент, когда колония становится одноцветной. Написать программу, которая по введенным целым неотрицательным значениям численности красных, зеленых и голубых лямзиков определяет все возможные конечные цвета колонии.

Пример работы правильной программы:
Введите число красных лямзиков: 1
Введите число зеленых лямзиков: 2
Введите число голубых лямзиков: 1
Колония может быть только зеленого цвета.
Введите число красных лямзиков: 1
Введите число зеленых лямзиков: 1
Введите число голубых лямзиков: 1
Колония может быть любого цвета.

Кроме того, дополнительно сам процесс взаимодействия надо выводить например в список. В каждой строчке что-то типа
"Встреча голубого и красного, на выходе зеленый, X голубых, Y красных, Z зеленых."

44.1. “Два конвейера”.
В цехе по производству напитков работают два конвейера. На первом конвейере напиток разливается по бутылкам, а на втором — происходит закупоривание бутылок. После схода с первого конвейера очередной бутылки она сразу же поступает на второй. Поскольку тара используется различная, то каждая бутылка имеет свое время ее заполнения и время закупорки. Требуется написать программу, которая для заданной последовательности бутылок:
А) Определяет время, через которое последняя бутылка в этой последовательности будет закупорена (закупоривать можно лишь наполненные бутылки).
Б) Находит такую перестановку заданных бутылок, при которой суммарное время разлива и закупорки бутылок было бы минимально, и определяет это время.

Технические требования

Формат входных данных
В первой вводимой строке содержится целое число N (1 <= N <= 1000) — количество бутылок. Далее идут N пар чисел X1 Y1 X2 Y2XN YN. Здесь Xi означает время разлива, а Yi — время закупорки бутылки с номером i. Xi и Yi — неотрицательные целые числа, не превосходящие 1000000. Все числа разделяются пробелами и/или символами перевода строки.

Формат выходных данных
Первая выводимая строка должна содержать время, требуемое для исходной последовательности бутылок, вторая — минимально возможное время для пункта Б задачи. Третья строка должна содержать перестановку номеров бутылок от 1 до N, для которой достигается минимальное время.

Пример работы правильно написанной программы:
3
200 40
100 100
30 90
490
370
3 2 1

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


Очередные решения.

У Тани begin.polubomu.ru выложены дополнительные решения по 24-е включительно. Кстати, она, пройдя курс (мой :) "Программирование для Интернета", сделала на сайте интерактивный опрос, кому какая система нравится. И народу много ответило!

29. Перемножить матрицы

  #include <iostream.h>
  int a[3][3],b[3][3],c[3][3],x,y;
  int main()
  {
       for (x=0;x<3;x++){
            for (y=0;y<3;y++){
                 a[x][y]=random(101);
                 b[x][y]=random(101);
                 c[x][y]=a[x][y]*b[x][y];
            }
       }
       return 0;
  }
   
   Екатерина

На Паскале.

   program MultiplyMatrix;

  {$APPTYPE CONSOLE}

  uses
    SysUtils;

  var A,B,C:array[1..100,1..100] of Integer;
      i,j:integer;

  begin
     Randomize;
     for i:=1 to 100 do
       for j:=1 to 100 do
          begin
              A[i,j]:=random(101); {Заполняем массивы А,В начальными
  значениями}
              B[i,j]:=random(101);
          end;
      {Начинаем искать массив С умножая соответствующие елементы
  массивов А,В}
      for i:=1 to 100 do
         for j:=1 to 100 do
            C[i,j]:=A[i,j]*B[i,j];
      write( ' All done ... ' );readln;
  end.
  Артем

30. Расчет суммы окружающих элементов.

  #include <iostream.h>
  int a[3][3],c[3][3],x,y,i,j;
  int main()
  {
       for (x=0;x<3;x++){
            for (y=0;y<3;y++){
                 a[x][y]=random(11); //Заполнение а случайными числами
                 c[x][y]=0; //Обнуление с
            }
       }
       for (x=0;x<3;x++){ //Перебор элементов
            for (y=0;y<3;y++){ //матрицы с
                 for (i=-1;i<=1;i++){ //Перебор элементов, окружающих
                      for (j=-1;j<=1;j++){ //a[x,y](включая сам a[x,y])
                           if (x+i>=0 && x+i<=2 && y+j>=0 && y+j<=2){ //Если не
  выходит за границы
                                c[x][y]+=a[x+i][y+j]; //суммирую
  окружение в с[x,y]
                           }
                      }
                 }
                 c[x][y]-=a[x][y]; //Вычитаем лишний (девятый элемент)
            }
       }
       return 0;
  }
  Екатерина

На Паскале:

  program AddElements;

  {$APPTYPE CONSOLE}

  uses
    SysUtils;

  var A,B,C:array[1..100,1..100] of Integer;
      i,j,t,di,dj:integer;

  begin
     Randomize;
     for i:=1 to 100 do
       for j:=1 to 100 do
          begin
              A[i,j]:=random(101); {Заполняем массивы А,В начальными
  значениями}
              B[i,j]:=random(101);
              C[i,j]:=0;
          end;
      {Начинаем искать массив С умножая соответствующие елементы
  массивов А,В}
      for i:=1 to 100 do
         for j:=1 to 100 do
            for t:=1 to 9 do //Здесь мы пытаемся перебрать все 8
  возможных направлений
              if t<>5 then
                begin
                  di:=i;dj:=j; // в этих переменных будет храниться индексы
  добавляемого эелемента
                  if t<4 then di:=di+1; // 7 8 9 если вот таким вот образом
  описать
                  if t>6 then di:=di-1; // 4 5 6 хранимые вокруг
  необходимого элемента числа
                  if (t mod 3)=0 then dj:=dj+1; // 1 2 3 (в нашем случае сам
  елемент стоит на месте 5)
                  if (t mod 3)=1 then dj:=dj-1; // то можно нйти
  последовательным перебором все елементы вокруг
                  {выполняем проверку на границы}
                  if (di<1) or (di>100) or (dj<1) or (dj>100) then continue;
                  {Добавляем данный элемент к C[i,j]}
                  C[i,j]:=C[i,j]+A[di,dj];
                end;

      write( ' All done ... ' );readln;
  end.
  Артём

Кстати, иногда можно немного модифицировать условия задачи, чтобы существенно упростить код. Основная сложность в этом упражнении была в том, что иногда индексы массива выходили за границы, и это приходилось явно отслеживать.

Например для элемента 1,1 индексы часто принимали значения 0,1 , 1,0 итд. А так как массив мы описали размером от 1 до 100 по каждому измерению, возникают проблемы, приходится условные операторы добавлять.

2. В 30-ой задачи базового курса пришлось матрицу А сделать не [1..100,1..100], a [0..101,0..101] – правильно - неправильно.
Дмитрий

Вот!!! Описать массив не (1-100,1-100), а (0-101,0-101). Конечно, правильно! По каждому измерению на 1 больше и меньше. И при инициализации массива в эти граничные строки записать нули. Тогда цикл мы делаем от 1 до 100 по каждой границе, а внутри него уже можно смело суммировать все 8 окружающих элементов, не опасаясь, что индекс выйдет за границы. Для элемента 1,1 ведь элемент с индексом 1,0 уже будет существовать, и проблем с его суммированием не будет (а он все равно ноль). В коде же все лишние условные операторы можно убрать.

Оптимизируем не 5 строк кода, а сразу 50 !!! А лучше 500 :) Алгоритмически подходим, не на уровне кода мыслим, а немного повыше :)

На эту тему, правильного мышления :) мы еще поговорим поподробнее не раз после базового курса.

Только базовых, простейших способов мышления, логического рассуждения, существует двенадцать. А если чуть-чуть отойти подальше от входной калитки на тропинку, направляющуюся в небольшой областной центр огромного мира Интеллекта, то уже на порядок их число возрастает.

А мы пользуемся от силы двумя-тремя. Не подозревая, что у нас в голове скрыт, дремлет древний мир с удивительным потенциалом. Есть, например, известный наш академик, слепой с детства. Участвует в разработке различных госпрограмм. В уме за две минуты решает интегралы, над которыми коллективы профессоров-математиков бьются по две недели.

И это каждый может! Развить свое мышление до более-менее приближенного к Человеческому. А не оставаться на хомячьем уровне :)

Только не спрашивайте у меня "чё за типы мышления, раскажи типа паканкретнее" :) Сам такой вопрос - свидетельство того, что человек не готов воспринять ответ правильно :) И поэтому расходовать на него ресурсы бессмысленно. А кто хочет, сам найдет. Или подождет.

Те же, кто говорит, что какие-то выдающиеся умственные способности - это только для избранных, врут! Лично свидетельствую, как после десятка упражнений получасовых люди резко :) увеличивали свой интеллектуальный потенциал. Правда, для этого специальная аппаратура нужна, пока дороговатая, но это уже другой вопрос. Кроме того, в последние годы серьезно развились чисто западные, инструментальные подходы к оптимизации человеческого мышления, математическая логика за счет финансового интереса к компьютерным технологиям, где формальная логика - базис, очень мощно развивается. Мы это все рассмотрим применительно к программированию. Вот на филфаках изучают теоретические аспекты логики, но увы, до практики это все далеко. Еще десятки лет назад разработаны технологии подготовки программного кода, гарантирующие, что этот код будет без ошибок (без выхода индексов за границы, без бесконечных циклов, без переполнения переменных итд). Но увы, на практике они не применяются, потому что теория - одно, а вот реализация ее в конкретных задачах - совсем другое. Мы же пойдем именно от практики.

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

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

Проблема не в том, что уровень мышления академика - высокий. А в том, что наше мышление очень слабо и совершенно не развито. Если ноль умножить на тысячу, все равно ноль будет. Его не умножать надо на тысячу, а складывать с ней. Постепенно. А мы сразу пытаемся умножить, развить то, чего пока нету :)

Я смотрел, как они работают со словом. Я пришел, а они в течение трех часов вытаскивали цепочку, которую породили два слова, сказанные одним из присутствовавших. И они ее вытащили. Это была мысль, которая возникла у этого человека три с половиной месяца назад. Это работа фантастически щепетильная. Я там не решился ни одного слова произнести. Они тут же отметили это, сказали: "Блокировочка". Они красиво работают. У них культура мышления, культура употребления слов. По сравнению с их искусством отслеживать, откуда взялась мысль, психоанализ - это детский лепет на лужайке...
Они требуют колоссальной дисциплины ума, раскрытия, в идеале, высшего интеллектуального центра, где скорость осознавания в тысячу раз выше, чем та, к которой мы с вами привыкли. Именно с точки зрения этих путей появилась концепция жизни как сна, идея того, что мы все спим...
Там не возникало этих проблем, а тут они сразу возникают. Почему? Потому, что если вам нужно играть в интеллектуальную игру, при которой вы в состоянии предвидеть на десять ходов вперед ходы самой реальности, это уже суперидеально, то есть практически это концепция игровой позиции, желательно на равных, по отношению к реальности. Только мы с вами свою концептуальную акцентуацию ментальных процессов принимаем всерьез, а в духовной традиции всерьез это не принимается и называется божественной игрой. Такова цель: умение играть в эту божественную игру, игру сознания, играть с таким партнером, как Реальность...
Когда общаешься с такими людьми, как Юрий Михайлович Лотман или Мамардашвили, то понимаешь, что то, что ты называешь сознанием - это какой-то периферийный кусочек, может быть аппендикс в организме сознания.
Игорь Калинаускас, "Игры, в которые играет Я"

Есть даже мнение, что подобные люди способны в уме взламывать любые современные системы шифрования. Им это просто не надо и заставить их невозможно такую работу делать :)

А сколько известно людей, вычислявших например огромные числа быстрее компьютера?

Вот рассказ об эксперименте, проведенном одним из исследователей с мадемуазель Осака. Испытуемую просили возвести в квадрат 97. получить десятую степень того же числа. Она делала это моментально. Затем предлагали извлечь корень шестой степени из 40 242 074 782 776 576. Она отвечала тотчас и без ошибок.
В 1927 году доктор Ости и математик Сент-Лаге экзаменовали слепого счетчика Луи Флери. Среди поставленных задач была следующая: дается число, нужно разложить его на куб некоторого числа и четырехзначное число.
Флери предложили число 707 358 209. Он размышлял 28 секунд и дал решение: 891 в кубе и 5236. Ему предложили 211717440. Ответ последовал через 25 секунд: 596 в кубе и 8704.
В Ванском районе Западной Грузия живет Арон Чиквашвили. Он свободно манипулирует в уме многозначными числами. "Счетный механизм" Чиквашвилй не знает усталости и ошибок.
Как-то друзья решили проверить возможности чудо-счетчика. Задание было суровым: сколько слов и букв скажет диктор, комментирующий второй тайм футбольного матча "Спартак" (Москва) - "Динамо" (Тбилиси). Одновременно был включен магнитофон. Ответ последовал, как только диктор сказал последнее слово: 17 427 букв, 1835 слов. На проверку ушло... пять часов. Ответ оказался правильным.
ЧУДО - СЧЕТЧИКИ
Виктор ПЕКЕЛИС
Техника Молодежи N7 1974 г.
http://www.superidea.ru/intel/mem/chsch.htm

Это не фокус, потому что числа выдавались случайно. Это ФАКТ научный, не муть мистическая, не дешевка, открытая каждому представителю хомячьих :) где каждый мнит себя учителем высокодуховным, но при этом ничего выдающегося и одновременно измеряемого объективно не в силах продемонстрировать.

Не слушайте хомяков, в общем :) А развивайте свой ум! У вас (у нас :) уже есть ВСЕ в голове. Никуда не надо мчаться за щастьем :)

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

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

Конечно, если программа - автоматизация завода, то там только рутинная, техническая работа, никакой мысли. Но есть куча областей (наукоемких :), где ситуация прямо противоположная. Хомяк еще там не валялся:)

Вот Алексей прислал задачку:

Между пунктом А и В расстояние 20км, между ними, посередине, находится пункт D. Из пункта А в пункт B со скоростью 5км/ч выходит мальчик.
Одновременно с ним из А со скоростью 10 км/ч выбегает собака, причем, она бегает ВСЕ ВРЕМЯ от мальчика до пункта D.
Вопрос, где будет собака через 1ч, 2ч, 3ч, 4ч?

Она известная, но если не знаете, попробуйте решить без интегралов :) Одна из программ с искусственным интеллектом, обученная такие задачи решать, нашла решение в одно арифметическое действие. Это подсказка :)

31. Поменять столбцы.

  function exchangerow()
  Dim matrow(100)
  for x = 1 to 100
  Matrow(x) = mat(x, i)
  Mat(x, i) = mat(x, j)
  Mat(x, j) = matrow(x)
  Next x
  end function

Максим Кибермаксович
sharabayko.narod.ru

На Си:

  Меняю 3 и 1:
   
  #include <vcl.h>
  #pragma hdrstop
   
  #include "Unit1.h"
  //---------------------------------------------------------------------------
  #pragma package(smart_init)
  #pragma resource "*.dfm"
  TForm1 *Form1;
  //---------------------------------------------------------------------------
  __fastcall TForm1::TForm1(TComponent* Owner)
       : TForm(Owner)
  {
  }
  //---------------------------------------------------------------------------
   
  void __fastcall TForm1::Button1Click(TObject *Sender)
  {
       double z[100][100],temp;
       int x,y;
       for (x=0;x<100;x++){ //Заполнение
            for (y=0;y<100;y++){
                 z[x][y]=((random(200001)+1)-100001)*1.0/100000;
            }
       }
       for (y=0;y<100;y++){ //Обмен
            temp=z[1][y];
            z[1][y]=z[3][y];
            z[3][y]=temp;
       }
  }
   Екатерина

На Паскале:

  const
  nx=10;
  ny=10;
  var d:array[1..nx,1..ny] of real;
  var a:array[1..nx,1..ny] of integer;
  var b:array[1..nx,1..ny] of integer;

  procedure TForm1.Button3Click(Sender: TObject);
  const
   // номера столбцов, которые будут меняться
   st1=1;
   st2=2;
   var x,y:integer;
   var z:real;
   var s1:string;
  begin
   Label7.Caption:= ' поменять ' +IntToStr(st1)+ ' и ' +IntTostr(st2)+ ' столбец ' ;
  // построчно меняются местами числа в столбцах
   for x:=1 to nx do
      begin
          z:=d[x,st1];
          d[x,st1]:=d[x,st2];
          d[x,st2]:=z;
       end;
   // вывод матрицы ( столбцы поменялись местами)
   for x:=1 to nx do
      begin
         for y:=1 to ny do
          begin
           if d[x,y]<0 then s1:=s1+FloatToStrF(d[x,y],ffFixed,4,2)+ ' ' // вывод
  результата
                            else s1:=s1+ ' ' +FloatToStrF(d[x,y],ffFixed,4,2)+ ' ' ; //
          end;
    s1:=s1+#13;
    Label6.Caption:=s1;
      end;
  end;

  Лена

28 - максимальный элемент матрицы.

Оригинальный способ визуализации придумал Алексей:

Я начал с 28, а следующие происоединил сюда же в одну программу. Как от само собой получилось. (Я еще спрашивал как увидеть происходящее на экране.) Один способ я нашел.
Первая мысль была через Label, но 10 тысяч ... просто не реально. Решил хотя бы максимальное значение и его координаты вывести на экран. Когда это получилось, и перешел к 31 и 34 заданию,что то прояснилось в голове, а не изобразить ли это графически. Поместил на форму PaintBoх, задал ему размер 100*100, закрасил темно сеним цветом.
При нажатию на Button1 выводятся на экран максимальное значение, координаты ячейки.
На рисунке белой точкой отображается положение ячейки с макс. значением ( с каждым нажатием меняется). Красной вертикальной полосой J - ная строка.
При нажатии на Button 2 на рисунке происходит замена J - ной строки на I - ную строку и столбец.
Причем точка их пересечения приходится на ячейку с макс. значением.
Наглядно видно что строки и столбцы поменили места.
Правда со значением от -1 до 1 не получилось. Сегодня узнал из рассылки. Так что значения там от 0 до 1.

          var Matrix: array [1..100,1..100] of Real;
              z,q: Real;
              d,v,d1,v1: Integer;
   
  procedure TForm1.Button1Click(Sender: TObject);
  begin
          PaintBox1.Canvas.Brush.Color := rgb(0,0,102);
          PaintBox1.Canvas.FloodFill(0, 0, RGB(0, 0, 0), fsBorder);
        z:=0;
    for d:= 1 to 100 do
    for v:= 1 to 100 do
       begin
          Matrix [d,v]:= Random ; //заполняем случайными числами от 0 до1
      if Matrix [d,v] > z then
          Z:= Matrix [d,v]; //находим максимум
       if Matrix [d,v] = Z then
          v1:= v; // первый пароаметр
       if Matrix [d,v] = Z then
          d1:= d; // второй параметр
          PaintBox1.Canvas.Pixels[3,v] := RGB(255,0,0);
          
       end;
          PaintBox1.Canvas.Pixels[d1,v1] := RGB(255,250,250);
          
          Label1.Caption:= FloatToStr (Matrix [d1,v1]);//максимум
          Label2.Caption:= FloatToStr (Z); //для проверки
          Label3.Caption:= ' D = ' + IntToStr(d1)+ ' V = ' + IntToStr(v1);
          // параметры ячейки с максим. значением
   

       end;
       procedure TForm1.Button2Click(Sender: TObject);
   
       begin
        PaintBox1.Canvas.Brush.Color := rgb(0,0,102);
          PaintBox1.Canvas.FloodFill(0, 0, RGB(0, 0, 0), fsBorder);
        for d:= 1 to 100 do
        for v:= 1 to 100 do
        begin
        
        Matrix [3,v]:= Matrix [55,v];// меняем строку на другую
        Matrix [3,v]:= Matrix [d,55]; // меняем строку на столбец
   
        PaintBox1.Canvas.Pixels[d,v1] := RGB(255,0,0);
        PaintBox1.Canvas.Pixels[d1,v] := RGB(255,0,0);
        end;
   

         
        end;
  end.
      Мне это дело с каждым днем все больше нравится.
                  Алексей


(c) 2004-2005 Сергей Бобровский bobrovsky@russianenterprisesolutions.com

Школа программирования с нуля
Все предыдущие выпуски базового курса тут:
http://russianenterprisesolutions.com/sbo/

 

http://subscribe.ru/
http://subscribe.ru/feedback/
Подписан адрес:
Код этой рассылки: comp.soft.prog.prognull
Отписаться

В избранное