loading...
دانلود سرای دانشجویی

فيلدهای بيتی

به طور نرمال در هر زبان برنامه نویسی هر متغیری از نوع های شناخته شده است و تعداد بایت های معینی می گیرد. ++C یک نوع دیگر ارائه می دهد که در اکثر زبان های دیگر موجود نیست. فیلدهای بیتی (bit fields) اجازه دسترسی به بیت های تکی را می دهد.

یک فیلد بیتی در یک ساختمان عادی به صورت یک جزء unsigned به همراه علامت (:) و یک عدد که نشاندهنده تعداد بیت های فيلد است تعريف می شود.


مثال. متغير linestatus يک بايت فضا اشغال می کند.

#include <iostream.h>
struct status {
   unsigned changeinline: 1;
   unsigned cleartosend:1;
   unsigned inactive:1;
   unsigned ringing:1;
   unsigned signalreceived:1;
};
int main() {
   status linestatus;
   if (linestatus.cleartosend) senddata();
   if (linestatus.inactive) dialnumber();
   if(linestatus.ringing) answerphone();
   return 0;
}


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

يونيون

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

union tag
{
   union_member(s);
} instance;

کلمه کليدی union برای اعلان يونيون است. tag نامی است که به يونيون داده می شود. اجزای يونيون درون آکولاد قرار می گيرند. instance يک متغير يونيون است که می تواند درون برنامه هم با فرمت زير اعلان شود.

union tag instance;

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


مثال.

union NumericType {
   int ivalue;
   long lvalue;
   double dvalue;
}

مثال. تنها اولين جزء متغير يونيون هنگام اعلان می تواند مقداردهی اوليه شود.

union date_tag {
   char full_date[9];
   struct part_date_tag {
      char month[2];
      char break_value1;
      char day[2];
      char break_value2;
      char year[2];
   } part_date;
}date = {"01/01/97"};


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

typedef

typedef

typedef راهی است برای تعریف برچسبهای جدید برای نوعهای داده است. هدف typedef ایجاد نوع جدیدی از انواع داده موجود است. به صورت کلی زير استفاده می شود:

typedef datatype label;

label برچسب جديدی است که به نوع داده datatype داده می شود و معمولا حروف اول آن بزرگ است تا از نوع های پیش ساخته تفکیک شود.

typedef می تواند با هر نوع داده ای بکار رود حتی نوع های پایه مثل int. البته توصیه می شود با نوع های پيچيده مانند آرایه یا ساختمان استفاده شود.


مثال. تغيير نام int به Integer.

typedef int Integer;
int i,j;
Integer min;

مثال. اعلان a و b از نوع آرايه صحيح.

typedef int MyArray[10];
MyArray a,b;

مثال. اعلان متغيرهای topleft و bottomright از نوع ساختمان. دقت کنيد با استفاده از typedef کلمه struct قبل از اسم متغير ديگر لازم نيست ذکر شود.

typedef struct {
   int x;
   int y;
} Coord;
Coord topleft, bottomright;


توابع پيش ساخته

علاوه بر توابع متعددی که می توانید بسازید ++C توابع آماده مفیدی را در اختيار می گذارد. توابع پيش ساخته (built-in functios) يا کتابخانه ای توابعی هستند که می توانيد از آنها در برنامه استفاده کنيد. برای استفاده از يک تابع کتابخانه ای ابتدا تابع و شرح آنرا را از مراجع برنامه نو‍یسی پيدا کنيد. هر تابع کتابخانه ای دارای يک هدر فايل است که پروتوتايپ تابع را دربردارد و توسط دستور #include با‍يد به برنامه ضميمه شود. تابع را طبق گرامر آن فراخوانی کنيد. اگر در فراخوانی تابع اشتباهی وجود داشته باشد کامپايلر پيغام خطا می دهد.

توابع ریاضی

هدرفايل شرح تابع

یک زاویه را گرفته کسینوس آنرا می دهد

