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

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

mohammad_110

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

یه تمرین هم من می گم از کتاب 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

این روش رو یه جور واضحتر قبلا شنیده بودم که باید به خونه ای رفت که از اون خونه به کمترین خونه های ممکن بشه رفت.
حل مسئله:
(اصل برنامه 20 خطه بقیش کارای گرافیکیه و ... است).
کد:
#include<stdio.h>
#include<conio.h>
#define Cbakg 1
#define Cbakgtxt 2
#define Cbakgshattxt 4
#define Cbakgshatsiah 0
#define Cbakgshatsefid 7
void shat3(int x,int y,int nx,int ny,int tnx,int tny,int cse,int csi)
{
  int i,j,k,l,m=0;
  gotoxy(x,y);
  for(i=0;i<tny;i++)
    for(j=0;j<ny;j++){
      m++;
      for(k=0;k<tnx;k++){
	if((i+k)%2==0)
	  textbackground(cse);
	else
	  textbackground(csi);
	for(l=0;l<nx;l++)
	  cprintf(" ");
      }
      gotoxy(x,y+m);
    }
}

void main()
{
  int sh[12][12]={0};
  int h[8][2]={{2,1},{1,2},{-1,2},{-2,1},{-2,-1},
	       {-1,-2},{1,-2},{2,-1}};
  int k=0,x,y,step=1,xNew,yNew,num,minNum=9,minK;
  int l,i,j;
  char ch;
  textbackground(Cbakg);
  textcolor(Cbakgtxt);
  clrscr();

  /////////////
  //initialize

  for(i=0;i<12;i++){
    sh[i][0]=sh[i][1]=sh[i][10]=sh[i][11]=-1;
    sh[0][i]=sh[1][i]=sh[10][i]=sh[11][i]=-1;
  }
  cprintf("inter x,y ");
  scanf("%d%d",&x,&y);
  x=(x-1)%8+1;
  y=(y-1)%8+1;
  clrscr();
  cprintf("inter x,y  x=%d y=%d",x,y);
  x++;
  y++;
  sh[x][y]=step;

  /////////////////
  //begin calculate

  for(step=2;step<=64;step++){
    minNum=9;
    for(k=0;k<8;k++){
      xNew= x + h[k][0];
      yNew= y + h[k][1];
      if( sh[xNew][yNew] == 0){
	sh[xNew][yNew] = step;
	num=0;
	for(l=0;l<8;l++)
	  if(sh[ xNew + h[l][0] ][ yNew + h[l][1] ]==0) num++;
	if(num<minNum){
	  minNum=num;
	  minK=k;
	}
	sh[xNew][yNew] = 0;
      }
    }
    x= x + h[minK][0];
    y= y + h[minK][1];
    sh[x][y]=step;
  }

  //end calculate
  ///////////////

  ///////////////
  //output

  textcolor(Cbakgshattxt);
  shat3(10,1,8,3,8,8,Cbakgshatsiah,Cbakgshatsefid);
  for(i=0;i<8;i++)
    for(j=0;j<8;j++){
      if((i+j)%2==0)
	textbackground(Cbakgshatsiah);
      else
	textbackground(Cbakgshatsefid);
	gotoxy(j*8+13,i*3+2);
	cprintf("%2d",sh[i+2][j+2]);
    }
  textcolor(Cbakgtxt);
  textbackground(Cbakg);
  gotoxy(20,25);
  cprintf("if you want run step by step press y          ");
  ch=getch();
  if(ch=='y'||ch=='Y'){
    clrscr();
    shat3(10,1,8,3,8,8,Cbakgshatsiah,Cbakgshatsefid);
    textcolor(Cbakgshattxt);
    for(i=1;i<65;i++){
      for(j=0;j<8;j++)
	for(l=0;l<8;l++)
	  if(sh[j+2][l+2]==i){
	    if((l+j)%2==0)
	      textbackground(Cbakgshatsiah);
	    else
	      textbackground(Cbakgshatsefid);
	    gotoxy(l*8+13,j*3+2);
	    cprintf("%2d",i);
	    gotoxy(80,25);
	  }
      ch=getch();
      if(ch=='q'||ch=='Q')break;
    }
  }
}
تابع shat3 کار خاصی انجام نمیده فقط یک صفحه شطرنجی در محیط تکست ایجاد می کشه .
آرایه sh درسته که 12*12 هست ولی در واقع خود صفحه شطرنج هستش که به این صورت مقدار دهی اولیه کردم:
کد:
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,-1,-1
-1,-1,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,-1,-1
-1,-1,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,-1,-1
-1,-1,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,-1,-1
-1,-1,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,-1,-1
-1,-1,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,-1,-1
-1,-1,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,-1,-1
-1,-1,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
اینکار رو بخاطر این کردم که راحتتر بشه خارج شدن اسب از صفحه شطرنج رو چک کرد. خونه هایی که صفرند همون صفحه شطرنج رو تشکیل می دهند.

