Bài toán: Tính tổng các phần tử tam giác trên( không tính trên đường chéo chính ) trong ma trận vuông
Input: ma trận a có n dòng, n cột
Xử lý: gán tổng bằng không
Ví dụ:
a[4][4]={(12,23,15,43)
(4,8,32,22)
(21,34,6,5)
(11,7,20,12)}
Tổng tam giác trên
Tổng =a[0][1]+a[0][2]+a[0][3]+a[1][2]+a[1][3]+a[2][3]
=23+15+43+32+12+5=140
Tổng tam giác dưới
Tổng=a[1][0]+a[2][0]+a[2][1]+a[3][0]+a[3][1]+a[3][2]
=4+21+34+11+7+20=97
Output: Tổng tam giác trên/dưới
Hàm tính tổng tam giác trên
double Tongtamgiactren(int a[][MAX], int n) { double sum=0; for(int i=0;i<n-1;i++) for(int j=0;j<n-1;j++) if(i<j) sum=sum+a[i][j]; return sum; }
Hàm tính tổng tam giac dưới
double Tongtamgiacduoi(int a[][MAX], int n) { double sum=0; for(int i=0;i<n-1;i++) for(int j=0;j<n-1;j++) if(i>j) sum=sum+a[i][j]; return sum; }
Chương trình
#include<conio.h> #include<stdio.h> #include<math.h> #define MAX 100 void nhapmatran(int a[][MAX], int &n); void xuatmatran(int a[][MAX], int n); double Tongtamgiactren(int a[][MAX], int n); void main() { int a[MAX][MAX],n; nhapmatran(a,n); printf("\nNoi dung cua ma tran\n"); xuatmatran(a,n); double kq=Tongtamgiactren(a,n); printf("\nTong cac phan tam giac tren la %8.2f",kq); getch(); } void nhapmatran(int a[][MAX], int &n) { do { printf("\nNhap n: "); scanf("%d",&n); }while(n<=0 || n>100); for(int i=0;i<n;i++) for(int j=0;j<n;j++) { printf("\nSo phan tu a[%d][%d] la: ",i,j); scanf("%d",&a[i][j]); } } void xuatmatran(int a[][MAX], int n) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { printf("%5d",a[i][j]); } printf("\n"); } } double Tongtamgiactren(int a[][MAX], int n) { double sum=0; for(int i=0;i<n-1;i++) for(int j=0;j<n-1;j++) if(i<j) sum=sum+a[i][j]; return sum; }
Mình chia sẻ code này để các bạn tham khảo các vấn đề tương tự. Tuy nhiên các bạn nên tự làm lại, đừng nên copy. Nếu gặp vấn đề gì khó khăn, hoặc thắc mắc gì, các bạn có thể đặt câu hỏi ở cuối bài. Mình sẽ giải đáp.
Chúc các bạn thành công!
for ( ) của hàm tính tổng chạy tới <n :
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
Mình nghĩ vậy mới đúng !
cảm ơn đã góp ý cho mình
vòng for của bạn chạy không sai mình không bàn luận đến
bạn phát hiện ra cái vòng for() của mình nghĩa là bạn đã xem hết code, chắc là trên trường thầy(cô) dạy như thế
nhưng ở đây mình muốn tối ưu code
mình sẽ giải thích cho bạn vòng for của mình
tổng tam giác trên, có phải là tổng các phần tử phía trên đường chéo chính như vậy là dòng cuối cùng ta không cần đề cập đến nó. Vậy tại sao ta không loại bỏ luôn dòng cuối cùng ra khỏi vòng lặp ?
cám ơn bạn đã góp ý
nếu tính cả đường chéo thì code thế nào ???
bạn chỉ cần thêm 2 hàm này
double TongDuongCheoPhu(int a[][MAX], int n)
{
double sum=0;
for(int i=0;i<n;i++)
sum=sum+a[i][n-1-i];
return sum;
}
double TongDuongCheoChinh(int a[][MAX], int n)
{
double sum=0;
for(int i=0;i<n;i++)
sum=sum+a[i][i];
return sum;
}
rồi viết thêm 1 hàm nữa
double TongTamGiacTrenCa2DuongCheo(int a[][MAX], int n)
{
double sum=0;
sum= TongDuongCheoChinh(a,n)+TongDuongCheoPhu(a,n)+ TongTamGiacTren(a,n);
return sum;
}
cái tam giác dưới thì giống vậy nha
nếu yêu cầu tính tổng biên của ma trận thỳ code như thế nào v bạn
int kiemtramatrantamgiacduoi(int a[size][size],int n)
{
int sum=0;
for(int i=0;i<n;i++)
for(int j=0;jj)
{
sum=sum+a[i][j];
}
}
return sum;
}
mình như tính tổng ma trận tam giác dưới là như thế này chứ bạn , minh làm theo kiểu của bạn nó ko ra chính xác
ở hàm tính tam giác trên . mình nghĩ vòng for phải thế này chứ nhỉ :for(int j = 0; j < n ; j++). tại có chỗ a[2][3] mà .
Bạn có thể chạy thử code trong code editor để test thử.
nếu kiểm tra xem tổng các phần tử trong tam giác dưới và tổng các phần tử trong tam giác trên có bằng nhau thì code như nào v ạ
em tính tổng rồi so sánh thôi!
double Tongtamgiactren(int a[50][50], int n)
{
int sum=0;
for(int i=0;i<n-1;i++){
for(int j=i+1;j<n;j++)
{
sum=sum+a[i][j];
}
}
return sum;
}
double Tongtamgiacduoi(int a[50][50], int n)
{
int sum=0;
for(int i=0;i<n-1;i++){
for(int j=i+1;j<n;j++)
{
sum=sum+a[j][i];
}
}
return sum;
}
v mới đúng nhé
double Tongtamgiactren(int a[50][50], int n)
{
int sum=0;
for(int i=0;i<n-1;i++){
for(int j=i+1;j<n;j++)
{
sum=sum+a[i][j];
}
}
return sum;
}
double Tongtamgiacduoi(int a[50][50], int n)
{
int sum=0;
for(int i=0;i<n-1;i++){
for(int j=i+1;j<n;j++)
{
sum=sum+a[j][i];
}
}
return sum;
}
v mới đúng nhé
code chạy ra đáp án ko đúng ad ơi
ko đúng là sao ta?
cho em hỏi tính tổng tam giác trên sao lại i < j ạ