تازه ها: 
از وای فای رایگان بترسید!

از وای فای رایگان بترسید!

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

مراقب باشید در تلگرام هک نشوید!

مراقب باشید در تلگرام هک نشوید!

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

ردیابی و فرمت گوشی سرقتی از طریق جیمیل

ردیابی و فرمت گوشی سرقتی از طریق جیمیل

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

ردیابی افراد از طریق شماره موبایل!!!

ردیابی افراد از طریق شماره موبایل!!!

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

افزایش سرعت گوشی اندرویدی

افزایش سرعت گوشی اندرویدی

شاید شما هم با مشکل کند شدن تلفن همراه اندرویدتان دست وپنجه نرم می کنید، اما دیگر نگران کندبودن گجت اندرویدی خود نباشید و با این روش بسیار ساده و کاربردی (بدون هیچگونه عوارض) سرعت گوشی خودتان را برای همیشه بالا ببرید: بیشتر

 

آموزش برنامه نویسی c (فصل دو)

مقدمه

دسته‌بندي داده‌ها به انواع مختلف، يكي از تواناييهاي جدید زبانهاي برنامه‌نويسي است. زبان C مجموعة کاملي از انواع داده‌ها را پشتیباني مي‌كند که عبارت‌اند از:

– داده‌هاي صحيح (integer)

– داده‌هاي اعشاري (floating point)

– داده‌هاي کاراکتری (character).

همچنين داده‌ها در زبانهاي برنامه‌‌‌نويسي به صورت مقادير ثابت و مقادير متغير به كار می‌روند. متغيرها در طول اجراي برنامه، مقادير مختلفي از داده‌ها را می‌پذيرند. اما مقادير ثابت مقاديري‌اند كه در طول برنامه تغيير نمي‌كنند. در زبان C چهار نوع ثابت وجود دارد که عبارت‌اند از ثابتهاي صحيح، ثابتهاي با مميز شناور، ثابتهاي کاراکتري و ثابتهاي رشته‌اي.

مقادير صحيح ثابت را مي‌توان علاوه بر روش معمول دهدهي، در مبناهاي هشت و شانزده نيز نوشت. مجموعه داده‌هاي از نوع صحيح و اعشاري را داده‌هاي از نوع محاسباتي يا arithmetic مي‌نامند. دو نوع ديگر از داده‌ها، نوع اشاره‌گر يا pointer و نوع شمارشي يا enumerated  است، كه همراه با نوع محاسباتي، داده‌هاي نوع اسكالر ناميده مي‌شود. اين نوع داده‌ها را از اين لحاظ اسكالر مي‌نامند كه قابل مقايسه يا قابل سنجش با همنوع خودند. علاوه بر داده‌هايي از نوع اسكالر، داده‌هايي از نوع مجموعه‌اي وجود دارند از جمله آرايه‌، ركورد، ساختار و اجتماع كه در سازماندهي متغيرهايي مفیدند كه به طور منطقي به يكديگر مرتبط‌اند. اين نوع داده‌ها را نيز در فصلهای بعدي بررسي می‌کنیم.

اعلان متغيرها

اعلان، گروهي از متغيرها را به نوع داده خاصي مربوط مي‌سازد. در زبان C هر متغير، پيش از آنكه در دستوري از برنامه به كار رود، بايد تعريف شود. دستورهای مربوط به تعريف متغيرها، اطلاعات لازم در مورد نوع داده‌هايي را كه متغيرهاي مورد نظر مي‌پذيرند و اينكه چند بايت حافظه اشغال مي‌كنند و چگونگي تفسير آنها را در اختيار كامپايلر قرار مي‌دهند. اعلان شامل نوع داده و به همراه آن نام يک يا چند متغير است و به سميکولون (,) ختم مي‌شود. براي اعلان يا تعريف متغيرهايي از نوع صحیح (integer) كلمة كليدي int و به دنبال آن اسامي متغيرهاي مورد نظر را كه با كاما از يكديگر تفكيك مي‌شوند مي‌نويسيم.

int a , b , c ;

البته مي‌توان هريك از متغيرها را در دستوري جداگانه و يا در سطري جداگانه معرفي كرد.

int a ;

int b ; int c ;

كه در سطر اول يک متغير اعلان شده و در سطر دوم با دو دستور جداگانه متغير دوم و سوم اعلان شده است. واضح است روش اول كه در آن هر سه متغير در يك سطر و با يك دستور اعلان شده ساده‌تر است. كلمات كليدي براي اعلان داده‌هايي از نوع اسكالر در جدول ۲ـ۱ نشان داده شده است.

جدول ۲ـ۱ كلمات كليدي در اعلان متغيرها

اصلي

اصلاح/توصیف‌‌کننده

int

float

char

double

enum

Short

long

signed

unsigned

 

پنج كلمة ستون اول نوع اصلي يا پايه‌اي‌اند. چهار كلمة ستون دوم را اصلاح‌كننده[۱] یا توصيف‌كننده[۲] نامند كه به طريقي پنج نوع اصلي را توصيف مي‌كنند. به عبارت ديگر مي‌توان پنج نوع اصلي را اسم و چهار نوع توصيف‌كننده را صفت براي آن اسامي تصور كرد.

هرگونه اعلان متغيرها در داخل بلاك بايد قبل از اولين دستور اجرايي قرار گيرد. اما ترتيب اعلان آنها فرق نمي‌كند. برای مثال دو روش اعلان زير از نظر نتيجه يكسان‌‌اند.

روش اول

روش دوم

float x , y;

int a , b ;
float z ;

float x , y , z ;

int a ;

int b ;

داده‌‌هاي صحيح

