Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Консольный аналог С++ на Builder  (Прочитано 25549 раз)
0 Пользователей и 1 Гость смотрят эту тему.
scraper
Гость
« : 15-06-2006 19:07 » 

Такая задача на С++:
вводить с консоли символы в массив b[6], и сравнивать посимвольно с символами массива a[6]. Если a[i ]==b[i ], вывести строку подтверждающую это. Иначе, вывести строку, объявляющую об ошибке. Что я и сделал:
 
Код:
char a[6]="12345";
char b[6];
   
for(int i=0; i<5; i++)
{
        b[i]=getch();

if(b[i]!=a[i])
cout<<"Try agein!!!"<<endl;
else
cout<<"b["<<b[i]<<"] = "<<"a["<<a[i]<<"]"<<endl;

}

Теперь то же самое сделать на Buildere.
Делаю:
Код:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
char *a="Caption";
char *b;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
{
for(int i=0; i<7; i++)
{if(a[i]==Key)
StaticText1->Caption = StaticText1->Caption + Key;
else
ShowMessage("Mistake");}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{StaticText2->Caption=a;}
//---------------------------------------------------------------------------

Получается:
При нажатии на клавиатуру отображаются только символы, содержащиеся в массиве а. Другие нет.
Нет проверки на очередность символов, то есть можно вести ‘а’, ‘n’, ‘C’, и они будут отображаться - ‘anC’, хотя не должны, если и-тый элемент не равняется и-тому.
Как сделать соответствие консольной проги и Builder-овской?
« Последнее редактирование: 19-12-2007 19:11 от Алексей1153++ » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 15-06-2006 19:36 » 

scraper, В твоём алгртитме есть логическая ошибка. Даже если я введу все символы не содержашиеся в массиве a, после отработки данного алгоритма массив b будет содержать введенные мной символы. Или я не понял правильно задание Улыбаюсь .

Теперь вопрос другой. Ты хочеш данный алгоритм переложить в виндовс приложение? Тогда я примерно прогнозирую работу твоей программы:
a) При нажатии символа '1', выскочит 7 MessageBox с криком "Mistake". Статик будет содержать примерно такую надпись "Caption".
b) При нажатии символа 'C', выскочит 6 MessageBox с криком "Mistake". Статик будет содержать примерно такую надпись "CaptionC".
« Последнее редактирование: 19-12-2007 18:29 от Алексей1153++ » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
scraper
Гость
« Ответ #2 : 15-06-2006 19:46 » 

Finch, Только что еще раз проверил. Все как описано выше.
Как сделать, что бы символ отображался, только если он должен идти в порядке очереди?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 15-06-2006 20:05 » 

Меняй алгоритм. Во первых цикл выкини. В описании класса окна добавь переменную i. В FormCreate обнули данную переменную.
Ну и теперь в самой функции будет выгледеть так:
Код:
void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
{
   if ((i<7) && (a[i]==Key))
   {
      StaticText1->Caption = StaticText1->Caption + Key;
      i++;
   }
   else ShowMessage("Mistake");
}

Записан

Не будите спашяго дракона.
             Джаффар (Коша)
scraper
Гость
« Ответ #4 : 15-06-2006 20:20 » 

Finch, Вот честно скажу, ДРУГ, если бы у меня была бы возможность прямо сейчас дать тебе 100 долларов, то дал бы незадумываясь.
Спасибо огромное. Очень выручил.
Записан
scraper
Гость
« Ответ #5 : 18-06-2006 19:55 » 

Немного непонятно, в консоле и в Buildere одинаково используется С++, но в Buildere не работает то, что работает в консоле.
У Buildera своя логика?
Существует система переноса из консольного приложения в Builder?
 
Примерно то же самое только с двойным условием в цикле for:

Имеем массив a[41] из него нужно выводить в StaticText1 по 4 символа после чего вводить символы с клавиатуры. Если символы одинаковы (ввод консоль-символ a[ i ]), то загружаем из массива a[41] следующие 4 символа.

В консоле, никаких проблем. Буквально с разбегу:
Код:
char a[41]="abcdefghijklmnopqrstuwvxyzQWERTYUIOPASDF";
    char b[4];
    char c[4];
    int number=0;
    int DoubleNumber=4;   
    int fo=0;
    do{for(int i=number+fo, int j=0; i<DoubleNumber+fo, j<4; i++, j++)
    {b[j]=a[i];
     cout<<b[j]; }
     cout<<endl;
     for(i=0; i<4; i++)
     {c[i]=getch();
     if(c[i]!=b[i])
     cout<<"It's mistake. Try press next letter."<<endl;
     else
     cout<<"c["<<c[i]<<"] = "
            <<"b["<<b[i]<<"]"<<endl;}
     fo=fo+4;
     }while(DoubleNumber<=40);

Builder же достал своими капризами:
   
