Làm thế nào để không mất giá trị của biến khi sử dụng hàm con

Em gần nộp bài tập lớn, bên dưới là hàm em rút lại phần em sai, còn dưới nữa là bản đầy đủ, cho em hỏi là khi mình khai biến ngoài hàm thì nó là biến global, nhưng sao sau khi em cho biến đó vào hàm con, sử dụng chính biến đó lại để nhận giá trị, nó lại thành biến khác, không lưu lại giá trị ạ, em debug thì hình như biến a em khai nó thành biền local trong hàm con ấy, dù trùng tên với biến global nhưng lưu 2 giá trị khác nhau??? em cảm ơn!

Hàm rút lại:

#include<stdio.h>
#include<stdlib.h>

struct sp {
    double thuc;
    double ao;
};
             
struct sp a;
double t1,t2;
char dau; 
             
int tinh(struct sp a, char dau);
int toan(struct sp b, char dau2);
 
main() // HAM TINHTOAN
{
    printf("nhap so:\nthuc\tao\n");
    scanf("%lf", &a.thuc);
    scanf("%lf", &a.ao);
    printf("\t  phep tinh: \n\t      ");
    fflush(stdin);
    scanf("%c",&dau);
    tinh(a,dau);
}

////HAM CON////////		   
int tinh(struct sp a,char dau) // HAM TINH
{
    struct sp b;
    char dau1;
    printf("nhap so:\nthuc\tao\n");
    scanf("%lf", &b.thuc);
    scanf("%lf", &b.ao);
    printf("\t  phep tinh: \n\t      ");
    fflush(stdin);
    scanf("%c", &dau1);
    toan(b,dau1);
}

int toan(struct sp b, char dau2)     // HAM TOAN
{  
    struct sp c;
    printf("nhap so:\nthuc\tao\n");
    scanf("%lf", &c.thuc);
    scanf("%lf", &c.ao);
    printf("\t  phep tinh: \n\t      ");
    fflush(stdin);
    scanf("%c", &dau2);
    toan(c,dau2);
}
Hàm đầy đủ

