1. Заголовок темы должен быть информативным. В противном случае тема удаляется ... 2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения. 3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали! 4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора). 5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM! 6. Одна тема - один вопрос (задача) 7.Проверяйте программы перед тем, как разместить их на форуме!!! 8.Спрашивайте и отвечайте четко и по существу!!!
Число точек, находящихся внутри круга, (использовать функции)
Подсчитать число точек, находящихся внутри круга, радиусом R с центром в начале координат, координаты заданы массивами x(100), y(100).
Никак не врублюсь в паскаль. Вроде задача не трудная, а как сделать - хз. Сам алгоритм вроде просматривается, но формулу по которой будут точки считаться внутри круга где брать... без понятия. Вообщем помогите пжл с этой нелегкой(для меня) задачей. Можно с коментариями неболишими..может чего-нибудь да пойму.
если x[i]*x[i]+y[i]*y[i]< R*R, то i-я точка лежит внутри круга
Спасибо за формулу, я правда все-равно не понял как она работает. Можете объяснить? И если не сложно напишите код программы целиком, а то у меня не получилось, а скоро уже идти её(задачу) показывать...
Мда... Ладно. Поясняю. В каком случае точка лежит внутри круга? Тогда, когда расстояние от точки до начала координат меньше радиуса круга. Как вычисляется это расстояние? Его квадрат равен сумме квадратов координат точки по 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 меня уже опередил с ответом
Вот функция, проверяющая лежит ли 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 результата.
Насчет программы: Мне нужно именно с использованием функции (function). И в твоей задаче получается, что надо каждую точку вводить собственноручно. На счет программирования вообще: да нет, мне как раз программирование интересно. Иначе бы не пошел на такую специальность. В прошлом году в ку бэсике и визуал бэсике вообще проблем не было(хоть и программа конечно другая была, полегче...но всеже), да и Php мне когда-то очень нравился...очень удобная штука, но сайтами я больше не увлекаюсь довольно давно...так что и оттуда все забыл. А паскаль не знаю не дается и все. Щас, кстати, ещё тему создам... новая задача...тоже вообще не понял. И с этой ещё разобратся надо(надеюсь на вашу помощь).
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" можно не писать, компилятор это поймет :) }
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;
? Но у меня же по-идее координаты массивами заданы, зачем их вводить.
Смотри, у тебя в задачи I обозначена получается тоже локально? Но если её описать заранее как интежер, то задача запускается, но точек в круге при любом раскладе - 100
Так в том-то и дело, что если одна и та же переменная описана И глобально, И локально, то везде, где видимо локальное описание, будет использоваться локальная переменная, во всех остальных случаях - используется глобальная. У тебя же ГЛОБАЛЬНАЯ переменная описана просто не была, а то, что ты описал переменную внутри процедуры, так она же просто не существует до тех пор, пока ты в эту процедуру не войдешь, и обращаться к ней извне просто нельзя...
Кстати, у меня I не описывается локально, а передается как параметр, а это разные вещи...
Цитата(HuKTO @ 12.04.05 10:49)
у меня же по-идее координаты массивами заданы, зачем их вводить.
Не путай, они у тебя не заданы, а описаны. То есть под них выделено место. А значения им кто будет присваивать? Тка что все-таки придется поставить этот цикл (который ты видел у Atos-а) :yes:
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. Если и то и то верно то добавляем число в массив и переходим к след. числу, если же нет пропускаем и все-равно переходим.
А вот если бы зарегистрировался, тебе был бы доступен просмотр всех своих сообщений...
Цитата(HuKTO @ 18.04.05 13:04)
Если не трудно напиши код.
Нетрудно, но код полностью я писАть не буду. Кстати, это уже не относится к первому заданному вопросу, поэтому ищи созданную тобой тему и продолжай обсуждение там.
P.S. И, на будущее, давай более осмысленные названия темам, "Задача на функцию (или процедуру)" - таких сотни, и не разберешь, где что...