آموزش توربو سی بخش دوم

آموزش توربو سی بخش دوم

توسط amin8505 | گروه مقاله های آموزشی | 1394/07/06

نظرات 0

 انواع داده ها در C

دسته‌بندي داده‌ها به انواع مختلف ، يكي از تواناييهاي مدرن زبانهاي برنامه‌نويسي است. زبان C مجموعه کاملي از انواع داده‌ها را پشتباني مي‌كند که آنها را مي‌توان به روشهاي زير دسته‌بندي كرد :
- داده‌هاي از نوع صحيح ( integer )
- داده‌هاي از نوع اعشاري ( floating point ) 
- داده‌هاي از نوع کاراکتر( character)
      همچنين داده‌ها در زبانهاي برنامه ‌نويسي بصورت مقادير ثابت و مقادير متغير بكار برده مي‌شوند. مقادير ثابت ، مقاديري هستند كه در طول برنامه تغيير نمي‌كنند، اما متغيرها مي‌توانند در طول اجراي برنامه، مقادير مختلفي از داده‌ها را بپذيرند .
مقادير صحيح و ثابت را مي‌توان علاوه بر روش معمول دهدهي ، در مبناهاي هشت و شانزده نيز نوشت . مجموعه داده‌هاي از نوع صحيح و اعشاري را داده‌هاي از نوع محاسباتي يا arithmetic  مي‌نامند. دو نوع ديگر از داده‌ها، نوع اشاره‌گر يا pointer و نوع شمارشي يا  enumerated است، كه همراه با نوع محاسباتي، داده‌هاي نوع اسكالر ناميده مي‌شود  اين نوع داده‌ها را از اين لحاظ اسكالر مي‌نامند كه قابل مقايسه يا قابل سنجش با همنوع خود هستند. علاوه بر داده‌هايي از نوع اسكالر، داده‌هايي از نوع مجموعه‌اي وجود دارند كه شامل: آرايه‌ ، ركورد ، ساختار و اجتماع مي‌باشند ، كه در سازماندهي متغيرهايي كه بطور منطقي به يكديگر مرتبط هستند، مفيد مي‌باشند. اين نوع داده‌ها نيز در فصول بعدي مورد بررسي قرار خواهند گرفت.

اعلان  متغيرها
     در زبان  Cهر متغير، پيش از آنكه در دستوري از برنامه بكار برده شود، بايد تعريف گردد . دستورات مربوط به تعريف كردن متغيرها، اطلاعات لازم در مورد نوع داده‌هايي كه متغيرهاي مورد نظر مي‌پذيرند و اينكه چند بايت حافظه اشغال مي‌كنند و چگونگي تفسير آنها را در اختيار كامپايلر قرار مي‌دهد. براي اعلان يا تعريف متغيرهايي از نوع integer كلمه كليدي يا كلمه رزرو شده int را نوشته و به دنبال آن اسامي متغيرهاي مورد نظر را كه با كاما از يكديگر تفكيك مي‌گردند مي‌نويسيم، مانند:
int  a , b , c ;
البته مي‌توان هريك از متغيرها را در دستوري جداگانه و همين‌طور در سطري جداگانه معرفي كرد، مانند:
int  a ;  int  b ;
int  c ;
كه در سطر اول دو متغير با دو دستور جداگانه اعلان شده و متغير سوم نيز در سطر جديد با دستور جداگانه اعلان شده است. واضح است روش اول كه در آن هر سه متغير در يك سطر و با يك دستور اعلان شده است، ساده‌تر مي‌باشد. بنابراين كلمه رزرو شده int داده‌هايي از نوع صحيح را مشخص مي‌كند. نه كلمه كليدي براي اعلان داده‌هايي از نوع اسكالر وجود دارد كه در جدول زير نشان داده شده است .
كلمات كليدي براي توصيف متغيرها

اصلي

اصلاح کننده

int

float

char

double

enum

short

long

signed