HÀM ĐẦY ĐỦ:

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

  struct sp {double thuc;             /// cau truc phuc
             double ao;  };
  
  
  int tinhtoan();                      ///	HAM TINH TOAN           
  int tinh(struct sp a, char dau);    /// ham con tinh toan
  int toan(struct sp b, char dau2);
  
  struct sp a;
  double t1,t2;
  char dau; 
  
  int lt();                                       /// HAM LUY THUA
  struct sp luythua(struct sp d,int somu);        /// ham con luy thua
  struct sp luythuaam(struct sp d,int somu);
  
  int can2();                                     /// HAM CAN 2
  
  void menu();                                     /// HAM MENU
  
  main()
  {
  	menu();
  }
  
   void menu()       /// HAM MENU
  { int g;
  	printf("----- Hay chon chuc nang ban can -----");
  	printf("\n Chon 1 de tinh toan mot day so phuc");
  	printf("\n chon 2 de tinh luy thua so phuc");
  	printf("\n Chon 3 de tinh can bac 2 so phuc");
  	printf("\n Chon 4 de thoat");
  	printf("\n \n \t BAN CHON:\n \t    ");
  	do scanf("%i",&g);
  	while (g != 1 && g!=2 && g!=3 && g!=4);
  	printf("\n");
  	switch(g)
  	{ 
	  case 1:
	  tinhtoan();
      break;
	  case 2:
	  lt();
	  break;
	  case 3:
	  can2();
	  break;
	  case 4:
	  exit (0);	
	  }
  	}
  	   int tinhtoan()                                  ///HAM TINHTOAN
  {  
     printf("________________________TINH SO PHUC_____________________________________\n\n");
     printf("\t Cach nhap so phuc: THUC -> TAB -> AO -> ENTER (cho dep :v)\n");
     printf("\t Nhap dau + , - , * , / , = -> ENTER \n\n");
     printf("nhap so:\nthuc\tao\n");
     scanf("%lf", &a.thuc);
     scanf("%lf", &a.ao);
     printf("\t  phep tinh: \n\t      ");
     fflush(stdin);
     scanf("%c", &dau);
     tinh(a,dau);
  }
           ////HAM CON////////
		   
   	int tinh(struct sp a, char dau)         //HAM TINH
	   {
	    struct sp b;
	    char dau1;
       
   		switch(dau)
   		{
		   	case '+':                  /// phep tinh cong
		   	  printf("nhap so:\nthuc\tao\n");
              scanf("%lf", &b.thuc);
              scanf("%lf", &b.ao);
              printf("\t  phep tinh: \n\t      ");
              fflush(stdin);
              scanf("%c", &dau1);
		   	  if(dau1=='+'||dau1=='-'||dau1=='=')
		   	    {
	   			  a.thuc += b.thuc;
	   			  a.ao   += b.ao  ;
	   			  tinh(a,dau1);
	   		    }
	          else if(dau1=='*'||dau1=='/')
	            {
	            	struct sp c;
	            	char dau2;
       	            printf("nhap so:\nthuc\tao\n");
                    scanf("%lf", &c.thuc);
                    scanf("%lf", &c.ao);
                    printf("\t  phep tinh: \n\t      ");
                    fflush(stdin);
                    scanf("%c", &dau2);
                    if(dau1=='*')                         //Uu tien nhan
                       {          
					    t1=b.thuc;
                        t2=b.ao;
                        b.thuc = c.thuc*t1 - t2*c.ao;        
                        b.ao   = c.ao*t1   + t2*c.thuc;
                       }
                     else if(dau1=='/')                 //Uu tien chia
                       {
                         t1=b.thuc;
                         t2=b.ao;
                         b.thuc = (t1*c.thuc+t2*c.ao)/(c.thuc*c.thuc + c.ao*c.ao);
                         b.ao   = (t2*c.thuc-t1*c.ao)/(c.thuc*c.thuc + c.ao*c.ao);
                       }
                     toan(b,dau2);  
          		
          	       }
          	       break;
          	       
 	       case '-':                  /// phep tinh tru
 		   	  printf("nhap so:\nthuc\tao\n");
              scanf("%lf", &b.thuc);
              scanf("%lf", &b.ao);
              printf("\t  phep tinh: \n\t      ");
              fflush(stdin);
              scanf("%c", &dau1);
		   	  if(dau1=='+'||dau1=='-'||dau1=='=')
		   	    {
	   			  a.thuc -= b.thuc;
	   			  a.ao   -= b.ao  ;
	   			  tinh(a,dau1);
	   		    }
	          else if(dau1=='*'||dau1=='/')
	            {
	            	struct sp c;
	            	char dau2;
       	            printf("nhap so:\nthuc\tao\n");
                    scanf("%lf", &c.thuc);
                    scanf("%lf", &c.ao);
                    printf("\t  phep tinh: \n\t      ");
                    fflush(stdin);
                    scanf("%c", &dau2);
                    if(dau1=='*')                  //Uu tien nhan
                       {          
					    t1=b.thuc;
                        t2=b.ao;
                        b.thuc = c.thuc*t1 - t2*c.ao;        
                        b.ao   = c.ao*t1   + t2*c.thuc;
                       }
                     else if(dau1=='/')           //Uu tien chia
                       {
                         t1=b.thuc;
                         t2=b.ao;
                         b.thuc = (t1*c.thuc+t2*c.ao)/(c.thuc*c.thuc + c.ao*c.ao);
                         b.ao   = (t2*c.thuc-t1*c.ao)/(c.thuc*c.thuc + c.ao*c.ao);
                       }
                     toan(b,dau2);  
          		
          	       }
          	       break;
 	       
 	       case '*':                            //ham nhan
 		   	  printf("nhap so:\nthuc\tao\n");
              scanf("%lf", &b.thuc);
              scanf("%lf", &b.ao);
              printf("\t  phep tinh: \n\t      ");
              fflush(stdin);
              scanf("%c", &dau1);
             t1=a.thuc;
             t2=a.ao;
             a.thuc = b.thuc*t1 - t2*b.ao;        
             a.ao   = b.ao*t1   + t2*b.thuc;
 	         tinh(a,dau1);
 	         break;
           case '/':                            //ham chia
   		   	  printf("nhap so:\nthuc\tao\n");
              scanf("%lf", &b.thuc);
              scanf("%lf", &b.ao);
              printf("\t  phep tinh: \n\t      ");
              fflush(stdin);
              scanf("%c", &dau1);
             t1=a.thuc;
             t2=a.ao;
             a.thuc = (t1*b.thuc+t2*b.ao)/(b.thuc*b.thuc + b.ao*b.ao);
             a.ao   = (t2*b.thuc-t1*b.ao)/(b.thuc*b.thuc + b.ao*b.ao);
             tinh(a,dau1);
             break;
           case '=':                           //ham bang
             printf("______________________\n");
             printf("ket qua la:\n %lf + %lfi\n",a.thuc, a.ao);
             break;
		   }
		   printf("\n\n_____________________________________________________________\n\n");
		   menu();
   	}	
	   
	   
	   int toan(struct sp b, char dau2)     //// HAM TOAN
	   {  
        struct sp c;
	   	switch(dau2)
	   	{ 
	   	  case '*':                              ///vong lap nhan
   	           printf("nhap so:\nthuc\tao\n");
               scanf("%lf", &c.thuc);
               scanf("%lf", &c.ao);
               printf("\t  phep tinh: \n\t      ");
               fflush(stdin);
               scanf("%c", &dau2);
               t1=b.thuc;
               t2=b.ao;
               b.thuc = c.thuc*t1 - t2*c.ao;        
               b.ao   = c.ao*t1   + t2*c.thuc;
               toan(b,dau2);
               break;
               
  	       case '/':                        //vong lap chia
   	           printf("nhap so:\nthuc\tao\n");
               scanf("%lf", &c.thuc);
               scanf("%lf", &c.ao);
               printf("\t  phep tinh: \n\t      ");
               fflush(stdin);
               scanf("%c", &dau2);
               t1=b.thuc;
               t2=b.ao;
               b.thuc = (t1*c.thuc+t2*c.ao)/(c.thuc*c.thuc + c.ao*c.ao);
               b.ao   = (t2*c.thuc-t1*c.ao)/(c.thuc*c.thuc + c.ao*c.ao);
               toan(b,dau2);
               break;
               
            default:
              if(dau=='+')
                {
                	a.thuc += b.thuc;
                	a.ao   += b.ao;
               	}
              else if(dau=='-')
                {
                	a.thuc -= b.thuc;
                	a.ao   -= b.ao  ;
                }
              dau=dau2;
              tinh(a,dau);
			  break;  
}}   

   int lt()                 /// HAM LUY THUA
   
   {
   	printf("__________________________TINH LUY THUA___________________________________\n\n");
   	printf("\t Cach nhap so phuc: THUC -> TAB -> AO -> ENTER (cho dep :v)\n");
   	printf("\t Nhap so mu -> ENTER\n\n");
   	struct sp d;
   	int somu;
   	printf("nhap so:\nthuc\tao\n");
   	scanf("%lf",&d.thuc);
   	scanf("%lf",&d.ao);
   	printf ("\tso mu: ");
   	scanf("%i", &somu);
    
    if (somu==0)
    { printf("__________________________\n");
    printf("ket qua la: 1\n");}
    else if(somu>0)
   {d=luythua(d,somu);
   printf("_______________________________\n");
    printf("ket qua la:\n");
    printf("%lf + %lfi\n", d.thuc, d.ao);}
    else if(somu<0)
    {d=luythuaam(d,somu);
     printf("_______________________________\n");
    printf("ket qua la:\n");
    printf("%lf + %lfi\n", d.thuc, d.ao);}
    printf("\n_____________________________________________________________\n\n");
    menu();
   } 
     
       ///HAM CON
  
     struct sp luythua(struct sp d,int somu)   //CON LUY THUA DUONG
{   
	int i;
	double t1,t2,k1,k2;
	t1=d.thuc;
	t2=d.ao;
	k1=d.thuc;
	k2=d.ao;
	
