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

Программирование с нуля - это совсем просто! 138) Программирование на Си и С++: Объекты и функции


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

138) Программирование на Си и С++: Объекты и функции

Ответы по условному оператору:

  void __fastcall TForm1::Button1Click(TObject *Sender)

  {
           int a, b;

           a = StrToInt(Edit1->Text);
           b = StrToInt(Edit2->Text);

           if (a > b)
                  Label1->Caption = IntToStr(a);
           else
                  Label1->Caption = IntToStr(b);

  }

  void __fastcall TForm1::Button1Click(TObject *Sender)
  {
           int x, y, z;

           x = StrToInt(Edit1->Text);
           y = StrToInt(Edit2->Text);
           z = StrToInt(Edit3->Text);

                  if ((x<y) && (x<z))
                     Label1->Caption = "x наименьшее";

                  if ((z<x) && (y>z))
                     Label1->Caption = "z наименьшее";

                  if ((y<x) && (y<z))
                     Label1->Caption = "y наименьшее";

  }

  void __fastcall TForm1::Button1Click(TObject *Sender)
  {
           int x, y, z, sum, prod;

           x = StrToInt(Edit1->Text);
           y = StrToInt(Edit2->Text);
           z = StrToInt(Edit3->Text);

           sum = x + y + z;
           prod = x*y*z;
                    Label2->Caption = IntToStr(sum);
                    Label3->Caption = IntToStr(prod);

           if (sum == prod)
                   Label1->Caption = "Сумма равна произведения";
           if (sum > prod)
                   Label1->Caption = "Сумма больше произведения";
           if (sum < prod)
                   Label1->Caption = "Произведения больше суммы ";

  }

  void __fastcall TForm1::Button1Click(TObject *Sender)
  {
          int x, y, z;

           x = StrToInt(Edit1->Text);
           y = StrToInt(Edit2->Text);
           z = StrToInt(Edit3->Text);
           
           if ((y>z)&&(x>y))
                   Label1->Caption = IntToStr(x-z);
           else
             if ((y>x)&&(y>z))
                Label1->Caption = IntToStr(y);
                else
                   Label1->Caption = IntToStr(z);
  }

  void __fastcall TForm1::Button1Click(TObject *Sender)
  {
            int a, b, sum, prod;

           a = StrToInt(Edit1->Text);
           b = StrToInt(Edit2->Text);

           sum = a + b;
           prod = a*b;

            if (a>b) {
                   a = prod;
                   Label1->Caption = IntToStr(a);
            }
             else {
                    b = sum;
                    Label1->Caption = IntToStr(b);
             }

  }
Дмитрий

Дмитрий даже запрограммировал решение шутливой задачи! Про Васю и Машу:

  void __fastcall TForm1::Button1Click(TObject *Sender)
  {
     float Foto, Traf, Time, Seans;
     Foto = 15; // 15 MB
     Traf = 0.0024; // Скорость скачивания равна 0,0024MB/sec
     Time = 2400; // 2400sec тратит Вася за сутки
     Seans = Traf*Time; // Столько MB Вася скачает за это время

     Label1->Caption = FloatToStr(Seans);
     Label2->Caption = FloatToStr(Foto/Seans); // Понадбится суток
           // Т.е. Маше будет 16 лет и не плоных 3 дня
  }

Далее.

  void __fastcall TForm1::Button1Click(TObject *Sender)

  {

  int a,b;

  a=StrToInt(Edit1->Text);

  b=StrToInt(Edit2->Text);

  if (a>b) Label1->Caption=IntToStr(a);

  else Label1->Caption=IntToStr(b);

  }

  void __fastcall TForm1::Button1Click(TObject *Sender)

  {

  int x,y,z;

  x=StrToInt(Edit1->Text);

  y=StrToInt(Edit2->Text);

  z=StrToInt(Edit3->Text);

  if( (x<=y) && (x<=z) ) Label1->Caption = IntToStr(x);

  else

  {

  if( (y<=x) && (y<=z) ) Label1->Caption = IntToStr(y);

  else Label1->Caption = IntToStr(z);

  }

  }

  void __fastcall TForm1::Button1Click(TObject *Sender)

  {

  int x,y,z,d,e;

  x=StrToInt(Edit1->Text);

  y=StrToInt(Edit2->Text);

  z=StrToInt(Edit3->Text);

  d= x+y+z;

  e= x*y*z;

  if (d > e) Label1->Caption = "Сумма больше";

  else Label1->Caption = "Произведение больше";

  }

  void __fastcall TForm1::Button1Click(TObject *Sender)

  {

  int x,y,z;

  x= StrToInt(Edit1->Text);

  y= StrToInt(Edit2->Text);

  z= StrToInt(Edit3->Text);

  if( (x>y) && (y>z) )

  {

  y=x-z;

  Label1->Caption = IntToStr (y);

  }

  else

  {

  if( (x>=y) && (x>=z) ) Label1->Caption = IntToStr(x);

  else

  {

  if( (y>=x) && (y>=z) ) Label1->Caption = IntToStr(y);

  else Label1->Caption = IntToStr(z);

  }

  }

  }

  void __fastcall TForm1::Button1Click(TObject *Sender)

  {

  int a,b;

  a=StrToInt(Edit1->Text);

  b=StrToInt(Edit2->Text);

  if( a>b)a=a*b;

  else b=a+b;

  Label1->Caption=IntToStr(a);

  Label2->Caption=IntToStr(b);

  }

  Андрей

