|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Работа со строками в txt
Здравствуйте уважаемые программисты!
Вновь обращаюсь к вам с вопросом. У меня поставлена следующая задача: Нужно обработать текстовой файл, состоящий из 2-х столбцов чисел. Первый столбик аргумент, второй функция. Эти значения нужно раскидать по корзинам, в зависимости от значения аргумента, в первую попадают только те значения для которых значение аргумента лежит в условии 0,0<=x<0.5, во вторую 0.5<=x<1.0 в третью 1.0<=x<1.5 и так далее с шагом 0,5. Строки аргумента не упорядочены по значениям. В каждой корзине нужно найти среднее значение функции. После этого софрмировать выходной файл, содержащие средние вычисленные значения: В каждой строке файла должно быть два числа: -первое (1 знак после запятой) - начало интверала аргумента (0,5;1,0;1,5;2,0) - второе -вычисленное среднее значение функции. Интервалы должны выводиться в порядке возрастания. Но сейчас появилась необходимость, дополнить некоторые функции к этой программе ( а я не знаю как ): - возможность сделать шаг не только через 0,5 , а через 1 или 2, чтобы шаг можно было вбивать вручную в edit`e... т.е. чтобы внутри программы задавалось условие в зависимости от указанного шага 1.0<=x<2.0, 2<=x<3, и так далее шаг 1; 2.0<=x<4.0, 4<=x<6, и так далее шаг 2. - возможность для обработки еще двух дополнительных столбиков (третьего и четвёртого), которые расчитываются по таким же правилам как и 2-ой, т.е. средние значения... Если открыть файл с третьим и четвёртым столбиком, то подсчёт будет не верный... ПОэтому я прикрепил для образца файлы, (Образец (2 столбика)), и файлы где 4 столбика. Прошу помочь,что в коде исправить, спасибо! У меня есть код (программу прикреплю): Она расчитывает всё как положено. Шаг 0,5 первый столбик, Средние значения во втором. Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls; type TForm1 = class(TForm) Button2: TButton; OpenDialog1: TOpenDialog; procedure Button2Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button2Click(Sender: TObject); const NumBackets=2048; // максимально количество type tBacket=record summ:extended; //накопление значений функций numb: longint; //количество значений в корзине end; var t:textfile; i,n:longint; a:array[0 .. NumBackets-1] of tBacket; x,y:extended; F,Str:string; begin if OpenDialog1.execute then begin fillchar(a,sizeof(a),0); F:=OpenDialog1.FileName; assignfile (t, F); Delete(Str,0,32); reset (t); readln(t,F); end; while not eof(t) do begin readln(t,x,y); if (x>=0.0) and(x<(NumBackets/2)) then begin n:=trunc(x*2.0); a[n].summ:=a[n].summ+y; inc(a[n].numb); end else begin closefile(t); writeln('It isn`t enough backets'); halt(1); end; end; closefile(t); F:=FormatDateTime(' ddddd_hh.nn',Now)+'.txt'; showmessage('complete!'); assignfile(t,F); rewrite(t); for i:=0 to Numbackets-1 do if a[i].numb>0 then if odd(i) then writeln(t,i/2:1:1,#9,a[i].summ/a[i].numb:1:2) else writeln(t,i/2:1:0,#9,a[i].summ/a[i].numb:1:2); closefile(t); end; end. |