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

قالب بندی خروجی

وقتی عددی نمايش داده می شود صفات زير مورد نظر است:

• مقدار فضای مورد نياز برای عدد روی صفحه
• چپ چين يا راست چين بودن ( اعداد تمايل به راست چين دارند)
• تعداد ارقام اعشار
• علامت برای اعداد منفی
• نمای علمی برای اعداد بزرگ

اين صفات توسط شئ cout و توابع کتابخانهiomanip قابل تنظ‍يم هستند.

در C با استفاده از فرامين فرمت مانند %d در تابع printf() قادر به فرمت بندی خروجی هستيم. در C++ فرمت بندی خروجی به طريق متفاوتی از طريق اضافه کردن دستکاری کننده ها (manipulators) به جريان خروجی انجام می گيرد.

manipulator تابعی است که می تواند خصوصيات جريان خروجی را تغيير بدهد. manipulator می توانند به جريان های ورودی يا خروجی اضافه شوند.


مثال.endl خط را تمام می کند و خط جديد را شروع می کند.

cout << endl;
cout << "Some Text" << endl << endl; // Two blank lines


تابع به صورت زير هم می تواند استفاده شود.

endl(cout);

کلاس ostream که برای خروجی استفاده می شود خود از کلاس ios مشتق شده است که از ios_base گرفته شده است. کلاس اخير توابع عمومی را برای دستکاری کننده ها تعريف می کند.

کلاس iostream از ostream و istream ارث بری دارد بنابراين مثال های cout می توانند iostream را استفاده کنند.

انواع دستکاری کننده ها

اکثر دستکاری کننده ها در اعلان شده اند اما endl، ends و flush از می آيند. بعضی يک پارامتر می گيرند و از می آيند.

دستکاری کننده های کتابخانه :

• endl – خط را خاتمه داده و flush را صدا می زند.
• ends – کاراکتر '' (NULL) را در جريان درج می کند.
• flush – بافر را بلافاصله به خروجی می فرستد.

دستکاری کننده های کتابخانه که بيشتر آنها در ‌ اعلان شده اند:

• boolalpha – درج يا استخراج اشيای بولين مانند.
• noboolalpha – درج يا استخراج اشيای بولين مانند مقادير درست و غلط.

• fixed – درج مقادير مميزشناور در فرمت ثابت.
• scientific – درج مقادير مميزشناور در فرمت علمی.

• internal – وسط چين
• left – چپ چين
• right – راست چين

• dec – درج يا استخراج مقادير صحيح در فرمت دهدهی.
• hex – درج يا استخراج مقادير صحيح در فرمت هگز.
• oct – درج يا استخراج مقادير صحيح در فرمت اکتال.

• showbase – مبنای مقدار را پيشوند آن می کند.
• noshowbase – مبنای مقدار را پيشوند نمی کند.
• showpoint – هميشه نقطه اعشار را هنگام درج مقدار اعشار نمايش می دهد.
• noshowpoint – نقطه اعشار را اگر لازم نيست نمايش نمی دهد.
• showpos – اگر عدد مثبت است علامت بعلاوه (+) را درج می کند.
• noshowpos – اگر عدد مثبت است علامت بعلاوه (+) را درج نمی کند.
• skipws – از روی فاصله ها می پرد.
• noskipws – از روی فاصله ها نمی پرد.
• uppercase – حروف کوچک را با حروف بزرگ جايگزين می کند. تنها روی خروجی توليد شده مانند اعداد هگز تاثير دارد.
• nouppercase – حروف کوچک را با حروف بزرگ جايگزين نمی کند.

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

تنظيم فلگ مستقيما توسط ()cout.setf قابل انجام است و توسط ()cout.unsetf خنثی می شود. اين توابع متعلق به کتابخانه هستند.

تابع setf به دو صورت می تواند استفاده شود:

setf( flagvalues);
setf( flagvalues, maskvalues);
unsetf( flagvalues);


مثال. برای قالب بندی خروجی به صورت scientific، uppercase و boolalpha پارامترها برای تنظيم بيت ها به صورت زير ارسال می شود:

cout.setf( ios_base::scientific | ios_base::uppercase | ios_base::boolalpha) ;
cout << hex << endl;
cout << 1234 << endl;
cout << dec << endl;
cout << 123400003744.98765 << endl;
bool value=true;
cout << value << endl;
cout.unsetf( ios_base::boolalpha) ;
cout << value << endl;

خروجی به صورت زير توليد می شود:

4D2
1.234000E+011
true
1


هر کاراکتری را می توان توسط casting به خروجی ارسال کرد. برای مثال Char(27) کاراکتر escape را ارسال می کند.


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


مثال.

#include <iostream>

int main()
{
   cout << "This is far too long to put on a "
   "single line but it can be broken up with "
   "no ill effectsnas long as there is no "
   "punctuation separating adjacent character "
   "arrays.n";
   return 0;
}


• unitbuf – بافر را بعد از درج خالی می کند.
• nounitbuf – با را بعد از هر درج خالی نمی کند.

پروتکل

يک پروتکل (protocol) مجموعه ای از قوانين است که تعيين می کند چگونه کامپيوترها بتوانند با هم ارتباط برقرار کنند.

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

پروتکل ها در لايه های مختلف يک ارتباط دور وجود دارند. مجموعه ای از لايه ها و پروتکل ها را معماری شبکه می نامند. ليستی از پروتکل هائی که توسط هر لايه استفاده می شود را پشته پروتکل (protocol stack) می گويند. يک معماری مهم که پشته پروتکل نيز هست TCP/IP است.


TCP/IP

TCP/IP يک پروتکل ارتباطی برای اينترنت است که مجموعه ای از قوانين را تعريف می کنند که کامپيوترهائی که می خواهند روی اينترنت با هم ارتباط برقرار کنند بايد از آنها پيروی کنند.

مرورگرها و سرورها برای اتصال به اينترنت از TCP/IP استفاده می کنند. مرورگر برای دسترسی به سرور و سرور برای ارسال صفحات وب به مرورگر از TCP/IP استفاده می کند.

TCP/IP بر اساس مدل کلاينت/سرور است يعنی در آن يک کاربر کامپيوتر (client) درخواستی می کند و سرويسی مانند يک صفحه وب توسط کامپيوتر ديگری در شبکه (server) آماده و به آن ارائه می شود.

پشته پروتکل TCP/IP از لايه های متعدد ساخته می شود که هر لايه وظيفه خود را دارد و پيچيدگی های لايه زيرين خود را می پوشاند. بدينوسيله برنامه نويسان می توانند بدون درنظر گرفتن پيچيدگی های انتقال داده از يک ماشين به ديگر تنها روی برنامه خود متمرکز شوند.

شکل زير بعضی از لايه های مهم را در يک ارتباط اينترنت نشان می دهد.

دو پروتکل مهم که کل اينترنت روی آن اجرا می شود TCP و IP است. اين دو پروتکل کليه نيازهای ارسال و دريافت داده روی شبکه های گسترده را برآورده می کنند. TCP مسئول شکستن پيغام ها به بسته های کوچک تر قابل حمل (packet) قبل از ارسال روی اينترنت و سوارکردن مجدد آنها در مقصد است.

IP، لايه زيرين TCP، آدرس دهی هر بسته را مديريت می کند تا به مقصد درست برسد. هر کامپيوتر مسيرياب (gateway يا router) در شبکه آدرس بسته را بررسی می کند تا ببينند پيغام را به کجا بايد بفرستد. بسته های يک پيغام گاهی از مسيرهای مختلف می روند و در مقصد همگی با هم اسمبل می شوند.

لايه فيزيکی سخت افزارها (کابل ها، کارتهای شبکه و غيره ) و درايورها هستند.

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

