loading...
دانلود سرای دانشجویی
 

دستور if-else

معمول ترین نوع ساختار تصمیم گیری if است. یک دستور if می گوید "اگر شرطی برقرار است کد معینی را انجام بده". دستور if-else به دو شکل می تواند باشد: همراه با else يا بدون آن.

if(expression)
   {
   statement
   }

يا

if(expression)
   {
   statement
   }
else
   {
   statement
   }

بدنبال کلمه if یک پرانتز می آید که عبارت شرط در آن قرار دارد و يک مقدار بولين false يا true توليد می کند (در C به صورت صفر و غير صفر ارزيابی می شود). با درست و غلط بودن عبارت شرطی مسير اجرا تعيين می شود. اگر درست باشد دستور بعد از if اجرا می شود. اگر else وجود داشته باشد در صورت برقرار نبودن شرط دستور بعد از else اجرا می شود.


مثال. شرط ساده.

if(age==18)
   {
   cout <<"Yahoo…. You old enough to drive!n";
   }

مثال. شرط کامل.

#include <iostream>

int main()
{
   cout << "Enter your age: ";
   int age;
   cin >> age;
   if(age < 20)
      {
      cout << "You are still young!n";
      }
   else
      cout << "You are not so young anymore.n";
}


ممکن است دستور if-else بدون محصور شدن در آکولاد بیاید. آکولاد محدوده بلاک کد را معین می کند. اگر بلاک کد تنها شامل یک دستور باشد کامپایلر فرض می کند اولین جمله بعد از if (يا بعد از else) بلاک کد است که باید اجرا شود.


مثال. در شرط زير وقتی شرط برقرار است فقط ;++y اجرا می شود. خط دوم جز دستور if نیست و صرفنظر از درست بودن شرط همواره اجرا می شود.

if(x == 7)
y++;
z++;


شرط موردنياز در دستور if توسط عملگرهای رابطه ای <، >، <=، >=، == و != ساخته می شود. دو يا چند شرط می توانند توسط عملگرهای منطقی &&( AND)، || (OR) و ! (NOT) با هم ترکيب شوند.


مثال. چند نمونه عبارت شرطی.

if (x>6)
if (x !=6)
if (5<j<10)
if (j== 5 && I == 6)
if (j<4 || j>10)


بخاطر داشته باشید که یک علامت مساوی عملگر انتساب است و دوتا مساوی عملگر هم ارزی به معنی "آیا مساوی است با". a==b درست است اگر a برابر با b باشد. a=b مقدار b را به a نسبت می دهد. یکی از بیشترین خطاهائی که مبتدیان می کنند استفاده از علامت = به جای = = است. اگر تک مساوی را استفاده کنید شرط if همیشه درست است.

اين بخش دستورات کنترلی که راهی برای کنترل اجرای برنامه ها در ++C هستند را می پوشاند. اين دستورات شامل دستورات شرطی if-else و switch و حلقه های تکرار while، do-while و for هستند.

دستور if-else
دستور switch
حلقه for
حلقه while
حلقه do-while
دستورات break و continue


ترتيب اجرای برنامه ها در ++C به صورت top-down است. بدين معنی که اجرا از ابتدای تابع ()main آغاز می شود دستور به دستور ادامه پيدا می کند تا به انتهای ()main برسد. دستورات کنترلی موجود در ++C اجازه تغيي ترتيب اجرای برنامه را می دهند.

دستورات شرطی که از ساختارهای تصمیم گیری هستند دستوراتی هستند که در صورت برقرار بودن شرطی دستوری را اجرا می کنند. دو دستور شرط در ++C وجود دارد: ‌if و switch.

مشارکت اجباری و اختياری

يک موجوديت در يک ارتباط می تواند به صورت اجباری (mandatory) يا اختياری (optional) شرکت کند.

اگر يک نمونه از يک موجوديت هميشه در يک رابطه مشارکت کند مشارکت اجباری است. اگر وجود يک نمونه موجوديت در ارتباط الزامی نباشد مشارکت اختياری است.

در نمودار ER، روی خط ارتباط، مشارکت اختياری توسط يک دايره در کنار موجوديتی که بطور اختياری در ارتباط شرکت کرده و مشارکت اجباری توسط يک خط عمودی در کنار موجوديتی که الزامی شرکت کرده نشان داده می شود.


