PDA

View Full Version : الگوریتم جمع اعداد



atoofy
پنج شنبه 07 آذر 1387, 21:08 عصر
سلام. من یه کد نوشتم که جمع اعداد بین دو عدد مورد نظر را در میاره. کد ریاضیش هم همونطور که خودتون می دونید این هست :

($n*($n+1))/2خوب من فایل را که اجرا می کنم، بعضی وقتا درست میشه بعضی وقتا نه:گیج:
مثلا گاهی وقتا 1 تا 10 را درست می زنه 55 اما گاهی وقتا می زنه 1055 یا مثلا 50 تا 51 را که باید بشه 101، یه بار می زنه 1326 یه بارم می زنه 511326 بقیش را هم دیگه امتحان نکردم.:لبخند: در ضمن 1 تا 100 هم باید بشه 5050. حالا خودتون چند بار امتحان کنید ببینید چی میاره.
اینجا آپلود کردم می تونید نمونش را ببینید :
http://persiansobi.ir/php/num.phpاینم سورس فایل :

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<div align="center">
<div dir="rtl">
<form method="get">
<span style="font-family:tahoma; font-size:11px; color:brown;">عدد اول : </span><input type="text" size="5" name="first_number" />
<span style="font-family:tahoma; font-size:11px; color:brown;">عدد دوم : </span><input type="text" size="5" name="second_number" />
<input type="submit" value="بفرست!" />
</form>
</div>
<?php
$i=$_GET['first_number'];
while ($i<=$_GET['second_number']) {
$tedad=$i++;
}
if ($_GET['first_number']=='' or $_GET['second_number']==''){
echo "<div style=\"color:red;\"><b>please fill the fields !</b></div>";
}
elseif ($_GET['first_number']>=$_GET['second_number']){
echo "<span style=\"font-family:tahoma; font-size:11px; color:red;\" dir=\"rtl\" >عدد اول، باید از عدد دوم کوچکتر باشد!</span>";
}
else{
echo $tedad;
echo "<span style=\"font-family:tahoma; font-size:11px; color:blue;\" dir=\"rtl\" >حاصل جمع اعداد :</span>"." ".($tedad*($tedad+1))/2;
}
?>
</div>
<span ></span>
</html>

یاعلی

yaqubian
پنج شنبه 07 آذر 1387, 22:24 عصر
دوست عزیز
کدی که نوشتید درسته اما یه اشتباه کوچولو کردید و اون اینه که تو آخرین else تون tedad رو هم به همراه نتیجه جمع دارید چاپ می کنید.
بخاطر همونه که وقتی می نویسید 1 و 10 نتیجه رو می زنه 1055. جواب 55 درسته ولی تعداد 10 رو هم کنارش چاپ می کنه.
موفق باشید

atoofy
پنج شنبه 07 آذر 1387, 23:12 عصر
سلام. خیلی ممنون از پاسختون. حق با شماست. من اونو پاک کردم .
در مورد اعداد 1 تا 10 و 1 تا 100 درسته. اما مثلا وقتی بزنم 5 تا 9 به جای 35 که جواب هست، می نویسه 45 یا مثلا 50 تا 51 که باید بشه 101 را می زنه 1326 .یا یکی دیگه این که 6 تا 7 که باید بشه 13 را می زنه 28 و ... . احتمالا در مورد برخی عددهای دیگه هم همین طور باشه اما من تست نکردم هنوز. روی اون نمونه هم به آدرس زیر مشکل else آخر را حل کردم. می تونید روش تست کنید و همین اشکالی که هنوز هست ( جمع اشتباه اعداد) را ببینید :


http://persiansobi.ir/php/num.phpدر ضمن من اون tedad را توی else آخر هم چاپ می کردم تا ببینم چند تا عدد بین اون دو عدد به دست میاد. توی این قسمت هم اشکال دارم چون مثلا اگر عدد اولی را 800 و عدد دومی را 9000 می زدم باز هم tedad$ را 9000 تا چاپ می کرد. البته الان توی نمونه ای که توی آدرس بالا هست پاکش کردم. مشکل از کجاست؟

یاعلی

yaqubian
پنج شنبه 07 آذر 1387, 23:35 عصر
دوست عزیز
اول از همه باید بگم تا جایی که یادمه فرمولی که شما واسه حاصلجمع فرمودین همیشه از 1 تا یه عدد خاصی هست.
اما چیزی که شما می خواین فکر کنم این باشه. تست کردم درست کار می کنه:

