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

Đề tài: máy tính đa thức,thực hiện 3 phép tính của đa thức

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

    Mặc định máy tính đa thức,thực hiện 3 phép tính của đa thức

    tính tổng,hiệu của 2 đa thức,tính giá trị của 2 đa thức tại số k bất kì(sử dụng con trỏ để tính
    code

    Code:
    #include<stdio.h>
    #include<conio.h>
    #include<dos.h>
    #define F1 59
    #define F2 60
    #define F3 61
    #define F4 62
    #define F10 68
    
    void dathuc(float *A,int n,char c)
     {
      int i;float t;
       for(i=0;i<n;i++)
        {
         printf("\nDA THUC %c BAC [%d]=",c,i);
          scanf("%f",&t);
           A[i]=t;
    	}
    
    	  }
    
    void in_dathuc(float *A,int n)
     {
      int i;
       for(i=0;i<n;i++)
        printf("%7.2f",A[i]);
         printf("\n");
          delay(2000);
           }
    float val_dathuc(float *A,int n)
    {
     float s=A[n-1],k;int i,j;
      printf("\n nhap k=");
       scanf("%f",&k);
        for(i=n-2;i>=0;i--)
         s=s*k+A[i];
          printf("\n S=%6.2f",s);delay(2000);return(s);
           }
    void tong(float *C,float *A ,float *B , int n,int m)
    {
     int k,i,j;
      if(n>m)
       {
        k=n;
         for(i=0;i<m;i++)
          C[i]=A[i]+B[i];
           for(i=m;i<n;i++)
    	C[i]=A[i];
    	 }
    	  else
    	   {
    	    k=m;
    	     for(i=0;i<n;i++)
    	      C[i]=A[i]+B[i];
    	       for(i=n;i<m;i++)
    		C[i]=B[i];
    		 }
    		  printf("\n da thuc tong duoc tinh");
    		   in_dathuc(C,k);
    		    }
    
    void hieu(float *C,float *A,float *B,int n,int m)
    {
     int k,i,j;
      if(n>m)
       {
        k=n;
         for(i=0;i<m;i++)
          C[i]=A[i]-B[i];
           for(i=m;i<n;i++)
    	C[i]=A[i];
    	 }
    	  else{
    	   k=m;
    	    for(i=0;i<n;i++)
    	     C[i]=A[i]-B[i];
    	      for(i=n;i<m;i++)
    	       C[i]=B[i];
    		}
    		 printf("\n da thuc hieu:");
    		  in_dathuc(C,k);
    		   }
    
    void thuc_hien(void)
    {
     float A[100],B[100],C[100];
      int n,m,control=0;char phim; 
       printf("\n 	  CHAO MUNG\n    bac cua da thuc A:");
        scanf("%d",&n);
         printf("\n    Bac cua da thuc B:");
          scanf("%d",&m);
           n=n+1;m=m+1;
    	do
    	 {
    	  clrscr();
    	   printf("\n         CHUONG TRINH GIAI 4 PHEP TOAN TREN DA THUC\n                     MENU DIEU KHIEN\n\n");
    	    printf("\n F1- NHAP HANG TU CUA DA THUC\n ");
    	     printf("\n F2 tinh GIA TRI da thuc tai diem k=\n ");
    	      printf("\n F3 TONG 2 da thuc\n ");
    	       printf("\n F4 HIEU 2 da thuc\n");
    		printf("\n F10 KET THUC chuong trinh\n");
    		 phim=getch();
    		  switch(phim)
    		   {
    		    case F1:control=1;
    		     dathuc(A,n,'A');
    		      dathuc(B,m,'B');break;
    		       case F2:
    			if(control)
    			 {
    			  val_dathuc(A,n);
    			   val_dathuc(B,m);
    			    }
    			     break;
    			      case F3:
    			       if(control)
    				tong(C,A,B,n,m);
    				 break;
    				  case F4:
    				   if(control)
    				    hieu(C,A,B,n,m);
    				     break;
    				      }
    				       }
    					while(phim!=F10);
    					 printf("\n DA KET THUC "); }
    void main(void)
    {clrscr();thuc_hien();getch();}

    3.5.1- Con trỏ và mảng
    Mảng trong C thực chất là một hằng con trỏ, do vậy, mọi thao tác đối với mảng đều có thể được thực hiện thông qua con trỏ.
    Khai báo
    int a[10];
    xác định mảng có kích thước 10 phần tử int, tức là một khối 10 đối tượng liên tiếp có tên a[0], a[1],...a[9]. Cú pháp a[i] có nghĩa là phần tử của mảng ở vị trí thứ i kể từ vị trí đầu. Nếu pa là con trỏ tới một số nguyên, được khai báo là
    int *pa;
    thì phép gán
    pa = &a[0];
    sẽ đặt pa để trỏ tới phần tử đầu của a; tức là pa chứa địa chỉ của a[0]. Bây giờ phép gán
    x = *pa;
    sẽ sao nội dung của a[0] vào x.
    Nếu pa trỏ tới một phần tử của bảng a thì theo định nghĩa, pa + 1 sẽ trỏ tới phần tử tiếp theo và pa -i sẽ trỏ tới phần tử thứ i trước pa, pa + i sẽ trỏ tới phần tử thứ i sau pa. Vậy nếu pa trỏ tới a[0] thì
    *(pa + 1)
    sẽ cho nội dung của a[1], pa+i là địa chỉ của a[i] còn *(pa + i) là nội dung của a[i].
    Các lưu ý này là đúng bất kể đến kiểu của biến trong mảng a. Định nghĩa “cộng 1 vào con trỏ” sẽ được lấy theo tỉ lệ kích thước lưu trữ của đối tượng mà pa trỏ tới. Vậy trong pa + i, i sẽ được nhân với kích thước của đối tượng mà pa trỏ tới trước khi được cộng vào pa.
    Sự tương ứng giữa việc định chỉ số và phép toán số học trên con trỏ là rất chặt chẽ. Trong thực tế, việc tham trỏ tới mảng được trình biên dịch chuyển thành con trỏ tới điểm đầu của mảng. Kết quả là tên mảng chính là một biểu thức con trỏ. Vì tên mảng là đồng nghĩa với việc định vị phần tử thứ 0 của mảng a nên phép gán
    pa = &a[0];
    cũng có thể viết là
    pa = a;
    Điều cần chú ý là để tham trỏ tới a[i] có thể được viết dưới dạng *(a + i). Trong khi tính a[i], C chuyển tức khắc nó thành *(a + i); hai dạng này hoàn toàn là tương đương nhau. áp dụng phép toán & cho cả hai dạng này ta có a[i] và a + 1 là địa chỉ của phần tử thứ i trong bảng a. Mặt khác nếu pa là con trỏ thì các biểu thức có thể sử dụng nó kèm thêm chỉ số: pa[i] đồng nhất với *(pa + i). Tóm lại, bất kì một mảng và biểu thức chỉ số nào cũng đều được viết như một con trỏ và phần phụ và ngược lại, ngay cả trong cùng câu lệnh.
    Có một sự khác biệt giữa tên mảng và con trỏ cần phải nhớ. Con trỏ là một biến, nên pa = a và pa ++ đều là các phép toán đúng, còn tên mảng là một hằng chứ không là biến: kết cấu kiểu a = pa hoặc a + + hoặc p = &a là không hợp lệ.
    Khi truyền một tên mảng cho hàm thì tên của mảng là địa chỉ đầu của mảng, do vậy, tên mảng thực sự là con trỏ. Ta có thể dùng sự kiện này để viết ra bản mới của strlen, tính chiều dài của xâu kí tự.
    int strlen( char * s) /*cho chiều dài của xâu s*/
    {
    int n;
    for (n = 0; *s ! = ’\ 0’; s + +)
    n + +;
    return(n);
    }
    Việc tăng s là hoàn toàn hợp pháp vì nó là biến con trỏ; s + + không ảnh hưởng tới xâu kí tự trong hàm gọi tới strlen mà chỉ làm tăng bản sao riêng của địa chỉ trong strlen.
    Vì các tham biến hình thức trong định nghĩa hàm
    char s[ ]; và char *s; là hoàn toàn tương đương. Khi truyền một tên mảng cho hàm, hàm có thể coi rằng nó xử lí hoặc mảng hoặc con trỏ là giống nhau. Một khía cạnh khác, nếu p và q trỏ tới các thành phần của cùng một mảng thì có thể áp dụng được các quan hệ như <, < =, > = v.v... chẳng hạn
    p < q
    là đúng, nếu p con trỏ tới thành phần đứng trước thành phần mà q trỏ tới trong mảng. Các quan hệ = = và != cũng áp dụng được. Có thể so sánh một con trỏ với giá trị NULL. Nhưng so sánh các con trỏ trỏ tới các mảng khác nhau sẽ không đưa lại kết quả mong muốn.
    Tiếp nữa, chúng ta đã quan sát rằng con trỏ và số nguyên có thể cộng hoặc trừ cho nhau. Kết cấu
    p + n
    nghĩa là đối tượng thứ n sau đối tượng do p trỏ tới. Điều này đúng với bất kể loại đối tượng nào mà p được khai báo sẽ trỏ tới; trình biên dịch sẽ tính tỉ lệ n theo kích thước của các đối tượng do p trỏ tới, điều này được xác định theo khai báo của p. Chẳng hạn trên PC AT, nhân từ tỉ lệ là 1 đối với char, 2 đối với int và short, 4 cho long và float.
    Phép trừ con trỏ cũng hợp lệ; nếu p và q trỏ tới các thành phần của cùng một mảng thì p - q là số phần tử giữa p và q. Dùng sự kiện này ta có thể viết ra một bản khác cho strlen:
    /*cho độ dài xâu s*/
    int strlen( char *s) {
    char *p = s;
    while (*p ! = ’\ 0’)
    p + +;
    return(p-s);
    }
    Trong khai báo, p được khởi đầu là s, tức là trỏ tới kí tự đầu tiên. Chu trình while, kiểm tra lần lượt từng kí tự xem đã là ‘\ 0’ chưa để xác định cuối xâu. Vì ‘\ 0’ là 0 và vì while chỉ kiểm tra xem biểu thức có là 0 hay không nên có thể bỏ phép thử tường minh, vậy ta có thể viết lại chu trình trên
    while (*p)
    p + +;
    Do p trỏ tới các kí tự nên p + + sẽ chuyển p để trỏ sang kí tự tiếp từng lúc, và p - s sẽ cho số các kí tự đã lướt qua, tức là độ dài của xâu. Ví dụ sau minh hoạ rõ ràng về phương pháp sử dụng con trỏ.
    Đã được chỉnh sửa lần cuối bởi AlexF : 16-02-2008 lúc 08:23 PM.

  2. #2
    Ngày gia nhập
    01 2008
    Bài viết
    41

    sao cái code của bạn như cầu thang thế kia, trông độc đáo fet', còn vẫn chưa rõ mục đích viết bài của bạn cho lắm, kô fai? là hỏi, còn nếu là dạy cho người khác thì cách trình bày của bạn thật sự là rất khó nhìn

  3. #3
    Ngày gia nhập
    11 2007
    Nơi ở
    Biết để làm gì?
    Bài viết
    827

    Cái này dùng single linked list sẽ hay hơn dùng mảng
    Cánh Chym ứ mỏi

  4. #4
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Trích dẫn Nguyên bản được gửi bởi dieucay555 Xem bài viết
    Cái này dùng single linked list sẽ hay hơn dùng mảng
    Hay thiệt hả, bạn có thể chỉ rõ điều đó và đưa ra một ví dụ cụ thể không? Dr cũng không biết sử dụng link-list nè, thấy bạn nói tò mò quá. Cảm ơn bạn nhé!
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  5. #5
    Ngày gia nhập
    03 2009
    Bài viết
    2

    ah bro có thể giúp đỡ em bài toán này được không, cũng giống với bài trên nhưng viết trên nền Dev c++: thực hiện cài đặt đa thức bằng danh sách liên kết, thực hiện các phép tính đơn giản trên đa thức như: cộng, trừ, nhân, chia, đạo hàm. cám ơn mấy anh rất nhiều
    Đã được chỉnh sửa lần cuối bởi ancntt : 06-03-2009 lúc 10:16 PM.

  6. #6
    Ngày gia nhập
    05 2009
    Nơi ở
    Dak Nong
    Bài viết
    1

    Mặc định máy tính đa thức,thực hiện 3 phép tính của đa thức

    Mình đã text thử bài của bạn!!!
    Nói chung nhìn bề ngoài thì rất hay.
    Nhưng nói về phần đa thức thì có bao gồm nhiều đơn thức, mỗi đơn thức bao gồm phần hệ số và số mũ có thể giống hoặc khác nhau và có thể âm hoặc dương.
    Thí dụ:
    Phép trừ 2 đa thức có dạng

    (6X^-5 - 4X^3 + 3X^2) - (-X^6 + ....+3X^2)

    Thì tất cả dấu trong đa thức B đều phải đổi
    hay nhiều cái phức tạp khác.

    vì vậy
    Để thực hiện các phép tính giữa 2 đa thức thì mình nghĩ không phải đơn giản như vậy đâu bạn.

    Mà đây hình như bạn làm nhầm cộng hai mảng với nhau thì phải.
    Đã được chỉnh sửa lần cuối bởi nhoc_dakmil : 16-10-2009 lúc 11:51 PM.
    Người Chủ, Người Thầy, Người Cha... Phải được tôn trọng.

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