مثال. هر پروژه بايد توسط يک شعبه مديريت شود. ممکن است شعبه ای باشد که پروژه ای را انجام نمی دهد.

ارتباط

موجودیت های هر محیط عملیاتی با هم ارتباطاتی دارند. ارتباط وابستگی بین چند موجودیت را نشان می دهد. یک ارتباط (relationship) یک وابستگی معنی دار بین دو يا چند نوع موجودیت مختلف است.

ارتباطات معادل افعال یا مفاهيمی نظیر خرید کردن، تعمیر کردن، عضو بودن، رئیس یک سازمان بودن هستند.

ارتباط در نمودار ER توسط خطوط مشخص می شود. نوع ارتباط ممکن است روی خط يا درون يک لوزی نوشته شود.

ممکن است موجودیت هائی داشته باشیم که توسط دو یا چند ارتباط متفاوت بهم مربوط شده اند.


مثال. استاد درس را تدريس می کند. درس توسط استاد تدریس می شود. تدريس ارتباط بين موجوديت استاد و درس را مشخص می کند.


درجه ارتباط

تعداد موجودیت هائی که در یک ارتباط شرکت می کنند درجه ارتباط (degree) نامیده می شود.

اگر دو نوع موجودیت به هم مربوط شوند ارتباط از درجه دو است و ارتباط دوتائی (binary) ناميده می شود

ارتباطات دوتائی معمولترين نوع در دنيای واقعی هستند.

اگر سه نوع موجودیت درگیر باشند ارتباط از درجه سه است و ارتباط سه تائی (ternary) نامیده می شود. ارتباطات سه تائی اکثرا به دو يا چند ارتباط دوتائی تجزيه می شود


مثال. يک فروشنده محصولی را به يک مشتری می فروشد. اين يک ارتباط از درجه 3 است.

اين ارتباط سه تائی را می توان به چند ارتباط دو تائی تجزيه کرد. موجودیت جدیدی را با نام فروش جایگزین ارتباط می فروشد می شود. حالا فروشنده می تواند به مشتری پیوند بخورد.


يک ارتباط بازگشتی وقتی اتفاق می افتد که يک موجوديت به خودش مربوط می شود.


مثال. کارمندان با کارمندان همکاری می کنند.

 

یک موجودیت توسط صفات خاصه خود توصيف می شود. یک صفت خاصه (attribute) یک ویژگی ازموجودیت است. کلیه داده های مربوط به هر موجودیت در صفات خاصه اش نگهداشته می شود.

صفات خاصه در مدل های ER به صورت بیضی هائی متصل به موجودیت خود ظاهر می شوند.


مثال. صفات خاصه يک دانشجو می تواند شامل شماره دانشجوئی، نام، نام خانوادگی، آدرس، سال تولد، رشته تحصيلی و غيره باشد.


هر نوع موجودیت می تواند تعداد زیادی صفت خاصه داشته باشد و اگر همه آنها در نمودار ER نمایش داده شود نمودار گیج کننده می شود، بنابراين تنها صفاتی نمايش داده می شود که اطلاعی را به ER اضافه می کند.

يک نمونه خاص از يک صفت خاصه يک مقدار است. دامنه (domain) يک صفت خاصه مجموعه مقادير ممکن است که يک صفت خاصه می تواند داشته باشد.


مثال. دامنه صفت خاصه نام يک دانشجو يک رشته کاراکتری است.


صفت خاصه می توانند ساده يا مرکب باشد. صفات خاصه مرکب از چند صفت خاصه ديگر تشکيل شده است.


مثال: صفت خاصه مرکب مانند اجزای آدرس.


کلید

کليد ها مشخصه منحصر بفرد يک موجوديت است. یک کلید (key) يک يا ترکيب چند صفت خاصه از موجوديت است که یک نمونه منحصربفرد از موجودیت را مشخص می کند.

مثال. يک فرد ممکن است توسط شماره شناسنامه اش يا توسط نام+نام و خانوادگی+آدرس مشخص شود.

در نمودار ER زیر صفت خاصه کلید یک خط کشیده می شود.

مدل ER ابزاری برای طراحی پايگاه داده است که موجوديت ها و ارتباطات بين آنها را در يک نمودار نشان می دهد.

موجودیت
صفت خاصه
ارتباط
کاردینالیتی
مشارکت اجباری و اختياری
مراحل ساخت مدل ER