برنامه های کاربردی که استفاده می کنيم در لايه کاربرد هستند. HTTP و FTP از پروتکل های اين لايه هستند. هر برنامه کاربردی دارای يک شماره پورت است. پورت در حقيقت يک فضای حافظه است که برنامه برای اتصالات شبکه خود از آن استفاده می کند. پورت ها می توانند از 0 تا 65535 شماره گذاری شوند. HTTP معمولا از پورت 80 استفاده می کند. FTP دو پورت مجزای 20 و 21 به ترتيب برای ارسال و دريافت دارد.

برنامه های کاربردی بر اساس TCP/IP يک مجموعه stateless هستند. چون هر درخواست مشتری يک درخواست جديد بدون ارتباط با درخواست قبلی درنظر گرفته می شود (برخلاف مکالمات عادی تلفنی که احتياج به يک اتصال اختصاصی درطی تماس هست). stateless بودن مسيرهای شبکه را آزاد می کند بنابراين هرکسی می تواند از آنها به طور مداوم استفاده کند. توجه کنيد TCP خودش stateless نيست و روی يک پيغام متمرکز است و تا وقتی که کليه بسته های پيغام دريافت شود اتصال آن باقی می ماند.

اساس ارتباطات اينترنتی TCP/IP است. پروتکل ها و آدرس دهی اينترنت و برخی مفاهيم در اين زمينه در اين صفحه خلاصه شرح داده می شوند.

پروتکل
TCP/IP
پروتکل های اينترنت
آدرس های اينترنت

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

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

اشيای cout و cin در C++ برای ارسال خروجی به صفحه نمايش و دريافت مقادير از صفحه کليد استفاده می شوند. اين توابع در فايل هدری به نام iostream قرار دارد که بايد ضميمه شود. کليه نيازهای ورودی و خروجی با اين اشياء برطرف می شود.

cout
قالب بندی خروجی
cerr و clog
cin


با وجوديکه ++C سازگاری خود را با C حفظ کرده است و می توان از توابع printf() و scanf() در کتابخانه <stdio.h> استفاده کرد، اشيای ورودی/خروجی ديگری را فراهم آورده است که بسيار قوی تر و مطمئن تر است. کلاس iostream، موجود در کتابخانه ای با همين نام، اشياء و متدهای موردنياز را در اختيار می گذارد. اين کتابخانه از ostream (برای خروجی) و istream (برای ورودی) مشتق می شود.

ورودی/خروجی به صورت جريانی (stream) از کاراکترها يا بايت ها از برنامه به صفحه نمايش، چاپگر يا فايل به عنوان خروجی و يا از صفحه کليد به عنوان ورودی تصور می شود. جريان ها راه انعطاف پذيری برای کار با ورودی و خروجی است که درمورد فايل های I/O هم صدق می کنند.

دستورات break و continue

در C++ دو دستور وجود دارد که باعث ايجاد وقفه در اجرای عادی حلقه می شود؛ break و continue. دستور break را قبلا در switch آشنا شديد. به طور مشابه اين دستور در حلقه های for، while و do-while باعث می شود کنترل بلافاصله از بدنه حلقه خارج شده به دستور بعد از حلقه منتقل شود.


مثال. در برنامه زير به کاربر اجازه داده می شود 100 عدد را وارد کند يا برای پايان يک عدد منفی وارد کند.

#include <iostream.h>


int main() {
   cout << "Enter 100 positive numbers, or a "
       <<" negative number to abort.n";

   int i;

   for (i = 1; i <= 100; ++i) {
      cout << "Enter the number #" << i << ": ";
      int n;
      cin >> n;
      if (n < 0)
         break;
      }

   if (i == 100)
      cout << "You are a real man.n";
   else
      cout << "You stopped after " << i
      << " numbers, coward!n";
}


