PDA

View Full Version : Bài tập giải thuật | Bài tập thuật toán cơ bản



hailoc12
05-08-2006, 01:35 PM
1. Ý TƯỞNG THUẬT TOÁN
• Xét 3 hệ số của phương trình trước hết xét a=0 hoặc a khác 0
a. TH1 : a=0
- Ta xét thêm b =0 hay khác 0 . Nếu a=0 mà b=0 thì phương trình không xác định . Nếu b khác 0 thì giải bài toán giống như giải phương trình bậc nhất .
b. TH2 : a khác 0
- Ta tính Delta và xét Delta đưa ra nghiệm của pt
- Nếu Delta < 0 : Phương trình vô nghiệm
- Nếu Delta = 0 : Phương trình có nghiệm kép
- Nếu Delta > 0 : Phương trình có hai nghiệm phân biệt .
2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
• a , b ,c là ba hệ số của phương trình .
• Delta là biến dùng để lưu giá trị Delta sau khi tính .
• x1,x2 : là nghiệm của phương trình nếu pt có 2 nghiệm phân biệt
• x : là nghiệm nếu phương trình chỉ có một nghiệm mà thôi
3. BÀI GIẢI :


#include<conio.h>
#include<stdio.h>
#include<math.h>
void main ()
{
clrscr();
float a,b,c,delta;
printf("ban hay nhap a,b,c vao ");
scanf("%f%f%f",&a,&b,&c);// cac he so cua pt bac 2
if (a!=0)
{
delta=b*b-4*a*c;
if (delta>0)
{
printf("phuong trinh co 2 nghiem\n");
printf("x1=%f",(-b-sqrt(delta))/(2*a));
printf("\n");
printf("x2=%f",(-b+sqrt(delta))/(2*a));
}
else //TH a<>0 va delta <=0
{
if (delta==0)
{
printf("phuong trinh co nghiem kep\n");
printf("x=%f",-b/(2*a));
}
else
printf("phuong trinh vo nghiem ");
}
}
else // (If a==0)
{
if (b!=0) // a luc nay =0
{
printf("phuong trinh co 1 nghiem\n");
printf("x=%f",-c/b);
}
else // a=0 va b=0
{
if (c!=0)
printf("phuong trinh khong xac dinh");
else
printf("phuong trinh vo so nghiem");
}
}
getch();
}




HẾT

hailoc12
05-08-2006, 01:38 PM
BÀI 02

1. Ý TƯỞNG THUẬT TOÁN :
a. Ta làm một trường hợp nếu nhập vào không hợp lệ thì bắt nhập lại .
b. Ngược lại
Trước hết ta quy đổi về số ngày hết .
Ta xét từ năm số 1 cho đến năm nhập vào nếu thỏa điều kiện năm nhuận thì cộng thêm 1
Ta xét từ tháng 1 cho đến tháng nhập vào và lần lượt cộng với số ngày tương ứng mà tháng đó có ( ví dụ : tháng 3 có 31 ngày ).
Sau khi được một tổng số có được bằng cách thực hiện 2 bước trên thì ta cộng số đó vào số ngày nhập vào . Ta được tổng số ngày từ ngày tháng năm thứ nhất cho đến ngày tháng năm hiện tại
Theo quy luật của ngày tháng thì cứ 7 ngày thì lặp lại một thứ . Vì thế ta lấy tổng số ngày tính được tất cả chia lấy phân dư cho 7 ( Ví dụ : nếu được 0 thì đó là chủ nhật )
2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
Ba biến : ngay , thang ,nam là các biến được nhập vào
Biến s : lúc đầu là cộng thêm 1 nếu gặp năm nhuần khi dòng for i chạy sau đó được gán bằng 0 và tính tổng các ngày của các tháng .
Biến t : là biến tính tổng số ngày
Biến x : là biến khi t chia lấy phần dư cho 7 gán cho x rồi suy ra thứ.
Dòng For thứ nhất chạy xét xem nếu năm nhuần thì cộng số ngày lên 1
Dòng For thứ hai chạy xét và cộng vào số ngày tương ứng của tháng đó .
3. BÀI GIẢI


#include <stdio.h>
#include <conio.h>
void main()
{
clrscr();
int ngay , thang , nam,s=0,x;
long t;
do
{
printf("Nhap vao Ngay :");
scanf("%d",&ngay);
printf("Nhap vao Thang :");
scanf("%d",&thang);
printf("Nhap vao Nam :");
scanf("%d",&nam);
} while(((ngay<0)||(ngay>31)||(thang<0)||(thang>12))||((thang==2)&&(ngay>29)));

for(int i=1;i<=nam;i++)
{
if((i%400==0)||((i%4==0)&&(i%100!=0)))
s+=1;
}
t=(nam*365)+s;
s=0;
for(int j=1;j<thang;j++)
{
switch(j)
{
case 2:
if ((nam%400==0)||((nam%4==0)&&(nam%100!=0)))
{
s+=29;
break;
}
Else
{
S+=28;
Break;
}
case 4:
case 6:
case 9:
case 11:
s+=30;
break;
Default:
s+=31;
break;
}
}
t+=s+ngay;
textcolor(6-9);
x=t%7;
printf("\n\n Ngay %d Thang %d Nam %d La Ngay ",ngay,thang,nam);
switch(x)
{
case 0:
cprintf("Chu Nhat ");
break;
case 1:
cprintf("Thu Hai ");
break;
case 2:
cprintf("Thu Ba ");
break;
case 3:
cprintf("Thu Tu ");
break;
case 4:
cprintf("Thu Nam ");
break;
case 5:
cprintf("Thu Sau ");
break;
case 6:
cprintf("Thu Bay ");
break;
}

getch();

}

HẾT

hailoc12
05-08-2006, 01:45 PM
BÀI 03

1. Ý TƯỞNG THUẬT TOÁN :
Ta lấy số ngày xét nếu bằng 365 thì ngày 31 tháng 12 nam 0 , ngược lại thì ta lấy số ngày trừ cho 365 nếu là năm nhuận thì trừ cho 366
Xét diều kiện đủ thấy ta lấy số ngày cịn l?i trừ cho số ngày của từng tháng ( ví dụ : lấy số ngày trừ cho 31 nếu lớn hơn 0 thì tháng +1 và có thể tiếp tục chạy theo vòng for cho đến khi nào không thỏa điều kiện trong vòng switch – case nữa thì thoát ra
Thu được kết quả của ngày tháng năm .

2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
Trong bài chỉ có ba biến quan trọng là : ngay , thang , nam
Biến ngay : là biến được input .
Biến thang : là biến tăng khi ngày trừ đi theo câu lệnh
Biến nam : tuong tự như biến tháng nhưng là kết quả của biến ngày trừ đi theo câu lệnh .
3. BÀI GIẢI :


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

void main()
{
clrscr();// nam so 0 khong duoc xet la nam nhuan
unsigned long ngay,nam=1;
int thang=1; //bat dau tu nam so 0
do
{
printf("Nhap vao so ngay : ");
scanf("%lu",&ngay);
}while(ngay<1);

while(ngay>=366)//dieu kien de xet so nam
{

if(((nam%4==0)&&(nam%100!=0))||(nam%400==0))
ngay-=366;
else
ngay-=365;
nam++;
if(ngay==0)
{
thang=12;
ngay=31;
nam-=1;
break;
}
}


while(ngay>=28)
{
if(thang==12)
break;
switch(thang)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
if((ngay-31)>0)
{
ngay-=31;
thang+=1;
}
break;

case 2: if(((nam%4==0)&&(nam%100!=0))||(nam%400==0))
{
if((ngay-29)>0)
{
thang+=1;
ngay-=29;
}
else
break;
}
else
{
if((ngay-28)>0)
{
ngay-=28;
thang+=1;
}
else
break;
}
break;
default :
if((ngay-30)>0)
{
thang+=1;
ngay-=30;
}
break;
}
}

printf("\n Doi ra ngay thang la ");
printf("%lu - %d - %d",ngay,thang,nam);
getch();
}

HẾT

hailoc12
05-08-2006, 07:09 PM
BÀI 04 :

1. Ý TƯỞNG THUẬT TOÁN :
Bài này cũng tương tự như hai bài trên nhưng ta lại xét tháng trước nó sẽ nhanh hơn. Nếu tháng hợp lệ thì ta xét năm và ngày
2. Ý NGHĨA CỦA MỘT SỐ BIẾN TRONG BÀI :
• Trong bài này cũng chỉ có 3 biến: ngay , thang ,nam Cả 3 biến này đều là biến input
3. BÀI GIẢI :


#include<stdio.h>
#include<conio.h>
void main()
{
clrscr();
unsigned long nam;
int ngay, thang;
printf("Nhap vao ngay ");
scanf("%d",&ngay);
printf("Nhap vao Thang ");
scanf("%d",&thang);
printf("Nhap vao Nam ");
scanf("%lu",&nam);
switch(thang)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
if((ngay>0)&&(ngay<32)&&(nam>0))
printf(" Ngay nay la ngay hop le");
else
printf(" Ngay nay la ngay khong hop le");
break;
case 2:
if(((nam%4==0)&&(nam%100!=0))||(nam%400==0))
{
if((ngay>0)&&(ngay<30))
printf(" Ngay nay la ngay hop le")
else
printf(" Ngay nay la ngay khong hop le");
}
else
{
if((ngay>0)&&(ngay<29))
printf(" Ngay nay la ngay hop le");
else
printf(" Ngay nay la ngay khong hop le");
}
break;
case 4:
case 6:
case 9:
case 11: if((ngay>0)&&(ngay<31)&&(nam>0))
printf(" Ngay nay la ngay hop le");
else
printf(" Ngay nay la ngay khong hop le");
break;
default : printf("Ngay nay la ngay khong hop le ");

}
getch();
}


HẾT

hailoc12
05-08-2006, 07:13 PM
BÀI 05 :

1. Ý TƯỞNG THUẬT TOÁN :
Bài này khai báo một biến kí tự để so sánh với mã phím input
Nếu nhập 1 thì nhập chiều dài & rộng của hình chữ nhật
Cách in ra hình chữ nhật như sau :
In ra một dòng * có chiều dài là độ dài của hình
Sau đó xuống dòng in ra kí tự * và in một dòng khoảng trắng nhỏ hơn độ dài là 2 rồi in kí tự * và xuống hàng
Cứ như thế lặp lại số lần = chiều rộng trừ 2
In một dòng * cuối cùng bằng độ dài của hình
Nếu nhập vào 2 thì nhập cạnh của hình vuông
Cách in hình vuông tương tự như hình chữ nhật

2. Ý NGHĨA CỦA MỘT SỐ BIẾN TRONG BÀI :
Trong bài này cĩ bi?n menu là bi?n nh?n mã phím và di?u khi?n vẽ hình
Các biến a,b : là độ dài của hình cần vẽ

3. BÀI GIẢI :


#include<stdio.h>
#include<conio.h>
void main()
{
clrscr();
char menu;
int a,b;
do
{
printf(" Bam phim 1 de ve hinh chu nhat \n");
printf(" Bam phim 2 de ve hinh Vuong \n");
printf(" Bam phim 3 de thoat chuong trinh \n");
printf(" Nhap vao mot so de thuc hien \n");
fflush(stdin);
scanf("%c",&menu);
/*-----------Ve Hinh Chu Nhat --------------------*/
if(menu=='1')
{
printf("Nhap vao chieu dai cua hinh ");
scanf("%d",&a);
printf("Nhap vao chieu rong cua hinh ");
scanf("%d",&b);
for(int i=0;i<a;i++)
printf("*");
printf("\n");
for(int j=0;j<b-2;j++)
{
printf("*");
for(int k=0;k<a-2;k++)
printf(" ");
printf("*\n");
}
if(a>1)//In ra dong cuoi,truong hop a=1 neu In se du mot dong
{
for(int i=0;i<a;i++)
printf("*");
}
printf("\n");
}
/*--------Ve Hinh Vuong --------------------------*/
if(menu=='2')
{
printf("Nhap vao canh cua hinh ");
scanf("%d",&a);
for(int i=0;i<a;i++)
printf("*");
printf("\n");
for(int j=0;j<a-2;j++)
{
printf("*");
for(int k=0;k<a-2;k++)
printf(" ");
printf("*\n");
}
if(a>1)//In ra dong cuoi,truong hop a=1 neu In se du mot dong
{
for(int i=0;i<a;i++)
printf("*");
}
printf("\n");

}
}while(menu!='3');
if(menu=='3')
return;
getch();
}

HẾT

hailoc12
05-08-2006, 07:15 PM
BÀI 06

1. Ý TƯỞNG THUẬT TOÁN :
Đặt một biến bằng số nguyên nhỏ nhất sau đó tăng lên 1
Giảm số cần phân tích bằng cách chia cho biến đó
Thực hiện cho đến khi nào phép chia ở bước b =1

2. Ý NGHĨA CỦA MỘT SỐ BIẾN TRONG BÀI :
Trong bài ta đặt biến i là biến số nguyên tố nhỏ nhất i =2, n là biến input cần phân tích

3. BÀI GIẢI :


#include<stdio.h>
#include<conio.h>
void main()
{
clrscr();
unsigned long n,i=2;
printf("Nhap vao so can phan tich ");
scanf("%lu",&n);
while(i<=n)
{
if(n%i==0)
{
if(n/i==1)
printf("%2lu",i);
else
printf("%2lu x",i);
n/=i;

}
else
i++;
}
getch();
}

HẾT

hailoc12
05-08-2006, 07:19 PM
BÀI 07

1. Ý TƯỞNG THUẬT TOÁN :
Định nghĩa: số chính phương là số có căn bậc 2 là một số nguyên
Đối với bài này ta có hai cách viết
Cách 1 : Ta lấy căn bậc hai của số đó trừ cho phần nguyên căn bậc 2 của số đó nếu bằng 0 thì nó là số chính phương, ngược lại không phải.
Cách 2 : Cho vòng for i chạy từ 1 đến số cần kiểm tra nếu i*i==n thì xuất ra nó là số chính phương và thoát chương trình

2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
o n : là biến input
o flag :là biến cờ để biết đúng hay sai nếu bằng 1 là số chính phương

3. BÀI GIẢI :


#include<stdio.h>
#include<conio.h>
#include<math.h>
void main()
{
clrscr();
float n;
int flag=0;
printf("Nhap vao mot so ");
scanf("%f",&n);
/*-------------------Cach 1 ------------------------------*/
for(float i=1;i<=n;i++)
{
if(n==i*i)
{
printf("La so chinh phuong");
flag=1;
break;
}
}
if(flag==0)
printf("Khong phai la so chinh phuong");




/*------------------Cach 2 -------------------------------*/
/*
if(sqrt(n)==(int)sqrt(n))
printf("La so chinh phuong ");
else
printf("Khong phai"); */
getch();
}

HẾT

hailoc12
05-08-2006, 07:26 PM
BÀI 08

1. Ý TƯỞNG THUẬT TOÁN :
Định nghĩa: Số nguyên tố là số chỉ chia hết cho 1 và chính nó, điều kiện là lớn hơn 1
Đối với bài này có rất nhiều cách làm nhưng tôi nghĩ cách sau là các bạn dễ hiểu nhất
Cho một vòng lặp for i chạy từ 2 cho đến số cần kiểm tra nếu số đó chia hết cho i thì đếm số lần
Kết luận nếu số lần chia hết là 1 thì là số nguyên tố ngược lại thì không phải
2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
n : là biến input
i : lưu động từ 2 đến n
dem : đếm số lần n chia hết cho i

3. BÀI GIẢI :


#include<stdio.h>
#include<conio.h>
void main()
{
clrscr();
unsigned long n;
int dem=0;
printf(" Ban hay nhap vao so ");
scanf("%lu",&n);
for(unsigned long i=2;i<=n;i++)
{
if(n%i==0)
dem++;
}
if(dem==1)
printf(" La so nguyen to");
else
printf(" khong la so nguyen to");
getch();

}

HẾT

Thuật toán của bài này cũng được !!
Nhưng mà có cách khác cũng được đó :Bạn cho thêm 1 biến phụ chẳng hạn biến NT=1.
VD chương trình sau:


#include "stdio.h"
#include "conio.h"
void main()
{
int N,i,NT=1;
printf("\nNhap gia tri cua N:");
scanf("%d",&N);
for(i=2;i<N;i++)
if(N%i==0)
{
NT=0;
break;
}
if(NT)
printf("\nSo %d la so nguyen to.",N);
else
printf("\nSo %d ko la so nguyen to.",N);
getch();
}


Mình nghĩ cách làm này vẫn chưa hay vì thực tế ta chỉ cần kiểm tra từ 2 đến căn bậc 2 của n là ok rồi. Giả mã:


bool bNguyenTo;
if (n == 2) bNguyenTo = true;
else
{


bNguyenTo = true;
for (int i = 2; i <= sqrt(n); i++)

if ((n % i) == 0)
{

bNguyenTo = false;
break;
}

}
if (bNguyenTo == true) printf("n là số nguyên tố");
else printf("n là hợp số");


Đã sửa lại


#include "stdio.h"
#include "conio.h"
#include "math.h"
int main()
{
int n;
printf("\nHay nhap vao so can kiem tra: ");scanf("%d",&n);
int bNguyenTo;
if (n == 2) bNguyenTo = 1;
else
{
bNguyenTo = 1;
for (int i = 2; i <= sqrt(n); i++)
if ((n % i) == 0)
{
bNguyenTo = 0;
break;
}
}
if (bNguyenTo) printf("n la so nguyen to");
else printf("n la hop so");
return 0;
}

Đại loại là vậy, mình cũng chưa kiểm tra lại 0:)

Rất cám ơn sự góp ý của hai anh, đúng là đoạn chương trình của hai anh tối ưu hơn thật. Em đã sửa lại cho nó chạy được, tuy nhiên hình như vẫn còn một lỗi nào đó, với 1 nó vẫn cho là số nguyên tố.
Em cũng chưa hiểu rõ lắm tại sao chỉ cần chạy tới căn bậc hai của N vì rõ ràng theo định nghĩa thì nó phải không chia hết cho mọi số nhỏ hơn nó trừ số 1

1. 0 và 1 thì người ta không xét là nguyên tố hay hợp số cả, vì vậy trong đoạn code hoàn chỉnh em nên thêm nó vào.
2. Định nghĩa là một chuyện còn định lý, hệ quả lại là một chuyện khác, sau đây sẽ là chứng minh một số tự nhiên n là hợp số thì sẽ tồn tại một ước số không lớn hơn căn bậc 2 của n:


