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

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.

20.09.2014, 14:55 [11597 просмотров]


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

К этой статье пока нет комментариев, Ваш будет первым