• پایان فعالیت بخشهای انجمن: امکان ایجاد موضوع یا نوشته جدید برای عموم کاربران غیرفعال شده است

تمرينهايي براي سي++ از پايه

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
جواب شما درسته ولی فکر کنم من منظورم رو خوب نرسونده بودم هدف من این بود که ارایه رو بگیرید و تعداد تکرار اعضا داخلش رو شمارش کنید ولی به هر حال این جواب شما درسته

یه تمرین دیگه برای کار با آرایه ها
تعداد 40 عدد رو از کاربر بگیرید بعد تمام عدد هایی که از میانگین کوچکتر هستن رو از درون این ارایه حذف کنید فقط مجاز به استفاده از یک ارایه هستید
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
تابع rand یه عدد تصادفی بر می گردونه فقط یه مشکلی هست اون هم اینکه این عدد تصادفی همیشه همونیه که بوده یعنی با هر بار اجرای برنامه این عدد تغییر نمی کنه بزارید برای فهم بهتر این جوری شبیه سازی کنم که
کامپیوتر یه دنباله از اعداد تصادفی تولید می کنه و تابع رند هر سری یکی از جملات این دنباله رو بر می گردونه و دفعه بعد جلمه بعدی رو بر می گردونه ه سری که برنامه شروع بشه شما بر می گردید به نقطه شروع و در نتیجه همون عدد قبلی رو بر می گدونه برای اینکه این اتفاق نیفته ما می تونیم به جای شروع از ابتدای دنباله از یه جای دیگه شروع کنیم این وظیفه تابع srand هست که جلمه شروع رو به جای 1 یه عدد دیگه بزاره ولی باز هم یه مشکلی هست اگه این نقطه شروع هر دفعه ثابت باشه مثلا 10 باز هم جملات از جمله ی دهم بر می گرده پس بار هم تکرای می شه برای حل این مشکل ما با تابع time زمان رو بدست می یاریم و به عنوان جمله شروع می دیم به تابع srand در نتیجه چون هر سری زمان فرق می کنه جمله شروع هم متفاوت می شه
 

Arman_BTC

کاربر تازه وارد
تاریخ عضویت
28 فوریه 2006
نوشته‌ها
138
لایک‌ها
1
سلام
کلی روش فکر کردم امیدوارم درست باشه.چون تریس کردن 40 تا عدد طولانی بود من با 10 تا عدد گرفتم
کد:
 #include<iostream.h>
int main (){
int a[10];
float avg,sum=0;
int c=0;
for(int i=0;i<10;i++){
cin>>a[i];
sum+=a[i];
}
avg=sum/10.0;
cout<<"Avrage is:"<<avg<<"\n";
for(i=0;i<10;i++){
if(a[i]<avg){
c++;
for(int j=i;j<10;j++)
a[j]=a[j+1];
i--;}}
for(i=0;i<10-c;i++)
cout<<a[i]<<"  ";
return 0;
}
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
من اون تمرین گرفتن یه رشته و چاپ معکوس رو برای کار کردن با توابع بازگشتی گفته بودم نه با اسمبلی البته روش اسمبلی اشتباه نیست ولی خوب هم نیست اینجوری می شه اون برنامه رو بدون استفاده از اسمبلی انجام داد
کد:
#include <conio.h>

void ReadAndEcho(void);
int main(void)
{
   ReadAndEcho();
	getch();
   return 0;
}

