Thứ Bảy, 16 tháng 7, 2016

Step15. Một số Bài tập Struct và File

Bài 32: 

#include<stdio.h>
#include<string.h>
FILE*f1=fopen("BAI4.INP","r");
FILE*f2=fopen("BAI4.OUT","w");
struct cs{
char tu[100];
int sl;
};
int tim(int n, char s[], cs ds[]){
for(int i=0;i<n;i++){
if(strcmp(s,ds[i].tu)==0)
return i;
}
return -1;
}
main()
{
int n=0,i=0;
char s[100];
cs ds[100];
char ss[6];
while(!feof(f1)){
fscanf(f1,"%s",&s);
int k=tim(n,s,ds);
if(k==-1){
strcpy(ds[n].tu,s);
ds[n].sl=1;
n++;
}
else
ds[k].sl++;
}
int max=strlen(ds[0].tu);
for(int i=0;i<n;i++){
if(strlen(ds[i].tu)>max)
max=strlen(ds[i].tu);
}
for(int i=0;i<n;i++){
if(strlen(ds[i].tu)==max)
printf("%s %d\n",ds[i].tu,max);
}
}
Bài 33

#include<stdio.h>
#include<math.h>
#include<string.h>
FILE*f1=fopen("BAI4.INP","r");
FILE*f2=fopen("BAI4.OUT","w");
struct SV{
char ten[20];
char ngaysinh[20];
int maso;
float d1,d2,d3;
};
void timmax(int n, SV ds[]){
float max=ds[0].d1+ds[0].d2+ds[0].d3;
for(int i=0;i<n;i++){
if(ds[i].d1+ds[i].d2+ds[i].d3>max){
max=ds[i].d1+ds[i].d2+ds[i].d3;
}
}
for(int i=0;i<n;i++){
if(ds[i].d1+ds[i].d2+ds[i].d3==max){
fprintf(f2,"%d %s %s %.2f\n",ds[i].maso,ds[i].ten,ds[i].ngaysinh,ds[i].d1+ds[i].d2+ds[i].d3);
}
}

}
main()
{
int t;
int i=0,dem=0;
fscanf(f1,"%d",&t);
SV ds[100];
char ss[6];
fgets(ss,5,f1);
while(t--){
dem++;
ds[i].maso=dem;
fgets(ds[i].ten,20,f1);
ds[i].ten[strlen(ds[i].ten)-1]='\0';
fgets(ds[i].ngaysinh,20,f1);
ds[i].ngaysinh[strlen(ds[i].ngaysinh)-1]='\0';
fscanf(f1,"%f%f%f",&ds[i].d1,&ds[i].d2,&ds[i].d3);
fgets(ss,5,f1);
i++;
}
timmax(dem,ds);
}
Bài 34.

#include<stdio.h>
#include<math.h>
FILE*f1=fopen("BAI4.INP","r");
FILE*f2=fopen("BAI4.OUT","w");
struct cs{
int so;
int sl;
};
int nt(int n){
if(n<2)
return 0;
for(int i=2;i<=sqrt(n);i++){
if(n%i==0)
return 0;
}
return 1;
}
int tim(int n, int m, cs ds[]){
for(int i=0;i<n;i++){
if(ds[i].so==m)
return i;
}
return -1;
}
void sapxep(int n,cs ds[]){
for(int i=0;i<n-1;i++){
for(int j=i;j<n;j++){
if(ds[i].sl<ds[j].sl){
cs tam=ds[i];
ds[i]=ds[j];
ds[j]=tam;
}
}
}
}
main()
{
int n=0;
int s;
char ss[6];
cs ds[100];
fgets(ss,5,f1);
while(!feof(f1)){
fscanf(f1,"%d",&s);
if(nt(s)){
int k=tim(n,s,ds);
if(k==-1){
ds[n].so=s;
ds[n].sl=1;
n++;
}
else
ds[k].sl++;
}
}

sapxep(n,ds);
for(int i=0;i<n;i++){
fprintf(f2,"%d %d\n",ds[i].so,ds[i].sl);
}
}
Bài 35: 