دستور continue باعث پرش از روی دستورات بعد از خود و انتقال کنترل به ابتدای حلقه می شود.


مثال. برنامه زير مضارب غير 7 مابين اعداد 0 تا 100 نمايش می دهد.

#include <iostream.h>

int main() {
   for (int i = 0; i < 100; ++i) {
      // Skip the multiples of 7
      if ((i % 7) == 0)
         continue;

      cout << i << " ";
      }
}

حلقه do-while

سومين ساختار حلقه در C++ حلقه do- while است که بلاکی از کد را تا زمانی که شرط معينی true است اجرا می کند. حلقه do-while تقریبا مشابه حلقه while است با این تفاوت که شرط حلقه در انتهای حلقه است برخلاف حلقه while که در ابتدای قرار دارد. ساختار کلی آن به شکل زير است:

do {
   loop_body
}
while (condition);

condition يک عبارت شرطی است و تا وقتی که درست (يا غيرصفر) باشد بدنه حلقه تکرار می شود. چون شرط در انتها بررسی می شود بدنه حلقه حداقل يکبار اجرا می شود. اگر شرط برقرار نباشد حلقه به پايان می رسد و کنترل به دستور بعد از do-while منتقل می شود. بدنه حلقه می تواند يک دستور ساده باشد که در اينصورت نيازی به آکولاد نمی باشد.

دياگرام حلقه do-while به صورت زير است:


مثال. قطعه کد زير اعداد 1 تا 20 را نمايش می دهد.

int count = 1;
do {
   cout << count << endl;
   count++;
} while (count <= 20);

مثال. حلقه زير تا زمان وارد شدن عدد 99 ورودی دريافت می کند.

Do {
   cin >> nbr ;
} while (nbr <= 99);


حلقه های do-while هم مشابه حلقه های for و while می توانند تودرتو باشند. دقت کنيد که ساختار حلقه بايد کاملا درون حلقه ديگر باشد و نبايد overlap باشد.

حلقه while

حلقه while بلاکی از کد را تا زمانی که شرط معينی true است (غير صفر) اجرا می کند. شکل کلی آن به صورت زير است:

while (condition)
   {
   loop_body
   }

condition يک عبارت شرطی است. اگر اين عبارت false (يا صفر) باشد حلقه به پايان می رسد و دستور بعد از while اجرا می شود. body_loop دستوراتی است که تا زمان درست بودن شرط تکرار می شوند. اگر بدنه حلقه تنها يک دستور باشد نيازی به آکولاد نيست.

دياگرام زير نحوه اجرای حلقه while را نشان می دهد. توجه کنيد که شرط در ابتدای حلقه بررسی می شود و اگر false باشد وارد حلقه نمی شود. اگر شرط true باشد بدنه حلقه اجرا می شود.


مثال. قطعه کد زير اعداد 1 تا 20 را نمايش می دهد.

int count = 1;
while (count <= 20) {
   cout << count << endl;
   count++;
   }


حلقه while مانند يک حلقه for بدون قسمت های initial و update است: بنابراين هرکاری که با حلقه for می شود انجام داد با حلقه while هم می شود. اگر مقداردهی اوليه و افزايش متغيرها درون حلقه موردنياز است حلقه for را بهتر است استفاده کنيد. اگر حلقه while را استفاده می کنيد مقداردهی اوليه موردنياز قبل و افزايش درون حلقه بايد انجام بگيرد.

for ( ; condition ; ) معادل است با while (condition)


مثال. حلقه زير تا زمان وارد شدن عدد 99 ورودی دريافت می کند. عدد 99 که انتهای داده ورودی را معين می کند sentinel ناميده می شود.

int nbr=0;
while (nbr <= 99)
   cin >> nbr ;


While تودرتو

مشابه دستورات if و for دستور while هم می تواند تودرتو باشد.


مثال. برنامه زير 5 عدد که بايد مابين 1 تا 10 باشد از ورودی دريافت می کند.