double cos(double);

یک زاویه را گرفته سینوس آنرا می دهد

double sin(double);

یک زاویه را گرفته تانژانت آنرا می دهد

double tan(double);

یک عدد را گرفته لگاریتم طبیعی آنرا بر می گرداند

double log(double);

عدد اولی را به توان دومی می رساند

double pow(double,double);

دو ضلع مثلث قائم الزاویه را گرفته و طول وتر را می دهد

double hypot(double,double);

ریشه دوم عدد صحیح را برمی گرداند

double sqrt(double);

قدرمطلق یک عدد صحیح را برمی گرداند

int abs(int);

قدرمطلق يک عدد اعشاری را برمی گرداند

double fabs(double);

بزرگترين عدد صحیحی که کمتر یا مساوی آرگومان باشد را برمی گرداند

double floor(double);

کوچکترين عدد صحیحی که بيشتر یا مساوی آرگومان باشد را برمی گرداند

double ceil(double);

هدرفايل شرح تابع

یک عدد صحیح را به معادل کاراکتری تبدیل می کند. Radix مبنای عدد صحیح است

char *itoa(int value, char *buffer, int radix)

یک کاراکتر را به یک عدد صحیح معادل تبدیل می کند

int atoi(const char *string);

کاراکتر را به حالت کوچک تبدیل می کند

int tolower(int c);

کاراکتر را به حالت بزرگ تبدیل می کند

int toupper(int c);

ههر چیزی که در source باشد در مقصد کپی می کند. Size تعداد کپی را معین می کند

void *memcpy(*destination, *source, size)

distination را با کارکتری که در replacement قرار دارد تنظیم می کند

void *memset(*destination, replacement, size)


عملگر & با تابع itoa بکار می رود. x=itoa(&a);


مثال. memcpy و memset اکثرا برای داده هائی مانند ساختمان و آرايه بکار می روند. برنامه زير آرايه x را در y کپی می کند.

#include
#include
int main() {
   int x[10]={1,2,4,6,6,9,0,11,7,2};
   int y[10];
   memcpy(x,y,10);
   return 0;
}


توابع زمان

با اضافه کردن فایل هدر time می توان به توابع زمان دسترسی پیدا کرد. برخی توابع پر استفاده در جدول زیر آمده است:

هدرفايل شرح تابع

تعداد ثانیه های سپری شده از ساعت 00:00 اول ژانویه 1970 را می دهد

time_t time(time_t *time);

زمان را به ساختمان tm با ساعت محلی تبدیل می کند

struct tm *localtime(const time_t *time);

تفاوت دو زمان را می دهد

double difftime(time_t time2,time_1 time1);

تایمر را به ساختمان tm با ساعت GMT تبدیل می کند

struct tm *gmttime(const time_t *time);

زمان را به رشته ای شامل ساعت و تاریخ متناسب با زمان محلی در فرمت خوانا تبدیل می کند.

Char *ctime(const time_t *time);


مثال. برنامه زير ساعت و تاريخ جاری سيستم را می دهد.

#include
#include
int main () {
   time_t rawtime;
   time ( &rawtime );
   cout << "Current date and time is: "<< ctime (&rawtime);
   return 0;
}


توابع اعداد تصادفی

برای تولید کلید رمز یا بازی ها نیاز به تابعی برای تولید یک عدد تصادفی است. توابع زير برای این منظور می تواند بکار رود.

هدرفايل شرح تابع

يک عدد تصادفی بين 0 و n-1 را بر می گرداند.

int random(int n);

,

 

randomize();


مثال. برنامه زير 10 عدد تصادفی را نمايش می دهد.

#include
#include
#include
int main() {
   int i,j;
   randomize();
   for( i = 0;i < 10;i++ ){
      j= rand();
      cout << j << endl; }
   return 0;
}


فايل های ضميمه

همانطور که در قسمت قبل مشاهده کرديد ++C تعداد زيادی تابع کتابخانه ای دارد. شما هم می توانيد توابع خود را درون يک فايل کتابخانه ای جمع کنيد. اگر قصد داريد يک فايل کتابخانه بسازيد ابتدا يک فايل هدر برای پروتوتايپ های کليه توابع کتابخانه خود بسازيد و با پسوند .h ذخيره کنيد. اگر اين فايل در فولدر جاری باشد توسط دستور #include "header.h" يا اگر در فولدر INCLUDE کامپايلر باشد توسط #include <header.h> پيدا می شود. سپس کليه توابع را به يک فايل کتابخانه منتقل کنيد. توابع کتابخانه ای معمولا انشعاب .lib يا .a را دارند.

سربارگذاری توابع

اکثر زبان های برنامه نويسی برنامه نويس را ملزم می کنند برای هر تابع نام منحصر بفردی را تعريف کنند. ويژگی چندريختی (polymorphism) در زبان ++C اين امکان را فراهم کرده که یک نام برای بیش از یک تابع به طور مشترک استفاده شود. اين عمل سربارگذاری توابع (function overloading) هم ناميده می شود. برای اينکه کامپايلر توابع هم نام را از هم تشخيص دهد نوع و تعداد پارامترهای توابع بايد با هم متقاوت باشد. کامپایلر از نوع آرگومان متوجه می شود کدام تابع فراخوانی شده است.


مثال.

#include <iostream.h>
float cube_number(float num);
int cube_number(int num);
int main() {
   float number;
   float number3;
   cout << "Please enter a number n";
   cin >> number;
   number3 = cube_number(number);
   cout << number << " cubed is " << number3;
   return 0;
}
int cube_number(int num) {
   return num * num * num;
}
float cube_number(float num) {
   return num * num * num;
}

متغيرهای محلی

متغيرهائی که درون تابع تعريف می شوند متغيرهای محلی (local variables) ناميده می شوند. محلی بر اين دلالت دارد که متغيرها تنها خاص تابع هستند و از متغيرهای هم نام در هر جای ديگر برنامه مجزا می باشند. تابع می تواند هر تغييری روی آنها بدهد بدون اينکه روی قسمت های ديگر برنامه اثر داشته باشد. متغيرهائی که خارج از هر بلاکی تعريف می شوند متغير های سراسری (global variables) ناميده می شوند و در کليه توابع قابل دسترسی هستند.


مثال. در برنامه زير متغير m سراسری است و توسط کليه توابع قابل دسترسی و تغيير است. درحاليکه دو متغير n از هم مستقل هستند و هرکدام تنها درون تابعی که اعلان شده اند تغيير می کنند.

#include <iostream.h>
int m;        // M is a global variable
int f(int n) {
   n++;
   return n;
}
int g() {
   m++;
   return m;
}
int main() {
   int n = 5;
   cout << "n = " << n << "n";
   cout << "f(n) = " << f(n) << "n";
   cout << "n = " << n << "n";
   m = 5;
   cout << "m = " << m << "n";
   cout << "g() = " << g() << "n";
   cout << "m = " << m << "n";
}

ارسال مقدار به تابع

وقتی مقداری به تابع ارسال می شود یک کپی از محتویات آرگومان به پارامتر نسبت داده می شود یعنی در اصل پارامتر یک کپی از متغیری است که به تابع ارسال می شود و مقدار آن خارج از تابع تغییر نمی کند. این روش ارسال یک متغیر با مقدار (passing variable by value) نامیده می شود. که روش معمول است. روش دیگر ارسال یک متغیر به تابع به صورت مرجع (called by reference) است. در این حالت به جای یک کپی از مقدار متغیر آدرس آن به تابع داده می شود بنابراين نام متغیر و نام پارامتربه یک مکان حافظه ارجاع می کنند. یعنی پارامتر متغیر جدیدی نیست بلکه همان متغیر قبلی با نام جدید است. در این حالت وقتی متغیر درون تابع تغییر می کند متغیر خارج از تابع هم تغییر می کند.