مدل موجودیت-ارتباط (Entity-Relationship) يا مدل ER توسط Peter Pin-Shan Chen از انستیتو تکنولوژی ماساچوست (MIT) در سال 1976 طراحی شد.

مدل ER مدل ادراکی داده است که دنیای واقعی را به صورت موجودیت ها و وابستگی های بین آنها می بیند.

در مدل ER ساختار پایگاه داده به صورت یک دیاگرام به تصویر کشیده می شود که ارتباط منطقی موجودیت ها را به صورت يک نمودار ترسيمی نمايش می دهد.

مدل ER به عنوان ابزاری برای طراحی پایگاه داده بسیار موفق است و کمک بسیار خوبی برای طراحی، پيآده سازی، بهینه سازی و اشکالزدائی برنامه های پایگاه داده است.

ساختارهائی که در مدل ER استفاده می شوند براحتی به جداول رابطه ای تبدیل می شوند.

مدل ER مستقل از سخت افزار و DBMS است.

اجزای نمودار ارتباط-موجودیت

يک دياگرام ER از اجزای زير تشکيل شده است:

• موجودیت
• صفات خاصه
• ارتباط
• کارديناليتی

فرم های نرمال

تئوری پايگاه داده درجه نرمالسازی جدول را با اصطلاح فرم های نرمال(normal form) شرح می دهد. فرم های نرمال (يا بطور خلاصه NF) معياری برای تعيين درجه نرمال جدول دراختيار می گذارد.

فرم های نرمال جداگانه روی هر جدول می توانند بکار بروند. پايگاه داده زمانی در فرم نرمال n خواهد بود که کل جداول آن در فرم نرمال n باشند.

فرم های نرمال عبارتند از:

• First Normal Form (1NF)
• Second Normal Form (2NF)
• Third Normal Form (3NF)
• Forth Normal Form (4NF)
• Boyce/Codd Normal Form (BCNF)
• Fifth Normal Form (5NF)
• Domain/Key Normal Form (DKNF)

اگر فرم اول نرمال در جدولی مشاهده شود اصطلاحا آنرا در فرم اول نرمال (1NF) می نامند. اگر سه فرم اول نرمال ديده شود آنرا در فرم سوم نرمال (3NF) درنظر می گيرند. جدولی که دارای فرم نرمال درجه بالاتر باشد فرم های نرمال درجه پائين تر را هم دارا می باشد. بنابراين مثلا اگر جدولی 3NF باشد 2NF و 1NF هم هست. ولی عکس اين صحت ندارد.

توجه داشته باشيد که نرمالسازی يک فرآيند تکراری نيست. يک جدول ممکن است در يک مرحله به فرم سوم نرمال دربيايد. بعلاوه اگر 3NF باشد به احتمال بسيار زياد 5NF هم خواهد بود.

فرم نرمال هريک باعث کاهش بيشتر افزونگی و تقسيم جداول به واحدهای کوچکتر می شوند. سه فرم اول نرمال (1NF، 2NF و 3NF) در ابتدا توسط Codd تعريف شد که به طور خلاصه وابستگی صفات خاصه غير کليد را به کليد الزام می کنند. فرم های چهارم و پنجم (4NF و 5NF) با ارتباطات چند به چند و يک به چند بيت صفات خاصه سروکار دارند. دو فرم ديگر هم وجود دارد که کاملا با اين جريان جور نمی شوند که BCNF و DK/NF هستند.

در برنامه های کاربردی اغلب 1NF، 2NF و 3NF و گاهی 4NF و 5NF ديده خواهند شد 5NF بندرت مشاهده می شود به همين دليل در اينجا توضيح داده نمی شود.


 First Normal Form

يک جدول در فرم اول نرمال (1NF) است اگر و فقط اگر فاقد گروه داده تکرار شونده باشد. به عبارت ديگر هر ستون در جدول دارای مقدار اتميک باشد.

در مدل رابطه ای هر جدولی حداقل در فرم اول نرمال هست زيرا از الزامات مدل اين است که هر جدول شامل دقيقا يک مقدار برای هر صفت خاصه باشد که اصطلاحا "فاقد گروه تکرار شونده" گفته می شود.


مثال. جدول ALL_SALES که اطلاعات فروش را نگهداری می کند درنظر بگيريد. اين جدول در فرم اول نرمال هست چون هيچ کدام از ستون ها چندمقداری نيستند بنابراين نيازی نيست روی جدول کاری انجام دهيم بجز اينکه يک کليد انتخاب نمائيم. ترکيب غير تکراری ProductNo+CustomerNo+SaleNo را می توان کليد اصلی درنظر گرفت.

