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

تمرین هایی برای سی++

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
کد:
#include <stdio.h>
#include <iostream.h>
#include <conio.h>

char I2C(int i);
int C2I(char a);
int str2num(char *p,int mab);
void getstr(char *p,int mab);
void msg();

void main(){
   int num_org,num,i,j,k,b,r,mab_sec,mab_org;
   char num_str[100];
   char tem_str[100];
   char a;
   clrscr();
   //get org num base mode
   cout<<"Please enter Number base mode:(10) ( 2>,<16 ):";
   getstr(&tem_str[0],10);
   if (tem_str[0]!='\0')
      mab_org=str2num(&tem_str[0],10);
   else
      mab_org=10;
   if (mab_org<2 || mab_org>16) {msg();return;}

   //get org num base mode
   cout<<"Now. Please enter Number :";
   getstr(&num_str[0],mab_org);
   if (num_str[0]=='\0') {msg();return;}
   num_org=str2num(&num_str[0],mab_org);

   //get output base mode
   cout<<"Please enter output base mode (10) ( 2>,<16 ):";
   getstr(&tem_str[0],10);
   if (tem_str[0]!='\0')
      mab_sec=str2num(&tem_str[0],10);
   else
      mab_sec=10;
   if (mab_sec<2 || mab_sec>16) {msg();return;}

   // start calculating
   num=num_org;
   i=0;
   for (;num>=mab_sec;){
     num/=mab_sec;
     i++;}
   cout<<I2C(num);
   for(j=i;j>0;j--){
     num=num_org;
     for(k=0;k<j;k++){
       b=num%mab_sec;
       num/=mab_sec;
       }
     cout<<I2C(b);
     }
   getch();
}

char I2C(int i){
   char a;
   i+=0x30;
   if (i>0x39) i+=7;
   a=i;
   return a;
}

int C2I(char a){
   int i;
   i=a;
   i-=0x30;
   if (i>16) i-=7;
   if (i>16) i-=32;
   return i;
}
int str2num(char *p,int mab){
   int numr=0;
   for( int i=0 ;*(p+i)!='\0';i++){
      numr=numr*mab+C2I(*(p+i));
      }
   return numr;
}
void getstr(char *p,int mab){
   char a;
   int sec1=0,sec2=0,sec3=0;
   do {
   a=getche();
   if (mab<=10){
      sec1=(a>47 && a<48+mab);
   }else{
      sec2=(a>64 && a<65+(mab-10));
      sec3=(a>96 && a<97+(mab-10));
      }
   if ( sec1 || sec2 || sec3 )
     *(p++)=a;
   }while (a!=13);
   *p='\0';
   cout<<endl;
}

void msg(){
cout<<endl<<"  **  Error  *****************************************";
cout<<endl<<"  *     Can not accept the number you entered!       *";
cout<<endl<<"  ****************************************************"<<endl;
cout<<endl<<"Press any key to continue..."<<endl;
getch();
}
 

programmer

کاربر تازه وارد
تاریخ عضویت
1 نوامبر 2005
نوشته‌ها
85
لایک‌ها
0
سلام

می بینم که آقا سعید پیش دستی کردن !:D

این هم برنامه من. لطفآ تستش کنید:rolleyes:

من هم برم برنامه سعید رو تست کنم:D

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

int chrtoint(char c)
{
  if((c>='a')&&(c<='f'))
    return c-87;
  else if((c>='A')&&(c<='F'))
    return c-55;
  else if((c>='0')&&(c<='9'))
    return c-48;
  else
    return -1;
}

void ten_to(long int x,int base)
{
  int m,n=0;
  long int save=x;
  while(x>0)
  {
    x=x/base;
    n++;
  }//end of while
  m=n;
  x=save;
  cout<<"\n Answer => ";
  for(int i=1;i<=m;i++)
  {
   for(int j=1;j<=n-1;j++)
      x=x/base;
   cout<<x%base;
   n--;
   x=save;
  }//end of for
}
//------ Main -----
int main()
{
  char a;
  long int x=0;
  int sb,db;
  clrscr();
  cout<<"Enter source base: ";
  cin>>sb;
  if((sb<=1)||(sb>=17))
  {
   cout<<"### Error : Base must be beetween 2 , 16 .";
   getch();
   return 0;
  }
  cout<<"Enter number: ";
  while((a=getch()) != 13)
  {
   if((chrtoint(a) < sb) && (chrtoint(a) != -1))
   {
     cout<<a;
     x=x*sb+chrtoint(a);
   }
  }//end of while
  cout<<"\nEnter destination base: ";
  cin>>db;
  ten_to(x,db);
  getch();
  return 0;
}