زبان C از لحاظ بزرگي عناصر و همچنين از نظر نمايش داخلي آنها استاندارد ويژه‌اي به كار نمي‌برد. به طور کلي اعداد صحيح مثبت، منفي و صفر و نيز متغيرهايي كه مقادير صحيح را مي‌پذيرند، ۱۶ يا ۳۲ بيت حافظه اشغال مي‌كنند. فرم اولية داده‌هايي از نوع صحيح، يا همان int مقدار صحيح در نظر گرفته مي‌شود. اما اندازه يا بزرگي آن برحسب نوع ماشين و كامپايلر فرق مي‌كند.

در هنگام تعريف متغيرهاي از نوع int توصيف‌كننده‌هاي short ،long ، signed، unsigned و يا تركيبي از آنها نيز ممكن است به كار رود.

داده‌هايي كه با اين كلمات توصيف مي‌شوند، ممكن است از كامپايلري به كامپايلر ديگر تفسير متفاوت داشته باشند، ولي اساس آنها يكسان است. اگر مقادير صحيح در كامپايلری در حالت عادي ۲ بايت باشد، بين short int و int فرقي نخواهد بود و هر دو ۱۶ بيت يا ۲ بايت حافظه اشغال می‌کنند. در ضمن short int را مي‌توان فقط به صورت short نيز به كار برد (يعني پيش‌ فرض آن است كه short همان short int است). در چنين حالتي long int نيز ۴ بايت حافظه اشغال خواهد كرد كه آن را هم مي‌توان فقط به صورت long به كار برد (يعني در اينجا نيز پيش ‌فرض آن است كه long همان long int است). ولي چنانچه مقادير صحيح در حالت عادي ۴ بايت حافظه اشغال کنند، short int يا فقط short 2 بايت حافظه به كار خواهد برد. اما بين long int و int (يا فقط long) تفاوتي وجود نخواهد داشت و هر دو ۴ بايت حافظه اشغال خواهند کرد.

در مواردي متغيرها، فقط داراي مقادير غيرمنفي خواهند بود. مثلاً متغيري كه براي شمارش به كار می‌رود، يكي از اين موارد و هميشه مثبت است. زبان C اجازه مي‌دهد كه‌اين گونه متغيرها را با به كار بردن توصيف‌كنندة unsigned، بدون علامت اعلان كنيم. يك مقدار صحيح بدون علامت از نظر ميزان حافظة اشغالي با مقدار صحيح معمولي فرقي ندارد. تفاوت ميان آنها در بيت سمت چپ است كه بيت علامت ناميده مي‌شود و در مورد مقادير صحيح بدون علامت، اين بيت نيز مثل ساير بيتها براي نمايش مقدار عدد به كار مي‌رود و در نتيجه مقادير صحيح بدون علامت هميشه غيرمنفي است و بزرگي آن ممکن است تقريباً تا دو برابر مقدار صحيح معمولي باشد. براي مثال عدد صحيح معمولي از ۳۲۷۶۸- تا ۳۲۷۶۷+ (در مورد مقادير صحيح دو بايتي) تغيير مي‌كند، بنابراين مقدار صحيح بدون علامت از صفر تا ۶۵۵۳۵ تغيير خواهد كرد.

در استاندارد ريچي توصيف‌‌‌كنندة signed وجود ندارد. ولي استاندارد ANSI آن را پشتيباني مي‌كند. در اغلب موارد به صورت پيش‌فرض، متغيرها signedاند. بنابراين، به استفاده از توصيف‌كنندة‌ signed در آنها نیازی نخواهد بود. در اغلب مفسرها پيش‌فرض براي داده‌هاي كاراكتری signed char است.

متغيرهايي كه معرف اعداد صحيح‌‌اند به صورتهاي زير توصيف می‌شوند.

short int

int

unsigned int

signed int

long int

unsigned long int

unsigned short int

 مثال ۲ـ۱ در زير نمونه‌‌هايي از نحوة معرفي متغيرهايي از نوع مقادير صحيح نمايش داده شده است.

۱) long int temp , Pnoor ;

۲) short int y1 , y2 , y3 ;

۳) unsigned int m , n ;

۴) unsigned long sum , average ;

۵) unsigned short pt , qt ;

تعريف متغيرها از نوع long int و long هم‌ارز است، بنابراين مثال ۱ را مي‌توان به صورت long temp , Pnoor ; نوشت. همچنين int short  و  short نيز معادل هم‌اند. پس مثال ۲ را مي‌توان به صورت short y1 , y2 , y3 ; نوشت. مثال ۳ را نيز مي‌توان اين طور نوشت: unsigned m , n ;.

v

مقادير ثابت صحيح

در زبان C يکي ديگر از انواع داده‌‌ها، مقادير ثابت صحيح است. يك مقدار ثابت صحيح عدد و يا دنباله‌اي از ارقام است كه در مبناي ۸، ۱۰ و يا ۱۶ تعريف شده باشد. اعداد زير نمونه‌هايي از اعداد با مقادير ثابت صحيح در مبناي ۱۰ اند.

۳۶۹۲۵ , ۹۹۹۹ , +۸۳۵ , ۵۱۲ , ۰

در C به طور پيش فرض اعداد صحيح در مبناي ۱۰ تعريف شده‌‌اند. اما مبناهاي ۸ و ۱۶ نيز كاربرد زيادي دارند، زيرا ۸ و ۱۶ توانهايي از مبناي ۲ اند و اين گونه سيستمهاي عددنويسي براي كامپيوترها مناسب‌‌تر است. براي مثال عدد ۶۵۵۳۶ در يك ماشين ۱۶ بيت همان عدد ۱۰۰۰۰ در مبناي ۱۶ است.

حال ببينيم كامپيوتر چگونه تشخيص مي‌دهد كه عددي در مبناي ۸ يا ۱۰ يا ۱۶ تعريف شده؟ براي مشخص ساختن آن از پيشوندهاي ۰ براي مبناي ۸ و ۰x براي مبناي ۱۶ استفاده مي‌شود. مبناي ۱۰ هم که پيش فرض است و پيشوند ندارد.بنابراين در مورد اعداد

+۰۴۱۶۳ , -۰۳۲۶      ۰۷۵۱ , ۰۶۶۶

صفر سمت چپ به معناي آن است كه اعداد مزبور در مبناي ۸ اند، لذا اگر عدد در مبناي ۱۰ باشد، اولين رقم سمت چپ آن نمي‌تواند صفر باشد. بديهي است در مبناي ۸ فقط هشت نشانة صفر تا ۷ در ارقام به كار مي‌روند. همچنين در مبناي ۱۶ نيز، شانزده نشانة مختلف به كار مي‌رود كه ده نشانة آن همان نشانه‌هاي متداول در مبناي ۱۰ يعني صفر تا ۹ است و شش نشانة ديگر حروف A , B , C , D , E , F است كه به ترتيب معادل ۱۰ , ۱۱ , ۱۲ , ۱۳ , ۱۴ , ۱۵ در مبناي ۱۰ اند. مثالهاي زير نمونه‌اي از اعداد مبناي ۱۶ اند.

حتما بخوانید  آموزش برنامه نویسی ++c (جلسه سوم)

۰xF1E6 , 0x5AB , 0x327 , 0x99

اگر طول هر كلمه در ماشين مورد نظر ۱۶ بيت باشد، طول آن از -۳۲k تا +۳۲k يعني از -۳۲۷۶۸ تا +۳۲۷۶۷ تغییر خواهد کرد كه معادل ۲۱۵-۱ و يا معادل ۰۷۷۷۷۷ مبناي ۸ و يا ۷FF مبناي ۱۶ است. ولي اگر طول هر كلمه ۳۲ بيت باشد، طول آن از -۲G تا +۲G خواهد بود يعني از-۲, ۱۴۷,۴۸۳, ۶۴۸ تا ۲, ۱۴۷, ۴۸۳,۶۴۷ كه معادل ۲۳۱-۱ است.

مقادير ثابت صحيح بدون علامت يا unsigned integer constants با قرار دادن u، حرف اول كلمة unsigned، و همين‌طور مقادير ثابت صحيح طولاني يا  long integer constants با قراردادن حرف l، حرف اول كلمه long، در سمت راست آنها مشخص مي‌گردد كه l و u را می‌توان به هر دو صورت بزرگ يا كوچك نوشت. همچنين اگر عددي هر دو صفت مذكور را داشته باشد (يعني هم بدون علامت و هم به‌صورت طولاني باشد)، با دو حرف ul (u در سمت چپ، l در سمت راست آن) متمايز مي‌شود.

v مثال ۲ـ۲ جدول زير مثالهايي از انواع مقادير ثابت صحيح را نشان مي‌دهد.

 

مقدار ثابت صحيح

سيستم عددي
۵۴۶۷۸۰u مبناي ۱۰ (بدون علامت)
۱۲۳۴۵۶۷l مبناي ۱۰ (طولاني)
۱۲۳۴۵۶۷ul مبناي ۱۰ (بدون علامت و طولاني)
۰۱۲۳۴۵۶u مبناي ۸ (بدون علامت)
۰۱۲۳۴۵۶ul مبناي ۸ (بدون علامت و طولاني)
۰۵۶۳۲۱۴l مبناي ۸ (طولاني)
۰۲۶۷۷u مبناي ۸ (بدون علامت)
۰x12545678l مبناي ۱۶ (طولاني)
۰xABCDEFu مبناي ۱۶ (بدون علامت)
۰xEF1A3Abul مبناي ۱۶ (بدون علامت و طولاني)

توابع scanf و printf در فرمت مربوط به خواندن و نوشتن مقادير صحيح در مبناي ۸ و ۱۶ به ترتيب حروف o و x را مشخص‌كنندة فرمت در رشته كنترل فرمت به كار مي‌برند.

که تابع scanf از ورودی مقداری را دریافت میکند و تابع printf مقداری را به خروجی فرستاده و نمایش میدهد.

v مثال ۲ـ۳ برنامة زير عددي در مبناي ۱۶ (با پيشوند ۰x يا بدون آن) را از طريق ترمينال مي‌خواند و معادل آن را در مبناهاي ۱۰ و ۸ چاپ مي‌كند.

# include<stdio.h>

main ()

    {

 int n ;

 printf (“Enter a hexadecimal constant:  \n”) ;

 scanf (“%x”,&n) ;

 printf (“The decimal equivalent of %x is:  %d “, n , n) ;

 printf (“\n The octal equivalent of %x is:  %o\n”, n , n) ;

    }

داده‌هاي اعشاري

در زبان C اعداد اعشاري نيز قابل نمايش است. داده‌‌هاي صحيح در بسياري موارد مناسب است. اما براي مقادير خيلي بزرگ و براي مقادير كسري كوچك كه در اغلب زمينه‌هاي علمي کاربرد دارد، به داده‌هاي از نوع مميز شناور يا floating point نیاز است. براي نوشتن ثابتهاي با مميز شناور دو روش به كار می‌رود.

روش اول كه ساده‌ترين راه است، آن است كه از علامت مميز (كه در انگليسي “.” است) استفاده كنيم. مثالهاي زير از اين نوع است.

۰٫۹۹۶ , ۱۵٫۰ , ۳٫۱۴۱۵ , ۷٫ ,.۲۷۵

روش دوم كه نمايش علمي[۳] نيز ناميده مي‌شود، روش كوتاه‌نويسي مفيدی است. در اين روش هر مقدار شامل دو جزء است: يك قسمت عددي كه آن را مانتيس نامند و به‌دنبال آن يك قسمت نما يا توان مي‌آيد كه قسمت مانتيس بايد در ۱۰ به توان نما ضرب شود. بين اين دو قسمت حرف E يا e (كه حرف اول exponent است) به مفهوم نما يا توان به كار می‌رود. براي مثال۳E2 به مفهوم ۳*۱۰۲ و -۱۲۵٫۷E-3 به مفهوم -۱۲۵٫۷*۱۰ است. در واقع يك مقدار ثابت با مميز شناور، عددي است در مبناي ۱۰ كه شامل يك مميز يا علامت اعشار يعني “.” يا شامل يك نما يا هر دو است؛ مانند مثالهاي زير

  1. , ۰٫۰ , ۱٫ , ۰٫۹۲ ۱۸۲٫۲۵ , -۳٫۱۴۱۵ , ۵E-5 , 0.775E-3

البته قسمت نما نمي‌تواند يك عدد كسري باشد، پس ۲۹٫۵E3.4 درست نيست. در بعضي نسخه‌‌هاي C براي اينكه مشخص كنند كه مقادير مورد نظر يك كلمه اشغال كرده است حرف F (یا f) را به آخر آن اضافه مي‌كنند، مانند ۶٫۱۲۵E5F .

همچنين براي مشخص كردن اينكه مقادير مورد نظر فضايي به طول دو كلمه را اشغال كرده است، حرف L (يا l) به آخر آن اضافه مي‌شود مانند ۰٫۱۲۳۴۵۶۷۸۹E-25L .

دقت مقادير ثابت با مميز شناور ممكن است برحسب نسخه‌هاي مختلف تغيير كند، ولي همة آنها حداقل ۶ رقم با معني را مي‌پذيرند.

براي اعلان متغيرهايي از نوع floating point از دو كلمة كليدي “float” و “double” استفاده مي‌شود، مانند

float a , b , c ;

double x , y , z ;

که در آن كلمه “double” به مفهوم دقت مضاعف يا double precesion است و در اغلب ماشينها طول فضايي كه براي متغيرهاي توصيف شده با آن رزرو مي‌شود، دو برابر “float” است. يك متغير توصيف شده با “float” به‌طور متعارف ۴ بايت در حافظه اشغال مي‌كند، پس در “double” اين فضا ۸ بايت خواهد شد و نمايش دروني مقادير floating-point نيز از ويژگيهاي معماري سخت‌افزار كامپيوتر است و هنوز كاملاً استاندارد نیست. در مورد ميزان دقت float و double نيز بايد به مستندات كامپايلر مربوط مراجعه كرد. در برخي كامپايلرها براي اعلان متغيرهاي از نوع double نيز مي‌توان آنها را به صورت long float تعريف كرد. بنابراين دو روش اعلان زير معادل‌اند.

double a , b , c ;

long float a , b , c ;

به هرحال اگر كلمة توصيف‌كنندة long به تنهايي جلوي متغيري به كار رود، آن متغير به صورت پيش‌فرض از نوع مقادير صحيح خواهد بود. بنابراين با دستور long a , b , c ; سه متغير c , b , a از نوع صحيح خواهند بود.

 

داده‌‌هاي كاراكتري

يکي از انواع داده‌‌هايي که در برنامه‌‌نويسي استفاده مي‌شود داده‌‌هاي کاراکتري است. در بسياري از زبانهاي برنامه‌‌‌سازي داده‌هاي عددي و داده‌هاي كاراكتري با يکديگر تفاوت دارند. مثلاً عدد ۲ داده‌ای عددی و حرف A داده‌ای كاراكتري است. در عمل هم، كاراكترها به صورت عدد در حافظة كامپيوتر ذخيره مي‌شوند، و هر كاراكتر داراي يك كد عددي است. كدهاي مختلفي وجود دارد كه دو نوع آن عبارت‌اند از اسکی (ascii)[4] یا كد استاندارد آمريكايي براي تبادل اطلاعات و ديگري ebcdic[5] یا كد توسعه‌‌يافتة bcd كه آی‌بی‌ام روي سيستم بزرگ خود به كار مي‌برد و بيشتر متداول است. البته در زبان C، كد اسکی متداول است. در همة كدگذاريها براي هر كاراكتر نماد عددي وابسته‌ای وجود دارد كه در كدگذاري اسكي به آن ascii code گويند و مقدار آن از صفر تا ۲۵۵ است.

در زبان C تفاوت بين اعداد و كاراكتر ناچيز است. در اين زبان يكي از انواع داده‌ها char ناميده مي‌شود، اما در حقيقت كاراكتر مقدار صحيح يك بايتي است كه هم براي نگهداري اعداد و هم براي نگهداري كاراكترها به كار می‌رود.

ثابتهاي حرفي در داخل يك زوج گيومه قرار مي‌گيرد. اين گيومه‌ها به كامپايلر اعلان مي‌كند كه كد عددي كاراكتر مورد نظر را به دست آورد. براي مثال در دستورهاي

char a , b ;

b = 5 ;

a = ‘۵’;

مقدار a برابر ۵۳، يعني برابر کد اسكي كاراكتر ’۵’ و مقدار b برابر ۵ خواهد بود.

v مثال ۲ـ۴ برنامة زير كاراكتری را از ورودي‌ می‌خواند و كد عددي آن را نمايش مي‌دهد.

#include <stdio.h>

main()

{

char ch ;

scanf (“%c”, &ch) ;

printf (” The numeric code is:  %d \n “, ch) ;

}

همچنين در توابع printf  و scanf نماد %c فرمت متغيرهاي كاراكتري است مانند %d كه براي متغيرهاي مقادير صحيح و %f كه براي متغيرهاي مقادير اعشار به كار می‌رود (توابع ورودي و خروجي و فرمت متغيرها را در فصل ۳ بررسي می‌کنیم).

v

در مجموعه كاراكتر اسكي، ترتیب كد كاراكترها براساس ترتيب كاراكترهاست. براي مثال، كد حرف ’A’ برابر ۶۵، ’B’ برابر ۶۶، …، و ’Z’ برابر ۹۰ است. كد حروف كوچك از ۹۷ تا ۱۲۲ است. با توجه به ارزش كد حروف، تابع زير حروف بزرگ را به حروف كوچك تبديل مي‌كند (توابع را در فصل ۶ بررسي مي‌کنیم).

حتما بخوانید  آموزش برنامه نویسی ++c (جلسه دوم)

char Up-to-low (ch)

char ch ;

    {

 return ch + 32 ;

    }

تابع مذکور به کد اسكي هر كاراكتر دريافتي ۳۲ واحد اضافه مي‌كند كه درنتيجه حروف بزرگ به حروف كوچك تبديل مي‌شود. مثلاً کد اسكي حرف ’A’ (۶۵) ۳۲ واحد از کد اسكي حرف ’a’ (۹۷) كوچك‌تر است. مشابه آن مي‌توان تابعي براي تبديل حروف كوچك به بزرگ تعريف كرد كه در اين حالت بايد از کد اسكي حرف مورد نظر ۳۲ واحد كسر گردد تا به حرف بزرگ مشابه خود تبديل شود.

در سيستم كدگذاري غير اسکی، مانند ebcdic، تفاوت عددي كد حروف بزرگ و كوچك ۳۲ نیست. بنابراين در چنين حالتي تابع تعريف شدة بالا نتيجة مطلوب را نمي‌دهد. براي جلوگيري از چنين اشتباهي زبان C داراي توابع كتابخانه‌اي به اسامي toupper  و tolower است كه به ترتيب عمل تبديل كاراكترها را از بزرگ به كوچك و از كوچك به بزرگ انجام مي‌دهند.

ثابتهاي رشته‌اي

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

“university” , “256” , “payam noor” , “1380-02-06” , “five$” , “p4”

همچنين بايد توجه داشت كه ” ” نيز رشته‌ای تهي (empty) يا null است.

v مثال ۲ـ۵ ثابت رشته‌اي زير شامل سه کاراکتر مخصوص است كه با escape sequence متناظرشان نشان داده شده‌اند.

“\t to continue , press the \”RETURN\” KEY\n”

که در آن نشانه‌ها يا كاراكترهاي مخصوص عبارت‌اند از

 horizontal tab \t،

 \” گيومه يا quotation mark دوبل كه دو بار به كار رفته است،

\n خط جديد يا new line.

 

كامپايلر به طور خودکار يك كاراكتر (\۰) null در پايان هر ثابت رشته‌اي قرار مي‌دهد كه آخرين كاراكتر در داخل رشته (قبل از بسته شدن گيومه) خواهد بود. اين كاراكتر وقتي كه رشته نمايش داده شود رؤيت‌پذیر نیست. به هرحال مي‌توان هريك از كاراكترها را در داخل رشته امتحان كرد كه آيا كاراكتر null است يا نه. در خيلي موارد مشخص ساختن پايان يك رشته با يك كاراكتر مخصوص مانند كاراكتر null نياز به تعيين حداكثر طول براي رشته را از بين مي‌برد. به عنوان مثال رشتة فوق ۳۸ كاراكتر دارد كه شامل پنج فضاي خالي و چهار كاراكتر مخصوص است كه با escape sequence معرفي شده‌اند و در پايان كاراكتر null است كه انتهاي رشته را مشخص مي‌سازد.

يك ثابت حرفي مانند ‘P’ با يك ثابت رشته‌اي تك‌‌حرفي متناظر آن مانند “P” هم‌ارز نیست. همچنين به‌خاطر داشته باشيد كه در جدول كد اسكي، هر كاراكتر داراي يك مقدار عددي است، ولي يك رشتة تك‌‌‌حرفي اين‌طور نيست. در واقع يك رشتة تك‌حرفي متشكل از دو كاراكتر است كه كاراكتر دوم همان كاراكتر null است كه پايان رشته را مشخص مي‌سازد.

باز هم توجه داشته باشيد كه يك رشتة n كاراكتري به آرايه ۱+n عنصري نياز خواهد داشت، زيرا كاراكتر null نيز به طور خودکار به عنوان كاراكتر پاياني در آن قرار داده خواهد شد. براي مثال اگر رشتة “COMPUTER” در يك آراية يك بعدي كاراكتري به نام book ذخيره گردد، خانه اول آن، يعني book[0]، شامل كاراكتر C و خانة آخر، يعني book[8] شامل كاراكتر null خواهد بود كه معرف پايان رشته است.

دربارة رشته‌ها و آرايه‌ها و كاربرد آنها در فصل جداگانه‌اي به طور مشروح بحث خواهیم کرد.

مقداردهی اولية متغيرها

