Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.50/12: Рейтинг темы: голосов - 12, средняя оценка - 4.50
Nikitko_Cent
144 / 114 / 37
Регистрация: 27.10.2011
Сообщений: 690
Завершенные тесты: 3
1

ФИЗИЧЕСКОЕ удаление двух последних элементов статического массива

22.12.2011, 09:49. Просмотров 2229. Ответов 26
Метки нет (Все метки)

Подскажите как удалить два последних элемента массива?? Нужно именно удалить.
Например был массив размером 9 элементов, после удаления двух последних элементов его длина должна стать 7
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2011, 09:49
Ответы с готовыми решениями:

Упорядочивание первых 4 элементов массива по убыванию, последних 4 элементов - по возрастанию
Здравствуйте! Нужно написать программу, создающую одномерный целочисленный массив из 10 элементов,...

Удаление первого и двух последних элементов списка
Привет всем!Только начала изучать пролог,вроде получается,но вот с этими задачами не...

Определить значения и позиции последних двух чётных элементов заданного одномерного массива
Задан одномерный массив D. Определить значения и позиции, последних двух чётных элементов заданного...

Определить значения и позиции, последних двух чётных элементов заданного одномерного массива
Пожалуйста помогите срочно! Нужно сделать задание срочно! Задан одномерный массив D. Определить...

Определить, равна ли сумма двух первых элементов заданного списка сумме двух его последних элементов
Собственно, сабж: надо на lisp/scheme, и, желательно, как оформить это отдельно в виде макроса. Я...

26
Puporev
Модератор
57127 / 43609 / 30141
Регистрация: 18.05.2008
Сообщений: 103,985
22.12.2011, 09:51 2
Delphi
1
n:=n-2;
0
Nikitko_Cent
144 / 114 / 37
Регистрация: 27.10.2011
Сообщений: 690
Завершенные тесты: 3
22.12.2011, 09:53  [ТС] 3
Мм, т.е. ты имеешь ввиду что то типо
SetLength(mass, length(mass)-2)?
0
Puporev
Модератор
57127 / 43609 / 30141
Регистрация: 18.05.2008
Сообщений: 103,985
22.12.2011, 09:55 4
Да, обрежешь массив и все.
0
22.12.2011, 09:55
Nikitko_Cent
144 / 114 / 37
Регистрация: 27.10.2011
Сообщений: 690
Завершенные тесты: 3
22.12.2011, 09:57  [ТС] 5
А скажи ещё, если я вот так обрежу то нумерация не изменится??
Т.е. был у меня например массив mass[1..9]
а после обрезания он не станет нумероваться [0..6]?

т.е. с нуля не будет нумероваться?
0
Puporev
Модератор
57127 / 43609 / 30141
Регистрация: 18.05.2008
Сообщений: 103,985
22.12.2011, 10:03 6
Цитата Сообщение от Nikitko_Cent Посмотреть сообщение
был у меня например массив mass[1..9]
Я так понял что массив динамический array of integer, тогда он не имеет размерности, а если в него было введено 9 элементов, то после обрезания останется 7, индексы в любом случае начинаются с 0.
0
anonimus
2157 / 1247 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
22.12.2011, 10:19 7
в сабже сказано
Цитата Сообщение от Nikitko_Cent Посмотреть сообщение
удаление двух последних элементов статического массива
а если массив статический значит SetLength не катит. И что вообще значит "ФИЗИЧЕСКОЕ удаление"
0
Nikitko_Cent
144 / 114 / 37
Регистрация: 27.10.2011
Сообщений: 690
Завершенные тесты: 3
22.12.2011, 10:21  [ТС] 8
Ну просто обычно удаляют элемент способом замещения т.е. смещают все элементы следующие после удаляемого элемента влево. А мне нужно чтобы именно элементы не заменились а просто стёрлись.
0
anonimus
2157 / 1247 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
22.12.2011, 10:30 9
замени статический массив на динамический и уменьшай с помощью SetLength
0
Nikitko_Cent
144 / 114 / 37
Регистрация: 27.10.2011
Сообщений: 690
Завершенные тесты: 3
22.12.2011, 10:41  [ТС] 10
А как сделать, когда я уже определил длину динамического массива, чтобы нумерация массива была с 1?
mass[1..x]?
0
anonimus
2157 / 1247 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
22.12.2011, 10:45 11
в динамическом массиве нумерация всегда с 0.
Да и какая разница с какого индекса идет нумерация, это ни на что не влияет
0
Nikitko_Cent
144 / 114 / 37
Регистрация: 27.10.2011
Сообщений: 690
Завершенные тесты: 3
22.12.2011, 11:01  [ТС] 12
У меня из за того что массив с нуля нумеруется - крашится прога. Мб подскажете в чем дело?

Крошится в этой процедуре
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm1.PodschetClick(Sender: TObject);
begin
 j:=0;
   //ЦИКЛ НА ПОИСК ЗНАКОВ
  while j<>length(virazhenie) do //только умножение и деление
   begin
    if virazhenie[j]='/' then
     begin
      virazhenie[j-1]:=Floattostr(strtofloat(virazhenie[j-1])/strtofloat(virazhenie[j+1]));
      virazhenieSize:=length(virazhenie);
 
      for i:=j to virazheniesize-2 do
       virazhenie[i]:=virazhenie[i+2];
 
      setlength(virazhenie, length(virazhenie)-2);
     end;
      inc(j);
 
  end;
end;
Выяснил, что ошибка происходит из за этого участка:

Delphi
1
2
for i:=j to virazheniesize-2 do
       virazhenie[i]:=virazhenie[i+2];
0
anonimus
2157 / 1247 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
22.12.2011, 11:09 13
лучше объясни сам алгоритм, что тебе надо сделать
Delphi
1
while j<=high(virazhenie)
0
Nikitko_Cent
144 / 114 / 37
Регистрация: 27.10.2011
Сообщений: 690
Завершенные тесты: 3
22.12.2011, 11:13  [ТС] 14
Наверно вы уже догадались что я пишу строковый калькулятор. В общем у меня пример на решение состоит строго из пяти чисел, основных знаков действий. Я так сделал, что в строковом массиве у меня записан весь пример(парсить не нужно) в отдельной ячейке-число либо знак операции. Я только начал писать решение примеров. Решил сначала с деления начать.

Ну и вот, как по коду видно если находим деление то делим предыдущую ячейку на следующую и записываем в предыдущую результат. Далее чтобы убрать уже ненужный знак деления и делитель из массива, я заменяю каждый элемент на через два следующий.
0
anonimus
2157 / 1247 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
22.12.2011, 11:20 15
Цитата Сообщение от Nikitko_Cent Посмотреть сообщение
я заменяю каждый элемент на через два следующий.
я так понимаю ты те знаки что использовал хочешь удалить из массива? Если так то поменяй из местами с последними 2-мя и уменьшай размер массива.

Напиши пример строки из которой производится расчет.
0
Nikitko_Cent
144 / 114 / 37
Регистрация: 27.10.2011
Сообщений: 690
Завершенные тесты: 3
22.12.2011, 11:24  [ТС] 16
Цитата Сообщение от anonimus Посмотреть сообщение
поменяй из местами с последними 2-мя

Напиши пример строки из которой производится расчет.
А почему с двумя последними? Не могу понять

Добавлено через 2 минуты
ну сама строка при нажатии на другую кнопку генерируется рандомно, при этом все генерированные значения выводятся в строковый массив, а массив затем выводится в TEDIT

ну например будет выражение : 495*118/693-194*286
0
anonimus
2157 / 1247 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
22.12.2011, 11:32 17
Цитата Сообщение от Nikitko_Cent Посмотреть сообщение
ну например будет выражение : 495*118/693-194*286
ты делишь 118/693 на место 118 записываешь результат, а / и 693 нужно удалить?
0
Nikitko_Cent
144 / 114 / 37
Регистрация: 27.10.2011
Сообщений: 690
Завершенные тесты: 3
22.12.2011, 11:35  [ТС] 18
Абсолютно верно, мисье =)
0
anonimus
2157 / 1247 / 143
Регистрация: 28.04.2010
Сообщений: 4,592
22.12.2011, 12:32 19
вот что у меня вышло
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
procedure TForm1.Button1Click(Sender: TObject);
var mas:array of string;  i:byte; str,strTmp:string;
    go:boolean;
begin
go:=false;
str:='495*118/693-194*286';
{заполняю массив, у тебя возможно это происходит по другому, но не суть}
for i:=1 to length(str)do begin
  if str[i] in ['*','/','-','+'] then begin
    if strTmp<>'' then begin
      SetLength(mas,length(mas)+1);
      mas[high(mas)]:=strTmp;
      strTmp:='';
    end;
    SetLength(mas,length(mas)+1);
    mas[high(mas)]:=str[i];
  end else
    strTmp:=strTmp+str[i];
end;//for
if strTmp<>'' then begin
 SetLength(mas,length(mas)+1);
 mas[high(mas)]:=strTmp;
 strTmp:='';
end;
 
{выводим первоночальный массив в label}
label1.Caption:='';
for i:=0 to high(mas)do
  label1.Caption:=label1.Caption+mas[i];
 
{работа с массивом}
for i:=0 to high(mas)do begin
  if mas[i]='/' then begin
    mas[i-1]:=floattostr(strtoint(mas[i-1])/strtoint(mas[i+1]));
    go:=true;
  end;
 
  if go then begin
    if i<high(mas)-2 then
      mas[i]:=mas[i+2]
    else begin
      mas[i]:=mas[i+2];
      go:=false;
    end;
      mas[i+2]:='0';
  end;
end;
SetLength(mas,length(mas)-2);
 
{выводим то что получилось}
label2.Caption:='';
for i:=0 to high(mas)do
  label2.Caption:=label2.Caption+mas[i];
end;
0
Nikitko_Cent
144 / 114 / 37
Регистрация: 27.10.2011
Сообщений: 690
Завершенные тесты: 3
22.12.2011, 14:30  [ТС] 20
Нехрчу тебя огорчать, но твой код неверный. Он корректно делит если операций деления в задаваемой строке только одна. Щас записал две операции, вторую не производит
0
22.12.2011, 14:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.12.2011, 14:30

Удаление элемента из статического массива
Дан двоичный файл с целыми числами. Удалить из него число, записанное после первого нуля...

Удаление двух последних свойств символа
Определить функцию, которая удаляет два последний свойства символа. Попробывал сделать так:...

Удаление элемента из середины массива(статического)
Хотелось бы узнать как удалить элемент из середины массива(не динамического, не вектора). Не могли...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru