PDA

View Full Version : زمان اجرای برنامه



sa1378
جمعه 07 شهریور 1393, 11:31 صبح
سلام زمان اجرای این مگه O(n^2) نیست؟
پس چرا هرچی میگذره اهیچی چاپ نمیشه؟
#include <iostream>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
#define C (i*i)+(j*j)
int main() {

for(long long int i=1;i<=1000;i++)
{
for(long long int j=1;i<=i;j++)
{

if (C==1997*(i-j))
{
cout<<i<<" "<<j<<endl;
}
}
}


return 0;
}

مسعود اقدسی فام
جمعه 07 شهریور 1393, 11:46 صبح
سلام زمان اجرای این مگه O(n^2) نیست؟
پس چرا هرچی میگذره اهیچی چاپ نمیشه؟
#include <iostream>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
#define C (i*i)+(j*j)
int main() {

for(long long int i=1;i<=1000;i++)
{
for(long long int j=1;i<=i;j++)
{

if (C==1997*(i-j))
{
cout<<i<<" "<<j<<endl;
}
}
}


return 0;
}

چون i <= i نوشته شده که فک نکنم منظورتون حلقه‌ی بی‌نهایت باشه.

Coder#
جمعه 07 شهریور 1393, 12:19 عصر
قبل از این خط:
#define C (i*i)+(j*j)
من متغیری به نام i و j که قبل از خط رو به رو اعلان شده باشن نمی بینم.
اول دو متغیر به اون نام ها قبل از خط رو به رو اعلان کن، بعد روی اون ها عملیات ریاضی مورد نظرت رو انجام بده.

sa1378
جمعه 07 شهریور 1393, 12:23 عصر
آره اونجا باید بجای i بنویسم j


درست شد ممنون

sa1378
جمعه 07 شهریور 1393, 12:23 عصر
قبل از این خط:
#define C (i*i)+(j*j)
من متغیری به نام i و j که قبل از خط رو به رو اعلان شده باشن نمی بینم.
اول دو متغیر به اون نام ها قبل از خط رو به رو اعلان کن، بعد روی اون ها عملیات ریاضی مورد نظرت رو انجام بده.

فکر نکنم مشکلی باشه
چون میاد دقیقا اینو توی متن قرار میده و اونجایی که من نوشتمش قبلا تعریف شده

motherboard
جمعه 07 شهریور 1393, 12:34 عصر
من هیچ وقت مفهوم زمان اجرا رو در ساختمان داده نفهمیدم.و با حفظ کردن اون درس رو پاس کردم!!!! زمان اجرا یعنی چی؟یعنی مثلا میاد زمان کامپایل برنامه رو به میلی ثانیه میگه؟؟؟!!!!

Coder#
جمعه 07 شهریور 1393, 12:47 عصر
فکر نکنم مشکلی باشه چون میاد دقیقا اینو توی متن قرار میده و اونجایی که من نوشتمش قبلا تعریف شده
خب تو که اونجا رو به من نشون ندادی. من چیزی رو گفتم که می بینم.
درضمن، کُدها هوشمندانه نوشته نشدن. اصلا.

#target
جمعه 07 شهریور 1393, 13:42 عصر
قبل از این خط:
#define C (i*i)+(j*j)
من متغیری به نام i و j که قبل از خط رو به رو اعلان شده باشن نمی بینم.
اول دو متغیر به اون نام ها قبل از خط رو به رو اعلان کن، بعد روی اون ها عملیات ریاضی مورد نظرت رو انجام بده.

#define اعلان و استفاده متغیرها نیست که نیاز باشه قبلش I و j تعریف باشه

مسعود اقدسی فام
جمعه 07 شهریور 1393, 13:47 عصر
من هیچ وقت مفهوم زمان اجرا رو در ساختمان داده نفهمیدم.و با حفظ کردن اون درس رو پاس کردم!!!! زمان اجرا یعنی چی؟یعنی مثلا میاد زمان کامپایل برنامه رو به میلی ثانیه میگه؟؟؟!!!!

مرتبه‌ی اجرایی محکی هست برای بررسی کارایی الگوریتم. یه مثال ساده بزنم:

