IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

 
 Ответить  Открыть новую тему 
> Информатика, Цикл вопросов при подготовке к экзамену
сообщение
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


Привет! Очень надеюсь на вашу помощь в разжевывании некоторых понятий smile.gif
Итак приступим-с:

1. Банально.. Свойства алгоритма. Массовость - це значит, что любой алгоритм должен решать какую-то конкретную задачу из определенного класса задач, причем такой класс либо бесконечен, либо конечен, но очень "баальшой".. Так вот.. А можно это сказать как-то по-человечески и с примером?

2. Тут мне б тоже пример хотелось:
а) перечислимый тип (а сюда пойдет, например, тип месяцы(-а))) с элементами январь, февраль и т.д.?)
б) ссылочный тип - знаю, что значение любого ссылочного типа - это адрес памяти, но в живую не встречала.. познакомите?))


Пока все, но думаю еще вопросы появятся.. Я только начала подготовку..
Заранее пасибо))

Сообщение отредактировано: Айра -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


1. По-человечески...
Алгоритм совершения покупок в супермаркете должен позволять тебе купить как хлеб, так и мыло. smile.gif

2.
а) Перечислимый... ну, обычно под этим понимают не только перечисляемый (месяцы; товары в конкретном магазине; книжки на полке), но и стандартные типы языка, элементы которых могут быть перечислены в определенном порядке (например, char - может... integer - побольше, но все же мы можем записать 1,2,3...MaxInt. а со строками так не получится... хотя, конечно, в условиях ограниченности длины строки/разрядной сетки для чисел это условность). Это понятие обычно используется при выборе типа переменной в таких операторах, как for <переменная>, case <переменная>
б) какого рода пример тебе бы хотелось? код? или жЫзненный?


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


2а) так месяцы подходят? ура)) алгоритм построения типа понятен.. я забыла уточнить, что речь идет о конструируемых типах, т.е. стандартные сейчас не пойдут, но все равно спасибо))
2б) а я хочу все и сразу smile.gif)

Добавлено через 17 мин.
Да по-поводу 1-го: теперь на более близком к теме языке - если я пишу программку для сортировки массива, то она должна сортировать не только один какой-то понравившийся мне массив))

Сообщение отредактировано: Айра -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


2а) А почему нет?
Вот так например:
type
Month= (jan, feb, mar, apr, may, jun,
jul, aug, sept, oct, nov, dec);


2б)
жЫзненно:
Представь, что ты белка. Ты нашла орех, но сейчас есть его не хочешь. Таскать за собой - тоже как-то глупо.
Ты его прячешь. И тут понимаешь, что можешь забыть, куда спрятала! Пишешь записочку: "Орех лежит под дубом". Носить с собой маленькую записочку удобнее, чем большой орех.
Теперь ты находишь еще один орех. Можно поступить так же, но тогда придется носить с собой 2 записочки.
Ты - умная белка, поэтому прячешь второй орех вместе с первой записочкой, а новую носишь с собой.
В итоге у тебя с собой 1 записка: "Орех под березой". Если ты раскопаешь его, найдешь информацию об орехе, который под дубом.
Так же можно поступить с 10 орехами - а носить придется по-прежнему всего одну записку.
(это у нас получился линейный список, а записки здесь играют роль ссылочного типа)

Если нам понадобится описать эти типы, получится что-то вроде:
type
zapiska = ^Tainik; {значок ^ показывает, что записка - это указатель на тайник}

Tainik = record
Oreh: eda; {допустим, тип eda был описан раньше smile.gif}
Next: zapiska; {указатель на следующий тайник}
end;


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


Спасибо!! Теперь я умная белка)))

Добавлено через 7 мин.
..хотя надо проверить:
Цитата
а записки здесь играют роль ссылочного типа

получается за последнюю ссылку я могу вытащить цепочку из всех остальных.
Перенесем на программирование:
может получиться так, что у меня есть ссылка на какую-то ячейку в памяти, в нужный момент я ее использую и достаю от туда, скажем, какое-то большое число (у меня их много и нерационально постоянно все "помнить"), а может получиться так, что я достану от туда еще одну ссылку, перейду по ней - еще одну, потом еще, еще, и только потом число (хотя тут что-то не мне не нравится (зачем мне куча ссылок, если можно сразу одну)))
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


просто человек
******

Группа: Пользователи
Сообщений: 3 641
Пол: Женский
Реальное имя: Юлия

Репутация: -  55  +


Цитата
получается за последнюю ссылку я могу вытащить цепочку из всех остальных.

да. но попутно будешь получать и что-то еще (находить вместе с записками орехи)!
то есть, перенося на программирование...
обычно в списках используются элементы, состоящие из нескольких полей (будем считать для простоты, что из 2 - информационного и ссылки на следующий элемент).
если тебе не нужно значение информационного поля какого-то элемента, ты можешь им не пользоваться, и построить длиииинную цепочку:
el:=((el^.next)^.next)^.next;

а можешь воспользоваться... например, посчитать сумму.

Цитата
а может получиться так, что я достану от туда еще одну ссылку, перейду по ней - еще одну, потом еще, еще, и только потом число

может...
возвращаясь к белкам - если ты будешь класть в тайники одни записочки. то есть 10 тайников - и всего один орех. смысл?


--------------------
Все содержимое данного сообщения (кроме цитат) является моим личным скромным мнением и на статус истины в высшей инстанции не претендует.
На вопросы по программированию, физике, математике и т.д. в аське и личке не отвечаю. Даже "один-единственный раз" в виде исключения!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


Цитата
смысл?

Вот и я о том же.. Когда про поля сказала, все окончательно встало на свои места)))))
Пойду учить следующие вопросы: Целочисленные типы. способ хранения целочис..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


У списка есть недостаток перед массивом - нельзя сразу перейти к элементу с нужным номером: приходится перебирать все элементы с начала. Тут ничего не поделаешь - зато у списка есть другие преимущества перед массивом. Поэтому длиная цепочка ссылок - всего лишь способ добраться до нужного элемента (как знать, вдруг белке захотелось полакомиться именно орехом урожая 1894 года?).

Еще один пример на ссылку на ссылку (мне привычнее употреблять термин "адрес").
В Паскале не очень вразумительно сделаны указатели, поэтому лучше на примере Си.
Хочется иметь строки неограниченной длины. Но хочется также иметь тип данных фиксированной длины, например для того, чтобы можно было сделать из них массив.
Как совместить эти требования?
Например, использовав в качестве типа адрес первого символа строки, а конец строки пометить каким-либо ограничителем, скажем, символом с кодом 0.
То есть строка у нас на самом деле имеет тип указателя.
Теперь нам нужно, чтобы некая процедура возвращала строку.
Чтобы передать строку внутрь процедуры достаточно переда ее значение (в нашем случае это адрес), а чтобы получить обратно - нужен адрес: для того, чтобы записать по этому адресу значенние переменной.
Вот мы и передаем в процедуру адрес указателя на первый символ строки. А процедура записывает по этому адресу адрес тела уже существующей строки.
Если бы перед нами стояла задача обойтись единственным адресом, пришлось бы дополнительно резервировать память и создавать копию строки вместо того, чтобы использовать адрес уже существующей.

Сообщение отредактировано: andriano -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Цитата
В Паскале не очень вразумительно сделаны указатели, поэтому лучше на примере Си.
"Плохому танцору..." (С) Народная мудрость...

Си не надо приплетать... Тут вообще-то разговор о Паскале (хотя тебе, похоже, что-либо говорить вообще бесполезно...)

Пример, приближенный к Паскалю:
Есть некий список... "Голова" (head) этого списка - естественно указатель на первый элемент... И мне надо написать процедуру, добавляющую в список еще один элемент, в начало (перед первым)... Что делаем? Ну, добавить-то в общем не проблема, однако head изменится, ибо он теперь должен указывать на другой элемент... Но ведь если я просто сменю значение head-а в процедуре:

type
plist = ^list;
list = record
data: item_type;
next: plist;
end;
procedure add_first(head: plist; item: item_type);
...
, в вызывающей программе оно не изменится (вариант с использованием Var не предлагать, ибо пример - только для учебных целей. Оля спросила про указатель на указатель, я привел пример, показывающий такую ситуацию).

Что делать? Один из вариантов - передать в процедуру не сам head, а указатель на него...


type
pplist = ^plist; // определяем тип - указатель на "указатель на элемент списка"
...

// передаем указатель на "голову" списка, чтобы изменение передалось в вызывающую программу...
procedure add_first(phead: pplist; item: item_type);
var new_item: plist;
begin
// выделяем память под переменную типа list,
// в new_item вернется указатель на выделенную область памяти
new(new_item);

// заполняем поля структуры:

// в поле data пишем само значение
new_item^.data := item;
// в поле next - то, что раньше было "головой" списка, но поскольку phead у нас не просто
// указатель, а "двойной" указатель - то разыменовываем его, в итоге получается присвоение
// "указателя на элемент списка" такому же "указателю на элемент списка"
new_item^.next := phead^;

// а теперь - изменяем "голову", первым элементом должен быть тот, который создан только что,
// операцией new, т.е. new_item... Обрати внимание - опять разыменование, чтобы "уравнять" типы
// указателей: pplist^ = plist
phead^ := new_item;
end;

...
// @ - берем адрес фактической переменной - "головы" списка, и передаем его
// для обработки в процедуру
add_first(@my_head, 10); { <--- Пример вызова }
...


Теперь работа с "головой списка" осуществляется через указатель на него, следовательно, имеем уже "указатель на указатель на первый элемент".

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


А можно я попробую прокомментировать код rolleyes.gif (попытаемся проверить, насколько я поняла wink.gif ):

type
plist = ^list; // тип plist - это указатель на тип list
list = record // list - это запись с двумя полями, где 1-е поле - это какие-то данные
// а второе - указатель, получается, на следующий элемент записи?
data: item_type;
next: plist;
end;
procedure add_first(head: plist; item: item_type); //добавляем запись, head - указатель именно на первый
//элемент, item - данные
...



type
pplist = ^plist; // pplist - тип-указатель на тип-указатель))
...

procedure add_first(phead: pplist; item: item_type); // а здесь у нас уже не сам указатель на первый
//элемент, а указатель на указатель на первый элемент)) + данные
var new_item: plist; // новые данные - указатель на запись
begin
new(new_item); // прочитала, что new создает новую динамическую переменную и указатель на нее, вроде понятно
new_item^.data := item; // а здесь new_item^ - это уже значение (т.е. запись) на которую ссылается этот указатель
new_item^.next := phead^; //записали в новой записи в поле next значение указателя, указывающего на head

phead^ := new_item; // а тут присвоили ему значение указателя на новую запись
// т.е. мы какбы поменяли местами значения? например была первая запись, со всеми приложениями))
// phead(типа pplist)->head(типа plist)->list', потом мы дописали еще одну запись и получилось
// pnext->next->list'', но теперь эта первая, а верхняя - 2-я.. а после всех махинаций с указателями получится:
// phead->next->list'' и pnext->head->list' ?..
// ой, как-то бредово у меня получилось, особенно вконце..
end;

...
add_first(@my_head, 10); { <--- Пример вызова } // @my_head - т.е. берется значение указателя my_head..
...



Вот такие мысли сумасшедшего)))

Сообщение отредактировано: Айра -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Оля, я добавил комментарии постом выше...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


Еще пара вопросов:
1. Регулярный тип - то бишь массивы.. прочитала что в качестве элементов массива можно использовать элементы любого типа кроме файлового.. не поверила))
на всякие извращения вида:

m1: array[1..5] of text;
m: array[1..5] of file of text;
n: array[1..5] of file of file; // <- тут ошиблась при вводе, но прошло о_О
k: array[1..5] of file of file of integer;

компилятор не ругается.. Конечно дальше я еще не придумала, что делать с такими массивами, но, внимание, вопрос: почему не льзя)), потому что не имеет смысла (дальнейшая работа не возможна) или что?

2. Опять указатели.. или ссылки.. В общем дожили.. Есть ссылочный тип (он конструируемый), а есть указательный (он предопределенный), получается разница между ними только (или нет) в предопределенности и конструируемости? А как выглядит предопределенный указатель (^integer wink.gif )?

Сообщение отредактировано: Айра -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






1. Смотрим здесь: массив файлов
2.
Цитата
получается разница между ними только (или нет) в предопределенности и конструируемости?
Вообще-то ссылками называют переменные, которые указывают на какой-то конкретный тип, а указателем (вернее, обобщенным указателем) - переменные типа Pointer. Так что ^integer - строго говоря - это тоже ссылка... А разница между ними (между указателем и ссылками по этой классификации) - в том, что ссылка совместима по присваиванию только с указателем или со ссылкой на тот же самый (или производный, при работе с объектами) тип, а указатель - совместим с любым адресным типом. То есть,

type
pint = ^integer;
pdouble = ^double;

var
p: pointer;
p_i, p_j: pint;
p_d: pdouble;

begin
...
p_i := p_j; { Можно, одинаковые типы }
p_i := p; { <--- Можно, указатель совместим со всеми типами ссылок }
p := p_d; { <--- Аналогично предыдущему }
p_i := p_d; { <--- А вот этого делать нельзя }

Ну, и здесь посмотри еще: Все о динамических структурах данных.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


[offtop] 1. оказывается не одну меня это заинтересовало)) это один из этапов обучения программированию? smile.gif [/offtop]

2. теперь все ясно yes2.gif Спасибо!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 28.03.2024 21:57
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name