Bài tập về cấu trúc STRUCT sử dụng con trỏ

Code không chạy được ở hàm “Đạo hàm đa thức”. Anh(chị) ai biết lỗi sai giúp em với ạ.

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


//f(x) = a1*x^N1 + .... + an 
typedef struct{
	float *heSo;
	int *soMu;
}DATHUC;

//Ham nhap
void nhapDaThuc(DATHUC **dt, const char name, int &n)
{
	printf("\nNhap bac da thuc %c: ", name);
	scanf("%d", &n);
	*dt = (DATHUC*)calloc(1, sizeof(DATHUC)); 
	(*dt)->heSo = (float*)calloc(n+1, sizeof(float));
	(*dt)->soMu = (int*)calloc(n+1, sizeof(int));
	
	for(int i = n; i >= 0; i--)
	{
		(*dt)->soMu[i] = i;
		printf("\n\nSo mu : %d", i);
		printf("\nHe so : ");
		scanf("%f", &((*dt)->heSo[i]));
	}
}

//Ham xuat da thuc ra man hinh
void xuatDaThuc(DATHUC *dt, char name, int n)
{
	printf("\nKet qua : \n");
	printf("%c =", name);
	for(int i = n; i >= 1; i--)
	{
		if(dt->heSo[i] != 0)
			printf(" %.0fx^%d +", dt->heSo[i], dt->soMu[i]);
		else 
			continue;
	}
	if(dt->heSo[0] != 0)
		printf(" %.0f ", dt->heSo[0]);
}

//Ham tinh F(x0) 
float tinh(DATHUC *dt, float x, int n)
{
	float kq; //ket qua
	for(int i = 0; i <= n; i++)
	{
		float tg = 1;
		for(int j = 0; j < dt->soMu[i]; j++)
		{
			tg *= x;
		}
		
		kq += *dt->heSo * tg;
	}
	
	return kq;
}

//Dao ham da thuc
DATHUC daoHam(DATHUC *dt, int n, int bacDaoHam)
{
	DATHUC *a=0;
	printf("\nDao ham cap? : ");
	scanf("%d", &bacDaoHam);
	
	*a = *dt; 
	
	for(int i = n; i >= n - bacDaoHam; i--)
	{
		for(int j = 1; j<=bacDaoHam ; j++)
		{
			a->heSo[i] *= a->soMu[i];
			a->soMu[i]--;
		}
	}

	for(int i = n - bacDaoHam - 1; i >= 0; i--)
	{
			a->heSo[i] = 0;
			a->soMu[i] = 0;
	}
	return *a;
}

int main(){
	
	DATHUC *P=0, *Q=0 , *F=0;
	int m=0, n=0, bac;
	float t = 0;
	
	nhapDaThuc(&P, 'P', m);
	nhapDaThuc(&Q, 'Q', n);
	
	xuatDaThuc(P, 'P', m);
	xuatDaThuc(Q, 'Q', n);
	
	t = tinh(P, 3, m);
	printf("\np(3) = %.0f", t);
	
	
	*F = daoHam(P, m, bac);
	xuatDaThuc(F, 'F', m-bac);

	return 0;
}

Đoạn này có 1 lỗi r. Phải là a = dt;. Vẫn còn nữa nhưng chưa kịp fix.

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


//f(x) = a1*x^N1 + .... + an
typedef struct {
	float *heSo;
	int *soMu;
} DATHUC;

//Ham nhap
void nhapDaThuc(DATHUC **dt, const char name, int *n) {
	printf("\nNhap bac da thuc %c: ", name);
	scanf("%d", n);
	*dt = (DATHUC*)calloc(1, sizeof(DATHUC));
	(*dt)->heSo = (float*)calloc(*n + 1, sizeof(float));
	(*dt)->soMu = (int*)calloc(*n + 1, sizeof(int));
	for(int i = *n; i >= 0; i--) {
		(*dt)->soMu[i] = i;
		printf("\n\nSo mu : %d", i);
		printf("\nHe so : ");
		scanf("%f", &((*dt)->heSo[i]));
	}
}

//Ham xuat da thuc ra man hinh
void xuatDaThuc(DATHUC *dt, char name, int n) {
	printf("\nKet qua : \n");
	printf("%c =", name);
	for(int i = n; i >= 0; i--) {
		if(dt->heSo[i] != 0) {
			if (dt->soMu[i] != 0)
				printf(" %.0fx^%d +", dt->heSo[i], dt->soMu[i]);
			else
				printf(" %.0f", dt->heSo[i]);
		}
	}
//	if(dt->heSo[0] != 0)
//		printf(" %.0f ", dt->heSo[0]);
}

//Ham tinh F(x0)
float tinh(DATHUC *dt, float x, int n) {
	float kq; //ket qua
	for(int i = 0; i <= n; i++) {
		float tg = 1;
		for(int j = 0; j < dt->soMu[i]; j++) {
			tg *= x;
		}

		kq += *dt->heSo * tg;
	}

	return kq;
}

//Dao ham da thuc
DATHUC *daoHam(DATHUC *dt, int n, int *bacDaoHam) {
	DATHUC *a=0;
	printf("\nDao ham cap? : ");
	scanf("%d", bacDaoHam);

	a = dt;

	for(int i = n; i > n - *bacDaoHam; i--) {
		for(int j = 0; j <= n ; j++) {
			a->heSo[j] *= (float)(a->soMu[j]);
			a->soMu[j]--;
		}
	}
	return a;
}

int main() {

	DATHUC *P = 0, *Q = 0, *F = 0;
	int m = 0, n = 0, bac;
	float t = 0;

	nhapDaThuc(&P, 'P', &m);
	nhapDaThuc(&Q, 'Q', &n);

	xuatDaThuc(P, 'P', m);
	xuatDaThuc(Q, 'Q', n);

	t = tinh(P, 3, m);
	printf("\np(3) = %.0f", t);


	F = daoHam(P, m, &bac);
	xuatDaThuc(F, 'F', m);

	return 0;
}

Bạn thử code mình fix lại xem nha. :slightly_smiling_face:

1 Like

Em chưa hiểu rõ ràng về con trỏ sử dụng trong này, anh giải thích cho em được không ạ

Bạn chưa hiểu chỗ nào nhỉ. Mà mình thấy kiến thức về con trỏ của bạn chưa vững lắm, bạn nên xem lại kiến thức về con trỏ đã. Vì quan trọng nhất, nền tảng nhất trong c / c++ có thể nói là phần con trỏ.

2 Likes

chỗ khai báo hàm con trỏ *daoHam (…), sao cần dùng con trỏ ở dây ạ
e mới học về con trỏ nên chưa vũng kiến thức

Vì khi bạn gán giá trị của function daoHam cho F, mà trong khi đó F là kiểu con trỏ nên bạn cũng phải để daoHan là con trỏ.

A post was split to a new topic: Truyền tham chiếu

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