در صورتي که از پيش مقدار شروع متغير را بدانيم مي‌توانيم به هنگام تعريف، مقدار اولية مورد نظر را نيز به آن اختصاص دهيم. براي اين كار در تعريف متغيرها، به دنبال نام آن، اپراتور جايگزيني ‘=’ را همراه با مقدار اوليه به كار مي‌بريم. برای مثال هر يك از روشهاي زير متغيرهاي a , b , c را توصيف می‌کنند و به ترتيب مقادير ۱۲ , ۱۳ , -۲۵ را به آنها اختصاص مي‌دهند.

 

روش اول روش دوم روش سوم
int a =12;

int a =12 , b =13 ;

 int a =12 , b =13 , c = -25 ;

int b =13 ;

int c = -25 ;

int c = -25 ;

اما در دستور زير فقط به b مقدار اوليه داده شده است.

int a , b = 15 , c ;

در اين گونه موارد براي جلوگيري از اشتباه بهتر است متغيرهايي را كه مقدار اوليه مي‌پذيرند جدا از ساير متغيرها توصيف کرد، مانند مثال زير.

int a =12 , b =13 , c =25 ;

int d , e , f ;

v مثال ۲ـ۶ چند نمونة ديگر از مقداردهی اولية متغيرها در زير نشان داده شده است.

int sum = 5 ;

char Str = ‘ # ‘ ;

float tmp = 10.2 ;

double p1 = 0.1234E-6 ;

 

 عملگر cast

مي‌توان تبديل يك نوع به نوع ديگر را به صورت صريح انجام داد. اين كار به كمك عملگر cast انجام مي‌گيرد. پس ساختار cast نوع ديگر از تبديل است. براي اين كار كافي است نوع جديد داده مورد نظر را در داخل پرانتز مستقيماً جلوي عبارت قرار دهيم؛ براي مثال

k = (float)2 ;

مقدار صحيح ۲ را قبل از اختصاص‌دادن به k به float تبديل مي‌كند و سپس آن را به k اختصاص مي‌دهد. بنابراين، اپراتور cast اپراتور یکانی است؛ يعني فقط يك اپراند دارد.

در موارد متعددي روش casting خيلي مفيد است. براي مثال حالت زير را درنظر بگيريد.

int i =2 , k =3 ;

float h = k / i ;

در اينجا مقدار k / i (يعني ۳ / ۲) برابر ۱٫۵ خواهد شد. سپس نتيجه به float يعني ۱٫۰ تبديل و به h نسبت داده مي‌شود. حال می‌خواهيم مقدار ۱٫۵ را كه نتيجة واقعي عبارت رياضي ۳/۲ است به k و i يا هر دوي آنها را با cast به float تبديل كنيم، مثلاً

(float) k / i ;

در اينجا به‌طور صريح k به float تبديل مي‌گردد، پس نتيجه برابر ۱٫۵ خواهد شد. عبارت مزبور را مي‌توان به صورت k / (float) i ;   يا    (float) k / (float) i ;نيز نوشت كه نتيجه باز هم ۱٫۵ مي‌گردد، يعني نتيجه سه روش مزبور هم‌ارز است.

از مثالهاي بالا نتيجه مي‌شود كه به كمك casting مي‌توان در وسط جمله نوع داده را به نوع ديگري تبديل كرد. بنابراين اپراتور cast به‌عنوان نوع يا type عمل مي‌كند؛ يعني type conversion است و فرمت آن به‌اين طريق است كه نوع جديد متغير يا عبارت مورد نظر جلوي آن متغير يا عبارت در داخل پرانتز نوشته شود. براي مثال دستور (int)d1+d2 يعني اول d1 به int تبديل مي‌شود بعد با d2 جمع مي‌شود. درحالي كه دستور (int)(d1+d2) يعني نتيجة d1+d2 به int تبديل مي‌شود.

بنابراين فرمت اپراتور cast به صورت زير است.

(data type) expression

حال براي آنكه نقش اپراتور cast را بهتر متوجه شويد، به نتيجه و عملكرد دو مجموعه دستورهای زير توجه كنيد.

مثال اول مثال دوم

float x ;

short int x ;

printf (“%d\n”,(int)x) ;

printf (“%s\n”,(char)x) ;

 

در مثال اول براي متغير x كه از نوع float اعلان شده است، ۴ بايت حافظه پيش‌بيني مي‌شود. ولي در نتيجة اجراي دستور printf سطر دوم، به دليل دستور (int)x مقدار آن به نوع int تبديل مي‌گردد و نمايش داده مي‌شود. بنابراين، اگر براي مثال محتواي حافظه به‌صورت

۰٫۲۶ E+7

باشد، مقدار ۲۶۰۰۰۰۰ نمايش داده خواهد شد.

همين‌طور در مثال دوم براي متغير x كه از نوع short int اعلان شده است، ۲ بايت حافظه پيش‌بيني مي‌شود، ولي درنتيجة اجراي دستور printf سطر دوم، به دليل (char)x مقدار آن به نوع كاراكتر تبديل مي‌گردد و محتواي دو بايت حافظة مزبور به‌صورت يك رشتة دوبايتي نمايش داده مي‌شود. به همين دليل است كه در فرمت چاپ مقدار متغير مزبور، از فرمت “%s” كه براي رشته است استفاده شده است. حال اگر براي مثال محتواي حافظة مربوط به متغير x به صورت ۱ ۲ ۳ ۴ باشد، موقع نوشتن به صورت رشتة “۱ ۲ ۳ ۴” چاپ مي‌شود.

در اينجا به اختصار يادآور مي‌شویم كه فرمتهاي “%s”, “%c”, “%f”, “%d” به ترتيب براي متغيرهاي از نوع مقادير صحيح، اعشار، كاراكتر و رشته به كار می‌روند.