فرض کنید قصد داریم بین n تا عنصیر یه آرایه دنبال یه عدد خاص بگردیم. ساده‌ترین روش اینه که از اول تا آخر رو پیمایش کنیم. یعنی حداکثر n‌ تا مقایسه لازمه. n تا مقایسه روی یه سیستم ممکنه 10‌میلی ثانیه طول بکشه و برای یه سیستم دیگه یک ثانیه و برای یکی دیگه یک میلی‌ثانیه. این سرعت مربوط به قدرت پردازنده و حافظه‌ی سیستم می‌شه. پس این اعداد برای ما زیاد هم مهم نیستن. چون نمی‌شه تشخیص داد که چقدر خوب یا بد هستن. اما اگه به جای n تا عنصر مثلا 10n عنصر داشته باشیم چه اتفاقی می‌افته؟ خب طبیعتا زمان تولید خروجی هم ده برابر می‌شه. این ده برابر شدن مستقل از این هست که یک میلی‌ثانیه طول می‌کشید یا یک ثانیه. پس من تا اینجا متوجه شدم که این روش جستجو خطی هست. یعنی k برابر شدن اندازه‌ی ورودی باعث k برابر شدن تعداد مقایسه‌ها و در نتیجه k‌برابر شدن زمان محاسبه‌ی خروجی می‌شه. اما اگه با جستجوی دودویی آشنا باشید می‌دونید که مرتبه‌ی اجرایی اون log n هست. اگه دقیق‌تر بخوایم بگیم لگاریتم در مبنای دو. این یعنی اینکه اگه اندازه ورودی k برابر بشه، اندازه خروجی فقط log k مقایسه اضافه می‌شه (و نه ضرب). چون که:
log(kn) = log k + log n

خب این تغییر خیلی عالی هست. مثلا اگه n = 1024 باشه روش اول 1024 مقایسه نیاز داره و روش دوم فقط log(2) 1024 = 10 مقایسه. اگه اندازه 8 برابر بشه روش اول 8 * 1024 مقایسه لازم داره و روش دوم فقط 10 + 3 = 13 مقایسه که نشون می‌ده روش دوم خیلی خیلی کاراتر هست.
نکته: روش دوم برای اجرایی شدن نیاز داره که آرایه از قبل مرتب باشه. مرتب کردن آرایه هم در بهترین حالت n log n هستش. که خب مرتبه رو بدتر از n حالت اول می‌کنه. اما این روش برای خودش کاربردای دیگه‌ای داره که خارج از بحث اینجاست.

Coder#
جمعه 07 شهریور 1393, 13:49 عصر
#define اعلان و استفاده متغیرها نیست که نیاز باشه قبلش I و j تعریف باشه
مقداری که به C داده شده از ناکجا آباد اومده. من در کُد بالا نمی بینم که i و j قبل از define# اعلان و مقداردهی شده باشن.

#target
جمعه 07 شهریور 1393, 13:52 عصر
مقداری که به C داده شده از ناکجا آباد اومده. من در کُد بالا نمی بینم که i و j قبل از define# اعلان و مقداردهی شده باشن.

آخه اون یک دستور پیش پردازنده است . یعنی این که از این به بعد در هر جای کد C بود بجاش کد (i*i)+(j*j) رو بذاره

مسعود اقدسی فام
جمعه 07 شهریور 1393, 13:59 عصر
مقداری که به C داده شده از ناکجا آباد اومده. من در کُد بالا نمی بینم که i و j قبل از define# اعلان و مقداردهی شده باشن.

اگه در مورد دستورات پیش‌پردازنده - Preprocessor Directives - کمی مطالعه کنید این سوء‌تفاهم براتون حل می‌شه.



http://www.cplusplus.com/doc/tutorial/preprocessor/

البته بهتر بود اینطوری نوشته بشه:



#define C(i,j) ((i*i)+(j*j))

int main() {

for (long long int i = 1; i <= 1000; i++)
{
for (long long int j = 1; j <= i; j++)
{

if (C(i,j) == 1997 * (i - j))
{
cout << i << " " << j << endl;
}
}
}


return 0;
}


اینطوری خوانایی کد بهتر بود.

navidmohammadi85
جمعه 07 شهریور 1393, 14:10 عصر
کامپیوتر در هر ثانیه 10 دستتور انجام میدهد و کامپیوتر دیگری در هر ثانیه 21 دستور انجام میدهد/کامپیوتر دوم چند
برابر سریعتر از کامپیوتر اول هست؟

Coder#
جمعه 07 شهریور 1393, 14:12 عصر
اگه در مورد دستورات پیش‌پردازنده - Preprocessor Directives - کمی مطالعه کنید این سوء‌تفاهم براتون حل می‌شه.

