Giúp em với,C+ bài tập về mảng 2 chiều

Phân tích và thiết kế hướng đối tượng( lớp ) để thiết kế máy tính tính toán các số nguyên ( xét cả âm dương ), có các thao tác nhập số nguyên có dấu, phép cộng, phép nhân và phép lấy số dư(%) theo cấu trúc dữ liệu : mảng của các ký số, mảng của các số nguyên và danh sách liên kết các số nguyên.
cái này là dùng mảng để lưu số nguyên lớn và thực hiện tính toán nhưng phần tính toán vẫn bị lằng nhằng.Các bác giúp em với nhớ
nói rõ 1 chút được ko machan. Chọn 1 trong 3 cách: mảng của các ký số, mảng của các số nguyên và danh sách liên kết các số nguyên để làm àh? hay là làm cả 3.
 
em mới học C có ai bít cách sắp xếp số theo thứ tự tăng dần ko chỉ em(ko dùng mảng với có dùng luôn) vd nhập 2 5 4 7 1 thì kết quả sẽ là 1 2 4 5 7
 
nói rõ 1 chút được ko machan. Chọn 1 trong 3 cách: mảng của các ký số, mảng của các số nguyên và danh sách liên kết các số nguyên để làm àh? hay là làm cả 3.
Dùng cả 3 ạ.Tức là số nguyên quá lớn thì được lưu theo định dạng mảng chứ ko phải là 1 biến :D ;;) ;;) :x Bác huunhon giúp em nhé. :x :x :x
 
Mới làm được 2 phép toán cộng và nhân sử dụng danh sách liên kết thôi. Xem thử xem đúng yêu cầu chưa nha bạn. Nếu có lỗi gì thì báo lại để tui sửa, vì mới viết chưa kiểm tra kĩ các trường hợp.
Còn phép chia lấy dư để mai làm tiếp, bây giờ buồn ngủ quá rồi

Hôm nay mới rảnh để viết cho xong.
Bạn fix lại hàm del_zero và thêm vào hàm chia lấy phần dư là xong project rồi đó.
Nếu chạy có lỗi gì thì cứ báo, mình sẽ fix lại.

PHP:
void del_zero(List &list)//xoa ky tu 0 vo nghia 
{
	while (list.head->entry==0&&list.head->next!=NULL)
	{
		list.head=list.head->next;
		list.count--;
	}
	
}
void mod(List b1,List b2,List &kq)//chia lay phan du
{
	List temp,temp1,temp2;
	Node *p=b1.head,*q=b2.head;
	int d2=b2.size();
	while (p!=NULL)
	{
		do
		{
			temp.insert(temp.size(),p->entry);
			p=p->next;
		}
		while (compare(temp,b2)==-1);
		while (compare(temp,b2)!=-1)
		{
			temp1.clear();
			simple_subtract(temp,b2,temp1);
			temp=temp1;
			temp.count=temp1.count;
		}
	}
	kq=temp;
	kq.dau=b1.dau*b2.dau;
}
 

Attachments

Cảm ơn huunhon nhiều lắm.Mấy hôm nghỉ tết phải ngồi nghiên cứu mới được

Cho em post bài liên tiếp cái, vì cần gấp
To Huunhon: Bài tập của mình thầy yêu cầu hướng đối tượng theo dạng : khai báo hàm ở file*.h còn định nghĩa hàm ở file *.cpp( ví dụ có lớp list thì khai báo các hàm list(), insert() ,... ở file list.h còn định nghĩa hàm thì ở file list.cpp) và tất cả các hàm đều viết trong lớp( quan trọng nhất là các hàm cộng, nhân, lấy dư ).Riêng các biến của lớp thì để private chứ ko để public.Và dữ liệu đầu vào có dạng "11111111111111 + 1111111111111111".Tại hôm qua mới đọc được bài bác đã thử sửa theo yêu cầu nhưng vẫn có lỗi bác sửa hộ em được không ?Giúp em nhá
 
Cho em post bài liên tiếp cái, vì cần gấp
To Huunhon: Bài tập của mình thầy yêu cầu hướng đối tượng theo dạng : khai báo hàm ở file*.h còn định nghĩa hàm ở file *.cpp( ví dụ có lớp list thì khai báo các hàm list(), insert() ,... ở file list.h còn định nghĩa hàm thì ở file list.cpp) và tất cả các hàm đều viết trong lớp( quan trọng nhất là các hàm cộng, nhân, lấy dư ).Riêng các biến của lớp thì để private chứ ko để public.Và dữ liệu đầu vào có dạng "11111111111111 + 1111111111111111".Tại hôm qua mới đọc được bài bác đã thử sửa theo yêu cầu nhưng vẫn có lỗi bác sửa hộ em được không ?Giúp em nhá

Mình nghĩ những yêu cầu này bạn nên tự làm để hiểu rõ hơn, vì tương đối đơn giản. Mình chỉ giúp về giải thuật thôi.
 
Cho mình hỏi bài này cái::-/
Tính tổng các giá trị cực trị trong ma trận số thực.một giá trị được gọi là cực trị khi lớn hơn hoặc nhỏ hơn tất cả phần tử lân cận(tối đa 8 phần tử):-s
huunhon chỉ hộ mình cách xét mấy trường hợp ở biên sao cho đơn giản.:whew: ..chứ ngồi liệt kê các trường hợp thì thấy dài quá.Các trường hợp nằm giữa thì mình đã có cách rùi.Thx nhìu
 
sac bai nay cung~ ma can su giup do~ cua? quan` than` a` chan' qua'
 
Cho mình hỏi bài này cái::-/
Tính tổng các giá trị cực trị trong ma trận số thực.một giá trị được gọi là cực trị khi lớn hơn hoặc nhỏ hơn tất cả phần tử lân cận(tối đa 8 phần tử):-s
huunhon chỉ hộ mình cách xét mấy trường hợp ở biên sao cho đơn giản.:whew: ..chứ ngồi liệt kê các trường hợp thì thấy dài quá.Các trường hợp nằm giữa thì mình đã có cách rùi.Thx nhìu

Chưa nghĩ ra cách nào đơn giản hơn, chịu khó ngồi liệt kê vậy
PHP:
void tong(float *a[],int n)
{
	float tong=0;
    for (int i=0;i<n;i++) 
    { 
        for (int j=0;j<n;j++) 
		{
			if (i==0 && j==0)
			{
				if ((a[i][j]>a[i+1][j] && a[i][j]>a[i+1][j+1] && a[i][j]>a[i][j+1]) || (a[i][j]<a[i+1][j] && a[i][j]<a[i+1][j+1] && a[i][j]<a[i][j+1]))
					tong+=a[i][j];
			}
			else if (i==0 && j==n-1)
			{
				if ((a[i][j]>a[i+1][j] && a[i][j]>a[i+1][j-1] && a[i][j]>a[i][j-1]) || (a[i][j]<a[i+1][j] && a[i][j]<a[i+1][j-1] && a[i][j]<a[i][j-1]))
					tong+=a[i][j];
			}
			else if (i==n-1 && j==0)
			{
				if ((a[i][j]>a[i-1][j] && a[i][j]>a[i-1][j+1] && a[i][j]>a[i][j+1]) || (a[i][j]<a[i-1][j] && a[i][j]<a[i-1][j+1] && a[i][j]<a[i][j+1]))
					tong+=a[i][j];
			}
			else if (i==n-1 && j==n-1)
			{
				if ((a[i][j]>a[i-1][j] && a[i][j]>a[i-1][j-1] && a[i][j]>a[i][j-1]) || (a[i][j]<a[i-1][j] && a[i][j]<a[i-1][j-1] && a[i][j]<a[i][j-1]))
					tong+=a[i][j];
			}
			else if (i==0)
			{
				if ((a[i][j]>a[i][j-1] && a[i][j]>a[i][j+1] && a[i][j]>a[i+1][j-1] && a[i][j]>a[i+1][j] && a[i][j]>a[i+1][j+1]) || (a[i][j]<a[i][j-1] && a[i][j]<a[i][j+1] && a[i][j]<a[i+1][j-1] && a[i][j]<a[i+1][j] && a[i][j]<a[i+1][j+1]))
					tong+=a[i][j];
			}
			else if (i==n-1)
			{
				if ((a[i][j]>a[i][j-1] && a[i][j]>a[i][j+1] && a[i][j]>a[i-1][j-1] && a[i][j]>a[i-1][j] && a[i][j]>a[i-1][j+1]) || (a[i][j]<a[i][j-1] && a[i][j]<a[i][j+1] && a[i][j]<a[i-1][j-1] && a[i][j]<a[i-1][j] && a[i][j]<a[i-1][j+1]))
					tong+=a[i][j];
			}
			else if (j==0)
			{
				if ((a[i][j]>a[i+1][j] && a[i][j]>a[i-1][j] && a[i][j]>a[i+1][j+1] && a[i][j]>a[i][j+1] && a[i][j]>a[i+1][j+1]) || (a[i][j]>a[i+1][j] && a[i][j]>a[i-1][j] && a[i][j]>a[i+1][j+1] && a[i][j]>a[i][j+1] && a[i][j]>a[i+1][j+1]))
					tong+=a[i][j];
			}
			else if (j==n-1)
			{
				if ((a[i][j]>a[i+1][j] && a[i][j]>a[i-1][j] && a[i][j]>a[i+1][j-1] && a[i][j]>a[i][j-1] && a[i][j]>a[i+1][j-1]) || (a[i][j]>a[i+1][j] && a[i][j]>a[i-1][j] && a[i][j]>a[i+1][j-1] && a[i][j]>a[i][j-1] && a[i][j]>a[i+1][j-1]))
					tong+=a[i][j];
			}
			else 
			{
				if ((a[i][j]>a[i-1][j-1] && a[i][j]>a[i-1][j] && a[i][j]>a[i-1][j+1] && a[i][j]>a[i][j-1] && a[i][j]>a[i][j+1] && a[i][j]>a[i+1][j-1] && a[i][j]>a[i+1][j] && a[i][j]>a[i+1][j+1]) || (a[i][j]<a[i-1][j-1] && a[i][j]<a[i-1][j] && a[i][j]<a[i-1][j+1] && a[i][j]<a[i][j-1] && a[i][j]<a[i][j+1] && a[i][j]<a[i+1][j-1] && a[i][j]<a[i+1][j] && a[i][j]<a[i+1][j+1]))
					tong+=a[i][j];
			}
		}
	}
	printf("Tong cua cac cuc tri: %f",tong);
}
 
Mình mới nghĩ ra cách này huunhon coi được ko góp ý kiến với...thx
PHP:
int vitridautien(int a[],int b[],int m,int n,int d,int c)
{
	for(int i=0;i<8;i++)
		if(d+a[i]>=0&&d+a[i]<m&&c+b[i]>=0&&c+b[i]<n)
			return i;
}
int ktcuctri(float a[][100],int m,int n,int d,int c)
{
	int dong[8]={-1,-1,-1,0,1,1,1,0};
	int cot[8]={-1,0,1,1,1,0,-1,-1};
	int vt=vitridautien(dong,cot,m,n,d,c);
	for(int i=0;i<8;i++)
	{
		if(d+dong[i]==-1||d+dong[i]==m||c+cot[i]==-1||c+cot[i]==n)
			continue;
        if((a[d][c]-a[d+dong[vt]][c+cot[vt]])*(a[d][c]-a[d+dong[i]][c+cot[i]])<=0)
			return 0;
	}
	return 1;
}

float tongcuctri(float a[][100],int m,int n)
{
	float s=0;
    for(int i=0;i<m;i++)
		for(int j=0;j<n;j++)
			if(ktcuctri(a,m,n,i,j)==1)
				s+=a[i][j];
	return s;
}
 
Cách bạn làm quá hay rồi :). Chỉ góp ý 1 chút ở vòng lặp này, bạn chỉ cần chạy từ vị trí i=vt trở đi thôi, vì từ i=0 ->i=vt đã kiểm tra rồi:
PHP:
    for(int i=vt;i<8;i++) 
    { 
        if(d+dong[i]==-1||d+dong[i]==m||c+cot[i]==-1||c+cot[i]==n) 
            continue; 
        if((a[d][c]-a[d+dong[vt]][c+cot[vt]])*(a[d][c]-a[d+dong[i]][c+cot[i]])<=0) 
            return 0; 
    }
 
anh huunhon có biết cái web nào down cái C này về không vậy, ::( em search hoài mà không có ra (+.+)
 
Hix..huunhon ơi coi hộ bài này cái.::)
Đây là bài tập bên trừu tượng hóa dữ liệu.
Nó yêu cầu nhập vào 1 tam giác trong không gian Oxy.Cho bít dạng tam giác đó :đều,vuông cân,vuông,cân,thường.
Mình vít hàm đó như sau,và nó chạy sai cho 1 trường hợp là tam giác vuông=(( (vụ không phải tam giác thì đã có hàm khác kiểm tra rùi)
Nhưng kì ở chỗ là khi chạy debug thì nó dở chứng sao ấy:
giả sử tam giác vuông ở A đi,chạy debug thì rõ ràng a*a =b*b+c*c ,cả bảng debug cũng hiện ra vậy mà biến vuong ko đổi....vẫn bằng 0 ==>sai
PHP:
struct DIEM
{
	float x;
	float y;
};
struct TAMGIAC
{
	DIEM A;
	DIEM B;
	DIEM C;
};
float khoangcach(DIEM P,DIEM Q)
{
	return sqrt( (P.x-Q.x)*(P.x-Q.x)+(P.y-Q.y)*(P.y-Q.y) ) ;
}
int ktdang(TAMGIAC X)
{
	float a,b,c;
	a = khoangcach(X.C , X.B);
	b = khoangcach(X.A , X.C);
	c = khoangcach(X.A , X.B);
	int can=0,vuong=0,deu=0;
	if(a==b&&b==c)
		deu=1;
	if(a==b||b==c||c==a)
		can=1;
	if(a*a==b*b+c*c ||b*b==a*a+c*c ||c*c==a*a+b*b)
		vuong=1;
	if(deu==1)
		return -2;
	if(vuong==1&&can==1)
		return -1;
	if(vuong==1)
		return 0;
	if(can==1)
		return 1;
	return 2;
}
 
Em mới học lập trình các anh chỉ dùm em bài tập này với : vẽ ngôi sao ra màn hình dùng : do...while, while, for.
Em bó tay rồi .
(ngôi sao 5 cánh nhé. Thanks )
 
Hix..huunhon ơi coi hộ bài này cái.::)
Đây là bài tập bên trừu tượng hóa dữ liệu.
Nó yêu cầu nhập vào 1 tam giác trong không gian Oxy.Cho bít dạng tam giác đó :đều,vuông cân,vuông,cân,thường.
Mình vít hàm đó như sau,và nó chạy sai cho 1 trường hợp là tam giác vuông=(( (vụ không phải tam giác thì đã có hàm khác kiểm tra rùi)
Nhưng kì ở chỗ là khi chạy debug thì nó dở chứng sao ấy:
giả sử tam giác vuông ở A đi,chạy debug thì rõ ràng a*a =b*b+c*c ,cả bảng debug cũng hiện ra vậy mà biến vuong ko đổi....vẫn bằng 0 ==>sai
PHP:
struct DIEM
{
	float x;
	float y;
};
struct TAMGIAC
{
	DIEM A;
	DIEM B;
	DIEM C;
};
float khoangcach(DIEM P,DIEM Q)
{
	return sqrt( (P.x-Q.x)*(P.x-Q.x)+(P.y-Q.y)*(P.y-Q.y) ) ;
}
int ktdang(TAMGIAC X)
{
	float a,b,c;
	a = khoangcach(X.C , X.B);
	b = khoangcach(X.A , X.C);
	c = khoangcach(X.A , X.B);
	int can=0,vuong=0,deu=0;
	if(a==b&&b==c)
		deu=1;
	if(a==b||b==c||c==a)
		can=1;
	if(a*a==b*b+c*c ||b*b==a*a+c*c ||c*c==a*a+b*b)
		vuong=1;
	if(deu==1)
		return -2;
	if(vuong==1&&can==1)
		return -1;
	if(vuong==1)
		return 0;
	if(can==1)
		return 1;
	return 2;
}

Vấn đề là a*a không bằng b*b+c*c, cho dù in kết quả 2 bên như nhau. Chỉ có cách tính tích 2 vector mới chính xác, công thức tôi không nhớ. Nếu dùng khoảng cách sẽ phải tính căn, dẫn đến kết quả không chính xác.
 
Ai giúp mình với. Nhập n phần tử, liệt kê các hoán vị của n.
Ví dụ nhập 1 2 3 . Xuất ra các hoán vị là 1 2 3; 1 3 2; 2 1 3; 2 3 1; 3 1 2; 3 2 1
 
bạn nào có source (chương trình hoàn chỉnh càng tốt) của bài toán này vui lòng post lên dùm mình (hay up chương trình lên)..... mình làm đc nhưng chỉ viết đc phần console thôi, viết thành chương trình giao diện đồ họa mình chưa làm đc......

Bài toán phân công lao động: Có n công nhân có thể làm n công việc. Công nhân i làm công việc j trong một khoảng thời gian tij. Phải tìm một phương án phân công như thế nào để các công việc đều được hoàn thành, các công nhân đều có việc làm, mỗi công nhân chỉ làm một công việc và mỗi công việc chỉ do một công nhân thực hiện đồng thời tổng thời gian là nhỏ nhất.
hay bài 2 trong trang web sau:
http://www.ctu.edu.vn/coursewares/cntt/gthuat/gthuat/bt_ch3.htm
 
Em mới học lập trình các anh chỉ dùm em bài tập này với : vẽ ngôi sao ra màn hình dùng : do...while, while, for.
Em bó tay rồi .
(ngôi sao 5 cánh nhé. Thanks )

Mấy anh làm ơn giúp em với =((
 
Ai giúp mình với. Nhập n phần tử, liệt kê các hoán vị của n.
Ví dụ nhập 1 2 3 . Xuất ra các hoán vị là 1 2 3; 1 3 2; 2 1 3; 2 3 1; 3 1 2; 3 2 1

mình làm như sau nhưng chỉ đúng với 3 phần tử còn nhiề hơn thiếu trường hợp. Bạn nào xem sửa lại dùm mình chứ mình thì chắc bí rùi ::(

Mã:
#include<iostream.h>
#include<conio.h>
#include<string.h>
void main()
{
  char tam, chuoi[10];
  int i,j,k,a;
  clrscr();
  cout<<"Nhap chuoi cac phan tu hoan vi : "; cin.getline(chuoi,10);
  k=1;
  cout<<endl<<k<<". "<<chuoi;
  for(i=strlen(chuoi)-1; i>=0; i--)
    for(a=i; a<strlen(chuoi)-1; a++)
      for(j=i; j<strlen(chuoi)-1; j++)
	  if(chuoi[j]!=chuoi[j+1])
	  {
	    k++;
	    tam=chuoi[j];
	    chuoi[j]=chuoi[j+1];
	    chuoi[j+1]=tam;
	    cout<<endl<<k<<". "<<chuoi;
	  }
  getch();
}
 
Bài hoán vị đây :p
vd:
a b c d=>a + (b c d) => a + b + ( c d ) => a + b + c + d
a + b + d + c
a + c + ( b d ) => a + c + b + d
a + c + d + b
a + d + ( b c ) => a + b + c + d
a + b + d + c
b + (a c b) =>...
c + (a b d) =>...
d + (a b c) =>...
Cái này là cách giải theo kiểu recursion, cái trên là giải thuật thôi, code bạn tự viết nhé :D
Tóm tắt là bạn nhập cái list n số => 1+ (n-1), cái n -1 => 1 + ( n -2) và ...
Base case là khi 1 và 1
Nó tương tự như là 3! = 3 * 2!
2! = 2 * 1!
1! = 1 * 0!
0! = 1 => base case
Giờ tớ còn cái project làm chưa xong ko rảnh viết code cho bạn được :)
 
Back
Top