![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Массивы [D7, XP]
Silica © (2006-02-02 16:51:00)Дан такой код:
var i: integer;
a: array[1..11] of integer;
b,c,d,e: array[1..11] of byte;
str: string;
begin
for i:=0 to Memo1.Lines.Count-1 do
begin
a[i]:= strtoint(memo1.Lines[i]);
str:= memo1.Lines;
b[i+1]:= strtoint(str[i+1]);
str:= memo1.Lines;
c[i+1]:= strtoint(str[i+1]);
str:= memo1.Lines;
d[i+1]:= strtoint(str[i+1]);
str:= memo1.Lines;
e[i+1]:= strtoint(memo1.Lines[i+1]);
end;
end;
На форме расположено поле МЕМО. В свойстве LINES введены четырехзначные числа. Каждое число с новой строки. Нужно организовать массив в MEMO, и каждое число разбить на отдельные цифры, например, 4673 разбить на 4, 6, 7, 3. Представленный выше код выдает ошибку. Не знаю в чем проблема. Помогите, пожалуйста.
Плохиш (2006-02-12 17:14:00) [1]
> Данным ниже кодом я пытаюсь это сделать
> f[j] := e[i+1]*3;
> str := memo3.Lines[j];
> g[j] := d[i+1]*6;
> str := memo3.Lines[j];
> h[j] := c[i+1]*9;
> str := memo3.Lines[j];
> k[j] := b[i+1]*12;
> str := memo3.Lines[j];
Строки, в которых производиться умножения понятны, но для чего после каждой из них производится присвоение неиспользуемой далее переменной str совершенно не понятно.
vovnuke (2006-02-12 17:05:00) [2]Memo.Invalidate.
vovnuke (2006-02-12 16:53:00) [3]Memo.Lines.Add(IntToStr(f[j]))
Silica (2006-02-12 16:50:00) [4]Смотрите с 16 сообщения, выше не нужно. Там у меня уже все получилось.
vovnuke (2006-02-12 16:31:00) [5]
> e[i+1]:= strtoint(memo1.Lines[i+1]);
> b,c,d, e: array[1..11] of byte;
Silica (2006-02-12 16:20:00) [6]В мемо строк больше, чем j. Но при чем тут j. Все равно никак не получается мне вывести результат в мемо.
Чтоб было понятней:
for j := 0 to Memo3.Lines.Count-1 do
begin
...
j из цикла.
SergP (2006-02-12 12:04:00) [7]
> Я пробовала через
> Memo3.Lines[j] := inttostr(f[j]);
> но ничего не получается.
Если в мемо кол-во строк не больше чем j - то не будет работать.
Silica (2006-02-12 11:48:00) [8]сначала каждая цифра числа умножается на определённый весовой коэффициент, например, 2,3,4,5,... Число 47325, следовательно, преобразуется в число
4*6 = 24
7*5 = 35
3*4 = 12
2*3 = 6
5*2 = 10
Результаты суммируются:
24+35+12+6+10=87
после того как я разделила каждое четырехзначное число на отдельные числа, мне нужно выполнить то, что написано выше.
Данным ниже кодом я пытаюсь это сделать
f[j] := e[i+1]*3;
str := memo3.Lines[j];
g[j] := d[i+1]*6;
str := memo3.Lines[j];
h[j] := c[i+1]*9;
str := memo3.Lines[j];
k[j] := b[i+1]*12;
str := memo3.Lines[j];
// сумма
x[i] := f[i] + g[i] + h[i] + k[i];
В первую очередь мне нужно вывести каждый массив(f, g...) в отдельное МЕМО. чисто для себя, чтобы проверить, правильно ли он считает.
Сумму вывести можно куда угодно.
Я пробовала через
Memo3.Lines[j] := inttostr(f[j]);
но ничего не получается.
Что я делаю не так?
Silica (2006-02-03 17:35:00) [9]Спасибо всем, буду дальше доделывать. Надеюсь получиться. Дальше самое сложное начинается.
Almaz (2006-02-03 01:03:00) [10]
> Не знаю в чем проблема.
Проблем тут много.
В первом приближении код можно периписать так:
var i: integer;
a: array[1..11] of integer;
b,c,d,e: array[1..11] of byte;
begin
for i:=0 to Memo1.Lines.Count-1 do
begin
a[i +1]:= strtoint(memo1.Lines[i]);
b[i+1]:= strtoint(memo1.Lines[i] [1]);
c[i+1]:= strtoint(memo1.Lines[i] [2]);
d[i+1]:= strtoint(memo1.Lines[i] [3]);
e[i+1]:= strtoint(memo1.Lines[i] [4]);
end;
end;
Но останутся следующие недостатки кода - во первых, если число строк в Memo строго не равно 10, то если оно меньше, то массивы с индексом, большим числа строк будут заполнены мусором, а если больше, то получите ошибку Access Violation. Во-вторых, такой код вызовет исключение, если хотя бы в одной строке будет меньше 4-х цифр.
Удачи.
SergP (2006-02-02 23:57:00) [11]
> arrout[i,j]:=strtointdef(copy(memo1.lines.Strings[i -1],j,1),-1);
вернее
SergP (2006-02-02 23:56:00) [12]
> for i:=1 to Memo1.Lines.Count do
вернее:
for i:=0 to Memo1.Lines.Count-1 do
SergP (2006-02-02 23:54:00) [13]
> b[i+1]:= strtoint(str[i+1]);
так не пройдет
Делай через copy, типа так:
var i,j: integer;
arrout: array[1..11,1..4] of Shortint;
begin
for i:=1 to Memo1.Lines.Count do
for j:=1 to 4 do
arrout[i,j]:=strtointdef(copy(memo1.lines.Strings[i],j,1),-1);
end;
Desdechado (2006-02-02 21:37:00) [14]> т.е. мне вообще не нужна строковая переменная
Если у тебя все числа 4-значные, то можно завести 4 переменных типа Char или String, на каждую из цифр по "части"-переменной.
Если количество знаков в числах произвольное, то заведи массив длиной в максимально допустимое число знаков в твоем числе
Silica (2006-02-02 20:38:00) [15]Алхимик, в Мемо 11 строк по коду.
Desdechado, т.е. мне вообще не нужна строковая переменная.
А часть1, ... это массивы? К примеру,
b[i] := Memo1.Lines[i][1];
...
?
Алхимик (2006-02-02 19:57:00) [16]Пример:
2564
1566
2452
при i:=4, a[4]:= strtoint(memo1.Lines[4]);
в мемо 3 строки, а ты обращаешься к 4-й (нумерация с нуля)
Desdechado (2006-02-02 19:54:00) [17]> четырехзначное число разделить на 4 части (может символа?)
именно символа
часть1 := Memo1.Lines[i][1];
часть2 := Memo1.Lines[i][2];
часть3 := Memo1.Lines[i][3];
часть4 := Memo1.Lines[i][4];
Silica (2006-02-02 19:22:00) [18]var i: integer;
a: array[1..11] of integer;
b,c,d,e: array[1..11] of byte;
str: string;
begin
for i:=1 to Memo1.Lines.Count-1 do
begin
a[i]:= strtoint(memo1.Lines[i]);
str:= memo1.Lines[i];
b[i+1]:= strtoint(str[i+1]);
str:= memo1.Lines[i];
c[i+1]:= strtoint(str[i+1]);
str:= memo1.Lines[i];
d[i+1]:= strtoint(str[i+1]);
str:= memo1.Lines[i];
e[i+1]:= strtoint(memo1.Lines[i+1]);
end;
end;
> А так по коду совершенно не понятно, что нужно автору.
я же написала после кода, что мне нужно.
приложение компилируется, но при нажатии кнопки, выполняющей этот код, выдается сообщение "... EConvertError...". При пошаговой компиляции он выдает ошибку при i:=4 в цикле.
Массив а - это массив в поле Мемо, состоящий из четырехзначных чисел, я перевожу строковый тип в тип integer.
Пример:
2564
1566
2452
...
Затем мне нужно каждое четырехзначное число разделить на 4 части (может символа?), например, 4859 на 4, 8, 5, 9. Чтобы потом каждое это число умножить на какое либо число, нужное мне. Пока у меня не получается поделить.
Плохиш (2006-02-02 17:40:00) [19]
> Гошик Кувшинов (02.02.06 17:37) [4]
> Ну так напиши какая ошибка и на какой строке. А то прямо
> диагноз по фотографии получается.
А чем не диагноз ;-)
Ошибка несоответствия типов на первой же строке str:= memo1.Lines;
А так по коду совершенно не понятно, что нужно автору.
Гошик Кувшинов (2006-02-02 17:37:00) [20]Ну так напиши какая ошибка и на какой строке. А то прямо диагноз по фотографии получается.