Код:
char *a;
    char b[4];
    char c[4];
    int number;
    int DoubleNumber;
    int fo;
    int i;
    int j;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
{for(i=number+fo, j=0; i<DoubleNumber+fo, j<4; i++, j++)
   {b[j]=a[i];
       StaticText1->Caption=b;}   
   for(i=0; i<4; i++)
   {c[i]=Key;
      if(c[i]!=b[i])
Shape1->Visible=true;
      else
        StaticText2->Caption="";
StaticText2->Caption = StaticText2->Caption + Key;}
    fo=fo+4;}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{  a="abcdefghijklmnopqrstuwvxyzQWERTYUIOPASDF";
    number=0;
    DoubleNumber=4;
    fo=0;}
Сделать по аналогии с первой задачей не получается  Здесь была моя ладья...
« Последнее редактирование: 19-12-2007 18:29 от Алексей1153++ » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #6 : 19-06-2006 12:39 » 

Ты чуть путаеш понятия. Тут не билдер виноват, а твое не понимание структуры работы системы.
Возьмем простой пример.
Код:
char *a;
/////////////////////////////////////////////////////////////////
void __fastcall TForm1::FormCreate(TObject *Sender)
{  a="abcdefghijklmnopqrstuwvxyzQWERTYUIOPASDF";
/////////////////////////////////////////////////////////////////
}
По идее говоря, на такую конструкцию компилятор должен обругать. Допускаю, что компилятор делает медвежью услугу Улыбаюсь , выделил в константной памяти область и поместил туда строку, и возрашает ссылку на данную строку. Вывод, читай учебник. В частности разделы по работе со строками.

Код:
 
for(i=number+fo, j=0; i<DoubleNumber+fo, j<4; i++, j++)
   {b[j]=a[i];
       StaticText1->Caption=b;}
Зачем 4 раза скидывать одно и тоже в Caption. Когда можно скинуть всего один раз? Кстати, в данной конструкции могут быть глюки. Вывод: Читай, что такое нуль-терминальные строки.
Что есть в переменной c?

Кстати в первом примере
Код:
while(DoubleNumber<=40);
Будет вечный цикл, так как я лично не вижу прирашения переменной DoubleNumber.
« Последнее редактирование: 19-06-2006 12:46 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
scraper
Гость
« Ответ #7 : 19-06-2006 14:27 » 

Finch,
char *a;/////////////////////////////////////////////////////////////////void __fastcall TForm1::FormCreate(TObject *Sender){  a="abcdefghijklmnopqrstuwvxyzQWERTYUIOPASDF";/////////////////////////////////////////////////////////////////}
сдесь я объявляю глобальную переменную, и в Formcreate (при создании формы) она указывает на строку.

Зачем 4 раза скидывать одно и тоже в Caption. Когда можно скинуть всего один раз?
сдесь я скидываю в StaticText по очереди, по 4 символа, и после работы с ними, скидываю следующие.

с вечным циклом (это действительно так) я справлюсь самостоятельно.

Как в Builder перенести смысл консольной версии?
Чтобы можно было работать с символами "упакованными" в пачки по четыре? Жаль



Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #8 : 19-06-2006 15:12 » 

Чтоб перевести твой консольный код в оконный код нужно представить, что тебе предоставилась возможность вставить твой код внутри  функции getch(). Вот в чем отличие твоей консольной программы от оконной. Ты сейчас стараешся переводить в лоб. Естественно, что у тебя ничего и не получается.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
scraper
Гость
« Ответ #9 : 20-06-2006 07:48 » 

Finch, Отталкиваться от:
Код:
void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
{
   if ((i<7) && (a[i]==Key))
   {
      StaticText1->Caption = StaticText1->Caption + Key;
      i++;
   }
   else ShowMessage("Mistake");}
да?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #10 : 20-06-2006 12:12 » 

Разница между консольным приложением и оконным в том, что в консольном приложении ты сам планируеш какое либо событие. В оконном система планирует событие и тебя уведомляет, что произошло онное. Обработчик события от клавиатуры в твоем случае является функция  FormKeyPress. Твоя задача так спроектировать обработчик, чтобы удовлетворял условиям твоей задачи.
Ещё одно, я не даром вчера упоменул про нуль-терминальные строки. Строки в обязательном порядке должны оканчиваться  нулем. Иначе могут быть провисы программы или выскакивать мусор.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
scraper
Гость
« Ответ #11 : 20-06-2006 15:46 » 

Finch, Понятно.
В моем случае, натолкни меня, пожалуйста.
Написание кода (основная логика) где начинается? Где начало?
В чем она состоит? В псевдокоде, на русском, я догадаюсь дальше, если не трудно, напиши, пожалуйста.

Требуется в начале навык разработки собственных программ в Buildere, опыт во вермя еды приходит. Что я и делаю...
 Жаль
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #12 : 20-06-2006 17:02 » 

