| 
			| 
					
						| 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 41char 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 дня)    ) |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  |