آرایه h هم که نحوه حرکت اسب رو شبیه سازی می کنه. هر کدوم از هشت جفت عددهای آرایه h یک حرکت اسب هست. و چون اسب از هر خونه حداکثر به هشت خانه بعدی می تونه بره پس آرایه h هشت جفت عدد داره.

این روش فقط چند حالت از میلیونها جواب رو میده. این سئوال رو قبلا در حالت کلیش رو مجبور بودم حل کنم یعنی تمام حالتهایی که اسب می تونه همه خونه ها رو در 64 حرکت بره .
اینطوری خیلی سخت تر میشه این هم بعنوان یک سئوال بهش فکر کنید . من قبلا حل کردم (کلا تغییرش دادم تا جواب این سئوال رو بدم) البته برنامه با این روش راه حل های زیادی رو پیدا می کنه ولی نمی تونه همه راه حل ها رو پیدا کنه باید 64^8 حالت رو چک کنه که در حدود همون برنامه قبلی در میاد (یعنی یکسال). توی سه یا چهار ساعت 3000 تا جواب رو بدست میاره (بستگی به نقطه شروع داره) برای همین کل جواب ها باید بیشتر از چند میلیون باشه.

حالا همین خودش دوباره سئوال باشه. یعنی برنامه ای که بتونه تمام راه حل ها رو بدست بیاره.
روش جالبی داره ولی سخت تره.
 

Arash_j13

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

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

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,step=2;

void getABForbidenPlaces();
void find(void);

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

  x=Bx;y=By;
  textcolor(4);
  for(i=step;i>0;i--){
    gotoxy(3*(x+1)+1,y);
    cprintf("%3d",i);
    if(board[x+1][y]==i-1)x++;
    if(board[x][y+1]==i-1)y++;
    if(board[x-1][y]==i-1)x--;
    if(board[x][y-1]==i-1)y--;
  }
  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);
  Ax--;Ay--;
  board[Ax][Ay]=1;
  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);
  Bx--;By--;
  board[Bx][By]=-2;
  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(void){
  int i,j;
  while(1){
    for(i=0;i<10;i++){
      for(j=0;j<10;j++){
	if(board[i][j]==step-1){
	  if(board[i+1][j]==0)board[i+1][j]=step;
	  if(board[i+1][j]==-2){board[i+1][j]=step;return;}
	  if(board[i][j+1]==0)board[i][j+1]=step;
	  if(board[i][j+1]==-2){board[i][j+1]=step;return;}
	  if(board[i-1][j]==0)board[i-1][j]=step;
	  if(board[i-1][j]==-2){board[i-1][j]=step;return;}
	  if(board[i][j-1]==0)board[i][j-1]=step;
	  if(board[i][j-1]==-2){board[i][j-1]=step;return;}
	}

      }
    }
    step++;
  }
}
 

mohammad_110

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