void ReadAndEcho(void)
{
    char ch;
    ch=getche();
    if ( ch!=13)
	    ReadAndEcho();
    else
      ch='\n';
    putch(ch);
}
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
بر نامه ای که آرمان خان نوشتن درسته ولی بهترین برنامه ای نیست که می شه نوشت من عمدا چهل رو گفتم تا یکم طولانی بشه و از این راه استفاده نکنید حالا فرض کنید این مسئله برای 10000 عدد باشه اون وقت چی فکر می کنید با این روش چقدر طول می کشه؟
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
با سلام و تشكر.
چون من فكر مي كردم تمرينات در سطح ساده است تا قيامت هم اگه فكر مي كردم به ذهنم نمي رسيد كه بايد با تابع بازگشتي حل كنم. چون در دسته بندي من تابع بازگشتي جزو كارهاي پيشرفته است. در دسته بندي شما شايد جزو ابزارهاي دم دستي.
--------------------------------
آرش جان من براي حل يك تمرين ساده هميشه ساعتها مجبورم وقت بگذارم. رعايت حال ما را بكن.
يك چيزي توي مايه هاي چاپ
hello c
و يك كم بالاتر بده.
.
********************************
********************************
بعد مدتي فكر و كار با برنامه شما:
تا آنجا كه من مي دانم توابع ، متغيرهاي موقتي خود را در پشته نگهداري مي كنند. يعني شما هم در حقيقت كاراكترهاي وارد شده توسط كاربر را در پشته ذخيره كرده ايد.
راستش من بعد اينكه جوابم را فرستادم ، خواستم با روش ديگري حل كنم. ولي با خودم گفتم به غير از پشته كجا ميشه نگه داشت اين اطلاعات را؟
با اشاره گر كلي ور رفتم ولي به نتيجه نرسيدم. حتي گفتم صفحه نمايش را بخوانم و چاپ كنم . چون خودش بهر حال حافظه اي داره و قابل دسترسي است. ولي راه خنده داري ميشد. و يا مجبور بوديم كاربر را محدود كنيم در محل و نوع كاراكترهاي وارد شده يا برنامه پيچيده اي مي نوشتيم براي تجزيه تحليل محتويات صفحه نمايش.
== == = = ==== = =
ولي در مقايسه روش من و روش شما:
درسته كه هر دو از پشته استفاده كرديم. ولي اگر من درايت كامل نداشته باشم كه در سي از پشته چه استفاده اي ميشه(كه ندارم) كار خطرناكي است دستكاري پشته. و حين ساخت برنامه چندين بار كامپايلر كلا بسته شد.
ولي در روش شما چون با تابع خود سي كار شده ،، ميشه بگيم كه در كار سي دخالت نكرده ايم. و راه منطقي تر و مطمئن تري است.
ولي شايد بشه بگيم كه اگه من كاملا به ماهيت پشته و طرز كارش و استفاده هايي كه سي ازش مي كنه احاطه همه جانبه داشته باشم، ميشه بگيم كه من مجازم كه به طور دستي پشته را دستكاري كنم.
= == == == == = = ==
بهرحال خيلي از ديدن برنامه شما لذت بردم و تابع بازگشتي برايم شيريني تازه اي پيدا كرد.
ولي آن if و else ساختنش ذكاوت خاصي مي خواهد كه از يك lover in c بر مي آيد نه من.
.
 

mohammad_110

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
22 ژانویه 2006
نوشته‌ها
60
لایک‌ها
0
سلام
اینجور که معلومه بنظرم بهتره قبل از جواب نهایی راه حل اصلی گفته بشه بعد یه مدت کوتاه جواب گذاشته بشه . شاید یکی بتونه با راهنمایی حل کنه. البته برای اینکه روند کند نشه همراه با راهنمایی سئوال فعلی، سئوال بعدی گفته بشه.;)
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
هماهنگي اش با آقا وحيد و آقا آرش. ولي به جز آرمان جان كسي جواب نمي ده كه. من هم قلبا با ايشان هماهنگم.:heart:تقسيم كار مي كنيم.:)
.:cool: :cool:
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
ساک جان تابه باز گشتی نسبتا به اسمبلی فکر نمی کنم پیچیده باشه با تمانم خوبی هایی که برای روشی بازگشتی وجود ولی روش شما سریع تر اجرا خواد شد ولی از نظر مهندسی نرم افزار تابع بازگشتی یکی از بهترین روش ها برای قابل فهم کردن برنامه است البته در صورتی که مرتبه زمانی الگوریتم رو بالا نبره که در این مثال نمی بره

در مورد پیشنهاد اقا محمد هم موافقم
راهنمایی برای سوال قبلی
به جای اینکه به عدد هایی که از میانگین کوچکتر هستن توجه کنید به اونهایی که بزرگتر هستن توجه کنید
یعنی به جای حدف کوچک تر ها بزرگتر ها رو حفظ کنید
 

Arman_BTC

کاربر تازه وارد
تاریخ عضویت
28 فوریه 2006
نوشته‌ها
138
لایک‌ها
1
اقا ارش من متوجه نشدم منظورتون چیه؟
شما در صورت سوال گفتید که اعداد کوچکتر رو از ارایه حذف کنید
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
چون به عنوان راهنمايي آقا آرش اين را گفته فكر كنم با گفتن اعداد بزرگتر مي خواسته كه يك الگوريتم بهينه تر را اشاره كنه.
يعني بجاي حذف كوچك ها مثلا بشه نگه داشتن بزرگها.
يك چنين طرحي احتمالا در نظر داشتند ايشان.
.
------------------
من طرحي مثل دفرگ درايوها توسط ويندوز به ذهنم رسيد.
يعني از اول آرايه نگاه كنيم ، اگر جايي كوچكتر داشتيم برويم از آخر آرايه يك بزرگ بياوريم بگذاريم آنجا را پر كنيم. يعني يك بار رصد بشه آرايه نه بارها.
البته به انواع مختلف ميشه رصد و اصلاح آرايه را انجام داد ولي آرش جان اوني منظورشه كه كمترين زمان پردازش را از ((سي پي يو)) بخواهد.
.
 

*NashenaS*

کاربر تازه وارد
تاریخ عضویت
7 مارس 2006
نوشته‌ها
18
لایک‌ها
0
دوستان سلام...
خيلي بحث جالبي دارين...
من هم به مدت 2-3 هفته هست كه به برنامه نويسي علاقه (زوركي) پيدا كردم...:p !
برنامه Microsft Visual Studio 2005 رو با حجم 2.86 GB از اينترنت دانلود كردم و هچنين اينستال كردم اما دستگاه رو مي خابونه!!:(
مي خام ببينم برنامه اي هست كه سبك باشه (حجم كم) و دستگاه رو نخابونه اما در عين حال بشه توش Code و برنامه نوشت و Compile كرد؟ براي C و C++ مي خام.
لينك دانلودش رو لطف مي كنين بي زحمت؟ :blush:
ممنونم :)
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
با سلام و خوش آمد.
يك نگاه به تاپيك كامپايلرها بياندازيد.
http://forum.persiantools.com/showthread.php?t=38228
البته آرش جان وقتي بياد بهتر مي تواند شما را راهنمايي كند ولي تا بياد بگيد چه نوع كامپايلري مي خواهيد . براي كار داسي يا ويندوزي.
.
كلا اگر بخواهي تمريناتي مثل تمرينات اين تاپيك(تمرينهايي براي سي++ از پايه) را حل كنيد. توربو سي هم كافيه كه 3 مگا است و لينك دانلودش در تاپيك كامپايلرهاي سي (پست شماره 29)هست.
كه لينكش را در بالا دادم.
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
سالک جان درست منظورم رو فهمیدی

به دوست ناشناسمون هم خوش امد می گم

من معمولا به همه gcc رو توصیه می کنم شما هم مستثنا نیست یه کلامپایلر اپن سورس و فوق العاده قدرتمند
به همراه یه IDE خوب می تونید از اینجا گیرش بیارید
bloodshed.net/dev/devcpp.html

ولی اگه امکانات دیباگ خیلی بالایی احتیاج دارید بهتره ببرید سراغ Borland Developer Studio 2006

ولی اصلا ویژوال استادیو 2005 رو توصیه نمی کنم حتی ویژوال استادیو 6 هم در حالت معمولی بهتر عمل می کنه
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
حذف کوچکتر از میانگین رو فردا می نویسم اگه می خواد بنویسید عجله کنید
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
به خاطر غیبت چند روزه عذر می خوام
در مورد فرمایشات سالک جان من از این به بعد روز های چهار شبنه دو یا سه تا تمرین می زارم روز های یک شنبه یه راهنمایی می کنم و روز چهار شبنه بعد جوابش رو به همراه تمرین جدید می زارم
به نظرم اگه به تمرین ها بر گردیم بهتره

