БлогNot. C++ Builder: несколько чисел в одном поле ввода

Помощь дата->рейтинг Поиск Почта RSS канал Статистика nickolay.info Домой

C++ Builder: несколько чисел в одном поле ввода

Как сделать так, чтобы ввести и записать в массив сразу несколько целых чисел, введённых в одно текстовое поле Edit1?

Проблема несложна. Добавим на форму однострочное поле ввода типа TEdit и кнопку TButton. В обработчике её события OnClick реализуем код:

String S = Trim(Edit1->Text)+" ";
const int SIZE=3; //Максимальная размерность массива чисел
int n[SIZE]; //Массив, куда пишутся числа
for (int i=0; i<SIZE; i++) n[i]=0; //Зануляем элементы массива
int k=0,index=0;
do { //Цикл разбора строки на числа
 index=S.Pos(" "); //Позиция пробела в строке
 if (index>0) {
  try {
   n[k++] = StrToInt(S.SubString(1,index-1));
  } 
  catch (...) { } //То, что не удалось преобразовать в целое - пропускаем
  S=S.Delete(1,index); //Удаляем обработанную часть строки
 }
} while (k<SIZE && index>0); //Пока есть место в массиве или пробелы
//Просто показываем полученные числа в demo-целях:
for (int i=0; i<SIZE; i++)
 ShowMessage(IntToStr(n[i]));

Если максимальное количество чисел заранее не ограничено, просто пишите их в список вместо статического массива, код станет даже проще:

String S = Trim(Edit1->Text)+" ";
TStringList *List = new TStringList();
int k=0,index=0;
do {
 index=S.Pos(" ");
 if (index>0) {
  try {
   String n = StrToInt(S.SubString(1,index-1));
   List->Add (n);
  } 
  catch (...) { }
  S=S.Delete(1,index);
 }
} while (index>0);
for (int i=0; i<List->Count; i++)
 ShowMessage(List->Strings[i]);

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

Кроме того, мы здесь, согласно заданию, реализовали "ручной" разбор строки на слова, а в VCL есть автоматический, с ним код становится ещё проще:

String S = Trim(Edit1->Text);
TStringList *List = new TStringList();
List->DelimitedText = S;
for (int i=0; i<List->Count; i++)
 try {
  int n=StrToInt(List->Strings[i]);
 }
 catch (...) {
  List->Delete(i--);
 }
for (int i=0; i<List->Count; i++)
 ShowMessage(List->Strings[i]);

Для вещественных чисел будет везде StrToFloat вместо StrToInt.


теги: алгоритм список c++ builder

20.09.2014, 14:55; рейтинг: 9301

  свежие записипоиск по блогукомментариистатистика

Наверх Яндекс.Метрика
© PerS
вход