تالار گفتمان نبض فردا  

بازگشت   تالار گفتمان نبض فردا > کامپیوتر و اینترنت > نرم افزار > آموزش ها و مقالات و برنامه نویسی

اطلاع رسانی

ارسال موضوع جدید  پاسخ
 
ابزارهای موضوع نحوه نمایش
قدیمی 06-07-2012   #11
Mino
عضو تالار
 

تاریخ عضویت: Feb 2012
محل سکونت: خوزستان، اهواز،
نوشته ها: 802
تشکرهای ایشان: 22,059
33,363بار در12,628پست از ایشان تشكر شده است

صندوق مدال ها

پیش فرض

عملگرها
عملگرها نمادهايي هستند كه براي انجام اعمال خاصي مورداستفاده قرارميگيرند.
عملگرها در زبان C از تنوع زيادي برخوردارند . در C چهار دسته عملگر به نامهاي
( محاسباتي ، رابطه اي ، منطقي و دستكاري بيت ها ) وجود دارند كه آنها را بررسي
مي كنيم .

عملگرهاي محاسباتي
عملگرهاي محاسباتي كه در C مورد استفاده قرار مي گيرند در جدول (1) فهرست
شده اند .
رديف | عملگر | نام | مثال |
1 | - | تفريق و منهاي يكاني | |-xx/x-y
2 | + | جمع | | x+y
3 | * | ضرب | | x*y
4 | / | تقسيم | | x/y
5 | % | باقيمانده تقسيم | | x%y
6 | - - | كاهش يك واحد * | - -xيا xا - |-
7 | ++ + | افزايش يك واحد * | x+ + يا | + +xا
* decrement ** increment

جدول (1) . عملگرهاي محاسباتي

عملگرهاي رديف 1تا 4ا در جدول (1) تقريبا" در همه زبانهاي برنامه سازي وجود
دارند. عملگر % كه در بقيه زبانها با علامت ديگري ( مثلا" در بيسيك به صورت MOD)
وجود دارد باقيمانده تقسيم دو عدد را محاسبه مي كند : x= 13;
y= 5;
z= x%y;

اگر سه دستور فوق را توسط ماشين اجرا كنيم مقدار3 كه باقيمانده تقسيم 13 بر 5
است در z قرار مي گيرد .
عملگر كاهش ، يك واحد از عملوند مربوط كم مي كند . x= 10;
- - x;

دستور x - - از x يك واحد كم مي كند و نتيجه را در x قرار مي دهد كه معادل
دستور 1 + َx = x-1 است .
عملگر افزايش ، يك واحد به عملوند مربوطه اضافه مي كند : x= 40;
++x;

دستور ++x معادل دستور x = + 1 است كه موجب افزودن يك واحد به x مي شود .
عملگرهاي افزايش و كاهش يك واحد را مي توان بعداز عملوند مربوطه نيز به كار
برد مثل : x + + و - - x .
اگر در يك عبارت از عملگرهاي افزايش و كاهش يك واحد ، استفاده كنيم به كار
بردن اين عملگرها در قبل و بعد از عملوند مربوطه ، با يكديگر متفاوت است . بدين
معني كه اگر اين عملگرها قبل از عملوند باشند مقدار فعلي عملوند مورد استفاده
قرار گرفته و سپس عملگرها بر روي آن عمل ميكنند، ولي اگر بعد از عملوند مربوطه
باشند پس از انجام عمل افزايش و كاهش يك واحد به آنها مقادير جديد ، در عبارت
مورد استفاده قرار مي گيرند. استفاده ازعملگرهاي افزايش و كاهش يك واحد ، سرعت
محاسباتي را بالا مي برد .
اگر در يك عبارت از چند عملگر محاسباتي استفاده شود ، مساله تقدم عملگرها
مطرح مي شود . ( جدول (2) ) .
بالاترين تقدم - - | + + |
تفريق يكاني - | | * / % |
|
پايين ترين تقدم - | +
جدول (2) . تقدم عملگرهاي محاسباتي

همان طور كه در جدول (2) مشاهده مي شود ، عملگرهاي افزايش و كاهش يك واحد
داراي بالاترين تقدم و عملگرهاي جمع و تفريق داراي كمترين تقدم هستند و منهاي
يكاني ، داراي دومين تقدم است . عملگرهايي كه در يك سطر آمده اند ، مثل - و +
بدين معني است كه داراي تقدم مكاني نسبت به يكديگر هستند. در اين صورت هر كدام
از غملگرها كه اول ظاهر شود ، زودتر انجام خواهد شد .

عملگرهاي رابطه اي
عملگرهاي رابطه اي براي تشخيص ارتباط بين عملوندها يا مقايسه آنها مورد
استفاده قرار مي گيرند ( جدول (3) ) .
عملگر | نام | مثال |
> | بزرگتر | y >x | >
= >|> بزرگتر مساوي | =y >x | >
< | كوچكتر | y
< |> = <|< كوچكتر مساوي | =y
< |> == | = مساوي بودن | | x=x==y
!= | ! نامساوي | | x=x!=y
جدول (3) . عملگرهاي رابطه اي

نكته قابل ذك درمورد عملگرهاي رابطه اي اين است كه عملگر== براي تشخيص مساوي
بودن دو عبارت مورد استفاده قرار مي گيرد. اين عملگر با عملگر= كه براي انتساب
يك عبارت به يك متغير استفاده مي شود متفاوت است .

عملگرهاي منطقي
عملگرهاي منطقي ( جدول (4) ) بر روي عملوندهاي منطقي عمل ميكنند. عملوندهاي
منطقي داراي دو ارزش درستي و نادرستي هستند .
عملگر | نام | مثال |
&& | & و(AND) z || x
|| | | يا (OR) z || x
! | نقيض (NOT) | !x |
جدول (4) . عملگرهاي منطقي

ارزش نادرستي درزبان C با مقدار صفر و ارزش درستي با مقادير غيراز صفر مشخص
ميشود. عملگر منطقي ! داراي بالاترين تقدم و عملگر || داراي كمترين تقدم در بين
عملگرهاي منطقي هستند . چون عملگرهاي منطقي رابطه نزديكي با عملگرهاي رابطه اي
دارند مي توان تقدم آنها را نسبت به يكديگر بيان كرد ( جدول (5) ) .
بالاترين تقدم | ! | > >= < <= |
| == != |
| && |
|
پايين ترين تقدم | ||
جدول (5) . تقدم عملگرهاي منطقي و رابطه اي

عملگرهاي محاسباتي و رابطه اي با يكديگر تركيب شده و عملگرهاي ديگري را بنام
عملگرهاي محاسباتي رابطه اي ايجاد مي كنند ( جدول (6) ) . تقدم اين عملگرها از
ساير عملگرها پايين تر است .
عملگر | نام | مثال |
+= | + انتساب جمع | x+=y |
= | انتساب تفريق | x-=y |
*= | * انتساب ضرب | x*=y |
/= | / انتساب تقسيم | x/=y |
%= | % انتساب باقيمانده تقسيم | x%=y |
جدول (6) . عملگرهاي محاسباتي و رابطه اي

در جدول (6) ، عبارت x + = y معادل با x = x + y است و عبارت x % = y معادل y
x = x % است كه موجب انتساب باقيمانده تقسيم xبر yربه x مي شود : int a=10;
int b=20;
a+= b;

با اجراي دستورات فوق متغير a برابر30 خواهد بود. زيرا دستور a + = b معادل
دستور a = a + b است .

عملگر دستكاري بيت ها
ازآنجايي كه زبان C طوري طراحي شده است كه بتواند دربسياري ازموارد جايگزين
زبان اسمبلي گردد. بايد قادر باشد كليه اعمال ( يا حداقل بسياري از اعمال ) كه
در زبان اسمبلي قابل انجام هستند را انجام دهد . يكي از اعمالي كه در زبان
اسمبلي براحتي انجام پذير است . انجام اعمالي بر روي بيت هاي يك بايت يا يك
كلمه از حافظه است كه در زبان C براي انجام اين منظور از عملگرهايي استفاده
مي شود كه به عملگرهاي بيتي معروفند ( جدول (7) ) . اين عملگرها انجام اعمال
تست ، مقدار دادن و يا انتقال (shift) بيت ها را در يك بايت يا كلمه حافظه
امكان پذير مي نمايند. عملگرهاي بيتي فقط بر روي متغيرهايي از نوع charيا intا
عمل مي كنند و بر روي متغيرهايي از نوع float، double،، long double،، void، و
يا ساير متغيرها قابل اجرا نيستند . عملگرهاي بيتي &، |،و ~و(AND(، OR،و NOTو)
مشابه عملگرهاي منطقي AND، OR،و NOTو عمل مي كنند با اين تفاوت كه عمل آنها بر
روي يك بيت است . با فرض اين كه pو qو دو بيت مختلف باشند ، نحوه عمل عملگر ^
را در ذيل مشاهده مي نماييد .
p | q | p^q |

0 | 0 | 0 |

1 | 0 | 1 |

1 | 1 | 0 |

عملگرهاي بيتي در جدول (7) مشاهده مي شوند .
عملگر | نوع عمل |
& | AND ( و ) |
| | OR ( يا ) |
^ | XOR ( يا انحصاري ) |
~ | NOT ( نقيض يا متمم يك ) |
>> | انتقال به سمت راست (shift right) |
<< | انتقال به سمت چپ (shift left) |
جدول (7) . عملگرهاي بيتي

همان طور كه مشاهده شد ، نتيجه عملگر بيتي ^ وقتي يك (1) است كه يكي از
عملوندهاي آن صفر و ديگري يك باشد . به عبارت ديگر ، نتيجه عملگر بيتي ^ وقتي
صفر است كه هر دو عملوند آن صفر و يا هر دو يك باشند .
عملگرهاي &، |،و ^و و << ، >> بر روي دو عملوند عمل مي كنند اما عملگرهاي ~
به صورت ذيل به كار مي روند: >> و <<بر روي يك عملوند عمل مي كنند . عملگرهاي
متغير >>تعداد انتقال
متغير <<تعداد انتقال
و <<در روش كلي فوق ، متغير ، يك بايت يا كلمه اي از حافظه است كه عملگرهاي
بايد بر روي آن عمل كنند . تعداد انتقال عددي است كه مشخص مي كند بيت هاي >>"
متغير " بايد چند محل به سمت راست و يا چپ انتقال يابند . همان طور كه قبلا"
براي انتقال به چپ مورداستفاده << براي انتقال به راست و عملگر>>گفته شد عملگر
قرار مي گيرد . هر انتقال به چپ ، معادل با تقسيم كردن مقدار متغير به 2 و هر
انتقال به راست ، معادل ضرب كردن در 2 است .

مثال 1 :
تعداد عددي متغير | x مقدار بيتي متغير | x دستورات زبان | C
| char x; | | |

| x=7 ; | 00000111 | 7 |

| x<<1 ; | 00001110 | 14 |

| x<<3 ; | 01110000 | 112 |

| x<<2 ; | 11000000 | 192 |

| x>>1 ; | 01100000 | 96 |

| x>>2 ; | 00011000 | 24 |

همان طور كه مشاهده مي كنيد پس از اجراي دستور 2<< x< اطلاعات واقعي از بين
مي روند و مساله ضرب در 2 شدن ، در اينجا صدق نمي كند .
عملگر ~ در يك بايت يا كلمه حافظه ( يك متغير ) كليه بيت ها را نقيض ميكند.
يعني بيت صفر را به بيت يك و بيت يك را به بيت صفر تبديل مي نمايد . لذا اگر
اين عملگر دو بار بر روي يك متغير عمل كند وضعيت بيت هاي متغير به حالت اول
برمي گردند .

مثال 2 : x :00101100
~x :11010011
~x :00101100

همان طور كه مشاهده مي شود بيت هاي رديف اول و رديف آخر داراي يك وضعيت
ميباشند ( بيت هاي رديف آخر نتيجه دوبار اجراي عملگر نقيض بر روي متغير است ).
نكته اي كه در مورد عملگرهاي بيتي بايد در نظر داشت اين است كه اين عملگرها
معمولا" در مبدل هاي دستگاهها (device drivers) مورد استفاده قرار مي گيرند .
مثل برنامه هايي كه براي كار با modem و با چاپگر نوشته مي شوند . زيرا در اين
گونه موارد معمولا" تست كردن بيت هاي يك متغير مد نظر خواهد بود .

عملگر ?
عملگر ? با تست يك شرط ، مقداري را به يك متغير نسبت مي دهد . اين عملگر به
صورت زير استفاده مي شود : exp3
:= exp1 ? exp2 متغير exp1
، exp2،و exp3و سه عبارت هستند . نحوه عمل ? به اين صورت است كه : ابتدا
عبارت اول (exp1) ارزيابي مي شود چنانچه اين عبارت داراي ارزش true ( ارزش
درستي ) باشد مقدار exp2 پس از ارزيابي ، در متغير ذكر شده قرار مي گيرد وگرنه
عبارت سوم (exp3) ارزيابي شده و نتيجه آن به متغير ذكر شده منتقل مي شود . x= 10;
y= x>9 ? 100 :200;

نحوه عمل در دو دستور فوق به اين صورت است كه عبارت 9> x> ارزيابي مي شود .
چون اين عبارت يك ارزش منطقي true دارد ( 9> x> است ) لذا عدد 100 در متغير y
قرار مي گيرد .

عملگرهاي &و *و
عملگر & يك عملگر يكاني است كه آدرس عملوند خود را مشخص مي كند و به صورت
زير به كار مي رود : ;
نام عملوند &
مثل : int num;
p= &num;

با اجراي دستورات فوق آدرس متغير num در متغير p قرار مي گيرد. لذا عملگر &
به معني " آدرس " است . عملگر * همانند عملگر & يك عملگر يكاني است كه محتويات
يك آدرس حافظه را مشخص مي كند و به صورت زير به كار مي رود . ;
نام عملوند *
مثل : p= &num;
m= *p;

دستور اول ، آدرس متغير num را در p قرار ميدهد و دستور دوم ، محتويات محلي
را كه آدرس آن در p قرار دارد ( محتويات num ) ، را در m قرار ميدهد. بنابراين
مفهوم " * محتويات آدرس " مي باشد . دو دستور فوق معادل دستور m = num; است كه
موجب انتقال محتويات متغير num به متغير m مي شود .

عملگر كاما (/)
عملگر كاما براي انجام چند عمل در يك دستور ، به كار رفته و به صورت زير
استفاده مي شود :
( عبارت 2 و عبارت 1) =) متغير
عملگر كاما موجب مي شود تا " عبارت " 1 ارزيابي شده و سپس نتيجه ارزيابي "
عبارت " 2 با يكديگر ارتباط دارند . x =( y = 3 / y + 5);

ابتدا y باربر با 3 قرار مي گيرد و نتيجه عبارت y + 5 كه برابر 8 است در x
قرار خواهد گرفت .

عملگر sizeof
اين عملگر كه عملگر زمان ترجمه ناميده مي شود، براي محاسبه طول يك نوع و يا
يك متغير به كار رفته و به صورت زير استفاده مي شود . ;
(نوع) sizeof ;
متغير sizeof
اگر بخواهيم با استفاده از اين عملگرها، طول يك نوع مثل int، double و غيره
را محاسبه كنيم بايد آن را در داخل پرانتز قرار دهيم : اما اگر بخواهيم طول يك
متغير را محاسبه كنيم نيازي به استفاده از پرانتز نيست . به عنوان مثال : int a/ b/ c;
a= sizeof( int);
b= sizeof c;

دستور اول سه متغير a، b،ز cز را به صورت int تعريف مي كند . دستور دوم طول
نوع int را محاسبه كرده و در متغير a قرار مي دهد . دستور سوم طول متغير c را
محاسبه كرده و در متغير b قرار مي دهد. اين دستور براي مساله portability زبان C
بسيار مفيد است . بعنوان مثال ممكن است طول نوع int از ماشيني به ماشين ديگر
متفاوت باشد . نكته اي كه در مورد اين عملگر بايد توجه داشت اين است كه معمولا"
روش اول مورد استفاده قرار مي گيرد و روش دوم چندان جالب نيست .

تقدم عملگرها در حالت كلي
وقتي كه در يك عبارت چندين عملگر مورد استفاده قرار مي گيرند تقدم عملگر به
صورت جدول (8) خواهد بود .
بالاترين تقدم () | | ! ~ + + - - * & sizeof |
| * / % |
| + - |
| << >> |
| << = >> = |
| == =! |
| & |
| ^ |
| | |
| && |
| || |
| ? |
| = +=- = *= /= %= |
| / |

جدول (8) . تقدم عملگرها در حالت كلي

اگر در يك عبارت چندين عملگر وجود داشته باشد و درآن از پرانتز نيز استفاده
شود ، تقدم پرانتز از ساير عملگرها بيشتر بوده و عبارت داخل پرانتز زودتر
ارزيابي مي شوند .

مثال 3 : int x=5/ y=10/ k=4;
int s;
s= x*((x+y-)3)/k;

درنتيجه اجراي چند دستور فوق مقداري كه درs قرار مي گيرد برابر با 15 خواهد
بود . سپس عدد 3 از 15 كم مي شود كه 12 حاصل مي گردد و بعداز آن عمل ضرب انجام برابر با 60 ( 5 * 12 ) مي باشد و عملگر تقسيم (/) آخرين
Mino آنلاین نیست.   پاسخ با نقل قول
Sponsored Links
قدیمی 06-07-2012   #12
Mino
عضو تالار
 

تاریخ عضویت: Feb 2012
محل سکونت: خوزستان، اهواز،
نوشته ها: 802
تشکرهای ایشان: 22,059
33,363بار در12,628پست از ایشان تشكر شده است

صندوق مدال ها

پیش فرض

دترمینان و معکوس ماتریس
برنامه نویسی این مسئله سخت نیست، فقط باید با روش کار آشنا بود:

محاسبه دترمینان

توجه: دترمینان برای ماتریس n*n حساب میشه

همانطور که میدونید، دترمینان(determinant) با استفاده از همسازه ها بدست میاد که خودش با استفاده از ماترس کهاد(minor) بدست میاد. ماتریس کهاد هم با حذف یک سطر و ستون از ماتریس اصلی بدست میاد. ماتریس ها رو با یک آرایه دوبعدی نمایش میدیم، پس باید برای کهاد، از یک ماتریس دیگه که از ماتریس اصلی یک سطر و ستون کمتر داره استفاده کنیم.
یک جاش که یکم کار میخواد پر کردن ماتریس کهاد هست که خیلی هم سادست، میشه اینطور عمل کرد: فرض کنید ماتریس کهاد رو میخوایم سطر به سطر پر کنیم، وقتی به سطری میرسیم که باید از ماتریس اصلی حذف بشه پس از اون سطر رد میشیم. در هر سطر هم وقتی به ستون حذفی میرسیم از اون درایه صرف نظر میکنیم، همین!

در کد زیر تابع Determinant یک آرایه دو بعدی (a) رو میگیره که n*n و نوع اون T هست و مقدار برگشتیش هم دترمینان ماتریس a هست. استفاده از template(قالب) در ++C به کلی شدن تابع کمک میکنه، الان تابع ما میتونه آرایه هایی با هر نوعی رو بگیره (مثلاً اینجا انواعی مثل int و double مطرح هستند)، اما برای آرایه های دو بعدی یک کمک ویژه هم میکنه؛ میدونید که در ++C نمیشه بعد دوم رو مشخص نکرد، اما با استفاده از قالب میشه n رو بعنوان یک عدد فرض کرد که همون اندازه بعد دوم هست و عدد ثابتی برای بعد دوم مشخص نکرد و بعد در تابع هم استفاده کرد، پس نیازی به گرفتن اندازه ماتریس در یک پارامتر اضافه نیست (مزیتی دیگر!). متغیر det در آخر تابع مقدار دترمینان رو در خودش خواهد داشت.

درون تابع چندین حالت برای n تست میشه که اصل قضیه آخرین else هست که برای n های بزرگتر از 2 هست و بحث کهاد و همسازه ها مطرح میشه. ما باید نسبت به یک سطر یا ستونی ماتریس رو بسط بدیم، در اینجا نسبت به سطر اول بسط میدیم. for اول این else برای محاسبه تمام همسازه هاست. با j1 روی همه درایه های سطر اول حرکت میکنیم و بعد در for دوم و سوم (که برای محاسبه کهاد هر همسازه هست) درایه های کهاد رو یکی یکی از ماتریس اصلی بیرون میکشیم (ماتریس m برای کهاد هست). i از یک شروع میشه چون نسبت به سطر اول داریم بسط میدیم و سطر اول در هیچکدوم از کهادها در نظر گرفته نمیشه (اینم مزیت بسط روی سطر اول!). j2 هم برای مشخص کردن ستونی از کهاد هست که داریم پر میکنیم. در for سوم روی تمام ستونهاحرکت میکنیم و هرجا به ستونی که نباید در کهاد باشه میرسیم با continue از اون ستون رد میشیم و به j2 هم اضافه نمیشه. اینطوری در آخر هر تکرار for اول، کهاد همسازه مربوط رو در m خواهیم داشت، سپس همسازه رو حساب میکنیم و به det اضافه میکنیم. دو تا یکی که به j1 اضافه میشه یکی برای این هست که ستون های آرایه از صفر شروع میشن اما برای ماتریس ها در ریاضی از یک هستند و 1 دیگر همان شماره سطری است که داریم نسبت به آن بست میدیم.

include ها : <cmath> برای ()pow لازم است
کد قالب بندی شده:

/*
Recursive definition of determinate using expansion by minors.
*/
template <typename T, int n>
T Determinant(T a[][n])
{
int i,j,j1,j2;
T det = 0;
T m[(n>1)?(n-1):1][(n>1)?(n-1):1];

if (n < 1)
{ /* Error */

}
else if (n == 1)
{ /* Shouldn't get used */
det = a[0][0];
}
else if (n == 2)
{
det = a[0][0] * a[1][1] - a[1][0] * a[0][1];
}
else
{
det = 0;
for (j1=0;j1<n;j1++)
{
for (i=1;i<n;i++)
{
j2 = 0;
for (j=0;j<n;j++)
{
if (j == j1)
continue;
m[i-1][j2] = a[i][j];
j2++;
}
}
det += (int)pow(-1.0,1+j1+1) * a[0][j1] * Determinant(m);
}
}
return(det);
}



محاسبه معکوس

توجه: معکوس برای ماتریس n*n حساب میشه

برای محاسبه معکوس ماتریس باید ماتریس الحاقی اون رو بر دترمینانش تقسیم کنیم (که دترمینان صفر نباید باشه). دترمینان رو که از برگشتی تابع Determinant میگیریم، میمونه ماتریس الحاقی؛ تابع CoFactor ماتریس همسازه رو در b بهمون میده بعد باید b رو ترانهاده کنیم تا ماتریس الحاقی بشه؛ تابع Transpose ماتریس a رو ترانهاده میکنه (عملکردش ساده هست و نیاز به توضیح نداره).

توضیح تابع CoFactor : پارامتر b برای ماتریس همسازه هست و آرایه c برای کهاد (چون همیشه یک سطر و ستون کمتر داره ابعادش n-1 هست). دو for اول برای حرکت روی تمام درایه های ماتریس هست تا هر بار همسازه یکی از اون ها رو حساب کنیم و در درایه متناظر از b بریزیم. دوتا for درونی هم برای حساب کردن کهاد هستند.

پس حالا دیگه با توانایی محاسبه دترمینان و ماتریس همسازه (و ترانهاده اون)، نوشتن تابع معکوس (Reverse) ساده خواهد بود. این تابع ماتریس معکوس a رو در b تحویل میده. تنها نکته اینکه چون درایه های b حاصل یک تقسیم هستن ممکنه که اعشاری بشن، پس نوع b با a حتماً یکسان نیست و چون میتونه مختلف باشه (float و double و...) پس نوع کلی T1 رو براش در نظر میگیریم.

include ها : <cmath> برای ()pow لازم است
کد قالب بندی شده:

/*
Find the cofactor matrix of a square matrix
*/
template <typename T, typename T1, int n>
void CoFactor(T a[][n],T1 b[][n])
{
int i,j,ii,jj,i1,j1;
T det;
T c[n-1][n-1];

for (j=0;j<n;j++)
{
for (i=0;i<n;i++)
{

/* Form the adjoint a_ij */
i1 = 0;
for (ii=0;ii<n;ii++)
{
if (ii == i)
continue;
j1 = 0;
for (jj=0;jj<n;jj++)
{
if (jj == j)
continue;
c[i1][j1] = a[ii][jj];
j1++;
}
i1++;
}

/* Calculate the determinate */
det = Determinant(c);

/* Fill in the elements of the cofactor */
b[i][j] = (int)pow(-1.0,i+j+2) * det;
}
}
}

/*
Transpose of a square matrix, do it in place
*/
template <typename T, int n>
void Transpose(T a[][n])
{
int i,j;
T tmp;

for (i=1;i<n;i++) {
for (j=0;j<i;j++) {
tmp = a[i][j];
a[i][j] = a[j][i];
a[j][i] = tmp;
}
}
}

/*
Reverse of matrix 'a' in 'b'
*/
template <typename T, typename T1, int n>
void Reverse(T a[][n], T1 b[][n])
{
T det = Determinant(a);
CoFactor(a,b);
Transpose(b);

int i,j;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
b[i][j] = b[i][j]/det;
}



یک نمونه استفاده از تابع Reverse در کد زیر آمده :

کد قالب بندی شده:

double b[3][3];
int a[3][3] = {{3,1,2},{-2,5,4},{1,3,6}};
Reverse(a,b);


حالا که کد ++C رو دارید تبدیل به پاسکال (با معادل سازی دستورات) کاری نداره.
Mino آنلاین نیست.   پاسخ با نقل قول
قدیمی 06-07-2012   #13
Afof
مدیر تالار عکس
 
Afof آواتار ها
 

تاریخ عضویت: Feb 2012
محل سکونت: من اینجا،من آن جا،من همه جا ...
نوشته ها: 4,809
تشکرهای ایشان: 7,047
8,579بار در3,181پست از ایشان تشكر شده است

صندوق مدال ها

پیش فرض

مرسی مینو جونن

ولی به هم ریخته برنامه هه

جاهاش عوض شده و جابه جا شده
__________________
از شیخ بهایی پرسیدند: سخت میگذرد، چه باید کرد؟
گفت: خودت که میگویی سخت میگذرد، سخت که نمی ماند!
پس خدارو شکر که می گذرد و نمی ماند...
Afof آنلاین نیست.   پاسخ با نقل قول
قدیمی 06-07-2012   #14
Mino
عضو تالار
 

تاریخ عضویت: Feb 2012
محل سکونت: خوزستان، اهواز،
نوشته ها: 802
تشکرهای ایشان: 22,059
33,363بار در12,628پست از ایشان تشكر شده است

صندوق مدال ها

پیش فرض

گرافیک در ++c
برای رفتن به محیط گرافیک در C++ ابتدا باید از دستور زیر استفاده کنید ...


int driver ,mode;



driver = DETECT;



mode = 0



initgraph(&graph,&mode,"..\\bgi");


نکته : عبارت DETECT حتماً باید با حروف بزرگ نوشته بشه .



در بعضی از برنامه ها احتیاج داریم ابعاد مانیتور رو بدست بیاریم ، برای این کار از کد زیر استفاده می کنیم

Getmaxx();



Getmaxy();


دستور زیر حداکثر تعداد رنگی که مانیتور می شناسه رو به ما بر می گردونه .

Getmaxcolor();




اولین گامی که در گرافیک در C++ بر می داریم ، اینه که یک پیکسل رو روشن کنیم :

Putpixel (x,y,color);


x,y مختصات ما و color رنگ پیکسل مورد نظر هستش ، که می توان در آن نام رنگ با حروف بزرگ یا کد رنگ را نوشت .

بقیه کد ها رو با توضیحی مختصر می نویسم :

پاک کردن صفحه نمایش :

Cleardevice();


خروج از محیط گرافیک:

Closegraph();


تغییر موقعیت جاری (در آینده مورد نیاز می باشد ...):

Moveto(x,y);


تغییر موقعیت جاری اط x,y به dx,xy:

Moverel(dx,dy);


تغییر رنگ پس زمینه:

Setbkcolor(color);


تغییر رنگ شکل:

Setcolor(color);


ترسیم خط:

Line(x1,y1,x2,y2);


ترسیم خط از نقطه جاری:

Lineto(x,y);



Linerel(dx,dy);


رسم مستطیل :

Rectangle(x1,y1,x2,y2);


رسم مستطیل تو پر :

Bar(x1,y1,x2,y2);


مکعب :

Bar3d(x1,y1,x2,y2,deph,0);


رنگ حاشیه اشیاء تو پر :

Setfillstyle(model , color);


دایره:

Circle(x,y,r);


نیم دایره :

Arc(x,y,start,end,r);


نیم دایره تو پر :

Pieslice(x,y,start,end,r);


تاخیر:

Delay(10-100);


بیضی:

Ellipse(s,y,start,end,a,b);


بیضی توپر :

Fileellipse(x,y,a,b);


قطاع بیضی توپر:

Sector(x,y,start,end,a,b);


رنگ داخل :

Fillstyle(1,color);


چندضلعی تو پر :

Fillploy(n,a);


چند ضلعی :

Drawploy(n,a);


چاپ متن :

Outtext("TEXT");


چاپ متن در x,y :

Outtextxy(x,y,"TEXT");


تغییر فونت (به جای Right_Left یا باید 0 بزارید یا 1)

Settextstyle(font(0-4),Righ_Left,size);


در ادامه بحث در مورد کپی پیست ، یک عکس در محیط گرافیک و در ادامه نحوه ساخت یک بازی رو آموزش می دم .
Mino آنلاین نیست.   پاسخ با نقل قول
قدیمی 06-07-2012   #15
Mino
عضو تالار
 

تاریخ عضویت: Feb 2012
محل سکونت: خوزستان، اهواز،
نوشته ها: 802
تشکرهای ایشان: 22,059
33,363بار در12,628پست از ایشان تشكر شده است

صندوق مدال ها

پیش فرض

آموزش فارسی ++c به صورت پی دی اف
آموزش فارسی ++C به صورت پی دی اف

زبان برنامه‌نویسی ++C (تلفظ می‌شود: سی پلاس پلاس) یک زبان برنامه‌نویسی کامپیوتری همه منظوره، شی گرا، سطح بالا و چندرگه (که از برنامه‌نویسی رویه‌ای، تجرید داده‌ها و برنامه‌نویسی شئ گرا پشتیبانی می‌کند)، عمومی و با قابلیت‌های سطح بالا و سطح پایین می‌باشد. این زبان دارای قابلیت‌های انواع داده ایستا، نوشتار آزاد، چندمدلی، معمولاً زبان ترجمه شده با پشتیبانی از برنامه‌نویسی ساخت‌یافته، برنامه‌نویسی شی‌گرا، برنامه نویسی جنریک است. ++C به همراه جد خود C از پرطرفدار ترین زبانهای برنامه‌نویسی تجاری هستند.

زبان ++c یک زبان سطح میانی در نظر گرفته می‌شود. این زبان دارای قابلیت زبان‌های سطح بالا و پایین بصورت هم‌زمان است. زبان ++C توسط بی‌یارنه استراس‌تروپ دانمارکی در سال ۱۹۷۹ در آزمایشگاه‌های بل (Bell Labs)، برای بهبود زبان سی و بر مبنای آن ساخته شد و آن را “C با کلاس” (C With Classes) نام‌گذاری نمودند. در سال ۱۹۸۳ به ++c تغییر نام داد. توسعه با اضافه نمودن کلاس‌ها و ویژگی‌های دیگری مانند توابع مجازی، سربارگزاری عملگرها، وراثت چندگانه، قالب توابع، و پردازش استثنا انجام شد. این زبان برنامه‌نویسی در سال ۱۹۹۸ تحت نام ISO/IEC 14882:1998 استاندارد شد. نسخه فعلی استاندارد این زبان ISO/IEC 14882:2003 است. نسخه جدیدی از استاندارد (که به صورت غیررسمی C++0x نامیده می‌شود) در دست تهیه‌است.

آموزش فارسی C++

برای یادگیری این زبان برنامه نویسی پرکاربرد، می توانید کتاب الکترونیک فارسی آموزش فارسی ++C را از وب سایت TXT.ir دانلود کرده و مطالعه نمایید. این کتاب همراه با مثال ها و تمرین های گوناگون می تواند شما را در یادگیری این زبان برنامه نویسی کمک کند.
* توضیحات و دانلود در ادامه ی مطلب

دانلود کتاب الکترونیک آموزش فارسی ++C

نام کتاب : آموزش فارسی ++C

تعداد صفحات : ۲۱۴
فرمت کتاب الکترونیک :

pdf – zip


فایل های پیوست شده
  • [نمایش لینک، فقط برای اعضای سایت امکان پذیر است. ] (3.47 مگابایت, 116 نمایش)


Mino آنلاین نیست.   پاسخ با نقل قول
قدیمی 06-07-2012   #16
Mino
عضو تالار
 

تاریخ عضویت: Feb 2012
محل سکونت: خوزستان، اهواز،
نوشته ها: 802
تشکرهای ایشان: 22,059
33,363بار در12,628پست از ایشان تشكر شده است

صندوق مدال ها

پیش فرض

معرفی تابع های گرافیکی :

Intgraph : از این تابع برای تغییر حالت برنامه از حالت متنی به حالت گرافیکی استفاده می شود.

شکل کلی دستور :


کد:
1 void initgraph(int *driver , int *mode , char * bgiaddress )
2


در این تابع driver به مبدل گرافیکی اشاره می کنه که می تونیم مقدار اون رو با کلمه کلیدی DETECT به طور خودکار پیدا کرد.
Mode : فقط Resolation خروجی را تغییر می دهد.
آرگومان سوم آدرس دقیق فایل مبدل گرافیکی را مشخص می کند که می تواند به صورت نسبی یا دقیق باشد.در حالت دقیق مثلا به این صورت است C:\ TC\BGI.

مثلا :

کد:
1 int gd=DETECT,gm;
2 int mode=0;
3 initgraph(&gd,&gm,"c:\\tc\\bgi");
Mino آنلاین نیست.   پاسخ با نقل قول
قدیمی 06-07-2012   #17
Mino
عضو تالار
 

تاریخ عضویت: Feb 2012
محل سکونت: خوزستان، اهواز،
نوشته ها: 802
تشکرهای ایشان: 22,059
33,363بار در12,628پست از ایشان تشكر شده است

صندوق مدال ها

پیش فرض




Line : این تابع خطی را که با رنگی که مشخص می شود در مختصات (x1,y1) تا (x2 , y2) رسم می کند.

شکل کلی این تابع :

کد:
1 void line (int x1 , int y1 , int x2 , int y2
Mino آنلاین نیست.   پاسخ با نقل قول
قدیمی 06-07-2012   #18
Mino
عضو تالار
 

تاریخ عضویت: Feb 2012
محل سکونت: خوزستان، اهواز،
نوشته ها: 802
تشکرهای ایشان: 22,059
33,363بار در12,628پست از ایشان تشكر شده است

صندوق مدال ها

پیش فرض


Lineto : خطی را از موقیت جاری تا نقظه دلخواه رسم می کند.

شکل کلی این تابع :


کد:
1 void lineto(int x , int y);
Mino آنلاین نیست.   پاسخ با نقل قول
قدیمی 06-07-2012   #19
Mino
عضو تالار
 

تاریخ عضویت: Feb 2012
محل سکونت: خوزستان، اهواز،
نوشته ها: 802
تشکرهای ایشان: 22,059
33,363بار در12,628پست از ایشان تشكر شده است

صندوق مدال ها

پیش فرض


Linerel : خطی را از موقیت جاری تا نقطه ای که مختصات آن نسبت به خط جاری داده شده رسم می کند.

شکل کلی این تابع :

کد:
1 void linerel(int deltax , int deltay );
Mino آنلاین نیست.   پاسخ با نقل قول
قدیمی 06-07-2012   #20
Mino
عضو تالار
 

تاریخ عضویت: Feb 2012
محل سکونت: خوزستان، اهواز،
نوشته ها: 802
تشکرهای ایشان: 22,059
33,363بار در12,628پست از ایشان تشكر شده است

صندوق مدال ها

پیش فرض

Setcolor : این تابع رنگی را که با آن خط ها و شکل ها رو رسم کردیم نشان می دهد.مقدارش از 0 تا 15 است.

شکل کلی این تابع :

کد:
1 void setcolor( int color)
2


شماره رنگ*************رنگ
0*************مشکی
1*************آبی
2*************سبز
3*************کبود
4*************قرمز
5*************بنفش
6*************قهوهای
7*************خاکستری روشن
8*************خاکستری تیره
9*************آبی روشن
10*************سبز روشن
11*************کبود روشن
12*************قرمز روشن
13*************بنفش روشن
14*************زرد
15*************سفید
Mino آنلاین نیست.   پاسخ با نقل قول
پاسخ


کاربران در حال دیدن موضوع: 1 نفر (0 عضو و 1 مهمان)
 

(View-All تعداد کاربرانی که این تاپیک را مشاهده کرده اند : 16
Afof, ASHIL, code-academy.ir, dajes, daryuush, fardin75, Fertax, hassan717, koma1369, KOROSH BOZORG, mehrnosh, Mino, m_ahmad_b, reza300, s@eed, S@m!ra
ابزارهای موضوع
نحوه نمایش

مجوز های ارسال و ویرایش
شما نمیتوانید موضوع جدیدی ارسال کنید
شما امکان ارسال پاسخ را ندارید
شما نمیتوانید فایل پیوست در پست خود ضمیمه کنید
شما نمیتوانید پست های خود را ویرایش کنید

BB code هست فعال
شکلک ها فعال است
کد [IMG] فعال است
کد HTML غیر فعال است

انتخاب سریع یک انجمن


اکنون ساعت 02:58 برپایه ساعت جهانی (GMT - گرینویچ) +3.5 می باشد.


Powered by vBulletin Version 3.8.9
.Copyright ©2000 - 2017, Jelsoft Enterprises Ltd

Free Persian Language By Persian Forum Ver 3.0
« ثبت شده در پایگاه ساماندهی وزارت ارشاد »
مسئولیت متون درج شده در این پایگاه اینترنتی، بر عهده ی نویسنده ی آن می باشد.