Помощь - Поиск - Пользователи - Календарь
Полная версия: Число точек, находящихся внутри круга
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
HuKTO
Цитата
Подсчитать число точек, находящихся внутри круга, радиусом R с центром в начале координат, координаты заданы массивами x(100), y(100).


Никак не врублюсь в паскаль. Вроде задача не трудная, а как сделать - хз. Сам алгоритм вроде просматривается, но формулу по которой будут точки считаться внутри круга где брать... без понятия. Вообщем помогите пжл с этой нелегкой(для меня) задачей. Можно с коментариями неболишими..может чего-нибудь да пойму.
Atos
Цитата
формулу по которой будут точки считаться внутри круга где брать... без понятия.
если x[i]*x[i]+y[i]*y[i]< R*R, то i-я точка лежит внутри круга
HuKTo
Цитата(Atos @ 11.04.05 5:27)
если x[i]*x[i]+y[i]*y[i]< R*R, то i-я точка лежит внутри круга

Спасибо за формулу, я правда все-равно не понял как она работает. Можете объяснить? И если не сложно напишите код программы целиком, а то у меня не получилось, а скоро уже идти её(задачу) показывать...

Заранее спасибо.
volvo
Вот функция, проверяющая лежит ли i-я точка внутри круга:
Код
Function isInside(i: integer): boolean;
begin
 isInside := (sqr(x[i]) + sqr(y[i])) < sqr(R)
end;

В цикле для каждой точки вызываешь эту ф-ю и если ее значение = True то увеличиваешь счетчик... Где именно проблема?
Atos
Мда... Ладно. Поясняю. В каком случае точка лежит внутри круга? Тогда, когда расстояние от точки до начала координат меньше радиуса круга. Как вычисляется это расстояние? Его квадрат равен сумме квадратов координат точки по x и по y (ТЕОРЕМА ПИФАГОРА!!). Следовательно, формула звучит так:
"если квадрат расстояния до центра координат меньше квадрата радиуса круга"

Вот код...
Код
type Arr=array[1..100] of integer;

var i,t,n:byte;
   R:word;
   x,y:Arr;
begin
t:=0;
write('Vvedite radius kruga '); readln(R);
write('Vvedite colichestvo tochek '); readln(n);

for i:=1 to n do
 begin
 write(i,' tochka: x= '); read(x[i]); write(' y= '); readln(y[i]);
 end;
for i:=1 to n do if x[i]*x[i]+y[i]*y[i] < R*R then inc(t);
writeln('Colichestvo tochek vnutri kruga ravno ',t);
readln;
end.


Вообще же лучше самостоятельно начать разбираться в Паскале: видимо, у тебя с этим проблемы. Пойми, что все программы за тебя вряд ли напишут, а если и напишут, то не гарантированно без ошибок. На самом деле программирование - очень интересная вещь! и вовсе не страшная :D и в жизни всегда пригодится. Если захочешь разобраться в нём не только ради сдачи зачёта, здесь всегда будут рады помочь тебе и дать совет.

Попробуй разобраться в этой несложной программке, и если всё-таки захочешь потренироваться, после того, как сдашь её преподавателю, попробуй модифицировать её так, чтобы она могла работать не только с кругом с центром в начале координат, но и с любым кругом(координаты его центра задаёт пользователь) Если что ещё непонятно, спрашивай

З.Ы. О, пока писал,volvo меня уже опередил с ответом smile.gif
HuKTO
Цитата(volvo @ 11.04.05 12:29)
Вот функция, проверяющая лежит ли i-я точка внутри круга:
Код
Function isInside(i: integer): boolean;
begin
 isInside := (sqr(x[i]) + sqr(y[i])) < sqr(R)
end;

В цикле для каждой точки вызываешь эту ф-ю и если ее значение = True то увеличиваешь счетчик... Где именно проблема?

Да сам не знаю где проблема...наверное в моей голове. Ну вообщем если делать след:
Код
uses crt;
function isInside(i:integer):boolean;
var
r,x,y,kol:integer;

begin
kol:=0;
writeln('Radius: ');readln(r);
isInside:=(sqr(x)*sqr(y))<sqr(R);
for i:=1 to 100 do
if isInside(i)=true then inc(kol)
end;
var
a1:integer;
begin
writeln(isInside(r,x,y,kol);
end.

То он выдает ошибку на параметрах isInside, т.к. я их якобы не задавал вообще. Вначале по-идее также должно быть
Код
Type mass=array[1..100] of integer;
var
x,y: mass;

Но в таком случае он выдает ошибку, где написано что-то вроде "вам нужно описать х и y через integer либо через real". Пробывал и так и сяк - 0 результата.
Guest
Цитата(Atos @ 11.04.05 12:50)
Мда... Ладно. Поясняю.

Насчет программы:
Мне нужно именно с использованием функции (function). И в твоей задаче получается, что надо каждую точку вводить собственноручно.
На счет программирования вообще: да нет, мне как раз программирование интересно. Иначе бы не пошел на такую специальность. В прошлом году в ку бэсике и визуал бэсике вообще проблем не было(хоть и программа конечно другая была, полегче...но всеже), да и Php мне когда-то очень нравился...очень удобная штука, но сайтами я больше не увлекаюсь довольно давно...так что и оттуда все забыл. А паскаль не знаю не дается и все. Щас, кстати, ещё тему создам... новая задача...тоже вообще не понял. И с этой ещё разобратся надо(надеюсь на вашу помощь).
volvo
HuKTO, смотри что происходит: Ты описываешь функцию, и внутри нее - локальную переменную R, правда? Но ведь эта переменная недоступна ВНЕ функции, откуда ты пытаешься к ней обратиться. Так что объявляй ее глобально, еще перед функцией...

И второе... Функция IsInside выполняет строго определенную задачу: Выясняет, находится ли точка под номером i внутри круга. Зачем же взваливать на эту же функцию еще и ввод радиуса и подсчет количества точек? Тогда она вообще тебе не нужна, как функция, и тебе лучше перенести все в основную программу.

Вот что тебе нужно:
Код
uses crt;
const n = 100;
var
 i, r, kol:integer;
 x, y: array[1 .. n] of integer; { У тебя же массив координат по условию }

function isInside(i:integer):boolean;
begin
 isInside:=(sqr(x)*sqr(y))<sqr(R);
end;

var
begin
 writeln('Radius: ');readln(r);

 { Здесь тебе надо будет добавить ввод самих координат }

 kol:=0;
 for i:=1 to 100 do
   if isInside(i) then inc(kol) { <--- Когда работаешь с Boolean,
то "= True" можно не писать, компилятор это поймет :) }

 writeln('точек в круге:', kol);
