دو نوع تبدیل وجود دارد: (ضمنی)implicit و (صریح)explicit
اساس عمل تبدیل: هرجا که کامپایلر انتظار استفاده از نوعی را داشته باشد اما نوع دیگری استفاده شود، اگر امکان داشته باشد خودش تبدیل میکند (implicit) وگرنه باید برنامه نویس خودش تبدیل کند (explicit).
اساس عمل تبدیل: هرجا که کامپایلر انتظار استفاده از نوعی را داشته باشد اما نوع دیگری استفاده شود، اگر امکان داشته باشد خودش تبدیل میکند (implicit) وگرنه باید برنامه نویس خودش تبدیل کند (explicit).
تبدیل implicit
قسمتی از تبدیل ها را خود کامپایلر برای شما انجام میدهد. مثلاً اگر f از نوع float با مقدار 2.3 باشد و i از نوع int باشد، حالا با انتساب f به i مقدار 2.3 به 2 تبدیل میشود و درون i ریخته میشود (البته مقدار f بدون تغییر خواهد ماند).
قسمتی از تبدیل ها را خود کامپایلر برای شما انجام میدهد. مثلاً اگر f از نوع float با مقدار 2.3 باشد و i از نوع int باشد، حالا با انتساب f به i مقدار 2.3 به 2 تبدیل میشود و درون i ریخته میشود (البته مقدار f بدون تغییر خواهد ماند).
کوچک سازی (truncation)
حتی هنگام تعریف f بصورت float f = 2.3 شما یک هشدار truncation (کوتاه سازی) از double به float را دریافت میکنید، چراکه خود 2.3 هم یک نوع دارد (literal ها هم نوع دارند) و نوعش double است و هنگام ریخته شدن در f به float تبدیل میشود و چون float مقادیر کوچکتری را نگه میدارد پس ممکن است قسمتی از داده ها از دست برود (مثلاً دقت اعشاری کاهش یابد).
حتی هنگام تعریف f بصورت float f = 2.3 شما یک هشدار truncation (کوتاه سازی) از double به float را دریافت میکنید، چراکه خود 2.3 هم یک نوع دارد (literal ها هم نوع دارند) و نوعش double است و هنگام ریخته شدن در f به float تبدیل میشود و چون float مقادیر کوچکتری را نگه میدارد پس ممکن است قسمتی از داده ها از دست برود (مثلاً دقت اعشاری کاهش یابد).
از دست رفتن داده ها (loss of data)
در اینجا کامپایلر یک warning میدهد که تبدیل float به int احتمال از دست رفتن داده ها را در پی دارد. مثلاً در اینجا سه دهم از 2.3 حذف خواهد شد، یعنی از دست میرود، اما اگر f مقدار 2 داشت (قسمت اعشاری نداشت) هیچ داده ای از دست نخواهد رفت و همان 2 در i ریخته میشود. پس باید در تبدیل ها به احتمال از دست رفتن داده ها توجه داشت، حتی ممکن است یک کامپایلر هشدار هم ندهد و ما از دست رفتن داده ها را متوجه نشویم. بهرحال با تبدیل انواعی که میتوانند مقادیری را نگه دارند که نوع تبدیل شده (مقصد) نمیتواند نگه دارد، احتمال از دست رفتن داده ها وجود دارد. مثلاً تبدیل float یا double به int یا تبدیل int به short int یا char (حتی در تبدیل int به float هم هشدار دریافت میکنید، چون int مقادیر صحیح بزرگتری نسبت به float نگه میدارد، در چنین جایی برای نگه داری تمام مقادیر ممکن میتوان از double بجای float استفاده کرد).
در اینجا کامپایلر یک warning میدهد که تبدیل float به int احتمال از دست رفتن داده ها را در پی دارد. مثلاً در اینجا سه دهم از 2.3 حذف خواهد شد، یعنی از دست میرود، اما اگر f مقدار 2 داشت (قسمت اعشاری نداشت) هیچ داده ای از دست نخواهد رفت و همان 2 در i ریخته میشود. پس باید در تبدیل ها به احتمال از دست رفتن داده ها توجه داشت، حتی ممکن است یک کامپایلر هشدار هم ندهد و ما از دست رفتن داده ها را متوجه نشویم. بهرحال با تبدیل انواعی که میتوانند مقادیری را نگه دارند که نوع تبدیل شده (مقصد) نمیتواند نگه دارد، احتمال از دست رفتن داده ها وجود دارد. مثلاً تبدیل float یا double به int یا تبدیل int به short int یا char (حتی در تبدیل int به float هم هشدار دریافت میکنید، چون int مقادیر صحیح بزرگتری نسبت به float نگه میدارد، در چنین جایی برای نگه داری تمام مقادیر ممکن میتوان از double بجای float استفاده کرد).
پس جایی که خود زبان تشخیص دهد که باید به چه نوعی تبدیل صورت گیرد خودش اینکار را انجام میدهد وگرنه خطا میدهد و باید از تبدیل نوع صریح استفاده کنیم.
معمولا آرایه ها با توجه به ابعادشان تقسیم بندی می شوند :
آرایه های یک بعدی :
آرایه های یک بعدی دارای یک سطر و چند ستون و یا دارای یک ستون و چند سطر هستند و فقط دارای یک اندیس برای دسترسی به عناصرشان می باشند .
آرایه های یک بعدی :
آرایه های یک بعدی دارای یک سطر و چند ستون و یا دارای یک ستون و چند سطر هستند و فقط دارای یک اندیس برای دسترسی به عناصرشان می باشند .
تبدیل (cast) انواع داده ای
در ++C انواع مختلفی برای داده ها وجود دارد، مثل int و float و ... و گاهی پیش می آید که بخواهیم این انواع را تبدیل کنیم. مثلاً دو عدد اعشاری را داریم اما مجموع آنها را فقط بطور صحیح لازم داریم (و میخواهیم به یک متغیر int انتساب دهیم)، پس باید مثلاً نوع float به int تبدیل شود تا حاصل جمع در یک متغیر int ریخته شود. این تبدیل ها میتواند برای انواع داده ای تعریف شده توسط برنامه نویس هم انجام شود که در جای خود توضیح داده میشود. به انواعی که از ابتدا درون زبان وجود دارند (بدون تعریف برنامه نویس) انواع درونی (integral) میگویند. در اینجا بر اساس انواع درونی مثال می آوریم که برای انواع تعریف شده توسط کاربر هم همینگونه است اما به کار اضافی نیاز دارد.
در ++C انواع مختلفی برای داده ها وجود دارد، مثل int و float و ... و گاهی پیش می آید که بخواهیم این انواع را تبدیل کنیم. مثلاً دو عدد اعشاری را داریم اما مجموع آنها را فقط بطور صحیح لازم داریم (و میخواهیم به یک متغیر int انتساب دهیم)، پس باید مثلاً نوع float به int تبدیل شود تا حاصل جمع در یک متغیر int ریخته شود. این تبدیل ها میتواند برای انواع داده ای تعریف شده توسط برنامه نویس هم انجام شود که در جای خود توضیح داده میشود. به انواعی که از ابتدا درون زبان وجود دارند (بدون تعریف برنامه نویس) انواع درونی (integral) میگویند. در اینجا بر اساس انواع درونی مثال می آوریم که برای انواع تعریف شده توسط کاربر هم همینگونه است اما به کار اضافی نیاز دارد.
تبدیل explicit
این تبدیل توسط خود برنامه نویس با نوشتن دستوراتی درون کد برنامه انجام میشود. مثلاً وقتی هنگام انتساب f از نوع float به i از نوع int بنویسید
i = (int)f دیگر هشداری دریافت نمیکنید چون گذاشتن (int) قبل از f آنرا به صراحت به int تبدیل میکند و سپس در i میریزد. میتوان تبدیلات صریح را بگونه ای مثل (int(f هم نوشت که f را به int تبدیل میکند.
این تبدیل توسط خود برنامه نویس با نوشتن دستوراتی درون کد برنامه انجام میشود. مثلاً وقتی هنگام انتساب f از نوع float به i از نوع int بنویسید
i = (int)f دیگر هشداری دریافت نمیکنید چون گذاشتن (int) قبل از f آنرا به صراحت به int تبدیل میکند و سپس در i میریزد. میتوان تبدیلات صریح را بگونه ای مثل (int(f هم نوشت که f را به int تبدیل میکند.
مقدار دادن به عناصر آرایه ها :
برای مقدار دادن به آرایه ها هم می توان به تمامی عناصر بصورت یکجا مقدار داد که حالت مجموعه در ریاضی را بخود می گیرد و هم بصورت تک به تک. وقتی طول آرایه را مشخص نمی کنیم با مقدار دادن به عناصر، طول آرایه نیز مشخص خواهد شد .
برای مقدار دادن به آرایه ها هم می توان به تمامی عناصر بصورت یکجا مقدار داد که حالت مجموعه در ریاضی را بخود می گیرد و هم بصورت تک به تک. وقتی طول آرایه را مشخص نمی کنیم با مقدار دادن به عناصر، طول آرایه نیز مشخص خواهد شد .
دوستان دقت داشته باشند هنگام تعریف آرایه باید طول را قید کرد مگر اینکه همانجا بدون ذکر طول، به یکایک عناصر مقدار دهیم. پس یا باید طول آرایه را مشخص کنیم یا با مقدار دادن به عنصرهای آرایه،طول برای کامپایلر مشخص شود و اگر غیر از این باشد کامپایلر از برنامه خطا خواهد گرفت .
نکته : همیشه آخرین اندیس آرایه، یک واحد از طول آن کمتر است و تنها دلیل آن شروع شدن اولین اندیس از صفر برای آرایه می باشد .
برای دسترسی به عناصر آرایه کافی است اندیس آن عنصر از آرایه را در درون [] قید نماییم :
برای دسترسی به عناصر آرایه کافی است اندیس آن عنصر از آرایه را در درون [] قید نماییم :
آرایه ها در++c
در آموزش های قبل، داده ها را در درون متغیرها و یا ثوابت ذخیره می کردیم. اما گاهی لازم است تعدادی از داده ها را بگونه ای ذخیره نماییم که متعلق به یک مجموعه بوده و دسترسی به آنها آسان باشد .
گاهی وقتها لازم است که یک سری از داده هم نوع را دریافت کرده و بروی آنها عملیات خاصی را مثل مقایسه یا مرتب کردن و ... را انجام دهیم، لذا باید آنها را بگونه ای خاص در کنار یکدیگر قرار دهیم که این مسئله در برنامه نویسی را با استفاده از آرایه ها حل خواهیم کرد .
آرایه مجموعه ای از عناصر هم نوع است. در برنامه نویسی C++ برای تعریف آرایه باید نوع عناصر آنرا مشخص کنیم و آرایه باید حتما دارای نام باشد که از قانون نامگذاری برای متغیرها تبعیت می کند و بعد از نام از [] استفاده می کنیم که درون آن می توان از یک عدد صحیح برای تعیین طول آرایه استفاده نمود .
در آموزش های قبل، داده ها را در درون متغیرها و یا ثوابت ذخیره می کردیم. اما گاهی لازم است تعدادی از داده ها را بگونه ای ذخیره نماییم که متعلق به یک مجموعه بوده و دسترسی به آنها آسان باشد .
گاهی وقتها لازم است که یک سری از داده هم نوع را دریافت کرده و بروی آنها عملیات خاصی را مثل مقایسه یا مرتب کردن و ... را انجام دهیم، لذا باید آنها را بگونه ای خاص در کنار یکدیگر قرار دهیم که این مسئله در برنامه نویسی را با استفاده از آرایه ها حل خواهیم کرد .
آرایه مجموعه ای از عناصر هم نوع است. در برنامه نویسی C++ برای تعریف آرایه باید نوع عناصر آنرا مشخص کنیم و آرایه باید حتما دارای نام باشد که از قانون نامگذاری برای متغیرها تبعیت می کند و بعد از نام از [] استفاده می کنیم که درون آن می توان از یک عدد صحیح برای تعیین طول آرایه استفاده نمود .
int x[5] = { 10, 37, -3, 8023, 0 };
//////////// یا \\\\\\\\\\\\
int x[5];
x[0] = 10;
x[1] = 37;
x[2] = -3;
x[3] = 8023;
x[4] = 0;
//////////// یا \\\\\\\\\\\\
int x[] = { 10, 37, -3, 8023, 0 };
//////////// یا \\\\\\\\\\\\
int x[5];
x[0] = 10;
x[1] = 37;
x[2] = -3;
x[3] = 8023;
x[4] = 0;
//////////// یا \\\\\\\\\\\\
int x[] = { 10, 37, -3, 8023, 0 };