ALL_SALES(SaleNo, ProductNo, CustomerNo, SaleDate, QtyInStock, Description, Price, Customer_Name, Customer_Address, CreditLimit, Amount, Salesrep)


 Second Normal Form

يک جدول در فرم دوم نرمال (2NF) است اگر اولا 1NF باشد و ثانيا کليه ستون های غيرکليد با کليد اصلی وابستگی تابعی کامل داشته باشند.

ستون Y با ستون X در يک رابطه وابستگی تایعی (functional dependency) دارد اگروفقط اگر به ازای هر مقدار در X دقيقا يک مقدار در Y متناظر با آن وجود داشته باشد. که به صورت X→Y نشان داده می شود.

مثال. در جدول ALL_SALES مثال قبل، Customer_Address با CustomerNo وابستگی تابعی دارد، زيرا يک مشتری خاص تنها با يک آدرس مربوط است. توجه کنيد که عکس آن برقرار نيست و چند مشتری ممکن است در يک آدرس زندگی کنند. بنابراين يک آدرس ممکن است با بيش از يک شماره مشتری در ارتباط باشد. اگر مشتری بيش از يک آدرس داشته باشد ديگری وابستگی تابعی با شماره مشتری ندارد.

ستون Y روی مجموعه صفات خاصه X وابستگی تابعی کامل (Full functional dependency) دارد اگر روی X وابستگی تابعی داشته باشد و با هيچ زيرمجموعه ای از X وابستگی تابعی نداشته باشد.

مثال. در جدول ALL_SALES مثال قبل آدرس مشتری وابستگی کامل با SaleNo، ProductNo و CustomerNo دارد ولی وابستگی تابعی کامل ندارد چون با CustomerNo وابستگی تابعی دارد.

توجه کنيد اگر کليدهای کانديد در جدول ترکيبی نباشند يعنی تنها شامل يک ستون باشند بلافاصله می گوئيم جدول 2NF است.


مثال. جدول ALL_SALES را درنظر بگيريد:

ALL_SALES(SaleNo, ProductNo, CustomerNo, SaleDate, QtyInStock, Description, Price, Customer_Name, CreditLimit, Amount, Salesrep)

مشاهده می شود بعضی از ستون ها بهم مرتبط هستند و توسط بخشی از کليد مشخص می شوند. به عبارت ديگر بعضی ستون ها با زيرمجموعه ای از کليد وابستگی تابعی دارند:

ProductNo → {Description, ReorderLevel, Price, QtyInStock}
CustomerNo → {Customer_Name, CreditLimit}
SaleNo → {Date, CustomerNo, ProductNo, Qty, Amount, Salesrep}

با جدا کردن اين ستون ها به جداول جداگانه به فرم دوم نرمال می رسيم.

PRODUCT(ProductNo, Description, Price, QtyInStock)
CUSTOMER(CustomerNo, Customer_Name, CreditLimit)
SALE(SaleNo, Date, CustomerNo, ProductNo, Qty, Amount, Salesrep)


 Third Normal Form

يک جدول در فرم سوم نرمال (3NF) است اگر اولا 2NF باشد، ثانيا کليه صفات خاصه غير کليد در جدول با کليد اصلی وابستگی تابعی غير تعدی داشته باشند.

وابستگی تعدی (transitive dependency) يک وابستگی تابعی غير مستقيم است که در آن X→Z است اگر X→Y و Y→Z باشد.

در فرم سوم نرمال کليه ستون های جدول مستقيما توسط کليد اصلی مشخص می شوند. با حذف فيلدهائی که وابستگی مستقيم با کليد ندارند به فرم سوم نرمال می رسيم. برای اين کار گروهی از ستون های جدول را که مقدارشان برای بيش از يک رکورد تکرار می شود را در جدول جداگانه ای قرار دهيد.


مثال. فرض کنيد جدول PRODUCT به صورت زير جزئيات توليد کننده هر محصول را دارا باشد:

PRODUCT(ProductNo, Description, ReorderLevel, Price, QtyInStock, SupplierCode, SupplierName, SupplierAddress)

اين جدول کليد اصلی تک ستونی دارد بنابراين 2NF است. اگر توليد کننده چندين محصول را توليد کند فيلدهای SupplierName و SupplierAddress برای هر محصول تکرار می شود زيرا وابستگی تعدی با کليد اصلی دارند.

ProductNo → SupplierCode → {SupplierName, SupplierAddress}

با حذف اين ستون ها و تقسيم جدول به صورت زير به فرم سوم نرمال می رسيم. توجه کنيد که SupplierCode در جدول PRODUCT به عنوان کليد خارجی باقی می ماند.

PRODUCT(ProductNo, Description, ReorderLevel, Price, QtyInStock, SupplierCode)
SUPPLIER(SupplierCode, SupplierName, SupplierAddress)


رسيدن به فرم سوم نرمال اگرچه مطلوب است ولی هميشه عملی نيست. جداول متعدد باعث تنزل کارائی پرس و جوها می شود. بنابراين ممکن است فرم سوم تنها روی ستون هائی از جدول که زياد تغيير می کنند اعمال شود و برای فيلدهای وابسته ای باقی مانده برنامه به نحوی طراحی می شود که کاربر ملزم باشد کليه فيلدهای مرتبط را درهراصلاح بازبينی کند.

 Fourth Normal Form

يک جدول در فرم چهارم نرمال (4NF) است اگر اولا 3NF باشد، ثانيا هيچ ستونی در جدول وابستگی چند مقداری نداشته باشد.

وابستگی چندمقداری (multivalued dependency) به اين معنی است که حضور رکوردهای معينی در جدول وجود رکوردهای معين ديگری را برساند.


مثال. اگر مشتريانی با چند آدرس داشته باشيم (که در محيط تجارت عادی است)، در جدول CUSTOMER نمی توانيم چند ستون آدرس را اضافه کنيم چون تعداد آدرس های ممکن را نمی دانيم. بنابراين ناگزير به اضافه کردن رکورد جديد برای هر آدرس مشتری هستيم که باعث تکرار و افزونگی داده می شود. زيرا CustomerNo ديگر تنها يک آدرس را معين نمی کند بلکه مجموعه ای از آدرس های را نشان می دهد به عبارت ديگر وابستگی چندمقداری دارد. با حذف چنين وابستگی هائی و تقسيم جدول به صورت زير به فرم چهارم نرمال می رسيم.

CUSTOMER(CustomerNo, First, Last, CreditLimit)
CUSTOMER_ADDRESS(CustomerNo, Address)

حالا هر مشتری می تواند هر تعداد آدرسی را داشته باشد.

معايب نرمالسازی

نرمالسازی تکنيک مهمی برای طراحی پايگاه داده های کارآمد است اما در ضمنی که افزونگی داده را کاهش می دهد سبب کاهش اجرای سيستم می شود. درجات بالای نرمال معمولا جدوال بيشتر را می طلبند. برای پاسخ به پرس و جوها گاهی بايد کليه جداول تقسيم شده دوباره با هم الحاق شوند که در کاربردهائی که زمان پاسخ مهم است (نظير وب) مطلوب نيست.

بالاترين سطح نرمالسازی با توجه به عمليات کاربردی درنظر گرفته می شود. در پايگاه داده هايی که بيشتر خواندنی هستند و افزونگی داده در آنها مشکل حادی نيست، مانند داده های کاتالوگ يک سايت تجارت الکترونيکی، می توان سطح نرمالسازی را کاهش داد. به اين عمل denormalization می گويند. از طرف ديگر در کاربردهائی که درگير داده های مهم مانند داده های مالی هستند که دائما در حال تغييرند و بايد سازگار باقی بمانند، احتمالا سعی می شود به سطوح بالاتر نرمال برسند حتی اگر سرعت پايگاه داده کم شود.

گاهی با توجه به وضعيت ممکن است داده ها از چند پايگاه داده نرمال شده استخراج شوند و در يک انبار داده غير نرمال قرار گيرد. اين روش برای مخزن داده Data warehouse استاندارد خوبی است

INT

دستورالعمل (interrupt) int يک روتين وقفه را فراخوانی می کند. فرم کلی آن به صورت زير است:

int n

n شماره وقفه موردنظر و مقداری بين 0 تا 255 است که اجازه فراخوانی 256 روتين مختلف وقفه را می دهد.

دستورالعمل int يک فراخوانی سيستمی را می سازد و شکل خاصی از دستورالعمل فراخوانی يک زيربرنامه (دستورالعمل call) است.