حل کردن این دو تا سئوال برای من که خیلی سخت بود.
 

Arash_j13

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

rezakhafan4u

کاربر تازه وارد
تاریخ عضویت
9 نوامبر 2006
نوشته‌ها
16
لایک‌ها
1
[QUOTE=mohammad_110;


دمت گرم خیلی عالی توضیح دادی
اگه میشه یه همچین توضیحی رو واسه مساله برجهای هانوی و هشت وزیر هم بگو
مرسی :D
بای
 

rezakhafan4u

کاربر تازه وارد
تاریخ عضویت
9 نوامبر 2006
نوشته‌ها
16
لایک‌ها
1
البته برای برجهای هانوی و مساله هشت وزیر بیشتر یه توضیحی راجب الگوریتمش میخوام
مثل مساله حرکت اسب شطرنج که خیلی خوب توضیح دادید
ممنونم
فعلا بای
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
برج هانوی رو فعلا برات توضیح می دم هشت وزیر رو خواستی بیا حضوری برات توضیح بدم
توی برج هانوی ما قرار n ـا حلقه رو از برج a به برج c با کمک برج b انتقال بدیم برای اینکار باید n-1 حلقه رو منتقل کنیم به برج b اخریم حلقه رو بزرایم توی برج c و بایز این N-1 حلقه منتقل کنیم به برج c

پس یه مسئله جدید داریم
مسئله اینکه کا باید N-1 حلقه از برج a به برج b با کمک برج C منتقل بشن برای این کار باید n-2 حلقه رو به برج c منقل کنید بعد حلقه n-1 رو به برج b منتقل کنید و n-1 حلقه رو هم از برج c منتقل کنید به برج b

پس باز هم یه مسئله جدید داریم
مسئله اینکه مامی خوایم n-2 حلقه رو از برج a به برج c منتقل کنیم باید N-3 حلقه رو به برج b منتقل کنیم حلقه N-3 رو بزریم توی برج c و اون n-2 حلقه رو بزاریم توی برج c

و به همین ترتیب باز یه مسئله جدید داریم
.....
.....

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

کد:
#include <iostream>
#include <cstdlib>

#define MOVE " ----> "
using namespace std;

int honoy(int,char ,char,char);
int main()
{
	honoy(5,'A','B','C');
	system("pause");
	return EXIT_SUCCESS;
}

int honoy(int n,char from,char help,char to)
{
	if (n<0)
	{
		cout<<"Error\n";
		exit(0);
	}
	if(n==1)
	{
		cout<<from<<MOVE<<to<<endl;
		return 1;
	}
	int m=honoy(n-1,from,to,help);
	cout<<from<<MOVE<<to<<endl;
	m+=honoy(n-1,help,from,to);
	return m+1;
}

اگه جاییش رو نفهمیدی بگو بیشتر توضیح بدم
 

rezakhafan4u

کاربر تازه وارد
تاریخ عضویت
9 نوامبر 2006
نوشته‌ها
16
لایک‌ها
1
خيلي ممنونم
اگه ميشه برنامه هشت وزير رو طوري كه تمام 92 حالت ممكن رو برامون چاپ كنه رو بنويسيد
البته هم با تابع بازگشتي و هم بدون اون ...
البته بازم ميگم >>>>>> اگه سورسشو آماده داريد يا نوشتنش راحته ...
مرسي
باي عزيزم
 

shahab_sh

کاربر تازه وارد
تاریخ عضویت
29 می 2006
نوشته‌ها
80
لایک‌ها
0
سلام:)
راستش من 5-6 ماه بیشتر نیست که رفتم سراغ برنامه نویسی و خیلی حرفه ای نیستم. الان هم دارم کتاب عین الله جعفر نژاد قمی رو میخونم و تازه رسیدم به بخش وراثت. این تاپیک رو هم تازه پیدا کردم و تمام پستهاش رو هم خوندم.دستتون درد نکنه تمرینات خیلی خوبی هست. :happy: توی صفحه قبل یه سوال بود:

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