نوع void

داده از نوع void (تهي) در استاندارد ريچي وجود نداشت و بعد به استاندارد ANSI افزوده شد. از اين نوع داده هدف مهمي مورد نظر است و آن در مورد معرفي توابعي است كه مقداري را برنمي‌گردانند، بلكه فقط عمل خاصي را انجام مي‌دهند.

حتما بخوانید  آموزش برنامه نویسی ++c (جلسه چهارم)

v مثال ۲ـ۷ تابعي به نام FF1 كه داراي دو آرگون x و y است به صورت زير تعريف شده است.

void FF1(x , y)

int x , y ;

{

————–

————–

————–

}

قرار گرفتن void در جلوي نام تابع مزبور به‌اين ‌دليل است كه‌ اين تابع چيزي را برنمي‌گرداند.v

پيش‌‌پردازنده

پيش‌پردازنده را مي‌توان برنامة جداگانه‌اي در نظر گرفت كه قبل از كامپايلر واقعي اجرا مي‌گردد. هنگامي كه برنامه‌ای را كامپايل مي‌كنيد، پيش‌پردازنده به طور خودکار اجرا مي‌گردد. تمام فرامين پيش‌پردازنده با علامت ” # ” شروع مي‌گردند كه بايد اولين كاراكتر خط باشد. وظيفة اصلي و مهم پيش‌پردازنده آن است كه فايل درخواستي را آماده سازد و وارد برنامه كند. برخلاف دستورهای C كه به سميكولون ختم مي‌شوند، پايان جمله‌های آن با خط جديد مشخص مي‌گردد. دو دستور متداول از پيش‌‌پردازنده‌‌ها را در ادامه بررسي مي‌کنیم.

فرمان #include

فرمان #include موجب مي‌گردد كه كامپايلر همزمان با فايلي كه ترجمه مي‌كند، يك متن را نيز از فايل ديگر بخواند. اين عمل شما را قادر مي‌سازد كه بتوانيد قبل از شروع ترجمه، محتواي يك فايل را در فايل ديگر بريزيد (درج كنيد)، ضمن اينكه فايل اوليه تغيير نمي‌يابد. اين عمل به‌ ويژه در حالتي كه بيش از يك فايل مبنا، اطلاعاتي يكسان را سهيم شوند و به كار ببرند مفيد است. با اين كار به جاي اينكه اطلاعات مشترك دو فايل را به صورت دوبله در هر دو منظور کنيد، آن را فقط در يك فايل قرار مي‌دهيد، سپس هر موقع آن اطلاعات در فايل دوم مورد نياز باشد، به‌ طريق مذكور آن را براي استفادة فايل دوم نيز آماده مي‌كنيد.

تعريف فرمان #include به دو شکل زير است.

شکل اول شکل دوم
# include < filename >

 

# include “filename”

در شکل اول، پيش‌پردازنده فقط محل خاصي را كه با عامل مشخص شده است نگاه مي‌كند. اين محل جايي است كه include fileهاي سيستم، مانند header files براي كتابخانة زمان اجرا يا Runtime Library نگهداري مي‌شوند. اگر شکل دوم به كار رود، پيش‌پردازنده فهرست يا دايركتوري را كه شامل فايل مبناست نگاه مي‌كند. اگر فايل include file را در آنجا پيدا نكند، پس از آن مشابه شکل اول، محل خاص مورد نظر را جستجو مي‌كند. اسامي include fileها بر حسب قرارداد، به پسوند “h” ختم مي‌شوند.

حال ببينيم وقتي كه پيش‌پردازنده با فرمان # include<stdio.h> مواجه مي‌شود، چه پيش‌ مي‌آيد؟ پيش‌پردازنده فهرست تعريف شده در سيستم را براي فايلي به نام stdio.h جستجو مي‌كند. سپس فرمان #include را با محتواي فايل جايگزين مي‌كند.

براي اينكه بدانيد فرمان #include چگونه كار مي‌كند، فرض كنيد كه فايلي به نام file1.h داريد كه محتواي آن فقط دو دستور زير است.

int st-no ;

char name ;

سپس در فايل مبنا، فرمان #include را به صورت زير به كار مي‌بريد.

#include “file1.h”

main()

    {

 ———–

 ———–

    }

حال وقتي كه برنامة مزبور را ترجمه مي‌كنيد، پيش‌پردازنده به جاي فرمان #include محتواي فايل مشخص شده را قرار مي‌دهد. بنابراين فايل مبنا به صورت زير درمي‌آيد.

int st-no ;

char name ;

main()

    {

 ————

 ————

    }

فرمان #define

همان طور كه مي‌توان با توصيف يا اعلان متغير، اسمي را به يك محل از حافظه وابسته كرد و به آن محل با آن نام (كه همان متغير مورد نظر است) مراجعه کرد، به همان طريق مي‌توان اسمي را به يك مقدار ثابت وابسته كرد و آن را با همان اسم كه ثابت سمبوليكي ناميده مي‌شود مشخص و هنگام نياز به آن مراجعه كرد. اين گونه متغيرها را كه معمولاً با حروف بزرگ معرفي مي‌شوند ثابتهاي سمبوليكي يا symbolic constants گويند و اين عمل با دستور #define انجام مي‌گيرد.

براي مثال با دستور # define book 15 مي‌توان در هر جاي برنامه به جاي ۱۵ از book استفاده کرد. بنابراين دو دستور زير هم‌ارزند.

k = 12 + 15 ;

k = 12 + book ;

هر دو دستور مقدار (۱۲ +۱۵ = ۲۷) ۲۷ را به متغير k نسبت مي‌دهند.

براساس دستور define مقدارbook در حافظه به صورت مقدار ثابت ۱۵ است كه در طول برنامه تغيير نمي‌كند. انتخاب نام براي مقادير ثابت چند فايدة مهم دارد.

اول آنكه به بعضي مقادير ثابت مي‌توان اسم با معني اختصاص داد. مثلاً مي‌توان عدد معروف «پي» را كه تا ۴ رقم اعشار معادل ۳٫۱۴۱۵ است، در آغاز به صورت

#define Pi 3.1415

تعريف كرد و سپس در سرتاسر برنامه، به جاي عدد مزبور در تمام محاسبات وابسته به آن Pi را به كار برد.

دوم آنكه اگر مجبور باشيم در برنامه‌ای يك مقدار ثابت طولاني نامأنوس را چندين بار به كار بريم، ساده‌تر آن خواهد بود كه با دستور #define نامی مناسب براي آن انتخاب كنيم و به جاي ثابت مزبور از آن نام استفاده كنيم. مثلاً اگر مجبور باشيم همان عدد پي را با ۶ رقم اعشار در قسمتهاي متعددي از برنامه به كار بريم، اين عمل هم پردردسر و هم اشتباه‌زا خواهد بود. لذا بهتر است، مثل حالت قبل، يك اسم براي آن انتخاب كنيم.

سوم آنكه ممکن است طبيعت مقدار ثابت طوري باشد كه در زمانهاي مختلف تغيير كند، مثل نرخ ماليات، يا اجرت ساعت كار و يا درصدي كه به عنوان سود در بانكها به پس‌اندازهاي پولي يا سرمايه‌گذاري تعلق مي‌گيرد كه هميشه ثابت نيست و ممكن است برحسب مقررات، قوانين و ساير شرايط مقدار آن عوض شود. در چنين مواردي بايد در سرتاسر برنامه مقدار ثابت موردنظر را عوض كنيم. درحالي كه اگر با دستور #define اسمي براي آن انتخاب كرده باشيم كافي است فقط در همان يك دستور تغيير مورد نظر را اعمال كنيم. مثلاً اگر براساس قوانين، نرخ جديد ماليات بر درآمد برابر ۲ درصد باشد، كافي است به آن قبلاً نام TAX را اختصاص داده باشيم و با دستور #define TAX 0.02 مقدار جديد را جايگزين قبلي کنيم و ديگر نيازي نيست كه در داخل برنامه تغييراتي انجام دهيم. از مثال بالا مشخص مي‌گردد كه يك ثابت سمبوليكي نامي است كه جايگزين دنباله‌اي از كاراكترها مي‌گردد. كاراكترها ممكن است يك ثابت عددي، يك ثابت كاراكتري، و يك ثابت رشته‌اي باشند. بنابراين يك ثابت سمبوليكي اجازه مي‌دهد كه در يك برنامه به جاي يك مقدار ثابت (عددي، حرفي يا رشته‌اي) يك اسم قرار گيرد. وقتي كه برنامه ترجمه مي‌گردد، در هر محلي از برنامه كه ثابت سمبوليكي قرار گرفته باشد، دنبالة كاراكترهاي متناظر آن جايگزين مي‌گردد. ثابتهاي سمبوليكي معمولاً در آغاز برنامه تعريف مي‌گردند و شکل آنها به صورت زير است.

#define name text

كه در آن name معرف نام سمبوليك است كه معمولاً با حروف بزرگ نوشته مي‌شود. text نيز دنباله‌اي از كاراكترها را كه بايد به نام سمبوليك اختصاص داده شود معرفي مي‌نمايد. توجه داشته باشيد كه text به سميكولون ختم نمي‌گردد، زيرا تعريف ثابت سمبوليك دستور واقعي C نیست.

v مثال ۲ـ۸ در زير نمونه‌هاي ديگري از ثابتهاي سمبوليكي نشان داده شده است.

#define             Temp    ۵۲۴

#define             Pi          ۳٫۱۴۱۵

#define             true       ۱

#define             Name    ” payam noor ”

#define             f(x)       x + 1

خصيصة #define كه براي تعريف ثابتهاي سمبوليك به كار می‌رود يكي از چندين خصيصه‌اي است كه در پيش‌پردازنده وجود دارد.

v

خودآزمایی ۲

  1. برنامه‌اي بنويسيد كه مساحت دايره‌اي به شعاع R را محاسبه کند و نمايش دهد.
  2. برنامه‌اي بنويسيد كه کاراکتري را از ورودي بخواند و کد اسکي آن را چاپ کند.
  3. برنامه‌اي بنويسيد كه مجموع ۱۰۰ جملة اول سري زير را محاسبه و چاپ كند.

y = 1 + 1/2 + 1/3 + 1/4 + …

  1. برنامه‌اي بنويسيد كه ضرايب معادله‌های درجه دوم را بخواند، جوابهاي آن را به دست آورد و چاپ كند. اگر معادله ريشة حقيقي نداشته باشد، پيغام مناسب نمايش دهد.
  2. خروجي برنامة زير چيست ؟

main()

   {

unsigned char ch ;

ch = -12 ;

printf (“%d” , ch) ;

   }

  1. خروجي برنامة زيرچيست ؟

main ()

    {

 unsigned char c ;

 c = 100 * 4 ;

 printf (“%d” , c) ;

}

[۱]. modifier

[۲]. qualifier

[۳]. scientific notation

[۴]. American standard code for information interchange

[۵]. Extended binary-coded decimal interchange

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *