240 likes | 465 Views
توابع در C++ قسمت اول. اصول كامپيوتر 1. آشنايي. تقسيم و حل ساخت يك برنامه با استفاده از قطعات كوچكتر مستقل هر بخش، وظيفه خاصي دارد و به دليل كوچك بودن ،مديريت آن آسانتر است. اجزا برنامه در C++. هر برنامه : تركيبي از توابع موجود در كتابخانه C++ و توابع جديد است.
E N D
توابع در C++ قسمت اول اصول كامپيوتر 1
آشنايي • تقسيم و حل • ساخت يك برنامه با استفاده از قطعات كوچكتر مستقل • هر بخش، وظيفه خاصي دارد و به دليل كوچك بودن ،مديريت آن آسانتر است
اجزا برنامه در C++ • هر برنامه : • تركيبي از توابع موجود در كتابخانه C++ و توابع جديد است. • كتابخانه استاندارد C++ مجموعه اي غني از توابع مفيد و كاربردي است • با فراخواني تابع، از توابع استفاده مي كنيم • هنگام فراخواني تابع، نام تابع وبرخي از اطلاعات مورد نياز آن را ذكر مي كنيم • فراخواني تابع مانند كار رييس و كارگر است: رييس(تابع فراخوني كننده )از كارگر (تابع فراخواني شده) مي خواهد كه كاري را انجام داده و برگردد • كد تابع يكبار نوشته مي شود: • دستورات يك تابع از توابع ديگر جدا و مخفي ست. • مثال: (رييس و كارگر): رييس لازم نيست بداند كه كارگر كار مورد نظر را چگونه انجام مي دهد. او تنها به انجام شدن كار اهميت مي دهد.
توابع كتابخانه اي رياضي در C++ • توابع عمومي رياضي را پياده سازي مي كنند • با الحاق <cmath>به برنامه مي توان از آنها استفاده كرد • فرخواني اين توابع به شكل زير است: functionName (argument) • مثال cout << sqrt( 900.0 ); • اين دستور تابع sqrt (ريشه دوم ) را فراخواني مي كند. دستور بالا، عدد 30 را چاپ مي كند • همانند بقيه توابع مشابه در كتابخانه رياضي، اين تابع يك آرگومان از نوع double مي گيرد و يك نتيجه از همان نوع توليد مي كند.
توابع كتابخانه اي رياضي در C++ • آرگومان توابع مي تواند يكي از انواع زير باشد • ثابت sqrt( 4 ); • متغير sqrt( x ); • عبارت sqrt( sqrt( x ) ) ; sqrt( 3 - 6x );
توابع • با استفاده از توابع: • برنامه نويس مي تواند برنامه خود را به چندين بخش تقسيم كند • هر بخش را يك پيمانه (Module) مي گويند • تقسيم برنامه به چند پيمانه را Modularization مي گويند • متغير هاي محلي • تنها در تابعي كه تعريف شده اند، شناخته مي شوند • پارامترهاي تابع • دسته اي از متغيرهاي محلي هستند كه براي انتقال داده از خارج به داخل تابع استفاده مي شوند
تعريف توابع • هنگام برنامه نويسي، توابعي تعريف كنيد كه: • داده ها را بگيرند • عملياتي انجام دهند • نتيجه را برگردانند • نحوه تعريف تابع return-value-type function-name( parameter-list ){declarations and statements} • مثال: int square( int y) { return y * y; }
1 // Fig. 3.3: fig03_03.cpp 2 // Creating and using a programmer-defined function Notice how parameters and return value are declared. 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; 7 8 int square( int ); // function prototype 9 10 int main() 11 { 12 for ( int x = 1; x <= 10; x++ ) 13 cout << square( x ) << " "; 14 15 cout << endl; 16 return 0; 17 } 18 19 // Function definition 20 int square( int y ) 21 { 22 return y * y; 23 } 1. Function prototype 2. Loop Function definition Program Output 1 4 9 16 25 36 49 64 81 100
1 // Fig. 3.4: fig03_04.cpp 2 // Finding the maximum of three integers 3 #include <iostream> 4 5 using std::cout; 6 using std::cin; 7 using std::endl; 8 9 int maximum( int, int, int ); // function prototype 10 11 int main() 12 { 13 int a, b, c; 14 15 cout << "Enter three integers: "; 16 cin >> a >> b >> c; 17 18 // a, b and c below are arguments to 19 // the maximum function call 20 cout << "Maximum is: " << maximum( a, b, c ) << endl; 1. Function prototype (3 parameters) 2. Input values 2.1 Call function
21 22 return 0; 23 } 24 25 // Function maximum definition 26 // x, y and z below are parameters to 27 // the maximum function definition 28 int maximum( int x, int y, int z ) 29 { 30 int max = x; 31 32 if ( y > max ) 33 max = y; 34 35 if ( z > max ) 36 max = z; 37 38 return max; 39 } Function definition Program Output Enter three integers: 22 85 17 Maximum is: 85 Enter three integers: 92 35 14 Maximum is: 92 Enter three integers: 45 19 98 Maximum is: 98
الگوي توابع • الگوي تابع از قسمتهاي زير تشكيل يافته است • نام تابع • پارامترها • داده هايي كه تابع بعنوان ورودي دريافت مي كند • نوع نتيجه برگشتي • بيانگر نوع داده برگشتي به فراخواننده است. )پيش فرض int ) • voidنوع برگشتي void بدين معني است كه تابع هيچ چيزي بر نمي گرداند • اگر تابع فراخواننده پيش از تابع فراخواني شده ، نوشته شده باشد، لازم است الگوي تابع پيش از استفاده از آن اعلام شود • مثال: int maximum( int, int, int ); • سه عدد صحيح مي گيرد • يك عدد صحيح برمي گرداند
فايلهاي Header • Header files • حاوي الگوي توابع كتابخانه اي هستند • <cstdlib> , <cmath>, etc. • با دستور #include <filename>به برنامه اضافه مي شوند • مثال: #include <cmath> • فايلهاي Header خصوصي • برنامه نويس مي تواند فايلهاي Headerمورد نياز خود را تعريف كند و الگوي توابع خاصي را در آنها قرار دهد • با اين نام و پسوند ذخيره مي شوند: filename.h • با استفاده از دستور زير به برنامه اضافه مي شوند: #include "filename.h"
توليد اعداد تصادفي • تابع rand i = rand(); • <cstdlib> • عدد شبه تصادفي بين صفر تا RAND_MAXتوليد مي كند . • اين ثابت معمولا برابر 32767 است • اعداد شبه تصادفي ، دنباله اي از اعداد تصادفي هستند كه تحت فرمول ويژه اي توليد مي شوند • در هربار اجراي برنامه، اين دنباله تكرار مي شودs • تابع srand • نقطه شروع اين دنباله را تعيين مي كند srand( seed ); srand( time( 0 ) ); //must include <ctime> • time( 0 ) • زمان كامپايل شدن برنامه را بر مي گرداند • استفاده از اين تابع سبب مي شود پس از هر بار كامپايل برنامه، دنباله متفاوتي توليد شود
توليد اعداد تصادفي • تغيير دامنه اعداد • با استفاده از عملگر محاسبه باقيمانده مي توان دنباله توليد اعداد تصادفي را به بازه خاصي محدود كرد • X =rand() % 100 براي توليد اعداد از 0 تا 99 • i = rand() % 6 + 1; • توليد اعداد تصادفي از 1 تا 6
1 // Fig. 3.7: fig03_07.cpp 2 // Shifted, scaled integers produced by 1 + rand() % 6 Notice rand() % 6 . This returns a number between 0and 5 (scaling). Add 1 to get a number between 1and6. 3 #include <iostream> Executing the program again gives the same "random" dice rolls. 4 5 using std::cout; 6 using std::endl; 7 8 #include <iomanip> 9 10 using std::setw; 11 12 #include <cstdlib> 13 14 int main() 15 { 16 for ( int i = 1; i <= 20; i++ ) { 17 cout << setw( 10 ) << ( 1 + rand() % 6 ); 18 19 if ( i % 5 == 0 ) 20 cout << endl; 21 } 22 23 return 0; 24 } 1. Define loop Output random number Program Output 5 5 3 5 5 2 4 2 5 5 5 3 2 2 1 5 1 4 6 4
1 // Fig. 3.9: fig03_09.cpp 2 // Randomizing die-rolling program 3 #include <iostream> 4 5 using std::cout; 6 using std::cin; 7 using std::endl; 8 9 #include <iomanip> 10 11 using std::setw; 12 13 #include <cstdlib> 14 15 int main() 16 { 17 unsigned seed; 18 19 cout << "Enter seed: "; 20 cin >> seed; 21 srand( seed ); 22 23 for ( int i = 1; i <= 10; i++ ) { 24 cout << setw( 10 ) << 1 + rand() % 6; 25 26 if ( i % 5 == 0 ) 27 cout << endl; 28 } 29 30 return 0; 31 } 1. Initialize seed 2. Input value for seed 2.1 Use srand to change random sequence 2.2 Define Loop 3. Generate and output random numbers
Enter seed: 67 1 6 5 1 4 5 6 3 1 2 Enter seed: 432 4 2 6 4 3 2 5 1 4 4 Enter seed: 67 1 6 5 1 4 5 6 3 1 2 Notice how the die rolls change with the seed. Program Output
مثال : بازي شانسي • نوع داده شمارشي: مجموعه اي از اعداد صحيح كه با اسم تعريف مي شوند enum typeName {constant1, constant2…}; • ثابتها از 0 شروع شده و يكي يكي اضافه مي شوند. • اسم ثابتها منحصر بفرد بايد باشد • مثال: enum Status {CONTINUE, WON, LOST}; • استفاده از نوع داده شمارشي: Status enumVar; // create variable enumVar = WON; // set equal to WON enumVar = 1; // ERROR
مثال : بازي شانسي • ثابت هاي شمارشي را مي توان هنگام تعريف مقدار دهي كرد: enum Months { JAN = 1, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC}; • Starts at 1, increments by 1 • قاعده بازي: • دو تاس را با هم بريزيد: • مجموع 7 يا 11 نشانگر برنده شدن بازيگر است • اگر در دور اول 2 ، 3 يا 12 بيايد، بازيگر بازنده است • 4, 5, 6, 8, 9, 10 • عدد بدست آمده امتياز بازيگر است • بازيگر بايد آنقدر تاس بريزد تا : • مجموعي برابر امتياز كسب شده در مرحله اول بدست آورد كه در اين صورت برنده است • مجموع بدست آمده 7 باشد كه دراين صورت بازنده است
1 // Fig. 3.10: fig03_10.cpp 2 // Craps 3 #include <iostream> 4 5 using std::cout; 6 using std::endl; Notice how the enum is defined 7 8 #include <cstdlib> 9 10 #include <ctime> 11 12 using std::time; 13 14 int rollDice( void ); // function prototype 15 16 int main() 17 { 18 enum Status { CONTINUE, WON, LOST }; 19 int sum, myPoint; 20 Status gameStatus; 21 22 srand( time( 0 ) ); 23 sum = rollDice(); // first roll of the dice 24 25 switch ( sum ) { 26 case 7: 27 case 11: // win on first roll 28 gameStatus = WON; 29 break; 30 case 2: 31 case 3: 32 case 12: // lose on first roll 33 gameStatus = LOST; 34 break; 1. rollDice prototype 1.1 Initialize variables and enum 1.2 Seed srand 2. Define switch statement for win/loss/continue
35 default: // remember point 36 gameStatus = CONTINUE; 37 myPoint = sum; 38 cout << "Point is " << myPoint << endl; 39 break; // optional 40 } 41 42 while ( gameStatus == CONTINUE ) { // keep rolling 43 sum = rollDice(); 44 45 if ( sum == myPoint ) // win by making point 46 gameStatus = WON; 47 else 48 if ( sum == 7 ) // lose by rolling 7 49 gameStatus = LOST; 50 } 51 52 if ( gameStatus == WON ) 53 cout << "Player wins" << endl; 54 else 55 cout << "Player loses" << endl; 56 57 return 0; 58 } 59 2.1 Define loop to continue playing 2.2 Print win/loss
Player rolled 6 + 5 = 11 Player wins 60 int rollDice( void ) 61 { Player rolled 6 + 5 = 11 Player wins Player rolled 4 + 6 = 10 Point is 10 Player rolled 2 + 4 = 6 Player rolled 6 + 5 = 11 Player rolled 3 + 3 = 6 Player rolled 6 + 4 = 10 Player wins 62 int die1, die2, workSum; 63 64 die1 = 1 + rand() % 6; Player rolled 1 + 3 = 4 Point is 4 Player rolled 1 + 4 = 5 Player rolled 5 + 4 = 9 Player rolled 4 + 6 = 10 Player rolled 6 + 3 = 9 Player rolled 1 + 2 = 3 Player rolled 5 + 2 = 7 Player loses 65 die2 = 1 + rand() % 6; 66 workSum = die1 + die2; 67 cout << "Player rolled " << die1 << " + " << die2 68 << " = " << workSum << endl; 69 70 return workSum; 71 } 3. Define rollDice function Program Output
پروژه شماره 1- بازي حدس اعداد • برنامه اي بنويسيد كه عددي 5 رقمي به صورت تصادفي توليد كند و از كاربر بخواهد اين عدد را حدس بزند. • عدد توليد شده را عدد مخفي و عددي را كه كاربر وارد مي كند عدد كاربر مي ناميم • برنامه بايد عدد كاربر را با عدد مخفي مقايسه كند و در صورت مساوي نبودن اين دو عدد، دو كميت زير را محاسبه و چاپ كند: • تعداد ارقام مشابه عدد مخفي و عدد كاربر • تعداد ارقام مشابه عدد مخفي و عدد كاربر كه ارزش مكاني آنها نيز مشابه باشد • مثال : عدد مخفي 11386 و عدد كاربر 18755 • تعداد ارقام مشابه: 2 ( 1و 8 در هر دو عدد موجودند) • تعداد ارقام مشابه و هم ارزش : 1 ( رقم 1 در هر دو عدد در مكان پنجم است) • آيا مي توانيد الگوريتمي ارائه دهيد كه با تعداد قدمهاي متناهي، هر عدد ممكني را حدس بزند؟ • حداقل و حداكثر تعداد قدمهاي لازم براي حدس يك عدد چقدر است؟ • پروژه انفرادي و مهلت انجام آن تا دو هفته آينده است. • از توابع مناسب براي پياده سازي قسمتهاي مختلف اين برنامه استفاده كنيد