Từ 1 tới 4 trên tổng số 4 kết quả

Đề tài: vấn đề nhỏ bài " số nguyên lớn"

  1. #1
    Ngày gia nhập
    03 2008
    Bài viết
    16

    Mặc định vấn đề nhỏ bài " số nguyên lớn"

    các bạn giải thích hộ mình tại sao khi bỏ tham chiếu "&" trong các hàm như hàm
    nhập chẳng hạn. Ví dụ : thay vì viết
    Code:
     
        void nhap(bigint &d); 
         bigint operator+(bigint &d);
         bigint operator-(bigint &d);
         bigint operator=(bigint &d);
    mà viết lại là
    Code:
      
          void nhap(bigint d); 
         bigint operator+(bigint d);
         bigint operator-(bigint d);
         bigint operator=(bigint d);
    thì kết quả chạy lại bị sai, chỉ hộ mình luôn cách sủ dụng tham chiếu với


    Code:
      	
    
     #include<iostream.h>
    	 #include<string.h>
    	 #include<conio.h>
    class bigint
     {
      private:
    	char value[50];
    	int size;
    	int sign;
      public:
    	void nhap(bigint &d);   // nhap so nguyen va dua no ve dang chuan
    	void in();
    	int lonhon(char d1[50],char d2[50]);
    	int kiemtra(bigint d); // kiem tra so nhap vao co la so nguyen hay ko
    	void cong(char d1[50],char d2[50],char sum[51]);
    	void tru(char d1[50],char d2[50],char hieu[50]);
    	bigint operator+(bigint &d);
    	bigint operator-(bigint &d);
    	bigint operator=(bigint &d);
      };
    int bigint::kiemtra(bigint d)     //kiem tra so nhap vao co la
    	{                               // so nguyen lon hay ko
    	 int tmp=1;
    	 size=strlen(d.value);
    	if(d.value[0]!='-'&&d.value[0]!='+'&&d.value[0]<'0'||d.value[0]>'9')
    	 tmp=0;
    	for(int i=1;i<size;i++)
    	  if(d.value[i]<'0'||d.value[i]>'9')
    	  {	tmp=0;  break;}
    	 if(tmp==1)   return 1;
    	 else return 0;
    	 }
    void bigint::in()
      {
    	if(sign==0)  cout<<value;
    	if(sign==1)   cout<<"-"<<value;
      }
    void bigint::nhap(bigint &d)
      {
    	 int i;                     //nhap so lon neu sai
    	 d.sign=0;                  //bat nhap lai
    	do
    	 {
    	  cin>>d.value;
    	 }
    	while(kiemtra(d)==0);
    	if(d.value[0]=='-') d.sign=1;      // luu dau cua so da nhap
    	if(d.value[0]=='-'||d.value[0]=='+' )
    	 for(i=0;i<d.size;i++)
    	 {                               // dua so da cho
    	  d.value[i]=d.value[i+1];       //ve dang chuan
    	  d.size=strlen(d.value);        //ko co dau
    	 }
    	while(d.value[0]=='0')
    	for(i=0;i<d.size;i++)
    	{
    	 d.value[i]=d.value[i+1];
    	  d.size=strlen(d.value);
    	}
    	 }
    void bigint::cong(char d1[50],char d2[50],char sum[51])
      {
      int i,tmp,a1,b1,c,nho=0,dem=-1;   // cong 2 so duong d1,d2
      char ch;                          // luu ket qua vao
    	tmp=strlen(d1)-strlen(d2);       // mang sum
    	if(tmp>=0)
    	{
    	  for(i=strlen(d1)-1;i>=tmp;i--)
    	  d2[i]=d2[i-tmp];                 //can bang so chu so cua
    	  for(i=0;i<tmp;i++)               // cua 2 so bang cach
    		 d2[i]='0';                     // chen so 0 vao truoc so
    	  for(i=strlen(d1)-1;i>=0;i--)     // co so chu so nho hon
    	 {
    		a1=d1[i]-'0';
    		b1=d2[i]-'0';
    		c=(a1+b1+nho)%10;
    		nho=(a1+b1+nho)/10;
    		dem++;
    		sum[dem]=(char)(c+'0');
    	 }
    	if(nho>0)
    	{
    	 sum[dem+1]='1';
    	 sum[dem+2]=NULL;
    	 }
    	else
    	 sum[dem+1]=NULL;
    	for(i=0;i<strlen(sum)/2;i++)
    	 {
    		ch=sum[i];
    		sum[i]=sum[strlen(sum)-i-1];
    		sum[strlen(sum)-i-1]=ch;
    	 }
      }
      if(tmp<0)
      cong(d2,d1,sum);
      }
    bigint bigint::operator+(bigint &d)
    	{
    	 bigint sum;
    	  if(sign==d.sign)
    	 {
    	 cong(value,d.value,sum.value);
    	  sum.sign=d.sign;
    	 }
    	 if(sign!=d.sign)
    	  {
    		if(lonhon(value,d.value)==1)
    		 {
    		  tru(value,d.value,sum.value);
    		  sum.sign=sign;
    		 }
    		else
    		 {
    		  tru(d.value,value,sum.value);
    		  sum.sign=d.sign;
    		  }
    	  }
    	     
    		while(sum.value[0]=='0')
    		for(int i=0;i<strlen(sum.value);i++)
    		sum.value[i]=sum.value[i+1];
    	  return sum;
    	 }
    bigint bigint::operator=(bigint &d)
    	{
    	 sign=d.sign;
    	 size=d.size;
    	 strcpy(value,d.value);
    	 return *this;
    	}
    int bigint::lonhon(char d1[50],char d2[50])
      {
    	 int t;
    	if(strlen(d1)>strlen(d2)) t=1;
    	if(strlen(d1)<strlen(d2)) t=0;
    	if(strlen(d1)==strlen(d2))
    	 {
    	  if(strcmp(d1,d2)>=0) t=1;
    	  if(strcmp(d1,d2)<0) t=0;
    	  }
      return t;
      }
     void bigint::tru(char d1[50],char d2[50],char d3[50])
      {
    	int a1,b1,c,i,tmp,nho=0;
    	tmp=strlen(d1)-strlen(d2);
      for(i=strlen(d1)-1;i>=tmp;i--)      //lam cho 2 so
    	  d2[i]=d2[i-tmp];                 //d1,d2 co so chu so
    	  for(i=0;i<tmp;i++)               // bang nhau
    		 d2[i]='0';
      for(i=strlen(d1)-1;i>=0;i--)
    	{
    	 a1=d1[i]-'0';
    	 b1=d2[i]-'0';
    	if(a1<b1)
    	 {
    	  c=a1+10-b1-nho;
    	  nho=1;
    	 }
    	if(a1>b1)
    	 {
    	  c=a1-b1-nho;
    	  nho=0;
    	 }
    	if(a1==b1)
    	 {
    	  if(nho==0)
    		{
    		 c=a1-b1;
    		 nho=0;
    		}
    	  else
    		{
    		 c=a1+10-b1-nho;
    		 nho=1;
    		}
    	  }
    	 d3[i]=c+'0';
    	 d3[strlen(d1)]=NULL;
    	}
      }
    bigint bigint::operator-(bigint &d)
     {
      bigint hieu;
    	d.sign=1-d.sign;
    	hieu=*this+d;
      return hieu;
      }
      void main()
      {               clrscr();
        int c;
        bigint a,b,sum,hieu;
       cout<<"\n       ........ chuong trinh tinh tong ,hieu 2 so nguyen lon.........";
       cout<<"\n		      1.  an 1 de thuc hien phep cong 2 so";
       cout<<"\n		      2.  an 2 de thuc hien phep tru 2 so  ";
       cout<<"\n		      3. an phim khac de thoat chuong trinh";
        c=getch();
         switch(c)
          {
    		 case '1':
    		cout<<" \n tinh tong 2 so nguyen lon A+B ";
    	  cout<<"\n nhap so lon A \n";
    	a.nhap(a);
    	cout<<"\n nhap so lon B \n";
    	b.nhap(b);
    	sum=a+b;
    	cout<<"\n tong 2 so A+B =  ";
    	sum.in();
    	break;
    
    		 case '2' :
    	 cout<<"\n tinh hieu cua 2 so nguyen lon A-B :";
    	cout<<"\n nhap so tru A : \n";
    	a.nhap(a);
    	cout<<"\n nhap so bi tru B: \n";
    	b.nhap(b);
    	cout<<"\n hieu 2 so A-B =";
    	hieu=a-b;
    	hieu.in();
    	break;
           }
    	getch();
    	}
    Đã được chỉnh sửa lần cuối bởi Quanptit : 11-12-2008 lúc 05:02 PM.

  2. #2
    Ngày gia nhập
    07 2008
    Nơi ở
    /media/Anime
    Bài viết
    2,288

    Tham chiếu để làm cho giá trị của biến truyền vào hàm thay đổi sau khi gọi hàm. Nếu ko dùng tham chiếu sau khi gọi hàm xong, giá trị truyền vào ko hề thay đổi gì cả -> hàm nhập trở nên vô nghĩa.
    Càng yêu mèo thì mèo càng mập. Mèo càng mập ta lại càng yêu.

  3. #3
    Ngày gia nhập
    02 2008
    Bài viết
    1,009

    tham chiếu là 1 kiểu như con trỏ,có điều nó dễ sử dụng hơn nhiều,bình thường,khi 1 biến được đi vào hàm( biến cục bộ nha ),trong hàm được sử lý biến như thế nào cũng được,nhưng khi ra khỏi hàm thì biến lại trở về giá trị ban đầu ( trừ trường hợp với mảng nha )vì vậy nếu muốn lấy giá trị của biến ngay cả khi biến ra khỏi hàm ta dùng tham chiếu( hoặc con trỏ cũng được)

  4. #4
    Ngày gia nhập
    12 2008
    Bài viết
    0

    Mảng trong C/C++ gần như một con trỏ, nếu đưa mảng cho một hàm để nó làm việc thì sau khi nó làm việc xong, mảng bị thay đổi giống như đưa một con trỏ vậy. Việc gọi sizeof đối với mảng cũng như con trỏ luôn trả về 0.
    Khi gọi một hàm có tham số là tham chiếu thì khác, thay vì lấy giá trị copy của tham số, hàm ko copy mà làm việc trực tiếp với biến đưa vào(chỉ biến có &), chữ chiếu(reference) thể hiện điều đó.

Các đề tài tương tự

  1. nghĩa của 3 từ "principals", "artifacts", "securables" là như thế nào?
    Gửi bởi ntbao trong diễn đàn English for IT | Tiếng anh cho dân CNTT
    Trả lời: 2
    Bài viết cuối: 02-09-2017, 06:36 PM
  2. Lỗi"error C2275: 'T' : illegal use of this type as an expression" khi dùng "list<T>::iterator it"
    Gửi bởi doicanhden trong diễn đàn Thảo luận, góp ý code C/C++ của bạn
    Trả lời: 6
    Bài viết cuối: 19-01-2012, 01:59 AM
  3. Trả lời: 1
    Bài viết cuối: 01-12-2011, 07:32 PM
  4. Problems : " recover tree " with input as " preorder" and "inorder"
    Gửi bởi HoangManhHa1991 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 16
    Bài viết cuối: 13-04-2011, 10:19 PM
  5. Lập trình C chuyển bài toán "tổng số nguyên tố" sang "xuất nhập file"
    Gửi bởi long221091 trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 23-04-2010, 11:11 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn