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

Программирование с нуля - это совсем просто! 57) Мы выросли - и это конец:)


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

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

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

57) Мы выросли - и это конец:)

Ну не совсем конец, но почти. К сожалению, мои возможности вести данную рассылку исчерпаны - особенно с учетом безумного обилия писем... Отвечать спустя месяц - неправильно с методологической точки зрения. Но быстрее я не могу. Поэтому - на ваши письма я больше НЕ ОТВЕЧАЮ. Увы.

Это касается всех тем без исключения - от ответов на очередные задания, до обсуждения предыдущих уроков, каких-то смежных вопросов, бесплатно занимающихся на платных курсах итд.

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

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

Сейчас я не могу (а может, не хочу) найти на рассылку минимально возможного объема времени для поддержания ее в работоспособном состоянии. То есть вот тут один умный человек предложил мне вставать на час раньше :) но мой вариант - пусть каждый подписчик скинется мне по одному доллару :) и тогда я еще полгода буду заниматся только рассылкой. Но так как реально сделает это 1-2 процента, то и я не буду собой жертвовать :) ради тех, кому жалко для меня бутылки пива :)

Это не значит, впрочем, что рассылка не будет выходить. Выходить она в каком-то виде возможно будет, только на письма я отвечать не буду, и варианты ответов мне больше присылать не надо. Потому что в частности в интернете есть куча сайтов с форумами по программированию, можно получить ответ квалифицированный от других программистов, просто порыться в документации, учебники почитать итд. А вот принцип "я не понял, разжуйте мне, и положите в рот, а я пока поиграю в Морровинд" - безусловно работает, но требует значительных усилий от разжевывающего :) и должен оплачиваться конечно.
Да и, увы, развращает :) занимающихся такой подход.

Сами! :) Делаем все сами. С сегодняшнего дня.

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

Пока по организационным вопросам все :)


Пользовательский тип данных.

Возвращаясь к хомякам. Мы уже говорили, что неплохо бы объединить все, относящееся к некоторому понятию, в некоторую единую логическую единицу. Единую единицу :) Для хомяка это может быть его координаты, скорость, запас сил и пищи за щеками, а также кличка. Объединить несколько переменных в одном таком понятии можно с помощью концепции так называемой структуры, или записи, record. Она очень похожа на объект, только не содержит методы, а лишь свойства, данные.

Допустим, координаты - поля x и y и скорость по каждой из координат dx, dy - будут дробными, запас сил power и пищи - eda - целыми, а кличка name - строкой. Тогда можно их объединить в записи так:

    record
    x,y,dx,dy: Real;
    power, eda: Integer;
    name: string;
    end;

Так же, как и внутри объекта мы поля указываем, без var предварительного. Только что нам с этой записью делать? Она на самом деле представляет собой не реальную запись, данные (как переменная), а только задает внутреннюю структуру некоторого понятия. С помощью такой записи мы определяем, какие поля будут внутри нашей структуры, но никакого выделения памяти компьютера для хранения данных при этом не происходит.

На самом деле с помощью данной записи мы формируем новый тип данных (как целое или строка), который будет доступен только в нашей конкретной программе. Например, тип данных Хомяк (назовем его Xomiak - можно использовать только латинские буквы). Им можно пользоваться точно также, как и типами Integer, Real, String и др. Только эти типы - базовые, уже встроенные в Дельфи, а наш тип данных мы создали сами, и доступен он только в пределах нашего кода.

Вот как описывается новый тип данных:

  type название-типа =
    record
    ...
    end;

В нашем случае:

  type Xomiak =
    record
    x,y,dx,dy: Real;
    power, eda: Integer;
    name: string;
    end;

Только рекомендуется первым символом в названии пользовательского типа указывать T - Type:

  type TXomiak =
    record
    x,y,dx,dy: Real;
    power, eda: Integer;
    name: string;
    end;

И теперь ничто нам не мешает определить переменные-хомяки:

  var x1, x2: TXomiak;

Доступ к их внутренним полям осуществляется, как обычно, через точку:

  x1.Name := ' Вася ' ;
  x2.Name := ' Маша ' ;

Кстати, наверное надо было еще поле-пол ввести :)

  x1.power := 100;
  x2.power := 30;

Вместо record .. end можно указывать на самом деле и другие конструкции Паскаля, например ничто не мешает ввести альтернативное название для какого-нибудь типа. ДОпустим, вместо Integer вы хотите использовать Celoe. Тогда запишем так:

  type Celoe = Integer;

  var N: Celoe;

  N := 99;

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

type Matrix27 = array[ 1..27, 1..27 ] of Integer;

Важно! Даже если вы описали две переменные как массивы абсолютно одинаковой структуры, они все равно считаются как разные типы!

То есть в записи

  var m1, m2: array[ 1..27, 1..27 ] of Integer;

m1 и m2 считаются переменными разных типов! Чтобы сделать их одного и того же типа, достаточно явно выделить их описание как отдельный тип:

  type Matrix27 = array[ 1..27, 1..27 ] of Integer;
  var m1, m2: Matrix27;

Теперь их значения например можно присваивать друг другу одним оператором!

  for i := 1 to 27 do
  for j := 1 to 27 do
    m1[i,j] := i+j;

  m2 := m1; /// опа! скопировали массив целиком!

Ранее копирование массивов возможно было лишь с помощью циклов, поэлементно. А теперь данные одного типа (произвольной сложности фактически) можно присваивать одним оператором. Так только в Паскале, впрочем.

В Си тоже можно определять собственные сложноорганизованные типы данных, они называются структуры. Записываются они так:

  typedef struct произвольное-название
    {
   поля-структуры
    } название-типа;

произвольное-название - это произвольное название, придумываете идентификатор любой, неповторимый. Синтаксис такой просто.

поля-структуры - как обычно декларируются переменные, название-типа - придуманное программистом название типа. По аналогии, с типом хомяка:

  typedef struct xomiakaaa
    {
    float x,y,dx,dy;
    int power, eda;
    AnsiString name;
    } TXomiak;

Теперь переменные можно описывать:

  TXomiak x1, x2;
  x1.power = 30;

Только конечно описание типа должно расплагаться в коде выше, чем его использование. То есть - сначала тип определели, а потом уже описываем переменные на его основе.

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

var xs: array [1..100] of TXomiak;

А можем сделать его новым типом:

  type TXomiaki = array [1..100] of TXomiak;

  var xs: TXomiaki;

  xs[10].eda := 0;

Можем описать тип данных - террариум, в котором живут хомяки. Например, он характеризуется размером (ширина, высота), названием, температурой, чем-то еще.

  type TTerra = record
   Width, Height: Integer;
   T: Real;
   end;

При этом внутрь него мы можем разместить и выводок живущих в нем хомяков:

  type TTerra = record
   Width, Height: Integer;
   T: Real;
   xs: TXomiaki; // массив хомяков
   end;

А из самого террариума - сделать массив, например, в зоопарке десять таких террариумов:

  var ts: array [1..10] of TTerra;

   ts[ 1 ].xs[ 5 ].dx := 100;

Это мы задали x-скорость 5-му хомяку из 1-го террариума. Итд.

Такие подходы очень удобны тем, что позволяют объединять в рамках одного глобального понятия, иерархически, все другие, более мелкие понятия, в него входящие.

48-е задание. Типичное для задач автоматизации хоз.деятельности.

Имеется некий набор подлежащей учету информации. Например, список сотрудников в отделе или перечень товара на складе. Допустим, сотрудники. Каждый сотрудник - описываем его специальным типом, состоит из таких полей: уникальный идентификационный код сотрудника Id (по которому он будет отличаться от других), ФИО - FIO, год-рождения BDate, должность Dolg, зарплата :) Zar, и код отдела например - IdOt. Каждый отдел - еще один тип, характеризуется своим уникальным кодом Id, названием Name и идентификатором сотрудника-начальника - IdBoss.
Если идентификационный код сотрудника или отдела равен 0, считаем, что это просто пустая запись.

   Например, сотрудник - ( 12345 (код), ' Василий Пупкин ' , 1929,
  ' Началидзе ' , 30000, 54637 (код отдела) ).

   Отдел - ( 54637, ' Департамент Варежек ' , 12345 ).

Связь понятна, между 12345, 54637 ?

Надо сделать форму, в которой показывается список всех отделов и сотрудников выбранного в списке отдела. Списки эти исходно допустим пусты - это массивы двух типов, сотрудников и отделов. Пусты они, значит, поле Id делаем нулевым. Размер массива например, 1000 для сотрудников, 100 для отделов.

При выделении отдела надо найти всех соответствующих ему сотрудников (по полю IdOt) и показать в другом списке их ФИО.

Отдельные кнопки - "добавление нового отдела", "добавление нового сотрудника". В новой форме (модальной) поля для ввода параметров сотрудника или отдела. Id генерируем автоматически! При этом надо что-то придумать, чтобы он не совпадал с уже имеющимися. Добавляем в первый пустой элемент массива (у которого Id = 0).

Также надо предусмотреть, кнопки, для корректировки текущего выбранного сотрудника (чтобы зарплату ему понизить например :) и отдела, а также для удаления. Удаление - ну просто 0 записываем в поле Id соответствующего элемента, а программа такие поля должна считать незанятыми.

А в следующий раз рассмотрим, как нам это дело быстро в файле сохранить и восстановить.


История о...

Однажды программист очень устал и уснул прямо за рабочим столом. И снится ему сон. Работает он за компьютером, и вдруг виндовс посреди важного процесса зависает, и выскакивает яркий такой синий экран смерти! А на нем белыми буковками что-то ужасное про "систем фаилуре"...
Программист побледнел, не знает, что делать, пытается перезагрузиться - компьютер молчит, черный экран, никакие буковки не пишутся, и он начинает припоминать, сколько же ценного у него осталось на винчестере, как давно он не делал архивные копии, сколько полезных программ установлено - и все пропало...

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

Подходит поближе и спрашивает сочувственно:

- Ну что, попал, дружок?

- Ага... - отвечает наш программист невесело.

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

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

Нажимает зеленую кнопку Питание - и слышит жу-жууу- винчестер закрутился. От экрана монитора легким теплом пахнуло - заработал! Тут и буковки начальной загрузки появились.

Обернулся программист к дедушке, а тот уже далеко. Уходит.

- Эй! - кричит ему вслед программист. - Погоди! Ты кто такой-то? Фантазия моя, что ли?

- Нет, - тихо усмехнулся издали старичок. - Это ты моя фантазия, а я-то как раз настоящий!
И исчез.

Тут программист стал компьютер смотреть - а у него там куча вещей сама собой после сбоя обновилась! Новые программы, новые драйверы, множество новых возможностей, да все такие классные! Даже удивительно!

Правда, долго еще программист наш не мог понять, это он уже проснулся, или все еще спит... И кто кому снился - старичок ему, или он - старичку...


(c) 2004-2005 Сергей Бобровский

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

 

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

В избранное