البته شاید روز هاش بد باشه ولی متاسفانه من بقیه روز ها خیلی سر شلوغه
دوستان جواب تمرین رو پیغام خصوصی بفرستن روز چهار شنبه بعد جواب های همه رو توی تاپیک پست می کنم البته اگه کسی خواست جوابش رو پست نمی کنم

تمرین اول یه روش مرتب سازی برای ارایه ها هست که می خوام برنامش رو بنویسید روش کار اینطوریه
فرض کنید ما این عدد ها رو داریم
کد:
100 , 61, 2  ,4  ,15 , 27 , 11

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

کد:
100 , 61, 11 ,2 , 4 , 15 , 27
دقت کنید عدد هایی که رقم یکانشون یکی هست رو به همون ترتیبی که در ارایه اصلی اومدن اینجا می نویسم مثلا 61 رو قبل از 11

حالا چون بعضی عدد ها رقم ده گاه دارن مرحله دوم قبل رو برای رقم ده گاه انجام می دیم دقت داشته باشد که عدد های تک رقمی رقم دهگانشون صفر هست
کد:
100,  2, ,4 ,11 , 15 ,27 , 61
و چون بعضی عدد ها رقم صد گان دارن مرحله قبل رو برای رقم صد گان تکرار می کنیم و لیست این شکلی می شه
کد:
2, ,4 ,11 , 15 ,27 , 61 ,100

و چون هیچ عدد رقمی بالا تر از صد گان نداره مرتب سازی تمومه و لیست مرتبه

حالا شما برنامه ای بنویسید که ایم روش رو برای یه لیست هزاراتایی از اعداد که به صورت رندم پر شده انجام بده


تمرین دوم
یه تابع نویسید که دوتا رشته دریافت کنه و نوع خوروجش یه عدد صحیح باشه
این تابع باید محل رشته دوم رو توی رشته اول پیدا کنه و بر گردونه البته تا اینجاش زیادی ساده است فقط یه نکته
که نباید از هیچ نوع متغییری به جز اشاره گر استفاده کنید از تخصیص حافظه پویا هم نمی تونید استفاده کنید


جواب اون تمرین حذف گوچتر از میانگین رو هم می زارم

کد:
#include <iostream>
#include <conio.h>
#include <iomanip>

using namespace std;

const int MAX=10;

int main(void)
{
   int n[MAX],j=0,avg;
   for(int i=0 ; i < MAX ; ++i)
   {
      cout<<"enter "<<(i+1)<<"th number: ";
   	cin >> n[i];
      j+=n[i];
   }
   avg=j/MAX;
   j=0;
   for(int i=0 ; i < MAX ; ++i)
      if(n[i]>=avg)
   	n[j++]=n[i];
   for(int i=0 ; i < j ; ++i)
   	cout<<n[i]<<setw(3);
   getch();
   return 0;

}
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
فکر کنم زیادی سخت بود

راهنمایی برای اولی یه اریه در دو بعدی به اندازه 10 برای هر رقم و بعد دیگه اش به اندازه حد اکثر سول ارایه ای که باید مرتب بشه یه اریه یک بعد ده تایی هم در نظر بگیرید برای اینکه از هر رقم چند عدد داریم که مقدار اولیه تمام خونه هاش صفر باشه
بعد اعداد رو به همون صورتی که اومدن توی این آرایه دو بعدی تفکیک کنید مثلا اونهایی که رقم مورد بررسی 0 رو توی سطر 0 قرارا بدید و اونهایی که 2هست رو توی سطر 2 و الی اخر و هر عددی رو هم که می ریزید خونه مربوط به اون رو توی ارایه دومی ییکی افزایش بدید اینکا رو انجام بدید تا تمام اعداد رو بریزید توی ارایه دو بعدی
و تعداد اعداد از هر رقم رو توی ارایه یک بعدی داشته باشید حالا می تونید از اول ارایه دوبعدی شروع کنید و از هر سطر به تعدادی که در ارایه دوم نوشته شده عدد ها رو بخونید و این عدد ها رو توی ارایه اصلی که قرار مرتب بشه بریزید بعد از اتمام این مرحله ارایه بر اساس یک رقم مرتب شده و نوبت به رقم بعدی می رسه به ولسیله یه الگوریتم بازگشتی یا یه حلقه می تونید این کار رو انجام بدید

برای پیدا کردن رشته ای توی رشته ی دیگه

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

چک کنید اگه محتوی که دو اشاره گر بهشون اشاره می کنه برابره مقدا اشاره گر اول رو توی اشاره گر جواب بریزید البته در صورتی که اشاره گر دوم اول رشته باشه بعد اشاره گر ها رو حر کت بدید
اگه متحتوی اشاره گر ها مثل هم نبود دو حالت داره
یا اشاره گر دوم اول رشته دوم یا نیست اگه نبود برگردونیدش به اول رشته و مراحل قبل رو تکراکنید و اگه بود اشاره گر اول رو یکی ببرید جلو و مرحه قیل رو تکرار کنید

این کار ها باید اینقدر انجام بشه که به انتهای یکی از دو رشته برسیم
وقت به انتهایی یکی از دورشته رسید کنترل می کنیم ببینیم به انهتی رشته دوم رسیدیم با نه اگه نرسیده باشیم معنیش اینکه اشاره گر دوم نتونسته تا اخر رشته دوم بره و تمام کارکتر ها رو مقایسه کنه یعنی رشته دوم رو پیدا نکرده تابع یه هدد خطا مثل -1 بر می رگدونه ولی اگه رسیده باشم اشاره گر جواب شروع رشته دوم توی رشته اول رو داره از این اصل که تفاضل رو اشاره گر یه عدد که تعداد بایت ها فاصله بین اونها رو برمی گردونه و اینکه عناصر رشته پشت سر هم می یان استفاده می کنیم و اشاره گری که ابتدای رشته اول رو مشخص می کرد ر از اشاره جواب کم می کنیم تا اندیس شروع رشته دومن رو بدست بیارم

تمیدوارم با این توضیحات بتونید بنویسید
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
با سلام.
آرش جان اولا ممنونم كه باز وقت گذاشتيد.
دوما اگر ميشه جواب ها را اين هفته ندهيد. و با جواب تمرينات اين هفته بگذاريد براي هفته بعد. من اين هفته به علت مشكلات و درگيري به هيچ كاري نرسيدم.
با تشكر.
.
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
چشم

سوالات این هفته

1. یه رشته بگیرید با کمک تونابع بازگشتی بگید این رشته با بر عکسش برابر هست یا نه مثل level برار ولی book برابر نیست


2.یه رشته بگیرید و کلماتش رو بشمارید و اونها رو نمایش بدید

توجه کنید که از توبع کتابخانه ای سی نباید استفاده کنید
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
به نقل از Arash_j13 :
1. یه رشته بگیرید با کمک تونابع بازگشتی بگید این رشته با بر عکسش برابر هست یا نه مثل level برار ولی book برابر نیست
چون روش من چيزي نبود كه شما خواستيد در تاپيك گذاشتم. با تابع بازگشتي هم خيلي كار كردم. بزودي آماده ميشه و مي فرستم.
.
کد:
#include <iostream.h>
#include <conio.h>
      int i,j,barasi=1;
	  char source_word[50]={0};
	  char reverse_word[50]={0};
void main(void)
{
  clrscr();
	 cout<<"give me word   ";
	cin>> source_word;

     for (i=0;i<=100;i++) if (source_word[i]=='\0')  break;
	 i=i-1 ;

	 for (j=0;j<=i;j++)    reverse_word[j]=source_word[i-j];

	 for (j=0;j<=i;j++)  if (source_word[j] != reverse_word[j] )  barasi=0;

	 if (barasi==0) cout<<"source and reverse are NOT equal";
	 if (barasi==1) cout<<"source and reverse ARE equal"  ;
      getch();
}
در برنامه بالا ، دو ارايه تعريف كردم.
تعداد كاراكتر اولي را شمردم و بعد با يك حلقه از انتها در آرايه دوم قرار دادم.
بعد با حلقه بعدي بررسي كردم كه آيا دو رشته با هم برابرند يا نه و بعد اعلام كردم.

s3.gif

.
 
بالا