Следующий ответ.

  void __fastcall TForm1::Button1Click(TObject *Sender)
  {
  if ((Edit1->Text != "") && (Edit2->Text != ""))
  {
   int a,b;
   a = StrToInt(Edit1->Text);
   b = StrToInt(Edit2->Text);
   if (a > b)
    {
    Label1->Caption = "Макс значение: "+IntToStr(a);
    a = a*b;
    Label2->Caption = "Произведение: "+IntToStr(a);
    }
   else if (a < b)
    {
    Label1->Caption = "Макс значение: "+IntToStr(b);
    b = a+b;
    Label2->Caption = "Сумма: "+IntToStr(b);
    }
   if (a == b)
    {
    Label1->Caption = "Значения равны: "+IntToStr(a);
    b = a+b;
    Label2->Caption = "Сумма: "+IntToStr(b);
    }
  }
  }
  //---------------------------------------------------------------------------
   
  void __fastcall TForm1::Button2Click(TObject *Sender)
  {
  if ((Edit3->Text != "")&&(Edit4->Text != "")&&(Edit5->Text != ""))
  {
   int a,b,c;
   a = StrToInt(Edit3->Text);
   b = StrToInt(Edit4->Text);
   c = StrToInt(Edit5->Text);
   if ((a < b)&&(a < c))
    Label3->Caption = "Min: "+IntToStr(a);
   if ((b < a)&&(b < c))
    Label3->Caption = "Min: "+IntToStr(b);
   if ((c < a)&&(c < b))
    Label3->Caption = "Min: "+IntToStr(c);
  //----------------------------------------------
   if ((a*b*c)>(a+b+c))
    Label4->Caption = "Произведение: "+IntToStr(a*b*c);
   else if ((a*b*c)<(a+b+c))
    Label4->Caption = "Сумма: "+IntToStr(a+b+c);
   else if ((a*b*c) == (a+b+c))
    Label4->Caption = "Сумма равна произведению:"+IntToStr(a+b+c);
  //------------------------------------------------------
   if ((a > b)&&(a > c))
    Label5->Caption =IntToStr(a-c);
   else
    {
     if ((b > a)&&(b > c))
      Label5->Caption = "Max: "+IntToStr(b);
     if ((c > a)&&(c > b))
      Label5->Caption = "Max: "+IntToStr(c);
    }
  }
  }
   
  А вот когда решал задачи из интернета возникли трудности . Во
  первых я не смог программно переводить строку как в Делфи (#13).
  Во вторых я попытался сделать программы , чтобы данные вводил
  пользователь и понял , что без циклов ничего не выходит . В задаче
  про фото я с начала узнал сколько времени дпится льготный тариф
  (2 часа), потом узнал сколько за это время можно скачать (вот тут то
  циклы бы не помешали) (1,08 Мб). А потом узнал кол-во дней при
  условии , что качать будет только когда тариф льготный , а
  подключаться начинать за 30 мин до 3:00 . Результат получился 14
  дней (вес фото делим на 1,08)

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

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

   double x;
   if( TryStrToFloat("3.14", x) )
     {
     // удачно преобразовано,
     // результат в переменной x
     }
   else // ошибка преобразования!

Продолжение ответа Романа.

  В задаче про CD-ROM я сначила узнал сколько информации войдёт
  во все дискеты , потом сколько раз придется сходить , а затем уже
  вычислил время , которое придется потратить (53 часа)
  А это про CD-ROM.
   
  void __fastcall TForm1::Button1Click(TObject *Sender)
  {
  double ves_igr, // вес игры
         disket, // вместимость 1-ой дискеты
         put, // время от дома юзера до хакера
         ves_d, // общая вместимость дискет
         ob_vrem; // затраченнное время
  int kol_d, // кол-во дискет
      reis; // за сколько раз скоп всю игру
  //-------------------------------
  ves_igr = StrToFloat(Edit1->Text);
  disket = StrToFloat(Edit2->Text);
  put = StrToFloat(Edit4->Text);
  kol_d = StrToInt(Edit3->Text);
  //------------------------------------
  ves_d = kol_d*disket;
  reis = ceil(ves_igr/ves_d);
  ob_vrem = ((2*put)*reis)/60;
  Label5->Caption ="Ему понадобится
  "+FloatToStrF(ob_vrem,ffFixed,10,0)+" часа";
  }
   
  В задании про переписку я сначала вычислил трафик за 1-дин день
  (18 Кб), а вот когда они узнают , что переписываются друг с другом
  кто их знает. Поэтому я добавил на форму поле для ввода дней
  (сколько дней идёт переписка)
  Переписка
   
  void __fastcall TForm1::Button1Click(TObject *Sender)
  {
  int p_sid,//кол-во писем
      p_vas,//за день
      vrem_p;//когда обнаружили
  double ves_psid,//вес писем
         ves_pvas,
         vesden,//трафик за день
         trafic;//общий трафик
  //--------------------------------------------
  p_sid = StrToInt(Edit1->Text);
  p_vas = StrToInt(Edit3->Text);
  vrem_p = StrToInt(Edit5->Text);
  ves_psid = StrToFloat(Edit2->Text);
  ves_pvas = StrToFloat(Edit4->Text);
  //--------------------------------------------
  vesden = ((p_sid*ves_psid)+(p_vas*ves_pvas));
  Label7->Caption = "Трафик за день равен
  "+FloatToStrF(vesden,ffFixed,15,2)
                    +" килобайт";
  trafic = vesden*vrem_p;
  Label9->Caption = "Суммарный трафик
  "+FloatToStrF(trafic,ffFixed,15,2)+" Kb";
  }
   
  А вот задачку про троян я что-то никак не смог понять . Ну допустим
  разослал он троян по 30-ти адресам из своей адресной книги , эти 30
  уже будут знать его пароль. Затем троян разошлёт себя по
  следующим адресам из адресных книг зараженных машин - это 30
  надо умножить на 30 (900) , затем 900*30 и так далее. Не понятно
  следующее с какой частотой троян себя пересылает . И даже если
  появится антивирус то не все пользователи его поставят и т.д и т.п.
  Вобщем вопросов возникло больше чем ответов.
  Роман

Ну это шутливые задачки, и все, кто пытался их решить, молодцы. Роман здесь еще показал, как складывать (сцеплять) строки. Для этого предназначена операция "+".

    Решил все задачи на условный оператор. Вторую, третью и
  четвертую
    задачу объединил в одной форме. Вот проверенный код:
    1)

  int a,b;

  void __fastcall TForm1::Button1Click(TObject *Sender)
  {
  a = StrToInt(Edit1->Text);
  b = StrToInt(Edit2->Text);
  if (a>b) Label1->Caption = Edit1->Text;
  else Label1->Caption = Edit2->Text;
  }
  //---------------------------------------------------------------------------

  2,3,4)
  int x,y,z;

  void __fastcall TForm1::Button1Click(TObject *Sender)
  {
  x = StrToInt(Edit1->Text);
  y = StrToInt(Edit2->Text);
  z = StrToInt(Edit3->Text); //2
  if ((x<=y) && (x<=z)) Label1->Caption = Edit1->Text;
  if ((y<=x) && (y<=z)) Label1->Caption = Edit2->Text;
  if ((z<=y) && (z<=x)) Label1->Caption = Edit3->Text;
  }
  //---------------------------------------------------------------------------

  void __fastcall TForm1::Button2Click(TObject *Sender)
  {
  x = StrToInt(Edit1->Text);
  y = StrToInt(Edit2->Text); //3
  z = StrToInt(Edit3->Text);
  if ((x+y+z)>(x*y*z)) Label2->Caption = "Summa";
  else Label2->Caption = "Proizwedenie";
  }
  //---------------------------------------------------------------------------
  void __fastcall TForm1::Button3Click(TObject *Sender)
  {
  x = StrToInt(Edit1->Text);
  y = StrToInt(Edit2->Text);
  z = StrToInt(Edit3->Text); //4
  if ((x>y) && (x>z)) Label3->Caption = IntToStr(x-z);
  if ((y>=x) && (y>=z)) Label3->Caption = Edit2->Text;
  if ((z>=y) && (z>=x)) Label3->Caption = Edit3->Text;
  }
  //---------------------------------------------------------------------------

  5)
  int a,b;

  void __fastcall TForm1::Button1Click(TObject *Sender)
  {
  a = StrToInt(Edit1->Text);
  b = StrToInt(Edit2->Text);
  if (a>b) a = a*b;
  else b = a+b;
  Label1->Caption = IntToStr(a);
  Label2->Caption = IntToStr(b);
  }
   Александр

