Chuyên đề về đa thức một biến trong Pascal

49
Lập trình Pascal

– Để lưu trữ một đa thức ta chỉ cần lưu các hệ số (bằng một mảng)và bậc của đa thức.

– Các phép toán đối với một đa thức gồm cộng, trừ, nhân, chia hai đa thức.

– Việc tính giá trị đa thức tại một giá trị của biến được thực hiện thông qua lược đồ hooc nơ hoặc tính trực tiếp. 

Bài tập 1: Viết chương trình cho phép cộng hai đa thức. Kết quả in ra dạng:

          a­nx^n + … + a1x + a0

Giải thuật:

– Dùng hai mảng A, B để lưu hệ số của hai đa thức. Có thể dùng mảng thứ ba C hoặc dùng lại một trong hai mảng A, B  để lưu hệ số của đa thức tổng.

– Khi in kết quả cần kiểm tra hệ số để in dấu cho đúng.

Program Cong_da_thuc;
uses crt;
Type KM = array[0..10] of integer;
Var A,B: KM;
      n: byte;
Procedure NhapDT(Var A: KM; n:byte);
Var i: byte;
Begin
     For i:=n downto 0 do
     Begin Write('M[',i,']='); Read(A[i]);  End;
End;
Procedure CONG(Var A:KM;B:KM;n:byte);
Var i: byte;
Begin
    For i:= 0 to n do A[i]:=A[i]+B[i];
End;
Procedure INDT(A:KM;n:byte);
Var i: byte;
Begin
    if A[n] <> 0 then Write(A[n],'x^',n);
    For i:=n-1 downto 0 do
     if A[i] <> 0 then
      if A[i] < 0 then write(A[i],'x^',i) else Write('+',A[i],'x^',i);
End;
Begin
     clrscr;
     Write('Nhap bac n: ');Readln(n);
     Writeln('Nhap da thuc A: '); NhapDT(A,n);
     Writeln('Nhap da thuc B: '); NhapDT(B,n);
     clrscr;
     Indt(A,n); Writeln;
     Indt(B,n); Writeln;
     Cong(A,B,n);
     Writeln('Da thuc tong: ');
     Indt(A,n);
     Readln;
     Readln
End.

Bài tập 2: Viết chương trình cho phép tính giá trị của đa thức A(x) tại giá trị x = x0.

Giải thuật:

– Dùng chương trình con để tính xn.

Program Gia_tri_cua_da_thuc;
Var n,i: integer;
    x,a,s:real;
Function XMU(x:real; n:integer):real;
Var i: integer;
    Mu: real;
Begin
    Mu:=1;
    For i:=1 to n do Mu:=Mu*x;
    XMU:=Mu;
End;
Begin
     Write('Nhap bac cua da thuc n = '); Readln(n);
     Write('Tinh f(x) tai x = ');Readln(x);
     S:=0;
     For i:=n downto 0 do
     Begin
          Write('a',i,'= '); Readln(a);
          S:=S+a*XMU(x,i);
     End;
     Writeln('F(',x:5:2,')= ',S:5:2);
     Readln;
End.

Bài tập 3: Viết chương trình tính giá trị của đa thức A(x) với điều kiện không dùng biến mảng.

Viết chương trình tính giá trị của đa thức f(x) = anxn + … +a1x + a0 tại x = x0.

Thuật toán:

f(x) = anxn + … +a1x + a0 = a0 + x(a1 + x(a2 + … x(an-1 + x(an))…))

Lặp lại việc: Đọc và cộng hệ số rồi nhân với x từ hệ số an  đến hệ số a0.

Program Gia_tri_da_thuc;
Var S,a,x: real;
      n,i: byte;
Begin
     Write('Nhap bac cua da thuc. n = '); Readln(n);
     Write('Tinh f(x) tai x = ');Readln(x);
     S:=0;
     For i:= n downto 0 do
     Begin
          Write('a',i,'=');Readln(a);
          S:=(S+a)*x;
     End;
     Write('f(',x:3:1,')=',S:5:1);
     Readln
End.

Bài tập 4: Viết chương trình cho phép nhân hai đa thức đã sắp xếp.

Thuật toán: Tích đa thức A bậc m với đa thức B bậc n là đa thức C bậc m + n. Trong đó: C[m] = Tổng của các tích A[i] * A[j] sao cho i+j = m.

Program Nhan_da_thuc;
Var m,n,i,j:byte;
    A, B, C: array[0..10] of real;
Begin
    Write(' Nhap bac cua da thuc A: '); Readln(m);
    For i:= m downto 0 do
    Begin
         Write('A[',i,']= '); Readln(A[i]);
    End;
    Write(' Nhap bac cua da thuc B: '); Readln(n);
    For i:= n downto 0 do
    Begin
         Write('B[',i,']= '); Readln(B[i]);
    End;
    For i:=0 to m+n do C[i]:=0;
    For i:=0 to m do
     For j:=0 to n do C[i+j]:=C[i+j]+A[i]*B[j];
    For i:= m+n downto 0 do if C[i]<>0 then Write(C[i]:3:1,'x^',i,' + ');
    Readln
End.

Bài tập 5: Viết chương trình cho phép chia hai đa thức để tìm đa thức thương và đa thức dư.

Program Chia_da_thuc;
uses crt;
Type KM = array[0..10] of real;
Var A,B,C,AB,D: KM;
     i,n,cs,bc: byte;
Procedure NhapDT(Var A: KM; n:byte);
Var i: byte;
Begin
     For i:=n downto 0 do
     Begin Write('M[',i,']='); Read(A[i]);  End;
End;
Function BAC(A:KM;n:integer):Byte;
Var i:Byte;
Begin
    i:=n;
    While (A[i]=0) and (i> 0) do i:=i-1;
    BAC:=i;
End;

Procedure TRU(Var A:KM;B:KM;n:byte);
Var i: byte;
Begin
    For i:= 0 to n do A[i]:=A[i]-B[i];
End;
Procedure NHAN(Var C:KM;A,B:KM; Var n:byte);
Var i,j:byte;
    TAM:KM;
Begin
    n:=Bac(A,n)+Bac(B,n);
    For i:= 0 to 2*n do TAM[i]:=0;
    For i:= 0 to n do
       For j:=0 to n do TAM[i+j]:=TAM[i+j]+A[i]*B[j];
    For i:=0 to 2*n do C[i]:=TAM[i];
End;
Procedure INDT(A:KM;n:byte);
Var i: byte;
Begin
    if A[n] <> 0 then Write(A[n]:3:1,'x^',n);
    For i:=n-1 downto 0 do
     if A[i] <> 0 then
      if A[i] < 0 then write(A[i]:3:1,'x^',i) 
      else Write('+',A[i]:3:1,'x^',i);
End;
Procedure DT_BAC(Var A:KM;Bac:byte;gt:real);
Var i:byte;
Begin
    For i:=1 to n do A[i]:=0;
    A[Bac]:=gt;
End;
Begin
     clrscr;
     Write('Nhap bac cua da thuc bi chia: ');Readln(n);
     Writeln('Nhap da thuc A: '); NhapDT(A,n);
     Writeln('Nhap da thuc B: '); NhapDT(B,n);
     clrscr;
     Write('Da thuc bi chia: ');Indt(A,n); Writeln;
     Write('Da thuc chia: ');Indt(B,n); Writeln;
     bc:=Bac(A,n)-Bac(B,n); {Luu bac cua da thuc C}
     For i:=1 to bc do C[i]:=0;
     While BAC(A,n) >= BAC(B,n) do
     Begin
         cs:=BAC(A,n)-BAC(B,n);
         C[cs]:=A[Bac(A,n)]/B[Bac(B,n)];
         Writeln('C[',cs,']=',C[cs]:3:1);
         DT_BAC(D,cs,C[cs]);Writeln;
         Write('Da thuc D:');
         Indt(D,n);
         NHAN(AB,B,D,n);Writeln;
         Write('Da thuc AB:');
         Indt(AB,n);Writeln;
         TRU(A,AB,n);
         Write('Da thuc A moi:');
         Indt(A,n);
     End;
     Writeln('Da thuc thuong: ');
     Indt(C,bc);
     Readln;
     Readln
End.