مشکل دستورالعمل int اين است که تنها 256 روتين وقفه را می تواند پشتيبانی کند. درحاليکه DOS به تنهايی دارای بيش از 100 سرويس مختلف وقفه و BIOS بيش از هزاران سرويس وقفه است. که اين تعداد بيش از کليه وقفه هايی است که توسط اينتل رزرو شده است. برای حل اين مشکل از يک شماره وقفه برای هر دسته از سرويس های وقفه و يک شماره تابع برای تعيين سرويس موردنظر استفاه می شود. شماره تابع توسط يکی از ثبات ها (اکثرا AH) هنگام فراخوانی وقفه ارسال به روتين وقفه می شود.


مثال. سيستم عامل DOS شماره وقفه 21h را بکار می گيرد. برای انتخاب يک تابع خاص، قبل از فراخوانی وقفه، کد تابع در ثبات AH قرار می گيرد. برای نمونه تابع 4Ch اين وقفه برای خاتمه برنامه و برگشت به محيط DOS فراخوانی می شود.

mov AH, 4Ch
int 21h

ارسال و دريافت پارمترها

پارامترها مقاديری هستند که می توانيد به زيربرنامه بدهيد يا بگيريد. برای ارسال يا دريافت پارامترها معمولا از ثبات، متغيرهای سراسری يا پشته استفاده می شود.

ارسال پارامتر از طريق ثبات

مثال. زيربرنامه زير طول يک رشته را محاسبه و در ثبات CX برمیگرداند. آدرس شروع رشته در ثبات SI قرار دارد.

StrLen PROC
           push SI
           mov CX,0
Whl:   cmp Byte Ptr[SI],'$'
           jc EndW
           inc CX
           inc SI
           jmp Whl
EndW: pop SI
           ret
StrLen ENDP

ارسال پارامتر از طريق پشته

پارامترهائی که به زيربرنامه داده می شوند را می توان قبل از فراخوانی زيربرنامه در پشته اضافه کرد. پارامترها در زيربرنامه pop نمی شوند بلکه مستقيما از پشته دسترسی می شوند زيرا قبل از دستور call در پشته اضافه شده اند و آدرس برگشتی بعد از آن اضافه می شود. علاوه براين چون ممکن است در چندين جای زيربرنامه استفاده شوند معمولا درون ثبات نگهداری نمی شوند و بهتر است در حافظه پشته باقی بمانند.

يک برنامه خارجی که يک پارامتر از طريق پشته را ارسال می کند در نظربگيريد. وقتی زيربرنامه درخواست می شود پارامتر می تواند با آدرس دهی غيرمستقيم [SP+4] دسترسی شود. اگر پشته هم در زيربرنامه برای ذخيره داده استفاده شود عدد بيشتری بايد به SP اضافه شود. ثبات BP را برای ارجاع به داده های درون پشته می توان به کار برد. ثبات SP با هر push و pop تغيير می کند اما BP ابتدا برابر با SP می شود و سپس ثابت می ماند در انتهای زيربرنامه مقدار اوليه BP بايد برگردانده شود. بعد از اينکه زيربرنامه تمام شد پارامترهائی که در پشته اضافه شده اند بايد حذف شوند.


مثال. تابع زير طول رشته را محاسبه و آدرس شروع رشته از طريق پشته به زيربرنامه ارسال می شود.

StrLen PROC
           push BP
           mov BP,SP
           mov SI,[BP+4]
           sub CX,0
Whl:   cmp byte ptr [SI],'$'
           jc Endw
           inc CX
           inc SI
           jmp Whl
EndW: pop BP
           ret
StrLen ENDP

مثال. محاسبه مجموع سه عدد که از طريق پشته به زيربرنامه ارسال شده اند

تعداد صفحات : 425

اطلاعات کاربری
آمار سایت
  • کل مطالب : 4247
  • کل نظرات : 0
  • افراد آنلاین : 7
  • تعداد اعضا : 2927
  • آی پی امروز : 47
  • آی پی دیروز : 247
  • بازدید امروز : 160
  • باردید دیروز : 1,446
  • گوگل امروز : 0
  • گوگل دیروز : 24
  • بازدید هفته : 6,402
  • بازدید ماه : 34,300
  • بازدید سال : 249,679
  • بازدید کلی : 8,428,373
  • کدهای اختصاصی