اول مبنای اولیه رو وارد میکنیم.

بعد خود عدد رو.

بعد هم مبنایی که میخواهیم عدد را به آن مبنا ببریم.

اینم نمونه اجرا :
 

فایل های ضمیمه

  • a.JPG
    a.JPG
    14.1 KB · نمایش ها: 30

Arash_j13

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

برنامه اقا سعید هم از آرایه استفاده کرده و هم توی خوندن از مبنای 16 مشکل داره عدد a1 رو در مبنای 16 وارد کنید جواب 10 رو می ده

برنامه ی جناب پروگرمر هم توب خوندن از مبنای 16 مشکل داره و موقع نوشتن عدد های بالای ده رو به صورت a تا f نشون نمی ده
 

programmer

کاربر تازه وارد
تاریخ عضویت
1 نوامبر 2005
نوشته‌ها
85
لایک‌ها
0
برنامه ی جناب پروگرمر هم توب خوندن از مبنای 16 مشکل داره و موقع نوشتن عدد های بالای ده رو به صورت a تا f نشون نمی ده

امـــان از پــــیـــری !!!:wacko:

مشکل برنامه تو خوندن از مبنای 16 چیــه؟

این هم برای نشون دادن اعداد بالای 10 به صورت کاراکتری :

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

int chrtoint(char c)
{
  if((c>='a')&&(c<='f'))
    return c-87;
  else if((c>='A')&&(c<='F'))
    return c-55;
  else if((c>='0')&&(c<='9'))
    return c-48;
  else
    return -1;
}

void ten_to(long int x,int base)
{
  int m,n=0;
  long int save=x;
  while(x>0)
  {
    x=x/base;
    n++;
  }//end of while
  m=n;
  x=save;
  cout<<"\n Answer => ";
  for(int i=1;i<=m;i++)
  {
   for(int j=1;j<=n-1;j++)
     x=x/base;
   if((x%base)>=10)
     cout<<(char)((x%base)+55);
   else
     cout<<x%base;
   n--;
   x=save;
  }//end of for
}
//------ Main -----
int main()
{
  char a;
  long int x=0;
  int sb,db;
  clrscr();
  cout<<"Enter source base: ";
  cin>>sb;
  if((sb<=1)||(sb>=17))
  {
   cout<<"### Error : Base must be beetween 2 , 16 .";
   getch();
   return 0;
  }
  cout<<"Enter number: ";
  while((a=getch()) != 13)
  {
   if((chrtoint(a) < sb) && (chrtoint(a) != -1))
   {
     cout<<a;
     x=x*sb+chrtoint(a);
   }
  }//end of while
  cout<<"\nEnter destination base: ";
  cin>>db;
  ten_to(x,db);
  getch();
  return 0;
}
 

Arash_j13

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

کد:
/*
  Name:     Base convertion  
  Copyright: no Copyright
  Author:    Arash J 
  Date: 13/03/06 15:23
  Description: conver number form base n (2 <= n <= 16) to base m ( 2<= m <=16 ) 
*/

#include <iostream>
#include <math.h>
#include <conio.h>

using namespace std;

void print(char);                        //echo digit on screan with numeric format
void DecToMBase(unsigned long int,char);    //convert number from decimal to m base
unsigned long int readNum( char);                           //read number in n base
char readBase(void);                                        //read base

             /**************************
                    main function
               program start from here
            ***************************/

int main(void)
{
    unsigned long int x;
    unsigned short int nbase,mbase;

    cout<<"enter n base :";
    nbase=readBase();
    cout<<"enter your number in "<<nbase<<" :";
    x=readNum(nbase);
    cout<<"enter m base :";
    mbase=readBase();

    DecToMBase(x,mbase);
    getch();
    return 0;
}
                   /*******************************
                            function print
                       echo a digit in screen
                   *******************************/
void print(char c)
{
     if( (c>=0) && (c<=9))
         cout<< static_cast<unsigned int>(c);
     else
         cout<< 'A'+c-10;


}


                /********************************
                       conver base 10 to m
                ********************************/

void DecToMBase(unsigned long int x,char m)
{
    long int p=0,i,k;
    while (x>=m)
      for(i=0; ;i++)
        if(x < pow(m,i))
        {
             k=static_cast<long int>(floor(x/pow(m,i-1)));
             x%=static_cast<long int>(ceill(pow(m,i-1)));
             for(int j=1; j < p-i ;j++)
                 print(0);
             print(k);
             p=i;
             break;
        }
    //end of while loop

    for(int j=1; j < p-1; j++)
       print(0);

    print(x);

}

                /********************************
                     read number in n base
                ********************************/

unsigned long int readNum(char base)
{
      unsigned long int num=0;
      for (char ch=0, i=0; ch!=13 ;i++)
      {
          ch=getch();
          if ( (ch>='0') && (ch<=base+'0'-1) && (base<=10) )
          {
               num *=base;
               num += (ch-'0');

          }
          else if ( ( (ch>='0') && (ch<='9')  ) &&
                    ( (base>=10)&& (base<=16) ) )
          {
               num *=base;
               num += (ch-'0');
          }
          else if ( (ch>='A') && (ch <='A'+base-11) &&
                    (base>=11)&& (base<=16) )
          {
               num *=base;
               num += (ch-'A'+10);
          }
          else if ( (ch>='a') && (ch <='a'+base-11) &&
                    (base>=10)&& (base<=16) )
          {
               num *=base;
               num += (ch-'a'+10);
          }
          else if (ch==13);
          else
              ch='\a';

          cout<<ch;
      }
      cout<<endl;
      return num;
}

                /********************************
                  read base ( 2 <= base <= 16)
                ********************************/

char readBase(void)
{
       int base;
       cin>>base;
       while ( !( (base  >=2 ) && (base<=16) ) )
       {
            cout<<"\a"<<endl<<"Base not suport enter again :";
            cin>>base;
       }

       return base;
}
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
کد:
#include <stdio.h>
#include <iostream.h>
#include <conio.h>

char I2C(int i);
int C2I(char a);
int getnum(int mab);
void msg();

void main(){
   int num_org,num,i,j,k,b,mab_sec,mab_org;
   char a;
   clrscr();
   //get org num base mode
   cout<<"Please enter Number base mode:(10) ( 2>,<16 ):";
   mab_org=getnum(10);
   if (mab_org==0) mab_org=10;
   if (mab_org<2 || mab_org>16) {msg();return;}

   //get org num base mode
   cout<<"Now. Please enter Number :";
   num_org=getnum(mab_org);
   if (mab_org==0) {msg();return;}

   //get output base mode
   cout<<"Please enter output base mode (10) ( 2>,<16 ):";
   mab_sec=getnum(10);
   if (mab_sec==0) mab_sec=10;
   if (mab_sec<2 || mab_sec>16) {msg();return;}

   // start calculating
   num=num_org;
   i=0;
   for (;num>=mab_sec;){
     num/=mab_sec;
     i++;}
   cout<<I2C(num);
   for(j=i;j>0;j--){
     num=num_org;
     for(k=0;k<j;k++){
       b=num%mab_sec;
       num/=mab_sec;
       }
     cout<<I2C(b);
     }
   getch();
}

char I2C(int i){
   char a;
   i+=0x30;
   if (i>0x39) i+=7;
   a=i;
   return a;
}

int C2I(char a){
   int i;
   i=a;
   i-=0x30;
   if (i>16) i-=7;
   if (i>16) i-=32;
   return i;
}

int getnum(int mab){
   int intTemp=0;
   char a;
   int sec1=0,sec2=0,sec3=0;
   do {
   a=getch();
   if (mab<=10){
      sec1=(a>47 && a<48+mab);
   }else{
      sec1=(a>47 && a<48+10);
      sec2=(a>64 && a<65+(mab-10));
      sec3=(a>96 && a<97+(mab-10));
      }
   if ( sec1 || sec2 || sec3 ) {
     intTemp=intTemp*mab+C2I(a);
     cout<<a;
     }
   }while (a!=13);
   cout<<endl;
   return intTemp;
}

void msg(){
cout<<endl<<"  **  Error  *****************************************";
cout<<endl<<"  *     Can not accept the number you entered!       *";
cout<<endl<<"  ****************************************************"<<endl;
cout<<endl<<"Press any key to continue..."<<endl;
getch();
}
 

Arash_j13

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

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
برنامه ای بنویسید که 512 بایت اولیه یک فلاپی درایو رو خونده و بصورت هگزه و کارکتری نمایش دهد
 

Arash_j13

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

Arash_j13

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

mohammad_110

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
22 ژانویه 2006
نوشته‌ها
60
لایک‌ها
0
به نقل از Arash_j13 :
سوال آقا سعید زیادی سخته یکم بیشتر وقت می خواد ولی فعلا برای نخوابیدن تاپیک یه سوال آسون داشته باشید
برنامه ای بنویسید که غربال اراتستل رو بر روی بازه ای از اعداد که ممکنه خیلی زیاد هم باشن در حدود ملیارد انجام بده و هر مرحله نتیجه رو چاپ کنه

این قربال اراتستل یعنی چه؟:wacko:
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
غربال اراتسل یه الگوریتم برای پیدا کردن اعداد اول بین 1 تا n هست
روشش این طوری
1. تمام اعدا را می نویسیم
2. عدد یک اول نیست ان را خط می زنیم
3. اولین عددی که خط نخورده اول هست دور ان یک دایره می کشیم
4. تمام مضارب عدد اولی که در مرحله قبل پیدا شد اول نیستید انها را خط می زنیم
5. دو باره به مرحله 2 برگشته و این کار را تا آنتهای اعداد انجام می دهیم

تمام اعداد اول بین یک و N پیدا می کنیم
 

Arash_j13

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

برنامه ای بنویسید که یک عبارت محاسباتی شامل اعادا صحیح عملیات چهار گانه +-*/ را از کاربر دریافت کند این عبارت می تواند شامل پرانتز نیز باشد بعد نتیجه عبارت رو محاسبه و گزارش کنه فرض کنید که کاربر عبارت رو درست وارد کرده
و اشتباه سینتکسی در رون عبارت وجود نداره

عبارت می تواند چنیم شکلی داشته باشد
کد:
1+(162+3*(5-1)/(6+7)*5-11)*(7+(8*2)/2))+10
 

mohammad_110

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
22 ژانویه 2006
نوشته‌ها
60
لایک‌ها
0
به نقل از Arash_j13 :
اگه اینجوری پیش بره باید در اینجا رو تخته کرد ولی تا اون موقع این هم یه تمرین دیگه

برنامه ای بنویسید که یک عبارت محاسباتی شامل اعادا صحیح عملیات چهار گانه +-*/ را از کاربر دریافت کند این عبارت می تواند شامل پرانتز نیز باشد بعد نتیجه عبارت رو محاسبه و گزارش کنه فرض کنید که کاربر عبارت رو درست وارد کرده
و اشتباه سینتکسی در رون عبارت وجود نداره

عبارت می تواند چنیم شکلی داشته باشد
کد:
1+(162+3*(5-1)/(6+7)*5-11)*(7+(8*2)/2))+10

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

در ضمن این مثال قبل از 10 یک پرانتز اضافه داره . درستش اینیه که توی برنامه است.

کد:
#include<stdio.h>
#include<conio.h>
#include<ctype.h>

char strMath[]="1+(162+3*(5-1)/(6+7)*5-11)*(7+(8*2)/2)+10";

float calculate(int);

void main(void){
 clrscr();

 printf("%f",calculate(0));

 getch();
}

float calculate(int y){
 static int x=0;
 int a=0;
 float ans=0,sen=1,num;

 while(strMath[x]!='\0' && strMath[x]!=')'){

   num=0;
   if(isdigit(strMath[x])){
     num = strMath[x]-48;

     while(isdigit(strMath[x+1])){
       num = num*10 + strMath[x+1]-48;
       x++;
     }
   }

   if(isdigit(strMath[x])){
     if(a==0||a==1) sen*=num;
     if(a==2) sen/=num;
     a=0;
   }
   else{
     switch(strMath[x]){
       case '+':
	  if(x!=y) ans+=sen;
	  sen=1;
	 break;
       case '-':
	  if(x!=y) ans+=sen;
	  sen=-1;
	 break;
       case '*':
	  a=1;
	 break;
       case '/':
	  a=2;
	 break;
       case '(':
	  x++;
	  if(a==0||a==1) sen*=calculate(x);
	  if(a==2) sen/=calculate(x);
	  a=0;
	 break;
     }
   }
   x++;
 }
 ans+=sen;
 return ans;
}
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
خیلی عالی بود منم راه حلم رو می نویسم البته راه حل شما بهینه تره
کد:
#include <iostream>
#include <conio.h>
#include <string>
#include <vector>
#include "oper.h"
#include "func.h"
using namespace std;

long int calculate( string &);
int main(void)
{

	string str;
	cout<<"enter your expression\n\t\t\t";
	cin>>str;
	cout<<calculate(str);
     getche();
     return 0;
}

long int calculate(string &str)
{
     vector<oper> op;
     vector<long int>  num;
     bool nofirst=false;
     int n=0;
     

     for(string::iterator p=str.begin(); p!=str.end(); p++)
     {
        if(isoper(*p))
        {
          op.push_back(*p);

          if(nofirst)
          {
              num.push_back(n);
              n=0;
          }

        }
        else if (isnum(*p))
        {

            add2num(*p,n);
            nofirst=true;
        }
		else if (isParenthes(*p))
		{
			string tmp;  //kepp string bitween parentheses
			int count=1; //count of open parentheses 
			for(p+=1; count>0  ;p++)
			{
				switch(*p)
				{
				case ')':
					--count;
					break;

				case '(':
					++count;
					break;
				}

				if (count)
					tmp+=*p;

			}
			//num.push_back(calculate(tmp));
			n=calculate(tmp);
			--p;

		}
     }
     num.push_back(n);
     
	 int j=0;
     for(int i=0; i<op.size(); i++)
     {
         if(op[i]>=op[i+1])
         {
             ++j;
             num[j]= (op[i])(num[j-1],num[j]);


         }
         else
         {
            j+=2;
			num[j]=op[i+1](num[j-1],num[j]);
            num[j]=op[i](num[j-2],num[j]);
            ++i;

         }


     }

     return num[j];
}
کد:
#ifndef _oper_
#define _oper
class oper
{
      public:

          oper():data('+'){};
          oper(char a):data(a){};
          char getdata(){return data;}
          bool operator < (char);
          bool operator < (const oper &);
          bool operator > (char);
          bool operator > (const oper &);
          bool operator ==(char);
          bool operator ==(const oper &);
          bool operator !=(char);
          bool operator !=(const oper &);
          bool operator >=(char);
          bool operator >=(const oper &);
          bool operator <=(char);
          bool operator <=(const oper &);
          oper operator = (char);
          oper operator = (const oper &);
          long int operator()(long int,long int);
          operator char();
      private:
         char data;
};


bool oper::operator <(char ch)
{
     switch(ch)
     {
        case '+':
        case '-':
             return false;
        case '*':
        case '/':
             switch (data)
             {
                case '+':
                case '-':
             		 return true;
                case '*':
                case '/':
                   return false;
             }
       default :
           return false;
     }

}


bool oper::operator <(const oper &ch)
{
     return *this < ch.data;
}

bool oper::operator >(char ch)
{
    return !(*this < ch) && *this !=ch;
}

bool oper::operator >(const oper &ch)
{
     return *this > ch.data;
}

bool oper::operator ==(char ch)
{
     switch (ch)
     {
        case '+':
        case '-':
             switch(data)
             {
                  case '+':
                  case '-':
                      return true;
                  case '*':
                  case '/':
                      return false;
             }
        case '*':
        case '/':
             switch(data)
             {
                  case '+':
                  case '-':
                      return false;
                  case '*':
                  case '/':
                      return true;
             }

        default:
             return false;
     }

}

bool oper::operator==(const oper &ch)
{
     return *this == ch.data ;
}

bool oper::operator !=(char ch)
{
    return !(*this == ch);
}

bool oper::operator !=(const oper &ch)
{
   return *this!=ch.data;
}

bool oper::operator<=(char ch)
{
    return *this < ch || *this==ch;
}

bool oper::operator<=(const oper &ch)
{
    return *this <= ch.data;
}

bool oper::operator>=(char ch)
{
    return *this > ch || *this==ch;
}

bool oper::operator>=(const oper &ch)
{
    return *this >= ch.data;
}

oper oper::operator=(char ch)
{
     return data=ch;
}

oper oper::operator =(const oper &ch)
{
    return *this=ch.data;
}

long int oper::operator()(long int op1,long int op2)
{
     switch (data)
    {
         case '+':
              return op1+op2;
         case '-':
              return op1-op2;
         case '*':
              return op1*op2;
         case '/':
              return op1/op2;
         default:
              return 0;
    }
} 
oper::operator char()
{
    return data;
}
#endif


کد:
#ifndef _func_
#define _func_

bool isoper(char ch)
{
     switch(ch)
     {
         case '+':
         case '-':
         case '*':
         case '/':
            return true;
         default:
            return false;
     }
}

inline bool isnum(char ch)
{
   return  ch>='0' && ch<='9';
}

long int add2num(char ch,int &x)
{
     x*=10;
     return x+=ch-'0';
}


inline bool isParenthes(char ch)
{
	return ch=='(';
}
#endif   //_func_
 

Arash_j13

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

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

برای راحتی n را 10 بگیرید و خانه های بلوکه شده و A B ه رو از کاربر در یافت کنید و مختصات خانه ها جواب به همراه طول مسیر رو چاپ کنید
 

mohammad_110

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
22 ژانویه 2006
نوشته‌ها
60
لایک‌ها
0
به نقل از Arash_j13 :
خب یه تمرین دیگه

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

برای راحتی n را 10 بگیرید و خانه های بلوکه شده و A B ه رو از کاربر در یافت کنید و مختصات خانه ها جواب به همراه طول مسیر رو چاپ کنید

سلام

من یه برنامه نوشتم البته اشکال برنامه ای نداره ولی ... اول برنامه :
کد:
#include<stdio.h>
#include<conio.h>

int board[10][10]={0},Ax,Ay,Bx,By;
int minBoard[10][10]={0},lMin=101;

void getABForbidenPlaces();
void find(int,int,int);

void main(){
  int i,j;
  clrscr();
  getABForbidenPlaces();
  find(Ax,Ay,0);
  clrscr();
  for(i=0;i<10;i++){
    for(j=0;j<10;j++)
      printf("%3d",minBoard[i][j]);
    printf("\n");
  }
  getch();
}

void getABForbidenPlaces(){
  int x,y;
  do{
    printf("Enter A x,y (0<x,y && x,y=<10) : ");
    scanf("%d%d",&x,&y);
    Ax=x;Ay=y;
  }while(x<=0 || x>=10 || y<=0 || y>=10);
  do{
    printf("Enter B x,y (0<x,y && x,y=<10) : ");
    scanf("%d%d",&x,&y);
    Bx=x;By=y;
  }while(x<=0 || x>=10 || y<=0 || y>=10 || board[Bx][By]==1);

  printf("Enter forbiden x,y (for end enter zero or negative numbers) : ");
  scanf("%d%d",&x,&y);
  while (x>0 && x<=10 && y>0 && y<=10 && board[x][y]==0 ){
    board[x][y]=-1;
    printf("Enter forbiden x,y (for end enter zero or negative numbers) : ");
    scanf("%d%d",&x,&y);
  }
}

void find(int x,int y, int l){
  int i,j;
  if(x==Bx && y==By){
    if(l<lMin){
      for(i=0;i<10;i++)
	for(j=0;j<10;j++)
	  minBoard[i][j]=board[i][j];
    }
    return;
  }
  if(x<0 || x>=10 || y<0 || y>=10 || board[x][y]!=0) return;
  board[x][y]=l;
  find(x+1,y  ,l+1);
  find(x  ,y+1,l+1);
  find(x-1,y  ,l+1);
  find(x  ,y-1,l+1);
  board[x][y]=0;
}

ولی چون باید 100^4 حالت را چک کنه یعنی 200^2 یعنی 20^(10^2) یعنی تقریبا 20^(1000) یعنی 60^10 حالت که اگر بر فرض محال کامپیوتر بتونه 6^10 حالت در ثانیه رو چک کنه حدود 317 روز طول میکشه .:lol: :blink: :wacko:

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

mohammad_110

کاربر فعال برنامه نویسی
کاربر فعال
تاریخ عضویت
22 ژانویه 2006
نوشته‌ها
60
لایک‌ها
0
خوب راستی منم یک سئوال بگم .

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

سئوال اینه که دو تا رشته داریم که در این دو رشته دو عبارت ریاضی داریم و برنامه باید تشخیص بده که این دو رشته از لحاظ عبارت ریاضی با هم معادل هستند مثل:
کد:
(a+b-c)*2
(a+a)+(b*2-(3*c)+c
که با هم معادل هستن و برنامه باید yes چاپ کنه .

قواعد کار:
1- دو تا رشته لازم نیست از کاربر گرفته بشند و می تونند بصورت متغییر داخل برنامه تعریف بشند.
2- طول رشته ها حداکثر 80 کاراکتر هست و کاراکتر space یا فضای خالی بین کاراکتر ها وجود ندارد.
3- متغییر های عبارت ریاضی یک حرفی هستند.
4- اعداد تک رقمی هستند.
5- پرانتز های چپ و راست مجاز هستند
6- عملگرهای +و - و * استفاده می شوند (توجه کنید که تقسیم نداریم)
7- هر کدام از رشته ها صرفنظر از معادل بودن یا نبودن با دیگری دارای خطای ریاضی نیستند .(مثلا از لحاظ مساوی بودن پرانتز های باز و بسته و... و احتیاجی به چک کردن ندارند.)

یک مثال دیگه :
کد:
(a+b)*(a+b)
-2*a*b+b*b+a*a+4*a*b
که باید بتونه تشخیص بده این دو عبارت با هم معادل هستند و yes چاپ کنه.
 

Arash_j13

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

من یه برنامه نوشتم البته اشکال برنامه ای نداره ولی ... اول برنامه :
کد:
#include<stdio.h>
#include<conio.h>

int board[10][10]={0},Ax,Ay,Bx,By;
int minBoard[10][10]={0},lMin=101;

void getABForbidenPlaces();
void find(int,int,int);

void main(){
  int i,j;
  clrscr();
  getABForbidenPlaces();
  find(Ax,Ay,0);
  clrscr();
  for(i=0;i<10;i++){
    for(j=0;j<10;j++)
      printf("%3d",minBoard[i][j]);
    printf("\n");
  }
  getch();
}

void getABForbidenPlaces(){
  int x,y;
  do{
    printf("Enter A x,y (0<x,y && x,y=<10) : ");
    scanf("%d%d",&x,&y);
    Ax=x;Ay=y;
  }while(x<=0 || x>=10 && y<=0 && y>=10);
  do{
    printf("Enter B x,y (0<x,y && x,y=<10) : ");
    scanf("%d%d",&x,&y);
    Bx=x;By=y;
  }while(x<=0 || x>=10 && y<=0 && y>=10);

  printf("Enter forbiden x,y (for end enter zero or negative numbers) : ");
  scanf("%d%d",&x,&y);
  while (x>0 && y>0){
    board[x][y]=-1;
    printf("Enter forbiden x,y (for end enter zero or negative numbers) : ");
    scanf("%d%d",&x,&y);
  }
}

void find(int x,int y, int l){
  int i,j;
  if(x==Bx && y==By){
    if(l<lMin){
      for(i=0;i<10;i++)
	for(j=0;j<10;j++)
	  minBoard[i][j]=board[i][j];
    }
    return;
  }
  if(x<0 || x>=10 || y<0 || y>=10 || board[x][y]!=0) return;
  board[x][y]=l;
  find(x+1,y  ,l+1);
  find(x  ,y+1,l+1);
  find(x-1,y  ,l+1);
  find(x  ,y-1,l+1);
  board[x][y]=0;
}

ولی چون باید 100^4 حالت را چک کنه یعنی 200^2 یعنی 20^(10^2) یعنی تقریبا 20^(1000) یعنی 60^10 حالت که اگر بر فرض محال کامپیوتر بتونه 6^10 حالت در ثانیه رو چک کنه حدود 317 روز طول میکشه .:lol: :blink: :wacko:

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

من یه برنامه نوشتم فقط 4 ثانیه زمان می برد استادمون گفت اصلا خوب نیست مال شما که دیگه...

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

Arash_j13

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

یه تمرین هم من می گم از کتاب C++ How to program فصل آرایه ها

چه جوری می شه توی یه صفحه شطرنج با یک اسب طی 64 حرکت تمام خونه ها صفحه رو طی کرد

یه راهنمایی هم داره توی کتاب اون رو هم می گم

باید سعی کنید به خونه هایی برید که احتمال رفتن به اونجا کمتره جدول احتمال خونه ها این شکلی هست
کد:
2,3,4,4,4,4,3,2
3,4,6,6,6,6,4,3
4,6,8,8,8,8,6,4
4,6,8,8,8,8,6,4
4,6,8,8,8,8,6,4
4,6,8,8,8,8,6,4
3,4,6,6,6,6,4,3
2,3,4,4,4,4,3,2
 
بالا