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

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

Guestt


Удален

Есть ли в данном массиве два соседних положительных элемента? Найти номера первой (последней) пары.

uses crt;
var
a:array{1..50} of integer;
i,ke:integer;
begin
clrscr;
repeat
write('‚Vvedite kol-vo elementov: ');
readln(ke);
until ke<50;
for i:=1 to ke do
begin
write('a[',i,']=');
readln(a{{i]);
end;
for i:=1 to ke do
if ((a{{i]>0) and (a[i+1]>0)) and (a[i+2]<=0) then
writeln(i,' and ',i+1,' element obrazuet paru');
readln
end.

Я понял что он должен выводить номера элементов, которые образуют пару. Но если я беру например ke=10 и заполняю масиив так
0
1
1
1
0
0
1
1
1
0
то он выводит

3 и 4 элемент образует пару
8 и 9 элемент образует пару

А по идее должен выводить

2 и 3
8 и 9

Я думаю что ошибка здесь "(a[i+2]<=0)".  
Помогите исправить прогу, чтоб работала или укажите где я ошибся.

Всего сообщений: N/A | Присоединился: N/A | Отправлено: 2 мая 2006 20:54 | IP
KMA



Долгожитель

Guestt, на будущее учти, что если пишешь i в скобках квадратных, то он у тебя читает все как курсив, это стандарт IkonCode, поэтому лучше заменять на фигурные, или пользоваться другими переменными, отличными от i.

Если ты хочешь вывести все пары, то достаточно просто написать убрать в условии как раз a[i+2]<=0, т. е. оно должно выглядеть так:

if (a>0) and (a[i+1]>0)
  then writeln(i,' and ',i+1,' element obrazuet paru');

Если тебе нужно вывести только одну самую первую пару, то использую переменную-метку, это будет выглядеть вот так.

if (a>0) and (a[i+1]>0) and flag
  then
   begin
     flag:=false;
     writeln(i,' and ',i+1,' element obrazuet paru');
  end;
а сам flag нужно в самом начале "обнулить", т. е. написать flag:=true;
Если же нужно последний, то он решается абсолютно таким же методом, только отсчет у for i:=ke downto 2 do ...  ну и так далее, да обрати внимание, что тебе нужно заканчивать на ke-1 цикл, т. к. у тебя проверяется условие на i+1 элемент более...
Надеюсь, что все доступно объяснил... Дерзай, чего не получиться, обращайся...  

Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 2 мая 2006 21:29 | IP
Guestt


Удален

Огромное спасибо тебе за понятное и эффектное объяснение, прога пашет, радость моя по ходу шкалит

Всего сообщений: N/A | Присоединился: N/A | Отправлено: 2 мая 2006 21:59 | IP
Quest


Удален

Вывести все простые числа от 1 до n. Что то я не пойму почему он выводит все числа кроме простых, помогите плиз...


uses crt;
var i,j,n:integer;
   f:boolean;
begin
clrscr;
f:=true;
readln(n);
 for j:=1 to n do
 begin
    for i:=2 to о div 2 do
       if j mod i = 0 then
       f:=true;
         if а then writeln (j);
            f:=false;
 end;
  readln
end.  

Всего сообщений: N/A | Присоединился: N/A | Отправлено: 3 мая 2006 20:48 | IP
miss_graffiti


Долгожитель

for i:=2 to о div 2 do
...
if а then writeln (j);

что такое а и о?

Всего сообщений: 670 | Присоединился: сентябрь 2005 | Отправлено: 3 мая 2006 22:00 | IP
Quest


Удален

for i:=2 to j div 2 do
...
if f then writeln (j);

Сорри, просто опечатался...

Всего сообщений: N/A | Присоединился: N/A | Отправлено: 3 мая 2006 22:31 | IP
Guestt


Удален

uses crt;
var
a:array{1..50} of integer;
i,ke:integer;
begin
clrscr;
repeat
write('‚Vvedite kol-vo elementov: ');
readln(ke);
until ke<50;
for i:=1 to ke do
begin
write('a{',i,'}=');
readln(a{i});
end;
for i:=1 to ke do
begin
write(' ',a{i},' ');
end;
writeln;
for i:=1 to ke do
if (a{i}<0) then
break;
begin
writeln(a{i},' perviy otric');
end;
for i:=ke downto 1 do
if (a{i}>0) then
break;
begin
writeln(a{i},' posled poloj');
end;
readln
end.

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


(Сообщение отредактировал Guestt 3 мая 2006 22:37)


(Сообщение отредактировал Guestt 3 мая 2006 22:39)

Всего сообщений: N/A | Присоединился: N/A | Отправлено: 3 мая 2006 22:36 | IP
KMA



Долгожитель

Guestt, тут точно такая же логика, как и в прошлой задаче, тебе для перестановки необходимо знать номера положительного и отрицательного значения и их значения, дак вот, немного переделаю твою программу так, чтобы было удобнее сооброжать, и еще, ты учись оформлять, а то я замучался читать такой текст, плюс не пише где не надо(т. е. где всего одна операция) begin и end; запись массивная, плюс у тебя ошибки с синтаксисом.
Твой метод конечно приемлемый, но такие задачи обычно решеются так.

    i:=ke;
    while a{i}<0 do
     dec (i);
    p:=a{i}; {положительный элемент, последний разумеется}
    ip:=i; {номер положительного элемента}

    i:=1
    while (a{i}>0) and (i<ke) do
     inc (i);
    o:=a{i};  {первый отрицаетльный элемент}
    io:=a{i}; {номер отрицательного элемента}

Если не знаешь, то inc операция инкремента, аналогичная С ++, т. е. прибавление еденицы, а dec декремента, т. е. уменьшение аргумента на 1.

Вернемся к задаче, теперь, когда ты знаешь номера этих элементов, и их значения, то их можно и поменять.

    a{ip}:=o;
    a{io}:=p;

Это довольно просто, ведь так?


(Сообщение отредактировал KMA 4 мая 2006 0:01)

Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 3 мая 2006 23:52 | IP
KMA



Долгожитель

Quest, ты немного не той логикой руководствовался, тебе ведь надо все числа, который деляться только на самих себя и на еденицу. Так? Если да, то тогда ты должен был написать следующее:

for i:=2 to n do  
begin
  flag:=true;
  for j:=2 to i-1 do
    if i mod j = 0
       then flag:=false;
  if flag
     then write (i, ' ')
end;

(Сообщение отредактировал KMA 4 мая 2006 0:40)

Всего сообщений: 940 | Присоединился: декабрь 2005 | Отправлено: 4 мая 2006 0:00 | IP
miss_graffiti


Долгожитель

Сама задача:
На плоскости заданы множество точек и окружность радиусом R с центром в начале координат.Построить множество всех треугольников с вершинами в заданных точках, имеющих непустое пересечение с окружностью.

Идеи есть, но они мне абсолютно не нравятся:
1) брать каждую точку из круга и смотреть, не принадлежит ли она треугольнику. если хоть одна принадлежит - рисовать. и так для каждого треугольника...
2) разбить на случаи:
2.0 если все три внутри - этот треугольник нас сразу перестает интересовать. иначе:
2.1. если хотя бы одна вершина лежит внутри - пересечение есть.
2.2 центр окружности лежит внутри треугольника - рисуем.
2.3 хотя бы одна сторона пересекает окружность - рисуем.
для отлавливания 2.3 надо составлять ур-ния сторон.... из-за нецелочисленности возникают дополнительные заморочки.

эта задача одна из четырех... три решаются в 2 строчки, поэтому мне кажется, и для четвертой должно существовать несложное решение.
код мне не нужен, а если какую-то мысль подкинете - буду дико благодарна.
_____________________________
KMA, почему
if i mod 2 = 0
...
?

Всего сообщений: 670 | Присоединился: сентябрь 2005 | Отправлено: 4 мая 2006 0:38 | 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