Решил освоить формы..раньше юзал только смд! Ситуация такова, на форме расположенны пять элементов Edit1, Label1, Label2, Label3, Button1: Edit1 //ввод слов Label1 //вывод количества встречаемых букв Label2 //вывод всей суммы букв Label3 //частота букв В Button1 лежит следующий код: Код (Text): double search(char *str, double size, char ch){ for(int i=0;i<size;i++) if(str[i] == ch) return i; return -1; } void __fastcall TForm1::Button1Click(TObject *Sender) { char alpha[] = "абвгджзийклмнопрстуфхцчшщъыьэюя"; double*counters = new double [strlen(alpha)]; for(int i=0;i<strlen(alpha);i++) counters[i] = 0; int i,k,pos,ch; double sum; float f; AnsiString cha=ch; cha= Edit1->Text; pos = search(alpha,strlen(alpha),ch); if(pos>=0) counters[pos]++; for(i=0;i<strlen(alpha);i++){ Label1->Caption=String(alpha[i])+"="+ String(counters[i]); } for(k=0,sum=0;k<strlen(alpha);k++){ sum+=counters[k]; } Label2->Caption=String (sum); Label3->Caption="a="+String (counters[0]/sum)+"; б="+(counters[1]/sum); } встретил проблему с ансистрингом, тут и стала программа.. кто знает пути обхода ансистринга?.. ЗЫ: Билдер 6.0..
http://sources.ru/builder/faq/004.html посмотрел тут!.. если сделать по аналогии Код (Text): counters= double_as_AnsiString*ToDouble(); малопомогает.. ..можно ли вообще избежать использования ансистринга?..
Nok Я бы написал вот так: Код (Text): Label3->Caption="a="+FloatToStr(counters[0]/sum)+"; б="+FloatToStr(counters[1]/sum); Никаких проблем не должно быть с такой записью
спасибо, ничего не стал исправлять..проблема в ансистринге!!!!..я не понимаю чего он не хочет читать char-овские букафки?..а требует ансистринг!..
бросаем мпредложение в Edit1, считаем сколько их в предложении и выводим в Label1.. Код (Text): double search(char *str, double size, AnsiString ch){ for(int i=0;i<size;i++) if(str[i] == ch) return i; return -1; } void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString ch,alpha = "абвгджзийклмнопрстуфхцчшщъыьэюя"; char * alpha2 = alpha.c_str(); double*counters = new double [alpha.Length()]; for(int i=0;i<alpha.Length();i++){ counters[i] = 0; } int i,k,pos; double sum; ch =Edit1->Text.c_str(); pos = search (alpha,alpha.Length(),ch); if(pos>=0) counters[pos]++; for(i=0;i<alpha.Length();i++){ Label1->Caption = Label1->Caption + AnsiString(alpha[i])+"="+ AnsiString(counters[i]); } } пишет => 'Could not convert variant of type (String) into type (Double)' ктознает?..
Nok ch - AnsiString, str - char. Ты как их сравниваешь? Нет, конечно может и работает, но просто повезло. Зачем присваивать alpha2 копию alpha? Зачем обычный счетчик типа double? AnsiString ch; Идем дальше... ch =Edit1->Text.c_str(); Вообще-то c_str() возвращает копию строки в виде стандартной для C/C++ SZ-строки. И эта строка потом обратно преобразуется - глупость. Учти, при выхове опять неявно вызывается c_str(). Лучше и правда, как предлагали, FloatToStr(). Вообще, складывается чувство, что ты совершенно не понимаешь, что пишешь - какое-то собрание разрозненных кусков странного кода. Может стоит сначала почитать теорию?
не скрываю, что ничерта не смысло в с++..тем более в ядре Форточек..но зато есть желание.. исправил по твоим замечаниям.. Код (Text): void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString ch,alpha = "абвгджзийклмнопрстуфхцчшщъыьэюя"; int i,k,p; ch =Edit1->Text; double*counters; for(k=1;k<ch.Length();k++){ p=AnsiPos(alpha,ch); if(p>=0) counters[p]++;; } for(i=1;i<alpha.Length();i++){ Label1->Caption = Label1->Caption + FloatToStr(alpha[i])+"="+ FloatToStr(counters[i]); } } чтонитак обьясняй?..
Nok Вообще-то, большинство компиляторов и сред разработки сообщают номер строки, содержащей ошибку. BCB входит в их число. Задумайся об этом. Еще рекомендую задуматься на тему "представление символов в памяти компьютера" и, опционально, "кодировки" - это сделает алгоритм и код значительно красивее. Извиняюсь, мне искренне интересно, что это? Ах да, еще рекомендую задуматься о приобретении какого-нибудь учебника по С++.
интересно, отвечу..смд-консоль!..т.е имелось ввиду..юзал Борланд через Console Wizard=) спасибо за советы=)..
Nok Ты не все исправил Код (Text): ch =Edit1->Text; Я очень надеюсь, что в Edit1 содержится строка из одного символа. Иначе весь последующий код - полный бред, честно. Кроме того Код (Text): p=AnsiPos(alpha,ch); AnsiPos, если мне память не изменяет, вызывается так AnsiPos( искомая_подстрока, строка_host ), а не наоборот Код (Text): if(p>=0) counters[p]++;; Убери второй ";" и объясни, зачем в counters в качестве позиции задавать позицию найденного символа? Код (Text): Label1->Caption = Label1->Caption + FloatToStr(alpha[i])+"="+ FloatToStr(counters[i]); alpha это что? double? нет. так зачем тогда FloatToStr(alpha)? Тут вообще ничего не нужно, просто alpha. Еще раз прошу, почитай книжки по C/C++ и по BCB (например \CBuilderX\Help\bcbX.hlp, раздел "VCL Reference - AnsiString").
тут поподробней плз!.. не ведал, что пишу!.. всеостальное исправил..но не успокоюсь пока программулина не залинкуеццо!.. читаю горы мануалов и фак!... Код (Text): double search(char *str, double size, char ch){ for(int i=1;i<size;i++) if(str[i] == ch) return i; return -1; } void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString cha, alpha = "абвгджзийклмнопрстуфхцчшщъыьэюя"; int i,k,p; char ch;//попросил инициализировать ch, не стал ругатся с ним=).. cha =Edit1->Text;//Борланд требовал занос в ансистринг..попросил, сделал! for(i=k;i<cha.Length();k++) { // получение символов из строки типа AnsiString char counters = cha[k];}//подсмотрел здесь http://sources.ru/builder/faq/007.html p= search(alpha,alpha.Length(),ch); if(p>=0) counters[p]++; //заносим в counters[p] если не нуль и не меньше 1; for(i=1;i<alpha.Length();i++){ Label1->Caption = Label1->Caption + alpha[i]+"="+ counters[i]; //вывод содержимого alpha[i] + счетчик букв counters[i] } }
Теперь скажи, что по твоему эта *штука* должна сделать? Тут есть несколько серьезных боков. 1. переменная counters объявляется внутри цикла for.... я точно не помню, но вроде ее область видимости - именно этот цикл. 2. она объявляется как char, а в дальнейшем (за пределами тела цикла) используется как char*; 4. Используется неинициализированная переменная int k; 3. Следовательно, наверное имелось в виду: Код (Text): char* counters = new char[cha.Length()]; for (int i =0; i < cha.Length(); ++i) counters [i] = cha[i]; Дальше по тексту используется неинициализированная переменная ch, которую ты хочешь найти в строке.......... короче, это все бред. Учи C++;
Nok Что-то сложно пишешь. Я тут накалякал, сразу говорю, что даже и не проверял, сам проверишь и допишешь. Код (Text): int counters[256]; String word = Edit1->Text; int Num = 0; DWORD Sum = 0; memset(counters, 0, 256*sizeof(int)); for (int i = 1; i <= word.Length(); i++) { BYTE b = word[i]; Sum += b; if (!counters[b]) Num++; counters[b]++; } Label1->Caption = String(Num); Label2->Caption = String(Sum); String str = ""; for (int n= 0; n < 256; n++) { if (counters[n]) str += String(n) + ":" + FormatFloat("0.00", (float)counters[n]/Sum); } Label3->Caption = str;
Nok Код (Text): for(i=k;i<cha.Length();k++) { // получение символов из строки типа AnsiString char counters = cha[k];}//подсмотрел здесь http://sources.ru/builder/faq/007.html В counters на каждом цикле будет переписыватся старое значение новым. Код (Text): if(p>=0) counters[p]++; //заносим в counters[p] если не нуль и не меньше 1; Работать не будет, counters как char описан, а не как массив чаров. char ch; - описан, но нигде ему никакое значение не присваивается Зато в Код (Text): p= search(alpha,alpha.Length(),ch); используется Пройдись по программе своей внимательно и посмотри что она делает. В отладчике погляди и все станет ясно. В данном виде она работать правильно не может. Пока писал меня опередили
чувак, жутко извиняюсь за тупняк..а именно за.. Код (Text): for(i=k;i<cha.Length();k++) { // получение символов из строки типа AnsiString char counters = cha[k];}//подсмотрел здесь http://sources.ru/builder/faq/007.html[/quote] имел ввиду другое(см. код дальше) вникнул на свежую голову и пошел дальше исправлять!.. Код (Text): double search(char *str, double size, char ch){ for(int i=1;i<size;i++) if(str[i] == ch) return i; return -1; } void __fastcall TForm1::Button1Click(TObject *Sender) { AnsiString cha; char alpha[] = "абвгджзийклмнопрстуфхцчшщъыьэюя";//тут протупил, исправил!.. int i,k,p; char ch;//попросил инициализировать ch, не стал ругатся с ним=).. char* counters = new char[cha.Length()]; cha =Edit1->Text;//Борланд требовал занос в ансистринг..попросил, сделал! //*********вот эти строчки мне больше всего непонятны, писал наугад********* for(k=0;k<cha.Length();k++) { // получение char ch из cha AnsiString char ch = cha[k];}//подсмотрел здесь http://sources.ru/builder/faq/007.html // м.б. просто записать char ch = cha;??? p= search(alpha,strlen(alpha),ch); if(p>=0) counters[p]++; //заносим в counters[p] если не нуль и не меньше 1; for(i=0;i<strlen(alpha);i++){ Label1->Caption = Label1->Caption + alpha[i]+"="+ counters[i]; //вывод содержимого alpha[i] + счетчик букв counters[i] } } даже залинковался..и создал ехе файл..но ругатся меньше не стал!.. андер констракшн!..
программулина работает, проверил..написал с первого раза..мне до тебя далеко но буду стремиццо!=).. но мне важно чтобы мой код заработал..просто уже самому интересно что пля в ней нитак!...