Vì n là hợp số => tồn tại một số p(p#1, p#n) để n chia hết cho p.
Đặt q= n/p => q#1, q#n.
đặt r= min(p, q) => r<=p && r<=q
=> r^2 <= p*q = n
=> r <= sqrt(n) mà r là ước của n (do r =p hoặc r =q)
=> n tồn tại một ước số nhỏ hơn hoặc bằng căn bậc 2 của n và khác 1
=> đpcm
P/S: kí hiệu "#" nghĩa là khác ^_^


Cám ơn anh nhiều, ra là vậy, em tìm mấy sách chỉ thấy nó bảo cải tiến như vậy thôi chứ chẳng sách nào nói vì sao cả.


Cám ơn anh nhiều, ra là vậy, em tìm mấy sách chỉ thấy nó bảo cải tiến như vậy thôi chứ chẳng sách nào nói vì sao cả.
Lão Vinhie là bạn Em đó các Bác.:D
--------------------------------------------------------------------------
Cho Em hỏi cái!
Trong C/C++ có Function nào có thể check 1 chuỗi xem nó có là số hay không?
Ví dụ:
1-String s = "Hello World";or
2-String s = "1.2354"
If NO(TH 1) return FALSE.
If YES(TH2) return TRUE.
Thanks a lot.

1. sao chú ecard biết mà vào đây nhỉ?
2. Không có nguyên một hàm như thế nhưng cũng có cách đấy, ngắn thôi!


2. Không có nguyên một hàm như thế nhưng cũng có cách đấy, ngắn thôi!
Khó quá hả ??? Đang nghĩ chứ giề ???:D
Could U help me at All???Y!:)
PS/
Nghe nói đây là chuyên nghanh` của Lão Vinhie47.

hehe, chú em chỉ hỏi Yes/No chứ không hỏi How thì anh trả lời như vậy là thoả đáng rồi, trong trường hợp này thì làm như sau:


if (atof(str) == 0)
printf("không phải là số");
else
printf("là số");

đại loại là vậy.
P/S: chú bảo cái gì là chuyên ngành anh cơ? :-/

Bác đã reply qua YIM rồi,Ai ngờ qua đấy vẫn thấy bài.Bác chu đáo quá ha.
He sao bây giờ có hàm atof hay ha.
Tuy Tui còn một số thắc mắc về vấn đề này nhưng đã được ngộ ra một ít (http://www.codeguru.com/forum/showthread.php?t=351055)(not All vì Em hơi đần)
Cuối cùng cũng để giải quyết bài toán trên nhưng được thực hiện bởi một ngôn ngữ khác.Một thứ ngôn ngữ không nằm trong chính giáo.

str$='abcd'
**str$='1.2345'
**str$='7654'
var1=VAL(str$)
If (var1=0) Then
Message("variable is string.","")
Return()
Else
var2=INT(var1)
If (var1<>var2) Then
Message("Variable is Floating Point number.","")
Else
Message("Variable is Integer number.","")
End
End

Đố Vinhie46.9999 biết đó là thứ ngôn ngữ gì:D .If Bác biết Em cho Bác 10K.:D
Thanks for your help
Regards.

Ku câu bài quá! Cái đoạn trên chẳng biết là cái gì nhưng chắc chỉ có họ hàng nhà BASIC mới có mấy cái từ khóa linh tinh như trên.
Lại còn thêm cái dollar vào cuối tên biến kiểu string nữa chứ, có khi là QBASIC hay color Basic,... gì gì đó. Thử search thì lại không thấy cái gì vừa có $ ở cuối, vừa có Message("stupid something") cả. Để lúc nào rảnh rỗi anh tìm được rồi PM cho chú vậy :(

P/S: mà chú bỏ cái kiểu nửa Việt nửa Anh đấy đi, đọc bực mình quá!

Đúng rồi, cái này là họ hàng nhà Basic, nếu không thì cũng là con cùng cha khác mẹ hoặc cùng mẹ khác cha thôi. Dùng google đi.

Có cái gì mang lên đây cho anh em xem với chứ, nói xuông làm tính tò mò của Dreaminess nổi lên rồi nè. he he

Hê hê, vừa rồi mới nghĩ ra là thằng bạn của mình vốn sẵn tính lười, nên chắc nó lấy được đoạn code này ở đâu đó rồi cut-n-paste nên tìm thử luôn cái code trên, không ngờ ra luôn kết quả thật :))
Cái ngôn ngữ trên không phải là Programming language mà là một dạng Scripting language (cái này không phải là anh vừa t.A+V như chú đâu mà là dịch ra thì khó hiểu hơn). Tên nó là MMB (Multimedia Builder)
Chi tiết tại đây:
_http://mmb.mediachance.com/

Thằng Em của Tại Hạ đang học C nó hỏi một câu như thế mà trình độ C của Tôi thì lại còi cọc quá. Nên câu hỏi tuy đơn giản nhưng Tôi không trả lời được.Nên lên mạng hỏi , Ai ngờ vào đây thấy chú Vinh làm Mod, giật cả Mình nên mới tham gia chút cho vui thôi, chứ không dám múa máy linh tinh đâu. Không ngờ thằng Google lại nguy hiểm như vậy.Tại hạ cũng không ngờ mình sơ hở đến thế, để cho Lão Vinhie(Vinh Intenet Explorer) nó search, nếu biến tướng đi một chút thì có lẽ không có chuyện này xảy ra.Thật khâm phục , khâm phục tài search của Chú Vinh.


Ku câu bài quá!

Mod kinh quá , Xóa luôn hết các Bài của Anh đi .Anh không đánh giá cao chuyện này :)%


Hê hê, vừa rồi mới nghĩ ra là thằng bạn của mình vốn sẵn tính lười, nên chắc nó lấy được đoạn code này ở đâu đó rồi cut-n-paste nên tìm thử luôn cái code trên, không ngờ ra luôn kết quả thật )

Thực ra đây là câu hỏi của Tui được lão Odklizec trả lời chứ không phải Tui lấy code linh tinh rồi copy paste vào đây.
Câu hỏi của Tôi đến đây là kết thúc.

Good luck.

Kevin Hoang
05-08-2006, 07:28 PM
BÀI 09

1. Ý TƯỞNG THUẬT TOÁN :
Ta chỉ xét khi a# 0 và b#0
TH1 :Nếu Xét a> =b thì ta lấy a – cho b cho đến khi nào a nhỏ hơn b . Lưu ý : (Nếu a=0 thì thoát ) . Nếu 0 < a <b thì ta lại lấy b –cho a cho đến khi nào b =0
TH2 : Ngược lại khi b >=a
Cuối cùng
- Nếu a=0 thì ước chung lớn nhất là b và bội chung nhỏ nhất là (x * y ) /b .
- Nếu ngược lại thì ước chung lớn nhất là a và bội chung nhỏ nhất là ( x * y)/a
2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
- Trong bài chỉ có hai biến quan trọng đó là x,y là 2 biến input và a , b là hai biến gán tạm thời bằng giá trị x ,y để khi thực hiện sẽ không làm ảnh hưởng đến giá trị của hai số input ban đầu .

3. BÀI GIẢI :



//Bài giải 1
#include<stdio.h>
#include<conio.h>
void main()
{
clrscr();
/* -------------tim Uoc so chung lon nhat ----------*/
unsigned long a,b,x,y;
printf("Nhap vao so thu nhat ");
scanf("%lu",&a);
printf("Nhap vao so thu hai ");
scanf("%lu",&b);
x=a ; y=b;
while((a!=0)&&(b!=0))
{
if(a>=b)
a-=b;
else
b-=a;
}
/* boi so chung nho nhat la tich cua hai so chia cho USCLN */

if(a==0)
{
printf(" Uoc so chung lon nhat la %lu \n" ,b);
printf(" Boi so chung nho nhat la %lu ",(x*y)/b);
}
else
{
printf("Uoc so chung lon nhat la %lu \n",a);
printf(" Boi so chung nho nhat la %lu ",(x*y)/a);
}
getch();

}




//Bài giải 2: Sử dụng thuật toán ƠCLIT
#include<stdio.h>
#include<conio.h>
void main()
{
clrscr();
/* -------------tim Uoc so chung lon nhat ----------*/
unsigned long a,b,t,r,x,y,ucln;
printf("Nhap vao so thu nhat ");
scanf("%lu",&a);
printf("Nhap vao so thu hai ");
scanf("%lu",&b);
if (a<b)
{
t= a;
a= b;
b=t;
}
x=a;
y=b;
r=b;
while (r>0)
{
r=a % b;
if (r==0) ucln=b;
else
{
a=b;
b=r;
}
}
/* boi so chung nho nhat la tich cua hai so chia cho USCLN */
printf("\nUoc chung lon nhat la %d",ucln);
printf("\nBoi chung nho nhat la %d",(x*y / ucln));
getch();

}



HẾT

Bài này làm theo cách này vừa dài vừa ko hay ....!!
Bà con xem có còn chỗ nào có thể rút ngắn đi được ko..!!Suy nghĩ đi...Dài quá

Có gì đâu. Thay vì dùng a-b ta thay bằng a mod b. Chương trình vừa chạy nhanh và ngắn. He he.

Vâng, em sẽ sửa lại
Còn về thuật toán ƠClIT nếu bạn nào chưa biết mình sẽ trình bày lại

Bài giải 1 tìm USCLN em thấy nó sao sao ấy ! Hình như số nào nó cũng cho ra số 0 thì phải.
Em nhớ cách làm là :
for (;a!=b;)// mới chỉ học vòng lặp for :)
if (a>b) a-=b;
else b-=a;
uscln=a;//hoặc uscln=b

Bài giải 1 mình đã xem lại rồi, nó vẫn chạy ngon lành cho đáp án đúng. Bạn thử xem có trục trặc gì ở trình biên dịch không .


x=a ; y=b;
while((a!=0)&&(b!=0))
{
if(a>=b)
a-=b;
else
b-=a;
}
Phần trên chính là đoạn để tìm ước chung lớn nhất, sau khi chạy số nào bằng 0 thì đó chính là UCLN.


Bài giải 1 tìm USCLN em thấy nó sao sao ấy ! Hình như số nào nó cũng cho ra số 0 thì phải.
Em nhớ cách làm là :
for (;a!=b;)// mới chỉ học vòng lặp for :)
if (a>b) a-=b;
else b-=a;
uscln=a;//hoặc uscln=b

Nếu sử dụng Borland C++ for Win(BCW.exe) thì khải khai báo đúng thư mục hệ thống(Windows) khi cài đặt. Nếu không mọi kết quả tính toán sẽ là zero hết.

Thuật toán Euclid dựa trên một tính chất số học là
UCLN(a,b) = UCLN(b, a mod b) với a,b là các số nguyên

Vì thế ta có thuật toán

while (b > 0)
{
r = a % b;
a = b;
b = r;
}
return a;

Thực ra thì thuật toán sử dụng phép trừ bản chất cũng giống như trên vì :

a mod b = a - m*b
Nhưng thực tế thuật toán này chạy nhanh hơn.

Phép trừ chạy nhanh hơn ư ? Cái này lần đâu tiên em được nghe thấy. Anh có thể giải thích rõ hơn được không ?


Phép trừ chạy nhanh hơn ư ? Cái này lần đâu tiên em được nghe thấy. Anh có thể giải thích rõ hơn được không ?
Không phải tôi nói phép trừ chạy nhanh hơn mà là thuật toán Euclid dùng phép mod nhanh hơn thuật toán Euclid dùng phép trừ.

Phép toán mod chậm hơn phép trừ rất nhiều nhưng tốc độ hội tụ đến UCLN lại nhanh hơn.Mọi người cứ viết chương trình thử nghiệm thì thấy.

Ở đây có sự nhầm lẫn. Phép lấy dư (Mod) bao giờ chạy nhanh hơn phép trừ. Vì máy tính thực hiện phép lấy dư chỉ bằng một lần tính, còn phép trừ thì nhiều hơn, vì phép trừ còn phải lấy bù hai sau đó mới tính và phải tính qua phép toán cộng.

Cũng chưa hẳn, làm phép trừ có một mạch riêng đâu cần phải lấy bù hai. Chưa biết chừng để tạo được phép mod máy nó phải làm cả phép chia, nếu vậy thì rõ ràng là trừ như vậy nhanh hơn.

Làm gì có mạch trừ. Không biết các CPU mới thế nào chứ loại x86 mà chúng ta đang dùng không có mạch trừ chứ. Dreaminess chưa hề nghe đến mạch trừ trong CPU x86 hoặc CPU cùng thời hoặc cũ hơn.

Em nhớ là có một địa chỉ hình như là 0000:406C có thể được dùng để đo tốc độ của chương trình. Trong pascal em vẫn thường đọc nó vào lúc bắt đầu chương trình và sau khi chương trình thực hiện xong để tính thời gian chạy, việc đó đựơc thực hiện thông qua chỉ thị absolute gán địa chỉ trực tiếp cho một biến. Nhưng không biết trong C có cấu trúc tương tự như vậy không. Em sẽ viết thử chương trình đo tốc độ để xem cái nào chạy nhanh hơn

hailoc12
05-08-2006, 07:30 PM
BÀI 10 :

1. Ý TƯỞNG THUẬT TOÁN :
• Trong bài này thì chủ yếu là ta biết khống chế và in ra lượng dấu * cho phù hợp với định dạng của hình mà cần in .
• Thường là ta cho một vòng lặp khống chế số hàng dấu * in ra , một vòng lặp in ra số khoảng trắng và một vòng lặp in ra dấu * . Nhưng cũng nên lưu ý hai vòng lặp này phải đồng thời lẫn nhau theo từng định dạng hình cần in .
2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
Trong bài chỉ có biến h là biến chiều cao input từ người dùng , các biến còn lại đều là biến chạy của các vòng lặp .
3. BÀI GIẢI :


// chuong trinh in tam giac ra man hinh //
#include<stdio.h>
#include<conio.h>
void main()
{
clrscr();
int h,i,j,k,t;
printf("Nhap Vao Chieu Cao Cua Hinh Tam Giac h= ");
scanf("%d",&h);
printf("\n");
//-------------In Tam Giac Thu 1 & Thu 2---------------------//
for(t=0;t<2;t++)// in ra hai lan tam giac nhu nhau
{
for(i=1;i<=h;i++) // chay chieu cao cua hinh
{
for(j=1;j<=i;j++) // in ra so luong dau * tuong ung voi do dai
printf("*");
printf("\n");
}
printf("\n\n");
getch();
}

//------------In Tam Giac Thu 3-------------------------------//

printf("\n");
for(i=h;i>0;i--)// chay chieu cao cua hinh
{
for(j=0;j<i-1;j++) //in khoang trang
printf(" ");
for(k=j;k<h;k++) // roi moi in dau * xuong dong
printf("*"); //quay len in khoang trang tiep
printf("\n"); //khi i tang so luong khoang trang giam so luong * tang
}

//-----------In Tam Giac Thu 4-------------------------------//
printf("\n");
getch();
for(i=0;i<h;i++) // chay chieu cao cua hinh
{
for(j=0;j<h-i;j++)//in ra dau * giam dan theo i
printf("*");
printf("\n");
}


//---------- In tam giac thu 5--------------------------------//
printf("\n");
getch();
for(i=0;i<h;i++)//chay chieu cao
{
for(j=0;j<h-i;j++)// in ra so luong khoang trang giam theo i
printf(" ");
for(k=0;k<2*i+1;k++)// in ra so luong dau * tang theo 2*i +1
printf("*");
printf("\n");//xuong hang quay len tang i va lam tiep
}
//-----------In tam giac thu 6------------------------------//
printf("\n");
getch();


for(i=0;i<h;i++)// chay chieu cao cua hinh
{
for(k=0;k<=i;k++)// in ra so luong khoang trang tang theo i
printf(" "); // k+ them 1 truoc khi xuong dong for ke tiep
for(j=k;j<=(2*h)-k;j++)// vi vay in ra so luong dau *luon le
printf("*");
printf("\n"); //xuong hang quay len tang i thuc hien tiep
}

getch();
}

HẾT

hailoc12
07-08-2006, 01:41 PM
BÀI 11

1. Ý TƯỞNG THUẬT TOÁN :
Ở bài này ta in ra một dòng hàng ngang trước
( VD : 1 x 1 = 1 2 x 1 = 2 3 x 1 = 3 4 x 1 = 4 ……………………10 x 1 =10)
Sau đó xuống hàng và tăng tích lên
2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
• I : là số dòng của bảng cửu chương đóng vai trò là tích
• J : là số cột của bảng cửu chương đóng vai trò là thừa số
3. BÀI GIẢI :


#include<stdio.h>
#include<conio.h>
void main()
{
clrscr();
printf("\n\n\t\t\t\tBang Cuu Chuong \n\n\n");
for(int i=1;i<=10;i++)
{
for(int j=2;j<10;j++)
printf("%2dx%2d=%3d ",j,i,j*i);
printf("\ n");
}
getch();
}

HẾT

hailoc12
07-08-2006, 01:43 PM
BÀI 12

1. Ý TƯỞNG THUẬT TOÁN :
Theo đề bài ta không được lấy từng con số của b nhân với a mà vấn đề là ở chỗ từng số b nhân với từng số a . Để giải quyết bài này ta xét độ dài của cắc số rồi xuất ra theo ý muốn của mình , ở đây tôi chỉ nêu ra phần ý tưởng của thuật toán mà thôi . Trước hết bạn hãy liệt kê tất cả các biến trong bài có thể phát sinh ( VD : cần các biến tạm của hai số a và b để khi thực hiện thuật toán ta vẫn không làm ảnh hưởng giá trị của hai số a và b khi cần thiết sử dụng đến chúng , tiếp đến là bién nhớ và các biến lưu động và cộng dồn ; lưu động ở đây có nghĩa là cứ một hàng đơn vị thì tăng lên 10 .

2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
Trong bài này ta có rất nhiều biến :
A. Các biến dùng để xuất ra theo ý muốn và cân đối phép nhân gồm : i,xuat,dem1=5,dem2=5 , p =0 .
B. Các biến dùng trong thuật toán gồm :
1. a, b : là hai con số được input
2. x=a , y=tmpb=b , là các biến gán tạm thời cho hai số trên để khi tính toán có thay đổi cũng không ảnh hưởng đến hai số đó khi chúng ta cần thiết sử dụng tới nó .
3. biến demtmp : có kiểu dữ liệu int là biến tính độ dài số a
4. biến t : có kiểu int dùng để chứa từng con số b nhân với từng số a .
5. biến nho : để nhớ số hàng chục của số t khi t > 10
6. biến k có kiểu dữ liệu là double dùng để nhân lên 10 mỗi khi biến s cộng
7. biến s : là biến cộng dồn lại kết quả của một số b nhân với từng số a cho đến hết số a sau đó xuất ra số s là một hàng
8. tương tự như biến k còn có biến h dùng để cộng dồn vào biến kq .
9. biến kq : là biến kết quả của phép nhân được tính bằng cách cộng dồn s vào và nhân h khi cộng .
3. BÀI GIẢI :


#include<stdio.h>
#include<conio.h>
#include<math.h>
void main()
{
clrscr();
int i,nho=0,xuat,dem1=5,dem2=5,in,p=0,t;
long a,b,x,y,tmpb;
double s,k=1,kq=0,h=1;
do
{
printf("Ban Hay Nhap Vao So a= ");
scanf("%ld",&a);
printf("Ban Hay Nhap Vao So b= ");
scanf("%ld",&b);
}while((a<=0)||(b<=0)) ;

x=a;y=tmpb=b; //Gan cac bien tam thoi de khong anh huong hai so a & b
while(x>0)
{
x=x/10;
dem1++;// dem xem a co bao nhieu chu so + 5
}
while(y>0)
{
y=y/10;
dem2++; // dem xem b co bao nhieu chu so + 5
}
int demtmp=dem1-5;//demtmp la bien do dai cua chu so a


/* ---------------xuat ra theo y muon--------------------------------*/

if(a>b)
{
xuat=dem1;
for(int i=1;i<=dem1;i++)
printf(" ");
printf("%ld\n",a);
for(int j=1;j<=(dem1+(dem1-dem2));j++)
printf(" ");
printf("%ld\n",b);
for(int m=1;m<=dem1;m++)
printf(" ");
for(int t=1;t<=dem1-5;t++)
printf("-");
printf("\n");

}
else
{
xuat=dem2;
for(int i=1;i<=dem2+(dem2-dem1);i++)
printf(" ");
printf("%ld\n",a);
for(int j=1;j<=dem2;j++)
printf(" ");
printf("%ld\n",b);
for(int m=1;m<=dem2;m++)
printf(" ");
for(int t=1;t<=dem2-5;t++)
printf("-");
printf("\n");
}

/*----------------Thuat Toan ------------------------------------*/


while(tmpb>0)
{

demtmp=dem1-5; //gan lai do dai sau mot lan nhan
x=a; // khong muon thay doi gia tri a
k=1; // he so nhan len tung hang don vi
s=0; // ket qua cua tung con so nhan voi so a
while(x>0)
{
t=(tmpb%10)*(x%10)+nho;//tung so b nhan voi tung so a cong nho
nho=t/10;
in=t%10;
if(((tmpb<10)||(a<10)||(tmpb%10<10))&&((tmpb*x+nho)>=10)&&(demtmp==1))
{
s+=t*k;//neu nhan voi chu so dau tien cua a > 10 thi in ra luon
nho=0;
}
else
s+=in*k; // s la de luu lai gia tri cua bien in
k=k*10;
x=x/10; //sau khi nhan giam x
demtmp--;

}
for(i=xuat;i>0;i--)
printf(" ");
printf("%.0f\n",s);//xuat ra tung dong ket qua ung voi tung con so

kq+=s*h;//Ket qua cua phep nhan duoc cong don voi bien s

p++; // bien p tang la de giam di so khoang trang in ra o phia duoi
h=h*10;// thut vao 1 don vi nen phai nhan len 10 khi cong vao kq
xuat-=1; //giam di mot khoang trang khi xuong mot hang
tmpb/=10; // lay so ke trai de nhan voi tung so a
}


/*--------------------------Xuat Ket Qua Cuoi Cung----------------*/

if(a<b)
{
if(b>=10)//tru truong hop da in ra s roi con in kq , no se in hai lan
{
for(int m=1;m<=dem2-p;m++)
printf(" ");
for(int u=1;u<=dem2-3;u++)
printf("-");
printf("\n");
for(int v=0;v<=dem2-p;v++)
printf(" ");
printf("%.0f",kq);//o tren da in ra bien s nen khong in kq neu b<10
}
}
else //tuong tu
{
if(b>=10) // xet de tranh in hai lan ket qua
{
for(int m=1;m<=dem1-p;m++)
printf(" ");
for(int u=1;u<=dem1-3;u++)
printf("-");
printf("\n");
for(int v=0;v<=dem1-p;v++)
printf(" ");
printf("%.0f",kq);
}
}



getch();


}

HẾT

hailoc12
07-08-2006, 01:45 PM
BÀI 13

1. Ý TƯỞNG THUẬT TOÁN :
Ở bài này ta tính tổng các số từ 1 cho tới n , ta cần có một vòng lặp chạy từ 1 cho đến n sau đó một biến cộng dồn khi vòng lặp chạy .
2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
a. Trong bài chỉ có biến n là biến in put
b. Biến s : là biến cộng dồn khi vòng for lặp lại

3. BÀI GIẢI :


#include<stdio.h>
#include<conio.h>
void main()
{
clrscr();
unsigned long s=0;
int n,i;
printf("Nhap vao so n= ");
scanf("%lu",&n);
for(i=1;i<=n;i++)
s+=i;
printf("Tong Tu 1 --> n la %lu",s);
getch();
}

HẾT

hailoc12
07-08-2006, 01:46 PM
BÀI 14

1. Ý TƯỞNG THUẬT TOÁN :
a. Tương tự như bài 13 . nhân dồn nhưng lưu ý đối với phép nhân thì có giới hạn .
b. Bài này sẽ tôi sẽ trình bày theo hai cách :
i. Cách 1 : tương tự như bài 13
ii. Cách 2 : Ta cũng làm tương tự như cách trên nhưng khi biến nhân dồn lớn hơn 100000 thì ta cộng số mũ vào là 5 và lấy biến s chia cho 100000 , với thuật toán trên bạn có thể tính được 1000 giai thừa . ( lưu ý : biến s : kiểu dữ liệu là double )
2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
a. Cách 1 : tương tự
b. Cách 2 : có biến q : kiểu dữ liệu là int dùng để cộng số mũ khi s > 100000
3. BÀI GIẢI :


Cách 1 :

#include<stdio.h>
#include<conio.h>
void main()
{
clrscr();
double s=1;
int n,i;
printf("Nhap vao so n= ");
scanf("%lu",&n);
for(i=1;i<=n;i++)
s*=i;
printf("Tong Tu 1 --> n la %.0f",s);
getch();
}
HẾT










Cách 2 :
#include<conio.h>
#include<stdio.h>
void main()
{
double s=1;
int i,q=0,n;
clrscr();
printf("nhap n:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
s*=i;
if(s>=100000)
{
s/=100000;
q=q+5;
}
}

printf("Ket Qua cua %d giai thua %lf x 10^%d",n,s,q);
getch();
}

HẾT

hailoc12
07-08-2006, 01:47 PM
BÀI 16

1. Ý TƯỞNG THUẬT TOÁN :
Ở bài này ta dùng công thức phép lặp Newton
X[ 0 ] = ( 1 + a ) /2
X[1] = (1/2)*(X[n] + a/X[n]) ; n= 1 , 2 ,…
Sai số cho phép là trị tuyệt đối của
( X[n+1] – X[n] ) / X[n] = 10 ^ -5
2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
a. Trong bài có
hàm double can_2(double x) : dùng để trả về giá trị căn bậc 2 của một số cần tính . ở đây được xem là biến x .
Trong hàm còn có biến kq : được xem tương ứng như phần tử X[n+1] trong công thức trên
biến temp : được xem như phần tử X[ n ] trong công thức trên .
3. BÀI GIẢI :


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


double can_2(double x)
{
double kq,temp,z;
if(x==0)
return(kq=0);
kq=x;
if(x>0)
{
while(1)
{
temp=kq; // tam thoi luu lai X[n]
kq=(kq*kq+x)/(2*kq); // quy dong va rut gon tu phep lap Newton
z=fabs((kq-temp)/temp);// sai so cho phep
if(z<0.00001)
return(kq);
}
}

}

void main()
{
clrscr();
double n;
printf("nhap so can tinh can bac hai:\n x= ");
scanf("%lf",&n);
printf("\n%lf co can bac hai: %lf",n,can_2(n));
printf("\n\nnhan phim bat ki de ket thuc...");
getch();
}


HẾT

hailoc12
07-08-2006, 01:48 PM
BÀI 17

1. Ý TƯỞNG THUẬT TOÁN :
a. Ở bài này ta không phải xuất các phần tử ngược trở lại mà vấn đề là phải thay đổi được vị trí các phần tử với nhau theo đề bài là đảo ngược ( VD : phần tử đầu sẽ đảo thành phần tử cuối ) .
b. Ta nên lưu ý chỉ cho một vòng lặp chạy từ 0 cho đến nửa số phần tử mà thôi sau đó hoán đổi vị trí của hai phần tử với nhau .
2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
Trong bài có :
a. Biến a[ 100] : là mảng để chứa các phần tử .
b. Biến n : là biến input là số phần tử trong mảng .
c. Hàm daomang(int a[100] , int n ) : nhiệm vụ hàm này là đảo vị trí của toàn mảng . trong hàm có biến tmp dùng để bắc cầu khi hai biến hoán đổi vị trí cho nhau .
3. BÀI GIẢI :


#include<stdio.h>
#include<conio.h>
void nhapmang(int a[100],int n)
{
for(int i=0;i<n;i++)
{
printf("Nhap a[%d]",i);
scanf("%d",&a[i]);
}
}


void daomang(int a[100],int n)
{
int tmp;
for(int i=0;i<n/2;i++)
{
if(a[i]!=a[n-i-1])
{
tmp=a[i];
a[i]=a[n-i-1];
a[n-i-1]=tmp;
}
}
}





void xuatmang(int a[100],int n)
{
for(int i=0;i<n;i++)
printf("%2d",a[i]);
}

void main()
{
clrscr();
int a[100],n;
printf("Nhap so pt cua mang");
scanf("%d",&n);
nhapmang(a,n);
daomang(a,n);
xuatmang(a,n);
getch();
}

HẾT

hailoc12
07-08-2006, 01:49 PM
BÀI 18

1. Ý TƯỞNG THUẬT TOÁN :
a. Trước hết ta phải viết một hàm kiểm tra số nguyên tố sau đó viết hàm nhập mảng .
b. Số nguyên tố là số chỉ chia hết cho 1 và chính nó .
2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI
Trong bài gồm :
i. a[100] : mảng tối đa 100 phần tử
ii. n : số phần tử trong mảng
iii. Hàm int ktnt(int a[100] , int n) là hàm kiểm tra và trả về giá trị 1 nêú là số nguyên tố và ngược lại trả về 0
Trong hàm có biến dem : dùng để kiểm soát số lần chia hết cho I nếu là 1 lần thì là số nguyên tố ( vì I chạy từ 2).

3. BÀI GIẢI :


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

int ktnt(int x)
{
int dem=0;
for(int i=2;i<=x;i++)
{
if(x%i==0)
dem++;
}
if(dem==1)
return 1;
else
return 0;
}

void nhapmang(int a[100],int n)
{
for(int i=0;i<n;i++)
{
do
{
printf("Nhap a[%d]",i);
scanf("%d",&a[i]);
}while(!ktnt(a[i]));
}
}


void xuatmang(int a[100],int n)
{
for(int j=0;j<n;j++)
printf("%3d",a[j]);
}

void main()
{
clrscr();
int a[100],n;
printf("Nhap so phan tu cua mang");
scanf("%d",&n);
nhapmang(a,n);
xuatmang(a,n);
getch();
}

HẾT

hailoc12
07-08-2006, 01:50 PM
BÀI 19

1. Ý TƯỞNG THUẬT TOÁN :
Ở bài này theo ý tưởng của tôi ta nên cho họ nhập vào tùy ý phần tử đầu tiên sau đó dựa trên phần tử đó kiểm soát và khống chế theo đề bài
i. TH1 : Kiểm tra nếu pt đầu tiên là lẻ thì khi I chẳn phải là số chẳn và I lẻ phải là số lẻ .
ii. TH2 : Kiểm tra nếu pt đầu tiên là chẵn thì khi I chẵn phải là số lẻ và I lẻ phải nhập số chẵn .
2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
a[100] : là mảng phần tử tối đa là 100 kí tự
n : số phần tử của mảng
I : l biến chạy của một số hm for
3. BÀI GIẢI :


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

int kt_chan_le(int x)
{
if(x%2==0)
return 1;
else
return 0;
}

void nhapmang(int a[100],int n)
{
printf("Nhap a[0]"); // Nhap va xet ngay so dau tien cua mang
scanf("%d",&a[0]);
if(kt_chan_le(a[0]))
{
for(int i=1;i<n;i++)
{
if(!kt_chan_le(i))
{
do
{
printf("Nhap a[%d]",i);//Nhap tung phan tu le
scanf("%d",&a[i]);
}while(kt_chan_le(a[i])); //chan nhap lai
}
else
{
do
{
printf("Nhap a[%d]",i); //Nhap tung phan tu chan
scanf("%d",&a[i]);
}while(!kt_chan_le(a[i])); //le nhap lai
}

}
}
else
{
for(int i=1;i<n;i++)
{
if(kt_chan_le(i))
{
do
{
printf("Nhap a[%d]",i);//Nhap tung phan tu le
scanf("%d",&a[i]);
}while(kt_chan_le(a[i])); //chan nhap lai
}
else
{
do
{
printf("Nhap a[%d]",i); //Nhap tung phan tu chan
scanf("%d",&a[i]);
}while(!kt_chan_le(a[i])); // le nhap lai
}

}
}

}

void xuat(int a[100],int n)
{
for(int i=0;i<n;i++)
printf("%3d",a[i]);
}

void main()
{
clrscr();
int a[100],n;
printf("Nhap so pt cua mang");
scanf("%d",&n);
nhapmang(a,n);
xuat(a,n);
getch();
}

HẾT

hailoc12
07-08-2006, 01:51 PM
BÀI 20

1. Ý TƯỞNG THUẬT TOÁN :
a. Ở bài này ta chỉ cần xuẩt ra theo kiểu hình ma trận là được
b. Ta chỉ nhập vào ma trận với n dòng và m cột sau đó cho xuẩt ra ứng với giá trị cột ta xuất tương ứng ra các giá trị dòng ( VD : ở ma trận 3 x 3 thì 00 , 01 , 11 …………,30 , 31 , 32 ) Ta sẽ xuất được ma trận chuyển vị của ma trận nhập vào .
2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
a. Trong bài chỉ có mảng hai chiều a[ 50 ][50] chứa tối đa 50 dòng và 50 cột
b. n : số dòng của ma trận
c. m : số cột của ma trận
3. BÀI GIẢI :


#include<stdio.h>
#include<conio.h>
void nhapmang(int a[50][50],int n,int m)
{
printf("Moi ban nhap mang vao day \n");
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
printf("a[%d][%d]",i,j);
scanf("%d",&a[i][j]);
}
}
}
void xuat_1(int a[50][50],int n,int m)
{
printf("Ma tran vua nhap la\n");
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
printf("%3d",a[i][j]);
}
printf("\n");
}
}
void xuat_2(int a[50][50],int n,int m)
{
printf("Xuat chuyen vi ma tran \n");
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
printf("%3d",a[j][i]);
}
printf("\n");
}

}
void main()
{
clrscr();
int a[50][50],n,m;
printf("Nhap so hang n=:");
scanf("%d",&n);
printf("Nhap so hang m=:");
scanf("%d",&m);
nhapmang(a,n,m);
xuat_1(a,n,m);
printf("\n");
xuat_2(a,n,m);
getch();
}

HẾT

hailoc12
28-09-2006, 08:28 PM
Những bài này không phải mình làm nên post lên nguyên vẹn để tôn trọng tác giả. Còn xét điều kiện a= 0 hay khác 0 trước hay sau thì tuỳ thuộc vào thói quen của mỗi người nó không ảnh hưởng đến tính đúng đắn của thuật toán. Tuy nhiên trường hợp a=0 có thể tạm coi là trường hợp "cực đoan" của bài toán, trong các đề thi những trường hợp như vậy rất hay được khai thác để kiểm tra, phân loại học sinh vì vậy có lẽ trước khi giải phần chính ta nên liệt kê đến các trường hợp suy biến như vậy giải quyết trước rồi tạo điều kiện đúng cho phần giải quyết chính. Hơn thế nữa, chắc khi làm toán bạn cũng thấy biện luận phương trình với a=0 rất dễ nhưng cũng chiếm số điểm khá lớn (khoảng 0,5 trong tổng 2 điểm), dễ ăn điểm vậy tại sao lại không giải quyết trước.

Kevin Hoang
29-09-2006, 01:07 AM
Về giải thuật, bác làm như thế là được rồi, nhưng có điều bố trí trường hợp không được hợp lí cho lắm,em thấy thường thì khi giải phương trình bậc hai, người ta xét trường hợp a khác 0 trước. Khi đưa vào giải thuật cũng dễ nhìn và dễ kiểm tra hơn.

Chương trình này xét a!=0 trước đó thôi.

Vấn đề xét trước hay sau, Dreaminess nghĩ không sao, quan trọng là bố trí sao cho dễ hiểu mà thôi.

trieuanhl
02-10-2006, 08:02 PM
//cong tru nhan chia 2 phan so
//thay ban gi post bai nhiều quá nên mình xin post ké.ở đây đề bài không yêu cầu rút gọn nên mình không rút gọn,mình chỉ cộng trừ nhân chia 2 phân số thôi
struct phanso
{
int tu;
int mau;
};
typedef struct phanso PHANSO;

void nhap(PHANSO &P);
void xuat(PHANSO P);
PHANSO tong(PHANSO P,PHANSO Q);
PHANSO hieu(PHANSO P,PHANSO Q);
PHANSO tich(PHANSO P,PHANSO Q);
PHANSO thuong(PHANSO P,PHANSO Q);

void main()
{
PHANSO P,Q,R;
clrscr();
cout<<"nhap phan so thu nhat:";
nhap(P);
cout<<endl<<"nhap phan so thu hai:";
nhap(Q);
xuat(P);
xuat(Q);
cout<<endl;
//R=tong(P,Q);
R=hieu(P,Q);
cout<<"ket qua"<<R.tu<<"/"<<R.mau;
getch();
}
void nhap(PHANSO &P)
{
cout<<endl<<"nhap tu so:";
cin>>P.tu;
cout<<endl<<"nhap mau so:";
cin>>P.mau;
}

void xuat(PHANSO P)
{
cout<<endl<<P.tu<<"/"<<P.mau;
}

PHANSO tong(PHANSO P,PHANSO Q)
{
PHANSO R;
R.tu =P.tu*Q.mau+Q.tu*P.mau;
R.mau=P.mau*Q.mau;
return R;
}
PHANSO hieu(PHANSO P,PHANSO Q)
{
PHANSO R;
R.tu =P.tu*Q.mau-Q.tu*P.mau;
R.mau=P.mau*Q.mau;
return R;
}
PHANSO nhan(PHANSO P,PHANSO Q)
{
PHANSO R;
R.tu =P.tu*Q.tu;
R.mau=P.mau*Q.mau;
return R;
}
PHANSO chia(PHANSO P,PHANSO Q)
{
PHANSO R;
R.tu =P.tu*Q.mau;
R.mau=P.mau*Q.tu;
return R;
}

trieuanhl
02-10-2006, 08:12 PM
//cong trù nhân chia 2 số phức
số phức là cố có dạng a+b*i, trong đó a là phân thực,b là phần ảo và i là đơn vị ảo.
VD:3+5*i,là số phức
(3+5*i)+(4+2*i)=7+5*i,đó là toán cộng.
ở đây có định nghĩa đày đủ về số phức nè
http://vi.wikipedia.org/wiki/Tr%C6%B0%E1%BB%9Dng_s%E1%BB%91_ph%E1%BB%A9c
còn đây là bài của mình làm


struct sophuc
{
float thuc;
float ao;
};
typedef struct sophuc SOPHUC;

void nhap(SOPHUC &P);
void xuat(SOPHUC P);
SOPHUC tong(SOPHUC P,SOPHUC Q);
SOPHUC hieu(SOPHUC P,SOPHUC Q);
SOPHUC tich(SOPHUC P,SOPHUC Q);
SOPHUC thuong(SOPHUC P,SOPHUC Q);

void main()
{
SOPHUC P,Q,R;
clrscr();
cout<<"nhap so phuc thu nhat:";
nhap(P);
cout<<endl<<"nhap so phuc thu hai:";
nhap(Q);
xuat(P);
xuat(Q);
cout<<endl;
R=thuong(P,Q);//muon tinh tong hieu hay tich thi thay bang vao chu thuong

cout<<"ket qua:"<<R.thuc<<"+("<<R.ao<<"*i)";
getch();
}
void nhap(SOPHUC &P)
{
cout<<endl<<"nhap phan thuc:";
cin>>P.thuc;
cout<<endl<<"nhap phan ao:";
cin>>P.ao;
}

void xuat(SOPHUC P)
{
cout<<endl<<P.thuc<<"+("<<P.ao<<"*i)";
}

SOPHUC tong(SOPHUC P,SOPHUC Q)
{
SOPHUC R;
R.thuc=P.thuc+Q.thuc;
R.ao=P.ao+Q.ao;
return R;
}
SOPHUC hieu(SOPHUC P,SOPHUC Q)
{
SOPHUC R;
R.thuc=P.thuc-Q.thuc;
R.ao=P.ao-Q.ao;
return R;
}
SOPHUC tich(SOPHUC P,SOPHUC Q)
{
SOPHUC R;
R.thuc=P.thuc*Q.thuc-P.ao*Q.ao;
R.ao=P.ao*Q.thuc+P.thuc*Q.ao;
return R;
}
SOPHUC thuong(SOPHUC P,SOPHUC Q)
{
SOPHUC R;
R.thuc=(P.thuc*Q.thuc+P.ao*Q.ao)/(P.ao*P.ao+Q.ao*Q.ao);
R.ao =(P.ao*Q.thuc-P.thuc*Q.ao)/(P.ao*P.ao+Q.ao*Q.ao);
return R;
}

trieuanhl
02-10-2006, 08:30 PM
//đôi chuổi thường sang chuổi hoa
#include<conio.h>
#include<stdio.h>
#include<iostream.h>
#include<string.h>
void main(){
char *s,*p;
clrscr();
printf("nhap chuoi s:");
gets(s);
//cach 1
/*
p=strupr(s);
puts(p);
*/
//cach 2
for(int i=0;i<strlen(s);i++){
if(s[i]>'a'&&s[i]<'z')
s[i]-=32;//32 ở dây nghĩa là mã ascii chuyển từ chữ thường sang chũ
// hoa tương ứng là 32
}
puts(s);
getch();
}

TQN
02-10-2006, 09:06 PM
Ct có lỗi nặng lắm. Memory alloc cho pointer s lấy đâu ra mà gets vào vùng memory point by s. Lỗi dạng này sẽ làm crash app.

hailoc12
03-10-2006, 12:38 PM
Đúng là dùng thế có lỗi thật, trình biên dịch thông báo "Possible using s before definition" do ở đây s là con trỏ chuỗi nhưng lại chưa được khởi tạo chuỗi nào cả. Chương trình trên chạy đúng là do bên trong trỏ s đã chứa địa chỉ không xác định nào đó, khi sử dụng nó cho hàm gets thì hàm này sẽ đưa các kí tự vào địa chỉ s+1, s+2... y như một chuỗi, và sau khi xử lý sẽ cho ra kết quả đúng, tuy nhiên vùng địa chỉ s+1, s+2.... là vùng ta không kiểm soát được rất có thể lại là địa chỉ của một biến nào đó khác trong chương trình. Bạn có thể kiểm tra điều này bằng cách gán s=NULL rồi xem chương trình có còn chạy đúng nữa không.



#include<conio.h>
#include<stdio.h>
#include<iostream.h>
#include<string.h>
void main()
{
char *s ;
clrscr();
s=NULL;
printf("nhap chuoi s:");
gets(s);
//cach 1
/*
p=strupr(s);
puts(p);
*/
//cach 2
for(int i=0;i<strlen(s);i++)
{
if(s[i]>'a'&&s[i]<'z')
s[i]-=32;//32 ? dây nghia là mã ascii chuy?n t? ch? thu?ng sang chu
// hoa tuong ?ng là 32
}
puts(s);
getch();
}


Cách giải quyết vấn đề này rất đơn giản hoặc khai báo thêm mảng char a[100]; rồi gán s=a; hoặc khai báo s là char s[100];

hailoc12
06-10-2006, 09:49 PM
BÀI 21 :

1. Ý TƯỞNG THUẬT TOÁN :
Ở bài này sau khi nhập ma trận ta gán các phần tử về mảng 1 chiều sau đó sắp xếp tăng dần theo dạng xoắn ốc bằng cách gán các phần tử ở mảng b cho ma trận a .
2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
a. Trong bài bao gồm các biến toàn cục:
i. a[50][50] : mảng chứa tối đa 50 dòng 50 cột
ii. b[2500] :chứa tối đa 2500 phần tử
iii. k : số phần tử của mảng b
iv. n , m : số dòng và số cột của ma trận a
b. Trong hàm void ganlai_2c() : có nhiệm vụ gán lại mảng a theo hình xoắn ốc có :
i. Biến tmpcot = số cột -1 ( vì ta cho I chạy từ 0 )
ii. Biến tmpdong= số dòng -1 ( tương tự )
iii. Biến ptb : nghĩa là phần tử của b sẽ gán cho ma trận a và vị trí sẽ tăng lên sau khi gán ( nghĩa là chạy lên phần tử kế tiếp ) .
iv. dem : đếm số lần gán để khống chế việc (VD : ma trận 3 x 4 thì chỉ gán 12 lần mà thôi )
v. ax : là biến tăng dòng vào bên trong , nó phụ thuộc vào x thay đổi theo x để tăng chỉ số các biên đi sâu vào ma trận .
vi. Dòng for thứ nhất
Gán cho dòng thứ nhất
vii. Dòng for thứ hai :
1. Chạy từ tmpdong : là biến biên cột cố định
j : chạy từ 1 vì đã sắp xếp cạnh thứ nhất rồi , j tăng sẽ gán từ từ ma trận b vào cột biên .
2. Sau vòng for này ta phải xét nếu dem = m*n thì cho dừng tránh trường hợp gán quá số phần tử của ma trận b
viii. Dòng for thứ 3 :
1. Biến z được gán bằng tmpcot -1 có nghĩa là xét phần tử bên trong cột biên trở về ( tránh trường hợp xét phần tử ở cột vừa gán xong ) .



ix. Dòng for thứ 4 :
1. biến t được gán bằng tmpdong – 1 , t giảm đến khi nào > ax . Vì bỏ đi phần tử nằm trên cùng cột nhưng ở dòng trên của nó .

3. BÀI GIẢI :


#include<stdio.h>
#include<conio.h>
int a[50][50],n,m,b[100],k=0; //Khoi tao mang toan cuc
/*---------------Nhap Mang Ban Dau------------------------*/
void nhapmang()
{
printf("Ban Hay Nhap so dong va so cot cua ma tran ");
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
printf("a[%d][%d]",i,j);
scanf("%d",&a[i][j]);
}
}
/*--------------Xuat Mang Ban Dau------------------------*/
void xuat()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
printf("%3d",a[i][j]);

printf("\n");
}
}
/* -----------Gan Sang Mang 1 chieu va sap xep tang dan ---------*/
void gan1c()
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
b[k++]=a[i][j];
}

}
void sapxep()
{
int tmp;
for(int i=0;i<k-1;i++)
for(int j=i+1;j<k;j++)
{
if(b[i]>b[j])
{
tmp=b[i];
b[i]=b[j];
b[j]=tmp;
}
}
}
/*-----------Gan lai mang 2 chieu luc dau && Xuat-----------------------*/

void ganlai_2c()
{
int x=0,tmpcot=m-1,tmpdong=n-1,ptb=0,ax,dem=0;
while(dem<n*m)//Lap lai qua trinh gan cho den het ma tran
{
ax=x;
for(int i=ax;i<=tmpcot;i++) //gan vao bien 1 hang canh thu 1
{
a[ax][i]=b[ptb++] ;
dem++;
}
for(int j=ax+1;j<=tmpdong;j++) //gan vao bien2 cot canh thu 2
{
a[j][tmpcot]=b[ptb++];
dem++;
}
if(dem==n*m)
break;
for(int z=tmpcot-1;z>=ax;z--) // gan vao bien 3 hang canh thu 3
{
a[tmpdong][z]=b[ptb++];
dem++;
}
for(int t=tmpdong-1;t>ax;t--) // gan vao bien 4 hang canh thu 4
{
a[t][ax]=b[ptb++];
dem++;
}
x++;
tmpcot--; //giam vi tri tung bien de thanh soan oc
tmpdong--;
}
}
void xuata()
{
textcolor(-4);
cprintf("Mang sau khi sap xep la :\n");
printf("\n\n");
for(int i=0;i<n;i++)
{
for (int j=0;j<m;j++)
{
//textcolor(4);
printf("%4d",a[i][j]);
}
printf("\n\n");
}
}
/*--------------------------------MAIN--------------------------------*/
void main()
{
clrscr();
nhapmang();
xuat();
gan1c();
sapxep();
ganlai_2c();
xuata();
getch();
}
HẾT

hailoc12
06-10-2006, 09:50 PM
void xuatmang(int a[100],int n)
{
for(int i=0;i<n;i++)
printf("%3d",a[i]);
}

void main()
{
clrscr();
int a[100],n;
printf(" Nhap so phan tu cua mang ");
scanf("%d",&n);
nhapmang(a,n);
xuatmang(a,n);
sapxep(a,n);
printf("\n Mang sau khi duoc sap xep la \n");
xuatmang(a,n);
getch();
}
HẾT

hailoc12
06-10-2006, 09:50 PM
BÀI 23 :
1. Ý TƯỞNG THUẬT TOÁN :
a. Trước hết viết hàm tìm số nguyên tố .
b. Cho vòng lặp đễ xác định được số nguyên tố đầu tiên và gán cho nó là lớn nhất .
c. Sau đó tạo một vòng lặp quét hết các phần tử và kiểm tra nếu thỏa
i. Lớn hơn số nguyên tố đựợc xác định lúc đầu và
ii. Là số nguyên tố
d. Ta sẽ tìm được số nguyên tố lớn nhất .

2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
a. Ở bài này chỉ có hàm int ktnt(int x ) : trong đó x là đối số cần kiểm tra i là biến chạy , dem : là đếm số lần chia hết cho i
b. Hàm void search(int a[100] , int n ) , trong đó :
i. max : là biến dùng để gán giá trị là số nguyên tố lớn nhất
ii. vt : là tìm vị trí của số nguyên tố lớn nhất
c. Hàm main() có :
i. a[100] : mảng tối đa có 100 phần tử
ii. n : số phần tử trong mảng
3. BÀI GIẢI :



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

void nhapmang(int a[100],int n)
{
for(int i=0;i<n;i++)
{
printf("a[%d]",i);
scanf("%d",&a[i]);
}
}

int ktnt(int x)
{
int dem=0;
for(int i=1;i<=x;i++)
{
if(x%i==0)
dem++;
}
if(dem==2)
return 1;
else
return 0;
}

void xuatmang(int a[100],int n)
{
for(int i=0;i<n;i++)
printf("%3d",a[i]);
}

void search(int a[100],int n)
{
int max=0,vt; // vi so nguyen to luon lon hon 0
for(int i=0;i<n;i++)
{
if(ktnt(a[i]))// neu kiem tra dung thi gan cho max
{
if(a[i]>max) // neu phan tu thu i lon hon max thi gan cho max
{
max=a[i];
vt=i+1;
}

}
}
if(max==0)
printf("Trong mang khong co so nguyen to ");
else
printf(" \n So nguyen to lon nhat trong mang la %d tai phan tu so %d" , max,vt);
}





void main()
{
clrscr();
int a[100],n;
printf(" Nhap so phan tu cua mang ");
scanf("%d",&n);
nhapmang(a,n);
xuatmang(a,n);
search(a,n);
getch();
}

hailoc12
06-10-2006, 09:52 PM
BÀI 24

1. Ý TƯỞNG THUẬT TOÁN :
a. Phải có một hàm tính tổng các phần tử trên một hàng và có một hàm hoán đổi vị trí các phần tử hai hàng với nhau .
b. Sau đó viết một hàm có vòng lặp kiểm tra và hoán đổi đồng thời viết một hàm sắp xếp các phần tử tăng dần trên từng hàng .
2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
a. Ở bài này thì có các hàm :
i. Hàm int tong_hang(int a[50][50] , int m ,int k) : hàm này có nhiệm vụ trả về con số có giá trị là tổng của hàng k truyền vào .trong hàm có biến t : làm nhiệm vụ cộng dồn , z : là biến chạy vòng lặp
ii. Hàm void swap_hang(int a[50][50] , int m ,int x ,int y ) : làm nhiệm vụ hoán đổi các phần tử giữa hai hàng x và y .
iii. Hàm void sapxep( int a[50][50] , int n ,int m) : làm nhiệm vụ sắp xếp theo đề bài . Trong hàm có các biến :
1. k : là biến giới hạn hàng xét chỉ chạy tới dòng kế cuối mà thôi
2. z : là biến ứng với một giá trị của k thì z sẽ quét từ k+1 cho đến dòng cuối cùng
3. Đồng thời trong hàm còn có sắp xếp các phần tử tăng dần theo từng hàng có 3 dòng for
a. Vòng for thứ nhất : giới hạn xét hàng
b. Vòng for thứ hai : lấy từng phần tử đi so sánh
c. Vòng for thứ ba : sẽ chạy các phần tử tiếp theo ứng từ giá trị phần tử của Vòng for thứ hai màquét cho đến hết số phần tử trên hàng đó rồi sắp xếp .
iv. Ở hàm main() : có các biến a[50][50] : mảng tối đa 50 hàng và 50 cột , n : số hàng của mảng , m : số cột của mảng .

3. BÀI GIẢI :



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

/*----------------Nhap Mang & Xuat Mang -----------------*/

void nhapmang(int a[50][50],int n,int m)
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
printf("a[%d][%d]",i,j);
scanf("%d",&a[i][j]);
}
}

void xuatmang(int a[50][50],int n,int m)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
printf("%3d",a[i][j]);
}
printf("\n");
}

}
/*------------Tinh Tong cac phan tu tren hang ------------*/

int tong_hang(int a[50][50],int m,int k)
{
int t=0;
for(int z=0;z<m;z++)
t+=a[k][z];
return t;
}

/*--------------Hoan doi Vi Tri cua hai hang -------------*/

void swap_hang(int a[50][50],int m,int x ,int y)
{
int tmp;
for(int i=0;i<m;i++)
{
tmp=a[x][i];
a[x][i]=a[y][i]; //Doi cho phan tu tuong ung cua hai hang
a[y][i]=tmp;
}
}
/*----------------Goi hai ham tren sap xep va sap xep tang dan tung hang----*/

void sapxep(int a[50][50],int n,int m)
{
int k=0,z,tmp;
while(k<n-1) // sap xep tang theo tung cai tong cua hang
{
for(z=k+1;z<n;z++)
{
if(tong_hang(a,m,k)>tong_hang(a,m,z))
swap_hang(a,m,k,z);
}
k++;
}
// Sap xep tung hang tang dan

for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
for(int p=j+1;p<m;p++)
{
if(a[i][j]>a[i][p])
{
tmp=a[i][j];
a[i][j]=a[i][p];
a[i][p]=tmp;
}
}

}
/*--------------------Ham Chinh --------------------------------*/

void main()
{
clrscr();
int a[50][50],n,m;
printf("Nhap so dong");
scanf("%d",&n);
printf("Nhap so cot");
scanf("%d",&m);
nhapmang(a,n,m);
xuatmang(a,n,m);// Xuat Mang Luc Dau
sapxep(a,n,m);
printf("\n\nsau khi sap xep mang la\n");
xuatmang(a,n,m);// Xuat Mang Luc sau
getch();
}
HẾT

hailoc12
06-10-2006, 09:52 PM
BÀI 25

1. Ý TƯỞNG THUẬT TOÁN :
a. Ta phải xác định ma trận tích thu được là có số dòng là số dòng của ma trận 1 và số cột là số cột của ma trận 2 .
b. Từ đó xác định được giá trị giới hạn của vòng lặp rồi nhân theo phương pháp nhân 2 ma trận .
c. Lưu ý Phải có cả hai điều kiện sau mới tính tích được
i. số cột của ma trận 1 bằng số dòng của ma trận 2
2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
a. Trong bài có hàm :
i. Void xuatmatran3(int kq[10][10] ,int a[10][10] , int b[10][10] ,int n ,int m , int c) : làm nhiệm vụ nhân và xuất ma trận kết quả .
ii. Trong hàm có 3 dòng for :
1. Vòng for thứ nhất : Chạy trên từng dòng của ma trận 1
2. Vòng for thứ hai : Chạy trên từng cột của ma trận 2
3. Vòng for thứ ba : ứng với từng giá trị của Vòng for thứ nhất và vòng for thứ hai nó quét trên từng phần tử .
4. sau khi tính in ra phần tử đó luôn .
b. Ở hàm main() gồm :
i. a[10][10] : ma trận tối đa 10 hàng 10 cột
ii. n, m : là số dòng và số cột của ma trận a
iii. b[10][10] : ma trận tối đa 10 hàng 10 cột
iv. d, c : là số dòng và số cột của ma trận b
v. kq[10][10] : là ma trận kết quả có tối đa là 10 dòng và 10 cột

3. BÀI GIẢI :



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

void nhapmatran1(int a[10][10],int n,int m)
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
printf("a[%d][%d] ",i,j);
scanf(" %d",&a[i][j]);
}
}

void nhapmatran2(int b[10][10] ,int d,int c)
{
int i,j;
for(i=1;i<=d;i++)
{
for(j=1;j<=c;j++)
{
printf("b[%d][%d]",i,j);
scanf("%d",&b[i][j]);
}
}
printf("\n\n\n");
}
void xuatmatran3(int kq[10][10],int a[10][10],int b[10][10],int n,int m,int c)
{
int i,j,k;
printf(" Ma tran ket qua la \n\n\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=c;j++)
{
kq[i][j]=0;
for(k=1;k<=m;k++)
{
kq[i][j]+=a[i][k]*b[k][j];
}
//textcolor(i-9);
printf("%5d",kq[i][j]);
}
printf("\n");
}
}

void main()
{
clrscr();
int n,m,d,c,a[10][10],b[10][10],kq[10][10];
printf("Nhap vao so Dong Va Cot cua ma tran 1 ");
scanf("%d%d",&n,&m);
nhapmatran1(a,n,m);
printf("Nhap vao so Dong Va Cot cua ma tran 2 ");
scanf("%d%d",&d,&c);
nhapmatran2(b,d,c);
if((n==c)&&(m==d))
xuatmatran3(kq,a,b,n,m,c);
else
printf("Hai ma tran nay khong nhan voi nhau duoc ");
getch();
}

HẾT

hailoc12
06-10-2006, 09:52 PM
BÀI 26

1. Ý TƯỞNG THUẬT TOÁN :
Tương tự bài só nguyên tố lớn nhất ở bài 23 . Nhưng ở bài này ta cần tìm ra số âm đầu tiên sau đó từ vị trí số ăm đó quét cho đến hết mảng và tìm ra số âm lớn nhất .
2. Ý NGHĨA MỘT SỐ BIÉN TRONG BÀI :
a. Trong bài có hàm void search_am(int a[100] ,int n ) : làm nhiệm vụ tìm và in ra số âm lớn nhất trong mảng . Trong đó có các biến :
i. max : là chứa số âm lớn nhất biến max thay đổi theo giá trị của số âm trên mảng .
ii. vt : là biến chứa vị trí của phần tử hiện đang là số âm lớn nhất
b. Hàm main() có :
i. a[100] : mảng 1 chiều tối đa 100 phần tử .
ii. n : số phần tử trong mảng .
3. BÀI GIẢI :



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

void nhapmang(int a[100],int n)
{
for(int i=0;i<n;i++)
{
printf("a[%d]",i);
scanf("%d",&a[i]);
}
}

void xuatmang(int a[100],int n)
{
for(int i=0;i<n;i++)
printf("%3d",a[i]);
}


void search_am(int a[100],int n)
{
int max=0,vt;
for(int i=0;i<n;i++)
{
if(a[i]<0)
{
max=a[i];
break;
}
}
if(max==0)
printf(" Trong mang khong co so am ");
else
{
for(int j=vt+1;j<n;j++) //tim so Am lon nhat va vi tri
{
if(a[j]<0)
if(a[j]>max)
{
max=a[j];
vt=j+1;
}

}
printf(" \n So Am lon nhat trong mang la %d tai phan tu so %d" , max,vt);
}
}








void main()
{
clrscr();
int a[100],n;
printf(" Nhap so phan tu cua mang ");
scanf("%d",&n);
nhapmang(a,n);
xuatmang(a,n);
search_am(a,n);
getch();
}

HẾT

hailoc12
06-10-2006, 09:53 PM
BÀI 27

1. Ý TƯỞNG THUẬT TOÁN :
Ở bài này ta cần đếm số phần tử của một mảng con tăng bằng cách vừa xét vừa đếm sau đó lưu lại vị trí của phần tử bắt đầu xét và lưu lại vị trí của phần tử kết thúc mảng con tăng . Để thực hiện được như vậy ta cần có một biến lưu lại số phần tử của mảng con tăng sau đó nếu có mảng con tăng nào dài hơn nữa thì lưu lại những thông tin của mảng như đã nói ở trên .

2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
a. Trong hàm void xuatmang_tang(int a[100] , int n ) gồm có :
i. Biến vitri_1 : là biến để lưu lại vị trí của phần tử đầu tiên trong mảng con tăng dài nhất .
ii. Biến vitri_2 : là biến để lưu lại vị trí cuối cùng của mảng con tăng dài nhất .
iii. Biến s : là biến để lưu lại vị trí được tính từ phần tử đầu tiên a[0] đến phần tử kết thúc của mảng con tăng dài nhất
iv. Biến t : là biến đếm số phần tử trong mảng con tăng .
b. Trong hàm main() có :
i. a[100] : mảng tối đa là 100 phần tử
ii. n : là số phần tử trong mảng
3. BÀI GIẢI :



#include<stdio.h>
#include<conio.h>
/*-----------------------HAM NHAP MANG --------------------------*/

void nhapmang(int a[100],int n)
{
int i;
printf("Ban hay Nhap Mang vao :\n");
for(i=0;i<n;i++)
{
printf("a[%d] =",i);
scanf("%d",&a[i]);
}

}

void xuatmang(int a[100],int n)
{
int i;
for(i=0;i<n;i++)
printf("%4d",a[i]);
printf("\n\n");
}

void xuatmang_tang(int a[100],int n)
{
int vitri_1,vitri_2=0,t,s;
for(int i=0;i<n;i+=t+1)//Ham for xet nhay
{
t=0; //bat dau luon bang 0
for(int j=i;j<n-1;j++)
{
if(a[j]<=a[j+1])
t+=1; //dem mang con tang co bao nhieu pt
else
break; // Thoat khi khong tang nua
}
if(t>vitri_2)
{
vitri_1=i;//Tu pt bat dau xet
vitri_2=t; //pt ket thuc mang con tang
s=vitri_1+vitri_2;// s la bien tinh tu pt a[0] cho
} // den pt ket thuc mang con tang

}

printf("Mang con tang dai nhat la :");
for(int k=vitri_1;k<=s;k++)
printf("%4d",a[k]);

}

void main()
{
clrscr();
int a[100],n;
printf("Ban hay nhap so phan tu cua mang :");
scanf("%d",&n);

nhapmang(a,n);
xuatmang(a,n);
xuatmang_tang(a,n);

getch();
}




HẾT

hailoc12
06-10-2006, 09:55 PM
BÀI 28

1. Ý TƯỞNG THUẬT TOÁN :
a. Ta cũng cần có một hàm kiểm tra nguyên tố tương tự như các bài trước để xét từng phần tử . Nếu tại đó là số nguyên tố thì ta phải thực hiện hàm dời mảng đi một kí tự .
b. Sau khi dời ta gán tại vị trí ở phía sau phần tử đó là 5
c. Lưu ý cho vòng lặp cộng thêm 2 hi đã gán
2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
a. Trong bài có hàm void insert(int a[100] , int &n ) dùng để chèn thêm phần tử là 5 vào sau phần tử là số nguyên tố .
b. Trong hàm main() có :
i. a[100] : là mảng tối đa có 100 phần tử
ii. n : số phần tử của mảng
3. BÀI GIẢI :



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

void nhapmang(int a[100],int n)
{
for(int i=0;i<n;i++)
{
printf("a[%d]",i);
scanf("%d",&a[i]);
}
}

int ktnt(int x)
{
int dem=0;
for(int i=1;i<=x;i++)
{
if(x%i==0)
dem++;
}
if(dem==2)
return 1;
else
return 0;
}



void xuatmang(int a[100],int n)
{
for(int i=0;i<n;i++)
printf("%3d",a[i]);
}



void insert(int a[100],int &n)
{
int i=0;
while(i<n)
{
if(ktnt(a[i]))
{
for(int j=n;j>i+1;j--)
a[j]=a[j-1];
a[i+1]=5;
n+=1;
i+=2;
}
else
i++;
}

}

void main()
{
clrscr();
int a[100],n;
printf(" Nhap so phan tu cua mang ");
scanf("%d",&n);
nhapmang(a,n);
xuatmang(a,n);
insert(a,n);
printf("\n Mang sau khi chen voi dieu kien de bai la \n");
xuatmang(a,n);
getch();
}

HẾT

hailoc12
06-10-2006, 09:55 PM
BÀI 29

1. Ý TƯỞNG THUẬT TOÁN :
a. Ở bài này ta chỉ cần đếm số làn xuất hiện của số đầu tiên là bao nhiêu lần sau đó gán giả sử cho nó là lớn nhất ,rồi quét trên mảng nếu gặp phần tử nào xuất hiện nhiều hơn thì ta gán cho nó là lớn nhất .
b. Trước hết ta cần có một hàm đếm phần tử , sau đó là viết một hàm đếm kiểm soát , nếu gặp phần tử giống phần tử đã đếm rồi thì không đếm nữa ngược lại thì đếm và gán giả sử là lớn nhất như đã nói ở trên
2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
a. Trong bài có hàm int dempt( int x , int a[100] , int n ,int i ) : làm nhiệm vụ là đếm số lần xuất hiện của phần tử đó từ nó trở đi . vì các số trước nó đã xét và đếm nên không cần đếm lại .
b. Hàm void max_xuat( int a[100] , int n ) : làm nhiệm vụ xét và tìm ra phần tử xuất hiện nhiều nhất , trong hàm có các biến :
i. max : để chứa số lần xuất hiện của phần tử
ii. pt : là để lưu lại giá trị của phần tử xuất hiện nhiều nhất .
iii. Vòng lặp for thứ nhất : quét tất cả các phần tử từ phần tử đầu tiên cho đến phần tử cuối cùng .
iv. Vòng for thứ hai : ứng mỗi giá trị của phần tử tại vị trí i thì ta xét phần tử đó có giống một phần tử nào phía trúớc đó hay không nếu giống thì không đếm nữa thoát khỏi vòng lặp tăng giá trị i lên ngược lại thì đếm .
c. Hàm main() gồm các biến :
i. a[100] : mảng phần tử tối đa 100 kí tự
ii. n: số phần tử trong mảng .
3. BÀI GIẢI



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

void nhapmang(int a[100],int n)
{
for(int i=0;i<n;i++)
{
printf("a[%d]",i);
scanf("%d",&a[i]);
}
}

int ktnt(int x) // Kiem tra co phai la so ngto khong
{
int dem=0;
for(int i=1;i<=x;i++)
{
if(x%i==0)
dem++;
}
if(dem==2)
return 1; // dung tra ve 1
else
return 0; // sai tra ve 0
}

void xuatmang(int a[100],int n)
{
for(int i=0;i<n;i++)
printf("%3d",a[i]);
}

/* ----------------- Tim so nguyen to va xoa di --------------*/

void xoa_ngto(int a[100],int &n)
{
int i=0;
while(i<n)
{
if(ktnt(a[i]))
{
for(int j=i;j<n-1;j++)
a[j]=a[j+1];
n-=1; // Giam so pt sau khi xoa di
}
else
i++;
}

}

void main()
{
clrscr();
int a[100],n;
printf(" Nhap so phan tu cua mang ");
scanf("%d",&n);
nhapmang(a,n);
xuatmang(a,n);
xoa_ngto(a,n);
printf("\n Mang sau khi xoa voi dieu kien de bai la \n");
xuatmang(a,n);
getch();
}
HẾT

hailoc12
06-10-2006, 09:56 PM
BÀI 30

1. Ý TƯỞNG THUẬT TOÁN :
a. Ở bài này cũng tương tự như những bài trên ta cũng cần có một hàm kiểm tra số đó có phải là số nguyên tố hay không .
b. Nếu phải thì tại vị trí đó dời mảng trở về một phần tử .
2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
a. Hàm kiểm tra số nguyên tố tương tự như lời giải thích của những bài trên
b. Hàm void xoa_ngto( int a[100] , int &n ) : làm nhiệm vụ xóa các số nguyên tố có trong mảng
c. Hàm main() gồm các biến :
i. a[100]: mảng tối đa có 100 phần tử
ii. n : số phần tử của mảng
3. BÀI GIẢI :



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

void nhapmang(int a[100],int n)
{
for(int i=0;i<n;i++)
{
printf("a[%d]",i);
scanf("%d",&a[i]);
}
}

int ktnt(int x) // Kiem tra co phai la so ngto khong
{
int dem=0;
for(int i=1;i<=x;i++)
{
if(x%i==0)
dem++;
}
if(dem==2)
return 1; // dung tra ve 1
else
return 0; // sai tra ve 0
}



void xuatmang(int a[100],int n)
{
for(int i=0;i<n;i++)
printf("%3d",a[i]);
}

/* ----------------- Tim so nguyen to va xoa di --------------*/

void xoa_ngto(int a[100],int &n)
{
int i=0;
while(i<n)
{
if(ktnt(a[i]))
{
for(int j=i;j<n-1;j++)
a[j]=a[j+1];
n-=1; // Giam so pt sau khi xoa di
}
else
i++;
}

}




void main()
{
clrscr();
int a[100],n;
printf(" Nhap so phan tu cua mang ");
scanf("%d",&n);
nhapmang(a,n);
xuatmang(a,n);
xoa_ngto(a,n);
printf("\n Mang sau khi xoa voi dieu kien de bai la \n");
xuatmang(a,n);
getch();
}
HẾT

hailoc12
06-10-2006, 09:56 PM
BÀI 31

1. Ý TƯỞNG THUẬT TOÁN :
Ở bài này ta chỉ cần viết hàm sắp xếp các số dương bằng cách có hai vòng lặp
i. Vòng lặp thứ nhất : làm nhiệm vụ quét các phần tử từ phần tử đầu tiên cho đến phần tử kế cuối
ii. Vòng lặp thứ hai : ứng với các giá trị phần tử của vòng lặp thứ nhất vòng lặp thứ hai quét đến hết mảng sau đó làm nhiệm vụ hoán đổi nếu thỏa điều kiện .
2. Ý NGHÍA MỘT SỐ BIẾN TRONG BÀI :
a. Trong bài có :
i. a[100] : mảng tối đa 100 phần tử
ii. n : số phần tử trong mảng
3. BÀI GIẢI :



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

void nhapmang(int a[100],int n)
{
for(int i=0;i<n;i++)
{
printf("a[%d]",i);
scanf("%d",&a[i]);
}
}


void sapxep(int a[100],int n)
{
int tmp;
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
if(a[i]>=0)
{
if((a[i]>a[j])&&(a[j]>=0))
{
tmp=a[i];
a[i]=a[j];
a[j]=tmp;
}
}
else
break;
}
}
}

void xuatmang(int a[100],int n)
{
for(int i=0;i<n;i++)
printf("%3d",a[i]);
}

void main()
{
clrscr();
int a[100],n;
printf(" Nhap so phan tu cua mang ");
scanf("%d",&n);
nhapmang(a,n);
xuatmang(a,n);
sapxep(a,n);
printf("\n Mang sau khi sap xep tang dan cac so duong la \n\n");
xuatmang(a,n);
getch();
}


HẾT

hailoc12
06-10-2006, 09:57 PM
BÀI 32

1. Ý TƯỞNG THUẬT TOÁN :
a. Ở bài này ta nên ưu tiên lấy phần tử gần với x mà đứng trước x
b. Ta phải có một hàm làm nhiệm vụ tìm phần tử gần với x nhất .
2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
a. Ở hàm void search_pt(int a[50][50] , int n ,int m , int x ) gồm có :
i. min : là biến chứa hiệu của số x và phần tử a[0][0] .
ii. y : là biến chứa hiệu giữa x và a[i][j] .
iii. pt : là biến chứa giá trị của phần tử gần với x nhất .
b. Ở hàm main() :
i. a[50][50] : mảng có tối đa 50 dòng 50 cột
ii. n , m : là số dòng và số cột
iii. x : là biến được input .
3. BÀI GIẢI :



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

/*----------------Nhap Mang & Xuat Mang -----------------*/

void nhapmang(int a[50][50],int n,int m)
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
printf("a[%d][%d]",i,j);
scanf("%d",&a[i][j]);
}
}

void xuatmang(int a[50][50],int n,int m)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
printf("%3d",a[i][j]);
}
printf("\n");
}

}

void search_pt(int a[50][50],int n,int m,int x)//x la so nguoi dung nhap vao
{
int min,pt,y;
min=abs(x-a[0][0]); // gan hieu voi pt dau tien la nho nhat
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
y=abs(x-a[i][j]);
if(y<min)
{
min=y;
pt=a[i][j];
}
if((y==min)&&(a[i][j]<pt))// Lay so nho hon ma gan voi x
{
min=y;
pt=a[i][j];
}

}
printf("Phan Tu gan voi X nhat la %d ",pt);
}




void main()
{
clrscr();
int a[50][50],n,m,x;
printf("Nhap vao so dong ");
scanf("%d",&n);
printf("Nhap vao so cot ");
scanf("%d",&m);
printf("Nhap vao pt x ");
scanf("%d",&x);
nhapmang(a,n,m);
xuatmang(a,n,m);
search_pt(a,n,m,x);
getch();
}
HẾT

hailoc12
06-10-2006, 09:58 PM
BÀI 33 :

1. Ý TƯỞNG THUẬT TOÁN :
a. Ở bài này ta chỉ cần vẽ một ma trận vuông cấp 4 chẳng hạn sau đó quan sát các biến chạy thay đổi rồi tìm ra quy luật của nó .
b. Ví dụ muốn tính tổng các phần tử trên đường chéo chính chẳng hạn trong ma trận cấp 4 thì các phần tử ở các vị trí như sau ( 00 ,11 , 22 , 33 ) thì ta cho vòng lặp chạy từ 0 cho đến n-1 sau đó khai báo một biến cộng dồn lại các phần tử a[i][i] khi vòng lặp chạy .
2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
Trong bài chỉ có mảng a[50][50] : tối đa 50 dòng 50 cột , n : là cấp ma trận
3. BÀI GIẢI :



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

/*----------------Nhap Mang & Xuat Mang -----------------*/

void nhapmang(int a[50][50],int n)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
printf("a[%d][%d]",i,j);
scanf("%d",&a[i][j]);
}
}

void xuatmang(int a[50][50],int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
printf("%3d",a[i][j]);
}
printf("\n");
}

}






/*--Sau Day la cac ham tinh tong tren duoi duong cheo chinh (ca duong cheo)--*/

void tongtg_tren0(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+=a[i][j];
}
printf("Tong Tam Giac tren duong cheo chinh khong ke dcheo la %d \n",sum);

}

void tongtg_tren1(int a[50][50],int n)
{
int sum=0;
for(int i=0;i<n;i++)
for(int j=i;j<n;j++)
{
sum+=a[i][j];
}
printf("Tong Tam Giac tren duong cheo chinh ke ca dcheo la %d\n",sum);

}

void tongtg_duoi0(int a[50][50],int n)
{
int sum=0;
for(int i=1;i<n;i++)
for(int j=0;j<i;j++)
{
sum+=a[i][j];
}
printf("Tong Tam Giac duoi duong cheo chinh khong ke dcheo la %d\n",sum);

}

void tongtg_duoi1(int a[50][50],int n)
{
int sum=0;
for(int i=0;i<n;i++)
for(int j=0;j<=i;j++)
{
sum+=a[i][j];
}
printf("Tong Tam Giac duoi duong cheo chinh ke ca dcheo la %d\n",sum);

}




/*-----------------Thao tac tuong tu tren duong cheo phu -----------------*/

void tongtg_trenp0(int a[50][50],int n)
{
int sum=0;
for(int i=0;i<n-1;i++)
for(int j=0;j<=n-i-2;j++)
{
sum+=a[i][j];
}
printf("Tong Tam Giac tren duong cheo phu khong ke ca dcheo la %d\n",sum);

}

void tongtg_trenp1(int a[50][50],int n)
{
int sum=0;
for(int i=0;i<n;i++)
for(int j=0;j<=n-i-1;j++)
{
sum+=a[i][j];
}
printf("Tong Tam Giac tren duong cheo phu ke ca dcheo la %d\n",sum);

}


void tongtg_duoip0(int a[50][50],int n)
{
int sum=0;
for(int i=1;i<n;i++)
for(int j=n-i;j<n;j++)
{
sum+=a[i][j];
}
printf("Tong Tam Giac duoi duong cheo phu khong ke ca dcheo la %d\n",sum);

}


void tongtg_duoip1(int a[50][50],int n)
{
int sum=0;
for(int i=0;i<n;i++)
for(int j=n-i-1;j<n;j++)
{
sum+=a[i][j];
}
printf("Tong Tam Giac duoi duong cheo phu ke ca dcheo la %d\n",sum);

}


void main()
{
clrscr();
int a[50][50],n;
printf("Nhap Vao cap cua ma tran vuong");
scanf("%d",&n);
nhapmang(a,n);
xuatmang(a,n);// Xuat Mang Luc Dau

printf("Cac Thao Tac Tren Duong Cheo Chinh \n\n\n");
tongtg_tren0(a,n);
tongtg_tren1(a,n);
tongtg_duoi0(a,n);
tongtg_duoi1(a,n);
printf("\n\n");

printf(" Cac Thao Tac Tren Duong Cheo Phu \n\n\n");
tongtg_trenp0(a,n);
tongtg_trenp1(a,n);
tongtg_duoip0(a,n);
tongtg_duoip1(a,n);

getch();
}

HẾT

hailoc12
06-10-2006, 09:58 PM
BÀI 34

1. Ý TƯỞNG THUẬT TOÁN :
a. Trước hết ta phải xác định chuyển mảng sang mấy dòng mấy cột .
b. Sau đó mới gán tử mảng 1 chiều sang mảng 2 chiều .
2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
Trong bài chỉ có các biến :
i. a[100] : mảng 1 chiều có 100 phần tử
ii. c[100][100] : mảng 2 chiều có tối đa là 100 dòng và 100 cột
iii. x: là số phần tử trên mảng 1 chiều
iv. n , m : là các biến input chính là số dòng và số cột của ma trận
3. BÀI GIẢI :



#include<conio.h>
#include<stdio.h>
void nhap(int a[100],int n)
{ for(int i=0;i<n;i++)
{
printf("a[%d]=",i);
scanf("%d",&a[i]);
}
}

void xuat(int a[100],int n)
{
printf("ta co mang:\n");
for(int i=0;i<n;i++)
{
printf("%5d",a[i]);
}
printf("\n\n");
}


void doimang2(int c[100][100],int a[100],int n,int m)
{
int k=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
c[i][j]=a[k];
k++;
printf("%4d",c[i][j]);
}
printf("\n");
}
}


void main()
{
clrscr();
int n,a[100],b[100][100],c[100][100],x,m;
printf("nhap x la so phan tu cua mang 1 chieu:");
scanf("%d",&x);
printf("nhap dong:");
scanf("%d",&n);
printf("nhap cot:");
scanf("%d",&m);
nhap(a,x);
xuat(a,x);
doimang2(c,a,n,m);
getch();
}

HẾT

hailoc12
06-10-2006, 09:59 PM
BÀI 35

1. Ý TƯỞNG THUẬT TOÁN :
Trong bài này trước hết ta kiểm tra trên từng hàng của ma trận coi có số 0 hay không :
i. Có số 0 bẻ khỏi vòng for xét tiếp các điều kiện để gán dĩ nhiên là không thỏa .
ii. Nếu dòng đó không có số 0 thì gán cho ma trận b
2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
Trong bài có hàm :
i. Void tao_mtb( int a[50][50] ,int b[50][50] , int &l , int n ,int m , int &flag ) : làm nhiệm vụ tạo ra ma trận b trong hàm có :
1. p : là biến chạy dòng của ma trận b .
2. vòng for thứ nhất chạy trên dòng của ma trận a .
3. vòng for thứ hai ứng với vòng for thứ nhất để chạy trên từng cột của ma trận a
4. Nếu vòng for thứ hai chạy đến hết ( nghĩa là không có số 0 trên dòng hiện tại ) thì vòng for thứ ba sẽ gán ma dòng hiện tại vào ma trận b .
ii. Ở hàm main() có :
1. a[50][50] : là mảng có tối đa là 50 dòng và 50 cột .
2. n,m : là số dòng và số cột của ma trận a .
3. l : là số dòng của ma trận b
4. flag : là biến lá cờ để biết b có nhận được giá trị nào hay không nếu không thì không xuất ra ma trận b .
3. BÀI GIẢI



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

/*----------------Nhap Mang & Xuat Mang -----------------*/

void nhapmang_a(int a[50][50],int n,int m)
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
printf("a[%d][%d]",i,j);
scanf("%d",&a[i][j]);
}
}

void xuatmang_a(int a[50][50],int n,int m)
{
printf(" Ma Tran Luc Dau La \n");
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
printf("%3d",a[i][j]);
}
printf("\n");
}
printf("\n\n\n");

}

/*---------Khoi Tao mang b bang cach xoa cac dong chua so 0 o mang a di ---*/

void tao_mtb(int a[50][50],int b[50][50],int &l,int n,int m,int &flag)
{
int i,j,p=0;// bien flag muc dich de biet ma tran b co gia tri hay k
for(i=0;i<n;i++)
{
for(j=0;j<m;j++) // vong for kiem tra tren tung hang co so 0 hay khong
{
if(a[i][j]==0)// co thi dong ma tran b giam 1 va thoat
{
l-=1;
break;
} //Neu khong co j tang den m va thoat xuong cau if xet va
}
if(j==m) //Neu thoa thi gan cho b
{
flag=1;
for(int k=0;k<m;k++)
b[p][k]=a[i][k];
p++; // tam thoi la bien de tang chi so dong cua b khi gan
}
}

}

void xuatmang_b(int b[50][50],int l ,int m)// mang a va b deu co so cot bang nhau
{
printf(" Ma Tran Luc b sau La \n\n");
for(int i=0;i<l;i++)
{
for(int j=0;j<m;j++)
printf("%3d",b[i][j]);
printf("\n");
}

}


void main()
{
clrscr();
int a[50][50],b[50][50],n,l,m,flag=0; // l la so hang cua ma tran b
printf("Nhap so dong cua mang a ");
scanf("%d",&n);
printf("Nhap so cot cua mang a ");
scanf("%d",&m);
nhapmang_a(a,n,m);
xuatmang_a(a,n,m);
l=n; // gan bang so dong cua ma tran a
tao_mtb(a,b,l,n,m,flag);
if(flag)
xuatmang_b(b,l,m);
else
printf(" Ma Tran B khong co gia tri ");
getch();
}

HẾT

hailoc12
06-10-2006, 09:59 PM
BÀI 36

1. Ý TƯỞNG THUẬT TOÁN :
a. Ở bài này ta xét một phần tử rồi so sánh hết các phần tử trong mảng sau đó đổi chỗ , vấn đề ở chỗ là bạn phải xét phần tử như thế nào và quét theo tuần tự nào .
b. Bài này ta thực hiện bằng cách tạo ra hai vòng lặp *****g nhau sau đó quét từ phần tử đó cho hết mảng nhưng quét theo từng cột . Nhưng lưu ý là ví dụ như một ma trân 3 x 4 thì giả sử như hai vòng lặp trên xét tới phần tử 03 thì ta phải so sánh với phần tử thứ 01 trở đi ( 11 , 21 , 31 .. 02 , 12 , 22,32 ….) .
2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
Trong bài có hàm void sapxep(int a[50][50] , int n , int m )gồm có các biến như sau :
i. t : là biến định vị trí dòng để xét đến vị trí kế tiếp
ii. p : là biến chạy quét trên từng cột mà ứng một giá trị p sẽ chạy vòng lặp for k cho đến khi k = n-1 hóan đổi nếu thỏa và xét tiếp .
3. BÀI GIẢI :


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

/*----------------Nhap Mang & Xuat Mang -----------------*/

void nhapmang(int a[50][50],int n,int m)
{
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
printf("a[%d][%d]",i,j);
scanf("%d",&a[i][j]);
}
}
void xuatmang(int a[50][50],int n,int m)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
printf("%3d",a[i][j]);
}
printf("\n");
}

}
void sapxep(int a[50][50],int n,int m)
{
int tmp,t,p;
for(int j=0;j<m;j++)
for(int i=0;i<n;i++)
{
if(i==n-1)
{
t=-1; //muc dich de cho k luc dau la 0
p=j+1;//so sanh voi phan tu o cot tiep theo khi pt dang o cuoi cot nay
}
else
{
t=i;// k=phan tu ke tiep o dong duoi
p=j;// cung mot cot khi chua het dong
}
for(p;p<m;p++)
for(int k=t+1;k<n;k++)
{
if(a[i][j]>a[k][p])
{
tmp=a[i][j];
a[i][j]=a[k][p];
a[k][p]=tmp;
}
if(k==n-1)
{
t=-1;//Chuyen sang cot moi xet tu phan tu dau tien
break;
}
}
}
}
void main()
{
clrscr();
int a[50][50],n,m,x;
printf("Nhap vao so dong ");
scanf("%d",&n);
printf("Nhap vao so cot ");
scanf("%d",&m);
nhapmang(a,n,m);
xuatmang(a,n,m);
sapxep(a,n,m);
printf("\n\n Ma Tran sau khi sap xep la \n\n");
xuatmang(a,n,m);
getch();
}

HẾT

hailoc12
06-10-2006, 10:00 PM
BÀI 37

1. Ý TƯỞNG THUẬT TOÁN :
Ở bài này để viết các hàm :
i. Xóa đầu chuỗi : trước hết ta phải xác định là có khoảng trắng hay không và nếu có thì có mấy khoảng trắng để ta dời mảng kí tự về với số lần dời bằng số khoảng trắng . Sau đó gán tại vị trí n-1 – số khoảng trắng là kí tự ‘ \0 ‘ .
ii. Xóa giữa chuỗi : Nếu gặp hai khoảng trắng liền nhau thì ta xóa đi một khoảng trắng bằng cách là dời tại vị trí khoảng trắng đó về 1 kí tự .
iii. Xóa cuối chuỗi : N?u g?p kí t? tr?ng ? cu?i chu?i thì ta d?i kí t? ‘ \ 0 ‘ về 1 kí tự .
2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
N : là độ dài của chuỗi
3. BÀI GIẢI :



#include<conio.h>
#include<stdio.h>
#include<string.h>
void nhap(char *str)
{
gets(str);
}
void xuat(char *str)
{
puts(str);
}
void xoadauchuoi(char *&str,int &n)
{
int i=0,dem=0;
if(str[0]==' ')
{
while(str[i]==' ')
{
dem++;
i++;
}
for(int j=dem;j<n;j++)
{
str[j-dem]=str[j];
}
str[j-dem]='\0';
n-=dem;

}
else
return;
}
void xoagiuachuoi(char *&str,int &n )
{
for(int i=0;i<n;i++)
{
while((str[i]==' ')&&(str[i+1]==' '))
{
for (int j=i;j<n;j++)
{
str[j]=str[j+1];

}
n-=1;

}
}
}

void xoacuoichuoi(char *&str,int &n)
{
int i=n-1;
while(str[i]==' ')
{
str[i]='\0';
n-=1;//so phan tu cua chuoi giam di
i--;
}
}
void main()
{
clrscr();
char str[32768];
printf("Nhap chuoi ki tu ban dau \n " );
nhap(str);
int n=strlen(str);
printf("Chuoi ban dau co %d ki tu \n\n ",n);
xoadauchuoi(str,n);
xoagiuachuoi(str,n);
xoacuoichuoi(str,n);
printf("Chuoi sau khi thay doi la \n\n ");
xuat(str);
printf("Con lai %d ki tu " ,n);
getch();
}

HẾT

hailoc12
06-10-2006, 10:01 PM
Bài 38 :

1. Ý TƯỞNG THUẬT TOÁN :
Ở bài này trước hết ta phải xét xem chuỗi s1 có dài hơn chuỗi s2 không . sau đó khai báo một chuỗi tạm để cắt một chuỗi bằng độ dài của chuỗi s2 đem so sánh với chuỗi s2 .Nếu bằng thì đếm tăng lên 1 ngựợc lại xét từ phần tử tiếp theo lại cắt một chuỗi như vậy cho đến hết chuỗi s1 .
2. Ý NGHĨA MỘT SỐ BIẾN TRONG BÀI :
a. s1[100] , s2[100] , tmp[100] : lần lượt là chuỗi s1 ,s2 và chuỗi tạm .
b. m : là độ dài của chuỗi s1 .
c. n: là độ dài của chuỗi s2 .
d. trong hàm ganchuoi có các biến :
i. x : là biến chạy các phần tử của chuỗi tmp .
ii. i : là biến chuyển dịch chuỗi lên 1 kí tự .
iii. k : là biến lặp chạy vừa đủ độ dài của chuỗi s2 để đem so sánh .
iv. p : là biến trả về 0 nếu s2 và tmp bằng nhau .
3. BÀI GIẢI :



#include<stdio.h>
#include<conio.h>
#include<string.h>

void nhapchuoi1(char *s1)
{
printf("Nhap Vao Chuoi ki tu thu nhat :\n");
gets(s1);
}

void nhapchuoi2(char *s2)
{
printf("Nhap Vao Chuoi ki tu thu hai :\n ");
gets(s2);
}

void demchuoi(char *s1,char *s2,char *tmp,int n,int m,int &dem)
{
int x=0,i=0,p;
while(i<m)
{
for(int k=i;k<(i+n);k++)
{
tmp[x++]=s1[k];

}
tmp[x]='\0'; //gan ki tu het chuoi cho chuoi tmp de so sanh voi s2
p=strcmp(s2,tmp);
if(p==0)
dem++;
if((n==m)||(m-i<n)) //se ngung neu so ki tu con lai cua s1 nho hon s2
break; // khong the so sanh bang duoc
x=0;
i++;
}
}
void main()
{
clrscr();
char s1[100],s2[100],tmp[100];
int n,m,dem=0;
nhapchuoi1(s1);
m=strlen(s1); //Do dai cua chuoi s1
nhapchuoi2(s2);
n=strlen(s2); // Do dai cua chuoi s2
if(m>=n)
{
demchuoi(s1,s2,tmp,n,m,dem);
if(dem==0)
printf("Khong co chuoi s2 trong s1 ");
else
printf("So lan xuat hien cua chuoi s2 trong s1 la %d lan " ,dem);
}
else
printf("\nKhong co Chuoi s2 trong s1 ");
getch();
}

HẾT

hailoc12
06-10-2006, 10:05 PM
Rất cám ơn bạn trieuanhl đã đưa ra cách giải quyết cho bài này, tuy còn một số vấn đề về cách sử dụng hàm gets nhưng nhìn chung đã đi đúng hướng. Còn dưới đây mình xin post đáp án bài này theo đúng chương trình.
Bài 40



#include<string.h>
#include<conio.h>
#include<stdio.h>
//---------------------HAM NHAP CHUOI ---------------------------------------
void nhap(char *str)
{
printf("Nhap vao chuoi ki tu : \n");
gets(str);
}
//---------------------HAM XUAT CHUOI-------------------------------------------
void xuat(char *str)
{
textcolor(2);
cputs(str);
}
//--------------------HAM DOI THANH CHUOI HOA-------------------------------------
void doithanhhoa(char *str)
{
int n=strlen(str);
for(int i=0;i<n;i++)
{
if((str[i]>96)&&(str[i]<133)&&(str[i]!=' '))
str[i]=str[i]-32;
}
}

//---------------------CHUONG TRINH CHINH-----------------------------------
void main()
{
clrscr();
char str[1000];
nhap(str);
printf("Chuoi ki tu luc dau la : \n");
xuat(str);
doithanhhoa(str);
printf("\nChuoi ki tu luc sau la : \n");
xuat(str);
getch();

}

HẾT

hailoc12
06-10-2006, 10:06 PM
Bài 41


//DEM SO TU CUA CHUOI

#include<conio.h>
#include<stdio.h>
#include<string.h>
//---------------------NHAP CHUOI -------------------------------------------
void nhap(char *str)
{
gets(str);
}
//--------------------XUAT CHUOI----------------------------------------------
void xuat(char *str)
{
puts(str);
}
//---------------------DEM SO TU TRONG CHUOI ----------------------------------
int dem(char *str)
{
int dem;
if (str[0]==' ')
dem=0;
else
dem=1;
for (int i=0;i<strlen(str);i++)
if((str[i]==' ')&&(str[i+1]!=' '))
dem+=1;
return dem;
}





//--------------------CHUONG TRINH CHINH------------------------------------
void main()
{
clrscr();
char str[10000];
nhap(str);
xuat(str);
printf("\n");
printf(" so tu cua chuoi la %d",dem(str));
getch();
}

HẾT

hailoc12
06-10-2006, 10:08 PM
Bài 44 :


#include<stdio.h>
#include<conio.h>
#include<string.h>

struct sinhvien
{
int mssv,phai;
char hoten[30];
float dtb;
};

void nhap(sinhvien sv[30],int n)
{
float tmp;
for(int i=0;i<n;i++)
{
printf("\nNhap thong tin sinh vien thu %d ", i+1);
printf("\nMa so sinh vien ");
scanf("%d",&sv[i].mssv);
printf("Ho Ten Sinh vien ");
fflush(stdin);
gets(sv[i].hoten);
printf("Phai ");
scanf("%d",&sv[i].phai);
printf("Diem Trung Binh ");
scanf("%f",&tmp);
sv[i].dtb=tmp;

}
}

void sapxep(sinhvien sv[30],int n)
{
sinhvien tmp;
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
if(sv[i].mssv>sv[j].mssv)
{
tmp=sv[i];
sv[i]=sv[j];
sv[j]=tmp;
}

}
}
}

void xuat(sinhvien sv[30],int n)
{

printf("\n\nMaSo\t");
printf("Ho Ten \t\t\t");
printf("Phai \t");
printf("Diem TB\n\n");
for(int i=0;i<n;i++)
{
printf("%d\t",sv[i].mssv);
printf("%s",sv[i].hoten);
int z=strlen(sv[i].hoten);
for(int j=z;j<=24;j++)
printf(" ");
printf("%d",sv[i].phai);
printf("\t%.2f\n",sv[i].dtb);

}
}

void main()
{
clrscr();
sinhvien sv[30];
int n;
printf("\n\nNhap vao so sinh vien can nhap ");
scanf("%d",&n);
nhap(sv,n);
sapxep(sv,n);
xuat(sv,n);
getch();
}

HẾT

hailoc12
06-10-2006, 10:09 PM
Còn đây là đáp án, tất nhiên nó chỉ là tương đối thôi

Bài 42



#include<conio.h>
#include<stdio.h>
#include<math.h>
struct sophuc
{
float thuc;
float ao;
};
void nhap(sophuc &c)
{
printf("ban hay nhap vao phan thuc ");
scanf("%f",&c.thuc);
printf("ban hay nhap vao phan ao ");
scanf("%f",&c.ao);
}
void cong(sophuc a,sophuc b)
{
sophuc c;
c.thuc=a.thuc+b.thuc;
c.ao=a.ao+b.ao;
printf("\n\n\nTong hai so phuc %f",c.thuc);
if(c.ao<0)
printf("%.2fi",c.ao);
else
printf("+%.2fi",c.ao);
}
void tru(sophuc a,sophuc b)
{
sophuc c;
c.thuc=a.thuc-b.thuc;
c.ao=a.ao-b.ao;
printf("\nHieu hai so phuc %.2f",c.thuc);
if(c.ao<0)
printf("%.2fi",c.ao);
else
printf("+%.2fi",c.ao);

}
void nhan (sophuc a,sophuc b)
{
sophuc c;
c.thuc=a.thuc*b.thuc+a.ao*b.ao*(-1);
c.ao=a.thuc*b.ao+a.ao*b.thuc;
printf("\nTich cua hai so phuc %.2f",c.thuc);
if(c.ao<0)
printf("%.2fi",c.ao);
else
printf("+ %.2fi",c.ao);

}
void chia (sophuc a, sophuc b)
{
sophuc c;
float x;
x=pow(b.thuc,2)+pow(b.ao,2)*(-1); // Phan mau cua thuong hai so phuc
c.thuc=(a.thuc*b.thuc+a.ao*b.ao)/x; //Phan thuc tren tu chia cho mau
c.ao=(a.thuc*b.ao*(-1)+a.ao*b.thuc)/x;//phan ao tren tu chia cho mau
printf("\nThuong cua hai so phuc %.2f",c.thuc);
if(c.ao<0)
printf("%.2fi",c.ao);//Neu ao nho hon 0 thi in ra ao se co dau tru
else
printf("+ %.2fi",c.ao);//nguoc lai se in ra + phan ao

}
void main()
{
clrscr();
sophuc a,b;
textcolor(5-10);
cprintf("Ban hay nhap vao so phuc a");
printf("\n");
nhap(a);
cprintf("Ban hay nhap vao so phuc b");
printf("\n");
nhap(b);
cong(a,b);
printf("\n");
tru(a,b);
printf("\n");
nhan (a,b);
printf("\n");
if((b.ao!=0)||(b.thuc!=0))
chia(a,b);
else
{
textcolor(-9);
printf("\n\n");
cprintf("Khong thuc hien phep chia duoc ");
}
getch();
}

HẾT

hailoc12
06-10-2006, 10:09 PM
Đáp án đây:

Bài 43


#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
//-------------------KHAI BAO PHAN SO----------------------------------------
struct phanso
{
int tu;
int mau;
};
//-------------------NHAP PHAN TU--------------------------------------------
void nhap(phanso &n)
{
printf("ban hay nhap vao tu so");
scanf("%d",&n.tu);
printf ("ban hay nhap vao mau so");
scanf("%d",&n.mau);
}
int ucln(int a,int b)
{
while((a!=0)&&(b!=0))
{
if(a>=b)
a-=b;
else
b-=a;
}
if(a==0)
return b;
else
return a;

}




//-------------------CONG HAI PHAN SO----------------------------------------
phanso cong(phanso a, phanso b)
{
phanso c;
int x;
if(a.mau!=0&& b.mau!=0)
{
c.tu=a.tu*b.mau+a.mau*b.tu;
c.mau=a.mau*b.mau;
x=ucln(c.tu,c.mau);
c.tu/=x;
c.mau/=x;
return c;
}
else
exit(1);
}


//---------------------NHAN HAI PHAN SO---------------------------------------\
phanso nhan(phanso a,phanso b)
{
phanso c;
int x;
if(a.mau!=0&&b.mau!=0)
{
c.tu=a.tu*b.tu;
c.mau=a.mau*b.mau;
x=ucln(c.tu,c.mau);
c.tu/=x;
c.mau/=x;
return c;
}
else
exit(1);
}







//----------------------CHIA HAI PHAN SO---------------------------------------
phanso chia(phanso a,phanso b)
{
phanso c;
int x;
if(a.mau!=0&&b.mau!=0&&b.tu!=0)
{
c.tu=a.tu*b.mau;
c.mau=a.mau*b.tu;
x=ucln(c.tu,c.mau);
c.tu/=x;
c.mau/=x;
return c;
}
else
exit(1);
}
//----------------------TRU HAI PHAN SO----------------------------------------
phanso tru(phanso a,phanso b)
{
phanso c;
int x;
if(a.mau!=0&&b.mau!=0)
{
c.tu=a.tu*b.mau-b.tu*a.mau;
c.mau=a.mau*b.mau;
x=ucln(c.tu,c.mau);
c.tu/=x;
c.mau/=x;
return c;
}
else
exit(1);
}
//----------------------CHUONG TRINH CHINH------------------------------------

void main ()
{
clrscr();
phanso a;
phanso b;
textcolor(6-9);
cprintf("ban hay nhap vao phan so a");
printf("\n");
nhap(a);
cprintf ("ban hay nhap vao phan so b");
printf("\n");
nhap(b);
printf("tong hai phan so la %d/%d",cong(a,b));
printf("\n");
printf("hieu cua hai phan so %d/%d",tru(a,b));
printf("\n");
printf("tich cua hai phan so %d/%d",nhan(a,b));
printf("\n");
printf("thuong cua hai phan so %d/%d",chia(a,b));
getch();
}

HẾT

hailoc12
06-10-2006, 10:10 PM
Bài 45 :


#include<stdio.h>
#include<conio.h>
#include<string.h>

struct sinhvien
{
int mssv,phai;
char hoten[30];
float dtb;
};

void nhap(sinhvien sv[30],int n)
{
float tmp;
for(int i=0;i<n;i++)
{
printf("\nNhap thong tin sinh vien thu %d ", i+1);
printf("\nMa so sinh vien ");
scanf("%d",&sv[i].mssv);
printf("Ho Ten Sinh vien ");
fflush(stdin);
gets(sv[i].hoten);
printf("Phai ");
scanf("%d",&sv[i].phai);
printf("Diem Trung Binh ");
scanf("%f",&tmp);
sv[i].dtb=tmp;

}
}






void insert(sinhvien sv[30],int vt,int &n)
{
float tmp;
for(int i=n;i>vt;i--)
{
sv[i]=sv[i-1];
}
n+=1;
printf("\n Nhap vao thong tin cua sinh vien can chen ");
printf("\nMa so sinh vien ");
scanf("%d",&sv[vt].mssv);
printf("Ho Ten Sinh vien ");
fflush(stdin);
gets(sv[vt].hoten);
printf("Phai ");
scanf("%d",&sv[vt].phai);
printf("Diem Trung Binh ");
scanf("%f",&tmp);
sv[vt].dtb=tmp;




}

void timsv_ms(sinhvien sv[30] , int maso , int n)
{
for(int i=0;i<n;i++)
{
if(sv[i].mssv==maso)
{
printf("%d\t",sv[i].mssv);
printf("%s",sv[i].hoten);
int z=strlen(sv[i].hoten);
for(int j=z;j<=24;j++)
printf(" ");
printf("%d",sv[i].phai);
printf("\t%.2f\n",sv[i].dtb);
}

}
}

void xuat(sinhvien sv[30],int n)
{

printf("\n\nMaSo\t");
printf("Ho Ten \t\t\t");
printf("Phai \t");
printf("Diem TB\n\n");
for(int i=0;i<n;i++)
{
printf("%d\t",sv[i].mssv);
printf("%s",sv[i].hoten);
int z=strlen(sv[i].hoten);
for(int j=z;j<=24;j++)
printf(" ");
printf("%d",sv[i].phai);
printf("\t%.2f\n",sv[i].dtb);

}
}

void main()
{
clrscr();
sinhvien sv[30];
int n,vt,maso;
char flag;
printf("\n\nNhap vao so sinh vien can nhap ");
scanf("%d",&n);
nhap(sv,n);
do
{
printf("Ban can chen nhan phim so 1 \n");
printf("Ban can tim nhan so 2 \n");
printf("Ban Nhan phim so 0 de thoat ");
fflush(stdin);
scanf("%c",&flag);
if(flag=='1')
{
printf(" Ban can chen vao sinh vien o vi tri thu may ");
scanf("%d",&vt);
vt-=1; // Vi chay tu 0 nen phai tru di 1
insert(sv,vt,n);
}
if(flag=='2')
{
printf("Ban hay nhap ma so sinh vien can tim ");
scanf("%d",&maso);
timsv_ms(sv,maso,n);
}
if(flag=='0')
break;
}while((flag!='1')||(flag!='2'));



xuat(sv,n);
getch();
}

hailoc12
06-10-2006, 10:11 PM
Bài 46 :


#include<stdio.h>
#include<conio.h>
void docfile(char x[30],unsigned long &dodai)
{
char ch; // Bien dem ki tu
FILE *fp;
fp=fopen(x,"r");
if(fp==NULL)
("Khong The Mo Tap Tin ");
else
{
while((ch=getc(fp))!=EOF) //neu gap ki tu cuoi file thi ket thuc
{
putc(ch,stdout); //doc tung ki tu roi xuat ra man hinh
dodai++;

}

}
fclose(fp);
printf("\n\nDo dai cua File la %lu ",dodai);
}


void main()
{
clrscr();
unsigned long dodai=0;
char x[30]="bt46.txt";
docfile(x,dodai);
getch();
}

HẾT

hailoc12
06-10-2006, 10:12 PM
Bài 47


#include<stdio.h>
#include<conio.h>
#include<string.h>
struct date // khai bao bien cau truc ngay thang nam
{
int ngay,thang;
unsigned long nam;
};


struct nhanvien // dinh nghia kieu du lieu nhan vien bao gom
{
int msnv,phai;
char hoten[30];
char diachi[100];
char phone[10];
float luong;
date ngaybd,birthday;
};

/*----------------------HAM nhap nhan vien ------------------------*/

void nhap(nhanvien nv[30],int n)
{

float tmp;
for(int i=0;i<n;i++)
{
printf("\nNhap thong tin Nhan vien thu %d :", i+1);
printf("\n Ma so Nhan vien : ");
scanf("%d",&nv[i].msnv);
printf("Ho Ten Nhan vien :");
fflush(stdin);
gets(nv[i].hoten);
printf("Phai (1/0): ");
scanf("%d",&nv[i].phai);
printf("nhap vao ngay - thang - nam sinh :");
scanf("%d",&nv[i].birthday.ngay);
scanf("%d",&nv[i].birthday.thang);
scanf("%lu",&nv[i].birthday.nam);
printf("Dia chi cua Nhan vien thu %d :",i+1);
fflush(stdin);
gets(nv[i].diachi);
printf("So Dien Thoai lien lac :");
fflush(stdin);
gets(nv[i].phone);
printf("Ngay bat dau lam bao gom ngay - thang - nam :");
scanf("%d",&nv[i].ngaybd.ngay);
scanf("%d",&nv[i].ngaybd.thang);
scanf("%lu",&nv[i].ngaybd.nam);
printf("Nhap vao tien luong : ");
scanf("%f",&tmp);
nv[i].luong=tmp; //gan mot bien tmp

}
}

/*--------------------HAM luu len file ----------------------*/

void savefile(nhanvien nv[50],int n,char x[30])
{
float tmp;
float max_luong(nhanvien nv[50],int n); //khai bao cac prototype cho ham
float min_luong(nhanvien nv[50],int n);
float average_luong(nhanvien nv[50],int n);
FILE *fp;
fp=fopen(x,"wt");

// xuat ra cac de muc khi ghi len file

fprintf(fp," MSNV\t");
fprintf(fp," Ho Ten\t\t\t");
fprintf(fp," Phai \t");
fprintf(fp," Ngay sinh \t\t");
fprintf(fp," Dia chi \t\t");
fprintf(fp," Dien thoai \t");
fprintf(fp," Ngay lam viec \t");
fprintf(fp," Luong \n\n");

// ghi lan luot tung nhan vien

for(int i=0;i<n;i++)
{
fprintf(fp,"%d\t",nv[i].msnv);
fputs(nv[i].hoten,fp);
int z=strlen(nv[i].hoten);
for(int j=z;j<=25;j++) //xuat ra khoang trang de canh trai thang hang
fprintf(fp," ");

fprintf(fp,"%d\t",nv[i].phai);
fprintf(fp,"%d/%d/%lu\t",nv[i].birthday.ngay,nv[i].birthday.thang,nv[i].birthday.nam);
fputs(nv[i].diachi,fp);
z=strlen(nv[i].diachi);

for(int k=z;k<=35;k++)// tuong tu vong for tren
fprintf(fp," ");

fputs(nv[i].phone,fp);
fprintf(fp,"\t");
fprintf(fp,"%d/%d/%lu\t",nv[i].ngaybd.ngay,nv[i].ngaybd.thang,nv[i].ngaybd.nam);
tmp=nv[i].luong;
fprintf(fp,"%.2f",tmp);

fprintf(fp,"\n\n\n");

}

fprintf(fp," - Luong thap nhat cua cong ty la : %.2f \n",min_luong(nv,n));
fprintf(fp," - Luong cao nhat cua cong ty la : %.2f\n ",max_luong(nv,n));
fprintf(fp," - Luong trung binh cua cong ty la : %.2f \n",average_luong(nv,n));
fclose(fp);
}

/*---------------------HAM in mot nhan vien ------------------------*/

void IN_list(nhanvien nv[50],int i)
{
float tmp;
printf("%d\t",nv[i].msnv);
puts(nv[i].hoten);
int z=strlen(nv[i].hoten);
for(int j=z;j<=25;j++) //xuat ra khoang trang de canh trai thang hang
printf(" ");
printf("%d\t",nv[i].phai);
printf("%d/%d/%lu\t",nv[i].birthday.ngay,nv[i].birthday.thang,nv[i].birthday.nam);
puts(nv[i].diachi);
z=strlen(nv[i].diachi);
for(int k=z;k<=35;k++)
printf(" ");
puts(nv[i].phone);
printf("\t");
printf("%d/%d/%lu\t",nv[i].ngaybd.ngay,nv[i].ngaybd.thang,nv[i].ngaybd.nam);
tmp=nv[i].luong;
printf("%.2f",tmp);
printf("\n");


}

/*-------------------------Ham sua thong tin nhan vien ---------------*/

void repair(nhanvien nv[50],int stt)
{
float tmp;
printf("\nBan Can sua Thong Tin cua Nhan Vien Thu %d ",stt);
printf("\nMa so Nhan vien ");
scanf("%d",&nv[stt-1].msnv);
printf("Ho Ten Nhan vien ");
fflush(stdin);
gets(nv[stt-1].hoten);
printf("Phai ");
scanf("%d",&nv[stt-1].phai);
printf("nhap vao ngay thang nam sinh ");
scanf("%d",&nv[stt-1].birthday.ngay);
scanf("%d",&nv[stt-1].birthday.thang);
scanf("%lu",&nv[stt-1].birthday.nam);
printf("Dia chi cua Nhan vien thu %d",stt);
fflush(stdin);
gets(nv[stt-1].diachi);
printf("So Dien Thoai lien lac :");
fflush(stdin);
gets(nv[stt-1].phone);
printf("Ngay bat dau lam bao gom ngay thang nam ");
scanf("%d",&nv[stt-1].ngaybd.ngay);
scanf("%d",&nv[stt-1].ngaybd.thang);
scanf("%lu",&nv[stt-1].ngaybd.nam);
printf("Nhap vao tien luong ");
scanf("%f",&tmp);
nv[stt-1].luong=tmp;


}

/*---------------Tim luong thap nhat -----------------------------*/

float min_luong(nhanvien nv[50],int n)
{
float min=nv[0].luong;
for(int i=1;i<n;i++)
{
if(nv[i].luong<min)
min=nv[i].luong;

}
return min;
}
/*---------------Tim luong trung binh -----------------------------*/

float average_luong(nhanvien nv[50],int n)
{
float luongtb,sum;
for(int i=0;i<n;i++)
{
sum+=nv[i].luong;
}
luongtb=sum/n;
return luongtb;
}

/*---------------In ra danh sach nhan vien cua cong ty---------------*/
void In_danhsach(nhanvien nv[50],int n)
{
printf("\n\nDANH SACH NHAN VIEN CONG TY LA : \n");
for(int i=0;i<n;i++)
{
IN_list(nv,i); //Goi ham in mot nhan vien
}
printf("\nNhan ENTER de coi nhan vien co luong cao nhat ");
}

/*-----------------Tim luong lon nhat va in ra nhan vien do --------*/


float max_luong(nhanvien nv[50],int n)
{
float luongmax;
luongmax=nv[0].luong;
for(int i=1;i<n;i++)
{
if(nv[i].luong>luongmax)
luongmax=nv[i].luong;
}
return luongmax;

}

void in_list_max(nhanvien nv[50],int n)
{
getch();
printf("\n\n-----------------------------------------------------------\n\n");
printf("\n\n Nhan vien co luong cao nhat la : \n");
float x=max_luong(nv,n);
for(int i=0;i<n;i++)
{
if(nv[i].luong==x)
IN_list(nv,i);
}
}



void main()
{
clrscr();
nhanvien nv[50];
char x[30]="bt47.txt",ch;
int n,stt;
printf("nhap so luong nhan vien cong ty ");
scanf("%d",&n);
nhap(nv,n);
while(1) // sua va luu file cho den khi nao bam so phim so 0
{
savefile(nv,n,x);
printf("Ban can sua thong tin k - Nhan phim so 0 de thoat Nhan phim bat ki de tiep tuc \n");
ch=getch();
if(ch=='0')
break;

printf("\nBan can sua thong tin cua nhan vien thu may");
scanf("%d",&stt);
repair(nv,stt);
}
printf("\n Luong thap nhat cua co quan la %.2f ",min_luong(nv,n));
printf("\n Luong trung binh la %.2f:",average_luong(nv,n));
In_danhsach(nv,n);
in_list_max(nv,n);


getch();


}

hailoc12
06-10-2006, 10:12 PM
Bài 48 :


#include<conio.h>
#include<stdio.h>
#include<string.h>

/*-------------Ham dem so lan xuat hien cua mot ki tu -----------*/


int dem_sotu(char str[255],char n)
{
int dem=0,x= strlen(str);
for (int i=0;i<x;i++)
{
if (str[i]==n)
dem++;
}
return dem;
}

/*----------------Dem so lan xuat hien cua mot ki tu trong file -----------*/

long count_tu(char s[50],char n)
{
FILE *p=fopen(s,"rt");//mo file dang text de doc
long dem=0;
char str[255]; // Mang ki tu str de luu dong van ban vua doc duoc
char *x = fgets(str,255,p); // vua doc vua kiem tra
while(x!=NULL)
{
dem+=dem_sotu(str,n);
x=fgets(str,255,p);
}
fclose(p);
return dem;
}

void main()
{
clrscr();
char s[50]="bt48.txt";
char c;
printf(" Nhap vao ki tu can dem :");
scanf("%c",&c);
printf(" Ki tu xuat hien trong file %ld lan",count_tu(s,c));

getch();
}

hailoc12
06-10-2006, 10:13 PM
Bài 49 :


#include<conio.h>
#include<stdio.h>
#include<string.h>

/*-----------Ham dem so tu tren mot chuoi cho truoc ------*/

int count_sotu(char *str)//con tro *str cho den dia chi str
{
int dem;
int x = strlen(str);
if (str[0]==' ')
dem =0;
else
dem=1;
for (int i=0;i<x;i++)
{
if (str[i]==' '&&str[i+1]!=' ')
dem+=1;
}
if (str[x-2]==' ') //Tru truong hop truoc ki tu '\n' la khoang trang
dem-=1;
return dem;
}
/* -----------------Dem so tu trong file -------------------*/

long count_tu(char s[50])
{
long dem=0;
FILE *fp=fopen(s,"rt"); // Mo file de doc
char str[255];
char *x = fgets(str,255,fp);

while(x!= NULL)
{
dem+=count_sotu(str);
x=fgets(str,255,fp);
}
fclose(fp);
return dem;
}

/*-----------Ham chinh ----------------------*/


void main()
{
clrscr();
char s[50]="bt49.txt";
printf(" Trong file co %ld tu",count_tu(s));
getch();
}

hailoc12
06-10-2006, 10:13 PM
Bài 50 ;


#include<conio.h>
#include<stdio.h>
#include<string.h>
void ghi(char s[50],char s1[50],char s2[50])
{
FILE *fp=fopen(s1,"rt");
FILE *fq=fopen(s2,"rt");
FILE *fk=fopen(s,"a+t");
char c[255];
int n;
// char *x=fgets(c,255,p);
/* while(x!=NULL)
{
fputs(c,q);
x=fgets(c,255,fp);
} */
char ch; int dem=1;
while((ch=getc(fp))!=EOF) //neu gap ki tu cuoi file thi ket thuc
{
fprintf(fk,"%c",ch);
}
fclose(fp);

while((ch=getc(fq))!=EOF)
{
if(dem==1)
{
if(ch>65&&ch<97)
{ fprintf(fk,"\n");
fprintf(fk,"%c",ch);
dem++;
}
else
fprintf(fk,"%c",ch);
dem++;
}
else
fprintf(fk,"%c",ch);
dem++;
}
fclose(fq);

fclose(fk);


}
void main()
{
clrscr();
char s1[50]="bt50a.txt";
char s2[50]="bt50b.txt";
char s[50]="filenoi.txt";
ghi(s,s1,s2);
getch();
}

hailoc12
01-10-2007, 01:42 PM
BÀI TẬP

Giải và biện luận phương trình bâc hai. (Phuong trinh bac 2)
Nhập vào một ngày tháng năm. Cho biết ngày đó là ngày thứ mấy. (Lay thu cua ngay thang)
Nhập vào số ngày. Cho biếy ngày đó là ngày tháng năm. (Ngay thu may trong nam)
Viết chương trình kiểm tra xem ngày đó có hợp lệ hay không? (Ngay co hop lehay khong)
Viết một chương trình có menu đơn giản(Ve menu don gian) Ø Vẽ hình chữ nhật
Ø Vẽ hình vuông
Ø Thóat
Ø In ra hình tương ứng sau khi tiếp nhậyn các giá trị cho biết kích thước , theo yêu cầu của tượng hình . Dùng kí hiệu dấ hoa thi * để vẽ hình.

Viết chương trình phân tích một số ra thừa số nguyên tố .(Phan tich ra thua so nguyen to)
Viết chương trình cho biết số nhập vào có phải là số chính phương .(Kiem tra so chinh phuong)
Viết chương trình kiểm tra số đó có phải là số nguyên tố hay không?(Kiem tra so nguyen to)
Tìm lại bội số chung nhỏ nhất và ước số chung lớn nhất của hai số nhâp vào.
Viết chương trình in ra như sau:(với chiều cao của các tam giác xuất ra do ngườinhập sẽ nhập vào) * * * * * * * * * *
* * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * *

Viết chương trình sử dụng vòng lặp để in ra bảng cửu chương từ 2 đến 9 theo hàng ngang.
Viết chương trình mô phong cách nhấn tay hai số tự nhiên bất kì.
Viết chương trình tính s= 1+ 2 +…+n .
Viết chương trình tính s= 1* 2 *…*n .
Viết một chương trình kiểm tra xem một ngày nào đó có hợp lệ hay không?
Viết hàm tính căn bậc 2 của mốt số .
Viết hàm đảo ngược vị trí các phần tử trong mảng một chiều.
Viết hàm nhập vào một mảng a có n số nguyên to.
Viết hàm nhập mảng a gồm n phân tử sao cho các số chẳn và lẻ xen kẽ nhau.
Viết hàm nhập vào một ma trận xuất ra ma trận chuyển vị.
Viết hàm nhập vào một ma trận theo dạng xoắn ốc .
Viết hàm xắp xếp mảng a tăng dần .
Viết hàm tìm phân tử có số nguyên tố lớn nhất .
Nhập vào một ma trận , tìm tổng của từng dòng và xắp xếp các dòng tăng dần theo cái tổng đó.
Viết hàm tìm ma trận là tích của hai ma trận .
Viết hàm tìm số âm lớn nhất trong mảng.
Viết hàm tìm dãy con tăng dài nhất trong mảng .
Viết hàm chen phần tử có giá trị 5 vào trong mảng sau các vi trí mà giá trị tại đó là số nguyên tố.
Viết hàm in ra màn hình phân tử xuất hiện nhiều nhật trong mảng .
Viết hàm sóa tất cả các số nguyên tố trong mảng a .
Viết hàm sắp thứ tự tăng các số dương và giữ cố định các số còn lại .
Tìm phấn tử trong ma trận gần tới x nhất .
Viết hàm tính tổng tam giác trên , tổng tam giác dưới.
Viết hàm chuyển mảng 1 chiều b sang ma trận a (n*m) theo dòng .
Viết hàm tạo ma trận b từ ma tr65n a bằng cách sóa các dòng có chứa số 0 của mảng a .
Viết hàm sắp xếp mảng a 2 chiều theo từng cột .
Viết hàm xóacác khỏang trắng ờ đầu chuỗi , cuối và giữa chuỗi .
Viết hàm tìm số lần xuất hiện của chuỗi s2 trong chuỗi s1 .
Viết hàm đổi chuỗi ra thành chuỡi thường .
Viết hàm đổi chuỗi ra thành chuỗi hoa .
Viết hàm đếm số từ trong chuỗi .
Viết hàm thực hiện phép cộng trừ nhân chia 2 số phức .
Viết hàm thực hiện phép cộng trừ nhân chia 2 phân số .
Viết chương trình nhập vào 50 sinh viên với mỗi sinh viên gồm các thônh tin sau: mã sinh viên , họ tên , phái , điểm trung bình . Sau đó xuất ra màn hình mỗi sinh viên là một dòng theo thứ tự tăng dần của mã số sinh viên .
Viết hàm thêm vào một sinh viên . Tìm một sinh viên theo mã số .
Viết hàm tìm độ dài của file .
Viết chương trình nhập dữ liệu các nhận viên của một cơ quan và lưu vào file . Sau đó thực hiện các công việc sau : nhập vào một số thứ tự , sửa dữ liệu của nhân viên này vào file viết các hàm thực hiện các công việc sau :
Tìm lương thấp nhất của cơ quan
Tìm lương trung bình của cơ quan
In ra danh sách nhân viên
In ra những người có lương cao nhất
In ra những người có lương thấp nhất
Viết hàm tính số lần xuất hiện của 1 kí tự chữ cái trong tập tin văn bản .
Viết hàm tính số từ có trong tập tin
Viết hàm nối hai tập tin văn bản với nhau thành một tập tin

soithuytinh
13-11-2007, 06:58 PM
trời đất Đề Bài lại post tận cuối cùng làm mình vừa đọc vừa đoán đề bài. bạn hailoc12 và các bạn khác post bài nào ghi rõ đề chứ >_<.

tks các bạn các bài tập cơ bản rất có ích cho người mới học .... như mình.

nguyendinhan
01-01-2008, 01:38 AM
tui có code kiểm tra SNT cũng được các bạn xem thử nha

int SNT(int n)
{

int dem=0,i=1;
while(i<=n)
{
if(n%i==0)
dem++;
i++;
}
return (dem==2);
}

mình cũng có 1 bài chuỗi này các bạn tham khảo nha

void demso(char *s,char *tam,char *p)
{
int dem,j,n=strlen(s),k=0,max=-MAXINT;
*tam='\0';
*p=NULL;
for(int i=0;i<=n-1;i=i+dem+1)//dem la dem tung so
{
dem=0;
if(s[i]!=32&&s[i]!='0')
{
dem++;
for( j=i+1;s[j]!=32&&s[j]!='0'&&j<n;j++)
{
dem++;

}
if(dem!=0)
{
strncat(tam,s+i,dem);
strncpy(p,s+i,dem);
p[dem]='\0';//xoa vung dem
if(max<atoi(p))//ham atoi doi sang kieu int
max=atoi(p);
strcat(tam,";");
k++;//dem 1 so
}

}

for(int l=j+1;s[l]=='0';l++)//khong dem ky tu 0
dem++;
}
printf("\nki tu %s co %d ky tu trong chuoi",tam,k);
printf("\nphan tu lon nhat la:%d",max);
}

còn 1 bài về chuỗi cũng hay lém

int tuanhoan1(char *s,char *s1)
{

*s1=NULL;
int i=1,l=strlen(s),t;
while(i<=l/2)
{

strncpy(s1,s,i);
s1[i]='\0';
t=i;
//for(;strncmp(s1,s+t,i)==0&&t<l;t=t+i);
while(strncmp(s1,s+t,i)==0)
{
t=t+i;
}
if(t>=l)
return 1;
i++;
}
return 0;

}

Lưu ý:
- Đọc nội quy trước khi gửi bài viết.
- Để code trong cặp tag code.
- Không gửi liên tiếp, liền nhau quá nhiều bài viết.
(Nhắc nhở bởi Dr)

nguyendinhan
01-01-2008, 01:47 AM
và 1 bài về ma trận cũng được nè:tăng dần theo đường xoắc ốc


void saptang(int b[],int n)
{
for(int i=0;i<n-1;i++)
for(int j=i+1;j<n;j++)
if(b[i]>b[j])
{
int tam=b[i];
b[i]=b[j];
b[j]=tam;
}
}
void tangdanxoanoc(int a[][100],int c)
{
int b[1000],k=0;
int i,trai=0,phai=c-1,tren=0,duoi=c-1;
while(trai<=phai&&tren<=duoi)
{
for(i=trai;i<=phai;i++)
b[k++]=a[tren][i];
for(i=tren+1;i<=duoi;i++)
b[k++]=a[i][phai];
for(i=phai-1;i>=trai;i--)
b[k++]=a[duoi][i];
for(i=duoi-1;i>=tren+1;i--)
b[k++]=a[i][trai];
trai++,phai--,tren++,duoi--;
}
saptang(b,k);
k=0;
i,trai=0,phai=c-1,tren=0,duoi=c-1;
while(trai<=phai&&tren<=duoi)
{
for(i=trai;i<=phai;i++)
a[tren][i]=b[k++];
for(i=tren+1;i<=duoi;i++)
a[i][phai]=b[k++];
for(i=phai-1;i>=trai;i--)
a[duoi][i]=b[k++];
for(i=duoi-1;i>=tren+1;i--)
a[i][trai]=b[k++];
trai++,phai--,tren++,duoi--;
}
}

nguyendinhan
01-01-2008, 01:48 AM
và những bài tui mới làm về ma trận nè


#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
void nhap(int a[][100],int &d,int &c)
{
printf("\nnhap dong:");
scanf("%d",&d);
printf("\nnhap cot:");
scanf("%d",&c);
for(int i=0;i<d;i++)
for(int j=0;j<c;j++)
{
printf("a[%d][%d]",i,j);
scanf("%d",&a[i][j]);
}
}
void xuat(int a[][100],int d,int c)
{
for(int i=0;i<d;i++)
{
for(int j=0;j<c;j++)
printf("%5d",a[i][j]);
printf("\n");
}
}
void hoanvi(int a[][100],int c,int k,int l)
{
for(int i=0;i<c;i++)
{
int tam=a[k][i];
a[k][i]=a[l][i];
a[l][i]=tam;
}
}
void hv(int &a,int &b)
{
int tam=a;a=b;b=tam;
}
int tong1dong(int a[][100],int c,int k)
{
int tong=0;
for(int i=0;i<c;i++)
tong=tong+a[k][i];
return tong;
}
void tongcacdong(int a[][100],int d,int c)
{
int kq;
for(int i=0;i<d;i++)
{
kq=tong1dong(a,c,i);
printf("\ndong thu %d co tong la:%5d",i,kq);
}

}
void donggiam(int a[][100],int d,int c)
{
for(int i=0;i<d-1;i++)
for(int j=i+1;j<d;j++)
if(tong1dong(a,c,i)>tong1dong(a,c,j))
hoanvi(a,d,i,j);

}
void sapxepzizac(int a[][100],int d,int c)
{
float b[1000];
int k=0,i,j;
for(i=0;i<d;i++)
for(int j=0;j<c;j++)
{
b[k]=a[i][j];
k++;
}
for( i=0;i<k-1;i++)
for( j=i+1;j<k;j++)
if(b[i]>b[j])
{
float tam=b[i];
b[i]=b[j];
b[j]=tam;
}
k=0;
for(i=0;i<d;i++)
if(i%2==0)
{

for(j=0;j<c;j++)
{
a[i][j]=b[k];
k++;
}
}
else
{
for(j=c-1;j>=0;j--)
{
a[i][j]=b[k];
k++;
}
}

}
void xoacheochinh(int a[][100],int d,int &c)
{
for(int i=0;i<d;i++)
for(int j=i+1;j<c;j++)
a[i][j-1]=a[i][j];
c--;

}
void xoacheophu(int a[][100],int d,int &c)
{
for(int j=c-1;j>-1;j--)
{
for(int i=d-j;i<d;i++)
a[i][j-i]=a[i][j];
}
c--;
}
int demamcheophu(int a[][100],int d,int c)
{
int dem=0;
for(int i=0,j=c-1;i<d;i++,j--)
if(a[i][j]<0)
dem++;
return dem;
}
int tongcheophu(int a[][100],int d,int c)
{
int s=0;
for(int i=0,j=c-1;i<d;i++,j--)
s=s+a[i][j];
return s;
}
int tongcheochinh(int a[][100],int c)
{
int s=0;
for(int i=0;i<c;i++)
s=s+a[i][i];
return s;
}
void xuat(int b[],int k)
{
for(int i=0;i<k;i++)
printf("%5d",b[i]);
}
void amtangduonggiam(int a[][100],int d,int c)
{
int i,j,k=0,b[1000];
for(i=0;i<d;i++)
for(j=0;j<c;j++)
{
b[k++]=a[i][j];
}
for(i=0;i<k-1;i++)
for(j=i+1;j<k;j++)
if(b[i]>0&&b[j]<0||b[i]<0&&b[j]<0&&b[i]>b[j]||b[i]>0&&b[j]>0&&b[i]<b[j])
hv(b[i],b[j]);
printf("\nam tang duong giam\n");
xuat(b,k);
}
void hvdong(int a[][100],int k,int c)
{
for(int i=0;i<c-1;i++)
for(int j=i+1;j<c;j++)
if(a[k][i]%2==0&&a[k][j]%2==0&&a[k][i]>a[k][j]||a[k][i]%2!=0&&a[k][j]%2!=0&&a[k][i]>a[k][j])
{
int tam=a[k][i];
a[k][i]=a[k][j];
a[k][j]=tam;
}
}
void chantanglegiam(int a[][100],int d,int c)
{
for(int k=0;k<d;k++)
{
for(int i=0;i<c-1;i++)
for(int j=i+1;j<c;j++)
if(a[k][i]%2==0&&a[k][j]%2==0&&a[k][i]>a[k][j]||a[k][i]%2!=0&&a[k][j]%2!=0&&a[k][i]<a[k][j])
{
int tam=a[k][i];
a[k][i]=a[k][j];
a[k][j]=tam;
}
}
}
void cotchangiamletang(int a[][100],int d,int c)
{
for(int l=0;l<c;l++)
{
for(int i=0;i<d-1;i++)
for(int j=i+1;j<d;j++)
if(a[i][l]%2==0&&a[j][l]%2==0&&a[i][l]<a[j][l]||a[i][l]%2!=0&&a[j][l]%2!=0&&a[i][l]>a[j][l])
{
int tam=a[i][l];
a[i][l]=a[j][l];
a[j][l]=tam;
}
}
}
int demcucdai(int a[][100],int d,int c)
{
int dem=0;
for(int k=0;k<d;k++)
{
for(int i=1;i<c-1;i++)
if(a[k][i]>a[k][i+1]&&a[k][i]>a[k][i-1])
dem++;
}
return dem;
}
int tongcucdai(int a[][100],int d,int c)
{
int s=0,s1=0,s2=0;
for(int h=0;h<d;h++)
{
for(int i=1;i<c-1;i++)
if(a[h][i]>a[h][i+1]&&a[h][i]>a[h][i-1])
s1=s1+a[h][i];
}
for(int k=0;k<c;k++)
{
for(int j=1;j<d-1;j++)
if(a[j][k]>a[j+1][k]&&a[j][k]>a[j-1][k])
s2=s2+a[j][k];
}
s=s1+s2;
return s;
}
int hoitucacdong(int a[][100],int d,int c)
{
for(int k=0;k<d;k++)
{
for(int i=0;i<c-2;i++)
if(abs(a[k][i])-abs(a[k][i+1])<abs(a[k][i])-abs(a[k][i+2]))
return 0;
}
return 1;
}
void main()
{
clrscr();
int a[100][100],d,c,k;
int b[1000];
nhap(a,d,c);
xuat(a,d,c);
//printf("\nnhap k:");
//scanf("%d",&k);
/*tongcacdong(a,d,c);
donggiam(a,d,c);
printf("\nma tran sau khi hoan vi:\n");
xuat(a,d,c);
xoacheochinh(a,d,c);
printf("\nma tran sau khi xoa\n");
xuat(a,d,c);
sapxepzizac(a,d,c);
printf("\nma tran sau khi sap xep:\n");
xuat(a,d,c);*/
//int kq=tongcheophu(a,d,c);
//printf("\nket qua:%5d",kq);
//xoacheophu(a,d,c);
//printf("\nma tran sau khi xoa cheo phu\n");
//xuat(a,d,c);
/*int kq=demamcheophu(a,d,c);
printf("\ncac so am trong ma tran:%5d",kq);
amtangduonggiam(a,d,c);
//hvdong(a,k,c);
//printf("\ndong k sau khi hv\n");
//xuat(a,d,c);
chantanglegiam(a,d,c);
printf("\ndong chan tang le giam\n");
xuat(a,d,c);
cotchangiamletang(a,d,c);
printf("\ncot chan giam le tang\n");
xuat(a,d,c);*/
int dem=demcucdai(a,d,c);
printf("\ncac phan tu cuc dai:%5d",dem);
int kq=hoitucacdong(a,d,c);
if(kq==0)
printf("\nma tran khong hoi tu\n");
else
printf("\nma tran hoi tu\n");
int tong=tongcucdai(a,d,c);
printf("\nma tran co tong cuc dai la:%5d",tong);
getch();
}