	for(i=1;i<somu;i++)
	{
	k1=t1*d.thuc-t2*d.ao;
	k2=t1*d.ao+t2*d.thuc;
	t1=k1;
	t2=k2;}	
	d.thuc=k1;
	d.ao=k2;

		return d;
}

      struct sp luythuaam(struct sp d,int somu) ///luy thua am
      { double k1,k2;
      	somu=abs(somu);
      	d=luythua(d,somu);
      	
      	k1=d.thuc/(d.thuc*d.thuc + d.ao*d.ao);
      	k2=-d.ao/(d.thuc*d.thuc + d.ao*d.ao);
      	d.thuc=k1;
      	d.ao=k2;
      	return d;
      	
      }    
	  
	  
	  
	   int can2()                  ///CAN 2
{
    printf("_______________________TINH CAN BAC 2______________________________________\n\n");
	printf("\t Cach nhap so phuc: THUC -> TAB -> AO -> ENTER (cho dep :v)\n\n");
	double e,f,x1,y1,x2,y2;
	printf("\t\tnhap so:\n\t\tthuc\tao\n\t\t  ");
	scanf("%lf",&e);
	scanf("%lf",&f);
	y1=sqrt((-e+sqrt(e*e+f*f))/2);
	x1=f/(2*y1);
	y2=-sqrt((-e+sqrt(e*e+f*f))/2);
	x2=f/(2*y2);
	printf("__________________________________\n\n");
	printf("nghiem 1 la: %lf + %lfi\n",x1,y1);
	printf("nghiem 2 la: %lf + %lfi\n\n",x2,y2);
	printf("\n_____________________________________________________________\n\n");
	menu();
	
}

Nếu bạn dùng C++, đọc cho mình về pass by value và pass by reference.
Còn nếu bạn xài C, thì hãy dùng pointer. Chứ bạn truyền cả struct vào thế thì trong hàm chỉ là phiên bản copy thôi.
Vả lại, nếu trong hàm cũng khai báo variable a, bên ngoài cũng có variable a thì compiler chọn cái bên trong.

3 Likes

Bạn tìm hiểu về tham tri và tham chiếu nha

2 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?