#include<stdio.h>
#include<math.h>
#include<string.h>
FILE*f1=fopen("BAI4.INP","r");
FILE*f2=fopen("BAI4.OUT","w");
struct cs{
int so;
int sl;
};
int tn(int n){
int s=0,m=n;
while(n){
s=10*s+n%10;
n=n/10;
}
if(s==m)
return 1;
return 0;
}
int tim(int n, int m, cs ds[]){
for(int i=0;i<n;i++){
if(m==ds[i].so)
return i;
}
return -1;
}
void sapxep(int n, cs ds[]){
for(int i=0;i<n-1;i++){
for(int j=i;j<n;j++){
if(ds[i].sl<ds[j].sl){
cs s=ds[i];
ds[i]=ds[j];
ds[j]=s;
}
}
}
}
main()
{
cs ds[100];
int n=0,s,t=0;
while(!feof(f1)){
fscanf(f1,"%d",&s);
t++;
if(tn(s)){
int k=tim(n,s,ds);
if(k==-1){
ds[n].so=s;
ds[n].sl=1;
n++;
}
else
ds[k].sl++;
}
}
sapxep(n,ds);
for(int i=0;i<n;i++){
fprintf(f2,"%d %d\n",ds[i].so,ds[i].sl);
}
int d=0;
for(int i=0;i<n;i++){
d=d+ds[i].sl;
}
fprintf(f2,"tong so %d/%d ",d,t);

}

Step 14 STruct


Ví dụ:



Khởi tạo  struct 



Step 13 .Một số bài tập sử dụng vào ra file.

Bài 29: 


Bài 30:Cho một ma trận có N hàng và M cột chỉ gồm các số nguyên dương không quá 100 (1<N,M<10). Hãy 
viết chương trình loại bỏ hàng có tổng các phần tử là lớn nhất ra khỏi ma trận. Nếu có hai hàng trở lên 
có tổng các phần tử bằng nhau thì chọn hàng có thứ tự nhỏ hơn. 
Dữ liệu vào: File BAI2.INP
Dòng 1 ghi số bộ test. Với mỗi bộ test: dòng đầu ghi 2 số N và M. Tiếp theo là N hàng, mỗi hàng M 
phần tử của ma trận. 
Kết quả: File BAI2.OUT  với mỗi bộ  test ghi trên N-1  hàng các phần tử  của ma trận kết quả. Mỗi 
phần tử cách nhau đúng một khoảng trống. Sau mỗi bộ test in ra một dòng trống.

code: 
#include<stdio.h>
#include<math.h>
FILE*f1=fopen("BAI2.INP","r");
FILE*f2=fopen("BAI2.OUT","w");
void nhap(int n, int m, int a[][10]){
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
fscanf(f1,"%d",&a[i][j]);
}
}
}
void xoa(int n, int m, int a[][10]){
int max=0,k=1,t=0,dd=0;
for(int i=0;i<m;i++){
max=max+a[0][i];
}
while(t<n){
int k=0;
for(int i=0;i<m;i++){
k=k+a[t][i];
}
if(k>max){
max=k;
dd=t;
}
t++;
}
for(int i=0;i<n;i++){
if(i!=dd){
for(int j=0;j<n;j++){
fprintf(f2,"%d ",a[i][j]);
}
fprintf(f2,"\n");
}
}
}
main()
{
int t;
fscanf(f1,"%d",&t);
char s[6];
fgets(s,5,f1);

while(t--){
int n,m,a[10][10];
fscanf(f1,"%d%d",&n,&m);
nhap(n,m,a);
xoa(n,m,a);
fprintf(f2,"\n");
}
}

Bài 31: Một số được coi là đẹp nếu nó là số nguyên tố và tổng chữ số là một số trong dãy Fibonaci. Bài toán 
đặt ra là đếm xem trong một đoạn giữa hai số nguyên cho trước có bao nhiêu số đẹp như vậy. 
Dữ liệu vào: File: BAI1.INP
Dòng đầu tiên ghi số bộ test.
Mỗi bộ test viết trên một dòng hai số nguyên dương tương ứng, cách nhau một khoảng trống. 
Các số đều không vượt quá 9 chữ số. 
Kết quả: BAI1.OUT
Mỗi bộ test viết ra số lượng các số đẹp tương ứng.
#include<stdio.h>
#include<math.h>
FILE*f1=fopen("BAI1.INP","r");
FILE*f2=fopen("BAI1.OUT","w");
int nt(int n){
if(n<2)
return 0;
for(int i=2;i<=sqrt(n);i++){
if(n%i==0)
return 0;
}
return 1;
}
int fb(int n){
int f1=0,f2=1,f3;
while(f1<100){
f3=f1+f2;
f1=f2;
f2=f3;
if(n==f3)
return 1;
}
return 0;
}
int tong(int n){
int s=0;
while(n){
s=s+n%10;
n/=10;
}
if(fb(s))
return 1;
return 0;
}
main()
{
int t;
fscanf(f1,"%d",&t);
while(t--){
int n,m,d=0;
fscanf(f1,"%d%d",&n,&m);
for(int i=n;i<=m;i++){
if(tong(i)&&nt(i))
d++;
}
fprintf(f2,"%d\n",d);
}
}

Step 12 . Vào ra File

Ví du:
 
-Giải thích chương trình
- Dòng 9: FILE *f;: khai báo biến con trỏ f có kiểu cấu trúc FILE.
- Dòng 15: if(f = fopen("int_data.dat", "wb") == NULL): là câu lệnh mở tập tin có
tên int_data.dat ở mode "w" (ghi ) dạng "b" (nhị phân), sau khi lệnh này thực hiện xong trả về
dạng con trỏ FILE và gán cho f, nếu kết quả trả về = NULL thì không thể mở được tập tin, tập tin
mở ở mode "w" nếu trên đĩa đã có sẵn tập tin này thì nội dung của nó sẽ bị ghi đè, nếu chưa có thì
tập tin sẽ được tạo mới.
- Dòng 22: fwrite(&i, sizeof(int), 1, f);: ghi thông tin vào tập tin, thông tin được ghi
vào mỗi lần là một số nguyên i. Hàm này có 4 đối số: địa chỉ để ghi cấu trúc, kích thước của cấu
trúc và số cấu trúc sẽ ghi, sau cùng là con trỏ để trỏ tới tập tin.
- Dòng 23: fclose(f);: đóng tập tin
- Dòng 26: f = fopen("int_data.dat", "rb");: mở tập tin có tên int_data.dat ở mode
"r" (đọc) dạng "b" (nhị phân). Tập tin phải có sẵn trên đĩa.
- Dòng 27: while(fread(&i, sizeof(int), 1, f) == 1): đọc thông tin từ tập tin, mỗi lần
đọc một số nguyên và lưu vào biến i. Mỗi lần đọc thành công giá trị trả về sẽ là số cấu trúc thực
sự được đọc, nếu giá trị trả về = 0 báo hiệu kết thúc file.
-


Các mode mở tập tin: 
 "a": mở để nối thêm, thông tin sẽ được ghi thêm vào cuối của tập tin đã có hoặc tạo tập
tin mới nếu chưa có trên đĩa.
- "r+": mở để vừa đọc vừa ghi, tập tin phải có sẵn trên đĩa.
- "w+": mở để vừa đọc vừa ghi, nội dung của tập tin đã có trên đĩa sẽ bị ghi đè lên.
- "a+": mở để đọc và nối thêm, nếu trên đĩa chưa có tập tin nó sẽ được tạo mới.

Step 11 Một số ví dụ sử dụng chuỗi

Bài 22 : Viết chương trình chuyển đổi một số tự nhiên ở hệ cơ số 10 thành số ở hệ cơ số b bất kì (1< b≤ 36).



Gỉa thích: Dòng 2: là hàm chuyển đổi cơ số.

Bài 23: . Nhập một xâu ký tự. Đếm số từ của xâu ký tự đó. Thí dụ "   Trường    học  " có 2 từ.

giải thích : Dòng 9: strlen(s) : là hàm độ dài của xâu s. Hàm này trong thư viện String.

Bài 24: Sử dụng xâu ký tự để viết hàm kiểm tra số thuận nghịch. Áp dụng để in ra các số thuận nghịch có 6 chữ số.  

giải thích: Dòng 15: itoa là hàm đổi cơ số của i.
Bài 25 Viết chương trình nhập vào một xâu ký tự s bất kỳ, sau đó chuyển sang dạng xen kẽ chữ in hoa và chữ in thường. Ví dụ s = ABCDefgh thì kết quả là AbCdEfGh

Gỉa thích: dòng 8: strupr() : là hàm đổi toàn bộ xâu  s thành chữ hoa. ngược lại strlwr(s) đổi toàn bộ xâu s thành chữ thường.
Bài 26:
Viết chương trình thực hiện chuẩn hoá một xâu ký tự nhập từ bàn phím (loại bỏ các dấu cách thừa, chuyển ký tự đầu mỗi từ thành chữ hoa, các ký tự khác thành chữ thường)

Bài 27 Nhập một xâu ký tự, in ra cho biết có bao nhiêu ký tự là nguyên âm, phụ âm, ký tự số và ký tự khác.
 4
Bài 28 Nhập một câu không quá 20 từ, mỗi từ không quá 10 ký tự. Viết chương trình tách các từ trong câu và in các từ theo thứ tự Alphabet


Sep 10 . Chuỗi

Chuỗi: 

-Cách Khai báo chuỗi : char name[20];

-ý nghĩa: Khai báo chỗi name gồm 20 ký tự. Chuỗi kết thúc bằng ký tự null nên khai báo 20 chỉ có thể chứ 19 ký tự.
-Sử dụng hàm nhập gets và xuất puts.
vd: gets(name) : là nhập vào chuỗi name. puts(name) là in ra chuỗi name;
Đối với hàm puts ký tự kết thúc chuỗi null (\0) được thay thế bằng ký tự newline (\n). Hàm gets và puts chỉ có 1 đối số và không sử dụng dạng thức trong nhập xuất dữ liệu cũng như in ra màn hình.
Khởi tạo chuỗi: 

III . Một số hàm xử lý chuỗi 
Các hàm này có trong string.h
1. Cộng chuỗi 
- Hàm strcat()
Cú pháp:
char *strcat(char *des, const char *source )
Hàm này có tác dụng ghép chuỗi nguồn v ào chuỗi đích.
Ví dụ: Nhập vào họ lót và tên của một người, sau đó in cả họ và tên của họ lên màn hình.
#include<conio.h>
#include<stdio.h>
#include<string.h>
int main()
{
char HoLot[30], Ten[12] ;
printf("Nhap Ho Lot: ");gets(HoLot);
printf("Nhap Ten: ");gets(Ten);
strcat(HoLot,Ten); /* Ghep Ten vao HoLot*/
printf("Ho ten la: ");puts(HoLot);
getch();
return 0;
}
2. Xác định độ dài chuỗi 
- Hàm strlen()
Cú pháp:
in t strlen(const char* s)
Ví dụ: Sử dụng hàm strlen xác định độ dài một chuỗi nhập từ bàn phím.
#include<conio.h>
#include<stdio.h>
#include<string.h>
int main()
{
char Chuoi[255];
int Dodai;
printf("Nhap chuoi: ");gets(Chuoi);
Dodai = strlen(Chuoi);
printf("Chuoi vua nhap: ");puts(Chuoi);
printf("Co do dai %d",Dodai);
92
getch();
return 0;
}
3. Đổi một ký tự thường thành ký tự hoa 
- Hàm  toupper():  Hàm  toupper()  (trong  ctype.h)  được  dùng  để  chuyển  đổi  một  ký  tự
thườn g thành ký tự hoa.
Cú pháp:
char toupper(char c)
4. Đổi chuỗi chữ thường thành chuỗi chữ hoa
-Hàm strupr():  Hàm struppr() được dùng để chuyển đổi chuỗi chữ thường thành chuỗi
chữ hoa, kết quả trả về của hàm là một con trỏ chỉ đến địa chỉ chuỗi được chuyển đổi.
Cú pháp:
char *strupr(char *s)
Ví dụ: Vi ết chương trình  nhập  vào  một chuỗi ký tự từ bàn phím. Sau đó sử dụng hàm
strupr() để chuyển đổi chúng thành chuỗi chữ hoa.
#include<conio.h>
#include<stdio.h>
#include<string.h>
int main()
{
char Chuoi[255],*s;
printf("Nhap chuoi: ");
gets(Chuoi);
s=strupr(Chuoi) ;
printf("Chuoi chu hoa: ");
puts(s);
getch();
return 0;
}
5. Đổi chuỗi chữ hoa thành chuỗi chữ thường
- Hàm  strlwr():  Muốn  chuyển  đổi  chuỗi  chữ  hoa  thành  chuỗi  toàn  chữ  thường,  ta  sử
dụng hàm strlwr(), các tham số của hàm tương tự như hàm strupr().
Cú pháp:
char *strlwr(char *s)
93
6. Sao chép chuỗi
-Hàm strcpy():   Hàm này được dùng để sao chép toàn bộ nội dung của chuỗi nguồn v ào
chuỗi đích.
Cú pháp:
char *strcpy(char *Des, const char *Source)
Ví dụ: Vi ết chương trình cho phép chép toàn b ộ chuỗi nguồn v ào chuỗi đích.
#include<conio.h>
#include<stdio.h>
#include<string.h>
int main()
{
char Chuoi[255],s[255];
printf("Nhap chuoi: ");
gets(Chuoi);
strcpy(s,Chuoi);
printf("Chuoi dich: ");
puts(s);
getch();
return 0;
}
7. Sao chép một phần chuỗi
-Hàm strncpy():   Hàm này cho phép chép n ký tự đầu tiên của chuỗi nguồn sang chuỗi
đích.
Cú pháp:
char *strncpy(char *Des, const char *Source, size_t n)
8. Trích một phần chuỗi
-Hàm strchr():  Để trích một chuỗi con của một chuỗi ký tự bắt đầu từ một ký tự được
chỉ định trong chuỗi cho đến hết chuỗi, ta sử dụng hàm strchr().
Cú pháp :
char *strchr(const char *str, int c)
Lưu ý  :
-  Nếu ký tự đã chỉ định không có trongchuỗi, kết quả trả về là NULL  ;
-  Kết quả trả về của hàm là một con trỏ, con trỏ này chỉ đến ký tự c đư ợc tìm thấy đầu
tiên trong chuỗi str.
94
9. Tìm kiếm nội dung chuỗi
-Hàm strstr(): Hàm strstr() được sử dụng để tìm ki ếm sự xuất hiện đầu ti ên của chuỗi s2
trong chu ỗi s1.
Cú pháp:
char *strstr(const char *s1, const char *s2)
Kết quả trả  về của hàm  là  một con  trỏ chỉ đến phần tử đầu tiên của chuỗi s1 có chứa
chuỗi s2 hoặc giá trị NULL nếu chuỗi s2 không có trong chuỗi s1.
Ví dụ: Vi ết chương trình sử dụng hàm strstr() để lấy ra một phần của chuỗi gốc bắt đầu từ
chuỗi “hoc”.
#include<conio.h>
#include<stdio.h>
#include<string.h>
int main()
{
char Chuoi[255],*s;
printf("Nhap chuoi: ");
gets(Chuoi);
s=strstr(Chuoi,"hoc");
printf("Chuoi trich ra: ");
puts(s);
getch();
return 0;
}
10. So sánh chuỗi
-Hàm strcmp(): Để so sánh hai chuỗi theo từng ký tự trong bảng mã Ascii, ta có thể sử
dụng hàm strcmp().
Cú pháp:
int strcmp(const char *s1, const char *s2)
Hai chuỗi s1 và s2 được so sánh  với  nhau, kết quả trả  về là  một số  nguyên (số  n ày có
được bằng cách lấy ký tự của s1 trừ ký tự của s2 tại vị trí đầu tiên xảy ra sự khác nhau).
-  Nếu kết quả là sốâm, chuỗi s1 nhỏ hơn chuỗi s2;
-  Nếu kết quả là 0, hai chuỗi bằng nhau;
-  Nếu kết quả là số dương, chuỗi s1 lớn hơn chuỗi s2.
95
11. So sánh chuỗi
-Hàm stricmp():  Hàm này thực hiện việc so sánh trong n ký tự đầu ti ên của 2 chuỗi s1
và s2, giữa chữ thường và chữ hoa không phân biệt.
Cú pháp:
int stricmp(const char *s1, const char *s2)
Kết quả trả về tương tự như kết quả trả về của hàm strcmp()
12. Khởi tạo chuỗi
-Hàm memset(): Hàm này được sử dụng để đặt n ký tự đầu tiên của chuỗi l à ký tự c.
Cú pháp:
memset(char *Des, int c, size_tn)
Đổi từ chuỗi ra số, hàm atoi(), atof(), atol() (trong stdlib.h):  Để chuyển đổi chuỗi ra
số, ta sử dụng các hàm trên.
Cú pháp :
int atoi(const char *s) : chuy ển chuỗi thành số nguyên
long atol(const char *s) : chuy ển chuỗi thành số nguyên dài
floatatof(const char *s) : chuyển chuỗi thành số thực
Nếu chuyển đổi không thành công, kết quả trả về của các hàm là 0. Ngoài ra, thư viện
string.h còn hỗ trợ các hàm xử lý chuỗi khác, ta có thể đọc thêm trong phần trợ giúp.


Step 9 . Một số ví dụ về mảng 2 chiều

Bài 14:  Nhập số liệu cho ma trận A  kích thước  mxn  có các phần tử  là các số nguyên. Tính tổng các phần tử theo đường chéo chính và đường chéo phụ của ma trận.
 #include<stdio.h>
void nhap(int &n,int a[][10]){
printf("nhap kich thuoc ma tran");
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("\na[%d,%d]=",i+1,j+1);
scanf("%d",&a[i][j]);
}
}
}
void in(int n, int a[][10]){
printf("\nMa tran vua nhap la:\n");
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%d\t",a[i][j]);
}
printf("\n\n");
}
}
void tongchinh(int n,  int a[][10]){
int s=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i==j){
s=s+a[i][j];
}
}
}
printf("\ntong duong cheo chinh la:%d",s);
}
void tongphu(int n, int a[][10]){
int s=0;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i+j==n-1){
s=s+a[i][j];
}
}
}
printf("\ntong duong cheo phu la:%d",s);
}
main()
{
int n, a[10][10];
nhap(n,a);
in(n,a);
tongchinh(n,a);
tongphu(n,a);
}


Bài 15: Nhập số liệu cho ma trận A  kích thước  mxn  có các phần tử  là các số nguyên. Tìm hàng trong ma trận có tổng phần tử là nhỏ nhất và loại bỏ hàng đó ra khỏi ma trận. Nếu có nhiều hàng tổng bằng nhau thì chọn hàng đầu tiên từ trên xuống.
 #include<stdio.h>
void nhap(int &n,int &m,int a[][10]){
printf("nhap so hang:");
scanf("%d",&n);
printf("nhap so cot");
scanf("%d",&m);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
printf("\na[%d,%d]=",i+1,j+1);
scanf("%d",&a[i][j]);
}
}
}
void in(int n, int m, int a[][10]){
printf("\nMa tran vua nhap la:\n");
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
printf("%d\t",a[i][j]);
}
printf("\n\n");
}
}
void cut(int n,int m, int a[][10]){
int min,k=0,s=0,i,j;
for(i=0;i<1;i++){
for(j=0;j<m;j++){
min+=a[i][j];
}
}
while(i<n){
for(j=0;j<m;j++){
s+=a[i][j];
}
if(s<min){
min=s;
k=i;
}
i++;
}
printf("\n ma tran sau khi xoa hang la: \n");
for(int i=0;i<n;i++){
if(i!=k){
for(int j=0;j<m;j++){
printf("%d\t",a[i][j]);
}
}
printf("\n\n");
}

}
main()
{
int n,m,a[10][10];
nhap(n,m,a);
in(n,m,a);
cut(n,m,a);
}


Bài 16: . Nhập số liệu cho ma trận A  kích thước  mxn  có các phần tử  là các số nguyên. Tìm cột trong ma trận có tổng phần tử là lớn nhất và loại bỏ cột đó ra khỏi ma trận.  Nếu có nhiều cột tổng bằng nhau thì chọn cột đầu tiên từ trái sang phải.
 #include<stdio.h>
void nhap(int &n,int &m,int a[][10]){
printf("nhap so hang:");
scanf("%d",&n);
printf("nhap so cot");
scanf("%d",&m);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
printf("\na[%d,%d]=",i+1,j+1);
scanf("%d",&a[i][j]);
}
}
}
void in(int n, int m, int a[][10]){
printf("\nMa tran vua nhap la:\n");
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
printf("%d\t",a[i][j]);
}
printf("\n\n");
}
}
void cut(int n,int m, int a[][10]){
int min,k=0,s=0,i,j;
for(i=0;i<n;i++){
for(j=0;j<1;j++){
min=min+a[i][j];
}
}
while(j<m){
for(i=0;i<n;i++){
s+=a[i][j];
}
if(s<min){
min=s;
k=j;
}
j++;
}
printf("\nma tran sau khi xoa la: \n");
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(j!=k){
printf("%d\t",a[i][j]);
}
}
printf("\n\n");
}
}
main()
{
int n,m,a[10][10];
nhap(n,m,a);
in(n,m,a);
cut(n,m,a);
}

Bài 17 :
Viết chương trình nhập số liệu cho ma trận các số nguyên  A  cấp   mxn   trong đó   m, n là các số tự nhiên. Sau đó tìm ma trận chuyển vị B = (bij)  cấp  nxm của A, bij = aji
#include<stdio.h>
void nhap(int x,int y,int z[][10]){
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
printf("\nz[%d,%d]=",i,j);
scanf("%d",&z[i][j]);
}
}
}
void in(int x, int y, int z[][10]){
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
printf("%d\t",z[i][j]);
}
printf("\n\n");
}
}
void chuyenvi(int x, int y, int z[][10], int k[10][10]){
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
k[j][i]=z[i][j];
}
}
}
main()
{
int n,m,a[10][10],b[10][10]={0};
printf("nhap so hang ma tran a:");
scanf("%d",&n);
printf("\nnhap so cot ma tran a");
scanf("%d",&m);
nhap(n,m,a);
printf("\nma tran a la:\n");
in(n,m,a);
chuyenvi(n,m,a,b);
printf("\nma tran sau khi chuyen vi:\n");
in(m,n,b);
}

BÀI 18: Nhập số liệu cho ma trận A có kích thước  mxn. Sau đó tìm ma trận chuyển vị   B có kích thước  nxm thỏa mãn bij = aji. Tính ma trận tích C có kích thước  mxm của 2 ma trận A và B.

 
#include<stdio.h>
void nhap(int x,int y,int z[][10]){
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
printf("\nz[%d,%d]=",i,j);
scanf("%d",&z[i][j]);
}
}
}
void in(int x, int y, int z[][10]){
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
printf("%d\t",z[i][j]);
}
printf("\n\n");
}
}
void chuyenvi(int x, int y, int z[][10], int k[10][10]){
for(int i=0;i<x;i++){
for(int j=0;j<y;j++){
k[j][i]=z[i][j];
}
}
}
void tich(int x, int y , int z[][10], int k[][10]){
int c[10][10]={0};
for(int i=0;i<x;i++){
for(int j=0;j<x;j++){
for(int l=0;l<y;l++){
c[i][j]+=z[i][l]*k[l][j];
}
}
}
printf("\nma tran tich C la:\n");
for(int i=0;i<x;i++){
for(int j=0;j<x;j++){
printf("%d\t",c[i][j]);
}
printf("\n\n");
}
}

main()
{
int n,m,a[10][10],b[10][10];
printf("nhap so hang ma tran a:");
scanf("%d",&n);
printf("\nnhap so cot ma tran a");
scanf("%d",&m);
nhap(n,m,a);
printf("\nma tran a la:\n");
in(n,m,a);
chuyenvi(n,m,a,b);
printf("\nma tran sau khi chuyen vi:\n");
in(m,n,b);
tich(n,m,a,b);
}


Bài 19: Một ma trận các số thực được gọi là ma trận tam giác nếu toàn bộ các phần tử phía dưới (hoặc phía trên) đường chéo chính đều bằng 0. Nhập một ma trận, hãy kiểm tra xem đó có phải là ma trận tam giác hay không.
 #include<stdio.h>
void nhap(int &n,int a[][10]){
printf("nhap kich thuoc ma tran");
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("\na[%d,%d]=",i+1,j+1);
scanf("%d",&a[i][j]);
}
}
}
void in(int n, int a[][10]){
printf("\nMa tran vua nhap la:\n");
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%d\t",a[i][j]);
}
printf("\n\n");
}
}
int kt(int n, int a[][10]){
for(int i=0;i<n;i++){
for(int j=0;j<i;j++){
if(a[i][j]!=0)
return 0;
return 1;
}
}
}
int kt2(int n, int a[][10]){
for(int i=0;i<n;i++){
for(int j=n-i;j<n;j++){
if(a[i][j]!=0)
return 0;
return 1;
}
}
}
main()
{
int n, m, a[10][10];
nhap(n,a);
in(n,a);
if(kt(n,a)||(kt2(n,a))){
printf("\nma tran tam giac");
}
else
{
printf("\nkhong phai ma tran tam giac");
}
}

Bài 20: Nhập ma trận A là ma trận vuông cấp n. Thực hiện xoay ma trận một góc 90 độ ngược chiều kim đồng hồ.

#include<stdio.h>
void nhap(int &n,int a[][10]){
printf("nhap kich thuoc ma tran");
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("\na[%d,%d]=",i+1,j+1);
scanf("%d",&a[i][j]);
}
}
}
void in(int n, int a[][10]){
printf("\nMa tran vua nhap la:\n");
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%d\t",a[i][j]);
}
printf("\n\n");
}
}
void xoay90(int n, int a[][10],int b[][10]){

for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
b[i][j]=a[j][n-i-1];//xoay nguoc chieu kim dong ho
}
}
printf("ma tran sau khi xoay 90\n");
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
printf("%d\t",b[i][j]);
}
printf("\n\n");
}
}
main()
{
int n, m, a[10][10], b[10][10];
nhap(n,a);
in(n,a);
xoay90(n,a,b);
}
Bài 21Nhập số nguyên dương n. In ra ma trận xoáy ốc vuông cấp n.

 #include<stdio.h>
void xoayoc(int n,int m, int a[][10]){
int hang=n-1, cot=m-1, d=0, dem=1; 
while(dem<m*n){
for(int i=d;i<=cot;i++)
{
a[d][i]=dem;
dem++;
}
if(dem==m*n) break;
for(int i=d+1;i<=hang;i++){
a[i][cot]=dem;
dem++;
}
if(dem==m*n) break;
for(int i=cot-1;i>=d;i--){
a[hang][i]=dem;
dem++;
}
if(dem==m*n) break;
for(int i=hang-1;i>d;i--){
a[i][d]=dem;
dem++;
}
if(dem==m*n) break;
d++;hang--,cot--;
}
}
void in(int n, int m,int a[][10]){
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
printf("%d\t",a[i][j]);
}
printf("\n\n");
}
}
main()
{
int n,m, a[10][10];
printf("nhap n: ");
scanf("%d%d",&n,&m);
xoayoc(n,m,a);
in(n,m,a);
}