برای تعيين پارامتری به صورت مرجع کافی است علامت & (عملگر آدرس) قبل از پارامتر تابع در اعلان اضافه شود.


مثال. متغير m به صورت مقداری به تابع ارسال شده است. خروجی تابع عدد 1 است.

#include <iostream.h>
void f(int n) {
   n = 4;
}
int main() {
   int m = 1;
   cout << m << "n";
   f(m);
   cout << m << "n";
}

مثال. پارامتر number مرجع است.

#include <iostream.h>
void demo(float &number);
int main () {
   float num1;
   cout << "Please enter a number. n";
   cin >> num1;
   cout << "Before the demo function your number is " << num1 << "n";
   demo(num1);
   cout << "After the demo function your number is still " << num1 << "n";
   return 0;
}
void demo(float &number) {
   number = number * 3;
   cout << "Inside the demo function the number is now " << number << "n";
}

بهترين موتورهای جستجو

گوگل به عنوان موتور جستجوی پيشرو در بين ديگر موتورهای جستجو شناخته شده است. بيشتر از 72% جستجوها در گوگل صورت می گيرد و اين رقم همچنان رو به رشد است. علت اين امر تا حدودی به دليل سادگی آن است، خصوصا اگر Google Toolbar را در مرورگر خود نصب کرده باشيد يا از Google Chrome استفاده می کنيد.

موتورهای جستجوی بسياری غير از گوگل موجود هستند که امکانات متفاوتی را در اختيار می گذارند. لينک های تعدادی از محبوب ترين موتورهای جستجو در زير آمده است.

Alta Vista Google
Amazon Grokker
Answers Info
AOL Search Lycos
Ask Mamma
Bing MSN Search
Dogpile Snap
Ebay Soople
exalead Windows Live
Excite Yahoo

دستور return

برای برگرداندن مقداری از تابع به فراخواننده دستور return استفاده می شود. مقدار برگشتی تابع که به دنبال دستور return نوشته می شود بايد از همان نوعی باشد که در اعلان تابع قبل از اسم تابع معین شده است.

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

تابع ممکن است دارای چند دستور return باشد تا بتواند در شرايط متفاوت مقادير مختلف را برگرداند. در اين صورت اولين دستورreturn که اجرا می شود موثر است.


مثال. برنامه زير دو عدد را از ورودی گرفته عدد بزرگتر را نمايش می دهد.

#include <iostream.h>
int larger_of( int , int );
int main() {
   int x, y, z;
   cout <<"Enter two different integer values: ";
   cin >> x >> y;
   z = larger_of(x,y);
   cout << "nThe larger value is " << z;
   return 0;
}
int larger_of( int a, int b) {
   if (a > b) return a;
   else return b;
}


همان طور که قبلا گفته شده است main هم يک تابع است البته با کمی تفاوت. تابع main نیازی به پروتوتایپ ندارد و اتوماتيک هنگام اجرای برنامه فراخوانی می شود و هرگز در کد برنامه صدا زده نمی شود تابع main يک عدد صحيح را می تواند برگرداند که صفر يا غيرصفر است. اگر اجرای برنامه بطور موفق به انتها رسيده باشد مقدار صفر و در غيراينصورت يک مقدار غيرصفر در مقابل دستور return نوشته می شود.

تعداد صفحات : 425

اطلاعات کاربری
آمار سایت
  • کل مطالب : 4247
  • کل نظرات : 0
  • افراد آنلاین : 10
  • تعداد اعضا : 2927
  • آی پی امروز : 38
  • آی پی دیروز : 199
  • بازدید امروز : 119
  • باردید دیروز : 1,059
  • گوگل امروز : 0
  • گوگل دیروز : 19
  • بازدید هفته : 4,915
  • بازدید ماه : 32,813
  • بازدید سال : 248,192
  • بازدید کلی : 8,426,886
  • کدهای اختصاصی