Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Object Pascal: кроссплатформенные технологии > Объявление массивов


Автор: Innuendo 18.2.2006, 18:08
Был сёдни на олимпиаде нашей smile ну в Паскале я не особо, а на ЯваСкрипт мне не разрешили писать smile
вот возникли тогда проблемы:
1) при создании массивов- что ему не нравилось:
Код

var
 words: array[1..50] of string;
 bukv : array[1..50, 1..2] of string;

ну мне надобыло 250,а не 50, но он писал что structure is too long.
Но почему при такой структуре, он писал что too many variables... чё эть такое?

и всё, что у меня не получилось, было связано ен с правильностью ашлоритмов, а с тем что вводимые данные были большущие (файл с милионном значений и т.д.). Дайте плз какую-нить статейку про это дело. Как в паскале работать, и переберать такое большое кол-во данных?



Заранее спасибо.

Автор: Rencom 18.2.2006, 19:14
structure is too long - структура слишком длинная... хм... мб памяти не хватило под стринг, надо было попробовать ограничить стринг скажем символами 50 - string[50].

Автор: Innuendo 18.2.2006, 19:16
можно.. а вот, что такое too many variables?

Автор: Guedda 18.2.2006, 19:37
то же самое, что и structure...
Не хватает памяти для размещения переменных... За каким компом сидел?

Автор: Innuendo 18.2.2006, 19:58
да я вообще в шоке.
короче сначала повели в актовый зал... Это типа городская 2-ой тур, поэтому в республиканском колледже информатике.
Их директор пол часа свистел, какие у них компы, какие учителя (всё на молдавском, я мало чё понял) и т.д.
А когда меян послал в кабинет, то я компы менял- мониторы то царапангные, то слюнявые, то паскаль не идёт...
Сел за комп, так когда делал слежку через Watches, он переходил со стрки на строку секунды 2.. это ужас...
Там селероны под пень 3-ий стоит... у нас в школе на дохлых 333 мгц и то watches быстро работает.

у меня не получалось объявить этот массив, я встал и ушел... Ничего кроме Паскаля не разрешили.smile

Автор: Snowy 18.2.2006, 20:24
просто в DOS размер структуры не может превышать 64кб.
А медленно из-за корявой виртуальной машины в XP.
Под XP все DOS программы работают медленно,если не поставить лечилку от ненужной нагрузки.
А так DOS машина есть 100% ресурса процессора. Отсюда и тормоза.

Автор: Innuendo 18.2.2006, 20:35
ок... с этим ясно...
а как вот надо ыло решить задачу, в которой из файла считывается пол милионна чисел?
ну в массив их не загонишь... то есть надо проводить действия прям в файле как-то?
есть инфа какая-то на эту тему? smile

Автор: armageddon 18.2.2006, 22:55
почему в массиве не получится? они же числа так, что должно получится, смотря в каких считывать числа, например для вывода их на экран, как только нашел число, так сразу его и выводи,
а на самом для каких нужд тебе нужно считывать числа?

Автор: Innuendo 18.2.2006, 23:01
ну вот такая задача:
в файле находится последовательность чисел (до пол миллиона). Все числа повторяются чётное кол-во раз, а одно число повторяется нечетное кол-во раз. Вот его и надо вывести. алгоритм простейший (если файл перегнать в массив), а как пол миллиона чисел перегонишь? smile

Автор: volvo877 18.2.2006, 23:31
Innuendo, числа целые? Или вещественные?

Если целые, то тебе вообще не нужен массив - простой XOR (по порядку читаешь числа и XOR-ишь их друг с другом в какой-то переменной, изначально равной 0... )
В результате у тебя после всех этих XOR-ов в переменной останется число, встречающееся нечетное число раз (ибо все четные друг друга "удалят")

Автор: Innuendo 19.2.2006, 00:37
volvo877, да, целые...
можно поподробней? я не совсем понял smile

Автор: volvo877 19.2.2006, 00:47
Код
const a: array[1 .. 11] of integer =
  (1, 1, 2, 2, 5, 3, 4, 4, 5, 1, 1);

var
  buf: integer;
  i: integer;

begin
  buf := 0;
  for i := 1 to 11 do buf := buf xor a[i];
  writeln(buf);
end.

массив - только для удобства... Представь, что ты читаешь числа напрямую из файла... smile

Автор: Innuendo 19.2.2006, 00:56
я, правда, не чень понимаю, что такое xor. Ну это или какое-то...(вот именно что какое-то)

Автор: volvo877 19.2.2006, 01:11
XOR - исключающее ИЛИ (еще называется "сложение по модулю 2"): возвращает 0, если оба аргумента равны, и 1 если аргументы различны... Особенность XOR - если применить ее дважды к одной и той же переменной, то переменная восстановит свое первоначальное значение:
A = (A xor B) xor B
вот тебе пример:
A = 0000 = 0
B = 0101 = 5

делаем A xor B: 0101

еще раз применяем xor B к предыдущему результату:
0101 xor 0101 = 0000...
На жтом и построен тот алгоритм, который я предложил: все ПАРНЫЕ (ну, и встречающиеся четное число раз) числа при XOR-е друг друга превратят в 0, а останется, естественно, только одно непарное - то есть то, что встречается НЕчетное число раз

Автор: Innuendo 19.2.2006, 11:14
ну понял чутос, но всё равно не совсем понял.
Наверное пойму как это работает через watches, только TMT pascal чё-то глючит, не выдает wathces:(

тока вот я попробовал в программе, добавить 2 элемента в массив: 3, и 7.. и получается трйока стала парной, а семёрка уже не парная.. но он всё равно пишет 3. (длину массива я тоже подредактировал)
Код

const a: array[1 .. 13] of integer =
  (1, 1, 2, 2, 5, 3, 1, 4, 4, 5, 1, 3, 7);
var
  buf: integer;
  i: integer;
begin
  buf := 0;
  for i := 1 to 11 do buf := buf xor a[i];
  writeln(buf);
end.

вот так он всё равно пишет тройку как результат

Автор: volvo877 19.2.2006, 11:50
Ну, длину массива-то ты конечно изменил, а счетчик в самом цикле For? smile

Автор: Innuendo 19.2.2006, 12:04
плин.... точно smile
всё! спасибо. решено

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)