من این سوال رو 2-3 هفته پیش حل کرده بودم.که کدش رو میزارم اینجا:
شما عبارت رو هر جور که بخواید میتونید وارد کنید. خود برنامه درستش میکنه. اگر هم کاراکتر هایی غیر از +-*/() (و اعداد) وارد کنید ویا عبارت بی معنی مانند:
کد:
236-*543
بنویسید برنامه ارور میده و مکان ارور رو هم مشخص میکنه. دلیل اینکه یه خورده هم طولانی شده همینه.
مثلا عبارت زیر را در نظر بگیرید:
کد:
-22 * -762/  (21+(45- (70/10+23(10-(56/8))-20 + 8 * 80/8)))  - 29

اینم کد برنامه:

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

class snt {
	char alsns[201];

	public:

	int input();
	long int calc_all(char*, int&);
	void ch_int(long int &,int &,char*);
	long int calc();
	int ill();

};
int snt::input(){
	int i,j,k;

	clrscr();
	cout << "Enter an Expression:\n";
	cin.get(alsns,120);
	if(ill() == -1)
		return -1;

	return 1;
}
int snt::ill(){
	int i,j,k;
	char chngd[201],a,b,c;

	for(j=1,i=0; alsns[i]; i++){
		for(a=1; alsns[i-a]==' '; a++);
		a = alsns[i-a];

		b=alsns[i];
		
		for(c=1; alsns[i+c]==' '; c++); 
		c = alsns[i+c];

		if(b == '-' || b == '+'){				//-+
			switch (a) {
				case '+':case '-':case '*':case '/':case '(':case ')':case '\0': break;
				default:
					if(a>=47 && a<= 57)	break;
					else j=-1;
			}
			switch (c) {
				case '+':case '-':case '(':	break;
				default:
					if(c>=47 && c<= 57)	break;
					else j=-1;
			}
		}
		else if(b == '*' || b == '/'){			// */
			switch (a) {
				case ')': break;    
				default:
					if(a>=47 && a<= 57)	break;
					else j=-1;
			}
			switch (c) {
				case '-':case '+':case '(':	break;    
				default:
					if(c>=47 && c<= 57)	break;
					else j=-1;
			}		
		}
		else if(b == '('){ 						// (
			switch (a) {
				case '+': case '-':case '*':case '/':case '(':case ')':case '\0': break;    
				default:
					if(a>=47 && a<= 57)	break;
					else j=-1;
			}
			switch (c) {
				case '-':case '+':case '(':	break;    
				default:
					if(c>=47 && c<= 57)	break;
					else j=-1;
			}
		}
		else if(b == ')'){						// )
			switch (a) {
				case ')': break;
				default:
					if(a>=47 && a<= 57)	break;
					else j=-1;
			}
			switch (c) {
				case '+': case '-':case '*':case '/':case '(':case ')':case '\0': break;
				default:
					if(c>=47 && c<= 57)	break;
					else j=-1;
			}
		}
		else if( !((b>=48 && b<=57) || b==' ' || b=='\0')){
			j=-1;
			break;
		}
	}
	if(j==-1){
		cout << "\n\nerror at character No." << i <<"  at: " << &alsns[i] <<"\n";

		return -1;
	}

	//j=row     k=cloumn
	for(j=0,i=0; alsns[i]; i++){
		for(a=1; alsns[i-a]==' '; a++);
		a = alsns[i-a];

		b = alsns[i];

		for(c=1; alsns[i+c]==' '; c++);
		c = alsns[i+c];

		if(b!= ' ') {
			if(b == '('){
				if(a=='/' || a=='*' )
					chngd[j++] = '(';
				else{
					if(a==')' || (a>=48 && a<=57))
						chngd[j++] = '*';
					chngd[j++] = '1';
					chngd[j++] = '*';
					chngd[j++] = '(';
                }

			}else if(b== ')'){
				chngd[j++] = ')';
				if(c>=48 && c<=57){
					chngd[j++] = '*';
				}

			}else{
				chngd[j++] = b;
				if(b == '-' || b == '+'){
					chngd[j++] = '1';
					chngd[j++] = '*';
				}
			}
		}
	}
	chngd[j]=0;

	cout << "\nchanged = " << chngd << "\n";

	for(i=0; chngd[i]; i++)
		alsns[i] = chngd[i];
	alsns[i]=0;

	return 1;

}
long int snt::calc(){
	int i=0;
	return calc_all(alsns,i);
}
long int snt::calc_all(char *exp, int&i){
	int sign=1;
	long int adad1,adad2,sum=0;
	char amal,ns;


	do{

////////////////////////////////////////

		sign = 1;
		if(*(exp+i)=='-'){
			sign = -1;
			i++;
		}
		else if(*(exp+i)=='+')
	  		i++;

		ch_int(adad1,i,exp);
		adad1 *= sign;

		while(1){
			amal = ns = 0;
			switch (*(exp+i)) {
				case '-':
				case '+':
					ns = 1;
					break;
				case ')':
					i++;
					break;
				case '*':
					amal = '*';
					i++;
					break;
				case '/':
					amal = '/';
					i++;
			}

			if(!amal || ns)
				break;

			sign = 1;
			if(*(exp+i)=='-'){
				sign = -1;
				i++;
			}
			else if(*(exp+i)=='+')
				i++;

			if(*(exp+i) == '(')
				adad2 = calc_all(exp,++i);
			else
				ch_int(adad2,i,exp);
			adad2*=sign;

			switch(amal){
				case '*':
					adad1*=adad2;
					break;
				case '/':
					adad1/=adad2;
			}
////////////////////////////////////////
		}
		sum+=adad1;

	}while(ns);


	return sum;
}
void snt::ch_int(long int &adad, int &i, char *exp){

	for(adad=0; *(exp+i) >= 48 && *(exp+i) <= 57; i++)
		adad = adad*10 + *(exp+i)-48;

}
int main(){

	snt snt1;
	while(snt1.input() == -1){
		cout <<"\ninvalid expression!\n";
		getch();
	}
	cout << "\nanswer is: " << snt1.calc();
	getch();
	return 0;
}



قربان شما....شهاب.
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
خيلي ممنونم
اگه ميشه برنامه هشت وزير رو طوري كه تمام 92 حالت ممكن رو برامون چاپ كنه رو بنويسيد
البته هم با تابع بازگشتي و هم بدون اون ...
البته بازم ميگم >>>>>> اگه سورسشو آماده داريد يا نوشتنش راحته ...
مرسي
باي عزيزم

برات می زارم کار سخیتی نیست به روش بازگشتی می شه


سهراب جان شما هم خوب می نویسی با یکم تمرین بهتر هم می شه
 

shahab_sh

کاربر تازه وارد
تاریخ عضویت
29 می 2006
نوشته‌ها
80
لایک‌ها
0
دوباره سلام:)
یه سوال داشتم.:blush:
تو همون برنامه ای که نوشته بودم برای نگه داشتن حاصل عبارت از long int استفاده کرده بودم. حالا میخوام یک کلاس درست بکنم به نام var که بتونه اعداد تا مثلا 50 رقم رو هم نگه داره و با استفاده از تعریف مجدد عملگرها بتونم اونها رو باهم جمع و تفریق و ضرب و تقسیم بکنم. راستش هر چی فکر کردم راه درست حسابی به ذهنم نرسید. خیلی ممنون اگه یه راهنمایی بکنید.:happy:
 

Arash_j13

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

rezakhafan4u

کاربر تازه وارد
تاریخ عضویت
9 نوامبر 2006
نوشته‌ها
16
لایک‌ها
1
برات می زارم کار سخیتی نیست به روش بازگشتی می شه


