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
|
|
|