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

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

saalek

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

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

با سلام.
كد را ارسال كردم.

a1.gif

.
 

Arash_j13

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

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

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

جوابشش رو جمعه می زارم هر چهار تا تمرین رو با هم



در ضمن فکر کردم فقط سوال دادن خوب نباشه یکم برنامه ها رو هم نقد کنیم
برای شروع باهمین کدی که بالا نوشتید شروع می کنیم

کد:
#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();
}


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

مثلا هیچ دلیل قانع کننده ای وجود نداره که شماره حلقه یه متغییر جهانی باشه


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

و دومی رو خودتون چند خط پایین تر مقدارش رو عوض می کنید و به مقدار قبلی کاری ندارید


بقیه کد رو بعدا نقدر می کنم دوستان هم اگه وارد بحث بشن خیلی خوبه



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

موفق باشید
 

saalek

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

Arash_j13

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

این رشته رو در نظر بگیردید
ABCBA

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


این کار رو باید اینقدر انجام بدید که طول رشته کوچکتر از دو بشه
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
به نقل از Arash_j13 :
این رشته رو در نظر بگیردید
ABCBA

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


این کار رو باید اینقدر انجام بدید که طول رشته کوچکتر از دو بشه
با سلام.
با تابع بازگشتي ، همان طور كه فرموده بوديد ، حل كردم و فرستادم.

a2.gif

.
 

Arash_j13

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

مرتب کردنradix sort
کد:
#include <iostream>
#include <conio.h>

using namespace std;


inline int getdigit(int,int);
void sort(int *,int,int=1);

const int Max_array=5; //size of array

int main(int argc, char* argv[])
{

    int n[Max_array]={9,3,2,10000,1};

	sort(n,Max_array); //sort array
            //and echo it
	for(int i=0;i<Max_array;i++)
		cout<<n[i]<<endl;
	getch();
	return 0;
}

void sort(int * a,int size,int n) // n =1 or 10 or 100 or ... defualt value is one
{
	int count[10]={0}, //keep count of every digit
        nums[10][Max_array]={0};  // save number in this matrix

	bool Continue=false;  // if exist any digit this varible is true


	for(int i=0,d ; i < size ; i++)
	{
	   d=getdigit(a[i],n);  //get current digit
	   Continue=Continue || (a[i]/(n*10)); // if a[i] have other digit  a[i]/(n*10) if true
                                            // and coutinue is true
	   nums[d][count[d]++]=a[i];            //save number if matrix and increase
                                            //count of this is count[] array
	}

        //put array into a[] from nums[][]
	for(int i=0,k=0; i < 10; i++) //for 0 to 10
		for(int j=0;j<count[i];j++) //for 0 to count of every digit
			a[k++]=nums[i][j];       //copy mun[i][j] to a[k] and inc k

    if (Continue)
		sort(a,size,n*10);  //sort array for next digit

}

inline int getdigit(int n,int exp)
{

    /*
       example
       n=12345 and exp=1000=10^4 (4th digit)
       12345/1000=12
       and 12 % 10 =2
    */
	return (n/exp)%10;
}
//---------------------------------------------------------------------------

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

کد:
#include <iostream>
#include <conio.h>
using namespace std;

int find(const char *const ,const char *const);
int main()
{
    //declare two string for test function
	char *s1="It is test".,
         *s2="test";

            //call function and echo its result
	cout<<find(s1,s2);

	getch();
	return 0;
}//end of main

int find(const char *const  str1,const char *const str2)
{
    const char *p1, //move in str1
               *p2, //mov in str2
                *result; //index of str2 in str1

    for(p1=str1,p2=str2; *p1 && *p2; ) // loop until str1==NULL or str2==NULL
    {
        if(*p1==*p2)
        {
            if(p2==str2)     // if p2  in first of str2
                result=p2;   //copy p2 in result
            ++p1;           //and increase p1 and p2
            ++p2;
        }
        else if(p2!=str2)   // if p2 is not in first of str2
            p2=str2;        // return p2 to first of str2 for next step
                            //and don`t increase p1
        else
            ++p1;          // go to nest character
    }//end of
    if(*p2)                // if str2 don`t exist in str1 (when *p2 is not NULL)
        return -1;         //return -1 to caller
    else
        return result-str1; //result point to first character of str2 in str1 and
                            //str1 point to first character of first string
}
 

Arash_j13

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

کد رو دوباره می نویسم
کد:
#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();
}

روشی که برای پیدا کردن طول رشته به کار برید جوب نیست استفاده از break در برنامه زیاد جالب نیست و باید سعی کرد کمترین استفاده از اون رو انجام داد حلقه for در سی به قدری قدرتمند هست که به تنهایی تمام نیاز ما رو بر طرف کنه

کد رو اگه این طوری بنویسید خیلی بهتره

کد:
int len;
for(len=0; str[len] ; ++len);

--len;

این یه حلقه for بدون بدنه است شرطی که شما با if گذاشته بودید من به داخل حلقه بردم تا کارایی بهتر بشه


اما درمورد کپی کردن یه رشته توی یکی دیگه هم فقط حلقه for به تنهایی کافیه
این طوری

کد:
for(int i=0; str1[i]=str2[i] ; ++i);
دقت کنید که من به جای عملگر تساوی از عملگز انتصاب استفاده کردم و این حلقه کاراکتر ها رو تا وقتی که به نال برسه کپی می کنه و خود نال هم کپی می شه

در مورد for سومی خودتون سعی کنید یه نوع بهترش رو بگید

موفق باشد
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
به نقل از Arash_j13 :
در اخر هم به عنوان سوال این هفته یه ارایه دو بعدی مثلا 5 در 5 رو از ورودی بخونید یا به صورت رندوم پر کنید و بعد مرتبش کنید مرتب کردن به این صورت که کوچکترین عدد رو در خونه 0 0 و بزگرترین رو در خونه 5 5 و مابقی رو به صورت صعودی ما بین اینها بزارید


با سلام.
جواب را ارسال كردم.

b3.gif

 

Arash_j13

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

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



int main()
{
const int arraysize=5;
int my_array[arraysize][arraysize]={ {22,34,5,6,27},
											 {3,21,55,120,1},
											  {99,86,25,8,51},
											  {122,1500,354,1000,200},
											  {33,156,345,985,450}
											};
//clrscr();
	 cout<<endl<<endl<<"============== adade avalieh =========================="<<endl;
for (int i=0;i<arraysize;i++)
  for (int j=0;j<arraysize;j++)
  {
  if (j==0) cout<<endl;
		 cout<<setw(j*2+5)<< my_array[i][j];
  }

		 for (int i1=0;i1<arraysize ;i1++)
			 for (int j1=0;j1<arraysize ;j1++)

			 for (int i2=0;i2<arraysize ;i2++)
				for (int j2=0;j2<arraysize ;j2++)
				if (  my_array[i2][j2]>my_array[i1][j1]  )
				 {
				 int my_temp;
				 my_temp=my_array[i1][j1];
				 my_array[i1][j1]=my_array[i2][j2];
				 my_array[i2][j2]=my_temp;
				 }
cout<<endl<<endl<<"============== adad be tartibe so,oodi ==============="<<endl;
				 for (int i=0;i<arraysize;i++)
				 for (int  j=0;j<arraysize;j++)
			  {
			  if (j==0) cout<<endl;
			  cout<<setw(j*2+5)<< my_array[i][j];
			  }
	  getch();
}
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
کد:
#include <iostream.h>
#include <conio.h>
long my_number;
int barasi;
char c;
void main()
{
while(c != 'q')
	 {
	 barasi=0;
cout<<"give me the number"<<endl;
cin>>my_number;
cout<<"your number is "<<my_number<<endl;
for (long i=my_number-1;i>1;i--)
						{
						if (my_number%i ==0) {
													cout<<"           bar "<<i<<"  bakhsh pazir ast"<<endl;
													barasi=1;
													}
						}
if (barasi==1) cout<<"so your number IS NOT primary"<<endl;
if (barasi ==0) cout<<"your number IS  primary"<<endl;
		cout<<"                 q -> quit / anykey -> repeat"<<endl;
		c=getch();
	 }
}

يكي از دوستان خواست برنامه اي بنويسم كه يك عدد را بگيره و بگه اول هست يا نه.
من برنامه بالا را نوشتم.
هر اشكالي مي بينيد بفرماييد.
.
 
بالا