1. Заголовок или название темы должно быть информативным ! 2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code]. 3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК ! 4.НЕ используйте форум для личного общения! 5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
Информатика, Цикл вопросов при подготовке к экзамену
Привет! Очень надеюсь на вашу помощь в разжевывании некоторых понятий Итак приступим-с:
1. Банально.. Свойства алгоритма. Массовость - це значит, что любой алгоритм должен решать какую-то конкретную задачу из определенного класса задач, причем такой класс либо бесконечен, либо конечен, но очень "баальшой".. Так вот.. А можно это сказать как-то по-человечески и с примером?
2. Тут мне б тоже пример хотелось: а) перечислимый тип (а сюда пойдет, например, тип месяцы(-а))) с элементами январь, февраль и т.д.?) б) ссылочный тип - знаю, что значение любого ссылочного типа - это адрес памяти, но в живую не встречала.. познакомите?))
Пока все, но думаю еще вопросы появятся.. Я только начала подготовку.. Заранее пасибо))
В Паскале не очень вразумительно сделаны указатели, поэтому лучше на примере Си.
"Плохому танцору..." (С) Народная мудрость...
Си не надо приплетать... Тут вообще-то разговор о Паскале (хотя тебе, похоже, что-либо говорить вообще бесполезно...)
Пример, приближенный к Паскалю: Есть некий список... "Голова" (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); { <--- Пример вызова } ...
Теперь работа с "головой списка" осуществляется через указатель на него, следовательно, имеем уже "указатель на указатель на первый элемент".