Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 [Все]   Вниз
  Печать  
Автор Тема: Текстовые файлы в Delphi  (Прочитано 46811 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Стася
Постоялец

ru
Offline Offline

« : 24-12-2008 15:11 » 

Представить на графике функцию, заданную в виде таблицы в текстовом файле. Определить ее среднее арифметическое значение.
Я сделала текстовый файл такого вида:
1 2
2 3
4 8
1 9
5 7
Как сделать отдельно массив х и массив у, и запихнуть их в стоку Chart1. и так далее.
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 24-12-2008 15:13 » 

Стася, по поводу раздельных массивов - может, стоит читать элементы из файла по принципу: одно значение в x, одно в y?
Записан
Стася
Постоялец

ru
Offline Offline

« Ответ #2 : 24-12-2008 15:17 » 

Можно. А как это сделать?
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #3 : 24-12-2008 15:19 » 

Стася, как поместить значение в массив? Как открыть файл на чтение? Как прочитать из файла символ?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
zubr
Гость
« Ответ #4 : 24-12-2008 15:24 » 

1. Последовательно читать строки из файла, или полностью прочитать файл и перебирать строки.
2. Парсить каждую строку на слова (в данном случае числа), где в качестве разделителя между словами использовать пробел.
3. Первое слово (число) записывать в массив X, соответственно второе слово-число в массив Y.
Записан
Стася
Постоялец

ru
Offline Offline

« Ответ #5 : 24-12-2008 15:26 » 

Setlength-только  я не знаю, как это в скобочках написать.
AssignFile-открыть файл.
Readln-прочитать и перенести курсор на следующую строку.
Азы я знаю,у меня массив именно по столбцу должен быть. Я не знаю,как это написать.
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #6 : 24-12-2008 15:31 » 

Стася,

массиаА := первый символ строки

пробел

массивБ := третий символ строки
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Стася
Постоялец

ru
Offline Offline

« Ответ #7 : 24-12-2008 15:33 » 

Тогда получается следующее число в А это четвертый символ, а Б шестой.
Setlength(x,length(x)+3);
Setlength(y,length(y)+3;
Так что ли?
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 24-12-2008 15:43 » 

не путайте девушку
while not(eof) do
begin
   readln(first,second);
{пихаем в массив
end;
паскаль сам разберется с типами
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
zubr
Гость
« Ответ #9 : 24-12-2008 15:50 » 

Sla, паскаль сам разберется с типами, если это типизированный файл. В случае же текстового файла, можно сделать так:
Код:
AssignFile(F, Filename); //открыли файл
Reset(F);
i := 0; //начало массивов
while not Eof(F) do
begin
Readln(F, s);//читаем в строку s
s := Trim(s);// освобождаемся от крайних пробелов (на всякий случай)
k := Pos(' ', s); // определяем позицию пробела
inc(i);//инкрементируем индекс массива
X[i] := StrToInt(Copy(s, 1, k-1));
Delete(s, 1, k);
s := Trim(s);
Y[i] := StrToInt(s);
end;
Записан
Стася
Постоялец

ru
Offline Offline

« Ответ #10 : 24-12-2008 15:54 » 

Что такое инкрементация?
И потом тогда для графика так написать:
Chart1.SeriesList[0].Addxy(x,y,'',cl...)
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #11 : 24-12-2008 16:48 » 

Стася, инкремент - это +1.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Стася
Постоялец

ru
Offline Offline

« Ответ #12 : 24-12-2008 16:52 » 

s,k:string?Не понял?
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #13 : 24-12-2008 16:57 » 

Стася, ну уж подумай, поэксперементируй.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Стася
Постоялец

ru
Offline Offline

« Ответ #14 : 24-12-2008 17:01 » 

Она то одну стоку красным выделяет, то другую, а голова уже в ауте. Мож завта с утречка соображу) Спасибо вам)
Записан
zubr
Гость
« Ответ #15 : 24-12-2008 17:16 » 

k: Integer;
s: string;
Сделать можно примерно так:
Код:
For i:=1 to LenArray do // LenArray - число строк в текстовом файле или длина массивов
 Chart1.SeriesList[0].Add(Y[i], '', clRed);
 For i:=0 to Chart1.SeriesList[0].Count-1 do
 Chart1.SeriesList[0].XValue[i] := X[i+1];
Записан
Стася
Постоялец

ru
Offline Offline

« Ответ #16 : 24-12-2008 17:33 » 

A LenArray получается то же самое что и Length?
« Последнее редактирование: 24-12-2008 17:55 от Стася » Записан
zubr
Гость
« Ответ #17 : 24-12-2008 17:55 » 

При чтении строк мы используем счетчик i - по выходу из цикла чтения файла значение i и будет LenArray
Записан
Стася
Постоялец

ru
Offline Offline

« Ответ #18 : 24-12-2008 17:58 » 

Что-то я запуталась((
Записан
zubr
Гость
« Ответ #19 : 24-12-2008 18:03 » 

Код:
var
  LenArray: Integer;

AssignFile(F, Filename); //открыли файл
Reset(F);
LenArray := 0; //начало массивов
while not Eof(F) do
begin
Readln(F, s);//читаем в строку s
s := Trim(s);// освобождаемся от крайних пробелов (на всякий случай)
k := Pos(' ', s); // определяем позицию пробела
inc(LenArray;//инкрементируем индекс массива
X[LenArray] := StrToInt(Copy(s, 1, k-1));
Delete(s, 1, k);
s := Trim(s);
Y[LenArray] := StrToInt(s);
end;
« Последнее редактирование: 24-12-2008 18:06 от zubr » Записан
Стася
Постоялец

ru
Offline Offline

« Ответ #20 : 24-12-2008 18:20 » 

Он подчеркивает строку x:=strtoint(copy(s,1,k-1)) и ставит курсор перед двоеточием.И пишет что Array type required
 
Записан
zubr
Гость
« Ответ #21 : 24-12-2008 18:43 » 

Стася, ты если не хочешь врубаться в код что тебе показывают, хоть копи пасть правильно.
 X[LenArray] := StrToInt(Copy(s, 1, k-1));
Записан
Стася
Постоялец

ru
Offline Offline

« Ответ #22 : 24-12-2008 19:08 » 

Нет, как раз таки я хочу врубиться в код. Но никак не могу врубиться. И не понимаю, почему ошибка, потому что в delphi чайник еще.
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #23 : 24-12-2008 19:14 » 

zubr, кстате твоя учиница чего то пытается делать Улыбаюсь а вот моя тушите свет Улыбаюсь
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
zubr
Гость
« Ответ #24 : 24-12-2008 19:17 » 

Стася, ну все очень просто, ты пытаешься присвоить значение не элементу массива, а практически указателю на массив. Поэтому компилятор и ругается.
Записан
zubr
Гость
« Ответ #25 : 24-12-2008 19:19 » 

McZim, ну результат пока одинаков Улыбаюсь
Записан
Стася
Постоялец

ru
Offline Offline

« Ответ #26 : 24-12-2008 19:28 » 

Ну тогда надо задавать LenArray не как integer, а как массив array of integer. Но тогда вообще ерунда получится.
Записан
SEA
Помогающий

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #27 : 24-12-2008 20:22 » 

Стася, честно, ты покорила меня упорством в попытке понять... )

Смотри:
Код:
var MyArray: array of integer;
MyArray - теперь это пустой массив целых чисел. Вроде как и массив, но в нем ни одного элемента еще нет. Сравние его с пустой папкой для бумаг (скоросшиватель).

Дальше:
Код:
SetLength(MyArray, 5);
Теперь мы процедурой SetLength сделали так, что в массиве завелось пять элементов:: в скоросшиватель запихнули и прикрепили там пять файлов. (Кстати, ведь именно отсюда и берут названия Папка и Файл в системе Windows - это аналогия с офисным столом.)

Теперь в нашем массиве MyArray уже есть пять чисел (в нашем скоросшивателе пять файлов вшито) Как же узнать, что это за числа? Смотри:
Код:
MyArray[0] //Это нулевой элемент. {По человечески он первый, но в компьютерах принято начинать счет с нуля. Ноль-раз-два-три-четыре - вышел зайчик погулять... )))}

MyArray[1] // Это первый элемент...
MyArray[2] // Это второй элемент...
MyArray[3] // Это третий элемент...
MyArray[4] // Это четвертый элемент...

Чтобы присвоить второму элементу нашего массива цифру 925466385 пишем:
Код:
MyArray[2] := 925466385;

Поняла структуру массивов?
Записан

почувствуй радость творческих мук!
Стася
Постоялец

ru
Offline Offline

« Ответ #28 : 24-12-2008 20:25 » 

Да, спасибо. Но inc(LeanArray) он все равно будет ругать.
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #29 : 24-12-2008 20:34 » 

Стася, вспомни что я говорил по поводу инкремента. Вспомни что ты уже имеешь массив и 5-ти, вспомни что тебе нужно только переменщаться по этим элементам и либо изменять значения, либо получать из массива значения, а как перемещаться по массиву. То что написад SEA выглядит не угрожающе, а если у тебя в массиве 1000 элементов ты же не будешь их все описывать в отдельной строчке. Тебе нужно в массиве завести счетчик элементов.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #30 : 24-12-2008 20:36 » 

Стася, zubr тебе написал коментарий к коду что инкрементируем индекс массива(счетчик), а не сам массив. Как в массиве укзаато что нужно взять какой то из элементов?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Стася
Постоялец

ru
Offline Offline

« Ответ #31 : 24-12-2008 20:59 » 

Он есть. Программирование не для  меня(((((
Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #32 : 24-12-2008 23:29 » 

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

The CBO without stats is like a morning without coffee. (c) T.Kyte.
SEA
Помогающий

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #33 : 24-12-2008 23:32 » 

Гы... Все мы так думали. Не вешай нос.
Все дело в том, что вместо банальной цифры, как у меня в коде: MyArray[1] мы подставляем переменную, например, var digit: integer; Вот так: MyArray[digit] = 9123546; Теперь этот код позволит нам работать с тем элементом массива по счету, какой будет переменная digit;
Записан

почувствуй радость творческих мук!
Стася
Постоялец

ru
Offline Offline

« Ответ #34 : 25-12-2008 22:01 » 

Вы знаете, я сделала проще, и сейчас мучаюсь уже с другой проблемой в этой проге.
Записан
Стася
Постоялец

ru
Offline Offline

« Ответ #35 : 28-12-2008 16:37 » 

Не считает максимумы, вообще. Помогите пожалуйста найти ошибку.
Код:
unit Unit8;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids, TeEngine, Series, ExtCtrls, TeeProcs, Chart,Math;

type
  TForm8 = class(TForm)
    Button1: TButton;
    Chart1: TChart;
    Series1: TLineSeries;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Edit4: TEdit;
    Label6: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form8: TForm8;

implementation

{$R *.dfm}

procedure TForm8.Button1Click(Sender: TObject);
 Var tx:textfile;
    i,j,n,k:integer;
    x:array of real;
    y:array of real;
    //meanval:double;
begin
Assignfile(tx,'tab.txt');
Reset(tx);
i:=0;
j:=0;
while not EOF(tx) do
begin
  Setlength(x,i+1);
  Setlength(y,j+1);
  readln(tx,x[i],y[j]);
  inc(i);
  inc(j);
if (y[j-1]<y[j]) and (y[j]<y[j+1]) then
Edit1.Text:=floattostr(y[j])
else
Showmessage('Нет глобальных максимумов');
if (y[i-1]>y[i]) and (y[i]<y[i+1]) then
Edit2.Text:=floattostr(y[i])
else
Showmessage('Нет глобальных минимумов');
end;
n:=strtoint(edit3.Text);
For i:=0 to n do
Chart1.SeriesList[0].Addxy(x[i],y[i], '', clRed);
end;
//meanval:=Mean(x[i]);
//Closefile(tx);




end.
Записан
zubr
Гость
« Ответ #36 : 28-12-2008 17:19 » 

1. Зачем в цикле чтения файла нужно i и j - достаточно какого то одного счетчика, ведь они всегда будут равны i = j
2. Выражение
Код:
if (y[j-1]<y[j]) and (y[j]<y[j+1]) then
Edit1.Text:=floattostr(y[j])
else
Showmessage('Нет глобальных максимумов');
if (y[i-1]>y[i]) and (y[i]<y[i+1]) then
Edit2.Text:=floattostr(y[i])
else
Showmessage('Нет глобальных минимумов');
полный бред.
Элементов с индексами i, j, i+1, j+1 еще не существует (подумай почему)
3. Очень криво вызывать ShowMessage после проверки каждого элемента массива, а если 1000 элементов массива,так что придется 1000 раз нажимать Ok. Лучше введи какую нить булеву переменную, которая до цикла проверок будет False, а если выполнится хотя бы для одного элемента условие проверки то в True. После цикла проверки если переменная останется в False - вот тогда и выдашь ShowMessage
Записан
Стася
Постоялец

ru
Offline Offline

« Ответ #37 : 28-12-2008 18:31 » 

Почему не существуют? Мы же прочитали их уже. А к чему именно отнести эту булеву переменную?
Записан
zubr
Гость
« Ответ #38 : 28-12-2008 18:40 » 

Стася, возьми в отладке посмотри значения индексов в функции readln и при проверке твоих условий и еще раз подумай.
Записан
Стася
Постоялец

ru
Offline Offline

« Ответ #39 : 28-12-2008 19:32 » 

С этим я разобралась. А что с булевой переменной? Я поняла, что нужно ее здать как False. Но что именно под ней задать не знаю.
Записан
zubr
Гость
« Ответ #40 : 28-12-2008 19:52 » 

1. Объявляешь 2 булевы переменных, к примеру var b_max, b_min: boolean;
2. До цикла чтения файла b_max := False; b_min := False;
3. В цикле до инкрементирования индекса проверяешь условие:
Код:
If (Y[i-1] > Y[i-2]) and (Y[i-1] > Y[i]) then
 b_max := True;
 // аналогично для минимума
Естественно надо проверить на наличие минимального индекса (если индекс < 2 то выражение Y[i-2] будет бессмысленно, более того - опасно)
4. По выходу из цикла чтения файла выполняем условие:
Код:
if not b_max  then
Showmessage('Нет глобальных максимумов');
// аналогично для минимума
Записан
Стася
Постоялец

ru
Offline Offline

« Ответ #41 : 28-12-2008 20:44 » 

Я немного не так сделала, но главное, что работает как надо. Спасибо вам. Еще вопрос: хочу посчитать среднее значение элементов массива с помощью функции Mean. В Uses Math подключила, тип переменной double, но насчет этой переменной он пишет, что Expected Incialization but received an identifer
Записан
zubr
Гость
« Ответ #42 : 28-12-2008 21:11 » 

Стася, ну если ты сама все предыдущее написала, то не должна делать подобных ошибок. У тебя переменная meanval:double; закомментирована при объявлении - и что же ты хочешь, что бы сказал компилятор?
Записан
Стася
Постоялец

ru
Offline Offline

« Ответ #43 : 28-12-2008 21:14 » 

Не понятно.
Записан
zubr
Гость
« Ответ #44 : 28-12-2008 22:07 » 

Стася, покажи где и как ты объявила эту переменную.
Записан
Страниц: 1 2 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines