PDA

View Full Version : kiểm tra ma trận có là đơn vị không giup em giải quyết vấn đề này với



mylinhnguyen.hvt
25-04-2009, 16:51
4. Xây dựng lớp ma trận gồm các thành phần:
-DL: số dòng, số cột, mảng các phần tử
-Pt: nhập, in, kiểm tra ma trận có là đơn vị không
Hàm main:
-Nhập ma trận a
-Thông báo có là ma trận đơn vị không
-In ma trận

ma_kiem
26-04-2009, 19:03
#include<stdio.h>
#include<conio.h>
#include<iostream.h>
#define MAX 10

void inputArray(int a[][MAX],int &n) {
do {
cout<<"\nNhap vao so phan tu cua mang: ";
cin>>n;
}while(n<2||n>10);

for(int i=0;i<n;i++) {
for(int j=0;j<n;j++) {
cout<<"a["<<i<<","<<j<<"]= ";
cin>>a[i][j];
}
}
}

void outputArray(int a[][MAX],int n) {
for(int i=0;i<n;i++) {
for(int j=0;j<n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}

void text_unitMatrix(int a[][MAX],int n) {
int kt=0;
for(int i=0;i<n;i++) {
if(a[i][i]!=1)kt++;
else {
for(int j=0;j<n;j++){
if(i!=j&&a[i][j]!=0) {
kt++;
}
}
}
}
if(kt==0)cout<<"\nMa tran don vi";
else cout<<"\nKhong phai ma tran don vi";
}

void main() {
int a[MAX][MAX],n;
inputArray(a,n);
outputArray(a,n);
text_unitMatrix(a,n);
getch();
}
O day minh chua kiem tra so dong, so cot ban kiem tra dum minh nhen

minhquang12g
27-04-2009, 15:00
#include<iostream>
#include<math.h>

#define MAX 100
using namespace std;
void NhapMat(int a[MAX][MAX], int n);
void XuatMat(int a[MAX][MAX], int n);
int KiemTraMatDonVi(int a[MAX][MAX], int n);

void main()
{
int a[MAX][MAX], n;
cout<<"\nChon ma tran cap: ";
cin>>n;
cout<<"\nNhap ma tran:\n";
NhapMat(a,n);
cout<<"\nXuat ma tran\n";
XuatMat(a,n);
if(KiemTraMatDonVi(a,n))
cout<<"\nMat da cho la Ma tran don vi\n";
else
cout<<"\nMat da cho khong la Ma tran don vi!!!\n";
cout<<"\n";
}
void NhapMat(int a[MAX][MAX], int n)
{
for(int i=0; i<n; i++)
for(int j=0;j<n;j++)
{
cout<<"Nhap a["<<i<<"]["<<j<<"] = ";
cin>>a[i][j];
}
}
void XuatMat(int a[MAX][MAX], int n)
{
for(int i=0; i<n; i++)
{
cout<<"\n\n\n";
for(int j=0;j<n;j++)
cout<<a[i][j]<<"\t";
}
}
int KiemTraMatDonVi(int a[MAX][MAX], int n)
{
for(int k=0; k<n; k++)
if(a[k][k]!=1)
return 0;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
if((i!=j)&&a[i][j]!=0)
return 0;
return 1;
}
có gì không hiểu thì nói với mình nha :D

[=========> Bổ sung bài viết <=========]

#include<iostream>
#include<math.h>

#define MAX 100
using namespace std;
void NhapMat(int a[MAX][MAX], int n);
void XuatMat(int a[MAX][MAX], int n);
int KiemTraMatDonVi(int a[MAX][MAX], int n);

void main()
{
int a[MAX][MAX], n;
cout<<"\nChon ma tran cap: ";
cin>>n;
cout<<"\nNhap ma tran:\n";
NhapMat(a,n);
cout<<"\nXuat ma tran\n";
XuatMat(a,n);
if(KiemTraMatDonVi(a,n))
cout<<"\nMat da cho la Ma tran don vi\n";
else
cout<<"\nMat da cho khong la Ma tran don vi!!!\n";
cout<<"\n";
}
void NhapMat(int a[MAX][MAX], int n)
{
for(int i=0; i<n; i++)
for(int j=0;j<n;j++)
{
cout<<"Nhap a["<<i<<"]["<<j<<"] = ";
cin>>a[i][j];
}
}
void XuatMat(int a[MAX][MAX], int n)
{
for(int i=0; i<n; i++)
{
cout<<"\n\n\n";
for(int j=0;j<n;j++)
cout<<a[i][j]<<"\t";
}
}
int KiemTraMatDonVi(int a[MAX][MAX], int n)
{
for(int k=0; k<n; k++)
if(a[k][k]!=1)
return 0;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
if((i!=j)&&a[i][j]!=0)
return 0;
return 1;
}
có gì không hiểu hỏi mình nha

haohao2805
20-05-2010, 00:06
uses crt;
type matran=array[1..10,1..10] of integer;
var m,n:integer;
a:matran;

procedure nhap(var a:matran);
var i,j:integer;
begin
write('nhap so dong ');readln(m);
write('nhap so cot ');readln(n);
for i:=1 to m do
for j:=1 to n do
begin
write('a[',i,',',j,'] ');
readln(a[i,j]);
{ a[i,j]:=random(10)+1;}
end;
end;

procedure xuat(var a:matran);
var i,j:integer;
begin
writeln('ma tran la ');
for i:=1 to m do
begin
for j:=1 to n do
write(a[i,j]:3);
writeln(' ');
end;
end;

function max(a:matran):integer;
var b,i,j:integer;
begin
b:=a[1,1];
for i:=1 to m do
for j:=1 to n do
if a[i,j]>b then b:=a[i,j];
max:=b;
end;

procedure vt(a:matran);
var i,j:integer;
begin
for i:=1 to m do
for j:=1 to n do
if a[i,j]=max(a) then writeln('a[',i,',',j,']');
writeln('vi tri cua gia tri lon nhat la :');
end;

procedure kt(a:matran);
var i,j,k:integer;
begin
k:=0;
for i:=1 to m do
for j:=1 to m do
begin
if (a[i,i]<>1) or (i<>j) and (a[i,j]<>0) then inc(k)
end;
if k=0 then writeln('don vi')
else writeln('k fai don vi');
end;

procedure dx(a:matran);
var i,j,k:integer;
begin
k:=0;
for i:=1 to m do
for j:=1 to m do
if a[i,j]<>a[j,i] then inc(k);
if k=0 then writeln('doi xung')
else write('k doi xung');
end;

begin
clrscr;
nhap(a);
xuat(a);
vt(a);
kt(a);
dx(a);
readln;
end.

anhtien9x
13-06-2010, 22:56
#include <conio.h>
#include <stdio.h>

void nhap(int *a,int m) //nhap ma tran
{
for(int i=0;i<m;i++)
for(int j=0;j<m;j++)
{
printf(" pt[%d][%d]=",i,j);
scanf("%d",(a+i*m+j));
}
}


void hienthi(int *a,int m) //hien thi ma tran
{
for(int i=0;i<m;i++)
{
for(int j=0;j<m;j++)
{
printf("%4d",*(a+i*m+j));
}
printf("\n");
}
}

void donvi(int *a,int m) //kiem tra ma tran don vi
{
int kt=1;

for(int i=0;i<m;i++)
for(int j=0;j<m;j++)
if( (i==j) && ( (*(a+i*m+j))!=1)||
( (i!=j) &&(*(a+i*m+j))!=0) )
{
kt=0;
break;
}
if(kt==0)
printf(" khong la mt don vi\n");
else
printf(" ma tran don vi\n");

}
void main()
{
int a[10][10];
int m;
printf(" nhap m:");scanf("%d",&m);
printf(" nhap ma tran a:\n");
nhap((int *)a,m);
hienthi((int *)a,m);
donvi((int *)a,m);
getch();

}
Đấy là viết bằng ngôn ngữ C :|

megaownage
14-06-2010, 14:20
@anhtien9x:
Dùng con trỏ để chạy dọc mảng là lối giải thật đúng với tinh thần 'C'.
Cho góp ý một chút. Nếu ta dùng vòng lặp
for (int k = 0; k < m*m; k++)
và cho k/m là địa chỉ dòng, k%m là địa chỉ cột thì giảm được một vòng lặp.

@all:
Đề bài có hai điểm quan trọng,
Thứ nhất, bài có nhắc đến số cột và số dòng. Như vậy trước khi xét mt đơn vị phải xét xem số cột có bằng số dòng hay không.
Thứ hai, bài này đòi hỏi phải làm một 'lớp' kia mà!