PDA

View Full Version : ساختارهای کنترلی (ساختار تکرار for )



Arash.Net
سه شنبه 10 دی 1387, 00:58 صبح
با سلام خدمته شما چند وقتیه که دارم سی پلاس پلاس رو میخونم کتاب جعفر نژاد قمی
در ابتدای فصل 2 در قطعه کد زیر چند تا سوال داشتم که اگه جواب بدید ممنون میشم




#include<iostream.h>
#include<conio.h>
int main()
{
int i,sum=0,num;
float ave;
const int n=5;
for(i=0;i<n;i++){
cout<<"Enter number"<<i+1<<":";
cin>>num;
sum+=num;
}//end of for
ave=(float)sum/n;
cout<<"the average is:"<<ave;
getch();
return 0;
}
1: const int n=5; در این قسمت یه کم توضیح میخواستم که اصلا چیه و کارش چطوره ؟

کتاب رو خوندم ولی در مورد const چیزی ندیدم

در کتاب گفته برای بدست آوردن خارج قسمت اعشاری از type casting استفاده شده است

2: این type casting چیه ؟ چه کاربردی داره ؟ و در کجا استفاده میشه؟

فعلا سوالم همین هاست با تشکر

ممنون میشم راهنمایم کنید:بوس:

obscure
سه شنبه 10 دی 1387, 07:43 صبح
const برای گرفتن یک ثابت بکار برده میشه..بر عکس متغیر که محتوای اون هر لحظه امکان داره تغییر کنه محتوای const همیشه و تا آخر برنامه ثابت هست.type casting هم فکر کنم یعنی تبدیل متغیر ها در زمان محاسبه و مثلا به این شکل:ave=(float)sum/n;

deopen
سه شنبه 10 دی 1387, 14:32 عصر
static_cast<type>()
مانند عملگرهای یک واحد کاهش و افزایش (++ و --) این عملگر نیز عملگری یگانی است و همانطور که دوست عزیزمان گفت برای تغییر نوع متغیر در زمان اجرا میباشد برای مثال اگر متغیری از نوع صحیح و با مقدار 5 تقسیم بر 2 بشود جواب 2 میشود در صورتی که جواب واقعی عددی اعشاری است, برای این محاسبه با استفاده از این عملگر جواب اینگونه است :


int main() {
int m=5;
cout<<static_cast<float>(m)/2;
//2.5
cin.get();
return 0;
}

const نیز در پست قبلی توضیح داده شد, فرض کنید که میخواهیم امتحانات دانش آموزان را در طی یک ماه با میانگین محاسبه کنیم, در اینجا ما دو حلقه نیاز داریم, 1-حلقه ای برای دانش آموزان 2- حلقه ای برای امتحانات . بهتر نیست بجای بکار بردن مستقیم تعداد امتحانات و دانش آموزان از نامهایی استفاده کنیم؟ و این نیز هم خوانایی را زیاد میکند هم از خطا های منطقی احتمالی جولوگیری میکند, برای همین از ثابتهای student و test استفاده میکنیم.

Arash.Net
سه شنبه 10 دی 1387, 21:25 عصر
obscure (http://barnamenevis.org/forum/member.php?u=77507) جان ممنون و متشکرم از جواب شما واقعا لطف کردید به من

جالبه من قبلا const رو خونده بودم و وقتی که به این مسئله برخوردم دنبالش گشتم ولی دوباره به چشمم نخورد واسه همین پرسیدم



deopen (http://barnamenevis.org/forum/member.php?u=67019) جان از شما هم سپاس گذارم خیلی عالی توضیح دادید با مثالی که زدید هم که دیگه خیلی عالی شد

در قطعه کدی که بالا نوشتم روی سوال به شرح زیر بود

برنامه ای که تعداد 5 عدد صحیح را از ورودی خوانده ،میانگین آنها را محاسبه کند و به خروجی میبرد توجه داشته باشید که در این برنامه برای بدست آوردن خارج قسمت اعشاری از type casting استفاده شده است

zaniar_vb6
سه شنبه 10 دی 1387, 21:45 عصر
منم همین سوال را دارم .
منظور از type casting چیه و در کجای برنامه ست ؟

Saeed_m_Farid
چهارشنبه 11 دی 1387, 02:13 صبح
برنامه ای که تعداد 5 عدد صحیح را از ورودی خوانده ،میانگین آنها را محاسبه کند و به خروجی میبرد توجه داشته باشید که در این برنامه برای بدست آوردن خارج قسمت اعشاری از type casting استفاده شده استيعني اون 5 تا عددي رو كه از كنسول گرفتين و مجموعشون رو تقسيم بر پنج كردين قبلش همونطوريكه deopen و obsecure گفتن <static_cast<float يا فقط (float) بذارين تا نتيجه تو خروجي يا تو انتساب؛ اعشاري باشه :

int iSum = 0;
for (int i=0; i<5; i++)
iSum += iInputs[i];
float fAvrage = (float) iSum/5;
cout<<fAvrage;
// يا مستقيم
cout<<static_cast<float>(iSum)/5;
ضمنا Arash.Net اگه امضاتون رو بيزحمت عوض كنين ممنون ميشم آدم فكر ميكنه دارين مسخرش ميكنين!

Arash.Net
پنج شنبه 12 دی 1387, 00:21 صبح
Saeed_m_Farid جان چشم عوض کردم

شرمنده اگه کسی ناراحت شده قصد مسخره کردن نیست از اسمایلش خوشم اومد با نمک بود گذاشتم

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

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

در ضمن من داشتم تمرین میکردم ( من با code block کار میکنم)

داشتم از const استفاده میکردم که دیدم 2 مدل const هست عکس زیر
http://i43.tinypic.com/2rnfqy1.jpg



1:const خالی
2: const_cast

اولی میدونم چیه ولی دومی رو نمیدونم چه فرقی با اولی داره آیا با taype casting در ارتباطه ؟

Saeed_m_Farid
جمعه 13 دی 1387, 12:51 عصر
سلام
دوست عزيز اين دو عملگر كار كاملا متفاوتي دارن : نحوه كار عملگر const‌ كه روشنه.
ولي const_cast همونطوريكه اشاره كردين يه عملگر تبديل نوعه و براي برداشتن خاصيت const بكار ميره، ساير عملگرهاي مرتبط با تبديل نوع عبارتند از :




- static_cast : همونطوريكه در مثال قبل (پست 6) ديديد براي تبديل مستقيم انواع داده هاي معمولي بكار ميرود.
- dynamic_cast : اين عملگر جهت تبديل نوعهاي چندريختي كاربرد دارد.
- const_cast : اين عملگر جهت برداشتن (يا گذاشتن) خاصيتهاي const, volatile, __unaligned بكار ميرود.
- reinterpret_cast : اين عملگر به شما امكان تغيير اندازه بيتهاي نوع اشاره شده را ميدهد يعني ميتونيد نوع اشاره شده رو تغيير بدين.
- safe_cast : اين نوع تبديل هم به شما اطمينان ميده كه نوع تبديل شده با استاندارد MSIL (زبان مياني دات نت) همخواني داره.


اين آخري منحصر به مايكروسافته و بيشتر براي ساخت dll هاي سازگار با تمام برنامه ها (حداقل واسه خود من) بكار ميره چون همونطوريكه ميدونيد dll هاي CStyle يه مقدار همچين مشكلاتي ميتونن درست كنن...
براي اطلاعات بيشتر در مورد عملگرهاي تبديل نوع (Type casting operators) ميتونين به لينكهاي زير مراجعه كنيد:


Casting Operators (http://msdn.microsoft.com/en-us/library/5f6c9f8h%28VS.80%29.aspx)
Postfix Expressions (http://publib.boulder.ibm.com/infocenter/lnxpcomp/v7v91/index.jsp?topic=/com.ibm.vacpp7l.doc/language/ref/clrc05keyword_const_cast.htm)

و اگه ميخواين در مورد انواع چندريختي هم بدونين ميتونين اينجا مراجعه كنيد :
Polymorphic Types in Cpp (http://www.bearcave.com/software/c++types.html)

با تشكر.

Arash.Net
پنج شنبه 03 بهمن 1387, 11:29 صبح
#include<iostream.h>
#include<conio.h>
int main()
{
int count;
cout<<"Enter a statement with (.) enter in end:"<<endl;
for(count=0;cin.get()!='.';count++);
cout<<"length of statement is : "<<count;
getch();
return 0;
}


با عرض سلام و خسته نباشید مجدد:خجالت:

سوالی که داشتم در مورد
for(count=0;cin.get()!='.';count++); بود

اونم اینکه
cin.get()!='.' من قبلا خونده بودم که به جای cin هم استفاده میشه

ولی اینکه در میان حلقه for استفاده میشه یکم مطلب واسم جا نیوفتاد اگه ممکنه یکم راهنمایم کنید که کلا چه فرق هایی با خود cin داره این دستور

آیا میتونستیم میان همین حلقه for از cin هم استفاده کنیم

میشه یه توضیح کوچولو در مورد این قسمت برنامه کنید که اصلا چطور از طریق صفحه کلید ورودی ها رو میگیره در میان حلقه for منظورم همین قطعه کد
cin.get()!='.'

متشکرم:لبخندساده:

Arash.Net
جمعه 04 بهمن 1387, 18:50 عصر
من هنوز منتظر جوابم

متشکر میشم راهنماییم کنید :قلب:

obscure
جمعه 04 بهمن 1387, 19:16 عصر
راستش اطلاعات من راجع به تابع cin.get زیاد نیست ولی چون دیدم کسی جواب نداد در همین حد که می دونم میگم:
اولا این که با cin.get فاصله رو هم میشه از ورودی خوند ولی با cin نمیشه..بعدم اینکه با cin.get میشه تعداد کاراکتر های ورودی رو کنترل کرد.مثال:

char a[20];
cin.get(a,10);
cin.get();
همچنین میشه واسه پایان رشته یه کاراکتر رو مشخص کرد:

char a[20];
cin.get(a,10,'$');
cin.get();
مثلا در اینجا وقتی کاربر وارد میکنه :

Hello$ world!
فقط کلمه Hello خونده میشه از ورودی..

Arash.Net
شنبه 05 بهمن 1387, 01:48 صبح
obscure (http://barnamenevis.org/forum/member.php?u=77507) جان خیلی لطف کردی همین که جوابمو دادید و سوالمو بی جواب نگذاشتید باعث دلگرمیه- خیلی لطف کردید همین مقداری رو که شما میدونستید من نمیدونستم در نتیجه شما کمک بزرگی به من کردید و من از شما سپاس گذارم :قلب:

از دیگر دوستان هم تقاضا مندم تا حد توانشون اگه میتونن کمک کنن

مرسی و ممنون

Saeed_m_Farid
شنبه 05 بهمن 1387, 10:04 صبح
همین مقداری رو که شما میدونستید من نمیدونستم در نتیجه شما کمک بزرگی به من کردید
تفاوت عملگر << با get بیشتر از اون چیزی که دوستمون گفتن هم نیست، ایشون تقریبا کاربردهای این تابع رو بطور کامل توضیح دادن : فقط یه توضیحی که میشه اضافه کرد اینه که این تابع [get] کاراکتر پایان رشته ورودی رو که تعیین کردین همراه رشته به شما برمیگردونه و اگه بخواین رشته رو بدون اون کاراکتر از کنسول بگیرین میتونین از getline استفاده کنید که دقیقا همون کاربرد get رو داره فقط با تفاوت ذکر شده.

grando_alireza
شنبه 05 بهمن 1387, 14:44 عصر
سلام عمل دستور cin.get() اینه که هر عبارتی که شما تایپ می کنید رو می خونه در مثال شما '.'=!()cin.get یعنی اینکه در حلقه تک تک عبارت هایی که شما تایت می کنید رو می خواند و به countاضافه می شود تا به شرط پایان حلقه برسد! یعنی همان'.'=!()cin.get یعنی وقتی که شما کاراکتر "." را میزنید شرط.=! نقض می شود.
امید وارم که متوجه شده باشید.

Arash.Net
شنبه 05 بهمن 1387, 15:28 عصر
Saeed_m_Farid (http://barnamenevis.org/forum/member.php?u=41415) جان از شما هم سپاس گذارم لطف کردین - بله obscure (http://barnamenevis.org/forum/member.php?u=77507) جان کاربرد های cin.get رو گفتند که همون هم واسم کمک بزرگی بود چون به طبع کار برد های رو که داشت هم من نمیدونستم فقط در همین حد میدونستم که کاراکتر از ورودی میگیرد و با توجه به گفته های ایشان این مورد رو هم فهمیدم

از شما هم ممنونم که راهنماییم کردید

grando_alireza (http://barnamenevis.org/forum/member.php?u=82530) جان متشکرم که راهنماییم کردین بله متوجه شدم بسیار ساده و روان نوشتید که به راحتی قابل فهم بود (سپاس گذارم) ممنون که کمکم کردید

Arash.Net
شنبه 05 بهمن 1387, 19:42 عصر
#include<iostream.h>
#include<conio.h>
int main()
{
int charcount=0, wordcount=0;
char ch;
cout<<"\nEnter a statement(and press Enter):";
while((ch=getche())!='\r'){
charcount++;
if(ch==' ')
wordcount++;
}//end of while
cout<<"\nChar count=" <<charcount<<" , Wordcount=" <<wordcount+1;
getch();
return 0;
}




while((ch=getche())!='\r') تو این دستور شرطی هم getche() باز همون عمل خواندن از صفحه کلید رو انجام میده !!!

مگه ما چند تا دستور برای خواندن از صفحه کلید داریم :متفکر:

obscure
شنبه 05 بهمن 1387, 19:57 عصر
فرقش خیلی سادست...اگه خودت یه بار توی برنامه جای این دوتا تابع رو عوض می کردی می فهمیدی...
تابع getche یه کاراکتر رو از صفحه کلید می خونه و اون رو چاپ می کنه..ولی getch فقط کاراکتر رو از کیبورد می خونه و اونو تو خروجی نمایش نمیده...

C_Sharp_Dot_Net
یک شنبه 06 بهمن 1387, 07:02 صبح
سلام فکر کنم کامل ترین مطلب اینه :

در پروژه های بزرگ این چنینی (که البته این برنامه بزرگ نیست ولی برای عادت برنامه نویسان این چنین نوشته شده ) چون تعداد داده های مورد پردازش همیشه ثابت نیست و ممکنه چند روز بعد شما بخواهید که تعداد داده های مورد پردازش تغییر بدین از Const استفاده می کنن
Const در واقع به کامپایلر حالا سی یا سی پلاس پلاس اطمینان می دهد که این مقدار همواره ثابت خواهد ماند.خب حالا چه فایده ای داره ؟ مثلا فرض کنید می خواهیم یه آرایه رو بسازیم . چون میزان حافظه اختصاصی به آرایه باید در زمان کامپایل مشخص باشد ما دو راه داریم
راه اول :

int arr[10

که این راه پیشنهاد نمیشه !

راه دوم

const int count=10
int arr[count


در روش اول ممکنه ما در برنامه بارها بخواهیم بر روی آرایه کارهایی انجام دهیم که به شدت به تعداد عناصر آرایه مربوط هست ( آرایه رو مرتب کنیم یا کل آرایه رو چاپ کنیم )
حالا اگه چند روز بعد ما خواستیم تعداد عناصر آرایه رو تغییر بدیم باید در تمامی جاهایی از برنامه که به تعداد عناصر آرایه اشاره کردیم ( مثل حلقه ها ) تعداد عناصر آرایه رو اونجاها هم عوض کنیم تازه در برنامه های خیلی بزرگ تر ( مثلا 20000 ) خطی ممکنه یه قسمت فراموش بشه که در این صورت صحت کل برنامه به خطر می افته هیچ پیدا کردن محل فراموش شده هم خیلی خیلی سخته
ولی در روش دوم که جور دور اندیشی انجام شده فقط با تغییر مقدار count کل برنامه رو اصلاح کردیم
این در مورد const که امید وارم مفید بوده باشه
_______________________________________

ولی در مورد Type Casting
ببینید کامپایلر زبان هایی مثل سی و سی پلاس پلاس در مورد نوع داده های عددی و کامپایلر زبون هایی مثل سی شارپ و جاوا در مورد همه انواع داده سخت گیرند
مثلا در تقسیم دو تا عدد صحیح (int) بر هم دیگه حاصل هم یه عدد صحیح دیگه هست
کد زیر رو ببین

int a=15
int b=2
float hasel=a/b

درسته که مقدار متغیر hasel در اینجا باید 7.5 باشه ولی مقدار این متغیر میشه 7 چرا چون دو تا عدد int بر هم تقسیم شدن
خب چی کار کنیم ؟
اینجا هست که باید عمل کست کردن یک متغیر وارد بشه
ببین

int a=15
int b=2
float hasel=(float)a/b

با این کد نوع متغیر a فقط دز زمان محاسبه به float تبدیل میشه تا جواب درست در بیاد
عمل casting در سی و سی پلاس پلاس به خاطر سخت گیری نکردن بیش از حد توسط کامپایلر کم مورد استفاده قرار می گیرد مثلا شما به راحتی می تونین یه کارکتر رو توی یه متغیر عددی قرار بدین
ولی این کار توی جاوا و سی شارپ که کامپابلرشون به شدت سخت گیر هستند انجام نگرفته و کامپایلر شما رو مجبور میکنه این تغییر نوع رو به طور صریح به کامپایلر بفهمونین
امید وارم کافی بوده باشه:اشتباه:

Arash.Net
یک شنبه 06 بهمن 1387, 11:53 صبح
obscure (http://barnamenevis.org/forum/member.php?u=77507) جان ممنون از توضیحت :لبخندساده:- میدونم الان شاید میگین این دیگه کیه خیلی خنگه ولی واقیتش من با کتاب سی پلاس پلاس جعفر نژاد قمی دارم میخونم و در این کتاب جز cin و cin.get چیز دیگری ننوشته واسه دستورات ورودی ولی میان مثال ها میبینی مثلا از getche استفاده کرده بدونه هیچ توضیحی که اصلا این چیه...

در فصل اول کتاب گفته آره یه cin.get هست ولی توضیح دیگری نداده حتی نگفته که این cin.get رو تو فصل 4 توضیح دادم

در مورد getch و getche هم هیچ چی ننوشته با اشاره شما به این 2 تا تابع یادم اومد که کجا دیدم رفتم سر کتاب زبان سی جعفر نژاد قمی دیدم اونجا مفصل بحث کرده در موردشون - من این کتابو سال 85 مطالعه کردم و بنا به دلایلی نتونستم ادامه بدم ولی الان تصمیمم جدیه که زبان سی پلاس پلاس رو یاد بگیرم

من در کل با راهنمایها و اشاره های شما دوستان دارم یاد میگیرم و در این وسط شاید چیز هایی از گذشته یادم بیاد که اونم به لطف شماست :بوس:

امیدوارم این محبتتون رو از من دریغ نکنید و همیشه کمکم کنید تا منم بتونم یه کم خودمو بکشم بالا


C_Sharp_Dot_Net (http://barnamenevis.org/forum/member.php?u=91410) جان توضیح جامعی دادید که خیلی خوب و جالب بود و همچنین ساده و روان توضیح دادین که با یه بار خوندن مطلب جا میوفته از شما هم سپاس گذارم- لطف کردین :قلب:

و در کل از تمام دوستان متشکرم و امیدوارم در ادامه این تاپیک یا تاپیک های دیگر اگه مشکلی برام پیش اومد راهنماییم کنن

این تاپیک علاوه بر این که مشکل من رو راه می اندازه قطعا نیز برای دیگر افراد مبتدی که در اینگونه موارد مشکل دارن میتونه خیلی مفید باشه و در آینده کمک حال خیلی ها باشه که در همچین موارد ریز مشکل دارن


متشکرم

arsen sepiany
پنج شنبه 10 دی 1388, 01:12 صبح
سلام دوستان یه سوال خیلی خیلی فوری درباره جدا سازی رشته ها با for داشتم کسی میتونه کمکم کنه