Форум
» Назад на решение задач по физике и термеху
Регистрация | Профиль | Войти | Забытый пароль | Присутствующие | Справка | Поиск

» Добро пожаловать, Гость: Войти | Регистрация
    Форум
    Информационные технологии
        Турбо Паскаль. Программирование на 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 ]
Модераторы: paradise, KMA
  

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

Эта тема закрыта, новые ответы не принимаются

Переход к теме
<< Назад Вперед >>
Несколько страниц [ 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 ]

Форум работает на скрипте © Ikonboard.com