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

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


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

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

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

42) Матрица: Как надо и как не надо

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

Сначала ответы на вопросы.

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

#include "Unit1.h" // следом за этой стандартной частью:

int z[100]; // сразу ставим наш массив

а внутри обработчиков уже не объявлять (не дублировать описание массива z), иначе внутри любой подпрограммы каждое такое объявление будет считаться как локальное (оригинальное).

То есть всегда один раз объявляем переменные. Если некоторую переменную вы объявили несколько раз, значит, это все будут РАЗНЫЕ переменные. Важно!

Все, что объявляется - уникально!

В Дельфи - можно вообще в начале, после строки uses ... массивы декларировать;

uses Math;
var z: array[1..100] of Integer;

Хотя это не совсем корректно, но пока для решения текущих задач достаточно.

* И еще вопрос: мне бы хотелось, чтобы индекс числа и его значение выводился в одном поле Label. Ну, например, как я в консоли сделала бы.

В C++Builder есть тип AnsiString:

   AnsiString s;
   s = "xxx[ ";
   s += IntToStr(5); // прицепляем строковое представление числа
   s += " ]";
   Label1->Caption = s;

* У функции может быть два (несколько) результатов?
Как их можно записать? Или для перевода копеек в рубли нужна отдельная функция?
Алексей

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

* По поводу Visual Studio .NET, строки там так можно обрабатывать:

  Вот спросил Татьяну как преобразовывать строки, получил ответ,
  это так можно складывать
  числа, можно сделать, чтоб выводило на поле Label!
  double a, b;
  a = System::Convert::ToDouble(textBox1->Text);
  b = System::Convert::ToDouble(textBox2->Text);
  textBox3->Text = System::Convert::ToString(a+b);
  Label->Text = System::Convert::ToString(a+b);
  Евгений

То есть функция, записывается вот так длинно System::Convert::ToString( ) , преобразует число в строку, а System::Convert::ToDouble( ) - строку в плавающее. Наверное, есть и что-то типа System::Convert::ToInt( ). или ToInteger().

* По поводу переменной Result, которая предназначена для определения значения, возвращаемого функцией.

Некоторые вот так записывают:

  result:=random((y)+1);
  while result < x do

...

С rezult, надо поаккуратнее, очень осторожно. Лучше не использовать ее как переменную, она ведь не совсем переменная, введите свою переменную rez например, а в конце функции -

rezult := rez;

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

* Тоже частая ошибка, типа

result:=random((y)+1);

В скобках, указывается параметр функции, то есть если вы пишете random((y)+1) все равно что random( y+1 ) ,

то считается случайное от 0 до y+1 - 1.

Если надо получить от 1 до y, то правильно так: random(y) + 1

Скобки, они имеют большое значение, как их записывать.

* Как выдать информацию во всплывающем окне?
Меню получилось создать сразу, создатели молодцы. Много мудрёного не придумали, минимум команд - максимум результата. У меня даже получилось к каждому из окошек подменю "приляпать" иконочки, чтобы красочнее было.
Но вот загвоздка. Хотел чтобы при нажатии на подменю "о программе" выходило окошко маленькое окошко где говорилось бы о программе, но я пока этого не умею надеюсь в будущем мы с вами этому научимся.
Павел

Кому интересно - у каждого пунтка меню в инспекторе можно увидеть свойство Bitmap, через которое картиночка и задается любым пунктам. С помощью свойства Checked можно включать/выключать наличие галочки у пункта, а если в названии пункта (Caption) перед каким-то символом указать &, то он покажется как подчеркнутый, с выделенной горячей клавишей:

П&ривет покажется как Привет

Всплывающее окошечко, тоже изучим, а пока можете простую команду давать

  ShowMessage( ' текст для показа в окошечке ' );

При ее выполнении работа программы останавливается, и пока пользователь не нажмет ОК во всплывшем окне, работа не продолжится.

* А вот здесь в начале мы не указывали про Result или она входит в подпрограмму, то есть её можно не указывать эту переменную чтоли?