<?php
if(isset($_GET['first_number']))
{
$tedad=0;
$i=$_GET['first_number'];
$j=$_GET['second_number'];
if($i>$j)
{
$temp=$i;
$i=$j;
$j=$temp;
}
while($i<=$j)
{
$tedad+=$i;
$i++;
}
echo $tedad;
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<div align="center">
<div dir="rtl">
<form method="get">
<span style="font-family:tahoma; font-size:11px; color:brown;">عدد اول : </span><input type="text" size="5" name="first_number" />
<span style="font-family:tahoma; font-size:11px; color:brown;">عدد دوم : </span><input type="text" size="5" name="second_number" />
<input type="submit" value="بفرست!" />
</form>
</div>
</div>
<span ></span>
</html>
موفق باشید

atoofy
پنج شنبه 07 آذر 1387, 23:41 عصر
سلام. خیلی ممنون.
حالا که یه نگاه سرسری انداختم چیز زیادی نفهمیدم. حالا اگه یه توضیح کوچولو هم لطف کنید بدید بسیار ممنون میشم.اگرم که نه خودم دوباره یه نگاهی بهش میندازم ببینم چیزی دستگیرم میشه یا نه.

با تشکر...
یاعلی

yaqubian
پنج شنبه 07 آذر 1387, 23:46 عصر
دوست عزیز
اول از همه چک می کنم که ببینم اصلا چیزی به اسم first_number ست شده یا نه؟ اگه درست بود که دریافتش می کنم. مقادیر هر دو عدد رو به ترتیب در i , j ذخیره می کنیم. بعد چک می کنیم که اگه i بزرگتر از j بود جاشون رو عوض کن.
بعدش تا زمانی که i کوچکتر از j باشه هر عدد رو می ریزم تو tedad و بعدی ها رو بهش اضافه می کنم.
فقط همین.
البته اگه بخواید کاملترش کنید هنوز خیلی جا واسه کار کردن داره.
موفق باشید

atoofy
جمعه 08 آذر 1387, 00:13 صبح
سلام.خیلی ممنون جناب یعقوبیان.
گرفتم چی شد.یه ابهام برام ایجاد شد: چرا اینجا فقط بررسی کردید که تنها first_number ست شده باشه؟ یعنی چرا در صورتی که second_number خالی هم باشه، بازم باید کار کنه؟

دوم اینکه من first_number را خالی گذاشتم و second_number را 6 دادم. جواب 21 شد. چرا؟:متفکر:


اول از همه باید بگم تا جایی که یادمه فرمولی که شما واسه حاصلجمع فرمودین همیشه از 1 تا یه عدد خاصی هست.
یعنی اون کد من حالا اگر عدد اول همیشه1 باشه، درست کار می کنه؟

ممنون...
یاعلی

امید امرایی
جمعه 08 آذر 1387, 00:42 صبح
بنده نمی دونم جناب yaqubian (http://barnamenevis.org/forum/member.php?u=798) به چه علت فقط وجود عدد اول رو چک کردند اما این حالت می تونه با وجود شرطی که در صورت عدم وجود عدد اول اون رو برابر 1 قرار بده کامل بشه . در حالت فعلی با عمل جابجایی که در مقادیر صورت می گیره عدد اول از 0 شروع می شه .

atoofy
جمعه 08 آذر 1387, 01:03 صبح
سلام. خیلی ممنون جناب kassit.
خوب در حالت فعلی درسته که عدد اول 0 شروع میشه اما در صورتی که first_number ست نشده باشه اصلا هیچ عملیاتی نباید انجام بشه.اما در حال حاضر میشه. چرا؟

یاعلی

yaqubian
جمعه 08 آذر 1387, 09:02 صبح
دوستان عزیز kassit و atoofi
دلیل خاصی نبوده من فقط الگوریتم شما رو تصحیح کردم و اگه دیده باشید نوشتم که واسه کامل کردن این برنامه هنوز خیلی باید کار بشه. من فقط یه تیکه کوچولو کد نوشتم. شما زحمت بکشید کامل ترش کنید.
موفق باشید

امید امرایی
جمعه 08 آذر 1387, 13:21 عصر
بله و دقیقا بنده هم می خواستم عرض کنم که روش صحیح برای انجام این کار اینه که ابتدا این الگوریتم رو در یک تابع تعریف کنید .

atoofy
جمعه 08 آذر 1387, 21:04 عصر
دوستان عزیز kassit و atoofi
دلیل خاصی نبوده من فقط الگوریتم شما رو تصحیح کردم و اگه دیده باشید نوشتم که واسه کامل کردن این برنامه هنوز خیلی باید کار بشه. من فقط یه تیکه کوچولو کد نوشتم. شما زحمت بکشید کامل ترش کنید.
موفق باشید

سلام. خیلی ممنونم دوست خوبم. حالا ببینید با دستور زیر کامل شده یا نه؟


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<div align="center">
<div dir="rtl">
<form method="get">
<span style="font-family:tahoma; font-size:11px; color:brown;">عدد اول : </span><input type="text" size="5" name="first_number" />
<span style="font-family:tahoma; font-size:11px; color:brown;">عدد دوم : </span><input type="text" size="5" name="second_number" />
<input type="submit" value="بفرست!" />
</form>
<?php
$i=$_GET['first_number'];
$j=$_GET['second_number'];
if($_GET['first_number']=='' or $_GET['second_number']==''){
echo "<span style=\"font-family:tahoma; font-size:11px; color:red;\">لطفا فیلد ها را پر کنید.</span>";
}
elseif($i==$j){
echo "لطفا دو عدد متفاوت انتخاب نمایید.";
}
else{
$tedad=0;
if ($i>$j){
$temp=$i;
$i=$j;
$j=$temp;
}
while($i<=$j){
$tedad+=$i;
$i++;
}
echo "<span style=\"font-family:tahoma; font-size:11px; color:blue;\">حاصل جمع اعداد : </span>";
echo $tedad;
echo "<br /><br />";
echo "<span style=\"font-family:tahoma; font-weight:bold; font-size:11px; color:green;\">بچه ببین چه کدی نوشتم. برو حال کن. :دی</span>";
}
?>
</div>
</div>
</html>

همونطور که می بینید اگر فیلد ها خالی باشه، می نویسه: "لطفا فیلد ها را پر کنید.". خوب این اتفاق دفعه ی اول هم میفته. اگر بخوایم فقط در صورتی که کاربر فیلد خالی را ارسال کرد، این اتفاق بیفته و دفعه ی اول مخفی باشه باید چه کار کرد؟

سوال دیگه اینکه اصلا کد بالا اصولی هست؟


بله و دقیقا بنده هم می خواستم عرض کنم که روش صحیح برای انجام این کار اینه که ابتدا این الگوریتم رو در یک تابع تعریف کنید .
خیلی ممنون جناب kassit.
منظورتون اینه که اول یه فانکشن تعریف کنیم و بعدش این فانکشن را فراخوانی کنیم؟ اگر بله میشه مزیت این کار نسبت به راه حل فعلی را هم بفرمایید.

موفق باشید.
یاعلی

امید امرایی
شنبه 09 آذر 1387, 23:07 عصر
طبق روال رایج ، مهمترین مزیت کپسوله سازی دستوره و اینکه می تونید اون رو در شرط ها و جریان های کنترل برنامه هم استفاده کنید . ضمن اینکه می تونه یک مقدار بازگشتی هم داشته باشه .

این در حالیه که به شما کمک می کنه دوباره نویسی هم نکنید
امکان خطایابی و قابلیت توسعه رو هم بالا می بره

yaqubian
یک شنبه 10 آذر 1387, 08:11 صبح
دوست عزیز
بهتر شده اما همونطور که دوست خوبمون kassit هم فرمودن بهتره که مفاهیم کپسوله سازی رو رعایت کنید.
موفق باشید

atoofy
یک شنبه 10 آذر 1387, 10:41 صبح
سلام. خیلی ممنون.
راستی توی کد isset به کار رفته بود که اگر فیلد اول خالی هم می بود، بازم جمع می کرد. اما من اومدم و اینطوری کردم :

if($_GET['first_number']=='' or $_GET['second_number']=='')

خوب مشکل من کجا بوده که این isset کار نمی کرد؟

ممنون...

yaqubian
یک شنبه 10 آذر 1387, 12:39 عصر
دوست عزیز
متد isset فقط کارش اینه که چک می کنه که متغیر مورد نظر set شده یا نه؟ نوع بازگشتیش هم boolean هست.
شما حتی اگه فیلدتون رو خالی هم بذارید چون از طریق فرم عمل ارسال داره انجام می شه پارامتر مورد نظر set می شه. واسه اینکه خالی بودن یا نبودن رو چک کنید باید validation انجام بدین مثل مقایسه با یه رشته null یا اینکه از متد strlen طولش رو محاسبه کنید و ببینید صفر هست یا نه؟
موفق باشید