برنامه نویسی جاوا قسمت 14

آموزش برنامه نویسی جاوا: مفاهیم پایه در زبان جاوا (قسمت ۸)

 در این جلسه از آموزش می‌خواهیم به نکات کلیدی در جاوا بپردازیم و از هرکدام از آن‌ها مثال‌هایی را با هم کار کنیم. در ابتدا با متغیر‌های سراسری و محلی آشنا می‌شویم. بعد با عملگر ? آشنا می‌شویم که به کد نویسی کمتر کمک می‌کند. همچنین یاد می‌گیریم که چگونه برای ساختار‌های تکرار خود Label‌هایی را در نظر بگیریم و از آن‌ها در برنامه استفاده کنیم. همچنین با کلمه‌های کلیدی continue و break آشنا می‌شویم و در آخر هم بازی ریختن تاس را با استفاده از متد ()random شبیه سازی می‌کنیم.

 سرفصل مطالب

  1. متغیر‌های سراسری و محلی (Global And Local Variables)
  2. عملگر ?
  3. استفاده از برچسب برای حلقه‌های تکرار
  4. کنترل اجرای حلقه‌ها با استفاده از continue و break
  5. استفاده از متد ()random از کلاس Math

متغیر‌های سراسری و محلی (Global And Local Variables)

همانطور که در آموزش‌های قبلی دیدیم، می‌توانیم متغیر‌هایی را در قسمت‌های مختلف برنامه‌ی خود تعریف کنیم. اما این متغیر‌هایی که تعریف می‌کنیم، فقط در قسمت‌های خاصی از برنامه قابل دستیابی و استفاده هستند. به آن محدوده‌ای که یک متغیر در آن قابل دستیابی است و ما می‌توانیم به آن متغیر دسترسی پیدا کنیم و از داده‌ی ذخیره شده در آن استفاده کنیم یا داده‌ی آن را تغییر دهیم، محدوده‌ی قابل مشاهده و یا Scope آن متغیر گفته می‌شود. نحوه‌ی تعریف کردن متغیر‌ها به دو صورت است. یا آن‌ها را به صورت سراسری (Global) تعریف می‌کنیم یا به صورت محلی (Local).

نکته‌ی مهمی که قبلا هم به آن اشاره شد این است که هر کلاس و متد دارای یک بدنه است که با استفاده از علامت‌های آکولاد باز } و آکولاد بسته { مشخص می‌شود. این آکولاد‌های باز و بسته محدوده‌ای را برای یک متد و یا یک کلاس مشخص می‌کنند که به آن بلوک (بلاک) آن متد یا کلاس گفته می‌شود. شاید سوالی برای شما پیش بیاید که منظور از محدوده چیست؟ فرض کنید مثلا ما یک متغیر از نوع عدد صحیح در بلاک یک متد تعریف کرده‌ایم. بنابراین آن متغیر فقط در همان بلاک متد قابل استفاده است و قبل و بعد از آن متد به هیچ وجه قابل استفاده نیست. به مثال زیر توجه کنید:

public class MainClass {

	// main method
	public static void main(String[] args) {

	}

	// first method
	static void first() {
		int number = 0;
		System.out.println(number);
	}

	// second method
	static void second() {
		System.out.println(number);
	}

}

همانطور که در کد بالا مشاهده می‌کنید در داخل بلوک کلاس MainClass سه متد وجود دارد. اولین متد، متد ()main که متد اصلی برنامه است. دومین متد، متدی است با نام first و سومین متد، متدی است با نام second. (در اینجا ما کاری به متد اصلی نداریم).

ابتدا در بلوک متد first متغیری از نوع عدد صحیح با نام number تعریف کرده‌ایم و سپس در خط بعد مقدار آن را در خروجی استاندارد نمایش داده‌ایم. اما ما خواستیم مقدار متغیر number را نیز از طریق متد second هم نمایش دهیم. اما اگر این برنامه را در یک IDE بنویسید، زیر متغیر number در متد second خطی قرمز می‌کشد و برنامه اجرا نمی‌شود. برنامه با خطای کامپایل مواجه شده است. علت چیست؟ علت این است که متغیر numberr به صورت لوکال (Local) یا محلی تعریف شده است. بنابراین پس از اجرای بلوک مربوط به متد first، متغیر number توسط JVMM به صورت اتوماتیک از حافظه پاک می‌شود و دیگر همچین متغیری وجود ندارد که ما بخواهیم از آن استفاده کنیم. برای همین هم است که در متد second از number ایراد می‌گیرد. زیرا number یک چیز تعریف نشده است و جاوا آن را نمی‌شناسد.

نکته‌ی دیگری که باید به آن توجه کنید این است که ما وقتی یک متغیر را تعریف می‌کنیم، آن متغیر از آن خطی که تعریف شده به بعد قابل دسترسی است. به کد زیر توجه کنید:

public class MainClass {

	// main method
	public static void main(String[] args) {

	}

	// third method
	static void third() {
		System.out.println(number);
	}

	// first method
	static void first() {
		int number = 0;
		System.out.println(number);
	}

	// second method
	static void second() {
		System.out.println(number);
	}

}

ما در ادامه‌ی کد قبلی، متدی با نام third را قبل از متد first تعریف کرده‌ایم و باز خواسته‌ایم از متغیر number استفاده کنیم. اما باز هم با ارور مواجه می‌شویم.

توجه داشته باشید اگر در داخل یک بلاک، بلاکی دیگر تعریف کنیم، در داخل بلاک دوم (زیر بلاک) می‌توانیم به متغیر‌های بلاک اول دسترسی داشته باشیم. به کد زیر توجه کنید:

public class MainClass {

	public static void main(String[] args) {

		for (int i = 0; i < 10; i++) {
			int k = 0;
			for (int j = 0; j < 10; j++) {
				System.out.println(k);
			}
		}
	}

}

 در کد بالا ما یک حلقه‌ی for ایجاد کرده‌ایم که در داخل بلاک حلقه‌ی اولی (حلقه‌ی خارجی) یک متغیر با نام k تعریف کرده‌ایم. و سپس یک حلقه‌ی for دیگر داخل حلقه‌ی اول تعریف کرده‌ایم (حلقه‌های تو در تو) و در داخل بلاک حلقه‌ی دوم از متغیری استفاده کرده‌ایم که در بلوک حلقه‌ی اول تعریف شده است (متغیر k). ما از برنامه هیچ اروری دریافت نمی‌کنیم و برنامه کامپایل و اجرا می‌شود. اما متغیر j در داخل بدنه‌ی حلقه‌ی اولی قابل استفاده نیست.

حالت دومی که ما می‌توانیم یک متغیر را تعریف کنیم، به صورت سراسری، عمومی و یا Global است که در محدوده‌ی  یک کلاس تعریف می‌شود. به کد زیر توجه کنید:

public class MainClass {

	int number = 0;

	// main method
	public static void main(String[] args) {

	}

	// third method
	void third() {
		System.out.println(number);
	}

	// first method
	void first() {
		int number = 0;
		System.out.println(number);
	}

	// second method
	void second() {
		System.out.println(number);
	}

}

کد قبلی را کمی تغییر داده‌ایم. این‌بار متغیر number را در محدوده‌ی کلاس تعریف کرده‌ایم. یعنی متغیر number به صورت عمومی، سراسری و یا Global تعریف شده است. (متغیر number قبل از متد ()main تعریف شده است). بنابراین ما می‌توانیم آن را در داخل محدوده‌ی کلاس خود استفاده کنیم. در واقع متد‌های main, first, second, third در داخل بلاک کلاس قرار دارند و می‌توانند از متغیر‌هایی که در داخل کلاس تعریف می‌شوند استفاده کنند.

نکته: به متغیر‌هایی که داخل بدنه‌ی کلاس و خارج از تمام متد‌ها تعریف می‌شوند، Property‌های یک کلاس و یا  فیلد‌های یک کلاس گفته می‌شود. در مورد این موضوع در مبحث شی گرایی مفصلا صحبت می‌شود.

عملگر ?

در آموزش‌های قبلی ما با ساختار شرطی if...else آشنا شدیم و مثال‌هایی را کار کردیم. به عنوان مثال یک شرط را بررسی می‌کردیم و اگر آن شرط برقرار بود مقدار متغیری از نوع boolean را true و اگر شرط برقرار نبود مقدار متغیر را false در نظر می‌گرفتیم. در جاوا روش دیگری وجود دارد که ما بجای استفاده از ساختار if...else، از عملگر ? استفاده و یک شرط را بررسی می‌کنیم. شکل کلی استفاده از این عملگر به صورت زیر است:

variable = condition?expresion1:expresion2

کد بالا به این صورت است که اگر حاصل ارزیابی شرط (condition) مقدار true داشته باشد، expresion1 اجرا می‌شود، در غیر این صورت expresion2 اجرا می‌شود و نتیجه به variable نسبت داده می‌شود. به کد زیر توجه کنید:

public class MainClass {

	public static void main(String[] args) {
		int num = 10;
		boolean b = false;

		b = num <= 10 ? true : false;

		System.out.println(b);
	}

}

 در کد بالا ما ابتدا یک متغیر از نوع عدد صحیح تعریف کرده‌ایم. و همچنین یک متغیر دیگر از نوع boolean که مقدار پیش فرض آن false است. حالا می‌خواهیم متغیر b را مقدار دهی کنیم. به این صورت است که ابتدا متغیر b را می‌نویسیم و سپس یک علامت مساوی (انتساب) قرار می‌دهیم. بعد می‌آییم یک شرطی را بررسی می‌کنیم. شرط این است که اگر مقدار متغیر num کوچکتر و یا مساوی 10 باشد، مقدار بعد از عملگر ? به متغیر b نسبت داده شود. در غیر این صورت مقدار بعد از دو نقطه (:) به متغیر b نسبت داده شود. در بالا با توجه به اینکه مقدار متغیر num برابر با 10 است، بنابراین شرط ما برقرار است و مقدار true به متغیر b نسبت داده می‌شود. دو نقطه (:) نقش else در ساختار if...else را دارد.

استفاده از برچسب برای حلقه‌های تکرار

در جاوا امکانی وجود دارد که ما می‌توانیم برای حلقه‌های خود یک برچسب (Label) یا اصطلاحا نامی را در نظر بگیریم. به کد زیر توجه کنید:

public class MainClass {

	public static void main(String[] args) {

		outer: for (int i = 0; i < 10; i++) {

			inner: for (int j = 0; j < 10; j++) {

			}
		}
	}

}

من ابتدا یک حلقه‌ی for ایجاد کرده‌ام و سپس در داخل حلقه‌ی for، یک حلقه‌ی for دیگری ایجاد کرده‌ام. همانطور که قبلا هم اشاره کردیم به این مدل حلقه‌ها، حلقه‌های تو در تو (Nested Loops)  گفته می‌شود. همانطور که مشاهده می‌کنید من برای حلقه‌ی خارجی نام outer و برای حلقه‌ی داخلی نام inner را در نظر گرفته‌ام. (برای نوشتن برچسب فقط کافی است قبل از ایجاد حلقه یک نامی را نوشته و سپس دو نقطه قرار دهیم و بعد حلقه‌ی خود را بنویسیم). توجه داشته باشید که نوشتن برچسب برای حلقه‌ها، برای خوانایی برنامه نیست. یعنی برای این نیست که ما (برنامه نویس) راحت‌تر تشخیص دهیم که کدام حلقه داخلی و کدام یک خارجی است (البته می‌توان برای این هم استفاده کرد). اما در اصل کاربرد دیگری دارد که در ادامه به آن اشاره می‌کنیم.

کنترل اجرای حلقه‌ها با استفاده از continue و break

در این آموزش ما با ساختار switch آشنا شدیم و کاربرد کلمه‌ی کلیدی break را نیز فهمیدیم. نوشتن break باعث می‌شد که برنامه از ساختار switch خارج شود و دیگر ادامه‌ی آن را اجرا نکند. اما break فقط برای ساختار  switch نیست و در جاهای دیگر برنامه هم استفاده می‌شود. به کد زیر توجه کنید:

public class MainClass {

	public static void main(String[] args) {
		int counter = 0;
		while(counter <= 10) {
			System.out.println("Num[" + counter + "]: " + counter);
			counter++;

			if (counter == 5) {
				System.out.println("Break");
				break;
			}
		}
	}

}

 برنامه‌ی بالا به این صورت است که حلقه‌ی while تا زمانی که متغیر counter برابر با 10 نشده است ادامه پیدا می‌کند و مقادیر متغیر counter را چاپ می‌کند. اما در داخل بلوک while یک شرطی قرار داده شده است و آن این است که اگر مقدار counter برابر با 5 شد، ابتدا پیغام break را چاپ کند و سپس از حلقه خارج شود. اگر برنامه‌ی فوق را به همین شکلی که در بالا نوشته شده است اجرا کنید، خروجی برنامه تا عدد 4 بیشتر نیست و در آخر هم عبارت Break چاپ می‌شود. خروجی برنامه را در زیر مشاهه می‌کنید:

Num[0]: 0
Num[1]: 1
Num[2]: 2
Num[3]: 3
Num[4]: 4
Break

اما اگر تغییراتی در ساختار if ایجاد کنیم، مثلا متغیر counter را برابر با عدد 15 بجای 5 قرار دهیم، دیگر break اجرا نمی‌شود و در خروجی برنامه اعداد یک تا 10 چاپ می‌شود و عبارت Break هم چاپ نمی‌شود. توجه داشته باشید که بعد از دستور break اگر چیز دیگری بنویسید با خطای کامپایل مواجه می‌شوید و برنامه کامپایل نمی‌شود. در ادامه می‌خواهیم برنامه‌ای بنویسیم که کاربرد continue را آموزش دهیم.

continue به معنی ادامه دادن است و کاربرد آن در جاوا هم دقیقا به همین مفهوم است. به کد زیر توجه کنید:

public class MainClass {

	public static void main(String[] args) {
		for (int i = 0; i <= 10; i++) {
			System.out.println("NUM[" + i + "]: " + i);
		}
	}

}

 این کد دقیقا کدی است که در قسمت قبل از آن استفاده کردیم. (البته این‌بار از ساختار for استفاده کرده‌ایم). در زیر خروجی برنامه را مشاهده کنید:

NUM[0]: 0
NUM[1]: 1
NUM[2]: 2
NUM[3]: 3
NUM[4]: 4
NUM[5]: 5
NUM[6]: 6
NUM[7]: 7
NUM[8]: 8
NUM[9]: 9
NUM[10]: 10

 همانطور که مشاهده می‌کنید اعداد 0 تا 10 به درستی نمایش داده شده است. حالا می‌خواهیم برنامه را طوری تغییر دهیم که وقتی شمارنده‌ی برنامه به عدد 5 رسید، عملیاتی را انجام ندهد و دوباره به بررسی شرط حلقه (ابتدای حلقه) برگردد. به کد زیر توجه کنید:

public class MainClass {

	public static void main(String[] args) {		
		for (int i = 0; i <= 10; i++) {
			if (i == 5)
				continue;

			System.out.println("NUM[" + i + "]: " + i);
		}
	}

}

 همانطور که مشاهده می‌کنید ما با ساختار if شرطی را بررسی کردیم که اگر شمارنده‌ی حلقه برابر با عدد 5 شد، ادامه‌ی حلقه اجرا نشود و به ابتدای حلقه بازگردد. خروجی اجرای برنامه‌ی فوق را در زیر با دقت نگاه کنید:

NUM[0]: 0
NUM[1]: 1
NUM[2]: 2
NUM[3]: 3
NUM[4]: 4
NUM[6]: 6
NUM[7]: 7
NUM[8]: 8
NUM[9]: 9
NUM[10]: 10

همانطور که مشاهده می‌کنید عدد پنج در خروجی چاپ نشده است. زیرا ما شرطی را در برنامه قرار دادیم که وقتی که شمارنده‌ی برنامه برابر 5 شد حلقه ادامه پیدا کند (یعنی کد‌های بعد از  continue اجرا نشود و به سراغ ابتدای حلقه برود). خب وقتی برنامه به سراغ ابتدای حلقه می‌رود، مسلما به شمارنده‌ی برنامه یک واحد اضافه می‌شود. بنابراین عدد 5 چاپ نمی‌شود.

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

public class MainClass {

	public static void main(String[] args) {

		outer: for (int i = 0; i < 10; i++) {

			inner: for (int j = 0; j < 10; j++) {
				System.out.println("Inner: " + j);

				if (i == 5) {
					break;
				}
			}
	System.out.println("Outer: " + i);
		}
	}

}

ما اصلا به خروجی برنامه کاری نداریم. در بالا یک حلقه‌ی تو در تو ایجاد کرده‌ایم و برای حلقه‌ی داخلی یک شرطی قرار داده‌ایم تا دستور break اجرا شود. در اینجا زمانی که شرط ساختار if برقرار باشد، دستور break به طور پیش فرض برایحلقه‌ی داخلی اجرا می‌شود. اما فرض کنید ما می‌خواهیم برنامه‌ای بنویسیم که دستور breakk را از داخل حلقه‌ی داخلی،  برای حلقه‌ی خارجی اجرا کنیم. در اینجاست که کاربرد برچسب‌ها به چشم می‌آید. در کد بالا اگر بخواهیم حلقه‌ی خارجی را break کنیم باید کد را به صورت زیر تغییر دهیم:

public class MainClass {

	public static void main(String[] args) {

		outer: for (int i = 0; i < 10; i++) {

			inner: for (int j = 0; j < 10; j++) {
				System.out.println("Inner: " + j);

				if (i == 5) {
					break outer;
				}
			}
	System.out.println("Outer: " + i);
		}
	}

}

همانطور که مشاهده می‌کنید کلمه‌ی کلیدی break را نوشته و سپس در جلوی آن نام برچسب حلقه‌ی مورد نظر را نوشته‌ایم. حالا اگر برنامه را اجرا کنیم و اجرای برنامه به ساختار if برسد و شرط برقرار باشد، break برای حلقه‌ی خارجی اجرا می‌شود.

استفاده از متد ()random از کلاس Math

 ()random یکی از متد‌های کلاس Math است که با استفاده از آن می‌توانیم یک عدد تصادفی اعشاری تولید کنیم. عدد تصادفی‌ای که این متد تولید می‌کند، یک عدد بین صفر و یک است که شامل صفر می‌شود ولی شامل یک نمی‌شود. به کد زیر توجه کنید:

public class MainClass {

	public static void main(String[] args) {

		double d = Math.random();

		System.out.println(d);
	}

}

در کد بالا با استفاده از متد ()random یک عدد اعشاری تصادفی ایجاد و در داخل متغیر d ذخیره کرده‌ایم. خروجی برنامه‌ی بالا به صورت زیر است:

0.7197274320722393

برنامه را هر بار که اجرا کنید خروجی‌های متفاوتی را مشاهده می‌کنید. اما عدد تولید شده بین صفر و یک است.

حالا می‌خواهیم یکی از مباحث جذاب برنامه نویسی کاربردی یعنی شبیه سازی بازی ریختن تاس را مورد بررسی قرار دهیم. این برنامه را به شکل‌های مختلف می‌توان پیاده‌سازی کرد. تاس 6 وجه دارد که با ریختن آن یکی از اعداد 1 تا 6 ظاهر می‌شود. نکته‌ی اول این است که اعداد تاس صحیح هستند، در صورتی که اعداد تولید شده توسط متد ()random اعشاری است. پس ابتدا باید عمل Casting را انجام دهیم تا عدد اعشاری را به عدد صحیح تبدیل کنیم. به کد زیر توجه کنید:

public class MainClass {

	public static void main(String[] args) {

		double d = Math.random();
		int i = (int) d;

		System.out.println(i);
	}

}

اگر برنامه‌ی بالا را اجرا کنید به جز صفر عدد دیگری را در خروجی مشاهده نمی‌کنید. زیرا همانطور که گفته شد متد ()random عددی اعشاری بین صفر و یک تولید می‌کند که عدد شامل صفر است اما شامل یک نیست. بنابراین قسمت صحیح عدد که صفر است اصلا تغییر نمی‌کند و با هر بار اجرای برنامه فقط قسمت اعشاری آن تغییر می‌کند. حالا ما در کد بالا با کست کردن قسمت اعشاری عدد را از دست داده‌ایم. بنابراین به جز صفر عدد دیگری نمی‌بینیم. حالا برای اینکه عدد تصادفی را به محدوده‌ی مورد نظر خود ببریم (یک عدد بین 0 تا 6) کافی است عدد بدست آمده از متد ()random را در 6 ضرب کنیم تا اعدادی در بازه‌ی 0 تا 6 تولید شود. به شکل زیر:

public class MainClass {

	public static void main(String[] args) {

		double d = Math.random() * 6;
		int i = (int) d;

		System.out.println(i);
	}

}

حالا اگر برنامه را اجرا کنیم عدد بدست آمده، عددی است بین صفر تا 6 که شامل صفر می‌شود اما شامل 6 نمی‌شود. اما از آن‌جا که در تاس عدد صفر وجود ندارد و عدد 6 وجود دارد، بنابراین باید برنامه را طوری تغییر دهیم که عدد‌های تولید شده بین 1 تا 7 باشد. که شامل عدد 1 باشد اما شامل عدد 7 نباشد. راه حل این کار بسیار ساده است. فقط کافی است حاصل عبارت فوق را یک واحد افزایش دهیم. به کد زیر توجه کنید:

public class MainClass {

	public static void main(String[] args) {

		double d = Math.random() * 6 + 1;
		int i = (int) d;

		System.out.println(i);
	}

}

حالا با هر بار اجرای برنامه‌ی فوق، همانند این است که شما یک تاس را ریخته‌اید تا یک عدد مشاهده شود که این عدد شامل عدد‌های 1 تا 6 می‌شود.

نکته: می توان برای تولید اعداد تصادفی از کلاس Random که در پکیج java.util است استفاده کرد و بعد با استفاده از متد‌های آن مانند ()nextIntt و ... اعداد تصادفی تولید کرد. اما اگر بخواهیم از این روش استفاده کنیم باید از روی کلاس Random یک شی ایجاد کنیم و به دلیل اینکه هنوز به مبحث شی گرایی نرسیده‌ایم، آن را توضیح نمی‌دهیم.

برنامه نویسی جاوا قسمت 13

آموزش برنامه نویسی جاوا: مفاهیم پایه در زبان جاوا (قسمت ۷)

در این جلسه با انواع دیگری از روش‌های ورودی گرفتن در جاوا آشنا می‌شویم (ورودی از طریق اسکنر و واسط کاربری). همچنین با کلاس Math و متد‌های آن آشنا می‌شویم و به متد‌ها نگاهی عمیق‌تر می‌کنیم. در ادامه یاد می‌گیریم چگونه مقادیری را برای پارامتر‌های متد main در نظر بگیریم و از آن‌ها استفاده کنیم. این پارامتر‌ها را هم از طریق Command Prompt به برنامه ارسال می‌کنیم و هم از طریق محیط توسعه‌ی اکلیپس.

کلاس Scanner

یکی دیگر از روش‌های دریافت ورودی از کاربر استفاده از کلاس Scanner است. این کلاس در پکیج java.util قرار دارد و برای استفاده از این کلاس حتما باید پکیج مربوطه را import کنیم. برای استفاده از کلاس اسکنر ابتدا باید با استفاده از کلمه‌ی کلیدی new یک آبجکت یا شی بسازیم. با توجه به اینکه در حال حاضر ما به مبحث شی‌گرایی نرسیده‌ایم بهتر است فقط نحوه‌ی استفاده از این کلاس را حفظ کنید تا بعدا در مبحث مربوطه با جزئیات کار آشنا شوید. به کد زیر دقت کنید:

Scanner input = new Scanner(System.in);

همانطور که مشاهده می‌کنید ما ابتدا نام کلاس Scanner را نوشته‌ایم و بعد متغیری با نام input تعریف کرده‌ایم و بعد با استفاده از کلمه‌ی کلیدی new شی‌ را ساخته‌ایم. متغیر input در اصل ارجاعی به شی Scanner است نه اینکه خود input شی باشد. اما تمام برنامه نویسان برای راحتی کار به متغیر input آبجکت یا شی می‌گویند. به عملی که ما در بالا انجام داده‌ایم ساختن یک آبجکت یا شی از روی کلاس Scanner گفته می‌شود. در مبحث شی‌گرایی مفهومی است با نام Constructor یا سازنده که به متد هم نام آن کلاس گفته می‌شود. (این مفاهیم در مبحث شی گرایی به طور مفصل توضیح داده خواهد شد. پس نگران نباشید!!!). اگر در کد بالا دقت کنید ما در داخل پرانتز‌های باز و بسته‌، استریم (جریان) System.in را نوشته‌ایم. همانطور که در آموزش قبلی مشاهده کردید ما با استفاده از System.in از طریق کنسول برنامه ورودی‌ را دریافت کردیم. در اینجا System.in در کانستراکتور کلاس Scanner معرف جریان داده‌ای است که از طریق کنسول برنامه از کاربر دریافت می‌شود. این جریان داده در اختیار آبجکت اسکنر قرار داده می‌شود تا این آبجکت نیز داده‌ها را در قالب یک متن قابل تفسیر در اختیار ما قرار دهد. در ادامه ما با استفاده از متد‌هایی که در کلاس Scanner تعریف شده اند می‌توانیم از کاربر ورودی دریافت کنیم. بعضی از این متد‌ها در زیر آورده شده اند:

nextLine() - next() - nextInt() - nextDouble()

حالا می‌خواهیم برنامه‌ای بنویسیم که کاربر یک متنی را بنویسد و تا زمانی که دکمه‌ی Space را نزده است، متن نوشته شده توسط کاربر وارد برنامه شود. یعنی زمانی که Space زده شد، از Space به بعد را برنامه نادیده بگیرد (وارد برنامه نشود). به کد زیر توجه کنید:

Scanner

 

در مورد کدی که در خط هفت نوشته شده است توضیح داده شد. مهم ترین خط، خط 10 است که ابتدا یک متغیر با نام name از نوع String تعریف کرده‌ایم و بعد علامت مساوی را قرار داده‌ایم. در سمت راست مساوی ما عملیات ورودی را انجام داده‌ایم. ما با استفاده از متد next می‌توانیم به متنی که توسط کاربر تایپ شده است دست یابیم. چون متد next در کلاس اسکنر است، بنابراین برای دسترسی به آن متد باید از آبجکتی که از روی آن کلاس ایجاد شده است استفاده کنیم. ما آبجکت input را از روی کلاس Scanner ایجاد کرده‌ایم. بنابراین ابتدا این آبجکت را می‌نویسیم و سپس یک نقطه (.) قرار می‌دهیم و بعد نام متد را می‌آوریم. وقتی اجرای برنامه به این خط از برنامه می‌رسد (خط 10)، برنامه منتظر می‌ماند تا کاربر چیزی را در کنسول برنامه تایپ کند و سپس دکمه‌ی اینتر را بزند. بعد از اینکه کاربر دکمه‌ی اینتر را فشار داد، چیز‌هایی که کاربر تایپ کرده است در متغیر name ذخیره می‌شود. در خط آخر برنامه هم (خط 13) استفاده از آبجکت اسکنر مسدود شده است. مسدود کردن آبجکت Scanner باعث آزاد شدن کنسول برنامه می‌شود تا قسمت‌های دیگر برنامه در صورت نیاز بتوانند از آن استفاده کنند.

نکته‌ی دیگری که در این برنامه باید به آن توجه کنیم این است که در خط اول برنامه پکیجی را import کرده‌ایم. همانطور که قبلا هم گفته شد برای استفاده از کلاس‌هایی که در پکیج‌های دیگر قرار دارند، باید آن‌ها را import کنیم. البته ما می‌توانستیم استفاده از کلاس اسکنر را به صورت زیر هم بنویسیم تا دیگر پکیج مربوطه را import نکنیم:

java.util.Scanner input = new java.util.Scanner(System.in);

اگر پکیج‌ها را import نکنیم و به شکل بالا از کلاس‌ها استفاده کنیم، نکته‌ای است که همانطور که مشاهده می‌کنید ما در هر جایی که بخواهیم از کلاس Scanner استفاده کنیم، باید نام کلاس به همراه نام دقیق پکیج آن نوشته شود. اما اگر import کنیم دیگر نیازی به این کار نیست. بنابراین import کردن بهترین کار است. نکته‌ی مهم دیگری که در این کار وجود دارد این است که import کردن فقط در فایل java. است و وقتی که برنامه‌ی ما توسط ابزار javac کامپایل می‌شود و فایل class. ایجاد می‌شود، دیگر در فایل class. خبری از import نیست. زیرا کامپایلر جاوا زمانی که می‌خواد برنامه را کامپایل کند و به کلاس اسکنر می‌رسد، به import ها نگاه می‌کند و کلاس مورد نظر را پیدا می‌کند و آن را دقیقا مشابه آن چیزی که ما در بالا نوشته‌ایم می‌نویسد.

خروجی برنامه‌فوق به صورت زیر است:

What is your name? Sina Doshiri

Your name is: Sina

همانطور که مشاهده می‌کنید من به عنوان ورودی نام کامل خودم را وارد کرده‌ام. اما خروجی فقط نام من را چاپ کرده است. علت این است که من از متد next استفاده کرده‌ام. بنابراین این متد از بعد از Space را در نظر نمی‌گیرد. در مورد متد‌های دیگر خودتان تحقیق کنید. همانطور که از نامشان پیداست برای دریافت عددصحیح و عدد اعشاری استفاده می‌شوند. متد nextLine هم مانند next است اما تمام Space ها را نیز در نظر می‌گیرد.

دریافت ورودی از طریق واسط کاربری

یکی دیگر از روش‌های دریافت ورودی در جاوا که روش جذابی هم است، استفاده از واسط کاربری است. منظور از واسط کاربری همان پنجره‌هایی است که مبنای کار سیستم عامل‌های امروزی است. از طریق این پنجره‌ها، ممکن است داده‌هایی را به یک برنامه وارد کنید یا خروجی اجرای یک برنامه را مشاهده کنید. کلاس JOptionPane یکی دیگر از کلاس‌های جاوا است که با استفاده از متد‌های آن می‌توان انواع مختلفی از پنجره‌های از پیش تعریف شده را نمایش داد. قبل از این آموزش ما با استفاده از کادر‌های گفتگو متنی را نمایش دادیم. اما در اینجا می‌خواهیم یک ورودی را از کاربر دیافت کنیم. برای این کار باید از متد showInputDialog استفاده کنیم. به کد زیر توجه کنید:

JOptionPane

همانطور که در تصویر بالا مشاهده می‌کنید، هم کد و هم خروجی برنامه آورده شده است. کلاس JOptionPane در پکیج javax.swing قرار دارد و طبق معمول باید آن را import کرد.

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

sum-of-two-numbers

برنامه‌ی بالا را می‌توان یک ماشین حساب ساده در نظر گرفت. نکته‌ای که در مورد کادر‌های گفتگو وجود دارد این است که ورودی‌ که برنامه از این طریق دریافت می‌کند همگی از نوع String هستند. بنابراین برای اینکه ما بخواهیم مقداری که کاربر از طریق کادر‌های گفتگو وارد برنامه می‌کند را در یک متغیر ذخیره کنیم تا در ادامه‌ی برنامه از آن استفاده کنیم، آن متغیر باید از جنس String باشد. همانطور که در خطوط هف و هشت مشاهده می‌کنید ما دو متغیر از نوع String با نام‌های firstNum و secondNum تعریف کرده‌ایم تا به ترتیب عدد اول و عدد دوم را ذخیره کند. توجه داشته باشید که ما می‌خواهیم عملیات جمع انجام دهیم. بنابراین مثلا عدد 2 که به صورت String در حافظه ذخیره شده با 2 که به صورت int یا double ذخیره شده است تفاوت دارد. اجازه دهید کار خود را با یک مثال پیش ببریم. به کد زیر توجه کنید:

string-and-int

در برنامه‌ی بالا ابتدا دو متغیر از نوع String تعریف شده‌اند که هر کدام مقدار 2 را دریافت کرده اند. در خط هفت وقتی آن دو متغیر را با هم جمع می‌کنیم، براساس منطق ریاضی جواب باید 4 شود. اما جواب 22 است. در حقیقت 22 هم نیست!!!. فقط برنامه دو تا دو را در کنار هم نوشته است. اما در قسمت بعد برنامه ما دو متغیر از نوع int تعریف کرده‌ایم و در خط 11 آن‌ها را با هم جمع و در خروجی چاپ کرده‌ایم. اینبار جواب درست را می‌بینیم. یعنی 4.

در برنامه‌ای که دو عدد را از کاربر دریافت و سپس جمع می‌کند، برنامه ابتدا ورودی کاربر را در متغیر‌هایی از نوع String ذخیره کرده است. بنابراین اگر ما آن دو متغیر را با هم جمع کنیم، برنامه جواب درست را به ما نمی‌دهد. پس باید چه کاری انجام دهیم!؟ در خطوط 10 و 11 برنامه این مسئله روشن شده است. ما مقادیر String را به double تبدیل کرده‌ایم. در جلسه‌ی قبل در مورد cast کردن صحبت کردیم که می‌توانستیم داده‌ای از نوع دیگر را به داده‌ای از نوع دیگر تبدیل کنیم. اما در اینجا ما کست نکرده‌ایم. در حقیقت با استفاده از متد parseDouble، عمل پارس کردن را انجام داده‌ایم. علت هم این است که کست کردن فقط برای داده‌های پایه در جاوا است.

در جاوا ما به اندازه‌ی داده‌های پایه (Primitive Data Types)، کلاس‌های تقریبا با همین نام‌ها که با حروف بزرگ شروع می‌شوند داریم که به آن‌ها Wrapper class گفته می‌شود. ما در اینجا قصد صحبت کردن در مورد Wrapper class ها را نداریم. اما برای استفاده از متد parseDouble باید از Wrapper class ها استفاده می‌کردیم. نهایتا با کاری که ما در خطوط 10 و 11 انجام داده‌ایم، مقادیر String را به double تبدیل کرده‌ایم تا بتوانیم عملیات ریاضی بر روی آن‌ها انجام دهیم. خطوط بعدی برنامه هم کاملا واضح است. ما داده‌های تبدیل شده به double را با هم جمع کردیم و در یک متغیر دیگری از با نام result از نوع double ذخیره کرده‌ایم. در خط آخر هم جواب نهایی را با استفاده از کادر‌های گفتگو نمایش داده‌ایم.

یک نکته‌ی دیگری که باید به آن توجه کنید این است که در برنامه‌های جاوا به صورت معمول وقتی اجرای برنامه به آخر متد ()main می‌رسد، اجرای برنامه به صورت اتوماتیک خاتمه می‌یابد. اما در صورتی که برنامه از قسمت‌های نمایشی (مانند همین برنامه که از کادر‌های گفتگو استفاده کرده‌ است) تشکیل شده باشد، برای اتمام برنامه در آخرین خط، کد زیر را بنویسید:

System.exit(0);

استفاده از متد‌های کلاس Math

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

Math.sqrt() - Math.round() - Math.abs() - Math.ceil() - Math.floor() - Math.sin() - Math.cos()

متد‌های بسیار زیادی در این کلاس وجود دارد که در بالا فقط هفت متد آن آورده شده است.

  1. Math.sqrt ریشه‌ی دوم یک عدد را حساب می‌کند (جذر می‌گیرد).
  2. Math.round یک عدد را رُند می‌کند.
  3. Math.abs قدر مطلق یک عدد را حساب می‌کند.
  4. Math.ceil یک عدد را به سمت بالا رُند می‌کند.
  5. Math.floor یک عدد را به سمت پایین رُند می‌کند.
  6. Math.sin سینوس یک عدد را حساب می‌کند.
  7. Math.cos کسینوس یک عدد را حساب می‌کند.

تمام هفت متد معرفی شده در برنامه‌ی زیر به کار رفته است:

Math

برنامه را اجرا کنید و خروجی آن را مشاهده کنید. (پاسخ سینوس و کسینوس را درست نمایش نمی‌دهد. در مورد آن سرچ کنید).

همانطور که مشاهده کردید ما برای استفاده از هریک از متد‌های کلاس Math، ابتدای نام متد، نام کلاس را آورده‌ایم و سپس یک نقطه قرار داده‌ایم و بعد، از متد مورد نظر استفاده کرده‌ایم. علت این کار این است که متد‌های کلاس Math به صورت استاتیک (static) تعریف شده اند و برای استفاده از آن‌ها نیازی نیست تا از روی کلاس آبجکتی ایجاد شود. فقط کافی است نام کلاس را قبل از آن بیاوریم. (در مورد static در فصل شی گرایی صحبت می‌شود). همانطور که در کد مشاهده می‌کنید ما برای هر هفت نوع متد، نام کلاس Math را نوشته‌ایم. که خب مسلما اگر بخواهیم در برنامه‌ای که می‌نویسیم از متد‌های کلاس Math زیاد استفاده کنیم، آوردن نام کلاس برای تک تک متد‌ها کاری خسته کننده است. در جاوا یک نوع import دیگر وجود دارد که به صورت import static نوشته می‌شود. کاربرد این import دقیقا مانند import‌ یی است که برای پکیج‌ها انجام می‌دهیم. وقتی که این import را در برنامه انجام دهیم دیگر نیازی نیست که هر بار نام کلاس را قبل از متد بیاوریم. به کد زیر توجه کنید:

import-static

همانطور که مشاهده می‌کنید در خط اول import static را نوشته‌ایم و در استفاده از متد‌ها دیگر از نام کلاس Math استفاده نکرده‌ایم.

نگاهی عمیق‌تر به متد‌ها (توابع) در جاوا

در زبان‌های برنامه نویسی دیگری مثل ++C به متد‌ها تابع گفته می‌شود. اما در جاوا از کلمه‌ی متد (Method) استفاده می‌شود. در این آموزش ما یک مثال ساده از نحوه‌ی نوشتن یک متد و استفاده از آن (فراخوانی متد) در برنامه آشنا شدیم. اگر بخواهیم نحوه‌ی کارکرد متد‌ها را در یک جمله برای شما توضیح دهیم، متد‌ها مانند یک کارخانه هستند که از یک سمت ورودی‌هایی را دریافت می‌کنند و بعد بر روی این ورودی‌ها که شامل هر نوع داده‌ای می‌تواند باشد پردازش‌هایی را انجام می‌دهند و از سمت دیگر خروجی‌ای را تولید می‌کنند.

متد‌ها را به روش‌های مختلفی می‌توانیم طراحی کنیم. می‌توان نوع برگشتی‌ای برای آن مشخص نکرد (یعنی متد از نوع void باشد) و یا می‌توان برای آن مقدار برگشتی مشخص کرد (می‌تواند از نوع int, double, String و ... باشد). که اگر مقدار برگشتی برای آن‌ها مشخص کنیم، در آخر آن متد باید با استفاده از کلمه‌ی کلیدی return مقداری را برگرداند. در آموزشی که گفته شد متد ما مقدار برگشتی نداشت (یعنی از نوع void بود). اما در ادامه می‌خواهیم مثالی را برای شما بیاوریم که متد ما از نوع int باشد و مقداری را برگرداند. به کد زیر توجه کنید:

return-method

همانطور که در کد فوق مشخص است، ما در خط 8 یک متدی با نام sum که از نوع int است ساخته‌ایم. (منظور از int نوع برگشتی متد ما است و متد باید یک مقدار صحیح برگرداند. بنابراین از کلمه‌ی کلیدی void استفاده نمی‌کنیم). در داخل متد هم همانطور که معلوم است دو متغیر از نوع عدد صحیح با مقادیر تعیین شده تعریف کرده‌ایم. در آخر هم (خط 12) این دو متغیر را با هم جمع کرده‌ایم و با استفاده از کلمه‌ی کلیدی return مقداری را برگردانده‌ایم. (شاید برگرداندن مقدار کمی گنگ باشد. در ادامه متوجه می‌شوید). ما برای استفاده از این متد باید این متد را از داخل متد اصلی (main) فراخوانی کنیم. بنابراین برای فراخوانی متد فقط کافیست نام متد را بنویسیم. ما در متد main نام متد را در داخل جمله‌ی ;()System.out.println نوشته‌ایم. علت هم این است که می‌خواهیم مقداری که متد برمی‌گرداند را در کنسول مشاهده کنیم. بنابراین اگر برنامه را اجرا کنیم، خروجی اجرای برنامه‌ی ما 10 است. یعنی مقدار برگشتی متد ما حاصل جمع دو متغیری است که در داخل آن تعریف شده است.

حالا می‌خواهیم متد فوق را به گونه‌ای تغییر دهیم که هنگامی که متد sum را از طریق متد main فراخوانی می‌کنیم، اعدادی را در نظر بگیریم تا آن اعدادی که ما مشخص می‌کنیم در متد با هم جمع شوند. در متد مفهومی است با نام پارامتر که به متغیر‌هایی که در داخل پرانتز‌های باز و بسته‌ی متد قرار می‌گیرند گفته می‌شود. برای فهم این مطلب به کد زیر نگاه کنید:

method-with-parameter

در برنامه‌ی قبلی ما دو متغیر num1 و num2 را داخل بدنه‌ی متد تعریف کردیم. اما این‌بار همانطور که مشاهده می‌کنید در پرانتز‌های باز و بسته‌ی متد sum تعریف کرده‌ایم. این‌ها پارامتر‌های متد ما هستند و نکته‌ی بسیار مهمی که وجود دارد این است که باید در همان ابتدای استفاده از متد پارامتر‌های متد را مقدار دهی کنیم. در غیر این صورت برنامه‌ی ما کامپایل نمی‌شود. زیرا در جاوا مقدار پیش فرض برای یک پارامتر وجود ندارد. یعنی برای فراخوانی یک متدی که دارای پارامتر است، باید حتما مقدار تمام پارامتر‌های متد را به ترتیب مشخص کنیم. به خط 5 در داخل متد main توجه کنید. ما وقتی متد sum را فراخوانی کرده‌ایم، به ترتیب برای پارامتر‌های آن مقادیری را تعیین کرده‌ایم. شما می‌توانید هر مقدار دیگری را در نظر بگیرید. بنابراین اگر برنامه را اجرا کنید پاسخ 12 خواهد بود.

استفاده از پارامتر‌های متد main

همانطور که قبلا هم گفته شد، تمام برنامه‌های جاوا یک متد اصلی دارند که نام آن main است. (نام این متد دقیقا باید به همین شکل نوشته شود. در غیر اینصورت برنامه اجرا نمی‌شود). متد main نقطه‌ی شروع هر برنامه‌ی جاوا است. همانطور که در آموزشی که گفته شد مشاهده کردین، برای استفاده از یک متد حتما باید آن متد توسط برنامه نویس فراخوانی شود. در غیر این صورت بود و نبود آن متد هیچ فرقی ندارد. اما در مورد متد main این قضیه فرق دارد. برنامه باید اجرا شود تا ما (برنامه نویس) بتوانیم متد‌هایی را در برنامه فراخوانی کنیم. سوال اینجاست که متد main چگونه اجرا می‌شود؟ پاسخ این است که متد ()main توسط برنامه نویس فراخوانی نمی‌شود، بلکه در زمان اجرا توسط JVM فراخوانی می‌شود. هنگامی که ما با استفاده از ابزار java کلاس را اجرا می‌کنیم، ماشین مجازی جاوا متد ()main درون کلاس مشخص شده را یافته و اجرا می‌کند.

با توجه به توضیحات قسمت قبل، گفتیم که در جاوا مقدار پیش فرض برای پارامتر‌ها وجود ندارد. پارامتر‌های ورودی متد main یک آرایه‌ای از رشته‌ها است (String[] args) (در مورد آرایه‌ها بعدا توضیح داده خواهد شد). اما ما هیچگاه مقادیر پارامتر‌های متد main را مشخص نکرده‌ایم. پس چگونه برنامه‌ی ما اجرا می‌شود؟پاسخ این است که از آنجایی که متد main توسط JVm فراخوانی می‌شود، در فراخوانی آن می‌توانید هیچ پارامتری را مشخص نکنید، در این صورت JVM متد ()main را با یک پارامتر بدون مقدار (null) فراخوانی می‌کند.

آرایه‌ها: در این جلسه از آموزش ما نمی‌خواهیم در مورد آرایه‌ها صحبت کنیم. اما اندکی در مورد آن‌ها توضیح می‌دهیم تا کمی با آن‌ها آشنا شوید. آرایه‌ها پر کاربرد‌ترین ساختمان داده‌ها در برنامه نویسی هستند. درواقع آرایه‌ها لیستی از داده‌ها هستند که همگی آن‌ها از یک نوع هستند. (یعنی یا همه‌ی آن‌ها از نوع int هستند. یا از نوع double یا از نوع String و ... هستند). همانطور که گفته شد آرایه‌ها لیستی از داده‌ها هستند. بنابراین برای دسترسی به هر خانه‌ی آرایه باید با استفاده از ایندکس یا اندیس آن آرایه به آن خانه‌ی آرایه دسترسی پیدا کرد. ایندکس در واقع شماره‌ای است که برای هر خانه‌ی حافظه در نظر گرفته می‌شود. نکته‌ی دیگری که باید به آن توجه کنیم این است که شماره‌ی خانه‌های آرایه از صفر شروع می‌شود. یعنی خانه‌ی یکم شماره‌ی صفر دارد. و آرایه‌ای با 10 خانه، آخرین ایندکس آن 9 است. در برنامه نویسی برای دسترسی به خانه‌ی مثلا اول آرایه باید به شکل زیر کدی را بنویسیم:
array[0];
کد بالا به این معنی است که نام آرایه‌ی ما array است و به خانه‌ی یکم اشاره می‌کند. ایندکس آرایه را هم در بین یک جفت کروشه می‌نویسیم. به این صورت به آن خانه‌ی آرایه دسترسی پیدا می‌کنیم.

حالا ما می‌خواهیم از پارامتر‌های متد main استفاده کنیم. یعنی می‌خواهیم مقادیری را برای آن‌ها در نظر بگیریم و آن‌ها را در خروجی استاندارد چاپ کنیم. برای این کار دو راه وجود دارد. یکی اینکه از طریق Command Prompt موقع‌ای که می‌خواهیم برنامه را اجرا کنیم پارامتر‌ها را ارسال کنیم. و راه دیگر که راه آسان تری است از محیط توسعه‌ی اکلیپس برای این کار استفاده کنیم. ما ابتدا روش اول را آموزش می‌دهیم. به کد زیر توجه کنید:

main

به پارامتر متد main توجه کنید. آرایه‌ای از جنس String تعریف شده است. (نحوه‌ی تعریف آرایه به این شکل است). در خطو 5 و 6 و 7 هم با استفاده از جمله‌ی ;()System.out.println محتویات خانه‌های 1 تا 3 آرایه را چاپ کرده‌ایم. (توجه کنید که اگر به همین شکل برنامه را اجرا کنید با خطا مواجه می‌شوید. زیرا هنوز مقادیری برای پارامتر متد main در نظر نگرفته‌ایم). ابتدا این برنامه را با استفاده از Command Promt کامپایل کنید تا فایل class. آن ایجاد شود. سپس به عکس زیر توجه کنید:

cmd

همانطور که در تصویر مشاهده می‌کنید ما ابتدا برنامه‌ی خودمان را کامپایل کرده‌ایم و سپس با استفاده از ابزار java می‌خواهیم کلاس MainClass را اجرا کنیم. ما در برنامه‌ی خود محتویات سه خانه‌ی ابتدایی پارامتر متد main را در خروجی استاندارد چاپ کرده‌ایم. بنابراین در اینجا هنگام اجرای برنامه باید مقادیری را برای آن پارامتر‌ها در نظر بگیریم. همانظور که مشاهده می‌کنید مقادیر خانه‌های یک تا سه آرایه مشخص شده است. برای هر خانه چیزی را که می‌خواهیم می‌نویسیم و سپس یک Space می‌زنیم. هنگامی که Space می‌زنیم به سراغ خانه‌ی بعدی آرایه می‌رومیم. خروجی برنامه هم در کادر قرمز رنگ در تصویر مشخص شده است.

اما روشی راحت‌تر برای ارسال پارامتر به متد ()main وجود دارد و آن استفاده از اکلیپس است. برای ارسال پارامتر از طریق اکلیپس باید به پنجره‌ی Run Configurations مراجعه کنید. به تصویر زیر توجه کنید:

run-configurations

همانطور که در تصویر مشخص است دو راه برای دسترسی به Run Configurations وجود دارد. یا در فیلد Quick Access عبارت Run Configurations را سرچ کنید و یا اینکه بر روی علامت پیکان دکمه‌ی Run کلیک کنید تا منوی آن باز شود و گزینه‌ی مشخص شده را انتخاب کنید. بعد از انتخاب گزینه‌ی مورد نظر وارد پنجره‌ی زیر می‌شوید:

run-configurations

در پنجره‌ی فوق ابتدا تب Arguments را انتخاب کنید و در قسمت Program Arguments مقادیری را تایپ کنید و در آخر بر روی دکمه‌ی Run کلیک کنید. برنامه اجرا می‌شود و دقیقا این سه مقداری که ما در اینجا نوشته‌ایم در خروجی چاپ می‌شود.

برنامه نویسی جاوا قسمت 12

آموزش برنامه نویسی جاوا: مفاهیم پایه در زبان جاوا (قسمت ۶)

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

 

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

;()System.in.read استفاده شود. وقتی که از این کد برای دریافت ورودی استفاده می‌کنیم و کاربر روی یک کلید از کی‌بورد فشار می‌دهد تا یک داده‌ای را وارد برنامه کند (به عنوان مثال دکمه‌ی a)، متد ()read کد اسکی (ASCII) کارکتر a را بر می‌گرداند. (در مورد کد‌های اسکی تحقیق کنید و با فلسفه‌ی بوجود آمدن آن‌ها آشنا شوید). اما برای درک بهتر با یک مثال کار خود را ادامه می‌دهیم. در مثال زیر می‌خواهیم کد‌های اسکی کارکتر‌های a و A را بدست بیاوریم.

ASCII

همانطور که در کد بالا مشاهده می‌کنید ما ابتدا در خط‌های پنج و شش دو متغیر از نوع کارکتر تعریف کرده‌ایم. که به ترتیب مقادیر a و A را به آن‌ها نسبت داده‌ایم. حالا برای اینکه بخواهیم کد‌های اسکی آن‌ها را مشاهده کنید در خطوط ۸ و ۹ دو متغیر از نوع عدد صحیح تعریف کرده‌ایم و متغیر‌های کارکتری را به آن‌ها نسبت داده‌ایم. با این کار ما اگر متغیر‌های عدد صحیح را در خروجی استاندارد چاپ کنیم، بجای نمایش حروف a و A، یک سری عدد صحیح نمایش داده می‌شود که آن‌ها کد اسکی حروف تعریف شده هستند. نتیجه‌ی اجرای برنامه‌ی فوق به صورت زیر است:

a: 97

A: 65

اعداد صحیح 97 و 65 کد‌های اسکی حروف فوق هستند. همانطور هم که مشاهده می‌کنید کد‌های اسکی حروف کوچک با حروف بزرگ متفاوت است. به همین دلیل است که هیچ وقت a کوچک مساوی با A بزرگ نیست. (به عنوان تمرین برنامه را طوری تغییر دهید که با چاپ کد‌های اسکی، حروف آن‌ها نمایش داده شود).

مثال فوق صرفا برای آشنایی شما با کد‌های اسکی است و اینکه ما با فشار دادن یک کلید از کی‌بورد، در واقع عددی را وارد برنامه می‌کنیم. برای همین منظور وقتی ما از جمله‌ی ;()System.in.read برای دریافت ورودی استفاده می‌کنیم، و بخواهیم ورودی‌ را که دریافت کرده‌ایم را به کاربر نمایش دهیم، حتما باید ورودی را به داده‌ی کارکتری اصطلاحا Castکنیم. کست کردن کاربرد‌های بسیار زیادی دارد. به کد زیر توجه کنید:

char ch = (char)System.in.read();

همانطور که مشاهده می‌کنید ما داده‌ای را که از طریق ورودی دریافت می‌کنیم را به داده‌ی کارکتری کست کرده‌ایم. یعنی داده‌ی پایه‌ی char را داخل یک جفت پرانتز باز و بسته قرار داده‌ایم. با این کار داده‌ی ما هرچیزی که باشد به کارکتر تبدیل می‌شود و بعد در متغیر ch ذخیره می‌شود. (می‌توانیم به داده‌های دیگر هم کست کنیم. مثلا به String, double و ... ).

 همانطور که خودتان متوجه‌ این قضیه شده‌اید جمله‌ی ;()System.in.read فقط یک کارکتر را می‌خواند! اما ما می‌خواهیم برنامه‌ای را بنویسیم که به عنوان مثال یک جمله‌ای را از کاربر دریافت کند (یعنی مجموعه‌ای از کارکتر‌ها). بنابراین ما باید برای دریافت یک جمله‌ی کامل از کاربر، از یک حلقه استفاده کنیم. یعنی تا زمانی که کاربر در حال تایپ است و دکمه‌ی Enter را نزده است، برنامه متوقف نشود و به دریافت ورودی از کاربر ادامه دهد. برای این کار ما از یک حلقه‌ی while استفاده می‌کنیم. علت هم این است که ما (برنامه نویس) نمی‌دانیم که تا چه زمانی قرار است این حلقه ادامه پیدا کند. به عبارت دیگر نمی‌دانیم که چه زمانی کاربر می‌خواهد دکمه‌ی Enter را فشار دهد.

در زبان جاوا یک سری کارکتر‌هایی هستند که به آن‌ها کارکتر‌های کنترلی می‌گویند. یعنی آن کارکتر‌ها نمایش داده نمی‌شوند اما یک سری تغیراتی را ایجاد می‌کنند. کارکتر‌های کنترلی با استفاده از بک اسلش (Back Slash) مشخص می‌شوند و بعد در جلوی آن‌ها از یک سری حروف استفاده می‌شود که هر کدام نشانگر کار خاصی است. مثلا n\ در هر جایی که ظاهر شود، از ادامه‌ی آن را در خط بعدی نمایش می‌دهد. یا t\ یک تب (Tab) کارکتر را به جلو می‌برد. (ما با کارکتر‌های کنترلی در ادامه‌ی آموزش‌ها آشنا می‌شویم). r\ یکی از کارکتر‌های کنترلی است که به عبارتی کد اسکی دکمه‌ی Enter است. در برنامه‌ی زیر ما از این کارکتر کنترلی استفاده می‌کنیم. به کد زیر دقت کنید:

Input

در خط‌های ۵ و ۶ ابتدا یک متغیر از نوع String و یک متغیر از نوع کارکتر تعریف کرده‌ایم که مقادیری ندارند. قلب برنامه‌ی ما در حلقه‌ی while است. ابتدا به بدنه‌ی حلقه توجه کنید. در خط 10 همانطور که قبل‌تر هم گفته شد ما یک کارکتر دریافت می‌کنیم و آن را کست می‌کنیم. در خط بعدی هم مقدار داده‌ای را که در خط قبل دریافت کرده‌ایم به String تبدیل می‌کنیم. البته برای کوتاه‌تر شدن کد هم می‌توانیم در تبدیل به String کد را به صورت زیر بنویسیم:

str += ch;

تکه کد فوق دقیقا معادل با کدی است که ما در خط 11 نوشته‌ایم. در حلقه‌ی while ابتدا شرط آن بررسی می‌شود و اگر شرط آن برقرار بود ادامه‌ی اجرای برنامه به داخل حلقه می‌رود. در غیر اینصورت برنامه از حلقه خارج می‌شود. علامت =! به معنی نابرابری است. یعنی تا زمانی که مقدار ch برابر با کارکتر کنترلی r\ (یا همان دکمه‌ی Enter) نبود یا به عبارتی دیگر نابرابر کداسکی دکمه‌ی Enter بود، حلقه‌ی ما ادامه دارد. به محض اینکه کاربر دکمه‌ی اینتر را فشار دهد مقدار ch برابر با کد اسکی اینتر می‌شود و برنامه از حلقه خارج می‌شود. در خط 14 هم مقدار String را نمایش داده‌ایم. خروجی برنامه:

output

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

در کد فوق نکته‌ای است که باید به آن توجه کنید، این است که در مقابل متد main جمله‌ی throws Exception نوشته شده است. این عبارت مربوط به ;()System.in.read است. اجرای ;()System.in.read و برخی دیگر از متد‌های جاوا ممکن است با خطا مواجه شود. در چنین مواردی برنامه باید تصمیم بگیرد که با خطای احتمالی چگونه باید برخورد شود. عبارت throws Exception ساده‌ترین نوع برخورد با خطای احتمالی است که در آن هیچ تمهیدی برای رخداد خطا در نظر نمی‌گیرد. اگر برای این خطاها راه حلی در نظر نگیریم، ممکن است برنامه در هنگام اجرا اصطلاحا کرش (Crash) کند. (هندل کردن استثناها (Exceptions Handling) یکی از مباحث مهم در برنامه نویسی است).

برنامه نویسی جاوا قسمت 11

آموزش برنامه نویسی جاوا: مفاهیم پایه در زبان جاوا (قسمت ۵)

در این جلسه از آموزش، ما با دو نوع دیگر از ساختار‌های حلقه در جاوا آشنا می‌شویم. همچنین با انواع کامنت (Comment) گذاری در جاوا و علت بکارگیری آنها نیز آشنا می‌شویم. کامنت‌گذاری یکی از بخش‌های مهم در برنامه‌نویسی است و باعث خوانایی برنامه‌ی ما می‌شود. همچنین نگاهی می‌کنیم به قابلیت‌های موجود در اکلیپس برای سرعت بخشیدن به برنامه‌نویسی و همچنین کاهش خطا.

 کامنت گذاری در جاوا

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

comment-in-java

همانطور که در کد بالا مشاهده می کنید، ما از هر سه نوع کامنت‌گذاری که در جاوا وجود دارد استفاده کرده‌ایم.

اولین کامنت با دو علامت اسلش (Slash) که به شکل // است مشخص شده است. این نوع کامنت‌گذاری فقط برای یک خط است و از بعد از علامت // هرچیزی را که بنویسیم، تا آخر همان خط به صورت کامنت در می‌آید.

کامنت بعدی با علامت‌های اسلش استار (Slash Star) */ شروع می‌شود و با استار اسلش (Star Slash) /* تمام می‌شود. در این نوع کامنت ما می‌توانیم توضیحات خود را در چندین خط بنویسیم. همانطور هم که مشاهده می‌کنید هر خط با یک ستاره (*) شروع شده است.

آخرین کامنت که به آن جاوا داک (Javadoc) گفته می‌شود مخفف: Java Documentation است. این نوع کامنت فقط مخصوص زبان برنامه‌نویسی جاوا است. جاوا داک با علامت‌های یک اسلش و دو ستاره (**/) شروع می‌شود و در آخر هم با یک ستاره و اسلش (/*) پایان می‌پذیرد. جملاتی که در جاوا داک نوشته می‌شود در حقیقت مستندات جاوا هستند و این امکان وجود دارد تا در پایان انجام پروژه با استفاده از ابزار javadoc که یکی از ابزار‌های JDK است از روی این مستندات فایل‌های HTML تولید کنیم. به کد زیر توجه کنید:

 

javadoc

 

در کد بالا ما یک متد با نام run نوشته‌ایم و در بدنه‌ی آن رشته‌ای را به خروجی استاندارد ارسال کرده‌ایم (متد زیاد مهم نیست!). نکته‌ی مهم این است که ما قبل از متد run از جاوا داک استفاده کرده‌ایم. بنابراین جاوا داک برای متد run تولید می‌شود. ابتدا یک توضیح کوتاهی نوشته‌ایم و بعد با استقاده از تگ‌های version و author، ورژن و نویسنده‌ی برنامه را مشخص کرده‌ایم. همانطور که در قسمت پایین کد مشاهده می‌کنید، اکلیپس به صورت خودکار جاوا داک را برای ما تولید کرده است و در یک پنجره با نام javadoc تمام چیز‌هایی که ما در کامنت نوشته‌ایم را نوشته است. (با دقت به جاوا داک نگاه کنید تا متوجه‌ی جزئیات آن شوید). یکی دیگر از کاربرد‌های جاوا داک این است که ما می‌توانیم به دید یک منبع آموزشی به جاوا داک‌ها نگاه کنیم. زیرا توسعه‌دهندگان جاوا توضیحات مفصلی را هنگام تولید کلاس‌های جاوا به صورت جاوا داک نوشته‌اند و ما می‌توانیم با مراجعه به آن‌ها اطلاعاتی را کسب کنیم.

ساختار تکرار while

ما قبل از این با حلقه‌ی for آشنا شدیم. همانطور که گفته شد شرط استفاده از حلقه‌ی for دانستن تعداد دفعات حلقه است. ساختار دیگری برای تکرار در جاوا وجود دارد که به آن while گفته می‌شود. هنگامی که ما از این حلقه استفاده می‌کنیم، نمی‌دانیم که قرار است کی و چه زمانی حلقه تمام شود. به نوعی می‌توان گفت که حلقه‌ی while مانند یکنگهبان است. یعنی می‌توان برای این نوع حلقه‌ها یک نگهبانی را تصور کرد که به صورت دائم شرط حلقه را بررسی می‌کنند و تا زمانی که شرط حلقه دارای ارزش درستی باشد، این روند ادامه پیدا می‌کند (بدنه‌ی حلقه اجرا می‌شود). حلقه‌هایی که از مکانیسم نگهبان استفاده می‌کنند، برای توقف حلقه باید شرایطی را مهیا کرد که شرط حلقه در داخل خود حلقه نقض گردد. اگر شرط حلقه نقض نشود، با حلقه‌ی بی‌نهایت روبرو می‌شویم. به کد زیر دقت کنید:

while-loop

همانطور که مشاهده می‌کنید نوشتن حلقه‌ی while بسیار ساده است. یعنی ابتدا کلمه‌ی کلیدی while را می‌نویسیم و بعد پرانتز‌های باز و بسته در جلوی آن قرار می‌دهیم و در آخر هم بدنه‌ی حلقه را مشخص می‌کنیم. شرط حلقه‌ی ما در داخل پرانتز‌ها قرار می‌گیرد و تا زمانی که شرط برقرار باشد، حلقه ادامه پیدا می‌کند. برنامه‌ای که در بالا نوشته شده است را بهتر است با حلقه‌ی for پیاده‌سازی کنیم. اما در اینجا صرفا برای آموزش ساختار حلقه‌ی while از این مثال استفاده شده است.

ساختار تکرار do-while

ساختار do-while نیز، هم از نظر استفاده و هم از نظر کاربرد مشابه ساختار while است. تنها تفاوت آن در این است که شرط حلقه در انتهای آن بررسی می‌شود. بنابراین دستورات داخل بلاک یک‌بار قبل از چک شدن شرط حلقه اجرا می‌گردد. نکته‌ی بسیار مهمی که در ساختار do-while وجود دارد و معمولا افراد مبتدی فراموش می‌کنند این است که بعد از پرانتز‌های باز و بسته که داخل آن شرط حلقه بررسی می‌شود، باید از علامت سمی کالن استفاده کرد. به کد زیر دقت کنید:

do-while-loop

در کد بالا یکی دیگر از کاربرد‌های کامنت‌ها دیده شده است. هنگامی که ما در برنامه کدی را نوشته‌ایم، اما به دلایلی نمی‌خواهیم فعلا آن کد اجرا شود و همچنین نمی‌خواهیم که آن کد را پاک کنیم، بنابراین آن کد را به صورت کامنت در می‌آوریم تا آن را نه کامپایلر اجرا کند و نه ما آن را پاک کنیم. در مثال بالا کدی که ما برای مثال حلقه‌ی while نوشته‌ایم را با کمی تغییرات به صورت کامنت در آورده‌ایم تا اجرا نشود.

ساختار do-while را در کد بالا مشاهده می‌کنید. ابتدا از کلمه‌ی کلیدی do استفاده می‌کنیم و بعد بدنه‌ی حلقه را مشخص می‌کنیم و در آخر هم شرط حلقه را می‌نویسیم. برنامه‌ای که ما در بالا نوشته‌ایم به این صورت است که اگر مقدار number کوچکتر از ۱۰ شد از حلقه خارج شود. این برنامه را اگر با while بنویسیم، برنامه‌ی ما هیچ خروجی‌ای ندارد. زیرا ابتدا شرط حلقه چک می‌شود و شرط هم برقرار نیست. بنابراین حتی یک‌بار هم بدنه‌ی while اجرا نمی‌شود. اما اگر در ساختار do-while همان برنامه را بنویسید، برنامه‌ی ما یک خروجی دارد. زیرا قبل از اینکه شرط حلقه بررسی شود، مقدار number چاپ شده است و بعد شرط حلقه بررسی شده است.

چه وقت بهتر است از کدام یک از این حلقه‌ها استفاده کنیم؟

همانطور که قبلا هم نیز متذکر شدیم، اگر از قبل تعداد دفعات مورد نیاز اجرای حلقه را بدانیم، بهتر است از ساختار for برای ایجاد حلقه استفاده کنیم. گرچه می‌توان از حلقه‌ی while نیز برای ایجاد حلقه‌ی تکرار با شمارنده استفاده کرد! اما از انجام این کار به شدت خودکاری کنید. زیرا از خوانایی برنامه می‌کاهد. اما هرگاه تعداد دفعات تکرار حلقه را ندانیم باید به دنبال یک نگهبان برای شرط حلقه باشیم تا بتوانیم از یکی از دو ساختار while یا do-while استفاده کنیم. همچنین هرگاه نیاز داشته باشیم دستورات داخل بلاک حلقه حداقل یکبار اجرا گردد، از ساختار do-while استفاده می‌کنیم، در غیر این صورت از ساختار while باید استفاده کرد.

استفاده از قابلیت‌های اکلیپس

تمام محیط‌های توسعه‌ی برنامه نویسی قابلیت‌هایی را دارند که برنامه‌نویسی را ساده‌تر می‌کنند. منظور از ساده کردن برنامه‌نویسی این است که مثلا اگر در سینتکس برنامه‌ی ما خطایی رخ داده باشد، محیط‌های توسعه، آن خطا را مشخص می‌کنند و راهکاری را نیز برای رفع آن مشکل پیشنهاد می‌دهند. البته همیشه این راه‌کار‌ها درست نیست. یا به عنوان مثالی دیگر قابلیت تکمیل کد‌ها را دارند. این کار جدا از اینکه به نوشتن برنامه سرعت می‌دهد، باعث می‌شود که کد‌ها به درستی نوشته شوند. همانطور که می‌دانید زبان جاوا یک زبان Case Sensitive است. یعنی به حروف بزرگ و کوچک حساس است. حالا فرض کنید برنامه‌نویس می‌خواهد از یک متد استفاده کند. بنابراین باید نام آن متد را دقیقا به همان صورتی که تعریف شده است بنویسد. ممکن است در نوشتن نام متد اشتباه کند. اما اگر از قابلیت تکمیل کد IDE استفاده کند هرگز این اشتباه رخ نمی‌دهد. به عنوان مثال فرض کنید که ما می‌خواهیم جمله‌ی ;()System.out.println را بنویسیم و رشته‌ای را به خروجی استاندارد ارسال کنیم. ما می‌توانیم فقط با نوشتن: sysout و سپس گرفتن دکمه‌های ترکیبی: Ctrl + Space جمله‌ی فوق را کامل کنیم. به این کار Template گفته می‌شود. برای دیدن Templateها در اکلیپس ابتدا به منوی Window بروید و بعد آخرین گزینه یعنی: Preferences را انتخاب کنید. در پنجره‌ی باز شده، از قسمت بالا سمت چپ عبارت Template را سرچ کنید. (شکل زیر):

template

همانطور که در تصویر مشاهده می‌کنید، طبق شماره‌های مشخص شده پیش بروید و در Template و بر روی sysout کلیک کنید. در قسمت Preview کد کامل آن نمایش داده می‌شود.

از دیگر قابلیت‌های محیط‌های توسعه این است که ما می‌توانیم مشخص کنیم که برای هر خط از کد ما یک عددی را درنظر بگیرید. به عکس زیر دقت کنید:

line-number

همانطور که در عکس مشخص است، ابتدا بر روی نوار کناری کلیک راست کنید و از منوی باز شده گزینه‌ی Show Line Numbers را انتخاب کنید (مستطیل قرمز رنگ). در ادامه اگر به کنار هر خط کد توجه کنید، شماره‌ای برای آن خط در نظر گرفته شده است (مستطیل آبی رنگ).

Perspective

یکی دیگر از قابلیت‌های موجود در اکلیپس، انتخاب پرسپکتیو است. اجازه دهید پرسپکتیو را اینگونه برای شما توضیح دهم. همانطور که قبلا اشاره کردیم، محیط‌های توسعه قابلیت‌هایی را برای برنامه‌نویسان مهیا می‌کنند. بخشی از این قابلیت‌ها پنجره‌هایی است که ما برای مشاهده‌ی خروجی برنامه‌ی خود به آنها مراجعه می‌کنیم. اما ما در هنگام تولید یک برنامه کار‌های زیادی قرار است انجام دهیم. مثلا ما در هنگام نوشتن کد‌های یک برنامه فقط به پنجره‌های Console, Problems, Javadoc و ... احتیاج داریم. اما فرض کنید که ما در هنگام نوشتن برنامه بخواهیم برنامه را دیباگ کنیم. بنابراین ما به پنجره‌های دیگری از قبیل Variables, BreakPoints و ... هم احتیاج داریم. حالا فرض کنید اگر ما بخواهیم تمام این پنجره‌ها را در یک صفحه قرار دهیم، چقدر صفحه‌ی ما شلوغ می‌شود. بنابراین ما از قابلیتی به نام Perspective استفاده می‌کنیم. Perspective به این معنی است که ما پنجره‌هایی را که برای یک کار خاص (مثلا دیباگ کردن) احتیاج داریم را انتخاب می‌کنیم و آن را با یک نام مشخص Save می‌کنیم. بعدا هر موقع که خواستیم سریعا به پرسپکتیو دیباگ مراجعه می‌کنیم و به صورت حاضر و آماده از پنجره‌های موجود استفاده می‌کنیم. به صورت پیش‌فرض پرسپکتیو اکلیپس (برای نسخه‌ی JavaSE) جاوا (Java) است. برای دیدن Perspective‌های دیگر به عکس زیر توجه کنید:

Perspective

در تصویر بالا Perspective پیش‌فرض با یک فلش آبی رنگ مشخص شده است. برای دیدن پرسپکتیو‌های دیگر همان‌طور که در عکس بالا با یک فلش قرمز رنگ مشخص شده است، بر روی دکمه‌ی اشاره شده کلیک کنید. با تصویر زیر مواجه می‌شوید:

debug

به عنوان مثال اولین پرسپکتیو یعنی Debug را انتخاب و بعد بر روی دکمه‌ی OK کلیک کنید. بعد از OK کردن نمای صفحه عوض می‌شود و همچنین پرسپکتیو Debug نیز در کنار پرسپکتیو Java قرار می‌گیرد (تصویر زیر):

debug

همانطور که مشاهده می‌کنید چینش پنجره‌های اکلیپس عوض شد و بعضی از پنجره‌ها غیب شدند و بعضی دیگر جای آن‌ها را گرفتند. حالا برای برگشتن به پرسپکتیو جاوا فقط کافی است بر روی پرسپکتیو جاوا کلیک کنید. همچنین می‌توانید براساس سلیقه‌ی خود چینش پنجره‌ها را تغییر دهید (راست کلیک بر روی پرسپکتیو و انتخاب گزینه‌ی: ...Customize) و با نام دلخواه آنها را Save کنید. برای این کار کافی است بر روی پرسپکتیو مورد نظر کلیک راست کنید و بعد گزینه‌ی ...Save As را انتخاب کنید. در پنجره‌ی باز شده یک نام برای پرسپکتیو خود انتخاب کنید و سپس پنجره را OK کنید. البته پیشنهاد می‌شود که تغییری در پرسپکتیو‌های پیش‌فرض ایجاد نکنید. زیرا تمام آن‌ها برای یک کار خاص طراحی شده‌اند.

برنامه نویسی جاوا قسمت 10

آموزش برنامه نویسی جاوا: مفاهیم پایه در زبان جاوا (قسمت ۴)

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

 

 در ادامه‌ی جلسه‌ی قبل که با ساختار کنترلی if آشنا شدیم، در این جلسه با یکی دیگر از ساختار‌های کنترلی تحت عنوان switch آشنا می‌شویم. ساختار switch مشابه‌ if else چندگانه است. ولی این ساختار تنها برای ارزیابی مساوی بودن یک عبارت با مقادیر گوناگون به کار می‌رود. به کد زیر با تمام دقت نگاه کنید:

switch

برای نوشتن ساختار سوییچ، ابتدا باید از کلمه‌ی کلیدی switch استفاده کنیم. سپس در مقابل آن یک جفت پرانتز باز و بسته می‌نویسم. بعد از این کار ما باید بدنه‌ی switch را مشخص کنیم. برای این کار از آکولاد‌های باز و بسته استفاده می‌کنیم. (در آموزش‌های قبلی در مورد بدنه‌ی متد‌ها و کلاس‌ها توضیح داده‌ایم). حالا باید case‌هایی را داخل بدنه‌ی switch بنویسیم. اگر بخواهیم case را در فارسی معنی کنیم، بهترین معنی واژه‌ی گزینه است. یعنی ما باید در داخل بدنه‌ی switch گزینه‌هایی را برای مقایسه با کلید اصلی بنویسیم. همانطور که در تصویر مشخص شده است، کلید ما مقداری است که در داخل پرانتز مقابل switch نوشته می‌شود. case‌های ما که به هر تعدادی می‌تواند باشد، از ابتدا یکی یکی با کلید اصلی مقایسه می‌شود و هرکدام از گزینه‌ها (case‌ها) که برابر با کلید اصلی بود، اجرا می‌شود. در کد از کلمه‌ی کلیدی دیگری با نام break استفاده شده است. کاربرد break به این صورت است که هرگاه مقدار یک case با کلید اصلی برابر شد و آن case اجرا شد، بعد از پایان کد‌های نوشته شده مربوط به گزینه‌ی مورد نظر، برنامه از ساختار switch خارج می‌شود و دیگر کد‌های مربوط به case‌های اجرا نمی‌شود. توجه داشته باشید که ما می‌خواهیم از بین چند گزینه فقط گزینه‌ای که با کلید اصلی برابر است را پیدا کنیم. بنابراین بعد از پیدا کردن گزینه‌ی مورد نظر و اجرای دستورات آن، دیگر نیازی نیست که سایر case‌ها اجرا شوند و باید از ساختار switch خارج شویم. اگر break را ننویسیم، تمام case‌ها یکی پس از دیگری اجرا می‌شود و خروجی برنامه‌ی ما یک چیز نامعلوم می‌شود. در آخر از یک کلمه‌ی کلیدی دیگری به نام default استفاده شده است. کاربرد default برای این است که فرض کنید تمام مقادیر case‌های ما با مقدار کلید اصلی برابر نباشند، در این صورت اگر default نباشد برنامه‌ی ما هیچ خروجی‌ای ندارد. ما می‌توانیم در default پیغامی را بنویسیم تا اگر مقادیر case‌های ما با کلید اصلی برابر نبودند، به کاربر نمایش دهد و برنامه‌ی ما بدون خروجی باقی نماند.

حالا می‌خواهیم با یک مثال بسیار ساده کاربرد ساختار سوییچ را آموزش دهیم. در این مثال ما مقدار 10 را برای کلید اصلی در نظر می‌گیریم. به کد زیر دقت کنید:

switch

همانطور که در کد مشخص است ما یک متغیر با نام num از نوع Integer (عدد صحیح) تعریف کرده‌ایم و مقدار آن را صفر در نظر گرفته‌ایم. سپس ساختار switch را نوشته‌ایم. متغیر num را برای کلید اصلی در نظر گرفته‌ایم. یعنی قرار است که ما case‌های داخل بدنه‌ی سوییچ را با متغیر num مقایسه کنیم و اگر هرکدام از case‌ها که مقدار آن با مقدار متغیر num برابر بود، کد مربوط به آن case اجرا می‌شود و سپس برنامه از ساختار switch خارج می‌شود.

برای مقدار دهی case‌ ها ابتدا کلمه‌ی کلیدی case را می‌نویسیم و سپس یک فاصله (space) می‌دهیم و بعد مقدار مورد نظرمان را در جلوی آن می‌نویسیم. مثلا اولین case ما مقدار صفر دارد. دومی مقدار یک و سومی مقدار دو دارد. توجه داشته باشید که 0, 1, 2 مقادیر case‌های ما هستند و به اشتباه فکر نکنید که case‌ها دارای شماره هستند. بعد از اینکه ما مقدار یک case را مشخص کردیم، در مقابل آن یک دو نقطه قرار می‌دهیم و سپس در مقابل آن یا در خط پایین آن دستورات مربوط به case را می‌نویسیم.

در این برنامه اولین case ما مقدار صفر دارد. مقدار این case با کلید اصلی مقایسه می‌شود. آیا مقدار آن با کلید اصلی یکسان است؟ بله. بنابراین کد مربوط به این case اجرا می‌شود. یعنی پیغام: Good Luck در خروجی استاندارد چاپ می‌شود و سپس از ساختار switch خارج می‌شود و دیگر case‌های بعدی اجرا نمی‌شوند. حالا می‌توانید به عنوان تمرین مقدار متغیر num را تغییر دهید تا خروجی‌های متفاوت آن را ببینید.

ساختار تکرار for

حلقه‌ی for پرکاربردترین حلقه در جاوا است. شاید بتوان برنامه‌هایی را که با ساختار for پیاده‌سازی می‌کنیم را با سایر حلقه‌های دیگر بنویسیم. اما هرکدام برای کار خاصی طراحی شده‌اند و بهتر است با توجه به شرایطی که در برنامه به وجود می‌آید، ساختار مناسب را انتخاب کنیم. شرط انتخاب حلقه‌ی for این است که ما تعداد دفعات تکرار حلقه را از قبل بدانیم. فرض کنید می‌خواهیم یک عملیات را ۱۰ مرتبه اجرا کنیم. بنابراین بهتر است که از ساختار for استفاده کنیم. ساختار کلی for به صورت زیر است. با دقت به کد نگاه کنید:

for-loop

همانطور که در کد فوق مشاهده می‌کنید ساختار بسیار ساده‌ای دارد. ابتدا کلمه‌ی کلیدی for را می‌نویسیم و بعد یک جفت پرانتز باز و بسته قرار می‌دهیم. چنانچه می‌بینید در داخل پرانتز ما سه قسمت جداگانه وجود دارد که هر قسمت با یک سمی‌کالن (;) از هم جدا می‌شوند. همانطور که قرار است حلقه‌ی ما به تعداد 10 بار اجرا شود، پس نیاز به یک شمارنده دارد که با هر بار اجرای حلقه مقداری به شمارنده‌ی ما اضافه یا کم شود. (مقداری که باید اضافه یا کم شود توسط برنامه نویس مشخص می‌شود). مثلا در برنامه‌ی ما مقدار شمارنده در هر بار اجرای حلقه یک واحد اضافه می‌شود. (در مورد ++i در ادامه‌ی همین آموزش توضیح می‌دهیم). قسمت دوم شرط حلقه است. شرط حلقه‌ی ما این است که تا زمانی که مقدار متغیر i به 9 نرسیده است، این حلقه ادامه داشته باشید و زمانی که به 9 رسید دیگر حلقه ادامه پیدا نکند و از ساختار for خارج شود. قسمت سوم هم گام حرکت شمارنده است. یعنی شمارنده‌ی ما چگونه تغییر کند. مثلا در برنامه‌ی ما در هر بار اجرای حلقه یک واحد به شمارنده اضافه می‌شود تا به عدد 9 برسد. ممکن است در یک برنامه‌ی دیگر بجای یک واحد، دو واحد و یا سه واحد به شمارنده اضافه شود یا ممکن است که از مقدار شمارنده کم شود. بنابراین تغییر شمارنده بستگی به برنامه‌ای است که در حال نوشتن آن هستیم.

عملگر ++

در مورد گام حرکت شمارنده نکته‌ای است که باید بسیار به آن دقت کنید. ما می‌توانیم یک متغیر را به صورت ++i یا i++ بنویسیم. یعنی علامت ++ (plus plus) یکبار در سمت راست متغیر قرار دارد و بار دیگر در سمت چپ آن. این عملگر باعث افزایش یک واحد در متغیر می‌شود. در بعضی از مواقع سمت راست یا چپ نوشتن عملگر ++ تغییری در برنامه ایجاد نمی‌کند. اما مفهوم آن را باید بدانید.

اگر عملگر ++ را در سمت راست متغیر بنویسید: یعنی ++i، مقدار متغیر i ابتدا در برنامه استفاده می‌شود و بعد یک واحد به مقدار متغیر اضافه می‌شود. اما اگر عملگر ++ را در سمت چپ متغیر بنویسید: یعنی i++، ابتدا به متغیر یک واحد اضافه می‌شود و بعد در برنامه استفاده می‌شود. برای روشن شدن این مسئله به مثال زیر دقت کنید:

++

خروجی برنامه‌ی بالا در زیر آمده است. با دقت نگاه کنید:

++

همانطور که در کد مشاهده می‌کنید ما ابتدا دو متغیر با نام‌های a و b ایجاد کرده‌ایم و مقدار آن‌ها را صفر در نظر گرفته‌ایم و بعد مقادیر آن دو متغیر را چاپ کرده ایم. همانطور که در خروجی مشاهده می‌کنید، مقادیر متغیر‌ها همانطور که خودمان مشخص کردیم، قبل از تغییر صفر است. اما بعد از تغییر مقدار متغیر a از صفر به یک تغییر کرده است اما متغیر b تغییر نکرده است. در حالی که ما در برنامه مقدار متغیر b را برابر با ++a در نظر گرفتیم. همانطور که گفتیم عملگر ++ باعث افزایش یک واحد در متغیر می‌شود، بنابراین باید متغیر b هم به یک تغییر می‌کرد. اما چرا تغییر نکرد!؟ دلیلش این است که ابتدا متغیر a در برنامه استفاده شد و بعد به مقدار آن یک واحد اضافه شد. یعنی ابتدا مقدار متغیر a که صفر بود به متغیر b داده شد و بعد به مقدار متغیر a یک واحد اضافه شد.

حالا بر می‌گردیم به حلقه‌ی for. ما می‌خواهیم هنگامی که برنامه اجرا شد، اعداد 0 تا 9 در خروجی استاندارد چاپ شود. برای این‌کار کد خود را به صورت زیر تغییر می‌دهیم:

شمارنده‌ی ما (متغیر i) مقدار صفر دارد و در هر بار اجرای حلقه یک واحد به آن اضافه می‌شود. ما همان متغیر را در خروجی استاندارد چاپ کرده‌ایم. بنابراین خروجی برنامه‌ی ما چاپ اعدا 0 تا 9 است.

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

for-loop

در کد بالا شرط حلقه هیچ وقت برقرار نمی‌شود. یعنی همیشه متغیر i یک واحد کم می‌آورد. برای همین این حلقه تا بی‌نهایت ادامه دارد. (بعد از اجرای برنامه، برای نگه داری برنامه بر روی دکمه‌ی قرمز رنگ در کنسول اکلیپس با نام Terminate کلیک کنید).

حلقه‌های تو در تو

اگر در داخل بدنه‌ی یک حلقه از یک حلقه‌ی دیگری استفاده شود، می‌گوییم که حلقه‌های تو در تو ایجاد شده‌اند. نکته‌ای که باید در مورد حلقه‌های تو در تو یا (Nested Loops) توجه کنیم این است که به ازای هر بار تغییر شمارنده‌ی حلقه‌ی بیرونی، حلقه‌ی درونی یک‌بار به طور کامل اجرا می‌شود. به عنوان مثال فرض کنید شمارنده‌ی حلقه‌ی بیرونی و داخلی 0 است. وقتی شمارنده‌ی حلقه‌ی بیرونی از صفر به یک تبدیل می‌شود، حلقه‌ی داخلی یک‌بار به طور کامل (به عنوان مثال اگر شرط حلقه 10 است) یعنی 10 بار اجرا می‌شود و بعد از ده بار اجرای حلقه‌ی داخلی، حلقه‌ی بیرونی یک‌بار دیگر تغییر می‌کند.

به عنوان تمرین برنامه‌ای بنویسید که جدول ضرب را از 0 تا 100 به صورت مرتب چاپ کند. (برای حل این مسئله در مورد کارکتر‌های کنترلی تحقیق کنید. به عنوان مثال کارکتر کنترلی t\). خروجی جدول ضرب به صورت زیر است:

nested-loops

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

برنامه نویسی جاوا قسمت 9

آموزش برنامه نویسی جاوا: مفاهیم پایه در زبان جاوا (قسمت ۳)

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

تقدم عملگر‌های حسابی

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

A + B * C

به ازای مقادیر C=2, B=3, A=5، اگر بخواهیم بدون دخالت تقدم عملگر‌ها عبارت را محاسبه کنیم، جواب 16 خواهد بود. اما این جواب درست نیست. زیرا در ریاضی عملگر ضرب که در جاوا با علامت ستاره (*) مشخص می‌شود، نسبت به جمع و تفریق سطح تقدم بالاتری دارد. بنابراین باید ابتدا ضرب انجام شود و سپس جمع و تفریق. بنابراین جواب عبارت فوق می‌شود 11. یعنی ابتدا B در C ضرب و سپس با A جمع می‌شود.

نکته: در برنامه نویسی از دو مفهوم عملگر و عملوند بسیار استفاده می‌شود. در ریاضیات، یک عملگر تابعی است که بر تابعی دیگر اعمال می‌شود. یک عملگر را یک عمل ریاضی گویند. مانند عمل جمع، ضرب، تقسیم و ... . همچنین واژه‌ی دیگری است با نام عملوند. یک عملوند، هدف یک عملیات ریاضی است. در مثال فوق حروف‌های A, B, C هر کدام یک عملوند هستند.
 در زیر فهرست کامل سطوح تقدم عملگر‌های حسابی نشان داده شده است.

تقدم عملگرها

همانطور که در جدول بالا نشان داده شده است، عملگر توان بالاترین سطح تقدم را دارد. توان در زبان جاوا با استفاده از متد ()pow حساب می‌شود. بعد عملگر‌های ضرب، تقسیم و منفی کردن یکتایی است. تمام این سه عملگر سطح تقدم یکسانی دارند. مثلا در عبارتی به صورت A + B + C با آنکه، دو عملگر جمع به کار رفته در آن، دارای تقدم یکسانی هستند. ولی علمگر سمت چپ دارای تقدم بالاتری است. چرا که در هنگام پویش (پردازش) عبارت، عملگر سمت چپ زود‌تر خوانده می‌شود. به عبارت دیگر دو عملگر با سطح تقدم یکسان، دارای تقدم مکانی نسبت به هم هستند.
به عنوان تمرین در مورد علامت منها تحقیق کنید. علامت منها سه کاربرد دارد.
با توجه به توضیحات فوق، ماشین (کامپیوتر) هنگام محاسبه‌ی عبارت‌های محاسباتی از چپ به راست شروع به خواندن عملگر‌ها می‌کند. اگر در عبارت عملگر‌هایی بود که تقدم آن‌ها با هم فرق داشت، خب مسلما کامپیوتر ابتدا عملگر‌هایی که سطح تقدم بالاتری دارند را حساب می‌کند. اما اگر همه‌ی عملگر‌ها سطح تقدم یکسانی داشته باشند، از چپ به راست خوانده و محاسبه می‌شود. اما یک نکته‌ی مهم در این بین وجود دارد که با قرارداد‌های معمولی در ریاضیات مطابقت ندارد. اگر بخواهیم با توجه به جدول بالا عبارت: A^B^C (عملگر ^ نشانگر توان است) را حساب کنیم، کامپیوتر از سمت چپ ابتدا A را به توان B و سپس پاسخ را به توان C می‌رساند. اما در ریاضی قرارداد است که عبارت فوق به صورت:
A^(B^C)
حساب شود. یعنی ابتدا B به توان C برسد و بعد A به توان جواب آن دو. همانطور که مشاهده کردید ما برای هندل کردن این قضیه از پرانتز‌ها استفاده کردیم. استفاده از پرانتز‌ها باعث می‌شود که کامپیوتر عبارت را طوری که ما می‌خواهیم حساب کند. مثلا در عبارت مقابل: A + B *C، اگر بخواهیم ابتدا A با B جمع شود و سپس در C ضرب شود، باید از پرانتزها استفاده کنیم. به صورت زیر:
(A +B) * C
به عنوان حرف آخر در این بخش، همیشه در برنامه نویسی از پرانتز‌ها در عبارت‌های جبری خود استفاده کنید. این کار هم باعث خوانایی کد می‌شود و هم اینکه احتمال خطا را کاهش می‌دهد.
به عنوان تمرین عبارت زیر را در نظر بگیرید و آن را حل کنید:
-A*L-G*O^R/I+T/H*M
M H T I R O G L A
7 2 6 4 3 2 8 6 5
جواب تمرین فوق 25- می‌شود.

 ساختار‌های کنترلی

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

در جاوا یک ساختار کنترلی‌ وجود دارد که شکل آن به صورت زیر است:

if(condition) {

                               //operations-1

}else {

                               //operations-2

}

همانطور که مشاهده می‌کنید دستوری بسیار ساده اما در عین حال کاربردی است. ابتدا شرط داخل پرانتز مقابل if بررسی می‌شود. اگر شرط درست یا برقرار بود operations-1 اجرا می‌شود و دیگر operations-2 اجرا نمی‌شود یا برعکس. ممکن است شرط برقرار نباشد، بنابراین operations-2 اجرا می‌شود.

حالا می‌خواهیم یک برنامه‌ی ساده بنویسیم. دو عدد را با هم مقایسه می‌کنیم. برنامه به این صورت است که اگر عدد اول از عدد دوم بزرگ‌تر بود یک پیغام. اگر کوچک‌تر بود یک پیغام و اگر هم مساوی بودن، یک پیغام دیگر چاپ می‌شود. به کد زیر دقت کنید:

if-else

همانطور که در کد مشاهده می‌کنید ما دو عدد صحیح تعریف کرده‌ایم که به ترتیب مقدار 10 و 35 را دارند. ابتدا در پرانتز‌های مقابل دستور if بررسی می‌شود که اگر عدد اول بزرگتر از عدد دوم است، یک پیغام چاپ شود. اگر شرط برقرار باشد ادامه‌ی کد اجرا نمی‌شود. اما اگر برقرار نباشد به سراغ بررسی شرط بعدی می‌رود. شرط بعدی که به صورت else if مشخص شده، بررسی می‌کند که اگر دو عدد با هم مساوی بودند پیغام دیگری چاپ شود و در آخر هم اگر هیچ‌کدام از شروط فوق برقرار نبود، یعنی عدد اول نه بزرگتر از عدد دوم و نه مساوی با آن بود، بنابراین یک چیز دیگر بیشتر باقی نمانده که آن هم کوچک‌تر بودن عدد اول است.

در جدول زیر فهرستی از عملگر‌های جاوا آمده است:

Operators

به جدول بالا با دقت نگاه کنید و کاربرد هرکدام را یاد بگیرید. نکته‌ای که برنامه نویسان تازه وارد ممکن است اشتباه کنند، عملگر انتساب (=) و عملگر برابری (==) است. در ریاضیات برای نشان دادن اینکه یک عدد با یک عدد دیگر برابر است از یک علامت مساوی (=) استفاده می‌کنند. ولی در برنامه نویسی باید برای این کار از دو علامت مساوی (==) استفاده کنید. اشتباه استفاده کردن از این علامت‌ها بروز خطاهای منطقی را در برنامه افزایش می‌دهد.

واسط کاربری

به عنوان آخرین مطلب در این آموزش، می‌خواهیم برنامه‌ای بنویسیم که خروجی آن دیگر در کنسول چاپ نشود. بلکه توسط کادر‌های گفتگو در جاوا و به صورت گرافیکی نمایش داده شود. برای این‌کار باید از کلاسی تحت عنوان JOptionPane استفاده کنیم.

به کد زیر دقت کنید:

GUI

 

در خط اول برنامه جمله‌ی import javax.swing.JOptionPane نوشته شده است. اما این را بدانید که وقتی می‌خواهیم در کلاسی که ساخته‌ایم از کلاسی استفاده کنیم که آن کلاس در یک پکیج دیگر قرار دارد، باید آن کلاس را اصطلاحا import کنیم. با import کردن، ما مسیر کلاس را مشخص می‌کنیم. یعنی در این برنامه می‌خواهیم از کلاسی استفاده کنیم که نام آن JOptionPane است و این کلاس در پکیجی قرار دارد که نام آن پکیج javax.swing است. نکته‌ای که باید به آن توجه کنید این است که اصلا خودتان را درگیر حفظ کردن نام پکیج‌ها نکنید و اصلا هم نیازی نیست که شما این کلاس‌ها را import کنید. زیرا اگر از قابلیت‌های تکمیل خودکار IDE ها استفاده کنید، خود IDE به صورت خودکار کلاس مورد نظر را import می‌کند. برای استفاده از قابلیت‌های تکمیل خودکار باید ابتدا چند حرف ابتدایی نام کلاس را بنویسید و سپس دکمه‌های ترکیبی: CTRL + SPACE را نگه دارید. با این کار هم نام کلاس کامل می‌شود و هم کلاس مربوطه وارد می‌شود. حالا به سراغ بررسی برنامه برویم:

در متد اصلی (main) ما ابتدا نام کلاس JOptionPane را می‌نویسیم. سپس از متدی با نام showMessageDialog استفاده می‌کنیم. این متد چهار پارامتر دریافت می‌کند. پارامتر اول که مقدار آن null است، مشخص می‌کند هنگامی که برنامه اجرا شد و کادر گفتگو نمایش داده شد، این کادر گفتگو دقیقا در وسط صفحه‌ی نمایش، نشان داده شود. (در مباحث گرافیک در جاوا می‌توان تعیین کرد که این گونه پیغام‌ها در یک فریم خاصی نمایش داده شود که در حال حاضر خارج از بحث است و به آن پرداخته نمی‌شود). در پارامتر دوم متنی که می‌خواهیم نمایش داده شود را می‌نویسیم که باید حتما بین دابل کوتیشن قرار بگیرد. پارامتر سوم title یا عنوان کادر گفتگو را مشخص می‌کند. به عنوان مثال اگر قرار است پیغامی چاپ شود و آن پیغام بیانگر یک ارور باشد، در title آن می‌توان نوشت: Error. پارامتر آخر هم نوع پیغام را مشخص می‌کند که این پیغام از نوع اطلاعات است.

برای آخرین پارامتر ما می‌توانیم پنج نوع دیالوگ مشخص کنیم که در زیر آمده است:

JOptionPane.ERROR_MESSAGE

JOptionPane.INFORMATION_MESSAGE

JOptionPane.WARNING_MESSAGE

JOptionPane.QUESTION_MESSAGE

JOptionPane.PLAIN_MESSAGE

اگر برنامه‌ی فوق را اجرا کنیم با خروجی زیر مواجه می‌شویم:

JOptionPane

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

برنامه نویسی جاوا قسمت 8

آموزش برنامه نویسی جاوا: مفاهیم پایه در زبان جاوا (قسمت ۲)

در این جلسه از آموزش می‌خواهیم راجع به داده‌ها صحبت کنیم. تمام برنامه‌های کامپیوتری بر مبنای داده‌ها ساخته و طراحی شده‌اند. ما کاربران کامپیوتر، روزانه بارها و بارها داده‌هایی را وارد برنامه‌های کامپیوتری می‌کنیم و برنامه‌های کامپیوتری پردازش‌هایی را روی داده‌ها انجام می‌دهند و نتیجه‌ای را برای ما ارسال می‌کنند. تمام این داده‌ها چه از نوع عدد، تاریخ، زمان، رشته و هر قالب دیگری که باشند، در حافظه‌ی کامپیوتر با ترکیبی از صفر و یک ذخیره می‌شوند. در جاوا هشت (8) نوع داده اصلی وجود دارد که به آن‌ها داده‌های پایه یا Primitive Types می‌گویند.

 

 داده‌های پایه به داده‌هایی گفته می‌شوند که داده‌های پیچیده از روی این داده‌ها ساخته می‌شوند. همانطور که گفته شد در جاوا هشت نوع داده‌ی اصلی وجود دارد. این هشت نوع در زیر آورده شده‌اند:

  1. byte
  2. short
  3. int
  4. long
  5. boolean
  6. char
  7. float
  8. double

داده‌های شماره‌ی 1 تا 4 (byte, short, int, long) داده‌هایی از نوع اعداد صحیح هستند. تفاوتی که بین این داده‌ها است، محدوده‌ای است که این داده‌ها پشتیبانی می‌کنند.

داده‌ی بولی (boolean)، داده‌ای است که مقداره آن "درست" یا "نادرست" است. (true OR false).

داده‌های float و double داده‌های اعداد اعشاری هستند و داده‌ی char نیز یک داده‌ی کارکتری است.

یک نکته که بنده یادگیری آن مطلب را به شما توصیه می‌کنم، تحقیق در مورد اندازه‌ی داده‌های فوق است. یعنی به عنوان مثال اندازه‌ی داده‌‌های int و byte به ترتیب 32 و 8 بیت است.

متغیر‌ها

در برنامه نویسی مفهومی است به نام متغیر یا (Variable). هنگامی که بخواهیم یکی از داده‌های فوق را در برنامه تعریف کنیم، مثلا داده‌ای از نوع عدد صحیح (int)، می‌گوییم متغیری از نوع int تعریف کرده‌ایم. اما دقیقا وظیفه‌ی متغیر چیست؟ وظیفه‌ی متغیر‌ها نگه‌داری داده‌های برنامه است. فرض کنید می‌خواهیم برنامه‌ای بنویسیم که سن کاربر را از او درخواست کند. وقتی که کاربر عدد سن خودش را وارد می‌کند باید این عدد جایی در حافظه‌ی کامپیوتر ذخیره شود تا هر موقع که لازم شد از آن استفاده کنیم. یا فرض کنید می‌خواهیم مقدار حساب بانکی یک شخص را بر روی سیستم ذخیره کنیم و هر موقع که لازم شد از آن استفاده کنیم یا آن را تغییر دهیم. متغیر مانند یک ظرف است که می‌توان داده‌ای را درون آن قرار داد و آن داده را تغییر داد یا دستکاری کرد.

هر متغیر دارای یک نام است که با استفاده از آن نام، می‌توانیم به داده‌ی مورد نظر که در حافظه‌ی کامپیوتر ذخیره شده است دسترسی پیدا کنیم. در زیر چند مثال از تعریف متغیر آورده شده است.

int i;

double d;

char c;

همانطور که در سه مثال بالا مشاهده می‌کنید برای تعریف متغیر ابتدا باید نوع متغیر را مشخص کرد. یعنی از نوع int یا عدد صحیح است، double (عدد اعشاری) یا char (داده‌ی کارکتری). بعد یک نام برای متغیر خود انتخاب می‌کنیم. (برای انتخاب نام باید از قوانین نامگذاری در جاوا پیروی کنیم و همچنین نامی مناسب). و در آخر هم علامت سمی‌کالن را قرار می‌دهیم.

حالا می‌خواهیم برنامه‌ای بنویسیم که دو عدد را با هم جمع کند و نتیجه را در خروجی استاندارد نمایش دهد. به کد زیر دقت کنید:

sum

همانطور که در کد بالا مشاهده می‌کنید ابتدا یک متغیر از نوع int که نام آن num1 است تعریف کرده‌ایم و مقداره 5 را برای آن در نظر گرفته‌ایم. (به نحوه‌ی مقدار دهی متغیر‌ها توجه کنید. ابتدا یک علامت مساوی (=) قرار می‌دهیم و بعد مقداره دلخواه را می‌نویسیم). در خط بعد نیز دوباره متغیری تعریف کردیم که نام آن num2 و مقدار آن 15 است. حالا می‌خواهیم وقتی این دو متغیر را با هم جمع کردیم، نتیجه را در یک متغیر دیگری ذخیره کنیم. برای این کار ما متغیر دیگری با نام result تعریف کرده‌ایم. در خط بعد متغیر result را نوشته‌ایم و این بار بجای اینکه برای مقداردهی متغیر result از مقادیر عددی استفاده کنیم، متغیرهای num1 و num2 را با استفاده از عملگر +، آن دو را با هم جمع کرده‌ایم و نتیجه در result ذخیره شده است. حالا می‌خواهیم نتیجه‌ی مورد نظر را در کنسول نمایش دهیم. بنابراین همانطور که مشاهده می‌کنید از استریم System.out استفاده کرده‌ایم. به آرگومان متد println توجه کنید. ابتدا جمله‌ی Result is را نوشته‌ایم. حالا می‌خواهیم داده‌ی ذخیره شده در result را نمایش دهیم. بنابراین از علامت + استفاده می‌کنیم و بعد result را می‌‌نویسیم. این علامت + داده‌ی متغیر result را از عدد صحیح (int) به رشته (String) تبدیل می‌کند. (در مورد استرینگ‌ها در فصل‌های آینده آشنا می‌شوید). برنامه را اجرا کنید و نتیجه آن 20 خواهد بود.

به عنوان یک تمرین، برنامه را طوری تغییر دهید که نیازی به استفاده از متغیر result نباشد.

به عنوان آخرین مطلب در این آموزش، ما متغیرها را می‌توانیم در یک خط هم تعریف کنیم (داده‌های هم نوع را). به مثال زیر نگاه کنید:

int num1, num2, num3;

char ch1, ch2, ch3;

همانطور که مشاهده کردید ما در ابتدای خط نوع متغیر را مشخص کردیم و بعد نام‌های متغیرها را در جلوی آن نوشتیم. برای جدا کردن متغیر‌ها از علامت کاما (,) استفاده کردیم. اما پیشنهاد می‌کنم که متغیرها را به این صورت تعریف نکنید. هر متغیر را در یک خط جداگانه تعریف کنید.

برنامه نویسی جاوا قسمت 7

آموزش برنامه نویسی جاوا: مفاهیم پایه در زبان جاوا (قسمت ۱)

در جلسات قبلی با مقدمات زبان جاوا آشنا شدیم. ابزار‌های لازم را روی سیستم نصب کردیم و ساده‌ترین برنامه‌ی جاوای خود را با نام Hello World، هم به صورت دستی (یعنی با استفاده از اپلیکیشن نُت پد) و هم با استفاده از IDE اکلیپس نوشتیم. از این آموزش تا چند آموزش بعدی، قصد داریم مفاهیم پایه در برنامه نویسی جاوا را آموزش دهیم. بنابراین آموزش‌ها کمی حجیم‌تر و سخت‌تر می‌شوند.

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

ابتدا برنامه‌ی اکلیپس را اجرا کنید و بعد از منوی Window گزینه‌ی Preferences را انتخاب کنید. وارده پنجره‌ی زیر می‌شوید:

Preferences

همانطور که در تصویر بالا مشاهده می‌کنید وارد پنجره‌ی Preferences شده‌اید. روی اولین گزینه که General است کلیک کنید و به ترتیبی که در عکس زیر مشاهده می‌کنید، گزینه‌های مشخص شده را انتخاب کنید:

Preferences

به ترتیب شماره‌هایی که در تصویر بالا مشخص شده است پیش بروید. در قسمت چهار (4) وقتی روی گزینه‌ی Basic کلیک می‌کنید، زیر مجموعه‌های آن نمایش داده می‌شود. شما کمی به پایین اسکرول کنید و آخرین گزینه یعنی Text Font را انتخاب کنید. همانطور که در تصویر زیر مشاهده می‌کنید، بعد از انتخاب کردن Text Font روی دکمه‌ی ...Edit کلیک کنید. پنجره‌ی Font باز می‌شود:

Font

همانطور که در تصویر مشخص شده از پنجره‌ی Font، سایز مورد نظر خود را انتخاب کنید. من سایز 12 را به شما پیشنهاد می‌کنم. بعد از انتخاب، تمام پنجره‌های باز را OK کنید تا بسته شوند.

حالا در اکلیپس یک پروژه‌ی جاوایی بسازید. سپس یک کلاس جاوا با نام MainClass ایجاد کنید. توجه داشته باشید که در هنگام ساختن کلاس، روی دکمه‌ی:

public static void main(String[] args)

کلیک نکنید. کلاس ساخته شده‌ی شما باید به شکل زیر باشد:

 

MainClass

همانطور که در تصویر بالا با یک فلش قرمز رنگ مشخص شده است، نام کلاس که MainClass است در بالای هر کلاس نمایش داده می‌شود.

هر برنامه‌ی جاوا حداقل از یک کلاس و یک متد (که نام متد main است) تشکیل شده است که البته در این کلاس متد main پیاده‌سازی نشده است. از آنجا که متد main حتما باید در یک کلاس جاوا پیاده‌سازی شود، بنابراین ما نام کلاسی را که این متد را پیاده‌سازی می‌کند، کلاس اصلی یا MainClass می‌نامیم. توجه داشته باشید که ما هر نامی را می‌توانیم برای کلاسمان انتخاب کنیم. اما باید نامی را انتخاب کنیم که متناسب با کاری که آن کلاس انجام می‌دهد باشد.

 اولین کلمه در کلاس بالا public است که ما با این کلمه‌ی کلیدی در فصل شی‌گرایی آشنا می‌شویم. بنابراین می‌توانیم یا آن را پاک کنیم یا اینکه فعلا کاری با این کلمه‌ی کلیدی نداشته باشیم و اجازه دهیم که همانجا باشد. بد نیست بدانید که در IDE اکلیپس کلمات کلیدی با رنگ بنفش مشخص می‌شوند. بنابراین نیازی به حفظ کردن کلمات کلیدی نیست.

برای ساختن هر کلاس در جاوا باید از کلمه‌ی کلیدی class استفاده کرد. (تمام کلمات کلیدی در جاوا با حروف کوچک انگلیسی هستند). بعد از نوشتن کلمه‌ی class باید نامی را برای کلاس خود انتخاب کنیم که در این آموزش نام MainClass انتخاب شده است. بعد از انتخاب نام کلاس، باید یک بلاک برای کلاسمان مشخص کنیم که این کار را با علامت‌های باز و بسته‌ی آکولاد انجام می‌دهیم.

همانطور که مشاهده کردید اکلیپس به صورت خودکار تمام این کارها را انجام داده است و نیازی نیست که ما آن‌ها را انجام دهیم. اما باید بفهمیم که هر کد به چه معنی است. در ادامه می‌خواهیم متد main را به برنامه اضافه کنیم. در مورد متد‌ها چند نکته وجود دارد که باید بدانید:

ابتدا اینکه متدها دو نوع هستند. یا مقداره برگشتی ندارند (یعنی از نوع void هستند) یا مقداره برگشتی دارند. (نگران نفهمیدن مقادیر برگشتی و غیر برگشتی در متدها نباشید. در ادامه‌ی آموزش‌ها با این نوع متد‌ها آشنا می‌شوید). متد main از نوع void است.

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

نام تمام متدها با حرف کوچک انگلیسی شروع می‌شود. اگر به متد main هم توجه کنید با حرف کوچک انگلیسی نوشته شده است. اگر هم نام متد چند بخشی بود، به جز اولین حرف بخش اول نام متد که باید با حرف کوچک باشد، حرف‌های اول بخش‌های دیگر متد با حرف بزرگ نوشته می‌شوند. (کمی پیچیده شد!؟). به مثال زیر توجه کنید:

نام یک بخشی یک متد: print: همانطور که مشاهده می‌کنید نام متد با حرف کوچک انگلیسی شروع شده است.

نام دو بخشی یک متد: printSomething: همانطور که مشاهده می‌کنید نام بخش دوم متد که Something است با حرف بزرگ انگلیسی شروع شده است.

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

نامی که برای تمام متدها انتخاب می‌کنیم باید نامی باشد متناسب با کاری که قرار است آن متد انجام دهد. مثلا فرض کنید می‌خواهیم متدی بنویسیم که آن متد دو عدد را با هم جمع کند. بنابراین sum نام مناسبی است.

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

public static void main(String[] args)

را فعال کنیم. راه دیگر نوشتن متد به صورت دستی است و راه دیگر آن نوشتن کلمه‌ی main در بدنه‌ی کلاس و بعد از آن گرفتن دکمه‌های ترکیبی:

CTRL + SPACE که توسط اکلیپس متد main نوشته می‌شود. تصویر زیر:

main

همانطور که در تصویر بالا مشاهده می‌کنید با گرفتن دکمه‌های ترکیبی CTRL + SPACE اکلیپس پیشنهاداتی را به ما می‌دهد که ما اولین گزینه را انتخاب می‌کنیم. بعد از انتخاب اولین گزینه کلاس ما به صورت زیر می‌شود:

mainMethod

همانطور که مشاهده می‌کنید کلاس ما کامل شد.

حالا می‌خواهیم متدی را بسازیم که وقتی که آن را فراخوانی می‌کنیم متنی در خروجی استاندارد نمایش داده شود.

برای اینکه متدی را بسازیم ابتدا باید نوع برگشتی یا غیر برگشتی آن متد را مشخص کنیم. (البته باید سطح دسترسی اون متد را هم مشخص کنیم که در این آموزش این کار را انجام نمی‌دهیم). متد مد نظر ما از نوع void است.

بعد نام متد را مشخص می‌کنیم. نامی که در نظر می‌گیریم printSomething است. فقط ما در این متد از کلمه‌ی کلیدی static هم استفاده می‌کنیم. در آموزش‌های بعدی کاربرد این کلمه‌ی کلیدی توضیح داده خواهد شد.

توجه داشته باشید که این متد را خارج از  بدنه‌ی متد اصلی (main) و داخل بدنه‌ی کلاس بنویسید. به شکل زیر:

printSomething

متد ما همانطور که گفته شد، نوشته شد. (تصویر بالا):

حالا می‌خواهیم هر موقع که این متد را فراخوانی یا Call می‌کنیم، متنی را در خروجی استاندارد یا همان کنسول چاپ کند.

در فصل سیستم فایل با معنی و مفهوم استریم (Stream) آشنا خواهید شد. اما این را بدانید که در جاوا و در کلاس java.lang.System دو نوع استریم برای ورودی و خروجی استاندارد تعریف شده است. یکی System.out و دیگری System.in که همانطور که از نام‌هایشان معلوم است به ترتیب برای ارسال داده‌ها به خروجی استاندارد و دریافت داده از وردی استاندارد است. در این آموزش می‌خواهیم داده‌ای را به خروجی استاندارد ارسال کنیم. بنابراین باید از استریم System.out استفاده کنیم. دو متد ()print و ()println برای چاپ داده استفاده می‌شوند. فرق این دو متد در آموزش‌های قبل گفته شده است. ما از متد ()println استفاده می‌کنیم. به تصویر زیر توجه کنید:

printSomething

همانطور که مشاهده می‌کنید کد گفته شده را در بلاک (بلوک) یا بدنه‌ی متد ()printSomething نوشته‌ایم. حالا می‌خواهیم این متد را اجرا کنیم. همانطور که در آموزش‌های قبلی گفته شد، متد main نقطه‌ی شروع هر برنامه‌ی جاوا است. در کد بالا بدنه‌ی متد اصلی (main) خالی است و اگر برنامه را اجرا کنیم، برنامه هیچ خروجی‌ ندارد. بنابراین ما باید داخل متد main، متد ()printSomething را فراخوانی کنیم. منظور از فراخوانی یا Call کردن متد، استفاده از متد است. پس برای استفاده از متد ()printSomething باید نام این متد را داخل متد main بنویسیم. به صورت زیر:

printSomething

 

سپس باید برنامه را ذخیره یا Save کنیم. برای این‌کار دکمه‌های ترکیبی CTRL + S را همزمان نگه دارید. سپس برای اجرای برنامه مجددا دکمه‌های ترکیبی CTRL + F11 را نگه دارید تا برنامه اجرا شود. حالا باز هم با اجرای برنامه چیزی در خروجی استاندارد نمایش داده نمی‌شود. زیرا ما در متد ()println هیچ متنی را ننوشته‌ایم. برای این کار ابتدا یک جفت دابل کوتیشن در متد ()println قرار دهید و بعد هر متنی را که می‌خواهید بنویسید. مثلا من متن: Welcome to ZoomIT را می‌نویسم. تصویر زیر:

Welcome

حالا دوباره برنامه را Save و اجرا کنید. نتیجه‌ی اجرای برنامه:

Result

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

برنامه نویسی جاوا قسمت 6

آموزش برنامه نویسی جاوا: راه اندازی اکلیپس

در جلسه‌ی قبل IDE محبوب اکلیپس را دانلود کردیم. در این جلسه می‌خواهیم نحوه‌ی استفاده از این IDE را آموزش دهیم. بنابراین یاد می‌گیریم که چطور یک پروژه‌ی جاوایی در اکلیپس ایجاد کنیم و همچنین با نحوه‌ی ساختن کلاس آشنا می‌شویم. در این جلسه دقیقا کار‌هایی را که در قسمت آموزش برنامه نویسی جاوا: Hello World به صورت دستی انجام دادیم، توسط اکلیپس انجام می‌دهیم تا شما در همین ابتدای کار به ضرورت وجود IDE ها در برنامه نویسی پی ببرید.

 بعد از اینکه دانلود برنامه‌ی اکلیپس به پایان رسید، ابتدا باید فایل را از حالت فشرده خارج کنید. برای این کار می‌توان از اپلیکیشن‌هایی که در این زمینه تولید شده‌اند استفاده کرد یا می‌توان از ابزار‌های خوده سیستم عامل استفاده کرد. بنده از اپلیکیشن WinRAR برای این کار استفاده می‌کنم. بهتر است که فایل اکلیپس را در محلی از هارد دیسک قرار دهیم که دسترسی به آن آسان باشد. Desktop را به شما پیشنهاد می‌کنم. بعد از اینکه فایل اکلیپس را به دسکتاپ انتقال دادیم، بر روی فایل کلیک راست کرده و گزینه‌ی Extract Here را انتخاب می‌کنیم تا در همان دسکتاپ از حالت فشرده خارج شود. (تصویر زیر):

01useeclipse01 873d1

بعد از اینکه فایل ZIP را از حالت فشرده خارج کردید، فایلی ایجاد می‌شود با نام eclipse. وارد این فایل شوید. برنامه‌‌ی اکلیپس نیازی به نصب ندارد و برای اجرا، شما باید فایل eclipse.exe را اجرا کنید. (در تصویر زیر با یک بیضی سبز رنگ مشخص شده است):

01useeclipse02 0eaae

بعد از اینکه بر روی فایل اجرایی اکلیپس کلیک کردید، با اولین پنجره‌ای که مواجه می‌شوید، پنجره‌ی زیر است.

01useeclipse03 97ece

این پنجره Workspace Launcher نام دارد. همانطور که از نامش پیداست، مسیره ذخیره‌سازی پروژه‌هایی که ما ایجاد می‌کنیم را در هارد دیسک مشخص می‌کند. بنابراین بهتر است که مسیر Workspace را همان دسکتاپ قرار دهیم. اما قبل از مشخص کردن مسیر، ابتدا در دسکتاپ فولدری با نام workspace ایجاد کنید و سپس با استفاده از دکمه‌ی Browse مسیر workspace در دسکتاپ را انتخاب کنید. اما قبل از OK کردن، به CheckBox (چک باکس) که در تصویر بالا با یک فلش قرمز رنگ مشخص شده است توجه کنید. اگر این گزینه فعال نباشد، با هر بار بستن اکلیپس و اجرای مجدد آن، این پنجره نمایش داده می‌شود و از شما درخواست مجدد مشخص کردن Workspace را می‌کند. بنابراین، این گزینه را انتخاب کنید و بعد بر روی دکمه‌ی OK کلیک کنید تا برنامه اکلیپس اجرا شود. (بعد از اجرا با تصویر زیر مواجه می‌شوید):

01useeclipse04 a2881

همانطور که مشاهده می‌کنید اکلیپس به شما خوش آمد می‌گوید. با این صفحه کاری نداریم. بنابراین همانطور که در گوشه بالا، سمت راست تصویر با یک فلش سبز رنگ مشخص شده است، بر روی دکمه‌ی Worckbench کلیک کنید تا وارد صفحه‌ی اصلی برنامه شوید. (تصویر زیر):

01useeclipse05 f8517

حالا وقت آن است که اولین پروژه‌ی جاوایی خودمان را ایجاد کنیم. برای ساختن پروژه، ابتدا از منوی File گزینه‌ی New را انتخاب کنید و بعد اولین گزینه، یعنی Java Project را انتخاب کنید. (تصویر زیر):

01useeclipse06 c2b92

بعد از انتخاب گزینه Java Project، با پنجره‌ی زیر مواجه می‌شوید:

01useeclipse07 abd94

همانطور که در تصویر فوق مشاهده می‌کنید، پنجره‌ای برای ساختن پروژه ظاهر شده است. ابتدا یک نام برای پروژه‌ی خود انتخاب می‌کنیم. ما در این آموزش نام: FirstJavaProgrm را نوشته‌ایم. به بقیه‌ی گزینه‌های این صفحه کاری نداشته باشید. بنابراین بر روی دکمه‌ی Finish کلیک کنید. بعد از ساخته شدن پروژه، باید یک کلاس بسازیم.

نکته: در برنامه‌های بزرگ جاوا، ممکن است بیش از هزار کلاس وجود داشته باشد. اما این نکته را به خاطر بسپارید که هر برنامه‌ی جاوا کم کم یک کلاس و یک مِتُد دارد.
در مورد کلاس‌ها و متدها در آموزش‌های مربوط به فصل شی گرایی به طور مفصل صحبت خواهیم کرد و کاربرد اصلی آن‌ها را یاد خواهیم گرفت.
 برای ساختن کلاس ابتدا پروژه‌ی خودتان را انتخاب کنید و بعد کلیک راست کنید. منویی باز می‌شود که به آن منوی پاپ آپ (Pop-up) گفته می‌شود. اولین گزینه از این منو که New است را انتخاب کنید و بعد گزینه Class را انتخاب کنید. (تصویر زیر):
01useeclipse08 4c22d
درضمن، در بالای همین عکس، قسمتی که با یک فلش قرمز رنگ مشخص شده است را Package Explorer می نامند. تمام پروژه‌هایی که ما ایجاد می‌کنیم در این قسمت (Package Explorer) قرار می‌گیرند.
بعد از کلیک کردن بر روی دکمه‌ی Class، با پنجره‌ی زیر مواجه می‌شویم:
01useeclipse09 0c8f1
در مورد قسمت‌های مشخص شده در تصویر بالا کمی توضیح می‌دهم:
 بیضی سبز رنگ اولی مربوط به پکیج است. این که پکیج چیست و چه کاربردی دارد، در آموزش‌های بعدی در مورد آن صحبت می‌کنیم. بنابراین در این آموزش برای پکیج چیزی نمی‌نویسیم.
قسمت بعدی که Name است، باید نامی برای کلاس خودمان انتخاب کنیم. نامی که برای کلاسمان انتخاب می‌کنیم بسیار مهم است. باید نامی انتخاب کنیم که نشان دهنده‌ی کاری باشد که آن کلاس قرار است انجام بدهد. همانطور که در آموزش قبلی گفته شد، هر برنامه‌ی جاوا دارای یک متد اصلی به نام متد main است که نقطه شروع هر برنامه‌ی جاوا است. بنابراین چون در این کلاس متد main را قرار است پیاده‌سازی کنیم، کلاسمان، کلاس اصلی است. بنابراین نامی که برای کلاس انتخاب می‌کنیم، MainClass است.
آخرین قسمت که با یک مستطیل قرمز رنگ مشخص شده است، یک چک باکس دارد. که اگر این چک باکس را انتخاب کنیم، اکلیپس به صورت خودکار متد main را در کلاس ما پیاده‌سازی می‌کند و دیگر نیازی نیست که ما به صورت دستی متد main را خودمان بنویسیم و این یکی از مزایای IDE ها است. چون IDE زحمت نوشتن کد را به گردن می‌گیرد و کار ما را به عنوان برنامه نویس راحت تر می‌کند. درضمن IDE ها در نوشتن کدها به هیچ عنوان اشتباه نمی‌کنند. بنابراین خیال ما از درست نوشته شدن کدها راحت است. بنابراین، این گزینه را انتخاب کنید و بعد بر روی دکمه‌ی Finish کلیک کنید.
 
نکته: در مورد انتخاب نام برای متغیرها، متدها، پکیج‌ها و کلاس ها نکاتی هست که در هر آموزش مربوطه توضیح داده می‌شود. در این آموزش در مورد نام گذاری کلاس‌ها توضیح می‌دهیم. البته یک سری قوانین کلی در جاوا برای نام گذاری وجود دارد و شامل همه‌ی موارد می‌شود. اما برای نام گذاری بخش‌های مختلف جاوا تفاوت‌های کوچکی هست که ما در هر مبحث به صورت جداگانه به آن ها اشاره می‌کنیم. نکته‌ای که باید بسیار به آن توجه کنید این است که نام کلاس باید با حرف بزرگ انگلیسی شروع شود. البته اگر با حرف کوچک هم شروع شود مشکلی نیست. اما یک قانون نانوشته در بین برنامه نویسان است که نام تمام کلاس‌های خود را با حرف بزرگ شروع می‌کنند و اگر نام کلاس از دو بخش تشکیل شده بود، مثلا در همین آموزش نام کلاس ما MainClass است، باید حرف دوم بخش بعدی نام نیز با حرف بزرگ شروع شود. در این آموزش بخش اول نام کلاس ما Main است که با حرف بزرگ انگلیسی شروع شده و بخش دوم Class است که باز هم با حرف بزرگ شروع شده است. بنابراین اگر ما نام کلاس را به صورت Mainclass بنویسیم، غلط نیست! اما قشنگ هم نیست. نکته‌ای دیگر که باید به آن توجه کنیم این است که نمی‌توانیم نام کلاس خود را با اعداد شروع کنیم. مثلا 2MainClass کاملا غلط است یا نمی‌توانیم در بین کارکترهای نام کلاس، از کارکترهای خاص مثل ستاره (*)، هش مارک (#)، درصد (%) و ... استفاده کرد. اما در میان کارکترهای خاص می توان از علامت دولار ($) استفاده کرد یا می‌توان از خط زیر یا Underscore (_) نیز استفاده کرد. اما باز هم تاکید می شود که به هیچ عنوان از این نام‌ها استفاده نکنید. به عنوان مثال این نام: Main_Class کاملا صحیح است، اما خوب نیست که استفاده کنیم. همچنین از کلمات کلیدی جاوا هم نمی‌توانیم استفاده کنیم. در هر زبان برنامه نویسی یک سری کلمات، از قبل رزرو شده است که نمی‌توان از آن‌ها برای نام گذاری استفاده کرد. به عنوان مثال کلمه‌ی کلید class، یک کلمه‌ی رزرو شده است که برای ساختن یک کلاس در جاوا استفاده می‌شود.بنابراین ما نمی‌توانیم از این نام استفاده کنیم و در آخر اینکه تمام کلمات کلیدی با حروف کوچک انگلیسی نوشته می‌شوند.
بعد از ساخته شدن کلاس، با تصویر زیر مواجه می‌شویم:
01useeclipse10 a3347
همانطور که در تصویر بالا مشاهده می‌کنید، کدهایی که نوشته شده است، حداقل کدهایی است که یک برنامه‌ی جاوا برای اجرا به آن نیاز دارد. اگر یادتان باشد در آموزش Hello World ما این کدها را خودمان نوشتیم. درصورتی که حالا IDE برای ما این کار را انجام داده است. حالا برای اینکه فضای بیشتری برای نوشتن کد در اختیار داشته باشیم، همانطور که در تصویر بالا با یک فلش قرمز رنگ مشخص شده است، بر روی دکمه‌ی Maximize کلیک کنید. بعد کامنت ها که با رنگ سبز نوشته شده‌اند (در آموزش‌های بعدی در موردشان توضیح داده می‌شود) را پاک کنید. نتیجه به صورت زیر است:
01useeclipse11 df33e
حالا می‌خواهیم وقتی برنامه اجرا شد، عبارت: Welcome to Java Programming نمایش داده شود. بنابراین باید از جمله‌ی: ;()System.out.print استفاده کنیم. اما بجای نوشتن کامل این جمله، عبارت مقابل را بنویسید: sysout و سپس دکمه های ترکیبی CTRL + SPACE را فشار دهید تا کد کامل شود. در بین پرانتزهای ایجاد شده، یک جفت کوتیشن قرار دهید و سپس عبارت فوق را بنویسید. به شکل زیر:
01useeclipse12 bd1ab
حالا با نگه داشتن دکمه‌های ترکیبی CTRL + S برنامه را Save کنید. بعد از Save کردن، دکمه‌های ترکیبی CTRL + F11 را نگه دارید تا برنامه اجرا شود.
01useeclipse13 76e81
همانطور که مشاهده می‌کنید، عبارت مورد نظر ما در خروجی استاندارد یا همان کنسول برنامه چاپ شد.

برنامه نویسی جاوا قسمت 5

آموزش برنامه نویسی جاوا: eclipse

در این جلسه از آموزش می‌خواهیم از برنامه‌ی اکلیپس یا به عبارتی از IDE اکلیپس برای نوشتن برنامه‌های جاوا استفاده کنیم. IDE مخفف: Integrated Development Environment است. در واقع IDE‌ ها تمام ابزارهای مورد نیاز برای برنامه نویسان را به طور منظم فراهم می‌کنند تا برنامه نویسان فقط روی نوشتن و طراحی برنامه تمرکز کنند و خود را درگیر مسائل جزئی مثل کامپایل کردن برنامه نکنند.

 برای هریک از زبان‌های برنامه نویسی، IDE های بسیار زیادی وجود دارد و می‌توان با همه‌ی آن‌ها برنامه را به درستی نوشت و اجرا کرد. اما از میان تمام IDE ها معمولا همیشه یک IDE از بقیه سرتر و بهتر است. به عنوان مثال برای زبان برنامه نویسی #C (سی شارپ) بهترین IDE، ویژوآل استودیو است. برای زبان جاوا هم IDE های زیادی وجود دارد که معروف‌ترین و محبوب‌ترین آن‌ها عبارت اند از:

  • اکلیپس (eclipse)
  • اوراکل نِت بینز (Oracle NetBeans)
  • جِت برینز اینتلیج آی دیا (Jetbrains Intellij Idea)

اکلیپس یک IDE اُپن سورس (Open Source) و مبتنی بر پلاگین (Plug-in)، و بسیار مناسب برای تولید برنامه‌های مدرن جاوا (JavaEE) است. زیرا از آنجایی که جاوا ای ای مجموعه‌ای از تکنولوژی ها است، بنابراین پلاگین‌های مختلفی برای تکنولوژی‌های مختلف تولید شده است و به راحتی می‌توان آن‌ها را از اینترنت دانلود و به اکلیپس اضافه کرد. ممکن است در ذهن شما این سوال به‌وجود بیاید که پلاگین چیست!؟ پلاگین‌ها (افزونه‌ها) برنامه‌های کوچکی هستند که توسط شرکت‌های مختلف تولید می‌شوند و با نصب آن‌ها روی یک برنامه، می‌توان قابلیت‌های جدیدی را به آن برنامه اضافه کرد. به عنوان مثال، ADT یکی از پلاگین‌های معروف برای توسعه‌ی اندروید روی اکلیپس است. متاسفانه اکلیپس دارای باگ‌های فراوانی است و علت آن هم هسته اکلیپس نیست، بلکه باگ‌هایی است که در پلاگین‌های آن موجود است. بنابراین تا می‌توان باید سعی کرد از پلاگین‌هایی که توسط شرکت‌های معتبر تولید شده‌اند استفاده کرد.

 نت بینز یک IDE حرفه‌ای و به اصطلاح همه فن حریف است. این IDE توسط شرکت اوراکل نوشته شده است و می‌توان به جز جاوا، برای زبان‌های برنامه‌نویسی دیگری هم مثل: PHP, C++, Groovy و ... نیز استفاده کرد. در این IDE هم مانند اکلیپس می‌توان پلاگین‌هایی را اضافه کرد. اما بسیاری از سرویس‌ها به صورت داخلی در این IDE پیاده‌سازی شده‌اند. به عنوان مثال وب سرور Apache Tomcat (آپاچی تامکت) به صورت داخلی در این IDE پیاده‌سازی شده است و دیگر نیازی نیست تا به صورت جدا گانه این وب سرور را دانلود و نصب کنیم. اما یکی از ویژگی‌های مهم این IDE، این است که ابزارهای بسیار حرفه‌ای برای طراحی رابط گرافیکی کاربر دارد و یکی از مشکلات بزرگ برنامه نویسان جاوا را حل کرده است.

 آخرین IDE‌ای که در مورد آن صحبت می‌کنیم، Jetbrains Intellij Idea است، که معنی "تند مغزها؛ ایده هوشمند" را دارد. این IDE یکی از بهترین ویرایشگر‌ها برای زبان برنامه نویسی جاوا است که دارای هوش فوق العاده‌ای است. اما با توجه به تجربیات شخصی و مطالعاتی که بنده در این زمینه داشتم، این IDE اصلا مناسب برای برنامه‌های مدرن جاوا (JavaEE) نیست و صرفا برای برنامه نویسی جاوا نسخه‌ی استاندارد آن و برنامه نویسی وب در جاوا می‌توان از آن استفاده کرد. همچنین این IDE همانند اکلیپس و نت بینز امکان اضافه کردن پلاگین را دارد.

باتوجه به بررسی‌های فوق، ما برای این دوره‌ی آموزشی، بهترین، محبوب‌ترین و ساده‌ترین IDE، یعنی اکلیپس را انتخاب می‌کنیم. در ادامه‌ی این آموزش، ما نحوه‌ی دانلود این IDE را آموزش می‌دهیم.

 برای دانلود اکلیپس باید به سایت اکلیپس مراجعه کنید. بعد از وارد شدن به سایت اکلیپس، با نمایی مشابه تصویر زیر مواجه می‌شوید:

01eclipse01 f18a6

همانطور که در تصویر فوق با یک بیضی سبز رنگ مشخص شده است، بر روی دکمه DOWNLOAD کلیک کنید تا وارد صفحه‌ی زیر شوید:

01eclipse02 93cd4

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

01eclipse03 a3c0a

دوباره به همان صورتی که در تصویر فوق، با یک مستطیل قرمز رنگ مشخص شده است، نوع سیستم عامل خودتان را انتخاب کنید تا وارد صفحه‌ی زیر شوید:

 01eclipse04 18b87

همانطور که در تصویر فوق با یک بیضی سبز رنگ مشخص شده است، بر روی دکمه‌ی دانلود کنید تا وارد صفخه‌ی زیر شوید:

01eclipse05 97994

در صفحه فوق، کمی منتظر بمانید تا دانلود شروع شود. پیشنهاد می‌شود که از نرم افزار‌های مدیریت دانلود مثل IDM برای دانلود استفاده کنید.

برنامه نویسی جاوا قسمت 4

آموزش برنامه نویسی جاوا: Hello World

در این جلسه از آموزش قصد داریم اولین برنامه‌ی جاوای خود را بنویسیم که با اجرای برنامه، عبارت Hello World در صفحه، نمایش داده می شود. برای نوشتن برنامه، ما نیاز به یک ویرایشگر متن داریم که ما از ویراشگر ساده و محبوب نُت پد (Notepad) در سیستم عامل ویندوز استفاده می کنیم.

 ابتدا برنامه Notepad را اجرا کنید. بعد از اجرا با عکس زیر مواجه می‌شوید:

01hello eb5c5

بعد از اجرای برنامه نُت پد، باید شروع به نوشتن کد کنیم.

نکته: "ما در این قسمت از آموزش به نکات ریز برنامه هیچ توجهی نمی کنیم. چون قصد ما از این آموزش اجرای یک برنامه ساده جاوا است تا شما فقط با نحوه‌ی اجرای برنامه آشنا شوید. در جلسات آینده ما به طور مفصل در مورد تک‌تک کد‌های نوشته شده، در فصل‌های مربوطه توضیح می‌دهیم. بنابراین اصلا نگران نفهمیدن کدها نباشید."

حالا در فایل نت پد دقیقا به شکل زیر، کد‌ها را بنویسید:

02hello1 e29e7

خب حالا بررسی کنیم که این کد چه معنی دارد؟

برای ایجاد کلاس در جاوا، باید از کلمه کلیدی class استفاده کنیم. بعد از این کلمه، یک فاصله (space) قرار می‌دهیم و بعد نام کلاس خود را می‌نویسیم. (در مورد نحوه‌ی نام گذاری کلاس‌ها، متد‌ها و ... در جاوا، در فصل‌های بعدی به طور مفصل صحبت می‌کنیم). بعد از اینکه نام کلاس را نوشتیم (HelloWorld)، دوباره یک فاصله قرار می‌دهیم و بعد علامت آکولاد باز }را تایپ می‌کنیم. بعد با دوبار فشار دادن دکمه Enter در صفحه کلید، دو خط به پایین می‌رویم و این بار از علامت آکولاد بسته { استفاده می‌کنیم.

نکته: "بین آکولاد باز و آکولاد بسته را، بدنه کلاس، بدنه متد یا بلاک می‌نامند."

در ادامه ما متد main را به شکل زیر می‌نویسیم:

03hello2 7cc5b

همانطور که گفته شد، ما در این جلسه از آموزش با جزئیات کد هیچ کاری نداریم. کاری که ما در بالا انجام دادیم، یک متد ساخته‌ایم. (البته این متد، متد اصلی برنامه است که باید نام آن دقیقا main باشد. همانطور که در بالا نوشته شده است). متد main نقطه شروع هر برنامه در جاوا است. یعنی اگر متد main نباشد، برنامه اجرا نمی‌شود. تا اینجای کار ما حداقل کدی که برای اجرای یک برنامه جاوا به آن نیاز داریم را نوشته‌ایم.

نکته: "برای خوانا نوشتن کدها، از تو رفتگی استفاده کنید. برای این کار دکمه Tab روی کیبورد را فشار دهید"

در ادامه می‌خواهیم جمله‌ای را بنویسیم که وقتی برنامه اجرا شد، پیغام !!!Hello World را روی صفحه، نمایش دهد. برای این کار به صورت زیر عمل کنید:

04hello3 f5341

ما در داخل بدنه متد main از جمله: ;()System.out.println استفاده کرده‌ایم که می‌توانیم در خروجی استاندارد رشته‌ای را یا هر چیزه دیگری مثل اعداد را چاپ کرد. توجه داشته باشید که خروجی استاندارد، همان کنسول برنامه است.

در اینجا ما از متد ()println استفاده کرده‌ایم. البته می‌توانیم از متد ()print هم استفاده کنید. فرق این دو متد در این است که زمانی که ما از متد ()println استفاده می‌کنیم، بعد از اینکه خروجی برنامه ما در کنسول چاپ می‌شود، نشانگر ماوس ما به خط بعد رفته. ln مخفف کلمه line است.

حالا ما می‌خواهیم جمله !!!Hello World را در خروجی استاندارد چاپ کنیم. بنابراین ما در داخل پرانتز های باز و بسته متد()println یک جفت دابل کوتیشن قرار می‌دهیم.

نکته: "به علامت " دابل کوتیشن گفته می‌شود و به علامت ‘ سینگل کوتیشن گفته می‌شود. برای تایپ کردن سینگل کوتیکشن، دقیقا دکمه‌ی روبه روی دکمه ENTER در صفحه کلید را فشار دهید و برای تایپ دابل کوتیشن، همان دکمه را به همراه پایین نگه داشتن دکمه SHIFT در صفحه کلید فشار دهید."

بعد از اینکه دابل کوتیشن را نوشتیم، در بین آنها عبارت !!!Hello World را می‌نویسیم. نکته‌ای که بسیار باید به آن توجه کنیم این است که در پایان جمله‌ای که نوشته‌ایم (یعنی بعد از پرانتز‌های باز و بسته) باید از علامت سِمیکالِن استفاده کنیم. برای نوشتن علامت سمیکالن هم باید دکمه دو نقطه در کیبورد را بدون نگه داشتن کلیدSHIFT تایپ کنید.

تا اینجای کار برنامه‌ی ما تمام شد و فقط کافی است که این برنامه را، ذخیره، کامپایل و سپس اجرا کنیم.

برای ذخیره برنامه، از منوی File گزینه Save As… را انتخاب کنید. در پنجره‌ای که ظاهر می‌شود، در قسمت File name دقیقا نامی که برای کلاس برنامه در نظر گرفته‌ایم را بنویسید (یعنی HelloWorld) و با پسوند java. در محل Desktop بر روی هارد دیسک ذخیره کنید.

نکته: "در جلسات آینده ما از IDE اکلیپس برای نوشتن برنامه‌های جاوا استفاده می کنیم و اصلا نیازی نیست که شما خودتان را درگیر مسائل کامپایل کنید. چون در IDE ها با فشردن یک دکمه، برنامه کامپایل اجرا می شود. هدف ما در این جلسه این است که شما یاد بگیرید که چطور برنامه کامپایل می شود."

برای کامپایل برنامه، همانطور که در آموزش های قبل توضیح داده شد، Command Prompt را اجرا کنید. همانطور که محل ذخیره سازی فایل برنامه ما در Desktop است، بنابراین در Command prompt عبارت dir را تایپ کنید. با عکس زیر مواجه می شوید:

05hello4 589f4

همانطور که در عکس بالا مشخص شده است، ما احتیاج داریم که وارد دایرکتوری Desktop شویم. برای اینکار ما دستور cd desktop را تایپ می کنیم و بعد دکمه Enter را فشار می دهیم. (عکس زیر):

06hello5 ffeff

همانطور که مشخص شده است، ما وارد دایرکتوری دسکتاپ شده ایم. برای اینکه محتویات داخل این دایرکتوری را ببینیم دوباره باید دستور dir را تایپ کنیم. (عکس زیر):

07hello6 300ed

همانطور که در شکل بالا با یک مستطیل قرمز رنگ مشخص شده است، محتویات دایرکتوری دسکتاپ را می بینیم. ما به فایل HelloWorld.java که در بالا با یک بیضی سبز رنگ مشخص شده است نیاز داریم. در ادامه ما دستور javac HelloWorld.java را تایپ می کنیم. (عکس زیر):

08hello8 7e0da

بعد از اینکه دستور بالا را تایپ کردید و دکمه Enter را فشار دادید، روی دسکتاپ، در کنار فایل HelloWorld.java ای که ذخیره کرده ایم، فایلی ایجاد می شود با نام: HelloWorld.class. بر روی این فایل کلیک راست کنید و با استفاده از اپلیکیشن نت پد این فایل را اجرا کنید. با عکس زیر مواجه می شوید:

09hello9 9d072

همانطور که مشاهده می کنید این ها همان بایت کدها هستند که توسط JVM به زبان ماشین یا همان صفر و یک تبدیل می شوند.

بعد از این مرحله دوباره دستور java HelloWorld را تایپ کنید. در این مرحله نیازی نیست که پسوند فایل را مشخص کنیم. فقط کافی است نام فایل را بنویسیم. بعد از اینکه دستور بالا را نوشتید، کلید اینتر را فشار دهید. عکس زیر:

10hello10 6a323

همانطور که مشاهده می کنید، عبارت !!!HelloWorld که در برنامه نوشتیم در اینجا چاپ شد.

برنامه نویسی جاوا قسمت 3

آموزش برنامه نویسی جاوا: چگونه JDK را نصب کنیم؟

در این جلسه از آموزش برنامه نویسی جاوا می‌خواهیم JDK (یا ماشین مجازی جاوا) را بر روی سیستم عامل ویندوز نصب کنیم. برای دانلود و نصب JDK باید به سایت اوراکل مراجعه کنیم. اما فعلا دسترسی به سایت اوراکل ممکن نیست. اما در ادامه‌ی آموزش گفته شده که چگونه وارد سایت اوراکل شویم.

 

اگر بخواهیم وارد سایت اوراکل شویم، باید از VPN استفاده کنیم. در ادامه نحوه دانلود JDK و نصب و معرفی آن به سیستم عامل ویندوز را توضیح می‌دهیم.

ابتدا در سیستم عامل ویندوز، دکمه‌های ترکیبی Windows + R را نگه دارید. در پنجره ظاهر شده عبارت CMD را تایپ کنید.

01cmd ed455

 بعد از کلیک روی دکمه OK وارد پنجره Command Prompt می شوید. در این پنجره دستور زیر را تایپ کنید.

java -version

ابتدا کلمه java را نوشته و بعد یک فضای خالی (space) ایجاد کنید و بعد یک علامت  (خط فاصله) و بعد از آن بدون وارد کردن space کلمه version را تایپ کنید و بعد دکمه ENTER را فشار دهید. توجه داشته باشید که عبارت version را با حروف کوچک تایپ کنید. (با تصویر زیر مواجه می‌شوید):

02cmdjavaversion f6c59

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

حالا می‌خواهیم JDK را از سایت اوراکل دانلود کنیم. به آدرس oracle.com می‌رویم. بعد از وارد شدن به سایت، با شکلی مشابه زیر مواجه می‌شویم:

03oraclecom 7f67e

در ادامه ماوس (موس) خود را روی دکمه دانلود نگه دارید(عکس شماره 1) و بعد در پنجره باز شده، از قسمت چپ گزینه Java SE (عکس شماره 2) را کلیک کنید.

04oraclecom1 0bb6d

بعد از کلیک کردن روی Java SE با صفحه زیر مواجه می شوید.

05oraclecom2 25603

همانطور که در شکل بالا مشاهده می کنید، روی دکمه‌ی مشخص شده کلیک کنید تا وارد صفحه زیر شوید:

06oraclecom3 7335e

ابتدا گزینه Accept License Agreement را انتخاب کنید و بعد از داخل کادر قرمز رنگ (در شکل بالا) JDK مورد نیاز با سیستم عامل خود را دانلودکنید.

بعد از دانلود JDK، روی فایل JDK راست کلیک کرده و بعد گزینه Run as Administrator را انتخاب کنید تا مراحل نصب آغاز شود.

07installjdk 8e69c

نصب JDK بسیار راحت است و فقط کافی است چند بار روی دکمه Next کلیک کنید. پیشنهاد می‌کنیم به هیچ عنوان تنظیمات پیش فرض مراحل نصب را تغییر ندهید. همانطور که در عکس بالا مشاهده می‌کنید روی دکمه Next کلیک کنید تا با عکس زیر مواجه شوید.

08installjdk1 c2021

در این پنجره می‌توانید مسیر نصب JDK را مشخص کنید.(لطفا تغییر ندهید تا با آموزش هماهنگ باشید). در این مرحله هم روی دکمه‌ی Next کلیک کنید.

09installjdk2 e962f

همانطور که در تصویر بالا مشاهده می‌کنید، منتظر بمانید تا مراحل نصب انجام شود. بعد از پایان این مرحله شما باید محل نصب JRE را انتخاب کنید که باز هم لطفا مانند قبل تغییری ایجاد نکنید و روی دکمه‌ی  Next کلیک کنید.

10installjdk3 8747f

دوباره منتظر بمانید تا عملیات نصب انجام شود.

11installjdk4 65204

بعد از پایان عملیات نصب با پنجره زیر مواجه می‌شوید. روی دکمه Close کلیک کنید.

12installjdk5 b0552

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

13system fe5c3

بعد از کلیک کردن بر روی System وارد پنجره زیر می‌شوید. و بعد روی گزینه Advanced system settings کلیک کنید. (عکس زیر، دایره قرمز رنگ).

14system1 03700

بعد از کلیک کردن روی گزینه Advanced system settings وارد پنجره زیر می‌شوید. که طبق عکس زیر روی گزینه مشخص شده کلیک کنید.

15system2 edbe0

بعد از کلیک کردن روی گزینه Environment Variables وارد پنجره جدیدی می‌شوید همانند عکس زیر. در قسمت system variables روی دکمه New کلیک کنید.

16system3 180f1

بعد از کلیک روی دکمه New پنجره‌ای باز می‌شود که ما می‌توانیم یک متغیر جدید بسازیم. برای نام متغیر، دقیقا جمله زیر را بنویسید(حساس به حروف بزرگ و کوچک):

JAVA_HOME

و برای مقداره متغیر (Variable value) مسیر نصب JDK را قرار دهید. (اگر تنظیمات پیش فرض نصب JDK را تغییر نداده باشید، JDK در مسیر: C:\Program Files\Java\jdk1.8.0_60 نصب شده است. بنابراین برای مقدار value مسیر JDK را کپی کنید و در قسمت value پیست کنید و بعد  روی دکمه OK کلیک کنید (همانند تصویر زیر).

17system4 d6fea

بعد از این مرحله باید مسیر دایرکتوری bin را در متغیر سیستمی PATH قرار دهیم. برای این کار دوباره در قسمت system variables به دنبال متغیر path بگردید.( همانند تصویر زیر).

18system5 29dfe

بعد از انتخاب متغیر path (کلیک روی path)، روی دکمه Edit… کلیک کنید تا پنجره زیر ظاهر شود. در قسمت value به آخر خط رفته (می توان با فشار دادن دکمه End روی کیبورد به آخر خط رفته) و سپس یک سِمی کالِن قرار دهید.

نکته: "برای نوشتن سمی کالن، ابتدا زبان کیبورد سیستم را انگلیسی کرده و بعد دکمه دو نقطه را فشار دهید. "
(همانند تصویر زیر):
19system6 c3929

بعد از قرار دادن سمی کالن، نشانگر ماوس خود را بعد از سمی کالن قرار دهید و بعد مسیر دایرکتوری bin را در این قسمت paste کنید.

مسیر دایرکتوری: C:\Program Files\Java\jdk1.8.0_60\bin. (همانند عکس زیر):

20system7 eff2e

بعد از این کار تمام پنجره‌های باز را OK کرده و ببندید. در آخر دوباره وارد پنجره Command Prompt شوید و دوباره دستور زیر را وارد کنید:

java -version

21system8 f5ea0

این پیغام نشان دهنده این است که جاوا بر روی سیستم نصب و معرفی شده است.

برنامه نویسی جاوا قسمت 2

آموزش برنامه نویسی جاوا: JVM

همانطور که در آموزش قبلی گفته شد، JVM یا همان ماشین مجازی جاوا، مسئول اجرای برنامه‌های جاوا است. 

بهتر است آموزش را با یک مثال پیش ببریم. فرض کنید می‌خواهیم برنامه‌ای به زبان جاوا بدون کمک گرفتن از IDE ها (در مورد IDE ها در فصل‌های بعدی توضیح می‌دهیم) بنویسم. بنابراین ابتدا یک ویرایشگر متن (مثل نُت پد) را اجرا می‌کنیم و کدهای برنامه را در فایل نت پد می‌نویسیم. بعد از نوشتن کدهای برنامه، ما برنامه را با پسوند java. ذخیره می‌کنیم و سپس توسط کامپایلر جاوا، برنامه را کامپایل می‌کنیم. در پروسه کامپایل اگر خطای دستوری در برنامه وجود داشته باشد مشخص می‌شود و برنامه کامپایل نمی‌شود. اما اگر خطایی در کار نباشد، برنامه کامپایل می‌شود و کامپایلر جاوا فایلی ایجاد می‌کند با پسوند class. که اگر این فایل class. را اجرا کنیم با کدهایی ناخوانا مواجه می‌شویم. به این کدها، کدهای میانی یا بایت کد گفته می‌شود. حال اجرای این بایت کدها بر عهده JVM است. JVM این بایت کدها را با توجه به نوع سیستم عامل و سخت افزاری که روی آن نصب است، به زبان ماشین یا همان صفر و یک تبدیل می‌کند و در آخر، برنامه اجرا می‌شود.

شاید توضیحات بالا برای کسانی که تجربه‌ی برنامه نویسی ندارند، کمی گنگ و نامفهوم باشد. بنابراین اصلا نگران نباشید، چون در آموزش‌های بعدی تمام این مراحل را به صورت عملی انجام می‌دهیم.

jvm

نسخه های جاوا

جاوا در سه نسخه رسمی ارائه شده است. این سه نسخه عبارت اند از:
Java SE که مخفف Standard Edition است و همانطور که از نامش پیداست، نسخه پایه و استاندارد جاوا است و برای نوشتن هر برنامه‌ی جاوا به این نسخه احتیاج است.
Java ME که مخفف Micro Edition است. نسخه‌ای برای نوشتن برنامه روی سخت افزارهای خاص مانند لوازم خانگی، موبایل، اسباب بازی‌ها و ... است. امروزه این نسخه از جاوا با وجود موبایل‌های هوشمند، کمتر مورد استفاده قرار می‌گیرد.
Java EE که مخفف Enterprise Edition است. نسخه‌ی مدرن و سازمانی جاوا است. از این نسخه برای نوشتن برنامه‌های روی سرور استفاده می‌شود. در کل Java EE مجموعه ای از تکنولوژی‌ها است و یادگیری این نسخه از جاوا سخت و زمان‌بر است و باید سال‌ها به طور عملی کار شود تا بتوان خود را به عنوان یک Java EE کار حرفه‌ای معرفی کرد.

از کدام نسخه شروع کنیم؟

با توجه به توضیحات بالا، مشخص است که باید نسخه Java SE را یاد بگیریم. زیرا برای کار کردن با هر یک از دو نسخه دیگر، باید Java SE را بلد باشیم.

برنامه نویسی جاوا قسمت 1

آموزش برنامه نویسی جاوا: در مورد جاوا

جاوا یک زبان برنامه نویسی سطح بالا و شی گرا است که توسط جیمز گاسلینگ در شرکت سان مایکرو سیستمز ساخته شده است. دستور زبان جاوا (Syntax) بسیار شبیه به زبان های برنامه نویسی C و ++C است. زبان جاوا نسبت به ++C مدل شی گرایی ساده تری دارد و از قابلیت های سطح پایین کمتری پشتیبانی می کند. جاوا در سال ۱۹۹۵ یعنی در حدود ۲۰ سال پیش رسما معرفی شد.

 

 جاوا از ابتدای کار شعاری را برای خودش در نظر گرفت و آن این بود که: "برنامه را یک بار بنویسید و همه جا اجرا کنید."منظور از این جمله این است که زبان جاوا مستقل از سخت افزار و نرم افزار است. یعنی برنامه نویس جاوا هنگام نوشتن برنامه اصلا نیازی نیست که به این مسئله فکر کند که برنامه وی قرار هست در چه محیطی (لینوکس، ویندوز، مکینتاش و ...) اجرا شود. چون اجرا کننده برنامه های جاوا، JVM است و این وظیفه ماشین مجازی جاوا (Java Virtual Machine) است تا برنامه ما را منطبق بر محیطی که برنامه روی آن اجرا می شود، اجرا کند.

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

با جاوا چه برنامه هایی می توان نوشت؟

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

اندروید چیست؟

اندروید نام یک سیستم عامل اُپن سورس (متن باز) است که بر هسته لینوکس استوار است و سیستم عاملی برای موبایل های هوشمند است. اندروید در سال ۲۰۰۵ توسط اندی رابین ساخته شد و دو سال بعد توسط غول جستجوی دنیا، یعنی گوگل خریداری شد. اکنون این سیستم عامل قدرتمند، بسیار معروف و محبوب است و دائما در حال پیشرفت است.

حال سوال ما اینجاست که اندروید چه ربطی به برنامه نویسی جاوا دارد!؟

گوگل بسته ای به نام "بسته توسعه نرم افزار" یا همان SDK = Software Development Kit را برای برنامه نویسان جاوا تولید کرده است تا برنامه نویسان جاوا بتوانند برای این سیستم عامل، اپلیکیشن های اندرویدی بنویسند. البته از طریق زبان های برنامه نویسی دیگری هم مثل #C می توان برای اندروید برنامه نوشت. اما اصل برنامه نویسی اندروید توسط جاوا است.

نکته: "نکته ای بسیار مهم که باید به آن توجه کنیم این است که بسیاری تصور می کنند که با یادگیری جاوا، اندروید را هم یاد می گیرند، که این دیدگاهی کاملا غلط است. زیرا اندروید تکنیک های خاص خودش را در برنامه نویسی دارد که باید آنها را هم یاد گرفت. و همچنین برای توسعه اندروید از نسخه Java SE استفاده می شود نه Java ME."

بازار کار جاوا در ایران و خارج از ایران چگونه است؟

بازار کار جاوا در ایران بسیار خوب است. در ایران حجم بسیار بالایی از پروژه های دولتی با جاوا پیاده سازی می شوند. از آنجا که پروژه های بزرگ همگی دولتی هستند، برنامه نویس جاوا بسیار بیش از گذشته مورد نیاز است. بنابراین حقوق برنامه نویسان جاوا تا چندین برابر زبان های برنامه نویسی دیگر است. وضعیت جاوا در خارج از ایران از داخل هم بهتر است. کشورهای استرالیا، انگلستان و کانادا از عمده سرمایه گذاران در زمینه جاوا هستند. در این کشور ها پروژه ها به صورت پیش فرض با جاوا تولید می شوند. در کشور های دیگر صاحب فناوری مثل آمریکا نیز وضعیت تقریبا به همین منوال است.

نکته: تقریبا 90 درصد مطالب گفته شده در این مطلب، برگفته از کتاب آقای مهندس احمدرضا صدیقی هست. به دلیل اینکه آقای مهندس صدیقی در کتابشون در مورد بازار کار و سایر مطالب دیگه صحبت کردند، بنده ترجیح دادم در این قسمت از آموزش، بیشتر از گفته های ایشان استفاده کنم.

برنامه نویسی جاوا: مقدمه

JavaSE

 
 

ما در این دوره آموزشی، زبان برنامه نویسی جاوا را از ابتدا و از صفر آموزش می‌دهیم. یعنی این دوره آموزشی هیچ پیش نیازی ندارد. تمرکز ما در این دوره روی نسخه استاندارد جاوا، یعنی Java SE است. جاوا زبانی بسیار گسترده و دارای تکنولوژی‌های بسیار زیادی است. ما در این دوره آموزشی قرار هست وارد این دنیای بزرگ شویم و مقدمات جاوا و در کل برنامه نویسی را یاد بگیریم.

ابتدا در مورد تاریخچه جاوا، ویژگی‌ها و بازار کار این زبان برنامه نویسی در ایران و خارج از کشور صحبت می‌کنیم.

نکته: توجه داشته باشید که مفاهیم ابتدایی بسیار مهم هستند و شما باید این مفاهیم را یاد بگیرید. تصور کنید روزی شما به یک برنامه نویس حرفه‌ای جاوا تبدیل شده‌اید. اما نمی‌دانید که جاوا در چه سالی بوجود آمده و توسط چه کسی ساخته شده و اصلا هدف از ساخت جاوا چه بوده!؟ بنابراین چند آموزش ابتدایی این دوره آموزشی که خیلی وارد مبحث کد نوشتن نمی‌شوند را به خوبی یاد بگیرید و سَر سَری از این مطالب عبور نکنید.
سپس در مورد متغیر‌ها، کلاس و متُد و نحوه به کارگیری آنها در جاوا صحبت می‌کنیم. بعد با حلقه‌های تکرار، دستورات شرطی آشنا می‌شویم و کم کم وارد مفاهیم پیشرفته‌تری مثل برنامه نویسی شی گرا می‌شویم. شی گرایی مبحث بسیار گسترده‌ای است و ما در این دوره آموزشی، شی گرایی را به طور کامل یاد می‌گیریم و درک می‌کنیم.

تا اینجای کار ما با برنامه نویسی آشنا شده‌ایم و از اینجا به بعد وارد مفاهیم سخت‌تر برنامه نویسی، مثل کنترل خطا و استثناها در برنامه، برنامه نویسی چند نخی، آشنایی با سیستم فایل، جنریک‌ها، کاراکترها و رشته‌ها، اَنوتیشِن و ... می‌شویم و بعد در آخر هم نگاهی گذرا به مفاهیم گرافیک در جاوا خواهیم داشت.

سخن آخر اینکه، برنامه نویسی هم مانند هر کاره دیگری نیاز به علاقه، پشت کار و اراده ای محکم و پولادین دارد. اگر می‌خواهید در این رشته موفق شوید، از همین ابتدای کار، این دوره آموزشی را با شور و شوق آغاز کنید. اگر با اراده و با گذشتن از کارهای غیر ضروری و وقت گذاشتن روزانه (در ابتدای کار حدودا دو ساعت در روز) برنامه نویسی را شروع کنید، مطمئنا در پایان این دوره آموزشی به یک برنامه نویس Java SE کار حرفه‌ای تبدیل می‌شوید و آماده‌ برای ورود به دنیای JavaEE هستید.

ما برای تالیف این دوره آموزشی از منابع مختلفی استفاده کرده‌ایم. اما منبع اصلی ما کتاب "چگونه با جاوا برنامه بنویسیم" از دایتل است که بسیار منبع خوب و کاملی برای شروع است و می‌توانید آن را از این لینک دانلود کنید.

سایر منابعی که برای این دوره آموزشی استفاده کرده‌ایم:

  • کتاب برنامه نویسی جاوا از مهندس احمدرضا صدیقی
  • کتاب آموزش مبانی کامپیوتر و برنامه نویسی به زبان C++
  • استفاده از سایر آموزش‌های ویدیویی مثل آموزش‌های شرکت لیندا به اضافه‌ی تجربه شخصی خودم در برنامه نویسی جاوا.