#include <iostream.h>

main()
{    int array[5];
   int ctr = 0,
   nbr = 0;

   cout << "This program prompts you to enter 5 numbers" << endl;
   cout << "Each number should be from 1 to 10" << endl;

   while ( ctr < 5 ) {
      nbr = 0;
      while (nbr < 1 || nbr > 10) {
         cout << endl << "Enter number " << ctr + 1 << " of 5: ";
         cin >> nbr ;
         }

      array[ctr] = nbr;
      ctr++;
      }

   for (ctr = 0; ctr < 5; ctr++)
      cout << "Value " << ctr + 1 << " is " << array[ctr]; << endl

   return 0;
}

حلقه for

يک حلقه (loop) دستوری است تا زمان برآورده شدن شرطی دستورات ديگر را تکرار می کند. دستور داخل حلقه می تواند بلاکی از کد، حلقه يا هر دستور ديگری باشد.

حلقه for احتمالا متداولترین حلقه در کلیه زبان های برنامه نویسی است. وقتی بخشی از کد به تعداد معینی تکرار شود بکار برده می شود. یک عدد صحیح به عنوان شمارنده حلقه برای شمارش تعداد دفعات اجرای حلقه استفاده می شود. در دستور باید تعیین شود شمارنده از کجا شروع کند، کی متوقف شود و چقدر افزيش يا کاهش پيدا کند.

در C++ فرم کلی حلقه for به صورت زير است:

For (initial; condition; update)
   {
   loop_body
   }

قسمت های initial، condition و update همگی عبارت هستند و با هم درون يک جفت پرانتز قرار می گيرند و توسط علامت سميکولن از هم جدا می شوند. Loop_body يا بدنه حلقه دستورات داخل حلقه است که بايد تکرار شود و می تواند يک دستور ساده يا دستور ترکيبی باشد. اگر بدنه حلقه فقط شامل يک دستور باشد نيازی به آکولاد نيست. اما اگر بيشتر از يکی باشد بايد درون آکولاد محصور شود تا به عنوان بلاکی از کد ديده شود.

حلقه for طبق دياگرام زير اجرا می شود:

همانطور که ديده می شود ابتدا مرحله initial اجرا می شود. سپس condition بررسی می شود. اگر شرط برقرار نباشد حلقه به پايان می رسد و اجرا از دستور بعدی حلقه ادامه پيدا می کند. اگر شرط درست باشد loop_body اجرا می شود. سپس قسمت update اجرا می شود.

قسمت initial تنها يکبار در ابتدای ورود به حلقه اجرا می شود و معمولا برای اعلان و مقداردهی اوليه شمارنده ها و متغيرهای داخل حلقه استفاده می شود. قسمت condition عبارت شرطی است و هربار قبل از تکرار بدنه حلقه ارزيابی می شود. اگر در آغاز غلط باشد بدنه حلقه اصلا اجرا نخواهد شد. قسمت update در هربار تکرار حلقه اجرا می شود و معمولا برای افزايش يا کاهش شمارنده حلقه استفاده می شود.

نکته. قسمت های initial، condition و update هر کدام می توانند حذف شوند.
نکته. اگر قسمت شرط حذف شود هميشه درست فرض می شود.
نکته. برای خوانائی آکولادها زير هم قرار می گيرند و دستورات داخل آنها سه space جلوتر نوشته می شود.


مثال. قطعه کد زير اعداد 1 تا 20 را نمايش می دهد.

for (count = 1; count <= 20; count++)
   cout << count << endl;


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


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

for ( ; ; )
   cout << "Hello" << endl;

مثال. برنامه زير کاراکترهای اسکی را نمايش می دهد.

#include <iostream.h> int main()
{
   for(int i = 0; i < 128; i++)
      if (i != 26) // ANSI Terminal Clear screen
         cout << " value: " << i
                 << " character: " << char(i) << endl;
   return 0;
}

