جزوات رنگی و تایپ شده معماری کامپیوتر
موریس مانو دانشگاه شریف پترسون دانشگاه آزاد دانشگاه شهید کارشناسی ارشد شتی برای استخدامی پیام نور دانشگاه علمی کاربردی آزاد برای
:
• • • • • • ; ; (=;<=;++)
{>>; (==) ;
}
:
:
;
; (=; ;++) {>>; (==‘’) ;
}
<<; :
: : : :
; ; : ( ) < > ( )

ساده يا ترکيبي استفاده مي گردد. شکل کلي اين دستور العمل بصورت زير مي باشد.
تفاوت دستورهاي while و for
دستورالعمل for زماني استفاده مي شود که تعداد دفعات تکرار از قبل مشخص و معين باشد. در صورتيکه تعداد دفعات تکرار مشخص نباشد بايستي از دستورالعمل while استفاده نمود. دقت کنيد با پياده سازي مکانيزم هاي خاصي مي توان بدون توجه به دفعات تکرار از هر دو دستور بصورت مشابه استفاده کرد.
مثال:
int x=0 while(x<5) cout << x ++<< endl;با اجراي قطعه برنامه فوق مقادير فوق نمايش داده مي شود :
• نکته: همانند دستور for اگر داخل بدنه دستور while فقط يک جمله باشد مي توان } و { را حذف کرد.
مثال: نمايش اعداد 0 تا 100:
تمرين: برنامه زير را تفسير کنيد:
مثال: برنامة فوق n مقدار از نوع اعشاري را گرفته ميانگين آن ها را محاسبه و در متغير avg قرار مي دهد.
دستورالعمل do while
اين دستور العمل نيز براي تکرار يک دستورالعمل ساده يا ترکيبي استفاده مي شود .
شکل کلي اين دستورالعمل بصورت روبرو مي باشد.
while و do while تفاوت دستورهاي
در دستورالعمل while ابتدا مقدار شرط ارزيابي شده اما در دستورالعمل do while ابتدا دستورالعمل اجرا شده سپس مقدار شرط ارزيابي مي گردد .بنابراين دستورالعمل do while حداقل يک بار انجام مي شود .
مثال: برنامه فوق ،ارقام 0 تا 9 را روي ده خط نمايش مي دهد.
دستورالعمل break
اين دستورالعمل باعث توقف دستورالعمل هاي تکرار) for , while ,do while( شده و کنترل به خارج از اين دستورالعمل ها منتقل مي نمايد.
چند مثال:
دستورالعمل continue
از دستورالعمل continue مي توان در جزوه معماری کامپیوتر هاي تکرار for ، while ، do while استفاده نمود. اين دستورالعمل باعث مي شود که کنترل به ابتداي دستورالعمل هاي تکرار منتقل گردد .
چند مثال:
دستورالعمل switch
همانطور که مي دانيد از دستورالعمل شرطي)if else( مي توان بصورت تودرتو استفاده نمود ولي از طرفي اگر عمق استفادة تو در تو از اين دستورالعمل زياد گردد، درك آنها مشکل مي شود . براي حل اين مشکل C++ ، دستورالعمل switch که عملاً يک دستورالعمل چند انتخابي مي باشد را ارائه نموده است .
شکل کلي دستور العمل Switch:
مثال:
تابع cin.get() : اين تابع يک کرکتر را از صفحه کليد مي گيرد. براي استفاده از اين تابع در ابتداي برنامه بايستي داشته باشيم:
> #include <iostream مثال: قطعه برنامه ذيل يک کرکتر را از صفحه کليد گرفته و نمايش مي دهد.
char x; x = cin.get( ); cout << x ;مثال: برنامة ذيل يک سطر متن انگليسي که به CTRL Z ختم مي شود را گرفته دقيقاً نمايش مي دهد.
EOF بـــه معنـــي End of File مـــي باشـــد کـــه درiostream.h تعريف شده و مقدار آن برابر با 1- مي باشـد.
مقدار آن در سيستم عامل DOS عبارتست از ctrl z .
> include <iostream# int main( )
{ char x;
while((x = cin.get()) !=EOF) cout << x ; return 0 ;
}
مثال: در قطعه برنامه ذيل ازتابع cin.get() و دستور switch استفاده شده است.
مثال: برنامة ذيل يک سطر متن جزوه معماری کامپیوتر را گرفته کرکترهاي خالي) blank( آن را حذف نموده و نمايش مي دهد.
using namespace std;
#include <iostream >
int main( )
{ char next; while((next = cin.get( ) ) !=EOF)
if(next != ) cout << next ; return 0 ;
} static_cast عملگر
از اين عملگر براي تبديل موقت يک نوع data به نوع ديگر استفاده مي شود. اين عملگر يک عملگر يکتائي مي باشد.
مثال1:
int x = 25 ; float y ; y = static_cast < float >(x) ;
مقدار x موقتاً بصورت اعشاري در مي آيد و در نتيجه مقدار y برابر با 25.0 مي شود. بايستي توجه داشت که نوع متغير x عوض نمي شود بلکه موقتاً مقدار آن بصورت اعشاري در آمده است.
مثال0:
float x = 14.75 ; cout << static_cast < int >(x) << endl; cout << x ; .ابتدا جزوه معماری کامپیوتر 11 نمايش داده مي شود و سپس مقدار 11381 نمايش داده مي شود
جدول اولويت عملگرها
تمرينات:
1. برنامه اي که يک سکه 100 ريالي را به سکه هاي 0و1 و10و00 و 10 ريالي خرد کند.
0. برنامه اي که خروجي زير را چاپ کند:
3. برنامه اي که حاصل عبارت زير را بدست اورد:
فصل چهارم: اعداد تصادفی
توليد اعداد تصادفي تعريف نوع داده ) typedef (
داده هاي از نوع شمارشي
اعداد تصادفي
مقادير تصادفي يا شانسي در اکثر برنامه هاي کاربردي در زمينه شبيه سازي و بازي هاي کامپيوتري نقش مهمي را ايفا مي نمايند. براي ايجاد يک عدد تصادفي صحيح بين 0 و 30868 بايستي از تابع ()rand استفاده نمائيم.
مثال: برنامه زير 10 عدد تصادفي بين 0 و 32767 را ايجاد مي نمايد.
using namespace std;
#include <iostream >
int main( )
{ for(int j=1; j<=10; ++j) cout << rand( ) << n ;
return 0 ;
}
اگر برنامة فوق را چندبار اجرا نمائيم جواب يکساني را از جزوه معماری کامپیوتر مي گيريم. براي تصادفي کردن اعداد مي بايستي از تابع srand( ) استفاده نمائيم. اين تابع به يک آرگومان صحيح از نوع unsigned نياز دارد. به اين آرگومان seed گفته مي شود.
مثال: برنامه زير 10 عدد تصادفي بين 0 و 32767 را ايجاد مي نمايد. ) srand( ) (
using namespace std;
#include <iostream >
int main( )
{ unsigned seed; cout << “Enter seed value : ” ;
cin >> seed ; srand(seed); for(int j=1; j<=10; ++j) cout << rand( ) << n ;
return 0 ;
}
مثال: برنامه زير نتيجه پرتاب دو تاس را نمايش مي دهد.
using namespace std; #include <iostream > int main( )
{ unsigned seed, d1, d2; cout << “Enter seed: ” ; cin >> seed ; srand(seed) ; d1= 1+rand( )% 6 ; d2= 1+rand( )% 6 ;
cout << d1 << << d2 ; return 0 ;
}
مثال: برنامه زير 10 اعداد شانسي بين 0 و 1 را نمايش مي دهد.
using namespace std; #include <stdlib.h> #include < iostream > int main( )
{
unsigned seed ; cout << “Enter seed: ” ; cin >> seed ; srand(seed) ; for(int i=1; i<=10; ++i) cout << rand( ) / 32768.0 << endl ; return 0 ; } )typedef (تعريف نوع داده :مي توان براي تعريف نوع داده هاي جديد که معادل نوع داده هاي موجود باشد استفاده نمود. شکل کلي عبارتست از typedef از
typedef type newtype;
اسم جديد نشان دهنده نوع داده موجود مثال:
typedef int integer;
حال مي توان y و x را بصورت روبرو تعريف نمود: integer x,y; داده هاي از نوع شمارشي
بمنظور معرفي داده هاي از نوع شمارشي از کلمه enum استفاده مي گردد.
مثال: 4 3 2 1 0
color يک نوع داده شمارشي مي باشد.
چند مثال:
emum status {married, devorced, vidow, single}; status a ; a= single ;
enum days {sat, sun, mon, tue, wed, thr, fri}; :نکته
بايستي در نظر داشت که داده هاي از نوع شمارشي در عمليات ورودي و خروجي شرکت نمي نمايند. به عبارت ديگر مقادير داده هاي از نوع شمارشي بايستي در برنامه تعيين نمود. دستورالعل هاي ورودي و خروجي مانند cin و cout در مورد داده هاي شمارشي نمي توان استفاده نمود.
فصل پنجم: آرايه ها
آرايه يک بعدي
آرايه دو بعدي ) ماتريس ها( آرايه يک بعدي:
آرايه يک فضاي پيوسته از حافظه اصلي کامپيوتر مي باشد که مي تواند چندين مقدا را در خود جاي دهد.
آرايه ها در برنامه نويسي در مواردي کاربرد دارند که بخواهيم اطلاعات و داده ها را در طول اجراي برنامه حفظ نمائيم.
مثال:
ايجاد آرايه يک بعدي از نوع 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 عدد جزوه معماری کامپیوتر را گرفته بروش حبابي) Bubble sort( بصورت صعودي مرتب مي نمايد.
using namespace std; #include <conio.h>
#include <iostream>
int main ( )
{ const int n=10; float x[n] , temp; int i,j ;
for(i=0; i<n; ++i) cin >> x[i];
for(i=n-1; i>0; i–)
for(j=0 ; j<i; j++)
if(x[j] > x[j+1])
{
temp = x[j] ; x[j] = x[j+1]; x[j+1] = temp ;
}
for(i=0; i< n ; i++) cout << x[i] << endl;
getch(); return 0 ; }
آرايه هاي دوبعدي )ماتريس ها( ماتريس ها بوسیله آرايه هاي دوبعدي در كامپیوترنمايش داده می شوند .
int a[3][4];
تخصیص مقادير اولیه به عناصر آرايه:
int a[3][4]={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12} } ;
نکته1:
int a[3][4]= { {1}, {2,3} , {4,5,6} } ;
نکته0:
int a[3][4]= {1, 2, 3, 4,5 } ;
نکته3:
در يک آراية دوانديسی، هر سطر، در حقیقت آرايه اي يک انديسی است. در اعلان آرايه هاي دوانديسی ذكر تعداد ستون ها الزامی است.
int a[ ][4]={1,2,3,4,5};
71
مثال: برنامه زير يک ماتريس 3*4 را گرفته مجموع عناصر آن را مشخص نموده و نمايش مي دهد.
using namespace std; #include <iostream > #include <conio.h>
int main( )
{
float x[3][4], total= 0.0;
int i, j ;
// generate matrix x. for(i=0; i<3; ++i) for (j=0; j<4; j++) cin >> x[ i ][ j ];
// calculate the sum of elements. for(i=0; i<3; ++i) for(j=0; j<4; j++) total + = x [ i ][ j ];
cout << “total = ” << total << endl; return 0 ; }
تمرين:
فصل ششم: توابع
تعريف تابع تابع بازگشتي توابع درون خطي
انتقال پارامترها از طريق ارجاع کلاس هاي حافظه ) storage classes ( سربارگذاري توابع
تعريف توابع
استفاده از توابع در برنامه ها به برنامه نويس اين جزوه معماری کامپیوتر را مي دهد که بتواند برنامه هاي خود را به صورت قطعه قطعه برنامه بنويسد. تا کنون کليه برنامه هائي که نوشته ايم فقط از تابع main( ) استفاده نموده ايم. شکل كلی توابع بصورت زير مي باشند:
نام تابع
نوع مقدار برگشتی
return-value-type function-name (parameter-list)
{
لیست پارامتر ها جهت انتقال اطلاعات از تابع احضار كننده به تابع فراخوانده شده declaration and statements
}
تعريف اعلان هاي تابع و دستورالعملهاي اجرائی

دانلود رایگان خلاصه کتاب معماری کامپیوتر pdf
مثال: تابع زير يک حرف کوچک را به بزرگ تبديل مي نمايد.
برنامه کامل که از تابع قبل جهت تبديل يک حرف کوچک به بزرگ استفاده مي نمايد.
تابع maximum دو مقدار صحيح را گرفته بزرگ ترين آن ها را برمي گرداند.
int maximum(int x, int y)
{ int z ; z=(x >= y)? x : y;
return z;
{برنامه کامل که از تابع maximum جهت يافتن ماکزيمم دو مقدار صحيح استفاده مي نمايد.
نکته: اسامي پارامترها و آرگومان هاي يک تابع مي توانند هم نام باشند.
جزوه معماری کامپیوتر دانلود رایگان خلاصه کتاب pdf
برنامه زير يک مقدار مثبت را گرفته فاکتوريل آن را محاسبه نموده نمايش مي دهد.
نکته: وقتي در تابعي، تابع ديگر احضار مي گردد بايستي تعريف تابع احضار شونده قبل از تعريف تابع احضار کننده در برنامه ظاهر گردد.
نکته: اگر بخواهيم در برنامه ها ابتدا تابع main ظاهر گردد بايستي prototype تابع يعني پيش نمونة تابع که شامل نام تابع ،نوع مقدار برگشتي تابع، تعداد پارامترهائي را که تابع انتظار دريافت آن را دارد و انواع پارامترها و ترتيب قرارگرفتن اين پارامترها را به اطلاع کامپايلر برساند.
مثال:
using namespace std; #include <iostream >
#include <conio.h> long int factorial(int); // function prototype
int main( )
{ int n; cout << “Enter a positive integer” << endl;
cin >> n; cout << factorial(n) << endl;
return 0 ;
}
long int factorial(int n)
{ long int prod = 1;
if(n>1) for (int i=2; i<=n; ++i)
prod *= i; return(prod);
{نکته: در صورتي که تابع مقداري بر نگرداند نوع مقدار برگشتي تابع را 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 ;
}
انتقال پارامترها از طريق ارجاع
تاکنون وقتي تابعي را احضار مي کرديم يک کپي از مقادير آرگومان ها درپارامترهاي متناظر قرار مي گرفت . اين روش احضار بوسيله مقدار يا call by value ناميده شد. در انتقال پارامترها از طريق ارجاع در حقيقت حافظه مربوط به آرگومان ها و پارامترهاي متناظر بصورت اشتراکي مورد استفاده قرار مي گيرد. اين روش call by reference ناميده مي شود.
در اين روش پارامترهائي که از طريق call by reference عمل مي نمايند در جزوه معماری کامپیوتر نمونه تابع قبل از نام چنين پارامترهائي از & استفاده مي شود. واضح است که در تعريف تابع نيز به همين طريق عمل مي شود.
نکته: وقتي پارامتري بصورتcall by reference جزوه انتقال داده مي گردد اين بدان معني است که با تغيير مقدار اين پارامتر در تابع احضار شده مقدار آرگومان متناظر نيز تغيير مي نمايد.
مثال: برنامه زير با استفاده از fswap دو مقدار اعشاري را مبادله مي نمايد.
# include <iostream > void fswap(float & , float & );
int main( )
{ float a=5.2, b=4.3; cout << a << endl << b ; fswap( a , b) ; cout << a << endl << b ;
return 0 ;
} void fswap(float &x , float & y)
{ float t; t = x ; x = y ; y = t ;
}
)storage classes (کلاس هاي حافظه
متغيرها به دو طريق متمايز مشخص مي شوند: يکي بوسيله نوع) type( آن ها و ديگري بوسيله کلاس حافظه آن ها.
نوع متغير قبلاً اشاره شد. بعنوان مثال double ، float ، int ، . . . ولي کلاس حافظة يک متغير در مورد طول عمر و وسعت و دامنة متغير بحث مي نمايد.
بطور کلي کلاس حافظه متغيرها به چهار دستة تقسيم مي گردد :
automatic .1
static .0
external .3 register .1
automatic: متغيرهاي automatic در درون يک تابع تعريف مي شوند و در تابعي که اعلان مي شود بصورت متغيرهاي محلي براي آن تابع مي باشند. حافظه تخصيص داده شده به متغيرهاي automatic پس از اتمام اجراي تابع از بين مي رود به عبارت ديگر وسعت و دامنة متغيرهاي از نوع automatic تابعي مي باشد که متغير در آن اعلان گرديده است.
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 ;
}
بايستي توجه داشت که اگر در توابع به : ً : ً )(++ )( :
# <> (); (); ( )
{==; =; << () << ; << () << ;
;}
()
{+;}
()
{+;}
:
)(.
فهرست مطالب