end.
HuKTO
Странно, но опять эта ошибка - "Integer or real expression expected".
volvo
Да, это мой глюк. sad.gif Поменяй строку в функции вот на эту:
Код
 isInside:=(sqr(x[i])*sqr(y[i]))<sqr(R);
HuKTO
2Volvo: Смотри, у тебя в задачи I обозначена получается тоже локально? Но если её описать заранее как интежер, то задача запускается, но точек в круге при любом раскладе - 100
И в 2-е - на счет ввода координат - это ты имеешь ввиду как у Atos'a
Код
for i:=1 to n do
begin
write(i,' tochka: x= '); read(x[i]); write(' y= '); readln(y[i]);
end;
? Но у меня же по-идее координаты массивами заданы, зачем их вводить.
volvo
Цитата(HuKTO @ 12.04.05 10:49)
Смотри, у тебя в задачи I обозначена получается тоже локально? Но если её описать заранее как интежер, то задача запускается, но точек в круге при любом раскладе - 100

Так в том-то и дело, что если одна и та же переменная описана И глобально, И локально, то везде, где видимо локальное описание, будет использоваться локальная переменная, во всех остальных случаях - используется глобальная. У тебя же ГЛОБАЛЬНАЯ переменная описана просто не была, а то, что ты описал переменную внутри процедуры, так она же просто не существует до тех пор, пока ты в эту процедуру не войдешь, и обращаться к ней извне просто нельзя...

Кстати, у меня I не описывается локально, а передается как параметр, а это разные вещи...

Цитата(HuKTO @ 12.04.05 10:49)
у меня же по-идее координаты массивами заданы, зачем их вводить.

Не путай, они у тебя не заданы, а описаны. То есть под них выделено место. А значения им кто будет присваивать? Тка что все-таки придется поставить этот цикл (который ты видел у Atos-а) :yes:
HuKTO
2Volvo:
Наконец добрался до сюда. Спасибо за советы. Вот такая программа в итоге получается:
Код
uses crt;
const n=100;
Type arr=array[1..100] of integer;

var
i,r,kol:integer;
x,y:arr;
function isInside(i:integer):boolean;

begin
isInside:=(sqr(x[i])+sqr(y[i]))<sqr(R);
end;
begin
clrscr;
writeln('Chemy raven radius?');
readln(R);
for i:=1 to n do
begin
x[i]:=i;
y[i]:=i;
end;
kol:=0;
for i:=1 to 100 do
if isInside(i) then inc(kol);
writeln('Kol. to4ek vnutri kruga=',kol); readln;
end.

Все вроде работает. Но с процедурами(я создавал тему, правда щас её на нашел..) я так и не разобрался. Если не трудно напиши код. Я сам принцип понял кое-как но ничего не выходит все-равно(программа: даны натур. числа k и n. составить програм. формирования массива А, элементами которого являются числа, сумма цифр которых равна k и к-ые не больше N).
Идет по идее рандом чисел, и каждое число проходит проверку: равна ли сумма его цифр K и не больше ли они N. Если и то и то верно то добавляем число в массив и переходим к след. числу, если же нет пропускаем и все-равно переходим.
volvo
Цитата(HuKTO @ 18.04.05 13:04)
я создавал тему, правда щас её на нашел

А вот если бы зарегистрировался, тебе был бы доступен просмотр всех своих сообщений...

Цитата(HuKTO @ 18.04.05 13:04)
Если не трудно напиши код.
Нетрудно, но код полностью я писАть не буду. Кстати, это уже не относится к первому заданному вопросу, поэтому ищи созданную тобой тему и продолжай обсуждение там.

P.S. И, на будущее, давай более осмысленные названия темам, "Задача на функцию (или процедуру)" - таких сотни, и не разберешь, где что...
unFair
Цитата(volvo @ 18.04.05 14:30)
А вот если бы зарегистрировался, тебе был бы доступен просмотр всех своих сообщений...

Все учел, зарегился. Можно продолжить обсуждение в соседней теме ;)
volvo
Читай мой предыдущий ответ внимательно... Здесь обсуждение закончилось. Одна тема - один вопрос.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.