نحوه ی تعریف نوع ورودی کلاس اسکنر در زبان جاوا


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

برای شروع کار پروژه ای تحت عنوان ScannerInput ایجاد کرده و کلاسی تحت عنوان ScannerClass در آن می سازیم. در ابتدا کد ما می بایست به شکل زیر باشد:

class ScannerClass {
    public static void main(String[] args) {
    
    }
}

اکنون همانطور که در جلسات گذشته آموزش داده شد یک شیئ از روی کلاس Scanner ساخته و نام آن را keyboardInput به معنی ورودی کیبورد می گذاریم. کد تکمیل شده ما می بایست به صورت زیر باشد:

import java.util.Scanner;
class ScannerClass {
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
    }
}

در این قسمت از آموزش قصد داریم تا انواع متدهایی که می توان به همراه کلاس Scanner مورد استفاده قرار داد را مورد بررسی قرار دهیم. متدی که در جلسه گذشته مورد استفاده قرار دادیم عبارت بود از ()nextLine به طوری که رشته ای را برای ما در پنجره کنسول به نمایش در آورد. به عبارت دیگر این متد تا زمانی که ما دکمه Enter را نزنیم، هر داده ای را در خود ذخیره خواهد ساخت. به منظور به کار گیری این متد، کد خود را به شکل زیر تکمیل می کنیم:

import java.util.Scanner;
class ScannerClass {
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
        System.out.println(keyboardInput.nextLine());
    }
}

در کد فوق در دستور ;()System.out.println که وظیفه دارد هر آنچه داخل آن قرار گرفت را در کنسول به نمایش در آورد، نام شیئ خود که از روی کلاس Scanner ساختیم را وارد کرده یک نقطه قرار می دهیم و متد ;()nextLine را به آن ضمیمه می کنیم. در این متد حتی اگر ترکیبی از متن و عدد هم وارد کنیم نمایش داده خواهد شد. به تصویر زیر توجه کنید:

همان طور که در تصویر فوق مشاهده می شود، با استفاده از این متد می توان ترکیبی از حروف، کلمات، اعداد و حتی علائم را وارد برنامه خود کرد. این متد زمان هایی که از کاربر بخواهیم مثلا یک رمز عبور برای خودش تعییین کند بسیار کاربرد خواهد داشت. به طور خلاصه این متد هرآنچه را که کاربر از طریق کیبورد وارد برنامه کند را دریافت می کند.

متد بعدی متد ()next است. از این متد هم می توان برای گرفتن هر نوع ورودی استفاده کرد با این تفاوت که این متد گرفتن داده ها را از کیبورد تا زمانی ادامه می دهد که یک Space مشاهده کند و به محض این که یک Space مشاهده شد، گرفتن داده های ورودی متوقف خواهد شد. برای استفاده از این متد، کد خود را به شکل زیر بازنویسی می کنیم:

import java.util.Scanner;
class ScannerClass {
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
        System.out.println(keyboardInput.next());
    }
}

مجدد برنامه را اجرا کرده و تعدادی کاراکتر و عدد پشت سر هم نوشته و یک فاصله قرار می دهیم و سپس تعدادی کاراکتر و عدد دیگر می نویسیم سپس دکمه Enter را می زنیم:

همانطور که در تصویر فوق مشاهده می شود، در خط اول عبارت ABC123 وارد شده و سپس عبارت EFG456 و در آخر دکمه اینتر را زده ایم. چیزی که متد ()next از ورودی برنامه گرفته است به این شکل است که از ابتدای خط شروع به خواندن ورودی کرده تا جایی که به یک فاصله رسیده است و بلافاصه پس از رسیدن به یک فاصله فرایند گرفتن ورودی متوقف شده است (به عبارت دیگر فاصله ها در این متد نقش Separator یا جدا کننده را بازی می کنند.) از اینجا به بعد اگر ما هزاران کاراکتر هم وارد برنامه خود کنیم در برنامه ذخیره نخواهد شد. حال پس از زدن دکمه اینتر، برنامه فقط داده اول را نمایش می دهد. اکنون اگر بخواهیم کاری کنیم که برنامه ما قادر گردد ورودی هایی که پس از یک فاصله نیز وارد می شوند را دریافت کند، صرفا نیاز است تا یک بار دیگر شیئ ساخته شده از روی کلاس Scanner به همراه یک متد ()next دیگر ایجاد کنیم. به کد تکمیل شده زیر توجه کنید:

import java.util.Scanner;
class ScannerClass {
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
        System.out.println(keyboardInput.next());
        System.out.println(keyboardInput.next());
    }
}

در این کد ما دو بار از متد ()next استفاده کرده ایم که با این کار به برنامه خود دستور می دهیم که متد اول ورودی از طریق کیبورد را دریافت کند تا جاییکه یک فاصله مشاهده کند. متد دوم به دنبال یک Space می گردد و به محض اینکه اولین فاصله ورودی را پیدا کرد حال هر آنچه پس از آن فاصله وارد شده باشد را گرفته و ذخیره می سازد تا جاییکه یک فاصله دیگر مشاهده کند. به خروجی کد فوق توجه کنید:

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

متد دیگری که می توان مورد استفاده قرار داد متد ()nextInt است که از طریق آن صرفاً می توان اعداد صحیح را از طریق کیبورد وارد برنامه خود کرد. برای روشن شدن این مطلب کد خود را به شکل زیر تغییر می دهیم:

import java.util.Scanner;
class ScannerClass {
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
        System.out.println(keyboardInput.nextInt());
    }
}

اکنون می توانیم پس از اجرای برنامه یک عدد از جنس عدد صحیح وارد برنامه کنیم و سپس دکمه اینتر را زده و خروجی برنامه را مشاهده کنیم. به طور مثال ما عدد 1000 را وارد می کنیم و دکمه اینتر را می زنیم:

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

می بینیم که برنامه ما با یک خطا مواجه شد. در واقع عبارت آبی رنگ java.util.InputMismatchException در تصویر فوق حاکی از آن است که داده ورودی با متد به کارگرفته شده هم خوانی ندارد. اکنون می بینیم که این نکته چه قدر اهمیت دارد که نوع داده ورودی با متد استفاده شده در کلاس Scanner می بایست اصطلاحاً با یکدیگر Match باشند.

متدی دیگری که آشنایی با آن اهمیت دارد متد ()nextDouble است به طوری که این متد مسئول دریافت اعداد اعشاری از طریق کیبورد می باشد. برای امتحان کردن این متد کل خود را به شکل زیر بازنویسی می کنیم:

import java.util.Scanner;
class ScannerClass {
    public static void main(String[] args) {
        Scanner keyboardInput = new Scanner(System.in);
        System.out.println(keyboardInput.nextDouble());
    }
}

اکنون پس از اجرای برنامه و وارد کردن یک عدد اعشاری مثل 12.5 خواهیم دید که متد ()nextDouble ورودی اعشاری را در خود ذخیره کرده و سپس از طریق کنسول آن را نمایش می دهد:

اگر به خاطر داشته باشید زمانیکه در متد ()nextInt یک عدد اعشاری وارد کردیم، برنامه از ما خطا گرفت چرا که نوع داده ورودی با نوع متد هم خوانی نداشت. حال ببینیم اگر در متد ()nextDouble یک عدد صحیح وارد کنیم چه اتفاقی خواهد افتاد (برای مثال عدد 100 را وارد می کنیم):

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

ما به عنوان یک برنامه نویس حرفه ای این اجازه را نداریم تا برنامه ای طراحی کنیم که در صورت ورود داده اشتباه برنامه Crash کرده و از ادامه باز ایستد. به عبارت دیگر ما موظف هستیم از متدهایی استفاده کنیم که هم خوانی داده ورودی با نوع متغیر را سنجیده و در صورت عدم تطابق به کاربر اخطار دهد. از آنجا که این مبحث نیازمند آشنایی با دستورات شرطی نیز می باشد، که در آموزش های آتی با این مباحث بیشتر آشنا خواهیم شد.

دانلود فایل‌های تمرین
لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
naderiforphone
naderiforphone
با سلام. از آموزش شما خیلی استفاده بردم. فقط دو پرسش
اول: اگر در خط دوم فقط از عبارت ...class استفاده کنیم خطا می دهد که چنین کلاسی را نمی یابد. در نتیجه من قبل از آن public گذاشتم تا خطا برطرف شد.
دوم اینکه من دقیقا کد شما رو نوشتم و بارها چک کردم حتی کپی پیست کردم و مطمئنم که نادرست نیست اما وقتی پس از اجرا می نویسم mahdi naderi و سپس اینتر می زنم توقع این است که در خط بعد mahdi را چاپ کند. اما این عبارت می آید
ahdi di
naderi
دلیلش چیست؟ ممنون
عبدالحمید ارجمند
عبدالحمید ارجمندAndroid Developer - Java - عاشق گجتهای اپل و مایکــ
ممکن هست کیبورد شما اوریجینال نباشه ، وقتی شما دستور اسکنر رو میدید به کنسول ، قطعا باید چیزی که وارد میکنید رو براتون نمایش به ، ممکن نیست درصوت سالم بودن کیبوردتون ، غیر از مورد درخواستی چیز دیگری تایپ بکنه

در پاسخ به

monia_a56
monia_a56
با سلام . ممنون تز آموزش عالیتون.
من تا اینحا بدون مشکل بودم. ولی در این درس دقیقا کدها رو کپی کردم و همه چی را وارد کردم. ولی بعد اجرا اروزیر رو دارم و چیزی هم نمیتونم وارد کنم .
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
scanner cannot be resolved to a type
عبدالحمید ارجمند
عبدالحمید ارجمندAndroid Developer - Java - عاشق گجتهای اپل و مایکــ
با سلام شما هنوز کلاس اسکنر خودتون رو ایمپورت نکردید ، برید روی اون و alt + shift رو بزنید تا کلاسش ایمپورت بشه ، یا میتونید بصورت دستی کد مقابل رو در کنار سایر کلاسهای ایمپورت شده وارد کنید : import java.util.Scanner;

در پاسخ به

کاربر میهمان
کاربر میهمان
سلام وقنی من myScanner رو میزنم ارور لامپ زرد رو میده کمک کنید به من
عبدالحمید ارجمند
عبدالحمید ارجمندAndroid Developer - Java - عاشق گجتهای اپل و مایکــ
علامت زرد نه خطاست و نه آلارم ، بلکه داره به شما گوشزد میکنه که هنوز مثلا استفاده نکردید از همین myScanner ، مثلا اگه توی چند خط بعد یک یا چند بار ازش استفاده بکنید دیگه این خطا از بین میره ، و ممکن هست داره از شما غلط املایی میگیره ، به هر حال خطایی نیست که شما بخواید خودتون رو درگیر اون بکنید . ادامه بدید .

در پاسخ به

کاربر میهمان
کاربر میهمان
عرض سلام و تشکر.
لطفا کد زیر رو در نظر بگیرید:
System.out.println(input.nextLine());
System.out.println(input.next());
System.out.println(input.nextLine());
System.out.println(input.nextLine());
لطفا توضیح بدید هنگام اجرای این کد چه اتفاقی می افته و چرا. ممنونم
عبدالحمید ارجمند
عبدالحمید ارجمندAndroid Developer - Java - عاشق گجتهای اپل و مایکــ
کدهای شما دو نوع هستند : 10 دستوری که با استفاده از next() است و دستور دوم با استفاده از nextLine() است . در دستور next ماتعیین میکنید که کنسول متوجه باشه وقتی کاربر یک کمله رو نوشت و بعد از اون اسپیس زد ، به مجرد اسپیس زدن کنسول میپره به خط دوم ( اسپیس درازترین کلید در صفحه کلید است ) . یعنی در این متد ، اسپیس حکم اینتر را دارد ، اما در متد nextLine() با زدن اینتر بعد از یک کلمه یا یک یا چند جمله کنسول به خط بعدی میپرد ، یعنی اینتر کاربردر خودش را دارد .

در پاسخ به

کاربر میهمان
کاربر میهمان
سلام من چطور می تونم داده های که از وردی گرفتم رو تو یک متغییر دخیره کنم
عبدالحمید ارجمند
عبدالحمید ارجمندAndroid Developer - Java - عاشق گجتهای اپل و مایکــ
یک استرینگ تعریف کرده و مقدار اون رو برابر با scan.next() قرار بدید ، از این رو مقدا یک استرینگ برابر با مقدار ورودی خواهد بود . کد شما باید بدین صورت باشد : String yourString=scan.next(); . در مرحله ی بعد از طریق روشهای رایج میتونید این استرین رو در هر جایی چاپ کنید یا نمایش دهید .

در پاسخ به

nahid
nahid
سلام دوستان چرا من هر کدوم از متدهارو که استفاده میکنم نتیجه ی مشابه دارم؟؟؟ با هر چهار متد همه ی کلمات و حروفی که مینویسم چاپ میشه.چرا؟
کاربر میهمان
کاربر میهمان
درود بر شما؛ از اینکه چنین وبسایت کاربردی راه اندازی کردید سپاسگزارم.
یک پرسش دارم : اصل عمل دریافت مقدار پس از تعریف یک اشاره گر var.next(); یا متد های مششابه هست؟
آخه توی آموزشتون مدام با چاپ کردن هر ورودی این عمل رو نشون دادید و من متوجه نششدم اصل عمل دریافت چگونه هست؟(با زبان CPP مقایسه می‌کنم)
من کوشش کردم با کد زیر سه مقدار بگیرم و برای آزمایش دریافت ، مقدار اولی رو چاپ کنم :
Scanner a=new Scanner(System.in);
Scanner b=new Scanner(System.in);
Scanner c=new Scanner(System.in);
a.next();
b.next();
c.next();
System.out.println(a);
ولی هیچ چیز چاپ نمیشه و تنها دریافت انجام میشه. از طرفیی چگونه میشه از مقدار های دریافت شده در عملیات های ریاضی و دیگر استفاده کرد چون وقتی خواستم ضرب انجام بدم نوشت bad operator *
بامهر
Hossein94
Hossein94
واقعا جالبه . ممنون از آموزشهاتون
Danyal
Danyal
سلام من از متد next.Int در شرط if استفاد میکنم. دوبار ازم ورودی میگیره چرا؟
if(keyboardInput .nextInt==3) be in sorat
محمد صالح
محمد صالح
سلام امتحان کردم این گونه نیست
شاید دو بار شی اسکنر رو فراخوانی می کنید.

در پاسخ به

Danyal
Danyal
منم امتحان کردم اگه به مقدار اسکنر رو توی متغییر دیگه ای کپی نکنیم و یعنی اگه به صورت مستقیم از متغییری که از نوع اسکنر تعریف کردیم توی شرط if استفاده کنیم دوبار ورودی میگره.

در پاسخ به

کاربر میهمان
کاربر میهمان
سلام خداقوت
کارتون عالیه.مرسی
من میخوام یه برنامه بنویسم وزن رو به صورت ورودی دریافت کنه و وزن تو کره دیگه رو خروجی بده ،کدشو نوشتم ولی به مشکل خوردم میشه راهنمایی کنید
http://s6.picofile.com/file/8259360826/6.PNG
amative205
amative205
سلام دوست عزیز. شما دارین یک شی رو روش عملیات محاسباتی انجام میدین در صورتی که کار اشتباهی هستش. شما باید مقدار شی رو روش محاسبات انجام بدن برای این کار شما لازم دارین ابتدا مقادیر داخل شی رو بهش دسترسی داشته باشین من کدتون رو اصلاح کردم و عکسش رو براتون میذارم. مشاهده کنین. http://uupload.ir/files/ww6o_capture.jpg

در پاسخ به

aliireza
aliireza
سلام خسته نباشین, این فایل تمرینی که گذاشتینو کجا بزاریم.
vahid
vahid
سلام لینک فایل های تمرینی آموزش های جاوا مشکل دارن! تا نصف دانلود میشن بعد قطع میشه! (با IDM)

لطفا بررسی کنید
عبدالحمید ارجمند
عبدالحمید ارجمندAndroid Developer - Java - عاشق گجتهای اپل و مایکــ
با سلام تازه تست کردم مشکلی نداره ، این فایل زیپ تنها 2 کیلوبایت هست و بدون نقص میتونید اون رو دانلود کنید .

در پاسخ به

حسین
حسین
ببخشید، اما کدها تو قسمت نظرات بهم میریزه، بعد از پاراگراف نهم در همین آموزش شما دو بار متد

System.out.println(keyboardInput.next

را بکار بردید. سوالم اینه که وقتی فقط کلمه test را وارد کنیم و یک اسپس بزنیم ،متغیر
keyboardInput.next
که همون کلمه test هست با متد پرینت اول به نمایش در میاد ولی دقیقا همین متد زیرش تکرار شده، چرا همون لحظه دوباره کلمه test رو چاپ نمیکنه و منتظر کلمه بعد میمونه. مگر اینکه مقدار این متغیر برابر صفر بشه و دستور پرینت دوم نتونه عمل کنه. (چرا با تایپ یک کلمه ، دوبار به نمایش در نمیاد)
از آموزشتون متوجه شدم فرق next و nextline چی هست، به اون کاری ندارم. سوالم اینه که دستور پرینت دوم چرا منتظر موند ، در صورتی که متغیر هر دو دستور پرینت دقیقا یکی هست.
اگر زیاد سوال پرسیدم شرمنده، اما برام جای سوال بود. در ایکلیپس هم کد شما جواب داد اما نمیدونم چرا !!!
حسین
حسین
فرض کنید یک کلمه وارد کنیم و اسپیس نزنیم
با این کد قاعدتا کامپایلر باید مقدار متغیر keyboarinput.next را دو بار نمایش دهد.

import java.util.Scanner;
class ScannerClass {
public static void main(String[] args) {
Scanner keyboardInput = new Scanner(System.in);
System.out.println(keyboardInput.next());
System.out.println(keyboardInput.next());
}
}
آیا بعد از نمایش جمله اول ، متغیر نول می شود؟
عبدالحمید ارجمند
عبدالحمید ارجمندAndroid Developer - Java - عاشق گجتهای اپل و مایکــ
شما دو دستور اسکن رو پشت سر هم عرضه کردی که بی فایده هست ، زمانی که کنسول به اولین خط از اونها میرسه ، منتظر میمونه تا ببینه کاربر چی وارد میکنه ، و کماکان منتظر دستورات کاربر میشینه ، شما انتظار دارید که همزمان این دو دستور اجرا بشند که عملا ممکن نیست . زیرا هیچ وقت به کد بعدی نمیرسه. از این رو شما به نتیجه ای که میخواهید نمیرسید چون این دوخط همزمان قابلیت اجرایی ندارند .

در پاسخ به

CIna Deuxshiri
CIna Deuxshiri
سلام
متاسفانه من متوجه سوالتون نمیشم. شما کدی که نوشتین غلط هست. اصلا همچین کاری که کردین یه نتیجه عجیب و غریب داره.

در پاسخ به

حسین
حسین
سلام و خسته نباشید.
کد زیر رو آموزش دادید
import java.util.Scanner;
class ScannerClass {
public static void main(String[] args) {
Scanner keyboardInput = new Scanner(System.in);
System.out.println(keyboardInput.next());
System.out.println(keyboardInput.next());
}
}
فرض کنید فقط یک کلمه بنویسیم و یک اسپس بزنیم که در متغیر keyboardInput.next ذخیره می شود. حالا آیا با دو متد چاپ ، دو بار پشت سر هم چاپ نخواهد شد؟
با تشکر
محمد صالح
محمد صالح
سلام خیر

در پاسخ به

CIna Deuxshiri
CIna Deuxshiri
سلام
دوست عزیز متاسفانه من متوجه سوالتون نشدم. لطف کنید بهتر توضیح بدین.

در پاسخ به

کاربر میهمان
کاربر میهمان
سلام باتشکر از آموزشتون ولی چرا من وقتی ورودی رو وارد میکنم میگه true
اینم عکس مشکلم
http://s6.uplod.ir/i/00727/84ysiqhnx4y7.png
CIna Deuxshiri
CIna Deuxshiri
سلام
دوست عزیز شما کدع اون یکی کلاستون و قرار بدین. این کلاسی که گذاشتین فایده ای نداره.

در پاسخ به

iman
iman
فقط میتونم بگم ، دوستون دارم
Man
Man
با سلام . مهندس دوشیری عزیز
چطور میتونم کارکتر های فارسی رو از ورودی بگیرم ؟

System.out.println("با سلام لطفا نام خود را وارد کنید");
Scanner name = new Scanner(new InputStreamReader(System.in, Charset.forName("UTF-8")));
String strName = name.nextLine();
System.out.println(strName);
کار نمیکنه .
http://stackoverflow.com
رو زیرو رو کردم هر کاری که انجام دادم باز برای چاپش یا در مقایسه به مشکل بر میخوره و خطوط دریافتی خرچنگ قورباغه هست!!!
CIna Deuxshiri
CIna Deuxshiri
سلام
وقتی فارسی در اکلیپس می نویسید و بعد برنامه رو ذخیره می کنید، خوده اکلیپس یه اروری و ارسال می کنه که شما گزینه utf-8 و انتخاب کن. در این کدی هم که نوشتین، قسمتی که کارکتر ست کردین و حذف کنید. من نوشتم، درست هم جواب داد.

در پاسخ به

Man
Man
ممنونم سینا جان ایکلیپس سرکار گذاشته بود منو چند روز!!!
پروژه رو دوباره ایجاد کردم و این کدها رو اونجا پیست کردم جواب داد . اما همچنان تو پروژه اولیه کار نمیکنه!
سگاسگذارم

در پاسخ به

کاربر میهمان
کاربر میهمان
بسیارعالی
تشکرفراوان
عیسی پور
عیسی پور
عالی بود
خدا قوت مهندس
کاربر میهمان
کاربر میهمان
با تشکر فراوان. keyboardInput.close() 1 این دستور جهت بستن شی باید به برنامه اضافه شود.
میثم کریمی قادی
میثم کریمی قادی
سلام لطفا بگید پی دی اف این اموزش رو چطور دانلود کنیم؟(یک تشکر ویژه بخاطر اموزش های خوبتون اجرتون با خدا )
ادمین سایت
ادمین سایت
سلام
از این پس آموزش ها صرفا به صورت وب در اختیار علاقمندان قرار خواهد گرفت.

با تشکر
ارادتمند
تیم سکان آکادمی

در پاسخ به