Я так понял, ты совсем не хочеш работать своей головой Жаль
Вот код. Писал я его вживую, не проверял, поэтому возможны ошибки.
Код:
#define MAXLEN 41
char a[MAXLEN]="abcdefghijklmnopqrstuwvxyzQWERTYUIOPASDF";
int fo;
char b[5];
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormKeyPress(TObject *Sender, char &Key)
{
   if (fo >= MAXLEN) fo=0;                     //проверяем не вышли ли за граници массива a
   if ((fo % 4) == 0)                              // проверяем нужно ли выводить следуюшую партию символов. В частности остаток от деления должен быть равен нулю
   {
       int i;                                                // Формирование 4 символов и отправка в статик
       int l;
       if ((MAXLEN-fo) > 4) l=4;
       else l=MAXLEN-fo;
       for (i=0; i<l; i++) b[i]=a[fo+i];
       b[i]=0;
       StaticText1->Caption=b;    
   }
   if(Key != b[fo % 4]) Shape1->Visible=true;          //Проверка, наш ли это символ
   else
   { 
StaticText2->Caption = StaticText2->Caption + Key;
        fo++;
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
   fo=0;
}
« Последнее редактирование: 22-06-2006 19:09 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Scorp__)
Молодой специалист

ru
Offline Offline
Пол: Мужской

« Ответ #13 : 21-06-2006 09:13 » 

Finch, может человек просто не понимает пока событийного программирования?

scraper, смотри, когда ты пишешь программу для консольного исполнения у тебя есть главная нитка - твоя функция main(). Все выполняется в ней.
Когда ты пользуешься Builder'ом все работает немного по другому. Твоя программа теперь построена так: в ней создан бесконечный цикл, в котором принимаются и обрабатываются сообщения от ОС. Конечно, до бесконечного цикла создаются твои формочки. Твоя задача теперь писать обработчики этих сообщений. Builder скрывает от тебя большую часть реализации и предоставляет тебе возможность просто написать, что ты хочешь сделать при создании программы (TForm1::FormCreate()), что сделать при нажатии пользователем клавиши, движении мышью, щелчке на какой-нибудь кнопке. Ты просто откликаешься на действия пользователя, а не "ведешь" его как было в консоли.

Черт, совсем разучился объяснять, но надеюсь стало понятнее Улыбаюсь
« Последнее редактирование: 19-12-2007 19:14 от Алексей1153++ » Записан

- А Вы сами-то верите в привидения?
- Конечно, нет, - ответил лектор и медленно растаял в воздухе.
scraper
Гость
« Ответ #14 : 21-06-2006 18:33 » 

Finch,  Не-а...
Ребята спасибо, я просто загружен сейчас по самое немогу.

В середине июля начну думать своей головой.  Здесь была моя ладья...
Записан
scraper
Гость
« Ответ #15 : 21-06-2006 19:09 » 

Finch, Только что обкатал. Все работает. Зря ты на себя грешишь.  Да-да

P.S.1. Я начал въезжать в Builder.

P.S.2. С твоей помощью.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #16 : 21-06-2006 19:13 » 

scraper, А то что его можно маленько оптимизировать. Например можно обойтись без переменной b в глобальных переменных.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
scraper
Гость
« Ответ #17 : 21-06-2006 19:19 » 

Естественно.
Ты мне помог основной логический макет проги написать.
На его основе я сделаю свой проект.
Конечно немного поправлю и оптимизирую.  Улыбаюсь
Записан
scraper
Гость
« Ответ #18 : 22-06-2006 13:03 » 

Finch, пожалуйста, расставь комментарии.
Особенно то место, где происходит смена 4 символов в StaticText1 после ввода 4-ого символа в StaticText2.
У нас должно быть так: ввел четвертый символ в StaticText2 и в StaticText1 отобразилась следущая пачка из 4 символов.
А у нас смена в StaticText1 происходит после ввода 5-ого символа в StaticText2.

P.S. Сам все сделаю, просто расставь комментарии где нужно.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #19 : 22-06-2006 19:10 » 

scraper, Я бросил коменты.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
scraper
Гость
« Ответ #20 : 22-06-2006 19:20 » 

Ok. Почему у меня получается ввод пятого символа в StaticText2 без смены пачки в StaticText1?
Изменяю:
fo++ ставлю после 1-ой строки в FormKeyPress.
Работает как мне надо,  только введеные с консоли символы не отображаются в StaticText2.
Алгоритм очень хрупкий  Улыбаюсь
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #21 : 23-06-2006 14:39 » 

Напиши точно по действиям, что тебе нужно получить в результате выполнения программы.
Цитата
Алгоритм очень хрупкий  Улыбаюсь
Ты еше не видел, как программируют настояшие асы. Я только учусь программировать на уровне фола.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
scraper
Гость
« Ответ #22 : 23-06-2006 19:02 » new

Finch, справился я  Отлично 
                  а кричал просто сперепугу  Отлично
                  шас все доделаю и похвастаюсь (2-3 дня)  Улыбаюсь)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines