Một số bài tập lập tŕnh C căn bảnCreated by NgoHung Vấn đề 2: Chương tŕnh con Bài toán số 2.1: Viết chương tŕnh chuyển đổi số tự nhiên N cho trước sang hệ cơ số 2 bằng việc xây dựng
Trang 1Một số bài tập lập tŕnh C căn bản
Created by NgoHung
Vấn đề 2: Chương tŕnh con
Bài toán số 2.1: Viết chương tŕnh chuyển đổi số tự nhiên N cho trước sang hệ cơ số 2
bằng việc xây dựng hàm chuyển đổi
Hướng dẫn:
- Xây dựng hàm Dec2Bin( ) chuyển đổi từ số tự nhiên sang số nhị phân
o Sử dụng biến S để lưu giá trị số nhị phân của N Khởi gán bằng 0
o Tiến hành lặp chuyển đổi cơ số: Lặp trong khi mà N > 0
SoDu = số dư của N chia cho 2
N = N chia cho 2
Bổ sung chữ số SoDu vào số S thành một chữ số
o Trả về kết quả cuối cùng của S
- Viết hàm void main ( ) với nội dung dùng để kiểm tra kết quả thực hiện của hàm
o Khai báo biến N, M
o Thông báo nhập, nhập giá trị cho biến N
o Gán giá trị M bằng kết quả trả về của hàm Dec2Bin( N )
o In thông báo về kết quả số nhị phân chuyển đổi được (giá trị của M)
o Gọi hàm getch( ) trước khi kết thúc hàm main ( )
Chương tŕnh:
/* thu tuc chuyen so tu nhien n cho truoc sang ket qua tra ve he co so 2 */
int Dec2Bin ( int n )
{
int S = 0 , So = n ;
while ( So > 0)
{
int Du = So % 2 ;
So = So / 2 ;
S = S * 10 + Du;
}
return S ;
}
/* chuong trinh chinh dap ung yeu cau bai toan */
void main( )
{
int N;
printf( “Nhap so N =” ); scanf( “%d”, &N );
printf( “Dang nhi phan cua N la %d”, Dec2Bin(N) );
getch( );
Trang 2}
Trang 3Bài toán số 2.2: Viết các hàm USCLN(a, b) và BSCNN(a, b).
Hướng dẫn: Khai báo hàm USCLN có:
Tên hàm: USCLN Kiểu dữ liệu trả về: long Tham số: 2 tham trị là int a, int b Giá trị trả về: chính là giá trị ước số chung lớn nhất của a và b
Xử lư t́m USCLN, BSCNN: Dựa trên ví dụ đă có ở phần trước
Nội dung hàm:
long USCLN( int a, int b)
{
for (int k = a; k >= 1; k ) // Lap voi moi i co gia tri tu a den 1
if (a%k == 0 && b%k == 0) // Kiem tra a, b co’ dong thoi chia het cho k khong
break; // break de thoat, luu giu lai gia tri cua k return k;
}
Tương tự để viết hàm long BSCNN( int a, int b )
long BSCNN( int a, int b)
{
for (int k = a; k <= a*b; k++) // Lap voi moi i co gia tri tu a den 1
if (k%a == 0 && k%b == 0) // Kiem tra a, b co’ dong thoi chia het cho k khong
break; // break de thoat, luu giu lai gia tri cua k return k;
}
Hoặc sử dụng hàm đă xây dựng:
long BSCNN( int a, int b)
{
return a*b/USCLN( a, b );
}
Trang 4Bài toán số 2.3: Viết hàm kiểm tra số N có phải là số nguyên tố hat không?
Hướng dẫn: Khai báo hàm kiểm tra số nguyên tố có:
Tên hàm: KiemtraSNT
Dữ liệu trả về: int, ( 0 nếu không phải là số nguyên tố, là 1 nếu là số nguyên tố )
Tham số: tham trị là int N, số cần kiểm tra
Xử lư kiểm tra: Dựa trên ví dụ đă có ở phần trước
Nội dung hàm:
int KiemtraSNT( int N )
{
int ktrSNT = 1; // Khoi gan gia tri dung cho ktrSNT
for ( int i = 2; i <= N-1; i++ ) // Lap voi moi i co gia tri tu 2 den N-1
if ( N % i == 0 ) // Kiem tra xem N co’ chia het cho i hay khong
ktrSNT = 0; // Neu dung thi khong con la so nguyen to nua
return ktrSNT;
}
Cải tiến, không sử dụng biến phụ:
int KiemtraSNT( int N )
{
for ( int i = 2; i <= N-1; i++ ) // Lap voi moi i co gia tri tu 2 den N-1
if ( N % i == 0 ) // Kiem tra xem N co’ chia het cho i hay khong
return 0; // Neu dung thi khong con la so nguyen to nua
return 1; // Khong co gia tri tu 2 den N-1 ma N chia het
Bài toán số 2.4: Viết chương tŕnh thực hiện lần lượt các công việc sau:
- Lập thủ tục nhập ba số thực dương a , b , c từ bàn phím
- Lập thủ tục kiểm tra xem ba số trên có lập thành ba cạnh của tam giác hay không ?
- Viết hàm tính diện tích của tam giác
- Viết hoàn thiện chương tŕnh chính
Hướng dẫn:
- Thao tác nhập đơn giản:
void NhapTamGiac( long &a, long &b, long &c)
{
printf( “Nhap A=” ); scanf( “%d”, &a );
printf( “Nhap B=” ); scanf( “%d”, &b );
printf( “Nhap C=” ); scanf( “%d”, &c );
}
- Kiểm tra a, b, c lập thành ba cạnh của tam giác nếu tổng 2 cạnh luôn lớn hơn một cạnh
Trang 5int KtraTamGiac( long a, long b, long c)
{
if (a+b > c && a+c > b && b+c > a)
return 1;
else
return 0;
}
- Tính diện tích có thể thực hiện thông qua chu vi của nó
float DienTichTamGiac( long a, long b, long c)
{
float p = (a+b+c)/2.0;
return sqrt(p*(p-a)*(p-b)*(p-c));
}
- Xây dựng hàm main với mục đích, sử dụng các hàm trên để tính diện tích tam giác nhập vào nếu thông số nhập thỏa măn
void main()
{
long a, b, c;
NhapTamGiac( a, b, c );
if ( KtraTamGiac( a, b, c) )
printf( “Dien tich tam giac: %f \n”, DienTichTamGiac( a, b, c ));
else
printf( “Khong lap thanh duoc tam giac.\n”);
getch( );
}
Bài toán số 2.5: Viết chương tŕnh hoàn chỉnh thực hiện phân tích ra N ra thành các thừa
số nguyên tố
Ví dụ: N = 1260 = 2 2 3 3 5 7
Hướng dẫn:
- Viết hàm nhập số N Lưu ư, hàm nhập cần truyền tham số N theo dạng tham biến để lưu lại giá trị đă nhập vào
- Viết hàm phân tích số N ra các thừa số nguyên tố và in các thừa số đó
ra màn h́nh với ư tưởng thuật toán:
o Chia N cho số nguyên tố u (nhỏ nhất là 2)
o Trong khi N c ̣n chia hết cho u th́ tiến hành phân tích N với u là thừa số Giảm N đi u lần
o Nếu N không chia hết cho u, thi tăng u lên 1
o Quá tŕnh lặp lại với
u từng bước tăng lên 1 nếu N không chia hết cho u
N từng bước giảm xuống u lần nếu N chia hết cho u
o Quá tŕnh lặp lại đến một mức u tăng lên và N giảm xuống để N = u, khi
đó giá trị mới của N sẽ là 1
Chương tŕnh:
Trang 6void NhapSoN( long &NN )
{
NN = 0; //Gan khoi dau bang 0 de vao vong lap, vong lap dung khi nhap khac 0
while ( N == 0 )
{
printf( “Nhap N=” ); scanf( “%d”, &NN );
}
}
/*================================*/
void PhantichSoN ( long N1 )
{
if ( N1 > 1 )
{
int u = 2, dem = 0;
while ( N1 > 1 )
if ( N1 % u = 0 )
{
dem++;
printf( “%d ”, u);
N1 = N1 / u;
}
else
u++;
}
else
printf( “Khong the phan tich duoc” );
}
/*==============================*/
void main( ) /* Ham xu ly chinh cua chuong trinh */
{
clrscr( );
printf( “Phan tich so N thanh tich cua cac so nguyen to :\n” );
NhapSoN( N );
PhantichSoN( N );
printf ( “Nhan Enter de ket thuc ” );
getch( );
}