PDA

View Full Version : سوال: دامنه اعداد



baran_2005
سه شنبه 12 مرداد 1389, 12:26 عصر
سلام به همه
(عنوان مناسب پیدا نکردم )
یکسری عدد دارم مثل : 2 و 2.2 و 2.34 و 3 و 3.5 و ...
به ازای هر عدد یک امتیاز در بانک ذخیره شده است . حالا من می خواهم اگر عدد 3.2 را وارد کردم با اینکه در بانک وجود ندارد عدد 3 یا 3.5 به من نمایش دهد . برای این کار چکار کنم که از لحاظ زمانی هم مناسب باشد . من از بانک اکسس استفاده میکنم .

Felony
سه شنبه 12 مرداد 1389, 12:50 عصر
میتونید عدد وارد شده رو به وسیله تابع Round گرد کنید و بعد عدد متناظر با عدد حاصل رو از بانک بخونید .

مهران رسا
سه شنبه 12 مرداد 1389, 13:00 عصر
به 2 صورت میشه این قضیه رو حل کرد . راه اول اینه که بررسی کنید عدد مورد نظر در بازه X.1 تا X.9 وجود داشته باشه . راه دوم اینه که عدد مورد نظر رو به رشته تبدیل کرده و عدد سمت چپ نقطه رو با مقادیر مورد نظر بررسی کنید .

شاید راه دوم ساده تر به نظر بیاد :


Var
X: Double;
NumStr, IntNum: string;
begin
X := 3.1;
NumStr := FloatToStr(X);
IntNum := copy(NumStr, 1, pos('.', NumStr) - 1);
ShowMessage(IntNum);

baran_2005
سه شنبه 12 مرداد 1389, 13:19 عصر
شاید سوالم بد پرسیدم . ممکن این اعداد به این صورت باشند . 1 و 40 و 40.00 و 40.34 و 40.04 و 66 و 67 و 90.15 و 100.33

میتونید عدد وارد شده رو به وسیله تابع Trunc گرد کنید
پس از trunc نمی تونم استفاده کنم چون همیشه عدد صحیح ان وجود ندارد .


عدد مورد نظر در بازه X.1 تا X.9 وجود داشته باشه . راه دوم اینه که عدد مورد نظر رو به رشته تبدیل کرده و عدد سمت چپ نقطه رو با مقادیر مورد نظر بررسی کنید
اگر مثلا عدد 4.5 من وارد کنم ولی فقط 2 و 6 داشته باشم هیچ امتیازی برای من ثبت نمیشه .

حالا چکار کنم

tdkhakpur
سه شنبه 12 مرداد 1389, 13:54 عصر
اگر مثلا عدد 4.5 من وارد کنم ولی فقط 2 و 6 داشته باشم هیچ امتیازی برای من ثبت نمیشه .


خب نزدیکترین عدد به عدد (4.5) مورد نظر را جستجو کنید چیزی شبیه پیدا کردن کوچکترین عدد در بین اعداد. که داخل اعداد ( 1 و 40 و 40.00 و 40.34 و 40.04 و 66 و 67 و 90.15 و 100.33
) عدد پیدا شده شما 40.00 میشود

SAASTN
سه شنبه 12 مرداد 1389, 22:54 عصر
اگه درست متوجه منظورتون شده باشم اینکاری که می خواید بکنید درونیابی یا Interpolate هست، بیشتر ریاضیه تا برنامه نویسی، یه مثال با آرایه نوشتم، دیگه تبدیلش به DB با خودتون:
function Interpolate(const X1, Y1, X2, Y2, X: Double): Double;
begin
Result := Y1 + (X - X1) * ((Y2 - Y1) / (X2 - X1));
end;

function GetPointsOfValue(const Value: Double): Double;
const
Count = 10;
Values : array [0..Count - 1] of Double = (
1.0, 1.8, 3.2, 3.4, 5.0, 5.2, 5.8, 5.89, 6.02, 6.5);
Points : array [0..Count - 1] of Double = (
3.5, 2.32, 4.3, 1, 12, 1.5, 1.5, 1.4, 1.8, 2.7);
var
I: Integer;
begin
if Value <= Values[0] then
begin
Result := Points[0];
Exit;
end;
if Result >= Value[Count - 1] then
begin
Result := Points[Count - 1];
Exit;
end;
for I := 0 to Count - 2 do
if Value >= Values[I] then
begin
Result := InterPolate(Values[I], Points[I], Values[I + 1], Points[I + 1],
Value);
Break;
end;
end;

فرض این تابع اینه که آرایه Values به صورت صعودی مرتب باشه، خود تابع Interpolate رو هم یه چک دوباره بکنید.