آخه اون یک دستور پیش پردازنده است . یعنی این که از این به بعد در هر جای کد C بود بجاش کد (i*i)+(j*j) رو بذاره
آغاز کننده موضوع اطلاعات کافی نداد و خبر نداشتم که یک دستور پیش پردازنده بود.
ممنون.

motherboard
جمعه 07 شهریور 1393, 14:48 عصر
آغاز کننده موضوع اطلاعات کافی نداد و خبر نداشتم که یک دستور پیش پردازنده بود.
ممنون.
استارتر کاملا موضوع رو بیان کرد.و اصلا اگه بر این زبان مسلط بودی با دیدن همون define باید بدونی که چی به چیه!! باور کن این رو برای تیکه انداختن نمیگم.چون من خودم به شخصه تو این زبان خبره نیستم.اما اینکه میگی استارتر اطلاعات کافی رو نداد رو اصلا قبول ندارم.استارتر تمام کد رو کامل نشون داد.while جان دوستت داریم.راستی دل من برای اون تاپیک هایی که حالت سرگرمی و مسابقه داشت تنگ شده.باز هم از اون تاپیک ها بذار.اما به شرط اینکه دیگه قهر نکنی و بری.یادمه اخرین بار سر موضوع متغیرهای پویا با یک کاربری بحثت شد و از همه خداحافظی کردی.

sa1378
جمعه 07 شهریور 1393, 17:00 عصر
خب تو که اونجا رو به من نشون ندادی. من چیزی رو گفتم که می بینم.
درضمن، کُدها هوشمندانه نوشته نشدن. اصلا.

من فقط برای پیدا کردن جواب یه معادله این کد رو نوشتم
لازم نیست خیلی هوشمندانه باشه

ciavosh
جمعه 07 شهریور 1393, 20:32 عصر
سلام زمان اجرای این مگه O(n^2) نیست؟
پس چرا هرچی میگذره اهیچی چاپ نمیشه؟
#include <iostream>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
#define C (i*i)+(j*j)
int main() {

for(long long int i=1;i<=1000;i++)
{
for(long long int j=1;i<=i;j++)
{

if (C==1997*(i-j))
{
cout<<i<<" "<<j<<endl;
}
}
}


return 0;
}

چقدر منتظر شدی؟:لبخند:
در ++C نباید تا حد امکان از مکرو استفاده کرد.

motherboard
جمعه 07 شهریور 1393, 20:38 عصر
چقدر منتظر شدی؟:لبخند:
در ++C نباید تا حد امکان از مکرو استفاده کرد.
چرااااااااا؟؟؟!!!!!!!! :بامزه:
حالا واقعا چرا نباید استفاده کرد؟ :بوس:

ciavosh
جمعه 07 شهریور 1393, 20:47 عصر
چرااااااااا؟؟؟!!!!!!!! :بامزه:
حالا واقعا چرا نباید استفاده کرد؟ :بوس:

شد یکی یه چیزی بگه تو نگی چرا؟ اینو دیگه خودتم یکم فکر کنی متوجه میشی. نمونه این که خوندن کد رو سخت میکنه (Coder). به جاش از توابع باید استفاده بشه.

a.r.khoshghalb
جمعه 07 شهریور 1393, 23:43 عصر
شد یکی یه چیزی بگه تو نگی چرا؟ اینو دیگه خودتم یکم فکر کنی متوجه میشی. نمونه این که خوندن کد رو سخت میکنه (Coder). به جاش از توابع باید استفاده بشه.