سهراب جان شما هم خوب می نویسی با یکم تمرین بهتر هم می شه

بابا مگه قرار نبود ديشب بزاري ؟!؟!؟!؟!
حيف شد ، مي خواستم امروز بدمش به استادمون
حالا بيخيال
سعي كن برام بزاري ، فوقش اطلاعات عموميم زياد ميشه ... :(
 

shahab_sh

کاربر تازه وارد
تاریخ عضویت
29 می 2006
نوشته‌ها
80
لایک‌ها
0
کالاس جالبی همیشه دوست داشتم یه کلاس برای اینکار بنویسم
برای اینکار می تونید اعاد به صورت رقم به رقم در مبنای 10 نگه داری کنیدجمع و تفریق و ضرب و تقسیم رو انجام بدید برای اینکار می تونید از یه آرایه استفاده کنید که ارقام رو ذخیره کنه اگه خیلی نمی خواد پیچده بشه می تونید از یه ارایه ساده استفاده کنید ولی اگه می خوایید کلاستون بتونه تا هر رقمی رو نگه داری کنه باید از کلاس string یا vector استفاده کنید

منظورتون اینه که اعداد رو رقم به رقم توی یک string نگه دارم بعد دقیقا همونجوری که خودم عمل ضرب و تقسیم و... رو انجام میدم (رو کاغذ) برای کامپیوتر هم تعریف کنم؟
مثلا برای ضرب دوتا عدد 10 رقمی باید 10*10 بار عمل ضرب انجام بشه (رقم به رقم) و بعدا حداقل حداقل 10 بار هم عمل جمع. اگر عدد نقلی هم داشته باشیم که چندین بار دیگه هم عمل جمع باید تکرار بشه.
راستش اول یه همچین فکری (تو همین مایه ها) به ذهنم رسید ولی پیش خودم گفتم باید یک راه بهتر و سریعتر هم باشه. من برنامه نویسی اسمبلی برای میکروکنترلر(8051) رو هم کار کردم. برای اون یه همچین برنامه ای نوشتم. مثلا برای جمع، دوتا بایت اول رو باهم جمع میکنیم بعد دوتا بایت بعدی و بیت پرچم نقلی رو هم باهم جمع میکنیم. و این کار رو تا آخر ادامه میدیم. توی عمل تفریق هم همینطور ولی باز سر عمل ضرب و تقسیمش موندم!
حالا به نظر شما راه بهتری هست؟
با تشکر...شهاب.
 

Arash_j13

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

rezakhafan4u

کاربر تازه وارد
تاریخ عضویت
9 نوامبر 2006
نوشته‌ها
16
لایک‌ها
1
آرش پس برنامه ما چي شد؟
تو که گفتي کاري نداره
بابا عجب بد قولي هستي هااااااااااااا :wacko:
 

Arash_j13

Registered User
تاریخ عضویت
18 فوریه 2005
نوشته‌ها
778
لایک‌ها
2
محل سکونت
مشهد
کد:
/**
    Autor: arash_j13
    Dec 17, 2006
**/

#include <iostream>
#include <cstdlib>
using namespace std;


#define N 8

bool put(int);
void print(bool=true);
bool check(int,int);

int board [N][N]={0};
int y=0;
int main()
{
	put(0);
	print(false);
	cout<<y<<endl;
	system("pause");
	return 0; 
}

bool put(int row)
{
	if (row==N)
	{
		print();
		y++;
		return false;
	}

	for(int col=0 ; col<N; ++col)
		if(check(row,col))
		{
			board[row][col]=1;
			if(put(row+1))
				return true;
			board[row][col]=0;
		}
	return false;
}

bool check(int row,int col)
{
	for(int i=0 ; i < N ; ++i)
		if(board[i][col])
			return false;

	for(int i=row-1,j=col-1; i > -1 && j > -1 ; --j , --i)
		if(board[i][j])
			return false;

	for(int i=row-1,j=col+1; i > -1 && j < N ; ++j , --i)
		if(board[i][j])
			return false;

	for(int i=row+1,j=col-1; i < N && j > -1 ; --j , ++i)
		if(board[i][j])
			return false;

	for(int i=row+1,j=col+1; i < N && j < N ; ++j , ++i)
		if(board[i][j])
			return false;

	return true;
}

void print(bool useBuffer)
{
	static int count=0;
	static int buffer [4][N][N];
	if(useBuffer)
	{
		for(int i=0 ; i < N ;++i)
			for(int j=0 ; j < N ;++j)
				buffer[count][i][j]=board[i][j];
	
		++count;
	}
	if(count==4||( !useBuffer && count>0))
	{
		cout<<endl<<endl;
		for(int i=0 ; i < N ; ++i,cout<<endl)
			for(int k=0 ; k < count ; ++k,cout<<"  ")
				for(int j=0 ; j < N ; ++j)
					cout<<buffer[k][i][j]<<" ";
		count=0;
	}
	
}
 

shahab_sh

کاربر تازه وارد
تاریخ عضویت
29 می 2006
نوشته‌ها
80
لایک‌ها
0
آقا آرش دستتون درد نکنه.:happy:
حالا میشه خواهشا یه سوال دیگه مطرح کنید (خیلی سخت نباشه ها:blush: :D )
با تشکر،
شهاب:)
 

Arash_j13

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

ما یه الگوریتم رمز نگاری داریم که با کمک یه ماتریس پنچ در پنچ عبارات رو رمز می کنه و برای رمز کردن از یه کلمه کلید استفاده می کنه روش کار به این صورت که مان این ماتریس رو به روشی که می گم با 25 حرف الفبا پر می کنیم و یه حرف باقی می مونه(فرض کنید کلمه و عبارتی که قرار است رمز شود اصلا شامل حروف بزرگ نیست و تمام حروف کوچک است) ما برای رمز کردن علاوه بر عبارت یه سری از اعداد رو می گیریم سپس اولین کاکتر عبارت رو درون جدول پیدا می کنیم اگر توی جدول وجود داشت به تعداد اولین عدد در ماتریس به سمت راست حرکت می کنیم و به تعداد دومین عدد به سمت بالا کاکتر به دست اومده رو جایگزین کارکتر اصلی می کنیم و می ریم سراغ کاکتر دوم و به اندازه سومین کارکتر به راست و به اندازه چهارمین کاکتر به بالا حرکت می کنیم و همین طور ادامه می دیم هر کاکتری که توی ماتریس نبود مثل فاصله یا اون حرف خاص که باقی مونده رو بدون تغییر در رشته اصلی باقی می گزاریم توجه کنید که موقع حرکت در ماتریس اگه از یه سمت بیرون بیفتیم از سمت دیگه اخل می شیم مثلا اگه حرف روی ستون 3 باشه و قراه 2 تا به سمت راست حرکت کنیم به ستون شماره 0 می رسم و در مورد ارایه اعداد هم همین طور مثلا اگه پنج تا عدد داریم بار اول عدد اول و دوم بار دوم عدد سوم و چهارم بار سوم عدد پنج و اول و به همین ترتیب
روش پر کردن ماتریس
کاکترهای با این ترتیب قرار می گیرن اول کلید و سپس حروف الفبا به ترتیب توجه کنید کاکتر تکراری توی ماتریس قرار نمی گیره و برای پر کردن اول ستون اصلی بعد ستون فرعی و بعد هم از اول به صورتی سطری از چپ به راست ماتریس رو پر می کنیم
مثلا اگه کلید کلمه mykey باشه جدول به این صورت پر می شه

m g h i b
j y l c n
o p k q r
s d t e u
f v w x a

و با اعداد زیر رشته arash_j13 اینطوری رمز می شه oqtwk_v13
1,2,-1,0,-2
 
بالا