جزوات رنگی و تایپ شده معماری کامپیوتر
موریس مانو دانشگاه شریف پترسون دانشگاه آزاد دانشگاه شهید کارشناسی ارشد شتی برای استخدامی پیام نور دانشگاه علمی کاربردی آزاد برای
:
• • • • • • ; ; (=;<=;++)
{>>; (==) ;
}
:
:
;
; (=; ;++) {>>; (==‘’) ;
}
<<; :
: : : :
; ; : ( ) < > ( )
:
=(<) << ++<< ;:
• : } { : :
: :
: : ) ( :
:
)( ++ ، ً :
:
() : :
> #<: ; = ( ); << ;: ً – > <# ( )
{ ;
((= ()) !=) << ; ;
}
: () : ) ( ;
#<>
( )
{ ; ((= ( ) ) !=)
(!= ) << ; ;
} :
= ; ; = < >() ;
ً ً :
= ; << < >() << ; << ; .:
:
:
: ) (
(): ;
#<>
( )
{ (=; <=; ++) << ( ) << ;
;
}
( ) : ) ( ) (
;
#<>
( )
{ ; << “: ” ;
>> ; (); (=; <=; ++) << ( ) << ;
;
}
: ; #<> ( )
{ ; << “: ” ; >> ; () ; = +( )% ; = +( )% ;
<< << << ; 0 ;
}
: ; #<> #< > ( )
{
; << “: ” ; >> ; () ; (=; <=; ++) << ( ) / << ; ; } )(:;
:
;
: ; : :
{}; ; = ;
{}; :شمارشي نمي توان استفاده نمود.
فصل پنجم: آرايه ها
آرايه يک بعدي
آرايه دو بعدي ) ماتريس ها( آرايه يک بعدي:
آرايه يک فضاي پيوسته از حافظه اصلي کامپيوتر مي باشد که مي تواند چندين مقدا را در خود جاي دهد.
آرايه ها در برنامه نويسي در مواردي کاربرد دارند که بخواهيم اطلاعات و داده ها را در طول اجراي برنامه حفظ نمائيم.
مثال:
ايجاد آرايه يک بعدي از نوع int
int x[5] ;
تخصيص مقادير اوليه به عناصر آرايه:
int x[5]= {4, 2, 5, 17, 30};
دريافت مقادير عناصر آرايه:
int x[5]; for(int i=0; i<=4; ++i) cin >> x[ i ] ; :نمايش مقادير عناصر آرايه
for (int i=0; i<5; ++i) cout << x[ i ] ;
نکته: اگر تعداد مقادير اوليه کمتر از تعداد عضوهاي آرايه باشد عضوهاي باقيمانده بطور اتوماتيک، مقدار اوليه صفر مي گيرند.
مثال:
int x[5] = {12, 5, 7};
int x[5] = {0} ;
دستور زير يک آرايه يک بعدي شش عنصري از نوع float ايجاد مي نمايد.
float x[ ] = {2.4, 6.3, -17.1, 14.2, 5.9, 16.5} ;
برنامه زير 100 عدد اعشاري را گرفته تشکيل يک آرايه مي دهد سپس مجموع عناصر آرايه را مشخص نموده نمايش مي دهد.
using namespace std;
#include <iostream >
int main( )
{ const int arrsize = 100 ; float x[ arrsize], tot = 0.0 ; for(int j=0; j<arrsize; j++)
cin >> x[ j ]; for(j=0; j<arrsize; j++)
tot += x[ j ] ; cout << tot ; return 0 ;
}
برنامه زير 20 عدد اعشاري را گرفته تشکيل يک آرايه داده سپس کوچکترين عنصر آرايه را مشخص و نمايش مي دهد.
using namespace std; #include <iostream >
#include <conio.h>
int main( )
{
float x[20], s;
int j ;
for(j=0; j<20 ; ++j) cin >> x[ j ];
s = x[0 ] ; for(j=1; j<20; ++j)
if (x[ j] <s) s = x[ j ]; cout << s << endl; return 0;
}
برنامه زير 100 عدد جزوه معماری کامپیوتر را گرفته ) ( ; #<>
#<>
( )
{ =; [n] , ; ;
(=; <; ++) >> [i];
(=-; >; –)
(=; <; ++)
([j] > [j+1])
{
= [j] ; [j] = [j+1]; [j+1] = ;
}
(=; < ; ++) << [i] << ;
(); ; }
)( [3][4];
:
[3][4]={ {}, {}, {} } ;
:
[3][4]= { {}, {} , {} } ;
:
[3][4]= {} ;
:
[ ][4]={};
: *; #<> #<>
( )
{
[3][4], = ;
;
// (=; <; ++) (=; <; ++) >> [ i ][ j ];
// (=; <; ++) (=; <; ++) + = [ i ][ j ];
<< “= ” << << ; ; }
:
: ) ( ( ) :
—(-)
{
}

: ()
{ ; =(>= )? : ;
;
{:
: : :
; #<>
#<> (); // ( )
{ ; << “” << ;
>> ; << () << ;
;
}
()
{ = ;
(>) (=; <=; ++)
*= ; ();
{: نگرداند نوع مقدار برگشتي تابع را void اعلان مي کنيم. و در صورتيکه تابع مقداري را دريافت نکند بجاي parameter- list از void يا ) ( استفاده مي گردد
مثال:
احضار بوسيله مقدار ) Call By Value (
در اين نوع احضار تابع حافظه هاي مورد استفاده آرگومان ها و پارامترها از هم متمايزند و هرگونه تغيير در پارامترها باعـــث تغيـــر در آرگومان هاي متناظر نمي گردد.
تابع بازگشتي) recursive functions( توابع بازگشتي يا recursive توابعي هستند که وقتي احضار شوند باعث مي شوند که خود را احضار نمايند. مثال1: نحوه محاسبه فاکتوريل از طريق تابع بازگشتي
n != 1*2*3*…*(n-1) *n f(n) = n
اگر 0n= 1 f(n) = در غير اينصورت (1-n *f(n
n!= 1* 2* 3* … *(n-2) *(n-1) *n
n!=(n-1)! *n
پياده سازي تابع بازگشتي محاسبه ي فاکتوريل:
# include <iostream > long int factorial(int) ; int main( )
{
int n ; cout << n= ; cin >> n ;
cout << endl << factorial = << factorial(n) << endl; return 0 ;
}
long int factorial(int n)
{
if(n<=1)
return(1);
else return(n *factorical(n-)1 ) ;
}
مثال0: نحوه محاسبهn امين مقدار دنباله فيبوناچي از طريق تابع جزوه معماری کامپیوتر … ,43 , 12 ,31 ,8 ,5 ,3 ,2 ,1 ,1 , 0
برنامه زير n امين مقدار دنبالة فيبوناچي) fibonacci( را مشخص و نمايش مي دهد.
# include <iostream > long int fib(long int); // forward declaration int main( )
{
long int r ; int n ; cout << Enter an integer value << endl ; cin >> n ; r = fib(n) ; cout << r << endl ; return 0 ;
}
long int fib(long int n)
{
if (n==0) return 0; if(n = = 1 || n= = 2) return 1 ;
else
return(fib(n-1) + fib(n-)2 ) ;
{مثال3: برنامه زير يک خط متن انگليسي را گرفته آن را وارون نموده نمايش مي دهد.
# include <iostream > void reverse(void) ; // forward declaration int main( )
{
reverse( ) ; return 0 ;
}
void reverse(void)
// read a line of characters and reverse it
{
char c ;
if(( c=cin.get( )) != n )
reverse( );
cout << c ; return ;
{نکته: استفاده از آرايه ها بعنوان پارامتر تابع مجاز است .
مثال: در برنامه زير تابع modify آرايه a را بعنوان پارامتر مي گيرد.
# include <iostream > void modify(int [ ] ); // forward declaration int main( )
{ int a[5] ; for(int j=0; j<=4; ++j) a[ j ] = j+1 ; modify(a) ; for(int j=0; j<5; ++j) cout << a[ j ] << endl ; return 0 ;
}
void modify(int a[ ]) // function definition
{
for(int j=0; j<5; ++j) a[ j ] += 2 ; for(int j=0; j<5; ++j) cout << a[ j ] << endl ; return ;
{نکته: در اين مثال از فراخواني با مقدار استفاده نشده است. براي همين تغييرات انجام شده در تابع modify() باعث تغيير در مقادير ارايه در تابع اصلي يا main() شده است. اين مبحث، تحت عنوان فراخواني از طريق ارجاع در ادامه توضيح داده مي شود.
مثال: در صورتيکه آرايه بيش از يک بعد داشته باشد بعدهاي دوم به بعد بايستي در تعريف تابع و پيش نمونه تابع ذکر گردد .
توابع درون خطي) inline(
کلمه inline بدين معني است که به کامپايلر دستور مي دهد که يک کپي از دستورالعمل هاي تابع در همان جا )در زمان مقتضي( توليد نمايد تا از احضار تابع ممانعت بعمل آورد.
اشکال توابع inline
بجاي داشتن تنها يک کپي از تابع ، چند کپي از دستورالعمل هاي تابع در برنامه اضافه مي شود که باعث بزرگ شدن اندازه يا طول برنامه مي شود. بنابراين از inline براي توابع کوچک استفاده مي گردد .
مثالي از توابع درون خطي:
#include <iostream > inline float cube(const float s) {return s*s*s; }
int main( )
{ float side ; cin >> side ; cout << side << cube(side) << endl ;
return 0 ;
}
انتقال پارامترها از طريق ارجاع
تاکنون وقتي تابعي را احضار مي کرديم يک کپي از مقادير آرگومان ها درپارامترهاي متناظر قرار مي & : : # <> (& , & );
( )
{ ==; << << << ; ( ) ; << << << ;
;
} (&& )
{ ; = ; = ; = ;
}
)(: ) ( ً :
: در آن اعلان گرديده است.
Static: متغيرهاي static نيز در درون توابع تعريف مي شوند و از نظر وسعت و دامنه شبيه متغيرهاي automatic هستند ولي در خاتمة اجراي تابع، حافظه وابسته به اين نوع متغيرهـــا از بين نمي رود بلکه براي فراخواني بعدي تابع باقي مي ماند.
بايستي توجه داشت که اگر در توابع به متغيرهاي از نوع static مقدار اوليه تخصيص ندهيم مقدار صفر بصورت اتوماتيک براي آن ها در نظر گرفته مي شود.
External: متغيرهاي از نوع external متغيرهائي هستند که در بيرون از توابع اعلان مي شوند و وسعت و دامنه فعاليت آن ها کليه توابعي مي باشد که در زير دستور اعلان متغير قرار دارد.
مثال:
# include <iostream > int w; // external variable
functa(int x, int y)
{ cout << w ; w = x + y ; cout << endl << w << enld;
return x%y ;
}
int main( )
{ int a, b, c, d; cin >> a >> b ; c=functa(a, b) ; d=functa(w, b+1); cout << endl << c << endl << d << endl << w ;
return 0 ;
}
بايستي توجه داشت که اگر در توابع به متغيرهاي از نوع external مقدار اوليه تخصيص ندهيم مقدار صفر بصورت اتوماتيک براي آن ها در نظر گرفته مي شود.
Register: وقتي متغيري از نوع register اعلان مي شود از کامپيوتر عملاً درخواست مي شود که به جاي حافظه از يکي از رجيسترهاي موجود استفاده نمايد .
کاربرد کلاس register: معمولاً از نوع رجيستر براي شاخص هاي جزوه معماری کامپیوتر تکرار و يا انديس هاي آرايه ها استفاده مي شود. بايستي توجه داشت که متغيرهاي از نوع رجيستر قابل استفاده در دستور cin نمي باشند.
)function overloading (سربارگذاري توابع
در C++ اين امکان وجود دارد که دريک برنامه بتوانيم از چند توابع هم نام استفاده نمائيم مشروط بر اين که پارامترهاي اين توابع متفاوت باشند. )از نظر تعداد پارامتر و يا نوع پارامترها و ترتيب آن ها( مثال:
# include <iostream > float (); (); ( )
{==; =; << () << ; << () << ;
;}
()
{+;}
()
{+;}
:
)(.
فهرست مطالب