unsigned

 
پنج كلمه ستون اول نوع اصلي يا پايه‌اي هستند. چهار كلمه ستون دوم را اصلاح‌كننده يا modifier  و نيز توصيف‌كننده يا qualifier نامند كه به طريقي پنج نوع اصلي را توصيف مي‌كنند.  بعبارت ديگر مي‌توان پنج نوع اصلي را بعنوان اسم و چهار نوع توصيف‌كننده را صفت براي آن اسامي تصور كرد.
هرگونه اعلان متغيرها در داخل يك بلاك بايد قبل از اولين دستور اجرايي ظاهر شود. به هرحال ترتيب اعلان آنها فرق نمي‌كند. بعنوان مثال دو روش اعلان زير از نظر نتيجه عملكرد يكسان است :

روش دوم

 

روش اول

  int  a , b ;

 

     float  x ;

  float  x , y , z ; 

 

     float  y , z  ;

 

 

     int  a ;

 

 

     int  b ;


انواع مقادير صحيح
 زبان C از لحاظ بزرگي عناصر و همچنين از نظر نمايش داخلي آنها استاندارد ويژه‌اي بكار نمي‌برد. بطور کلي اعداد صحيح مثبت ، منفي و صفر و نيز متغيرهايي كه مقادير صحيح را مي‌پذيرند، 16 يا 32 بيت حافظه اشغال مي‌كنند و در کامپيوتر هاي IBM و سازگار با آن، منفي آنها به فرم متمم 2 يا :complement’2
 مي‌باشد. فرم اوليه داده‌هايي از نوع صحيح، همان int بعنوان مقدار صحيح در نظر گرفته مي‌شود. اما اندازه يا بزرگي آن برحسب نوع ماشين و كامپايلر فرق مي‌كند.
در هنگام تعريف  متغيرهاي از نوع int توصيف‌كننده‌هاي :
short  ,  long  ,  signed  , unsigned
يا تركيبي از آنها نيز ممكن است بكار برده شود .
      داده‌هايي كه با اين كلمات توصيف مي‌گردند، ممكن است از كامپايلري به كامپايلر ديگر تفسير متفاوت داشته باشند. ولي اساس آنها يكسان است. اگر مقادير صحيح در يك كامپايلر در حالت عادي 2 بايت باشد، بين short int  و int فرقي نخواهد بود و هر دو 16 بيت يا 2 بايت حافظه بكار خواهند برد. در ضمن short int را مي‌توان فقط بصورت short نيز بكار برد (يعني پيش‌ فرض آن است كه short همان short int مي‌باشد). در چنين حالتي long int نيز 4 بايت حافظه اشغال خواهد كرد كه آن را هم مي‌توان فقط بصورت long بكار برد (يعني در اينجا نيز پيش ‌فرض آن است كه long همان long int مي‌باشد) ولي چنانچه مقادير صحيح در حالت عادي 4 بايت حافظه اشغال نمايد، short int يا فقط short 2 بايت حافظه بكار خواهد برد. اما بين long int , int (يا فقط long) تفاوتي وجود نخواهد داشت و هر دو 4 بايت حافظه اشغال خواهند نمود.
      در مواردي متغيرها ، فقط داراي مقادير غيرمنفي خواهند بود ، مثلاً متغيري كه براي شمارش بكار برده مي‌شود، يكي از اين موارد است. زبان C اجازه مي‌دهد كه اين گونه متغيرها را با بكار بردن توصيف‌كننده  unsigned، بدون علامت اعلان كنيم. يك مقدار صحيح بدون علامت از نظر ميزان حافظه اشغالي با مقدار صحيح معمولي فرقي ندارد. تفاوت ميان آنها در بيت سمت چپ است كه بيت علامت ناميده مي‌شود و در مورد مقادير صحيح بدون علامت، اين بيت نيز مثل ساير بيتها براي نمايش مقدار عدد بكار مي‌رود و در نتيجه مقادير صحيح بدون علامت هميشه غيرمنفي بوده و بزرگي آن مي‌تواند تقريباً تا دو برابر مقدار صحيح معمولي باشد. براي مثال عدد صحيح معمولي از 32768- تا 32767+ (در مورد مقادير صحيح دو بايتي) تغيير مي‌كند، بنابراين مقدار صحيح بدون علامت از صفر تا 65535 تغيير خواهد كرد.
در استاندارد ريچي توصيف ‌كننده signed پيش‌بيني نشده است. ولي استاندارد ANSI آن را پشتيباني مي‌كند. در اغلب حالات به‌صورت پيش‌فرض، متغيرها signed هستند. لذا نيازي به بكاربردن توصيف‌ كننده‌ signed در آنها نخواهد بود. يك استثنا بر اين حالت داده‌هايي از نوع كاراكتر char type است كه بصورت پيش‌فرض مي‌تواند signed يا unsigned باشد كه بستگي به كامپايلر دارد. در اغلب كامپايلرها پيش‌فرض signed char مي‌باشد .
      متغيرهايي كه معرف اعداد صحيح هستند، مي‌توانند بصورتهاي زير توصيف گردند:
short  int
int
unsigned  int
signed  int
long  int
unsigned  long  int
unsigned  short  int

مثال -  در زير نمونه هايي از نحوه معرفي متغيرهايي از نوع صحيح نمايش داده شده است :
1) long  int  temp , Pnoor ;
2) short  int  y1 , y2 , y3 ;
3) unsigned  int   m , n ;
4) unsigned  long  sum , average ;
5) unsigned  short  tik , tak ;

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


داده هاي كاراكتري
    يکي از انواع داده هايي که در برنامه نويسي استفاده ميشود داده هاي کاراکتري است . در بسياري از زبانهاي برنامه ‌سازي داده‌هاي عددي و داده‌هاي كاراكتري با يکديگر تفاوت دارند . مثلاً عدد 2 يك داده عددی و حرف A داده كاراكتري درنظر گرفته مي‌شوند. در عمل هم ، كاراكترها بعنوان اعداد در حافظه كامپيوتر ذخيره مي‌گردند، و هر كاراكتر داراي يك كد عددي است. كدهاي مختلفي وجود دارد كه دو نوع آن به نام ascii به مفهوم كد استاندارد آمريكايي براي تبادل اطلاعات يا :
American  standard  code  for  information  interchange  و ديگري ebcdic به مفهوم كد توسعه يافته bcd يا :Extended  binary-coded  decimal  interchangeكه IBM روي سيستم بزرگ خود بكار مي‌برد، بيشتر، متداول است . ه البته در زبان  C، كد نوع ascii متداول است. در همه كدگذاريها براي هر كاركتر يك نماد عددي وابسته است كه در مورد كدگذاري آسكي به آن ascii  code گويند، كه مقدار آن در فاصله صفر تا 255 واقع است.                 
      در زبان C تفاوت بين اعداد و كاراكتر ناچيز است. در اين زبان يكي از انواع داده‌ها، char ناميده مي‌شود، اما در حقيقت كاراكتر يك مقدار صحيح يك بايتي است كه مي‌تواند هم براي نگهداري اعداد و هم براي نگهداري كاراكترها بكار برده شود. 
ثابتهاي حرفي در داخل يك زوج گيومه قرار مي‌گيرد. اين گيومه‌ها به كامپايلر ديكته مي‌كند كه كد عددي كاراكتر مورد نظر را بدست آورد. براي مثال در دستورهاي :
char  a , b ;
b = 5 ;           
a = ’5’;
مقدار a برابر 53 ، يعني برابر آسكي كد كاراكتر ’5’ و مقدار b برابر 5 خواهد بود .

