Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
12 / 11 / 3
Регистрация: 12.10.2010
Сообщений: 268
1

Сложный массив !!

12.10.2010, 22:28. Показов 1896. Ответов 27
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
народ скажите , у меня есть файл , в котором храниться двумерный динамический массив . Массив может иметь любое количество столбцов , строк , причем в строке может быть любое количество элементов , как положительных так и отрицательных . задача в том , что нужно найти первой отрицательное и последнее положительное числа в массиве . вот мой пример кода :
Pascal
1
2
3
4
5
6
7
8
9
 var fp,fm,i:integer;f:textfile;
begin
 assign(f,'file1.txt');reset(f);
  read(f,i);
  p:=-1;
 while not eof(f) do begin
  read(f,i);
  if (i>0)and(p=-1) then p:=i;
  if (i<0) then m:=i;
но этот код не работает . можете написать мои ошибки .
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.10.2010, 22:28
Ответы с готовыми решениями:

Сложный алгоритм
Дана матрица NxN состоящая только из 0 и 1. Связыванными считаются числа из 1 если какой то...

Сложный процент
Написать программу расчета платы по кредиту. В зависимости от срока погашения, меняется процентная...

Сложный запрос по выражению
Мне нужно сделать сложный запрос по выражению where, SQL-bilder у меня не работает, поэтому нужно...

Сложный элемент управления
Добрый день! Подскажите, форумчане, есть ли в Делфи такой элемент (рис ниже). При нажатии на...

27
192 / 173 / 37
Регистрация: 19.01.2010
Сообщений: 610
Записей в блоге: 1
12.10.2010, 22:47 2
Цитата Сообщение от tipo4ek Посмотреть сообщение
народ скажите , у меня есть файл , в котором храниться двумерный динамический массив . Массив может иметь любое количество столбцов , строк , причем в строке может быть любое количество элементов , как положительных так и отрицательных . задача в том , что нужно найти первой отрицательное и последнее положительное числа в массиве . вот мой пример кода :
var fp,fm,i:integer;f:textfile;
begin
assign(f,'file1.txt');reset(f);
read(f,i);
p:=-1;
while not eof(f) do begin
read(f,i);
if (i>0)and(p=-1) then p:=i;
if (i<0) then m:=i;
но этот код не работает . можете написать мои ошибки .

Здесь Delphi, а не паскаль...Хотя алгоритм тебе итак подскажут наверно....
0
12 / 11 / 3
Регистрация: 12.10.2010
Сообщений: 268
12.10.2010, 22:50  [ТС] 3
так я в delphi и имел в виду . но все равно помогите
0
161 / 159 / 39
Регистрация: 10.10.2010
Сообщений: 461
12.10.2010, 22:50 4
tipo4ek, в твоих условиях вот где ошибки
идем пошагово:
p=-1
считываем i
1. i=-1
if (i>0) and (p=-1) then не проходит по выборке т.к. i<0
2. i=3
if (i>0) and (p=-1) then проходит по выборке,а значит p:=3
3. i=4
if (i>0) and (p=-1) then не проходит по выборке так как p уже не равно -1

а значит для положительных значений нужно условие
Delphi
1
if i>0 then p:=i;
а вот для второй выборке как раз нужен твой дополнительный параметр
не буду долго показывать а всего лишь напишу
Delphi
1
2
3
4
5
m:=1;
....
while not....
.....
if (i<0) and (m=1) then m:=i
таким образом мы находим в первом условии методом перебора всех положительных чисел в массиве и останавливаемся на нужном нам последнем положительном
и также когда определили первое отрицательное число и заменив m с 1 на наше и определив не возможность выполнение условие m=1 мы находим первое отрицательное число

П.С. правда не могу уточнить как там правильно считать данные с файла давно не работал с ними а вспоминать в лом )
0
12 / 11 / 3
Регистрация: 12.10.2010
Сообщений: 268
12.10.2010, 22:57  [ТС] 5
вот как раз в этом и проблема . дело в том что мой массив не квадратный , и этот массив динамический.
читать его из файла для меня проблема . вот пример матрицы :
1 -2 3 5
9 43
2 40 -4 8 90
32 5 61
этот пример можно видоизменять как угодно , то есть делать свой массив как угодно , и в этом и состоит проблема . мне этот массив нужно читать построчно в memo , выделять память под каждую строку . а другого способа занести такой массив из файла в memo , я не знаю (
0
192 / 173 / 37
Регистрация: 19.01.2010
Сообщений: 610
Записей в блоге: 1
12.10.2010, 23:09 6
Цитата Сообщение от tipo4ek Посмотреть сообщение
вот как раз в этом и проблема . дело в том что мой массив не квадратный , и этот массив динамический.
читать его из файла для меня проблема . вот пример матрицы :
1 -2 3 5
9 43
2 40 -4 8 90
32 5 61
этот пример можно видоизменять как угодно , то есть делать свой массив как угодно , и в этом и состоит проблема . мне этот массив нужно читать построчно в memo , выделять память под каждую строку . а другого способа занести такой массив из файла в memo , я не знаю (
Ты что-то путаешь...
Как так? Как массив может быть таким?...
Он должен быть обязательно квадратным либо прямоугольным...

Либо у тебя там где нету чисел это просто пустые ячейчки?...Как бы они есть, но там ничего нету...
0
12 / 11 / 3
Регистрация: 12.10.2010
Сообщений: 268
12.10.2010, 23:11  [ТС] 7
вот как раз в этом и прикол , что массив выглядит именно так !!
вот я и говорю , что нужно выделять память под каждую строку или что то еще чего я не знаю .
это мое задание , сам бы я такой фигней не страдал .
0
161 / 159 / 39
Регистрация: 10.10.2010
Сообщений: 461
12.10.2010, 23:18 8
Держи код
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure TForm3.btn2Click(Sender: TObject);
var
p,m,i: Integer;
f: TextFile;
begin
mmo1.Lines.Clear;
assignFile (f,'c:\file1.txt');
reset(f);
m:=1;
while not eof(f) do
  begin
  while not Eoln(f) do
    begin
      read(f,i);
      if (i>0) then p:=i;
      if (i<0) and (m=1) then m:=i;
      mmo1.Text:=mmo1.Text+' '+IntToStr(i);
    end;
  Readln(f);
  mmo1.Lines.Add('');
  end;
CloseFile(f);
mmo1.Lines.Add('первое отрицательное ='+inttostr(m));
mmo1.Lines.Add('последнее положительное ='+inttostr(p));
end;
0
12 / 11 / 3
Регистрация: 12.10.2010
Сообщений: 268
12.10.2010, 23:24  [ТС] 9
а можешь пожалуйста объяснить :
1)
while not eof(f) do // ты читаешь файл до конца файла
begin
while not Eoln(f) do // а здесь ты читаешь файл до конца строки , то есть построчно .
а можешь объяснить , разве так можно делать и зачем .
2)
а можешь объяснить , а почему ты читаешь файл (Readln(f)) , уже после выполнения алгоритма , просто ведь вроде это строка должна идти после
while not Eoln(f) do
<readln(f)>
begin
0
161 / 159 / 39
Регистрация: 10.10.2010
Сообщений: 461
12.10.2010, 23:36 10
1) Да так можно и нужно делать, когда нужно прочитать каждое значение и при єтом каждое значение отобразить в Memo
2) в цикле while not Eoln(f) do я считываю пока не закончиться строка, и что бы переместить каретку на новую строчку за циклом нужно прочитать пустую строчку Readln(f)
Read (f,i) читает каждое значение отдельно 1, -2, 3, 5
readln (f,s) читает уже строку причем в типе string и будет 1 -2 3 5
а также ставить readln в цикле while not eoln(f) не имеет смысла т.к. readln и так читает всю строку