Далее.

  //---------------------------------------------------------------------------
  void __fastcall TForm1::Button1Click(TObject *Sender)
  {
  double a,b;
  a = StrToFloat(Edit1->Text);
  b = StrToFloat(Edit2->Text);
  Label1->Caption = "Максимальное число";
  Label3->Caption = "Его значение";
  if (a>b)
          {Label2->Caption = ' a ' ;
          Label4->Caption = Edit1->Text;}
  else
          {Label2->Caption = ' b ' ;
          Label4->Caption = Edit2->Text;}
  }
  //---------------------------------------------------------------------------

  void __fastcall TForm1::Button2Click(TObject *Sender)
  {
  double x,y,z;
  x = StrToFloat(Edit1->Text);
  y = StrToFloat(Edit2->Text);
  z = StrToFloat(Edit3->Text);
  Label1->Caption = "Минимальное число";
  Label3->Caption = "Его значение";
  if ((x<y)&&(x<z))
          {Label2->Caption = ' x ' ;
          Label4->Caption = Edit1->Text;}
  else {
        if ((y<x)&&(y<z))
            {Label2->Caption = ' y ' ;
            Label4->Caption = Edit2->Text;}
        else
          {Label2->Caption = ' z ' ;
          Label4->Caption = Edit3->Text;}
       }
  }
  //---------------------------------------------------------------------------
  void __fastcall TForm1::Button3Click(TObject *Sender)
  {
  double x,y,z,sum,proiz;
  x = StrToFloat(Edit1->Text);
  y = StrToFloat(Edit2->Text);
  z = StrToFloat(Edit3->Text);
  sum = x + y + z;
  proiz = x * y * z;
  if (sum>proiz)
          {Label1->Caption = "Сумма больше";
           Label3->Caption = "Ее значение";
           Label4->Caption = FloatToStr(sum);}
  else
          {Label1->Caption = "Произведение больше";
           Label3->Caption = "Его значение";
           Label4->Caption = FloatToStr(proiz);}
  }
  //---------------------------------------------------------------------------
  void __fastcall TForm1::Button4Click(TObject *Sender)
  {
  double x,y,z,razn;
  x = StrToFloat(Edit1->Text);
  y = StrToFloat(Edit2->Text);
  z = StrToFloat(Edit3->Text);
  razn = x - z;
  if ((x>y)&&(y>z))
          {Label1->Caption = "Выполняется условие X>Y>Z";
           Label3->Caption = "Разность Х - Z";
           Label4->Caption = FloatToStr(razn);}
  else
     {
     if ((x>y)&&(x>z))
          {Label1->Caption = "Максимальное число Х";
           Label3->Caption = "Его значение";
           Label4->Caption = Edit1->Text;}
     else {
          if ((y>x)&&(y>z))
            {Label1->Caption = "Максимальное число Y";
             Label3->Caption = "Его значение";
             Label4->Caption = Edit2->Text;}
          else
            {Label1->Caption = "Максимальное число Z";
             Label3->Caption = "Его значение";
             Label4->Caption = Edit3->Text;}
          }
     }
  }
  //---------------------------------------------------------------------------
  void __fastcall TForm1::Button5Click(TObject *Sender)
  {
  double a,b;
  a = StrToFloat(Edit1->Text);
  b = StrToFloat(Edit2->Text);
  Label1->Caption = "Максимальное число";
  Label3->Caption = "Его значение";
  Label5->Caption = "Новые значения чисел а и b";
  if (a>b)
          {a=a*b;
          Label2->Caption = ' a ' ;
          Label4->Caption = Edit1->Text;
          Label7->Caption = FloatToStr(a);
          Label8->Caption = Edit2->Text;}
  else
          {b=a+b;
          Label2->Caption = ' b ' ;
          Label4->Caption = Edit2->Text;
          Label8->Caption = FloatToStr(b);
          Label7->Caption = Edit1->Text;}
  }
  Ярослав

Еще ответы.

  void __fastcall TFormMain::Button1Click(TObject *Sender)
    {
    float a,b;
    a = StrToFloat(eA->Text);
    b = StrToFloat(eB->Text);
    //Задаем значения переменных
   
    lReport->Caption = "Задание №1: max(a,b) \r\n";
    lReport->Caption = lReport->Caption +
        " max(" + eA->Text + "," + eB->Text + ")=";
    if (a>b)
      lReport->Caption = lReport->Caption + "a; a=" + eA->Text;
    else
      lReport->Caption = lReport->Caption + "b; b=" + eB->Text;
   
    lReport->Caption = lReport->Caption + "\r\n" +
        "Задание №5: if (a>b)... \r\n";
    if (a>b)
      {
      a = a*b;
      lReport->Caption = lReport->Caption +
        " (a>b)= True \r\n";
      }
    else
      {
      b = a+b;
      lReport->Caption = lReport->Caption +
        " (a>b)= False \r\n";
      }
   
    lReport->Caption = lReport->Caption +
        " NewA = " + FloatToStr(a) + "\r\n" +
        " NewB = " + FloatToStr(b) + "\r\n";
    }
   
  Ну тут особо ничего коментировать и не надо. Все же поясню
  некоторые моменты.
  Во-первых.
     lReport->Caption = lReport->Caption + Text;
  Тут к имеющемуся тексту в lReport->Caption присоединяется новый
  Text.
  Во-вторых.
  В строках встречается такой участок "\r\n" – это переход на
  следующую строку в
  ответе.

  void __fastcall TForm1::bStartClick(TObject *Sender)
    {
    float x,y,z;
    //Описание переменных
   
    x = StrToFloat(eX->Text);
    y = StrToFloat(eY->Text);
    z = StrToFloat(eZ->Text);
    //Записываем значения текстовых полей в переменные
   
    lReport->Caption = "Задание №2: минимальное число \r\n";
    lReport->Caption = lReport->Caption +
        " min(" + eX->Text + "," + eY->Text + "," + eZ->Text + ")=";
    //Общая часть отчета вынесена за условный оператор
    if ((x<y) && (x<z))
    //Если а - минимальное
      lReport->Caption = lReport->Caption +
          "X; X=" + eX->Text;
    else if ((y<x) && (y<z))
    //Иначе, если в - минимальное
      lReport->Caption = lReport->Caption +
          "y; y=" + eY->Text;
    else
    //а и в не минимальные, значит минимальное - это с
      lReport->Caption = lReport->Caption +
          "z; z=" + eZ->Text;
   
    lReport->Caption = lReport->Caption +
        "\r\n" +
        "Задание №3: что больше - сумма или произведение \r\n";
    if ((x*y*z) < (x+y+z))
      lReport->Caption = lReport->Caption +
          " Сумма больше: \r\n" +
          " " + FloatToStr(x*y*z) + "<" + FloatToStr(x+y+z) + "\r\n";
    else
      lReport->Caption = lReport->Caption +
          " Произведение больше или равно: \r\n" +
          " " + FloatToStr(x*y*z) + ">=" + FloatToStr(x+y+z) + "\r\n";
   
    lReport->Caption = lReport->Caption +
        "Задание №4: Если x>y>z, то... \r\n";
    if ((x>y) && (y>z))
      lReport->Caption = lReport->Caption +
          " Условие выполнено!!! x-z=" + FloatToStr(x-z);
    else
      {
      lReport->Caption = lReport->Caption +
          " Условие не выполнено!!! max(x,y,z)=";
      if ((x>y) && (x>z))
        lReport->Caption = lReport->Caption + eX->Text;
      else if ((y>x) && (y>z))
        lReport->Caption = lReport->Caption + eY->Text;
      else
        lReport->Caption = lReport->Caption + eZ->Text;
   
      lReport->Caption = lReport->Caption + "\r\n";
      }
    }

  А вот задачи из сети я решал без С++.
  Итак, начнем.
   
  "Длинная фотка".
     Переведем мегабайты в биты
     15 Мбайт = 15*1024 кбайт = 15*1024*1024 байт = 15*1024*1024*8 бит
     15 Мбайт = 125829120 бит
  Сосчитаем сколько бит можно скачать за ночь.
  В 3:00 Вася начинает дозвон
  В 3:30 Дозвонился
  3:30 – 3:50. За 20 минут скачали 20*60*2400 = 2880000 бит
  3:50 – новый дозвон
  4:20 – дозвонился
  4:20 – 4:40 скачали еще 2880000 бит
  4:40 - новый дозвон
  5:10 – дозвонился но льгота кончилась
   
  Итак, за ночь скачали 5760000
  Нам понадобится всего 125829120/576000 = 22 ночи.
  Т.е. Маша сильно повзрослеть не успеет и ей будет
  16 лет с вероятностью 94,38%
                    или
  17 лет с вероятностью 5,62%.
   
  "Игрушка"
     Вася приходит с 10 дискетами к Вове (потратил 30 мин).
  Запись 14,4 Мб инфы занимает примерно 5 минут.
  Дорога до дома – еще пол-часа.
   
  Всего походов – 750/14,4 = 52,08.
  Придется идти 53 раз. Запись займет 30 секунд (не будем
  учитывать).
  И, естественно, поход туда-обратно.
   
  Вася приходит домой и начинает устонавливать игру.
  На распаковку уйдет 260 минут.
  А это еще около 5-6 весело проведенных часов
  на установку.
  Всего понадобится
  53*60 + 52*5 + 260 + 5*60 = 4000 минут = 67 часов
  В итоге Вася узнает, что игра не запускается без
  CD-диска (парадоксальная фраза, т.к. CD расшифровывается как
  CompactDisk) через 67 часов, и, если не умрет от голода, то станет
  чемпионом мира по спортивной ходьбе к Вове.

   
  "Дэвуушка"
  Чтобы они узнали, что переписываются друг с другом, они должны
  прочитать
  Хотябы 1 письмо друг друга.
  Начнем отсчет.
  Через 12 часов Сидор пошлет письмо Васе. И наверняка увидит
  письмо от Васи.
  Вася через 4,8 часов пошлет первое письмо, через 9,6 часов второе и
  через 14,4 третье.
  В этот момент увидит письмо от Сидора.
  После этого они известят друг друга.
  Итак, сумарный трафик будет равен
  4кб + 3*2кб = 10кб
   
  "НеТроян"
  Чтобы появился антивирус, компьютор Васи должен послать
  образец вируса в лабораторию.
  Почему Васи? Други компьютеры не примут НеТроян за вирус. А
  Вася образец трояна в
  Лабораторию точно не пошлет. Допустим, что интернетом пользуется
  10% мирогого населения.
  СуперМегаСекретный код узнает 0.1*60000000000 =
  600000000человек.:)))
  Максим.

Далее.

Посылаю вам код с решением пяти простых задач с последнего урока (на условный оператор). Сделал я их все на одной форме. В принципе, трудностей не возникло, но есть один вопрос: как в одно поле Label вывести несколько надписей?

Об этом уважаемые занимающиеся уже написали :)
Надо сделать TLabel побольше, использовать комбинацию "\r\n" для перехода на новую строку, а также можно установить в true значение свойства WordWrap (перенос строк на следующую строку). Есть компоненты, в которых такие возможности поддерживаются по умолчанию, мы их постепенно изучим.

  void __fastcall TForm1::Button1Click(TObject *Sender)
  {
  double a,b;
   a = StrToFloat(Edit1->Text);
   b = StrToFloat(Edit2->Text);
   if (a>b) Label1->Caption= FloatToStrF (a,ffFixed,5,2);
      else Label1->Caption= FloatToStrF (b,ffFixed,5,2);
  }
  //---------------------------------------------------------------------------
   
  void __fastcall TForm1::Button2Click(TObject *Sender)
  {
  double x,y,z;
   x = StrToFloat(Edit1->Text);
   y = StrToFloat(Edit2->Text);
   z = StrToFloat(Edit3->Text);
   if (x<y) {if (x<z) Label1->Caption= FloatToStrF (x,ffFixed,5,2);
               else Label1->Caption= FloatToStrF (z,ffFixed,5,2);}
      else {if (y<z)Label1->Caption= FloatToStrF (y,ffFixed,5,2);
               else Label1->Caption= FloatToStrF (z,ffFixed,5,2);}
  }
  //---------------------------------------------------------------------------
  void __fastcall TForm1::Button3Click(TObject *Sender)
  {
  double x,y,z,sum,ymnoz;
   x = StrToFloat(Edit1->Text);
   y = StrToFloat(Edit2->Text);
   z = StrToFloat(Edit3->Text);
   sum=x+y+z;
   ymnoz=x*y*z;
   if (sum>ymnoz) Label1->Caption="Сумма больше";
      else Label1->Caption="Произведение больше";
  }
  //---------------------------------------------------------------------------
  void __fastcall TForm1::Button4Click(TObject *Sender)
  {
  double x,y,z,razn;
   x = StrToFloat(Edit1->Text);
   y = StrToFloat(Edit2->Text);
   z = StrToFloat(Edit3->Text);
   razn=x-z;
   if ((y<x) && (y>z)) Label1->Caption=FloatToStrF(razn,ffFixed,5,2);
   else {if (x>y) {if (x>z) Label1->Caption= FloatToStrF (x,ffFixed,5,2);
            else Label1->Caption= FloatToStrF (z,ffFixed,5,2);}
   else {if (y>z)Label1->Caption= FloatToStrF (y,ffFixed,5,2);
            else Label1->Caption= FloatToStrF (z,ffFixed,5,2);}}
  }
  //---------------------------------------------------------------------------
  void __fastcall TForm1::Button5Click(TObject *Sender)
  {
  double a,b;
   a = StrToFloat(Edit1->Text);
   b = StrToFloat(Edit2->Text);
   if (a>b) a=a*b;
      else b=a+b;
  }
  Илья

Несколько вопросов.

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

Изменить никак нельзя, но в свою программу надо встроить проверку перед делением, не является ли делитель нулевым. И тогда выдавать сообщение и завершать работу.
Сообщение можно выдать такой командой:
ShowMessage("текст сообщения");
При выполнении этой команды работа программы прервется, и на экране появится небольшое окно с кнопкой ОК.

У некоторых возникали ошибки наподобие таких:

  [Linker error] Unresolved external ' _fastcall
  TForm1::Button16Click(System::TObject *) '
  [Linker error] Unresolved external ' _fastcall
  TForm1::FormCreate(System::TObject *) '

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

Переходим к занятиям.


Объекты

У любого объекта, используемого при создании программы, имеются свойства, которые видны в Инспекторе объектов. У поля-метки, например, есть свойство Caption, у поля ввода - свойство Text и так далее. В С++ доступ к свойству Б объекта А записывается так:

  А->Б

Например:

  Label1->Caption

Свойство само может быть объектом. Под объектом мы понимаем элемент программы (фактически - переменную), которая хранит не одно число или строку, а набор значений разных типов. Объект "Автомобиль" состоит из свойств "Двигатель", "Колесо", "Кузов" итд. В свою очередь свойство "Двигатель" тоже представляет собой объект, состоящий из других свойств (например, "Фильтр", или "СвечаЗажигания"). При записи подобных цепочек вложенных свойств придерживаются прежней схемы - каждое последующее свойство считают элементом предыдущего:

  Автомобиль->Двигатель->Фильтр

Например, почти у любого элемента управления есть свойство Font (шрифт), которое в свою очередь состоит из вложенных свойств: Size (Размер), Color (Цвет) и др. Тогда для доступа к этим подсвойствам применяют такую запись:

  Label1->Font->Size

Объект (в данном случае конкретное поле-метка Label1) - это обычная переменная, только она хранит не одно значение, а группу, объединенную в одно целое. Структура этого целого задается описанием, шаблоном - компонентом TLabel. Фактически TLabel - это тип данных, а Label1, Label2, Label3 - это переменные данного типа. Но так как они хранят не одно значение, а несколько, то для доступа к каждому из вложенных значений (свойств) по их имени используется операция "->".

Правда, данная операция имеет альтернативу в виде точки ".". Дело в том, что значения разных типов хранятся в С++ по разному. Одни - в статической области программы, объем которой заранее известен, как и местонахождение переменных в ней. Другие значения - как правило, крупные объекты, размещаются динамически и могут "плавать" по памяти прямо во время работы программы. Доступ к ним из программы организуется по разному. К крупным объектам приходится обращаться через промежуточный механизм (так называемые указатели, адреса физического места в памяти). К ним как раз применима операция "->". Если же объект небольшой и локальный, для доступа к его свойствам и методам применяется операция ".". Эти вещи придется запомнить, а когда и в каком случае что используетсяе будет конкретно оговариваться.

Функции

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

Функция может иметь параметр (ни одного, один или несколько). Функция StrToFloat преобразует строку, которую получает в качестве единственного параметра, в дробное число. А вот функция FloatToStrF преобразует дробную величину в строковое представление, однако вид этого представления может разниться. Возможно, число будет представлено в экспоненциальной форме, возможно - просто с фиксированной десятичной запятой. Эти особенности уточняются следующими параметрами, определяющими также число знаков после запятой итд.

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

   int len;
   len = Label1->GetTextLen();

В последнем задании возникли сложности в функцией Random(), - в старых версиях С++Билдера ее не оказалось. Готовые функции (они обычно называются стандартные функции) размещаются в десятках стандартных библиотек (наборах функций), которые подключаются к текущей программе по умолчанию. По мере совершенствования среды разработки развиваются и эти библиотеки. В старых версиях вместо выражения (Random(6)+1) можно использовать такую конструкцию: ((rand()%6)+1) . Кому интересно: символ % - это арифметическая операция, как + или - . Она рассчитывает целочисленный остаток от деления левого аргумента на правый. rand() - это стандартная функция, которая выдает случайное число в диапазоне от 0 до максимально возможного целого, поддерживаемого компилятором (по-моему, это 2 в 32-й степени). rand() должна входить в поставку любого компилятора. Остаток от деления случайного числа на 6 всегда будет лежать в диапазоне от 0 до 5.

