C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Загрузка данных из файла, парсирование полученных строк, вывод каждого элемента  (Прочитано 708 раз)
Ezhik03
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 3


« : 15 Февраль 2017, 11:55:24 »

Добрый день, уважаемые форумчане!

Я - радиоинженер. Серьёзным программированием я не занимался, но на работе была поставлена глобальная задача, для выполнения которой я решил воспользоваться C++ Builder. Кое- какие навыки имеются, но понимаю, что знаний не достаточно.
Я глобальную задачу разбил на несколько локальных.

1. Имеем текстовый файл, данные из которого мне нужны строки с 18 по 19617.
Данные из этих представлены в виде чисел, разделенных пробелами.
Пример:
Код

16.2        20.4        -2.9096490   0         -21.570751  0
16.4        20.4        -7.0444910   0         -22.913940   0
16.6        20.4        -11.642429  0         -24.382340   0
16.8        20.4        -10.577831  0         -23.916622  0

2. Нужно каждый элемент строки вывести в отдельное поле. Для наглядности, мы видим на примере, что каждый столбец должен быть отображен в своём поле вывода (Memo или Edit). В моём случае -это Memo (Memo1...Memo6).

3. После того, как я разбил строки на элементы (в качестве разделителя выступал пробел) и ввел каждый столбец в своё поле Memo (получилось шесть столбцов), нужно стало из каждого поля Memo сделать массивы для последующего построения графиков. Т.е. должны получить шесть массивов.

4. Из получившихся шести массивов нужно построить графики. Первый график - массив1 и массив2; второй график - массив3 и массив 5.

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

Листинг программы

Код
//---------------------------------------------------------------------------
#include <vcl.h>
#include <iostream>
#include <fstream>
#include <string>
#pragma hdrstop
#include "SortDataBase3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ListBox1Click(TObject *Sender)
{
 ListBox1->Items->Clear();
 ListBox1->Items->LoadFromFile("C:/am44/ST1_RX_H_10950.mat");
}
void ParseString (TStringList *List, AnsiString Src, char Delimiter)
{
List->Clear();
while (1)
{
Src = Src.Trim();
if(!Src.Length()) break;
int Index = Src.AnsiPos(Delimiter);
if(!Index) {List->Add(Src); break; }
List->Add(Src.SubString(1,Index - 1).Trim());
Src.Delete(1,Index);
}
};
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
ListBox1->Items->Clear();
ListBox1->Items->LoadFromFile("C:/am44/ST1_RX_H_10950.mat");
 
int Index=ListBox1->ItemIndex;
 
for (Index = 18; Index < 961; Index++) {
 
 
//if (Index>=17)
//{
TStringList *List=new TStringList();
ParseString(List, ListBox1->Items->Strings[Index], ' ');
Memo1->Text=(List->Count>0)?Memo1->Text+" "+List->Strings[0]:(String)"";  //  если элемент существует, кладём в первый Эдит
Memo2->Text=(List->Count>1)?Memo2->Text+" "+List->Strings[1]:(String)"";  //  если элемент существует, кладём во второй Эдит
Memo3->Text=(List->Count>2)?Memo3->Text+" "+List->Strings[2]:(String)"";  //  если элемент существует, кладём в третий Эдит
Memo4->Text=(List->Count>3)?Memo4->Text+" "+List->Strings[3]:(String)"";  //  если элемент существует, кладём в четвертый Эдит
Memo5->Text=(List->Count>4)?Memo5->Text+" "+List->Strings[4]:(String)"";  //  если элемент существует, кладём в пятый Эдит
Memo6->Text=(List->Count>5)?Memo6->Text+" "+List->Strings[5]:(String)"";  //  если элемент существует, кладём в шестой Эдит
 
 
 delete List;
}
 
}
//---------------------------------------------------------------------------
 

К сожалению, я не смог вставить свою форму, но, вкратце опишу: Поле ListBox, в которое выводится файл; шесть полей Memo, в которые выводятся элементы строк (столбцы); кнопка исполнения программы.

Дорогие форумчане! Я ЗАРАНЕЕ БЛАГОДАРЕН ВСЕМ, кто захочет помочь разобраться мне в этой проблеме и, если вам будет не трудно, то укажите на мои ошибки в программе и сделайте подробный комментарий. Очень буду рад помощи в выполнении пунктов 3 и 4 с подробнейшим разбором кода. Это важно, прежде всего, для меня, потому что очень важно освоить такой интересный язык программирования, как Билдер.
Записан
Hex
Участник
**

Сказали спасибо: +14/-1
Offline Offline

Сообщений: 29


« Ответ #1 : 24 Февраль 2017, 17:03:06 »

курсач?
делаешь 6 векторов, кладешь на форму 2 TChart-а, настраиваешь тип графика - линии
пробегаешь по строкам в мемо преобразовывая строки в числа в StrToFloat(), и сваливаешь в вектора.
затем пробегаешь по элементам векторов и выводишь графики.
вуаля.

PS свой Parser выкинь, делается просто List->DelimitedText = Src; и все.
Записан
Ezhik03
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 3


« Ответ #2 : 27 Февраль 2017, 12:33:11 »

Спасибо!

Нет, не курсач, а построение изолиний антенных файлов для зоны покрытия луча бортовой спутниковой антенны. По работе очень нужно, чтобы визуализировать расчет кроссполяризационной развязки и нахождения коэффициента усиления передающей антенны земной станции.
Записан
serg76
Участник
**

Сказали спасибо: +38/-2
Offline Offline

Сообщений: 575


« Ответ #3 : 27 Февраль 2017, 14:09:32 »

много вариантов реализации, заполни temp1, temp2
Код
  double *temp1,*temp2;
 int i=1,k=512;
 
 Chart1->Series[0]->Clear();
 Chart1->Series[0]->SeriesColor=(TColor)0x008000;
 Chart1->Series[1]->Clear();
 Chart1->Series[1]->SeriesColor=(TColor)0x80ff80;
 
 temp1 = new double[k];
 temp2 = new double[k];
 
 Randomize();
 
 while(i<k)
 {
   if(i<20)
   {
     temp1[i]=20+10*pow(M_E,(-0.15)*i)*sin(M_PI/8*i);
     temp2[i]=20+10*pow(M_E,(-0.15)*i)*sin(M_PI/8*i);
   }
   else
   {
     temp1[i]=20+10*pow(M_E,(-0.15)*i)*sin(M_PI/8*i)+rand()%5-3;
     temp2[i]=20+10*pow(M_E,(-0.15)*i)*sin(M_PI/8*i)+rand()%5-3;
   }
   i++;
 }
 
 Chart1->Series[0]->AddArray(temp1,k-1);
 Chart1->Series[1]->AddArray(temp2,k-1);
 
 delete[]  temp1;
 delete[]  temp2;
 

из личного опыта, данные на серии лучше добавлять по времени, реальное распределение.
функция AddXY, примеры в интернете
Записан
Ezhik03
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 3


« Ответ #4 : 27 Февраль 2017, 14:49:53 »

Спасибо большое, Serg76!

Я сейчас по совету Hex со строками разбираюсь. Со строками управлюсь и к графикам перейду. Улыбка
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines
Страница сгенерирована за 0.109 секунд. Запросов: 22.