Это такое слово универсальное, Result, специально описывать его не надо. Просто форма записи такая:

Result := выражение; // указываем возвращаемое функцией значение

Смысл, как в Си:

return выражение ;

* Для замены символов, есть готовая функция

function AnsiReplaceStr(AText, AFromText, AToText: string): string;

в библиотеке StrUtils.

AText, - исходная строка,

AFromText,- строка, кот.меняется

AToText - строка, на кот,меняем - каждое вхождение AFromText в строке AText меняем на AToText.

  s := AnsiReplaceStr( ' карова ёёё ' , 'ё' , 'е' );


Как надо и как не надо

  18. Эту я первую написала. Я сначала не поняла, как это вообще
  можно сделать. А стала спать ложиться, глазки закрыла, и тут
  появились а и b, взялись за ручки и исполнили некий замысловатый
  танец. :) И вот когда я это представление просмотрела, мне
  все вдруг стало ясно. Оказывается это очень просто! Написала в
  консоли, т.к. не знаю, к чему уж тут кнопочки приделать…:
  #include <iostream.h>
  #include <conio.h>
  int a,b;
  int main()
  {
      cout<<" Vvedite a:";
      cin >>a;
      cout<<" Vvedite b:";
      cin >>b;
      a=a+b;
      b=a-b;
      a=a-b;
      cout<<" a="<<a;
      cout<<"\n b="<<b;
      while (getch()!= ' q ' );
              return 0;
  }

  19. Вывод денежек в текстовом виде.

  void __fastcall TForm1::Button1Click(TObject *Sender)

  // это обработчик нажатия на кнопку, очевидно

  {

  int rub,r1,r2,kop,k1,k2;

  rub=StrToInt(Edit1->Text);

  kop=StrToInt(Edit2->Text);

  r1=rub%10; //Последняя цифра

  r2=rub%100; //Две последних цифры

  k1=kop%10;

  k2=kop%100;

  if (r1==1) {

  if (r2==11){

  Label4->Caption="рублей";

  }

  else {

  Label4->Caption="рубль";

  }

  }

  if (r1==2 ||r1==3||r1==4) {

  if (r2==12||r2==13||r2==14){

  Label4->Caption="рублей";

  }

  else {

  Label4->Caption="рубля";

  }

  }

  if (r1==0||r1==5||r1==6||r1==7||r1==8||r1==9) {

  Label4->Caption="рублей";

  }

 

  if (k1==1) {

  if (k2==11){

  Label5->Caption="копеек";

  }

  else {

  Label5->Caption="копейка";

  }

  }

  if (k1==2 ||k1==3||k1==4) {

  if (k2==12||k2==13||k2==14){

  Label5->Caption="копеек";

  }

  else {

  Label5->Caption="копейки";

  }

  }

  if (k1==0||k1==5||k1==6||k1==7||k1==8||k1==9) {

  Label5->Caption="копеек";

  }

  }

  Екатерина

Вот так НАДО.

А вот Алексей сделал не так. Поленился :)

Вроде бы все получилось, и сумму считает ,и среднее значение считает.
Целый вечер объяснял компьютеру как определить не разность М и Н , а множество МН. А оказалось так просто. Не в том месте объяснить пытался. А когда рассмотрел внимательно значения которые он показывает то понял, что у них не хватает Н . Прибавил - всё получилось. Правда в функции так и осталась одна строчка .
Да, еще сегодня цикл написал ни куда не подглядывая. Не на 1000 а всего на 10. (зачем так много).

Если написано 1000, значит надо делать тысячу, а не 10. На автозаправку вы приедете, скажете - заправьте мне полный бак, а вам ответят - зачем так много, достаточно 10 процентов.
Компьютер жалеть не надо, он прекрасно справится и с 1000, и со 1000000, а вот посмотреть, что будет после 1000 , а не после 10, полезно.
Вот если вместо 10 пробовать 100000, вот тогда инициатива позитивная :)

Зачем так МАЛО?

      Пример:

     function Dice(Sides: Integer): Integer;
    begin
    Result := random(Sides);
    end;
   
  procedure TForm1.Button1Click(Sender: TObject);
   
        var Sides, n, m, q, s, c : integer;
   
    begin
      m := StrToInt( Edit1.Text );
      n := StrToInt( Edit2.Text );
      q:=0;
      if (m - n)< 0 then
      begin
         Label4.Caption := ( ' Ввдены неверные значения ' );
      end;
          if (m - n) >= 0 then
      begin
         Label4.Caption := ( ' РЕЗУЛЬТАТ ' );
      end;
        s:=0;
       while q < 10 do
        begin
         q:= q + 1;
         Sides:= m -(n-1) ;
         s:= s + Dice(Sides)+n;
         c:= s div q;
     MyLabel1.Caption := IntToStr( Dice (Sides)+n );
       Label5.Caption :=( ' Сумма ' )+ IntToStr (s);
       Label6.Caption := ( ' Среднее значение ' )+IntToStr (c);
       end;
  end;

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

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

Кстати, если надо завершить работу процедуры/обработчика, не дожидаясь ее прямого окончания, немедленно, можно использовать команду Exit; ( return; в Си):

      if (m - n)< 0 then
      begin
         Label4.Caption := ( ' Ввдены неверные значения ' );
         Exit; // и пока!
      end;

Хотелось бы узнать правильно или нет.

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

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

Он даст вам в лучшем случае набор тестов и попросит продемонстрировать, что выходит. В худшем (точнее, нормальном) - скажет, чтобы вы сначала сами показали работу на разных тестовых вариантах. И очень-очень часто бывает, что программа начинает сыпаться, баг за багом, потому что программист свое творение жалеет и в экстремальном режиме не испытывает. Вместо заложенного нагрузочного параметра 1000 дает 10, а падает программа на 999 проходе.

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

Ну если работает, то сразу присылаете конечно :)

  По заданию 19 . Пример работает и сообщает о рублях и копейках.
    Выводит надпись в одну строку "ХХХ рублей ХХХ копеек"
     Пример:

  procedure TForm1.Button1Click(Sender: TObject);
  var R,K: integer;
  begin
    R := StrToInt( Edit1.Text );
    K := StrToInt( Edit2.Text );
  label4. Caption := IntToStr(R)+ ( ' рублей ' )+ IntToStr(K)+ ( ' копеек ' );
  end;

Понятно, что Алексей не так сделал?

Вот и Александр тоже решил схитрить:

  void __fastcall TForm1::Button1Click(TObject *Sender)
  {
     R=StrToInt(Edit1->Text);
     K=StrToFloat(Edit2->Text);
     Label3->Caption=IntToStr(R) + "рубл." + IntToStr(K) + "копеек";
  }
  //---------------------------------------------------------------------------

Видите, Александр сокращенно рубл. написал? :) Ну а копейки-то почему тогда не сокращены? Если уж упрощать, то тоже единообразно. Все равно, при тестировании , если бы его делали как положено, на результате типа 1 р 21 к выдалось бы

1 рубл. 21 копеек

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

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

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

  Урок 18 называется "не смешите мои тапочки".
  Я его даже описывать не буду.
  var x,y:integer;
  begin
  x:=strtoint(edit1.text);
  y:=strtoint(edit2.text);
  edit1.Text:=inttostr(y);
  edit2.Text:=inttostr(x);
  end;

Задача вывода на экран не стояла. Надо было обменять значения переменных x и y, не привлекая другие переменные. Где обмен? По завершении работы этой программы что было в x и y, то и осталось.

Впрочем, возможно все же, Павел, Алексей, просто не поняли задание. Это я виноват. Алексей и еще некоторые, САМИ например придумали алгоритм сортировки (скоро опубликуем). Это уже готовые программисты, только практика и знания по конкретным средам остаются.

Потому что с денежками Павел все делал аккуратно, а вдобавок из-за проблем с MOD вручную писал код для выделения последней цифры, что само по себе отдельная задача. Вот оно, кстати:

  Способ решения 19-го урока был похож на анекдот, где один человек
  , перерешавший все задания на олимпиаде
  всё никак не мог понять, как всё-таки ёжики размножаются.
  Так и у меня, в задаче, было решено всё правильно и быстро.
  Только мучил вопрос, с автоматической подстановкой слов(рубль,
  рублей, рубля, копейка, копейки, копеек). Ведь конечная цифра
  может быть любой, вот в чём беда, и надо чтобы не получилось в
  результате(5рубль45копейки) например. Хотел найти оператор,
  который мог бы оставлять только последнюю цифру, а такого не
  нашел, или плохо искал. Думал сутки. Почесал репу. И стал мучить
  оператор цикла, и выжал всё таки из него пользу за что
  очень рад. Добавил алгоритм к "сырой задачке" и стала она
  пропечённой, вкусной и сдобной. К сожалению картинки как вам
  через
  почту переслать не знаю, зато текст свободно, вернее, что доставило
  мне радость.
  Понимаю, чужой скрипт хуже лесной чащобы. Поэтому, те места где
  стоит"//" и надо читать, а остальное на усмотрение.

  var x,y:string;
  x1,x2:integer;
  begin
  x:=( ' рублей ' ); //запись по умолчанию
  y:=( ' копеек ' ); //запись по умолчанию
  x1:=strtoint(edit1.text);
  x2:=strtoint(edit2.text);

  while x1>10 do //тот самый оператор цикла
  begin
  x1:=x1-10;
  end;
                         
  while x2>10 do
  begin
  x2:=x2-10;
  end;

  if (x1=1)then //подстава, шобы было "касява"
  begin
  x:= ' рубль ' ;
  end;

  if (x1=2)or(x1=3)or(x1=4)then //тоже подстава, и ниже тоже одни
  подставы
  begin
  x:= ' рубля ' ;
  end;

  if (x2=1)then
  begin
  y:= ' копейка ' ;
  end;

  if (x2=2)or(x2=3)or(x2=4)then
  begin
  y:= ' копейки ' ;
  end;
  label1.Caption:= (edit1.text)+x + (edit2.Text)+y; //вывод текста в одну
  строку
  end;
  end.

Кроме того, напоминаю, ваши решения Таня обрабатывает и выкладывает на сайте begin.polubomu.ru. До 16-го задания включительно выложены. К ней вы также можете обращаться с вопросами.

Хотя, безусловно, и Алексей, и Александр, и Павел (уж про женщин я не говорю, они кстати более прилежны) - примеры для ПОДРАЖАНИЯ, нежели объекты для критики. Потому что ДЕЛАЮТ и последовательно, что важно. И видно, что понимают, что делают. А все эти мелочи с непониманием деталей, со временем пройдут. Потому что гораздо больше писем от тех, кто с начала не занимается, но спрашивает по своему крайне неаккуратно и небрежно написанному коду, не изучив как следует простых вещей. Не занимались, то есть, в Школе, а надеются получить знания на халяву.

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

  я пробовал писать и так
  Label1.Caption:=IntToStr(random( for m to )+1);,
  или так Label1.Caption:=IntToStr(random( m to )+1);
  не чего не выходило..., а ещё с оператором цикла выходили ошибки,
  не знаю в чем проблема, так что за это решение мне двойка, сам на
  себя обидился...

Евгений, Николай, Николай-2 (второй :), Люда, и еще все, кто пишет практически одно и тоже! Я вам всем в письме ответил единообразно, ничего уникального в ваших ошибках нету, и еще раз повторю тоже самое в рассылке вашим клонам:

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

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

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

Если вы занимаетесь в Школе так, как я говорю, то я вам ГАРАНТИРУЮ, что вы станете приличным программистом. Но только если будете заниматься по моей системе. Понятно? А хотете заниматься по своей собственной "методике", я уже говорил, идите на любые форумы, ищите другие рассылки и других преподавателей, покупайте учебники и самоучители, записывайтесь на двухнедельные курсы по двести долларов. Никто не держит.

Правда, практика показывает, что и так мало кто понимает увы. А понимают в основном вот так:

С ПЕРВОГО ЗАНЯТИЯ НАДО ЗАНИМАТЬСЯ!
ПОСЛЕДОВАТЕЛЬНО!
НИЧЕГО НЕ ПРОПУСКАЯ!
ПО КАЖДОМУ ЗАДАНИЮ ПИШЕТЕ ОТЧЕТ, ЧТО ПОНЯЛИ И ЧТО НЕ ПОНЯЛИ!

Некоторые, также, не торопятся, думая, что я всегда буду доступен, и в будущем можно будет спросить или начать заниматься через несколько месяцев. Не буду я все время доступен! Потому что через полгода я улетаю в космос. Ясно?

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

Вы НЕ тупые! Поймите это! И не надо на себя или на меня обижаться, а надо просто делать так, как вам говорят. Что толку, обижаться?

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

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

Можете конечно самостоятельно, но тренер потому и тренер, что подготовил десятки мастеров спорта. А самостоятельно, ну до первого разряда в лучшем случае человек дотренируется, и то вряд ли. Потому что методикой не владеет. Да и НЕ МОЖЕТ человек сам себя обучить тому, что он не знает. Это же очевидно!

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

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

А ходить! Ходить каждый умеет, а попробуйте пройти хотя бы ОДИН километр за 4 минуты, как марафонцы идут 50 километров. Пройти причем, а не пробежать.

Хотя подозреваю, многие даже и не пробегут за 4 минуты :)

И если с ходьбой еще можно долго ходить, самостоятельно тренируясь (хотя естественным шагом все равно 4 мин/км не пройдешь), то в высоту, не зная техники, фиг прыгнешь.

Вот как многие рассуждают:

Программирование - это круто. Хочу научиться программировать. Условный оператор - прочитал, вроде понятно. Присваивание - прочитал, вроде понятно. Цикл - прочитал, вроде понятно. Ура!

Все, программирование я знаю. Так, буду кодировать. А возьмусь ка сразу уруну смоделирую, чего мне формулы какие-то считать да скобочки расставлять простые, это же ерунда. И вот какая получилась программа, красивая, тут я для красоты int заменил на integ, тут вместо фигурной скобки поставил круглую, ведь так симпатичнее, правда? Тут, одинарной кавычки не нашел, влепил двойные, и так сойдет...
Ну вроде все, нажмем на запуск... Ой, а чего это? Эрроры какие-то, сообщения странные... Мама, паппа, помогите! Щас этому ведущему, козлу такому, научить не может, отправлю код, пусть он мне объяснит, че я не так сделал. Фигово он объясняет, вот сразу у меня не вышло!

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

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

А некоторые так делают - механически копируют код из рассылки, вставляют в редактор и запускают :) Типа, программисты. Бывает, что строчка съехала на следующую - и уже все, тупик.

Повторяю в очередной раз - и еще буду повторять, потому что многие не догоняют. Если вы не занимались раньше как положено (отчет, исходные тексты, результаты тестировавния по каждому заданию начиная с первого), то и не пишите мне, что у вас не выходит. Моя подсказка вам НЕ ПОМОЖЕТ, понятно?

Думаете, я просто так придумал такую систему, с потолка взял - отчеты, задания, исходный код? Письменные отчеты - это АЗЫ педагогики, и Школа наша построена на опыте и обратной связи от обучающихся самым разным технологиям по журналам и книжкам - а это десятки тысяч человек. И вы никакое не исключение, каждый ваш шаг и каждую ошибку уже делали и повторяли другие многократно. И не надо выпендриваться, а надо просто делать задания так, как положено. Это что, сложно так? Десять строчек, раз в неделю написать? По СВОЕМУ собственному коду?

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

Типа осчастливить меня человек решил :) Похлопал по плечу снисходительно, ты тут пиши, а я щас заценю, посмотрю, как моя единственная мозговая извилина, сможет воспринять, и насколько все разжевано.

Я не разжевываю! Понятно? Не рассчитывайте. Потрудитесь сначала, и потом получите от меня ответ. А не наоборот.

И таких буду из Школы выгонять! И больше не впущу. В который раз пробовать-то? И чего пробовать - бери и делай, учись. Куча народу уже ыучилась, а ты все думаешь, отмазки придумываешь, то не так, это не эдак. Мне твои занятия не нужны. Научится такой человек программированию, или нет, мне совершенно до лампочки.

Есть еще вопросы в ответ на задания такого плана: "а зачем вот это задание вообще делать?".

- Хочу прыгнуть с самолета!
- Давай, вот парашют, одевай.
- А зачем парашют-то? Я ж с самолета хочу прыгнуть, а таскать за плечами эту сумку не буду...

- Хочу боксу научиться!
- Ну давай, начинаем с изучения стойки, бегаем кроссы, вот эспандер кистевой, каждый день его надо с утра до вечера с собой носить и кисть развивать.
- А зачем стойки, зачем кисть? Я ж боксу пришел учиться, вот и учите боксу. А вы мне какой-то эспандер...

:)

Иной тренер может и в челюсть заехать :)

Не надо меня учить тому, как мне учить :) Я это знаю очень хорошо. А когда мне будет интересно чужое мнение, тогда я его явно спрошу (и спрашиваю, кстати, часто у многих - на некоторых курсах есть такие замечательные люди, у которых поучиться очень полезно; но спрашиваю только у тех, кто реально делает и сам добивается реальных успехов). А если кто-то считает, что лучше меня знает, как учить, то вот пусть идет открывает свою рассылку и учит по своей методике. В свободное время. И еще посмотрим, у кого лучше выйдет. Не по старым достижениям, а по сегодняшним. А давать мне советы не надо. Те, у кого своя методика есть, раздачей советов другим учителям :) не занимаются, у них достаточно тех, кто еще не умеет, кого надо обучить.

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

Теперь посмотрим на вопросы зачем? почему? с другой позиции. Психологи называют это сопротивлением. Это хорошо на самом деле. Причина этих вопросов на самом деле ОДНА. Заключается она в том, что что-то (или кто-то :) внутри человека начинает сопротивляться хорошему занятию. И чем полезней это занятие для развития человека, тем сильнее сопротивление этого чего-то/кого-то внутри :)

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

Тогда можно сразу ставить диагноз :)

Диагноз ставится так. Очень просто ставится.

Ты делал задание или нет, как положено, писал отчеты, начиная с первого занятия? Нет? Значит, диагноз :)

А как быть? Да сделать и все! С минимумом собственных комментариев. И будет тебе щастье :)

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

Вот тогда и я и многие другеи за вас, от души порадуются. И мир станет, немного получше.

Особенно приветствуются истории успеха.
Ваши рассказы о том, как у вас получаются упражнения, какие эмоции при этом вы испытываете (не будьте роботами!), что бы нового добавили. Очень желательно, чтобы вы каждое упражнение расширяли, пусть по чуть-чуть, каким-то дополнительным способом. Что-то изменили, что-то добавили. Что-то убрали :) Только не в плане упрощения :)

Можно конечно радоваться, если и ничего не сделал, но какая-то эта радость неправильная. Нежизненная. Без дела-то, а?

Я всего лишь пытаюсь помочь вам (и себе :) стоять на своих собственных ногах. И Программирование - это именно то, одно из единичных занятий в современном мире, которое сделает вас (и меня :) полностью независимыми.
От колбасы :)

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

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

ВСЕ будет окомпьютеризировано. В каждом будут жить мириады нанороботов, контролирующие каждый шаг. Матрица, она ВНУТРИ будет, не снаружи.

А книги по программированию будут ЗАПРЕЩЕНЫ, потому что они призывают думать, и предоставляют неограниченные возможности для творчества и свободы в виртуальном мире (реального в будущем и не будет). А крупным корпорациям самостоятельные разработчики не нужны, им нужны только потребители их закрытого софта. Юзеры. А в идеале ламеры.

Так что, решайте, с кем вы - с потребителями, подключенными к Матрице, или с Нео-программистами :)


Списки.

Очень полезный элемент управления - список (набор строк). ListBox. На панели Standard. У него есть важное свойство ItemIndex, номер текущей выделенной строки. Если ничего не выделено, то принимает значение -1, иначе - номер выделенной строки в списке. Нумерация строк начинается с нуля. Фактически, список - это массив строк (на самом деле - объект, включающий массив строк), только он дополнен разными удобными свойствами и методами для работы с этим массивом.

Число элементов можно узнать через свойство Count, а флажок Sorted (тип boolean), когда принимает значение true, приводит к автоматической сортировке значений массива. При этом, если раньше некая строка была 10-й, то после сортировки она уже будет неизвестно какой!

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

Сами строки хранятся в свойстве Items. Доступ к содержимому Items происходит через свойство Strings этого свойства :)

Выглядит это сложно, но после небольшой практики запоминается быстро.

s := ListBox1.Items.Strings[ 7 ]; // в s записываем седьмую строку списка строк ListBox1

Содержимое списка можно очистить, обратившись к методу Clear свойства Items:

ListBox1.Items.Clear;

Исходно список пустой, а добавление новой строки в список происходит таким образом:

  s := ' добавляемая строка ' ;
  ListBox1.Items.Add( s );

При этом, если свойство Sorted имеет значение true, то совсем не факт, что пятый по счету добавляемый элемент будет пятым по порядку - сортировка происходит фактически на лету.

В C++Builder, так же все, как обычно, только не забывайте соблюдать регистр - если большая буква, что в Паскале без разницы, то и надо в Си писать большой. И ставить скобочки после вызова методов, если у них нет параметра. А вместо точки - стрелочку:

  ListBox1->Items->Clear();

В Visual Studio .NET, тоже есть ListBox. В нем тоже есть свойство Items, также в него добавляется строка (Бейсик):

  for x = 1 to 50
          listBox1.Items.Add("Item " & x.ToString())
  Next x

Число элементов узнается так:

listBox1.Items.Count

Обращаться к любому элементу можно так:

listBox1.Items( номер-элемента,начиная-с-нуля )

Такую запись можно использовать как для чтения значения, так и для записи:

MyLabel.Text = ListBox1.Items(5)

ListBox1.Items(0) = MyLabel.Text

Есть и свойство сортировки, Sorted:

listBox1.Sorted = True

Кроме того, в ListBox.NET имеется еще два массива, в дополнение к Items - SelectedItem, и SelectedIndex. Первый хранит выделенную строку (значение), второй - номер выделенного элемента (индекс в массиве Items). Если номер равен минус единице (как в Дельфи), значит ничегоне выделено.

Задание N 27 (для всех).

Напишите программу, которая состоит из трех кнопок, одного поля Edit и двух списков и:
* по нажатию на кнопку Button1 добавит в список ListBox1 содержимое поля Edit1.
* по нажатию на кнопку Button2 очистит содержимое списка ListBox1.
* по нажатию на кнопку Button3 отсортирует содержимое ListBox1 (автоматически :) и добавит его содержимое в ListBox2 (старое в ListBox2 не стирается!). По окончани процесса ListBox1 надо перевести в исходное состояние без сортировки (в ListBox2 сортировка всегда включена!).


Матрицы

Массивы, которые мы изучили, называются одномерные, линейные или векторы.

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


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

Школа программирования с нуля
http://russianenterprisesolutions.com/sbo/

Все предыдущие выпуски базового курса тут:
http://russianenterprisesolutions.com/sbo/base.htm

 

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

В избранное