и еще просто создай проект и вставь эту процедуру и ты увидишь как оно работает (mmo1 - это у меня Memo
0
12 / 11 / 3
Регистрация: 12.10.2010
Сообщений: 268
12.10.2010, 23:40  [ТС] 11
слушай извини конечно , но задам вопрос не по теме .
у меня есть числовая последовательность и нужно посчитать ее рекурсией .
вот мой код :
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
procedure TForm1.Button1Click(Sender: TObject);
var
s:real;
x,n,k,fact:integer;
begin
x:=strtoint(edit1.Text);
n:=strtoint(edit2.Text);
  s:=0;
  fact:=1;
for k:=1 to n do begin
 fact:=fact*(2*k+1)*2*k;
s:=s+(8*k*k*sqrt(x)*exp(k*ln(x)))/fact;
edit3.Text:=floattostr(s);
это код выполненный циклом , но просто я только не давно программирую и поэтому не понимаю как сделать этот цикл рекурсией .
0
161 / 159 / 39
Регистрация: 10.10.2010
Сообщений: 461
13.10.2010, 00:50 12
tipo4ek, ты привел не полный код своей процедуры, а также я не вижу формулу твоей числовой последовательности математически. По этому объясню на пальцах что такое рекурсия:

Определение факториала не рекурсивным способом:
Delphi
1
2
3
4
5
6
7
8
9
10
11
function factor (n:integer) :integer;
var i: integer;
begin
  i:=1;
  while n>1 do
  begin
    i:=i*n;
    n:=n-1;
  end; 
  factor:=i;
end;
т.е. на этом примере показывается как определить факториал числа с помощью цикла

Рекурсивный метод определение факториала
Delphi
1
2
3
4
5
function factorial (n:integer):integer;
begin
   if n=0 then factorial:=1
   else factoial:=n*factorial(n-1);
end;
т.е. рекурсивный метод программирования когда процедура или функция для своего выполнения вызывает саму себя.
0
12 / 11 / 3
Регистрация: 12.10.2010
Сообщений: 268
14.10.2010, 00:54  [ТС] 13
народ , а подскажите , мне недавно помогли с прогой о массивах , о нахождении первого отрицательного элемента в массиве , но вот в чем проблема , читая из memo массив , прога проходит до конца массива , и находит последнее отрицательное , а не первое , как должно .вот мой переделанный код :
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure TForm3.btn2Click(Sender: TObject);
var
m,i: Integer;
f: TextFile;
flag:boolean;
begin
flag:=false;
mmo1.Lines.Clear;
assignFile (f,'c:\file1.txt');
reset(f);
while not eof(f) do
  begin
  while not Eoln(f) do
    begin
      read(f,i);
      if (i<0)  then begin
       m:=i;
      flag:=true; 
      mmo1.Text:=mmo1.Text+' '+IntToStr(i);
    end;
  Readln(f);
  mmo1.Lines.Add('');
  end;
CloseFile(f);
mmo1.Lines.Add('первое отрицательное ='+inttostr(m));
пытался впихнуть флаг , но не получилось . подскажите , что не так
0
12 / 11 / 3
Регистрация: 12.10.2010
Сообщений: 268
14.10.2010, 22:00  [ТС] 14
Добавлено через 10 секунд
народ , подскажите пожалуйста , а то просто я чета не в чихляю .

Добавлено через 40 минут
там че та с флагами не то . откорректиравоть пробовал , но безрезультатно .
0
161 / 159 / 39
Регистрация: 10.10.2010
Сообщений: 461
14.10.2010, 22:24 15
а что твой flag делает? Где именно ты его используешь

А вообще то я проверял тот код что скидывал раньше то он находит у меня именно 1ое отрицательное число
0
12 / 11 / 3
Регистрация: 12.10.2010
Сообщений: 268
14.10.2010, 22:27  [ТС] 16
не . у меня он находит последнее отрицательное .
просто , у меня ведь массив может быть и другой . и почему то это условие под другой массив не подходит .
0
161 / 159 / 39
Регистрация: 10.10.2010
Сообщений: 461
14.10.2010, 22:49 17
tipo4ek,
наведи примера где мой код находит не первое а последнее значение

и ты так не ответил зачем в твоем коде flag, если ты его так и не используешь а всего лишь назначаешь ему истину или ложь?
0
12 / 11 / 3
Регистрация: 12.10.2010
Сообщений: 268
14.10.2010, 22:58  [ТС] 18
попробуй ввести любую матрицу , которую я привел для примера . последнее положительное он ищет правильно , а вот первое отрицательное - нет . он проходит до конца массива и выдает последнее отрицательное , вместо первого . я просто попробовал ввести другую матрицу и твой пример заработал наполовину . а насчет флагов , я пытался сделать ограничение на поиск последнего , но не получилось .

Добавлено через 4 минуты
все народ , я лол .
все ищет правильно , забыл ввести m:=1;
а кстати , а почему именно m должно равняться 1 ??
0
161 / 159 / 39
Регистрация: 10.10.2010
Сообщений: 461
14.10.2010, 23:07 19
tipo4ek, для проверки, его може сделать любым положительным числом, только не забудь и в проверке это же сделать

условие
Delphi
1
if (i<0) and (m=1) then m:=i;
будет выполняться если число i<0 и m=1 (ну это я так хочу ты может захочешь и 1999 не имеет значение) тогда оно m присвоит i
А значит в в следующий раз условие выполняться не будет потому как m уже не равно нашему числу

Добавлено через 2 минуты
И на будущее если ты используешь переменную типа boolean то наверняка ты хотел ее проверять типа if...then, while...do и т.д.
А не просто назначать ее false or true, так она ничего не делает
0
12 / 11 / 3
Регистрация: 12.10.2010
Сообщений: 268
15.10.2010, 12:52  [ТС] 20
ага , спасибо большое .

Добавлено через 13 часов 42 минуты
а вот скажи , что бы найти количество элементов в массиве от p и до m :
for i:=p to m do
i:=i+1
да ?

Mawrat: количество, в данном случае, определяется одним действием: i: = m - p + 1;
0
15.10.2010, 12:52
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2010, 12:52
Помогаю со студенческими работами здесь

Не сложный вопрос по Delphi
Сама программа сделана и функционирует. Но есть один нюанс, надо ограничить количество нажатий...

Сложный,одномерный массив
Ввести одномерный целочисленный массив A, вывести его. Найти все повторяющиеся элементы в нём,...

Добавить элемент в сложный массив
$this-&gt;data = array(); if (isset($this-&gt;request-&gt;post)) { $this-&gt;data =...

Как реализовать сложный двумерный массив
Хочу создать двумерный массив. 10х5 (10 строк и 5 столбцов). Суть заключается в том, что генератор...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru