CHƯƠNG 8 – Cấu trúc lập trình trong C
Hà Nội ngày 1/8/2010, Nguyễn Thị Thu Trang – SE – SoICT
I. Bài tập làm thêm
Bài tập 8.11. Tìm USCLN và BSCNN của 2 số nguyên dương nhập từ bàn phím
Lời giải mẫu:
#include <stdio.h>
void main()
{
unsigned n, m, n1, m1, uscln, bscnn;
printf("\nNhap hai vao so nguyen duong : ");
scanf("%u%u", &n, &m);
n1=n; m1=m;
// Tim USCLN
while (n1 != 0 && m1 != 0)
if (n1>m1)
n1 -= m1;
else
m1 -= n1;
if (n1 == 0)
uscln = m1;
else
uscln = n1;
// Tim BSCNN
bscnn = n * m / USCLN(n, m);
printf("\nUSCLN cua %u va %u = %u", n, m, USCLN(n,m));
printf("\nBSCNN cua %u va %u = %u", n, m, BSCNN(n,m));
getch();
}
Bài tập 8.12. Nhận vào từ bàn phím tháng và năm, có kiểm tra điều kiện. Đưa ra tháng
năm đó có bao nhiêu ngày, chú ý nếu tháng và năm nhập không đúng thì yêu cầu
nhập lại. Sử dụng lệnh switch…case
Lời giải mẫu:
/*Bai tap 8.12. Tinh so ngay cua 1 thang*/
#include <stdio.h>
#include <conio.h>
int thang,ngay,nam;
void main()
{
1
clrscr();
printf("Chuong trinh tinh so ngay cua mot thang\n\n");
printf("Nhap thang:");
scanf("%d",&thang);
while (thang<1 || thang>12)
{
printf("\nBan nhap khong dung!\n");
printf("Ban hay nhap lai:");
scanf("%d ",&thang);
}
printf("\nNhap nam:");
scanf("%d",&nam);
switch (thang)
{
case 4:
case 6:
case 9:
case 11: ngay=30;break;
case 2: if ((nam%4==0 && nam%100 != 0) || (nam%400 == 0))
ngay=29;
else
ngay=28;
break;
default: ngay=31;
}
printf("\nSo ngay cua thang do la %d\n",ngay);
getch();
}
Bài tập 8.13. Tìm tất cả các ước số của số nguyên dương nhập từ bàn phím. Có xử lý
ngắt trang (5 số / 1 dòng, 20 dòng / 1 trang).
Lời giải mẫu:
/* Bai tap 8.13 - In tat ca cac uoc so cua so n */
#include <stdio.h>
#include <conio.h>
void main()
{
int n, i;
printf("Cho gia tri N = ");
scanf("%d", &n);
printf("Cac uoc so cua %d la :\n", n);
for (i=1; i<n; i++)
if ((n % i) == 0)
printf("%5d", i);
getch();
}
2
Bài tập 8.14. Nhận số nguyên dương từ bàn phím. Đưa ra kết luận số đó có phải là số
nguyên tố hay không.
Lời giải mẫu:
/* Bai tap 2.4 - Tinh xem so N co phai la so nguyen to khong? */
#include <stdio.h>
#include <math.h>
void main()
{
int N, i, OK = 1;
printf("\nNhap gia tri N : ");
scanf("%d", &N);
for (i=2; i<(int)sqrt(N); i++)
if (N%i == 0)
{
OK = 0;
break;
}
if (OK)
printf("\nSo %d la so nguyen to.", N);
else
printf("\nSo %d khong phai la so nguyen to.", N);
getch();
}
Bài tập 8.15: Viết chương trình nhập vào số nguyên dương h (2<h<23), sau đó in ra các
tam giác có chiều cao là h như các hình sau:
* *
** ***
*** *****
**** *******
***** *********
Lời giải mẫu:
/* Bai tap 2.6. In hinh tam giac dac */
#include <stdio.h>
#include <conio.h>
void main()
{
int n, i, j;
printf("\nNhap chieu cao cua hinh tam giac : ");
scanf("%d", &n);
for (i=0; i<n; i++)
{
for (j=n-1; j>i; j )
3
printf(" ");
for (j=0; j<i*2+1; j++)
printf("*");
printf("\n");
}
getch();
}
Bài tập 8.16: In ra dãy số Fibonaci < N (N<=10.000)
/* Bai tap 2.7. In day so Fibonaci */
#include <stdio.h>
void main()
{
int n, i, fib1 = 1, fib2 = 1, fib = 2;
printf("\nNhap gia tri N : ");
scanf("%d", &n);
printf("%d %d ", fib1, fib2);
while (fib1+fib2 < n)
{
fib = fib1 + fib2;
printf("%d ", fib);
fib2 = fib1;
fib1 = fib;
}
getch();
}
II. Bài tập về nhà
Bài tập 8.21. Tính n! (n<=10). Đưa ra 2 lời giải tương ứng với việc sử dụng for hoặc
while.
Lời giải mẫu:
/*Bai tap 8.21. Tinh n! */
#include<stdio.h>
#include<conio.h>
long n,i,gt;
void main()
{
clrscr();
printf("Chuong trinh tinh n!\n\n");
printf("Ban hay nhap vao mot so tu nhien n:");
scanf("%d",&n);
while (n<0)
{
printf("\nSo vua nhap khong thoa man, ban hay nhap lai:");
scanf("%d",&n);
}
4
gt=1;
i=1;
if (n>0) while (i<=n) gt=gt*i++;
printf("\nn!=%d\n",gt);
getch();
}
Hoặc:
void main()
{
int n, start, i;
unsigned long gthua = 1;
printf("\nNhap gia tri N : ");
scanf("%d", &n);
if (n%2 == 0)
start = 2;
else
start = 1;
for (i=start; i<=n; i = i+2)
gthua *= i;
printf("\n%d!! = %ld", n, gthua);
getch();
}
Bài tập 8.22. Đưa ra tất cả các số nguyên tố từ 1 đến N (1<N<=10000). Chú ý có xử lý
ngắt trang.
Lời giải mẫu:
#include <stdio.h>
#include <conio.h>
#include <math.h>
unsigned long N,i,j,dk;
void main()
{
clrscr();
printf("Chuong trinh viet cac so nguyen to tu 1 den N (N>1)\n\n");
printf("Ban hay nhap N:");
scanf("%d",&N);
printf("\nCac so nguyen to tu 1 den N la:");
i=2;
dk=1;
while (i<=N)
{
if (dk==1) printf("%d,",i);
dk=1;
i=i+1;
j=2;
while (j<=sqrt(i))
{
if (i%j==0)
5
{
dk=0;
break;
}
j=j+1;
}
}
getch();
}
Bài tập 8.23. Một tam giác vuông có thể có tất cả các cạnh là các số nguyên. Tập của
ba số nguyên của các cạnh của một tam giác vuông được gọi là bộ ba Pitago. Đó
là tổng bình phương của hai cạnh bằng bình phương của cạnh huyền, chẳng hạn
bộ ba Pitago (3, 4, 5). Viết chương trình tìm tất cả các bộ ba Pitago như thế sao
cho tất cả các cạnh không quá 500.
Lời giải mẫu:
/* Tim nhung gia tri nguyen x, y, z thoa x^2 + y^2 = z^2 */
#include <stdio.h>
#include <conio.h>
#include <math.h>
void main()
{
long x, y, z, count = 0;
for (x=1; x<100; x++)
for (y=1; y<100; y++)
{
z = sqrt(x*x+y*y);
if (z*z == x*x + y*y)
{
printf("\n%6ld %6ld %6ld", x, y, z);
count++;
}
}
printf("\nTong cong co %ld cap so thoa man.", count);
getch();
}
Bài tập 8.24. Đoán số
Lời giải mẫu:
/* Doan so */
#include <stdio.h>
void main()
{
int n, k = 128, i = 0, solan = 0;
char c;
6
printf("\nBan hay nghi mot so trong dau. So do phai nho hon 100.");
delay(1000);
printf("Xong chua! Roi ban hay tra loi nhung cau hoi sau day cua toi.");
printf("\nToi se tim ra con so ma ban doan.");
do {
n = (k+i)/2;
solan++;
printf("\nLan doan thu %d.", solan);
printf("\nCo phai so ban nghi la %d (Dung, Nho hon, Lon hon) ? ", n);
do {
c = toupper(getch());
} while (c != 'D' && c != 'N' && c != 'L');
switch (c)
{
case 'L' : i = n;
break;
case 'N' : k = n;
break;
case 'D' : printf("\nTai khong?");
break;
}
} while (c != 'D');
getch();
}
Bài tập 8.25. Nhập vào một số nguyên dương từ bàn phím. Kiểm tra xem số
nguyên đó có thuộc dãy Fibonacci không.
7