Форум программистов, компьютерный форум, киберфорум
Наши страницы
Lazarus
Войти
Регистрация
Восстановить пароль
 
SexyHpexy
0 / 0 / 1
Регистрация: 03.12.2016
Сообщений: 53
Завершенные тесты: 1
#1

Setlength - Lazarus

01.05.2017, 14:59. Просмотров 412. Ответов 17
Метки нет (Все метки)

Помогите пожалуйста сделать программу с setlength

Pascal
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
uses crt;
type
// a=array[1..500] of integer;
 //b=array[1..500] of word;
 MyArray=array of array of integer;
var amount, n: integer;
   mas: MyArray;
   t,t2:text;
   s:char;
   name,str:string;
 
{--------------------------------------------------------}
 
procedure input (var _t,_t2: text; var _name: string; var _mas: MyArray; var _n:integer);
var name2 :string;
begin
WriteLn('Enter the file name: ');
ReadLn(_name);
assign (_t, _name);
 {$I-}
reset (_t);
   {$I+}
if IOResult <>0 then
begin
 WriteLn('File not found');
 halt;
 end
 else begin
   WriteLn('Found file');
   writeln ('Enter the file name rezultat: ');
   readln(name2);
   assign (_t2,name2);
   {$I-}
   rewrite (_t2);
   {$I+}
 if IOResult<>0 then
 begin
  writeln ('file not found');
  readkey;
  halt;
  end
  else begin
   writeln ('found file');
  end;
end;
end;
{--------------------------------------------------------}
 
procedure obraz (var _t: text; var _amount, _n:integer; var _mas: MyArray; var _str:string);
var
   i:integer;
   k,err:integer;
 
begin
_amount:=0;
 
while not EOF(_t) do
  begin
     read(_t,_str);
 
 for i:=0 to length(_str) do
     begin
       if _str[i] in ['0'..'9'] then
       begin
        inc(_n);
        _mas[_n]:=ord(_str[i]);
       end;
 
     end;
 readln(_t);
 end;
close (_t);
for i:=1 to _n do
begin
 
val(chr(_mas[i]),k,err);
_amount:= _amount+ k ;
end;
end;
 
{--------------------------------------------------------}
 
procedure output (var _t2: text; var _amount, _n: integer);
begin
writeln (_t2,'amount= ',_amount);
writeln (_t2, 'quantity= ',_n);
close (_t2);
Writeln ('The result is calculated');
end;
 
begin
clrscr;
input(t,t2,name,mas,n);
obraz(t,amount,n, mas,str);
output( t2,amount,n);
end.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.05.2017, 14:59
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Setlength (Lazarus):

Length и SetLength
Если задать SetLength(a,2); то length(a) будет возвращать 2? Добавлено...

Работа с SETLENGTH с параметром-открытым массивом
Помогите пожалуйста переписать программу с SETLENGTH с параметром-открытым...

SetLength работает с динамическим массивом переданым через параметры функции?
есть функция myfunk(var N:Array of integer):boolean; begin SetLength(N,10);...

SetLength & EOutOfMemory
Столкнулся с такой проблемой, при заполнении динамического массива данными из...

Как работает SetLength()
Вопрос такой: если у меня есть динамический массив dimass на n элементов я...

Incompatible types в функции SetLength
Добрый вечер. У меня в программе есть собственная функция, где применяется...

17
Hretgir
439 / 79 / 2
Регистрация: 25.01.2012
Сообщений: 3,091
Записей в блоге: 23
01.05.2017, 16:00 #2
Ты делай и пиши что не работает. Тогда быстрее помогут.
0
SexyHpexy
0 / 0 / 1
Регистрация: 03.12.2016
Сообщений: 53
Завершенные тесты: 1
01.05.2017, 16:12  [ТС] #3
Hretgir, Я уже несколько дней сижу над этим. И практически всегда ошибка в 66 строке, при чем уже после [i]) и перед ; . И я не могу понять, что не так
0
Hretgir
439 / 79 / 2
Регистрация: 25.01.2012
Сообщений: 3,091
Записей в блоге: 23
01.05.2017, 16:19 #4
Так у тебя массив двухмерный, а записываешь в него как в одномерный. Или я не прав? В строке 66 ты делаешь запись в него как в одномерный массив, а он вроде как двумерный должен быть у тебя.
0
SexyHpexy
0 / 0 / 1
Регистрация: 03.12.2016
Сообщений: 53
Завершенные тесты: 1
01.05.2017, 16:38  [ТС] #5
Hretgir, У меня одномерный массив. В 63 строке я проверяю элементы строки от 1 до конца строки число ли, потом есть новая переменная n - кол-во символов, от 0 до конечного значения. И дальше я в тот же массив перезаписываю элемент, но уже его код, а не его самого. Массив один, перезапись элемента просто
0
Hretgir
439 / 79 / 2
Регистрация: 25.01.2012
Сообщений: 3,091
Записей в блоге: 23
01.05.2017, 16:42 #6
Это Delphi?
Не важно, у тебя тип
Pascal
1
MyArray=array of array of integer;
определён ведь как двумерный массив?
разве одномерный не так определяется
Pascal
1
MyArray=array of integer;
0
SexyHpexy
0 / 0 / 1
Регистрация: 03.12.2016
Сообщений: 53
Завершенные тесты: 1
01.05.2017, 16:45  [ТС] #7
Hretgir, Понял, исправил. Но
0
Миниатюры
Setlength  
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
25622 / 17175 / 6830
Регистрация: 22.10.2011
Сообщений: 30,369
Записей в блоге: 6
01.05.2017, 17:32 #8
Pascal
1
for i:=0 to length(_str) - 1 do
0
SexyHpexy
0 / 0 / 1
Регистрация: 03.12.2016
Сообщений: 53
Завершенные тесты: 1
01.05.2017, 20:46  [ТС] #9
volvo, Все равно та же ошибка, в 66 строке
0
Hretgir
439 / 79 / 2
Регистрация: 25.01.2012
Сообщений: 3,091
Записей в блоге: 23
01.05.2017, 23:46 #10
так ты в массив целочисленных данных строковую переменную пихаешь, да ещё и под видом массива. и чего-бы её не было, это ошибки? хотя это не pascal похоже, я не знаю.
0
edukra
492 / 469 / 172
Регистрация: 24.01.2012
Сообщений: 1,139
02.05.2017, 09:38 #11
1. Не назначен размер массива (в коде нигде нет setlength)
2. Переменная _n не обнуляется перед циклом.
0
SexyHpexy
0 / 0 / 1
Регистрация: 03.12.2016
Сообщений: 53
Завершенные тесты: 1
02.05.2017, 16:10  [ТС] #12
edukra, Я понимаю, что нет нигде setlength, просто именно в этом коде я вообще не пойму куда именно его вставить. _n обнулил. А дальше я так и не врубаюсь в ошибку в 66 строке, точнее ошибку понял, а как исправить нет
0
edukra
492 / 469 / 172
Регистрация: 24.01.2012
Сообщений: 1,139
02.05.2017, 16:46 #13
Так, как заранее неизвестно, какой размер массива, то можно поступить так: перед записью значения в массив - увеличить его на 1 т.е. setlength(_mas,length(_mas)+1); и еще. индекс в динамическом массиве начинается с нуля, поэтому inc(_n); нужно выполнять после записи в массив.
0
KatrinLuxury
12 / 12 / 9
Регистрация: 14.11.2016
Сообщений: 236
02.05.2017, 22:49 #14
edukra, Я тоже попыталась изменить процедуру как вы сказали
Pascal
1
procedure obraz (var _t: text; var _amount, _n:integer; var _mas: MyArray; var _str:string);
Все равно пишет ошибку в строке
Pascal
1
_mas[_n]:=ord(_str[i]);
Вы не могли бы изменить эту процедуру правильно
0
edukra
492 / 469 / 172
Регистрация: 24.01.2012
Сообщений: 1,139
03.05.2017, 09:07 #15
Это с минимальной правкой
Pascal
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
procedure obraz (var _t: text; var _amount, _n:integer; var _mas: MyArray; var _str:string);
var
   i:integer;
   k,err:integer;
 
begin
_amount:=0;
_n:=0;  // то, о чем я писал
while not EOF(_t) do
  begin
     read(_t,_str);
 
 for i:=1 to length(_str) do
     begin
       if _str[i] in ['0'..'9'] then
       begin
        setlength(_mas,n+1);
        _mas[_n]:=ord(_str[i]);
        inc(_n);
       end;
 
     end;
 readln(_t);
 end;
close (_t);
for i:=0 to _n-1 do //здесь от 0 до _n-1
begin
 
val(chr(_mas[i]),k,err);
_amount:= _amount+ k ;
end;
end;
а вообще, если в задании не было указано использовать массив, то эту процедуру можно сократить
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure obraz (var _t: text; var _amount, _n:integer);
var
   i:integer;
   k,err:integer;
   s:string;
begin
  _amount:=0;
  _n:=0;
  while not EOF(_t) do
     begin
     readln(_t,s);
     for i:=1 to length(s) do
     begin
       if s[i] in ['0'..'9'] then
       begin
         _amount:=_amount+ord(s[i])-48;
         inc(_n);
       end;
     end;
   end;
  close (_t);
end;
0
KatrinLuxury
12 / 12 / 9
Регистрация: 14.11.2016
Сообщений: 236
03.05.2017, 09:13 #16
edukra, Спасибо. Но если честно я все никак не могу понять, почему в 18 строке(вашего кода с массивом) он ошибку выдаёт. И в 13 разве не от 0 надо?
Pascal
1
for i:=0 to length(_str)-1
0
edukra
492 / 469 / 172
Регистрация: 24.01.2012
Сообщений: 1,139
03.05.2017, 10:28 #17
в моем коде не было от 0 до длины строки -1. У меня там от 1 до длины строки. В лазарус string понятие неоднозначное. Если string=shortstring то как-раз нужно от 1 до длины строки. А если string=widestring то от 0 до длины строки -1.

Добавлено через 3 минуты
Цитата Сообщение от KatrinLuxury Посмотреть сообщение
18 строке(вашего кода с массивом) он ошибку выдаёт.
У меня этот код работает.
0
KatrinLuxury
12 / 12 / 9
Регистрация: 14.11.2016
Сообщений: 236
03.05.2017, 17:27 #18
edukra, А не подскажете ещё как в getmem freemem переделать. У меня получается, что программа выделяет память, а потом с цикла for сразу в конец уходит
0
03.05.2017, 17:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2017, 17:27
Привет! Вот еще темы с решениями:

Setlength
Здравствуйте, Друзья! Помогите решить данную проблему, когда допустим...

Аналог SetLength
Подскажите пожалуйста, есть ли в Шарпе аналог SetLength Delphi? (Задача на...

Функция SetLength
Эта функция (SetLength) работает? Как ей пользоваться? У меня ошибку выдаёт. В...

Acess Violation из-за SetLength
Здравствуйте, хочу сделать что-то наподобии калькулятора, и столкнулся с одной...


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

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

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