مثال - برنامه زير يك كاراكتر را از ورودي‌ خوانده و كد عددي آن را نمايش مي‌دهد. 
#include <stdio.h>
main( )
  {
     char ch ;
     scanf ("%c", &ch) ;
     printf (" The numeric code  is : %d \n ", ch) ;
  }
 همچنين در توابع  printf و  scanf نماد %c بعنوان فرمت متغيرهاي كاراكتري بكار برده مي‌شود مانند %d كه براي متغيرهاي  مقادير صحيح و %f كه براي متغيرهاي مقادير اعشار بكار برده ميشوند (توابع ورودي و خروجي و فرمت متغيرها در فصل چهار مورد بررسي قرار خواهند گرفت .)
در مجموعه كاراكتر اسكي ، كد كاراكترها داراي ترتيبي براساس همان ترتيب كاراكترها هستند براي مثال كد حروف بزرگ :
’A’  برابر 65
’B’  برابر  66
... ... 
’Z’   برابر 90
مي‌باشد. كد حروف كوچك از 91 تا 122 است. با توجه به ارزش كد حروف، تابع زير حروف بزرگ را به حروف كوچك تبديل مي‌كند. ( توابع در فصل شش بررسي خواهد شد .) :
char Up-to-low (ch)
char ch ;
 {
    return  ch + 32 ;
  }
تابع مذکور به اسكي كد هر كاراكتر دريافتي 32 واحد اضافه مي‌كند كه درنتيجه حروف بزرگ به حروف كوچك تبديل مي‌شود. مثلاً اسكي كد حرف ’A’ كه 65 مي‌باشد، 32 واحد از اسكي كد حرف ’a’ كه 97 مي‌باشد، كوچكتر است. مشابه آن مي‌توان تابعي براي تبديل حروف كوچك به بزرگ تعريف كرد، كه در اين حالت بايد از اسكي كد حرف مورد نظر 32 واحد كسر گردد تا به حرف بزرگ مشابه خود تبديل شود .
      در سيستم كدگذاري غير ascii مانند  ebcdic، تفاوت عددي كد حروف بزرگ و كوچك 32 نمي‌باشد. بنابراين در چنين حالتي تابع تعريف شده بالا نتيجه مطلوب را نمي‌دهد. براي جلوگيري از چنين اشتباهي زبان C داراي توابع كتابخانه‌اي به اسامي:toupper  ,  tolower است كه به ترتيب عمل تبديل كاراكترها از بزرگ به كوچك و از كوچك به بزرگ را انجام مي‌دهند.

مقادير ثابت صحيح
در زبان C يکي ديگر از انواع داده ها ، مقادير ثابت صحيح است . يك مقدار ثابت صحيح عدد و يا دنباله‌اي از ارقام است كه ميتواند در مبناي 8 ، مبناي 10 و يا مبناي 16 تعريف شده باشد. اعداد زير نمونه‌هايي از اعداد با مقادير ثابت صحيح در مبناي 10  مي‌باشند :76592  ,   +4356   ,    35   ,   12  ,  0
در C بطور پيش فرض اعداد صحيح در مبناي 10 تعريف شده اند. اما مبناهاي 8 و 16 نيز كاربرد زيادي دارند. زيرا  8 و 16 توانهايي از مبناي 2 بوده و اين گونه سيستم هاي عددنويسي براي كامپيوترها مناسب تر است. براي مثال عدد 65536 در يك ماشين 16 بيت همان عدد 10000 در مبناي 16 مي‌باشد .
كامپيوتر چگونه تشخيص مي‌دهد كه عددي در مبناي 8 يا  10 يا 16 تعريف شده؟ براي مشخص ساختن آن از پيشوندهاي 0 براي مبناي 8 و 0x براي مبناي 16 استفاده مي‌شود، مبناي 10 هم که پيش فرض بوده و پيشوند ندارد .بنابراين در مورد اعداد :+04163   ,   -0326   , 0531
صفر سمت چپ به معناي آن است كه اعداد مزبور در مبناي 8 مي‌باشند. لذا اگر عدد در مبناي 10 باشد، اولين رقم سمت چپ آن نمي‌تواند صفر باشد. بديهي است در مبناي 8 فقط هشت نشانه صفر تا 7 بعنوان ارقام بكار برده مي‌شوند. همچنين در مبناي 16 نيز، شانزده نشانه مختلف بكار برده خواهد شد كه ده نشانه آن همان نشانه‌هاي متداول در مبناي 10 يعني صفر تا 9  ميبا شد و شش نشانه ديگر حروف :A , B , C , D , E , F  مي‌باشد كه به ترتيب معادل :10 , 11 , 12 , 13 , 14 , 15
در مبناي 10 هستند. مثالهاي زير نمونه‌اي از اعداد مبناي 16 هستند :
0xFE6  ,  0x5AB  ,   0x327  ,  0x15
      اگر طول هر كلمه ماشين مورد نظر 16 بيت باشد ، طول آنها از -32k تا +32k يعني از -32768 تا +32767 كه معادل با 215-1 و يا معادل 077777 مبناي 8 و يا 7FF مبناي 16 است، تغيير خواهد كرد. ولي اگر طول هر كلمه 32 بيت باشد طول آنها از -2G تا +2G يعني از :
-2, 147,483, 648  تا    2, 147, 483,647
كه معادل 231-1 است ، خواهد بود .
مقادير ثابت صحيح بدون علامت يا  unsigned integer constants   با قرار دادن u حرف اول كلمه unsigned و همين‌طور مقادير ثابت صحيح طولاني يا long integer constants   با قراردادن حرف l حرف اول كلمه long  در سمت راست آنها مشخص مي‌گردد كه l و u مي‌تواند به هر دو صورت حروف بزرگ يا كوچك نوشته شوند. همچنين اگر عددي هر دو صفت مذكور را داشته باشد (يعني هم بدون علامت و هم به‌صورت طولاني باشد) با دو حرف ul (u در سمت چپ، l در سمت راست آن) متمايز مي‌گردد. جدول زير مثالهايي از مقادير ثابت صحيح را با درنظر گرفتن موارد بالا نشان مي‌دهد.

  

 مثالهايي از مقادير ثابت صحيح بدون علامت و طولاني

 

مقدار ثابت

سيستم عددنويسي

 

56780u

مبناي 10 (بدون علامت)

 

123456789L

مبناي 10 (طولاني)

 

123456789uL

مبناي 10 (بدون علامت و طولاني)

 

0123456uL

مبناي 8 (بدون علامت)

 

0123456uL

مبناي 8 بدون علامت و طولاني)

 

0563214L

مبناي 8 (طولاني)

 

0777777u

مبناي 8 (بدون علامت)

 

0x12545678L

مبناي 16 (طولاني)

 

0xABCDEFu

مبناي 16 (بدون علامت)

 

0xEEF123AbuL

مبناي 16 (بدون علامت و طولاني)

 

 

 


      توابع scanf  و printf   در فرمت مربوط به خواندن و نوشتن مقادير صحيح در مبناي 8 و 16 به ترتيب حروف o و x را بعنوان مشخص‌كنندة فرمت يا format specifier در رشته كنترل فرمت بكار مي‌برد. 
مثال -  برنامه زير عددي در مبناي 16 (با پيشوند 0x يا بدون آن) را از طريق ترمينال مي‌خواند و معادل آن را در مبناهاي ده و هشت چاپ مي‌كند :

# include<stdio.h>
main ( )
   {
      int  num ;
      printf ("Enter  a  hexadecimal  constant : \n" ) ;
      scanf ("%x",&num) ;
      printf ("The  decimal  equivalent  of  %x  is :  %d ", num , num ) ;
      printf ("\n The  octal  equivalent   of  %x  is : %o\n", num , num ) ;
  }
 

 

0 نظر

نظر محترم شما در مورد مقاله های وب سایت برنامه نویسی و پایگاه داده

نظرات محترم شما در خدمات رسانی بهتر ما را یاری می نمایند. لطفا اگر مایل بودید یک نظر ما را مهمان فرمائید. آدرس ایمیل و وب سایت شما نمایش داده نخواهد شد.

حرف 500 حداکثر