مشکلی که برای Coder پیش اومد بخاطر ضعف ایشون بود، کسی که سی پلاس پلاس بلد باشه میدونه define یک دستور Pre-Compile هست.
من هم برام سوال پیش اومد که آقا ciavosh (http://barnamenevis.org/member.php?339838-ciavosh) چرا باید تا حد ممکن از ماکرو استفاده نکرد؟!
قطعا در شرایط مختلف فرق داره و ابدا نباید مثه آقای sa1378 کاراکتر C رو به چیزی define کنیم(!!) ولی به نظر اومد حرف شما خیلی کلیه.
ممنون میشم بیشتر توضیح بدید.

ciavosh
شنبه 08 شهریور 1393, 00:02 صبح
مشکلی که برای Coder پیش اومد بخاطر ضعف ایشون بود، کسی که سی پلاس پلاس بلد باشه میدونه define یک دستور Pre-Compile هست.
من هم برام سوال پیش اومد که آقا ciavosh (http://barnamenevis.org/member.php?339838-ciavosh) چرا باید تا حد ممکن از ماکرو استفاده نکرد؟!
قطعا در شرایط مختلف فرق داره و ابدا نباید مثه آقای sa1378 کاراکتر C رو به چیزی define کنیم(!!) ولی به نظر اومد حرف شما خیلی کلیه.
ممنون میشم بیشتر توضیح بدید.
در واقع کسی که C هم بدونه میدونه define# چیه.
رجوع شود به کتاب "The C++ Programming Language (Special Edition) by Bjarne Stroustrup" قسمت 7.8 "Macros"

sa1378
شنبه 08 شهریور 1393, 00:22 صبح
ببین دوست عزیز
من توی برنامه نویسی خیلی فراموشی دارم
برای همین توی برنامه هام یه چیزایی رو پیچیده تر و مسخره تر مینویسم فقط برای اینکه اون مطلب رو یادم نره و ببینم اگه اونچیزی که مینویسم اشتباه دستوری داره درستش کنم
اون define هم همونجوری گذاشتم که چک کنم همینجوری باید نوشتش یا نه

تازه مشکل در همون پست اول آقای اقدسی فام حل شد

a.r.khoshghalb
شنبه 08 شهریور 1393, 00:40 صبح
ببین دوست عزیز
من توی برنامه نویسی خیلی فراموشی دارم
برای همین توی برنامه هام یه چیزایی رو پیچیده تر و مسخره تر مینویسم فقط برای اینکه اون مطلب رو یادم نره و ببینم اگه اونچیزی که مینویسم اشتباه دستوری داره درستش کنم
اون define هم همونجوری گذاشتم که چک کنم همینجوری باید نوشتش یا نه

تازه مشکل در همون پست اول آقای اقدسی فام حل شد

بله مشکل حل شد.
مخاطب پست من هم شما و مشکلت نبود، می خواستم ببینم آقای ciavosh رو چه حساب میگن نباید از ماکرو استفاده کرد؟

omid_kma
شنبه 08 شهریور 1393, 01:40 صبح
البته ماکرو هم استفاده های خاص خودش رو داره
این رو بینید http://stackoverflow.com/questions/87372/check-if-a-class-has-a-member-function-of-a-given-signature/16867422#16867422 این کار بدون ماکرو قابل انجام نیست
این یک مثال دیگه http://www.boost.org/doc/libs/1_55_0/doc/html/foreach.html
البته استفاده از ماکرو به اون شکلی که سازنده تاپیک استفاده کردن کاملا کار اشتباهی هستش .

motherboard
شنبه 08 شهریور 1393, 14:44 عصر
جهت اطلاع:
دوستان در مورد این تاپیک (http://barnamenevis.org/showthread.php?467113-%D8%A7%DB%8C%D8%A7-%DA%A9%D8%A7%D8%B1-%DA%A9%D8%B1%D8%AF%D9%86-%D8%AF%D8%B1-%DB%8C%DA%A9-%DA%AF%D8%B1%D9%88%D9%87-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-%D9%86%D9%88%DB%8C%D8%B3%DB%8C-%D9%86%DB%8C%D8%A7%D8%B2-%D8%A8%D9%87-%D8%AF%D8%A7%D8%B4%D8%AA%D9%86-%D9%85%D8%AF%D8%B1%DA%A9-%D8%B1%D8%B4%D8%AA%D9%87-%DA%A9%D8%A7%D9%85%D9%BE%DB%8C%D9%88%D8%AA%D8%B1-%D8%A7%D8%B3%D8%AA%D8%9F) هر نظری دارند بیان کنند.پست حاضر صرفا جهت راهنمایی کاربران به تالار مروبطه است و بعد از مدتی کوتاه حذف خواهد شد.ممنون.

Niaz5711
چهارشنبه 12 شهریور 1393, 06:34 صبح
سلام
نمیدونم جایی درستی سوالم رو مطرح می کنم یا نه ...
من کد برنامه ای دارم که میخوام زمان اجرای ان را با تابع ftime محاسبه کنم ، این برنامه از 8 thread استفاده می کنه برای شمردن اعداد اول یه ماتریس 1024 *1024
سوال : می تونین لطفا راهنمایی کنید چگونه از این تابع استفاده کرد ؟

Ananas
چهارشنبه 12 شهریور 1393, 16:18 عصر
مکرو یکی قابلیت های مهم c++ هست. چرا نباید استفاده کرد؟!
اگه به جاش استفاده بشه خیلی هم خوبه. من فک کردم میخای بگی تا میتونید از مکرو استفاده کنید مگر اینکه نشه!