توجه کنيد که متغير i درون for اعلان شده است و تنها در بدنه حلقه قابل استفاده است.


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


مثال. در حلقه زير شمارنده حلقه هر بار يک واحد کم می شود.

for (count = 100; count > 0; count--)

مثال. در حلقه زير شمارنده حلقه هر بار 5 واحد زياد می شود.

for (count = 0; count < 1000; count += 5)

مثال. قسمت initial نه تنها برای مقداردهی اوليه بلکه برای اعمال ديگر هم می تواند بکار برود.

count = 1;
for (cout << count ; count < 1000; count++);

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

for ( count = 0; count < 1000 && array[count] != 0; )
   cout << array[count++]

مثال. بدنه حلقه می تواند يک جمله پوچ باشد. دستور زير عناصر يک آرايه را برابر با عدد 50 می کند.

for ( count = 0; count < 1000 ; array[count++] = 50 )
   ;

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

for (i = 0, j = 999; i < 1000; i++, j--)
   b[j] = a[i];

مثال. تا وقتی که کاربر عدد 99 را وارد کند حلقه تکرار می شود.

int nbr = 0;
for ( ; nbr != 99; )
   cin >> nbr;


for تودرتو

حلقه ها مانند دستورات شرطی می توانند تودرتو باشند. يک دستور for می تواند درون دستور ديگری قرار بگيرد. در این حالت حلقه داخلی به تعداد تکرار شمارنده خود ضرب در شمارنده حلقه بیرونی تکرار می شود.


مثال. دستور cout درون حلقه داخلی 5×3=15 بار تکرار می شود.

for (int i = 1 ; i < 3 ; i++ )
   {
   for(int j=0 ; j < 4 ; j++ )
      {
      cout << "This is inner loop " << j ;
      cout << " of outer loop " << i << endl;
      }
   }

مثال. برنامه زير با کاراکتر ستاره (*)‌ يک مستطيل 3×20 رسم می کند.

#include <iostream.h>
int main()
{
   int col=3, row=20;
   for ( ; row > 0; row--)
      {
      for ( ; col > 0; col--)
         cout << "*";
      cout << endl;
      }
   return 0;
}

شرط های تودرتو

یک امکان دیگر دستور if دستورات if تودرتو است یعنی یک if درون دیگری.


مثال. اگر Num مثبت باشد عبارت positive اگر صفر باشد عبارت zero و درغيراينصورت اگر منفی باشد عبارت negative‌ نمايش داده می شود.

if (Num > 0)
   cout << " is positive" << endl << endl;
else if (Num == 0)
   cout << " is zero" << endl << endl;
else
   cout << " is negative" << endl << endl;


#include <iostream.h>

float square_num(float num);
float cube_num(float num);
int main()
{
    int choice;
    float number, answer;
    cout << "Would you like to (1) square a number or (2) cube a number ? n";
    cout << "Please press the number of your choice 1 or 2 n";
    cin >> choice;
    cout << "Please enter your number n";
    cin >> number;
    if (choice == 1 ){
      answer = square_num(number);
    }
    else {
       answer = cube_num(number);
     }
     cout << "Your answer is " << answer << "n";
}
float square_num(float num)
{
    float a;
     a = num * num;
      return a;
}
float cube_num(float num)
{
    float a;
    a = num * num * num;
    return a;
}


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

اطلاعات کاربری
آمار سایت
  • کل مطالب : 4247
  • کل نظرات : 0
  • افراد آنلاین : 6
  • تعداد اعضا : 2926
  • آی پی امروز : 67
  • آی پی دیروز : 161
  • بازدید امروز : 412
  • باردید دیروز : 830
  • گوگل امروز : 6
  • گوگل دیروز : 51
  • بازدید هفته : 412
  • بازدید ماه : 35,353
  • بازدید سال : 110,462
  • بازدید کلی : 8,289,156
  • کدهای اختصاصی