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
Спокойный
Администратор
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
Спокойный
Администратор
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
Спокойный
Администратор
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? Кстати в первом примере Будет вечный цикл, так как я лично не вижу прирашения переменной 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
Спокойный
Администратор
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
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #10 : 20-06-2006 12:12 » |
|
Разница между консольным приложением и оконным в том, что в консольном приложении ты сам планируеш какое либо событие. В оконном система планирует событие и тебя уведомляет, что произошло онное. Обработчик события от клавиатуры в твоем случае является функция FormKeyPress. Твоя задача так спроектировать обработчик, чтобы удовлетворял условиям твоей задачи. Ещё одно, я не даром вчера упоменул про нуль-терминальные строки. Строки в обязательном порядке должны оканчиваться нулем. Иначе могут быть провисы программы или выскакивать мусор.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
scraper
Гость
|
|
« Ответ #11 : 20-06-2006 15:46 » |
|
Finch, Понятно. В моем случае, натолкни меня, пожалуйста. Написание кода (основная логика) где начинается? Где начало? В чем она состоит? В псевдокоде, на русском, я догадаюсь дальше, если не трудно, напиши, пожалуйста. Требуется в начале навык разработки собственных программ в Buildere, опыт во вермя еды приходит. Что я и делаю...
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
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__)
Молодой специалист
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
Спокойный
Администратор
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
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #19 : 22-06-2006 19:10 » |
|
scraper, Я бросил коменты.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
scraper
Гость
|
|
« Ответ #20 : 22-06-2006 19:20 » |
|
Ok. Почему у меня получается ввод пятого символа в StaticText2 без смены пачки в StaticText1? Изменяю: fo++ ставлю после 1-ой строки в FormKeyPress. Работает как мне надо, только введеные с консоли символы не отображаются в StaticText2. Алгоритм очень хрупкий
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #21 : 23-06-2006 14:39 » |
|
Напиши точно по действиям, что тебе нужно получить в результате выполнения программы. Алгоритм очень хрупкий Ты еше не видел, как программируют настояшие асы. Я только учусь программировать на уровне фола.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
scraper
Гость
|
|
« Ответ #22 : 23-06-2006 19:02 » |
|
Finch, справился я а кричал просто сперепугу шас все доделаю и похвастаюсь (2-3 дня) )
|
|
|
Записан
|
|
|
|
|