Kotenochek
Удален
|
Спасибо KMA за совет,куда пойти куда податься.Насчет стакана я в принципе знала и насчет массива также,но главная проблема состоит в том,что из-за того,что практики было совсем мало,сама в этом виновата,то теоретически представить я могу,а вот с написанием дело похуже будет... Спасибо.
|
Всего сообщений: N/A | Присоединился: N/A | Отправлено: 6 июня 2006 1:53 | IP
|
|
KMA
Долгожитель
|
Приводи конкретную задачу, мы к ней и подойдем поконкретнее, только код обязательно приводи, чтобы разбираться было проще. А про стакан, и эти массивы я просто выложил, чтобы мало кто заглянет, то может сразу и ответ найдет.
|
Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 6 июня 2006 13:22 | IP
|
|
Kotenochek
Удален
|
То что я могла сделать очень примитивно...и очень мало,конечно,но если ты поможешь разобраться,то мои начальные идеи могла бы прислать тебе на мыло...вот только скажешь ли ты мне его? ...А там посмотрев впринципе будет все ясно.
|
Всего сообщений: N/A | Присоединился: N/A | Отправлено: 8 июня 2006 1:14 | IP
|
|
fess
Удален
|
Такое было задание Дано натуральное число n (n>=2). Найти все меньшие n простые числа, используя решето Эратосфена. Решетом Эратосфена называют следующий способ. Выпишем подряд все целые числа от 2 до n. Первое простое число 2. Подчеркнем его, а все большие числа, кратные 2, зачеркнем. Первое из оставшихся чисел 3. Подчеркнем его как простое, а все большие числа, кратные, 3, зачеркнем. Первое число из оставшихся теперь 5, так как 4 уже зачеркнуто. Подчеркнем его как простое, а все большие числа, кратные 5 зачеркнем и т.д. Исходную последовательность чисел организовать в виде однонаправленного списка. Удаление производить внутри этого списка, не используя дополнительные списки. program proga; uses crt; type u=^z; z=record ch:byte; next:u end; var nach,sled,prom: u; n,i,j:byte; begin clrscr; write('N='); readln(n); {это гранича числовой послед-ти} clrscr; {-------------------------------------------------------------} if n<2 then begin writeln('Oshibka!'); {это фрагмент, в принципе, не нужен} readln; exit; end; {-------------------------------------------------------------} writeln('Posledovatelnost chisel:'); new(nach); nach^.ch:=1; nach^.next:=nil; {создание нового (первого) эл-нта списка} sled:=nach; {-------------------------------------------------------------} for i:=2 to n do begin {здесь последующие элементы списка. new(sled^.next); Посмотрите, при отладке, есть здесь sled:=sled^.next; какая-то хрень, при i=4} sled^.ch:=i; sled^.next:=nil; end; {-------------------------------------------------------------} writeln('Rjad prostih chisel'); sled:=nach; while sled <> nil do {вывод послед-ти} begin write (sled^.ch:2); sled:=sled^.next; end; {-------------------------------------------------------------} for i:=2 to n do {вот этот блок и есть то самое решето эратосфена. Здесь происходит удаление из списка} begin sled:=nach; while sled <> nil do begin if (sled^.ch=1) or (sled^.ch=i) or (frac(sled^.ch/i)<>0) then sled:=sled^.next else begin prom:=sled^.next; dispose(sled); sled:=prom; end; end; end; --------------------------------------------------------------} readln; {вывод "прореженных" элементов} sled:=nach; while sled <> nil do begin write (sled^.ch:2); sled:=sled^.next; end; {-------------------------------------------------------------} readkey; end. А теперь, собственно, проблема. В блоке, где произходит удаление элементов из списка возникает ошбика №204 invalid pointer operation, При отладке (Debug/Watch), в блоке где создаются последующие элементы, наблюдаю некоторую интересность)): когда i становится равным 4-м, sled^.ch принимает значение 8. А потом четыре. И вот, когда уже происходит разреживание элементов списка, возникает злополучная ошибка. Это происходит опять-таки, когда i=4. Я прошу вас, запустите эту программу на своих машинах. Проверте этим.. ватчингом. или, быть может, я неправельно удалаю элементы списка? Здесь лежит пасовский файл программы внешняя ссылка удалена
|
Всего сообщений: N/A | Присоединился: N/A | Отправлено: 11 июня 2006 19:41 | IP
|
|
VF
Administrator
|
fess Удаление в односвязном списке делается элементарно: элементу, ссылающемуся на удаляемый присваивается ссылка из удаляемого элемента. Было: A->B->C стало: A->C т.е. вместо B элемент A стал напрямую ссылаться на C. В Паскалевском коде плохо разбираюсь, но вместо frac(sled^.ch/i)<>0 лучше использовать sled^.ch mod i = 0. Целочисленная арифметика, операция mod дает остаток от деления. Ну а с ошибкой, возможно дело в этом: dispose(sled); sled:=prom; Если dispose уничтожает элемент sled, то присваивать ему уже ничего нельзя.
|
Всего сообщений: 3110 | Присоединился: май 2002 | Отправлено: 11 июня 2006 20:27 | IP
|
|
fess
Удален
|
Да в принципе, я по такой схеме и делал. Использовал mod. Не нахожу разницы. Dispose не уничтожает элемент т.е. не уничтожает сам указатель... он.. ну.. как бы отбирает динамическую память у этого указателся. Но затем, ведь я присваиваю ему снова некую облость. Вот при повторном использование dispose -да- возникает ошибка. У меня примерно это и происходит. В общем, надо самому смотреть - мне очень сложно это объяснить)) во всяком случае, пока что.
|
Всего сообщений: N/A | Присоединился: N/A | Отправлено: 11 июня 2006 21:35 | IP
|
|
MeatCrash
Удален
|
Вот задача: Нарисовать горизонтальную прямую, состоящую из 15 разноцветных пересекающихся окружностей. По условию её надо сделать циклом While. Знает кто-нибудь как это сделать? Заранее всем спасибо за помощь! (Сообщение отредактировал MeatCrash 12 июня 2006 22:55)
|
Всего сообщений: N/A | Присоединился: N/A | Отправлено: 12 июня 2006 20:53 | IP
|
|
KMA
Долгожитель
|
MeatCrash, это делается при помощи putPixel (x, y, color); При этом заканчивается все тогда, когда достигается число 15. Для перемены цвета используй функцию random (count); В принципе все, еще главное условие, что они должны быть последовательны, а это значит, что координаты х и y должны быть изменены всего лишь на 1. Вот и все, если возникнут противоречия, то можно отпереться тем, что пиксель это и есть окружность, т. к. любая точка может быть рассмотрена как окружность с минимальным радиусом...
|
Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 12 июня 2006 22:31 | IP
|
|
miss_graffiti
Долгожитель
|
KMA, а зачем именно таким радиусом? можно и правда кружочки рисовать... В паскале же есть процедура Элипс.
|
Всего сообщений: 670 | Присоединился: сентябрь 2005 | Отправлено: 12 июня 2006 23:22 | IP
|
|
KMA
Долгожитель
|
даже есть circle (x, y, r); И что, как мы прямую то будем строить? Я понимаю, если бы пересечением четырех окружностей, тогда, было бы классно, по двум точкам и строили бы прямую, а тут их пятнадцать, само сомнение терзает, как вообще найти прямую среди них, да и думать не хочется, экзамены... У меня обращение, выложите пожалуйста полностью все задание, то, как оно звучит в исходном виде...
|
Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 12 июня 2006 23:29 | IP
|
|
|