Не помню, правда, какой был аналог у функции Randomize() (вроде что-то, связанное с srand()), но по крайней мере базовую функциональность, пусть и с повторениями, уже можно реализовать.

Строки

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

Строки можно складывать (сцеплять) операцией + (умножать и делить нельзя :).

   AnsiString S1, S2;
   S1 = "Привет ";
   S2 = S1 + " тебе!";
   Label1->Caption = S2;

В метку Label1 выведется строка "Привет тебе!", созданная сцеплением двух строк.

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

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

Бот будет состоять из многострочного поля TMemo - в нем будет выводиться весь диалог, поля ввода TEdit, в котором человек будет вводить свое обращение к боту, и кнопку TButton, по нажатию на которую содержимое поле ввода поступит в программу.

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

Основой этого алготирма станет метод AnsiPos строкового типа AnsiString, который проверяет, имеется ли в текущей строке подстрока, заданная его параметром. Если она есть, то метод возвращает его начало - номер символа исходной строки, начиная с 1. Если подстроки нету, метод возвращает ноль. Для доступа к методу AnsiPos строковой переменной мы как раз задействуем не операцию "->", а операцию ".", так как эта переменная не представляет собой указатель.

   AnsiString s;
   // получаем строку, введенную человеком:
   s = Edit1->Text;

   // проверяем на разные подстроки:
   if( s.AnsiPos("интернет") > 0 )
     {
     // выдать реакцию на входную строку со словом "интернет"
     } else
   if( s.AnsiPos("кино") > 0 )
     {
     // выдать реакцию на входную строку со словом "кино"
     } else
   ...

Таким образом строится длинная цепочка условных операторов по схеме "если то иначе если то иначе" ...

Как выдавать ответ? У компонента TMemo (многострочное поле) имеется свойство Lines, у которого в свою очередь есть метод Add. Он добавляет в конец всех строк новую строку:

   Memo1->Lines->Add("эту строку добавляем");

Реакция на кино может быть например такой:

   Memo1->Lines->Add("Какое кино ты смотрел в последний раз?");

А можно этот процесс разнообразить, выдавая случайные фразы.

В случае, когда в одной проверке надо объединить несколько условий - например, проверить, есть ли в строке подстрока "деньги" ИЛИ подстрока "денег", то несколько таких проверок можно объединить операцией С++, которая обозначает логическое ИЛИ и записывается так: ||

Проверка, имеется ли в исходной строке хотя бы одна из трех подстрок, запишется так:

   (s.AnsiPos("деньги") > 0) || (s.AnsiPos("денег") > 0) ||
  (s.AnsiPos("денеж") > 0)

Существует также логическая операция И, которая требует, чтобы выполнялось каждое из условий (а не хотя бы одно). Она записывается так: &&

Тогда следующий код

   (s.AnsiPos("деньги") > 0) && (s.AnsiPos("денег") > 0) &&
  (s.AnsiPos("денеж") > 0)

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

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

   int v;
   v = Random(3);
   if( v==0 )
    Memo1->Lines->Add("Как интересно с тобой разговаривать!");
   else if( v==1 )
    Memo1->Lines->Add("Продолжай, пожалуйста.");
   else
    Memo1->Lines->Add("Расскажи об этом поподробнее.");

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


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

Школа программирования с нуля
Все предыдущие выпуски базового курса всегда тут:
http://www.infiltration.ru/p/


Вышел мой учебный курс "Технологии Delphi. Разработка приложений для бизнеса".
http://shop.piter.com/book/978591180282/

В книге описаны десятки технологий, каждой из которых посвящены отдельные книги. Таким образом, купив одну мою книгу, вы существенно сэкономите :) В книге полностью описан язык Delphi (версия 2006, полностью совместимая с Turbo Delphi) для обеих платформ - Win32 и .NET. Охвачены также темы работы с файлами на этих платформах, создания файл-серверных, клиент-серверных, распределенных приложений, веб-программ (Indy, ASP.NET, веб-сервисы). Описаны языки SQL и OCL. Немало глав посвящены истории программирования и различных технологий. Особое внимание уделено созданию программ с помощью технологии ECO и языка моделирования UML - программы фактически рисуются, и теперь даже для создания корпоративных приложений и их переноса в Интернет не обязательно знать программирование!
Отдельная часть отведена технологиям организации групповой работы, управления требованиями, контроля версий, локализации и тестирования.
Тут подробнее про книгу.

Другие мои книги, которые пока доступны в продаже:


Дизайн рассылки: Алексей Голубев - Web-дизайн и web-программирование


В избранное