You are on page 1of 61

LỜI NÓI ĐẦU

Chào các bạn! Trước khi bắt đầu chuyên mục chính, mình xin được tự giới thiệu:
Mình là Nguyễn Đăng Dương, sinh viên K64 lớp Kỹ thuật điện 02. Hiện mình đang là sinh
viên năm 2, đồng thời là thành viên của CLB Hỗ trợ học tập và phát triển sinh viên –
BachKhoa UNICORN.
Trong kì học này, mình được giao nhiệm vụ soạn giáo án cũng như hỗ trợ các học
viên tham gia lớp bổ trợ Tin học Đại Cương (Tin ĐC) do nhóm mình tổ chức. Nhân đây
mình cũng xin được chia sẻ một chút kinh nghiệm trong việc học môn này. Tin ĐC là một
học phần thuộc Khối kiến thức Toán và Khoa học cơ bản, có nghĩa là nó được xếp “chung
mâm” với những nỗi ác mộng làm tan cửa nát nhà bao thế hệ sinh viên như Giải tích, Đại
số hay Xác suất thống kê. Số lượng tín chỉ của nó là 4, có thể nói là khá lớn. Tuy nhiên,
Tin ĐC lại được đánh giá là tương đối dễ qua và cũng dễ lấy điểm cao hơn so với các môn
chung Khối. Đây không chỉ là nhận định của cá nhân mình mà còn là nhận định chung của
nhiều anh chị sinh viên đi trước nữa. Nguyên nhân là do đâu? Thứ nhất, Tin ĐC thi phần
nhiều dưới hình thức trắc nghiệm. Thứ hai, Tin ĐC học nhiều lý thuyết nhưng nó lại không
dài dòng khó nhớ như bên Triết học Mác – Lênin, chỉ cần đọc vài lần là nhớ, càng dễ dàng
hơn cho những bạn biết cách tổng hợp kiến thức. Thứ ba, bài thi Tin ĐC lấy nhiều câu hỏi
ở trong SBT, vì vậy các bạn ôn kiến thức trong SBT là đủ qua…Đấy là qua môn . Còn để
đạt được mức điểm cao các bạn cũng cần bỏ ra nhiều thời gian vào nó, chịu khó thực hành,
đặc biệt là phần lập trình C. Bài thi lập trình không phải cao siêu cũng như không đòi hỏi
bạn phải có khả năng của một “hacker” hay gì cả nhưng nó cũng đòi hỏi ở bạn sự tập trung
nhất định và phấn đấu từng ngày. Mình cũng rất may mắn khi được điểm cao môn này, và
mình mong các bạn cũng sẽ phấn đấu để được kết quả như ý.
OK, mình chia sẻ vậy thôi nhỉ? Bây giờ mình sẽ nói một chút về tập tài liệu. Đây
là tài liệu mình biên soạn dành riêng cho chương cuối cùng “Các cấu trúc lập trình cơ
bản”. Tài liệu gồm 4 phần:
► Phần 1: Bài tập định hướng
► Phần 2: Bài tập tự giải
► Phần 3: Tổng hợp các cú pháp lệnh
► Phần 4: Code minh họa cho 5 bài thực hành
Bài tập trong tài liệu được tổng hợp từ nhiều nguồn khác nhau, đặc biệt là từ website
http://theza2.mobie.in/ và các bài thực hành Tin ĐC của trường Đại học Bách Khoa Hà
Nội. Trong quá trình biên soạn tài liệu mình không thể tránh khỏi những sai sót chủ quan
hoặc khách quan, rất mong được các bạn thông cảm. Mọi ý kiến đóng góp xin gửi vào:
► Email: duong.nd191478@sis.hust.edu.vn
► Facebook cá nhân: https://www.facebook.com/didom.duong.96155/
Xin trân trọng cảm ơn!
1|Page
PHẦN I: BÀI TẬP ĐỊNH HƯỚNG
Bài 1: Xuất ra màn hình dòng chữ “Hello World”
Ý tưởng: Đây là chương trình cơ bản nhất của bất cứ ngôn ngữ lập trình nào.
Nhiệm vụ của chúng ta chỉ cần ra lệnh cho máy tính in ra một dòng kí tự. Để làm
được điều đó, ta chỉ cần dùng lệnh xuất cơ bản printf() và nhớ khai báo tệp tiêu đề
#include<stdio.h>
Chương trình:
#include <stdio.h>
int main()
{
printf("Hello World");
return 0;
}

Bài 2: Nhập vào 2 số nguyên. In ra màn hình tổng hai số nguyên đó


Ý tưởng: Khai báo 2 biến kiểu int hoặc long để lưu trữ giá trị cho 2 số nguyên.
Sử dụng lệnh nhập cơ bản scanf() yêu cầu người dùng nhập hai giá trị để gán giá trị
cho 2 biến đó. Kết hợp với lệnh xuất cơ bản prinf() để thiết kế giao diện cho chương
trình và xuất kết quả ra màn hình. Lưu ý các định dạng nhập (%d) và định dạng xuất
(%d) cho số nguyên.
Chương trình:
#include <stdio.h>
int main()
{
int a,b;
printf("Nhap 2 so nguyen: \n");
scanf("%d",&a);
scanf("%d",&b);
printf("Tong 2 so nguyen %d va %d la: %d",a,b,a+b);

2|Page
return 0;
}

Bài 3: Nhập vào 2 số nguyên. In ra màn hình kết quả thương của 2 số đó hoặc
kết luận phép chia không thực hiện được.
Ý tưởng: Khai báo hai biến kiểu int hoặc long. Trong trường hợp số chia
bằng 0, ta dùng lệnh if để kết luận “Không thể thực hiện phép chia”. Mặt khác, do
giữa hai số nguyên chỉ có phép chia nguyên và chia dư, vì vậy muốn kết quả phép
chia trả về đúng (ví dụ 5/4=1.25) thì ta phải dùng biểu thức ép kiểu sang kiểu float
hoặc double.
Lưu ý định dạng xuất của số thực(%f).
Chương trình:
#include <stdio.h>
int main()
{
int a,b;
printf("Nhap so bi chia: ");scanf("%d",&a);
printf("Nhap so chia: ");scanf("%d",&b);
if (b==0) printf("Khong the thuc hien phep chia");
else{
float thuong=(float)a/b;
printf("Ket qua phep chia %d/%d = %f",a,b,thuong);
}
return 0;
}

Bài 4: Nhập vào 3 số nguyên. Tìm số lớn nhất trong 3 số đó.


Ý tưởng: Khai báo một biến là max. Gán giá trị số đầu tiên cho max. Dùng
lệnh if để gán max cho số thứ hai nếu số thứ hai lớn hơn max. Tiếp tục dùng lệnh if
để gán max cho số thứ ba nếu số thứ ba lớn hơn max. Sau chương trình, biến max
sẽ nhận giá trị là số lớn nhất trong ba số nhập vào.
3|Page
Chương trình:
#include <stdio.h>
int main()
{
int a,b,c;
printf("Nhap 3 so nguyen: \n");
scanf("%d %d %d",&a,&b,&c);
int max=a;
if(b>max) max=b;
if(c>max) max=c;
printf("So lon nhat trong 3 so la: %d",max);
return 0;
}

Bài 5: Dùng 2 biến a,b để lưu 2 số nguyên được nhập từ bàn phím. Viết chương
trình để đổi chỗ 2 số nguyên ấy.
Ý tưởng: Đầu tiên ta phải hiểu yêu cầu của đề bài. Đề bài yêu cầu đổi chỗ 2
số, nghĩa là khi kết thúc chương trình biến a nhận giá trị của biến b ban đầu và biến
b nhận giá trị của biến a ban đầu.
Trong C không có hàm nào có thể trực tiếp làm được điều này, vì vậy ra phải
tìm ra thuật toán phù hợp.
Một số bạn sẽ dùng đoạn mã này:
a=b;
b=a;
Đoạn mã này SAI. Ở dòng đầu tiên, ta gán b cho a, có nghĩa là a sẽ nhận giá
trị của b. Ở dòng thứ hai ta gán a cho b, có nghĩa là b nhận giá trị của a lúc này, tức
là giá trị của b ban đầu. Kết thục đoạn mã, a và b đều nhận giá trị của b ban đầu.
Thay vì đó. ta có thể khai báo một biến c làm biến trung gian và thực hiện
đoạn mã sau:
c=a;

4|Page
a=b;
b=c;
Sau khi kết thúc đoạn mã, a sẽ nhận giá trị b ban đầu, b sẽ nhận giá trị a ban
đầu.
Chương trình:
#include <stdio.h>
int main()
{
int a,b;
printf("Nhap a= ");scanf("%d",&a);
printf("Nhap b= ");scanf("%d",&b);
int c;
c=a;
a=b;
b=c;
return 0;
}

Bài 6: Nhập 3 số thực a,b,c bất kì. Tính giá trị biểu thức sau:
((x+y+z)/(x2+y2+1))−|x−zcos(y)|
Ý tưởng: Khai báo 3 biến x,y,z kiểu float hoặc double. Do có sự xuất hiện
của biểu thức lũy thừa cũng như biểu thức lượng giác và giá trị tuyệt đối, ta cần
sử dụng các hàm toán học.
Ví dụ: sin(x), cos(x), tan(x) là các hàm lượng giác tính sin x, cos x, tan x
pow(x,y) là hàm tính xy
fabs(x) là hàm tính giá trị tuyệt đối của x
sqrt(x) là hàm tính căn bậc hai của x
log(x) là hàm tính loga cơ số tự nhiên của x…

5|Page
Để sử dụng được các hàm toán học này, ta cần khai báo tệp tiêu đề:
#include<math.h>
Chương trình:
#include <stdio.h>
#include <math.h>
int main()
{
double x,y,z;
printf("Nhap x= ");scanf("%lf",&x);
printf("Nhap y= ");scanf("%lf",&y);
printf("Nhap z= ");scanf("%lf",&z);
double F;
F=(x+y+z)/(pow(x,2)+pow(y,2)+1)-fabs(x-z*cos(y));
printf("Ket qua phep tinh la: %f",F);
return 0;
}

Bài 7: Tính chu vi, diện tích của hình tròn có bán kính R.
Ý tưởng: Dựa vào công thức tính chu vi, diện tích hình tròn, ta có thể thiết
lập các biểu thức sau:
M=2.ℼ.R
S= ℼ.R.R
Trong ngôn ngữ C không có hằng số ℼ, vì vậy ta chỉ có thể tự khai báo nó
bằng một hằng số kiểu float hoặc double bằng cú pháp:
const float pi=3.14159;
Ta có thể lưu giá trị của R bằng cách khai báo một biến kiểu float hoặc double
Chương trình:
#include <stdio.h>
int main()

6|Page
{
const float pi=3.14159;
float r;
printf("Nhap ban kinh R= ");scanf("%f",&r);
float M,S;
M=2*pi*r;
S=pi*r*r;
printf("Chu vi duong tron: %f\n",M);
printf("Dien tich hinh tron: %f",S);
return 0;
}

Bài 8: In ra màn hình dòng chữ “Toi yeu Viet Nam lan i” 20 lần, với i là thứ tự
của lần in đó:
Toi yeu Viet Nam lan 1
Toi yeu Viet Nam lan 2

Ý tưởng: Với số lần lặp biết trước là 20 lần, ta dùng lệnh lặp for… để thực
hiện việc xuất các dòng chữ ra màn hình. Ta khai báo một biến kiểu int làm biến
đếm, cho biến đếm chạy từ 1 đến 20, trong mỗi lần lặp ta in dòng chữ kèm theo giá
trị của biến đếm ấy.
Chương trình:
#include <stdio.h>
int main()
{
int i;
for(i=1;i<=20;i++)
printf("Toi yeu Viet Nam lan thu %d\n",i);
return 0;

7|Page
}

Bài 9: Nhập vào một số nguyên dương A. Kiểm tra xem số nguyên dương đó có
phải là số nguyên tố không.
Ý tưởng: Số nguyên tố là số dương lớn hơn 1 và chỉ chia hết cho 1 và chính
nó. Vì vậy để kiểm tra tính nguyên tố của A, ta có thể kiểm tra xem A có chia hết
cho số nào ngoài 1 và A không.
Để làm được điều này, ta dùng vòng lặp for… để kiểm tra tính chia hết của A
cho các số từ 2 đến A-1, đồng thời khởi tạo một biến kt =0 gọi là biến kiểm tra
Cho biến đếm i chạy từ 2 đến A-1, ở mỗi một vòng lặp ta dùng lệnh if… để
kiểm tra tính chia hết của A cho i. Ở một vòng lặp nào đó mà A chia hết cho i, ta có
thể gán kt bằng một giá trị khác 0 , đồng thời thoát luôn khỏi vòng lặp for… bằng
lệnh break;
Nếu kết thúc vòng lặp mà A không chia hết cho bất kì giá trị i nào (A là số
nguyên tố), kt vẫn chỉ có giá trị ban đầu của nó là 0. Ngược lại (A là hợp số), kt sẽ
có giá trị khác 0.
Cuối cùng, ta chỉ gần dùng lệnh if...else với biểu thức điều kiện là (kt==0) để
kết luận A là số nguyên tố hoặc A là hợp số.
Chương trình :
#include <stdio.h>
int main()
{
int A;
printf("Nhap so A= "); scanf("%d",&A);
if(A==1)printf("%d khong la so nguyen to, khong la hop so.",A);

if(A==2) printf("%d la so nguyen to.",A);


if(A>2)
{
int i;
int kt=0;//Khởi tạo biến kiểm tra bằng giá trị 0
for(i=2;i<A;i++)

8|Page
{
if(A%i==0) {
kt=1;//Gán biến kiểm tra bằng giá trị khác 0
break;//Thoát khỏi vòng lặp for…
}
}
if(kt==0) printf("%d la so nguyen to.",A);
else printf("%d la hop so.",A);
}
return 0;
}

Bài 10: Nhập vào giá trị nguyên. In ra màn hình một thứ trong tuần tương ứng
với số nguyên ấy.
Ví dụ: 3 à Tuesday
8 à Sunday
Ý tưởng: Ta có thể sử dụng lệnh if… để lần lượt đối chiếu giá trị của số
nguyên dương nhập vào với các giá trị 2,3,…,8 và in ra màn hình thứ tương ứng.
Tuy nhiên, trong trường hợp có nhiều điểu kiện cần kiểm tra, ta có thể dùng lệnh
swich…case để chương trình được sáng sủa và dễ hiểu hơn.
Đặt switch là giá trị người dùng nhập vào. Các khối case lần lượt là 2,3,…,8
dùng để thực hiện lệnh in ra màn hình thứ tương ứng. Lệnh trong khối default là in
ra màn hình thông báo “Số vừa nhập không đúng” ứng với trường hợp người dùng
nhập số nguyên không có giá trị là 2,3,…8.
Lưu ý dùng lệnh break; ở mỗi case để thoát khỏi cấu trúc switch…case khi
đã in ra được thông tin phù hợp. Bạn đọc có thể thử viết lại chương trình khi không
dùng lệnh break; và xem kết quả chạy của chương trình
Chương trình :
#include <stdio.h>
int main()
{

9|Page
int a;
printf("Nhap vao so nguyen: ");
scanf("%d",&a);
switch(a)
{
case 2: printf("Monday"); break;
case 3: printf("Tuesday"); break;
case 4: printf("Wednesday"); break;
case 5: printf("Thursday"); break;
case 6: printf("Friday"); break;
case 7: printf("Sartuday"); break;
case 8: printf("Sunday"); break;
default: printf("So ban nhap khong dung!");
}
return 0;
}

Bài 11: Nhập vào một số nguyên trong đoạn [0,100]. Nếu người dùng nhập sai
yêu cầu nhập lại cho đến khi nhập đúng. In số nguyên đó ra màn hình số nguyên
đó.
Ý tưởng: Giả sử ta lưu giá trị số nguyên mà người dùng nhập vào bằng biến
a kiểu int. Như những bài tập trước, người dùng có thể nhập bất cứ giá trị nào cho
a bằng lệnh scanf(“%d”,&a); miễn là giá trị đó thuộc khoảng giá trị mà kiểu int có
thể lưu trữ. Tuy nhiên, bài tập này yêu cầu người dùng nhập giá trị thỏa mãn những
điều kiện nhất định.
Vì vậy, ta sẽ yêu cầu người dùng nhập giá trị cho a trong khi điều kiện mà đề
bài yêu cầu vẫn chưa thỏa mãn. Mặt khác, số lần yêu cầu nhập lại là không biết
trước. Từ hai điều trên, ta nhận thấy có thể dùng vòng lặp do…while
Cụ thể, ở bài này biểu thức điều kiện để tiếp tục thực hiện vòng lặp:
(a<0||a>100)

10 | P a g e
Đoạn mã yêu cầu người dùng nhập lại a cho đến khi thỏa mãn điều kiện:
do{
printf("Nhap gia tri a= ");
scanf("%d",&a);
} while (a<0||a>100);
Khi đã nhập được số phù hợp, ta chỉ cần dùng lệnh print() để in số đó ra.
Đây là thuật toán thường xuyên được sử dụng để kiểm tra giá trị đầu vào, áp
dụng cho nhiều bài thực hành trong chương trình Tin đại cương.
Chương trình:
#include <stdio.h>
int main()
{
int a;
do{
printf("Nhap gia tri a= ");
scanf("%d",&a);
} while (a<0||a>100);//Kiểm tra điều kiện đầu vào
printf("Gia tri cua a la: %d",a);
}

Bài 12: Viết chương trình tính giai thừa của một số nguyên nhỏ hơn 8. Kiểm tra
điều kiện đầu vào bằng vòng lặp do…while
Ý tưởng: Số nguyên N mà ta cần tìm giai thừa phải nằm trong khoảng [0,7].
Đối với việc kiểm tra điều kiện đầu vào bằng vòng lặp do…while, ta sử dụng thuật
toán giống như bài 9. Biểu thức điều kiện để tiếp tục vòng lặp:
(N<0||N>7)
Giai thừa của một số nguyên N là tích các số nguyên từ 1 đến n. Để tính được
N!, ta khởi tạo biến a có giá trị 1. Sử dụng vòng lặp for…, cho biến đếm i chạy từ 1
đến N. Trong mỗi một vòng lặp, ta nhân thêm cho a giá trị của i tại vòng lặp ấy. Sau
vòng lặp, a sẽ nhận giá trị là N!

11 | P a g e
int i,a=1;
for (i=1;i<=n;i++) a=a*i;
Giả sử N=5, suy ra N!=120. Các giá trị của i và a khi thực hiện vòng lặp:
i 1 2 3 4 5
a 1 1*1=1 1*2=2 2*3=6 6*4=24 24*5=120

Chương trình:
#include <stdio.h>
int main()
{
int N;
do{
printf("Nhap N= ");
scanf("%d",&N);
} while(N<0||N>7);
if (N==0) printf("0!=1");//Trường hợp riêng khi N=0
if (N>0){
int i,a=1;
for(i=1;i<=N;i++) a=a*i;
printf("%d! = %d",N,a);
}
return 0;
}

Bài 13: Viết chương trình tính tổng các chữ số của một số nguyên có ít hơn 5 chữ
số.
Ý tưởng: Đầu tiên, ta vẫn cần kiểm tra điều kiện đầu vào để nhập được một
số nguyên N lớn hơn 0 và nhỏ hơn 10000. Giải quyết tương tự như bài 10

12 | P a g e
Vấn đề then chốt để giải quyết được bài toán này là tìm ra được thuật giải tính
tổng các chữ số của N. Trong ngôn ngữ lập trình C không có hàm số nào có thể trực
tiếp thực hiện được điều này.
Ta lấy ví dụ: N=1234
Ý tưởng của ta là lần lượt tách các chữ số của N ra, sau đó cộng hết chúng lại
Ta nhận thấy 1234 : 10 =123(dư 4). Phần nguyên là số N bị cắt mất chữ số
cuối, còn phần dư chính là chữ số cuối bị cắt ra. Do đó, ta có thể sử dụng phép chia
nguyên và chia dư trong C để lần lượt tách các chữ số của N. Khởi tạo biến a có giá
trị là 0. Cộng thêm cho a giá trị của biểu thức (N%10), sau đó gán cho N giá trị của
biểu thức (N/10). Lặp đi lặp lại việc này cho đến khi N bằng 0.

Ban đầu Lần 1 Lần 2 Lần 3 Lần 4


a 0 0+1234%10=4 4+123%10=7 7+12%10=9 9+1%10=10
N 1234 1234/10=123 123/10=12 12/10=1 1/10=0
Thuật giải trên có thể được sử dụng thông qua vòng lặp while…như sau:
while (N!=0)
{
a=a+N%10;
N=N/10;
}
Kết thúc vòng lặp, N nhận giá trị là 0, a nhận giá trị là tổng các chữ số của N
ban đầu. Nếu ta cần sử dụng lại giá trị ban đầu của N, trước khi vào vòng lặp ta cần
khai báo một biến để lưu trữ N.
Chương trình:
#include <stdio.h>
int main()
{
int N;
do{
printf("Nhap so N = ");
scanf("%d",&N);
13 | P a g e
} while(N<0||N>10000);//Kiểm tra dữ liệu đầu vào
int luu_tru = N;//Khởi tạo một biến luu_tru để lưu trữ N
int a=0;
while (N!=0)
{
a=a+N%10;
N=N/10;
}
printf("Tong cac chu so cua %d la: %d",luu_tru,a);
/*Sử dụng biến luu_tru để in ra giá trị ban đẩu của N*/
return 0;
}
Bài 14: Viết chương trình tìm ước chung lớn nhất và bội chung nhỏ nhất của 2
số nguyên dương nhập từ bàn phím.
Ý tưởng: Ước chung lớn nhất của 2 số a,b là số lớn nhất mà cả a,b cùng chia
hết. Bội chung nhỏ nhất của 2 số a,b là số nhỏ nhất mà chia hết cho cả 2 a và b.
Để tìm ước chung lớn nhất, ta khai báo một biến i. Cho i giảm dần từ số nhỏ
hơn trong 2 số a,b cho đến khi a,b cùng chia hết cho i. Để làm được điều này, ta có
thể dùng vòng lặp for… Sau khi kết thúc vòng lặp, giá trị i chính là ước chung lớn
nhất.
Tương tự, để tìm bội chung nhỏ nhất, ta cho i tăng dần từ số lớn hơn trong 2
số a,b cho đến khi i chia hết cho cả a và b. Ta tiếp tục có thể dùng vòng lặp for…
Sau khi kết thúc vòng lặp, giá trị i chính là bội chung nhỏ nhất.
Chương trình:
#include <stdio.h>
int main()
{
int a,b,i;
printf("Nhap a= "); scanf("%d",&a);
printf("Nhap b= "); scanf("%d",&b);
14 | P a g e
int m;
if(a<b) m=a; else m=b; //gán m thành số nhỏ hơn trong 2 số

for(i=m;i>=1;i--)
if (a%i==0&&b%i==0) {
printf("Uoc chung lon nhat cua %d va %d la: %d\n",a,b,i);
break;
} //vòng lặp tìm ước chung lớn nhất
if(a>b) m=a; else m=b; //gán m thành số lớn hơn trong 2 số
for(i=m;i<=a*b;i++)
if (i%a==0&&i%b==0){
printf("Boi chung nho nhat cua %d va %d la: %d",a,b,i);
break;
} //vòng lặp tìm bội chung nhỏ nhất
return 0;
}

Bài 15: Viết chương trình thực hiện các công việc sau:
Nhập số km đi được từ bàn phím trong khoảng (0;200).
Tính số tiền đi taxi theo công thức:
+15000 đồng cho km đầu tiên
+13500 đồng cho km thứ 2 đến 5
+11000 đồng từ km thứ 6 trở đi
Nếu đi được trên 120km thì sẽ giảm 10% tổng giá tiền.
(ĐỀ 27- BÀI KIỂM TRA THỰC HÀNH - THEZA2 )
Ý tưởng: Dùng các cấu trục điều kiện if… để kiểm tra các trường hợp ứng
với các quãng đường đã đi của taxi. Cụ thể:
- Đi 1 km
- Đi 2-5 km
15 | P a g e
- Đi 6-120 km
- Đi 121-199 km
Khai báo hai biến km và money để lưu giá trị quãng đường taxi đã đi được
và số tiền khách phải trả.
Chương trình:
#include <stdio.h>
int main()
{
int km,money;
do{
printf("Nhap so km da di duoc: ");
scanf("%d",&km);
} while (km<=0||km>=200); //Kiểm tra điều kiện đầu vào

if(km==1) money=15000;

if(km>=2&&km<=5) money=15000+(km-1)*13500;

if(km>=6) money=15000+4*13500+(km-5)*11000;

if(km>=121) money=money/10*9;

printf("So tien khach phai tra: %d VND",money);


return 0;
}

Bài 16: Lập chương trình thực hiện các công việc sau:
a) Nhập một giá trị thực x radian (0 ≤ x < 10) từ bàn phím.
b) Tính sin(x) với độ chính xác 0.0001 dựa vào công thức sau:

16 | P a g e
𝒙𝟑 𝒙𝟓 𝒏
𝒙𝟐𝒏+𝟏
𝒔𝒊𝒏(𝒙) = 𝒙 − + − ⋯ + (−𝟏) .
𝟑! 𝟓! (𝟐𝒏 + 𝟏)!
𝒙𝟐𝒏+𝟏
Gợi ý: Sử dụng vòng lặp do…while để tính với điều kiện dừng khi
(𝟐𝒏+𝟏)!
< epsilon=0.0001
( ĐỀ 22 – BÀI KIỂM TRA THỰC HÀNH – THEZA2)
Ý tưởng: Đúng như những gợi ý của đề bài, ta có thể dùng vòng lặp do…while để
x2n+1
tính sin(x), với điều kiện để tiếp tục thực hiện vòng lặp là ≥ 0.0001
(2n+1)!

Ta có thể viết lại biểu thức sin(x) như sau:


𝐱 𝟐.𝟎+𝟏 𝐱 𝟐.𝟏+𝟏 𝐱 (𝟐.𝟐+𝟏)
𝐬𝐢𝐧(𝐱) = (−𝟏)𝟎 . 𝟏
+ (−𝟏) . 𝟐
+ (−𝟏) . +⋯
(𝟐. 𝟎 + 𝟏)! (𝟐. 𝟏 + 𝟏)! (𝟐. 𝟐 + 𝟏)!
𝐧
𝐱 𝟐𝐧+𝟏
+ (−𝟏) .
(𝟐𝐧 + 𝟏)!

Ta khởi tạo một biến a có giá trị là 0 và biến đếm n có giá trị là -1. Trong mỗi
một vòng lặp, ta tăng n thêm một giá trị, sau đó cộng thêm cho a giá trị
x2n+1
(−1)𝑛 . . Thực hiện việc này cho đến khi điều kiện lặp không còn thỏa mãn.
(2n+1)!

Sau khi kết thúc vòng lặp, giá trị của a chính là kết quả phép tính sin(x) với
độ chính xác epsilon
Vấn đề là trong C không có hàm tính giai thừa, vì vậy những giá trị (2n+1)!
ta không thể tính trực tiếp được. Vì vậy, trong mỗi một vòng lặp, ta có thể dùng đoạn
mã sau để tính (2n+1)! (tương tự như bài 12)
giai_thua=1;
for (i=1;i<=2*n+1;i++) giai_thua=giai_thua*i;
với giai_thua là giá trị của (2n+1)! tại vòng lặp ấy và i là biến đếm (2 biến này phải
được khai báo trước khi bước vào vòng lặp do…while)
Tóm lại, đoạn mã để tính xấp xỉ sin(x) với độ chính xác epsilon=0.0001 là:
do {
n++;
giai_thua=1;

17 | P a g e
for(i=1;i<=2*n+1;i++) giai_thua=giai_thua*i;
a=a+pow(-1,n)*pow(x,2*n+1)/giai_thua;
} while(pow(x,2*n+1)/giai_thua>=0.0001);
Cuối cùng, vì bài toán có sử dụng đến hàm mũ nên ta phải khai báo tệp tiêu
đề #include <math.h> ở đầu chương trình.
Chương trình:
#include <stdio.h>
#include <math.h>
int main()
{
float x;
do{
printf("Nhap goc x= ");
scanf("%f",&x);
} while (x<0||x>=10); //Kiểm tra điều kiện đầu vào
float a=0;
int n=-1;
int giai_thua,i;
do {
n++;
giai_thua=1;
for(i=1;i<=2*n+1;i++) giai_thua=giai_thua*i;
a=a+pow(-1,n)*pow(x,2*n+1)/giai_thua;
} while(pow(x,2*n+1)/giai_thua>=0.0001);
printf("sin(%f)=%f",x,a);
return 0;
}

18 | P a g e
Bài 17: Khai báo một mảng số nguyên có 10 phần tử. Nhập các phần tử của mảng
từ bàn phím và tính tổng các phần tử ấy.
Ý tưởng: Đây là chương trình cơ bản nhất để làm việc với mảng. Ta cần khai
báo một mảng kiểu int hoặc float gồm ít nhất n phần tử để lưu trữ n giá trị số nguyên.
Để có thể thao tác với hàng loạt các phần tử trong mảng, ta thường sử dụng vòng lặp
for…
Ví dụ, ta có mảng khai báo mảng a kiểu int gồm 10 phần tử:
int a[10];
Khi đó, các phần tử trong mảng lần lượt là a[0],a[1],a[2],…,a[9] và có chỉ số
tương ứng là 0,1,2,…,9. Vậy, đoạn mã để nhập giá trị cho 10 phần tử trong mảng là:
for(i=0;i<=9;i++) scanf("%d",&a[i]);
với i là biến đếm
Để thực hiện tính tổng các phần tử của mảng, ta tiếp tục sử dụng vòng lặp
for... với biến đếm i.
Trước khi vào vòng lặp, ta khởi tạo một biến tong có trị là 0. Ở mỗi một vòng
lặp, ta cộng thêm cho tong giá trị của phần tử mảng a[i] tại vòng lặp ấy.
int tong=0;
for(i=0;i<=9;i++) tong=tong+a[i];
Sau khi kết thúc vòng lặp for…, tong sẽ nhận giá trị là tổng các phần tử của
mảng. Khi đó, ta chỉ cần xuất giá trị của tong ra ngoài màn hình là xong.
Chương trình:
#include <stdio.h>
int main()
{
int n;
printf("Nhap so phan tu cua mang: ");
scanf("%d",&n);
int a[10],i;
for(i=0;i<=9;i++) {
printf("Nhap phan tu thu %d: ",i+1);

19 | P a g e
scanf("%d",&a[i]); }
int tong=0;
for(i=0;i<=9;i++) tong=tong+a[i];
printf("Tong cac phan tu cua mang la: %d",tong);
return 0;
}
Bài 18: Nhập vào n số nguyên (n do người dùng nhập vào). Xuất ra màn hình tất
cả các số nguyên tố trong mảng đó.
Ý tưởng: Do số các số nguyên được nhập vào (n) phụ thuộc vào người dùng
và không giống nhau ở mỗi lần chạy chương trình, vì vậy ta có thể khai báo một
mảng gồm ít nhất n phần tử để lưu trữ các số nguyên đấy sau khi n đã được nhập
vào:
int a[n];
Để nhập n phần tử vào mảng, ta dùng vòng lặp for…tương tự bài 15
for(i=0;i<=n-1;i++) scanf("%d",&a[i]);
Để in ra màn hình các số nguyên tố có trong mảng, ta tiếp tục dùng vòng lặp
for… để duyệt tất cả các phần tử của mảng, kiểm tra xem phần tử tại vòng lặp ấy có
phải là số nguyên tố không, nếu đúng thì in số đó ra màn hình. Mặt khác, để xác định
một số có phải là số nguyên tố hay không, ta dùng thuật toán tương tự như bài 7
Tóm lại, mã lệnh để thực hiện là:
for(i=0;i<=n-1;i++){
int kt=0; //Khởi tạo biến kiểm tra
if(a[i]<2) kt=1;
if(a[i]==2) kt=0;
if(a[i]>2){
int j;
for(j=2;j<a[i];j++)
if(a[i]%j==0) {
kt=1;
break; }
20 | P a g e
}
if(kt==0) printf("%d ",a[i]);
//Nếu phần tử a[i] là số nguyên tố thì in số đó ra màn hình
}

Chương trình:
#include <stdio.h>
int main()
{
int n;
printf("Nhap so cac so nguyen: ");
scanf("%d",&n);
int a[n],i;
for(i=0;i<=n-1;i++){
printf("Nhap so thu %d: ",i+1);
scanf("%d",&a[i]);
}
printf("Cac so nguyen to la: ");
for(i=0;i<=n-1;i++){
int kt=0;
if(a[i]<2) kt=1;
if(a[i]==2) kt=0;
if(a[i]>2){
int j;
for(j=2;j<a[i];j++)
if(a[i]%j==0) {
kt=1;
break; }

21 | P a g e
}
if(kt==0) printf("%d ",a[i]);
}
}
Bài 19: Nhập vào n số nguyên (n do người dùng nhập vào). Xuất ra màn hình các
số nguyên ấy theo thứ tự giảm dần.
Ý tưởng: Đây là một bài toán sắp xếp cơ bản trong bất kì ngôn ngữ lập trình
nào. Đầu vào là một dãy không được sắp xếp đúng thứ tự, đầu ra là dãy đã được sắp
xếp theo tứ tự tăng dần hoặc giàm dần.
Có nhiều thuật toán để giải quyết bài toán kiểu này: thuật toán nổi bọt, thuật
toán đổi chỗ trực tiếp,…Ta có thể áp dụng thuật toán đổi chỗ trực tiếp vào bài toán
này. Với dãy gồm n phần tử, thuật toán được mô tả như sau:
Khi ta khai báo một mảng a để lưu trữ n phần tử, a[0], a[1],…, a[n-1] lần lượt
là phần tử thứ 1, thứ 2, …., thứ n.
- So sánh phần tử thứ 1 lần lượt với các phần tử sau nó, nếu phần tử thứ 1
nhỏ hơn thì đổi chỗ hai phần tử ấy.
- So sánh phần tử thứ 2 lần lượt với các phần tử sau nó, nếu phần tử thứ 2
nhỏ hơn thì đổi chỗ hai phần tử ấy.

- So sánh phần tử thứ n-1 với phần tử thứ n. Nếu phần tử thứ n-1 nhỏ hơn
thì đổi chỗ hai phần tử ấy.
Việc đổi chỗ 2 phần tử, ta dùng thuật toán tương tự như bài 5
Sau khi kết thúc, phần tử thứ 1 sẽ nhập giá trị lớn nhất, phần tử thứ 2 sẽ nhận
giá trị lớn thứ hai,…, phần tử thứ n-1 sẽ nhận giá trị nhỏ thứ hai, phần tử thứ n sẽ
nhận giá trị nhỏ nhất.
Dựa vào những điều trên, ta có đoạn mã để sắp xếp các phần tử của mảng a
theo thứ tự tăng dần sẽ là:
int tg;
for(i=0;i<=n-2;i++)
{
for(j=i+1;j<=n-1;j++)
if(a[i]<a[j])

22 | P a g e
{
tg=a[i];
a[i]=a[j];
a[j]=tg;
}
}
Sau khi có mảng đã được sắp xếp, ta dùng vòng lặp for… để xuất lần lượt các
phần tử của mảng ra màn hình
for(i=0;i<=n-1;i++) printf("%d ",a[i]);
Chương trình:
#include <stdio.h>
int main()
{
int n;
printf("Nhap so phan tu: "); scanf("%d",&n);
int a[n];
int i,j;
for(i=0;i<=n-1;i++){
printf("Nhap phan tu thu %d: ",i+1);
scanf("%d",&a[i]);
}
int tg; //khai báo biến trung gian
for(i=0;i<=n-2;i++)
{
for(j=i+1;j<=n-1;j++)
if(a[i]<a[j])
{
tg=a[i];

23 | P a g e
a[i]=a[j];
a[j]=tg;
}
}
printf("Day sau khi sap xep la: ");
for(i=0;i<=n-1;i++) printf("%d ",a[i]);
return 0;
}

Bài 20: Viết một chương trình nhập vào dãy số nguyên theo thứ tự giảm dần, nếu
nhập sai quy cách thì yêu cầu nhập lại.
Chương trình sẽ dừng khi số lượng phần tử là 7.
In dãy số vừa nhập theo định dạng như sau a,b,c,d...
Trong đó a,b,... là những số vừa nhập.
( ĐỀ 26 – BÀI KIỂM TRA THỰC HÀNH – THEZA2 )
Ý tưởng: Ta có thể gán các giá trị người dùng nhập vào một mảng. Do số
lượng phần tử tối đa là 7 nên ta chỉ cần khai báo một mảng có 7 phần tử.
Ta có thể vòng lặp for…để thực hiện việc gán trị cho các phần tử. Ở trong
mỗi vòng lặp for…ta lại lồng vào một vòng lặp do…while nhằm mục đích kiểm tra
điều kiện để gán giá trị cho phần tử phù hợp với yêu cầu đề bài.
Cụ thể hơn, điều kiện của vòng lặp do…while là phần tử tại vòng lặp ấy lớn
hơn hoặc bằng phần tử đứng trước nó, nghĩa là yêu cầu người dùng nhập lại phần tử
ấy đến khi nào nó nhỏ hơn phần tử trước nó.
Riêng phần tử thứ 1, ta có thể dùng lệnh scanf() để nhập giá trị trước khi vào
vòng lặp for…
Giả sử ta đã khai báo mảng a[7] kiểu int , các thuật toán bên trên được viết
bằng đoạn mã lệnh sau:
printf("Nhap phan tu thu 1: ");
scanf("%d",&a[0]);
for(i=1;i<=6;i++)

24 | P a g e
{
do{
printf("Nhap phan tu thu %d: ",i+1);
scanf("%d",&a[i]);
} while (a[i]>=a[i-1]);
}
Khi đã có giá trị của tất cả các phần tử, ta cần in chúng ra màn hình theo đúng
quy tắc đề bài yêu cầu: a ,b ,c ,d ,e ,f ,g
Phần tử thứ 1 ta in riêng
Từ phần tử thứ 2 trở đi, ta có thể dùng vòng lặp for…để in lần lượt chúng
kèm theo dấu phẩy ở đằng trước:
Cụ thể:
printf("%d",a[0]);
for(i=1;i<=6;i++) printf(",%d",a[i]);
Chương trình:
#include <stdio.h>
int main()
{
int a[7],i;
printf("Nhap phan tu thu 1: ");
scanf("%d",&a[0]); //Nhập riêng phần tử thứ 1
for(i=1;i<=6;i++)
{
do{
printf("Nhap phan tu thu %d: ",i+1);
scanf("%d",&a[i]);
} while (a[i]>=a[i-1]);
}
printf("Cac phan tu vua nhap la: \n");
25 | P a g e
printf("%d",a[0]); //Xuất riêng phần tử thứ 1
for(i=1;i<=6;i++) printf(",%d",a[i]); //Chú ý kèm dấu phẩy
}

Bài 21: Lập chương trình thực hiện các công việc sau:
a) Nhập một số nguyên N (0 < N < 10) từ bàn phím.
b) Nhập một mảng có N số thực từ bàn phím. Tính tổng các phần tử cực đại
(Phần tử cực đại là phần tử lớn hơn phần tử ngay trước và ngay sau nó)
Ví dụ: các phần tử được tô đen dưới đây là phần tử cực đại:
152635188
( ĐỀ 4 – BÀI KIỂM TRA THỰC HÀNH – THEZA2 )
Ý tưởng: Dùng một mảng a gồm N phần tử để lưu trữ N số nguyên được nhập
từ bàn phím. Dùng một biến tong để lưu trữ tổng các phần tử cực đại của a.
Cụ thể, đầu tiên ta khởi tạo biến tong với giá trị 0. Sau đó, ta dùng vòng lặp
for… để duyệt các phần tử từ thứ 2 đến thứ n-1 của mảng a. Trong mỗi một lần lặp,
dùng lệnh if…để kiểm tra điều kiện xem phần tử tại lần lặp ấy có lớn hơn 2 phần tử
cạnh nó không: nếu a[i] > a[i-1] và a[i] > a[i+1] thì cộng thêm cho tong giá trị a[i]
tại lần lặp ấy. (với i là biến đếm)
Kết thúc vòng lặp for…, ta có giá trị của biến tong chính là tổng các phần tử
cực đại của mảng a.
Chương trình:
#include <stdio.h>
int main()
{
int N;
do{
printf("Nhap gia tri N: ");
scanf("%d",&N);
} while (N<=0||N>=10); //Kiểm tra điều kiện đầu vào
int a[N],i;

26 | P a g e
for(i=0;i<=N-1;i++){
printf("Nhap phan tu thu %d: ",i+1);
scanf("%d",&a[i]);
}
int tong=0;
for(i=1;i<=N-2;i++) //Duyệt các phần tử từ thứ 2 đến thứ N-1
if(a[i]>a[i-1]&&a[i]>a[i+1]) tong=tong+a[i];
printf("Tong cac phan tu cuc dai cua mang la: %d",tong);
return 0;
}

Bài 22: Lập chương trình thực hiện các công việc sau:
a) Nhập một số nguyên N (0 < N < 10) từ bàn phím.
b) Nhập một mảng có N số nguyên từ bàn phím. In ra màn hình mảng vừa nhập
như một dãy số.
c) Tìm và in ra số lớn thứ 2 trong dãy.
Ví dụ: 1, 2, 3, 4, 4 thì kết quả là 3
( ĐỀ 7 – BÀI KIỂM TRA THỰC HÀNH – THEZA2 )
Ý tưởng: Câu a,b chỉ là kiểm tra điều kiện đầu vào các thao tác cơ bản với
mảng, ta có thể dễ dàng thực hiện.
Sang đến câu c, có một số bạn sẽ làm như sau:
Khai báo một mảng a gồm N phần tử để lưu trữ N số nguyên nhập vào từ bàn
phím. Sau đó, ta dùng thuật toán sắp xếp mảng giống bài bài 19.
Sau khi kết thúc, phần tử a[1] (phần tử thứ 2 trong mảng) chính là số nguyên
lớn thứ 2 trong dãy.
Đây là một thuật toán SAI. Lấy một ví dụ ngay như ở để bài. Dãy số sau khi
sắp xếp sẽ là 4, 4, 3, 2, 1. Phần tử thứ hai là 4 NHƯNG nó không phải là số nguyên
lớn thứ 2 trong dãy vì nó có giá trị bằng phần tử thứ nhất và là giá trị lớn nhất trong
dãy.
Thuật toán đúng có thể là như sau:

27 | P a g e
Ta vẫn dùng thuật toán sắp xếp mảng giống bài 19. Sau khi sắp xếp, chắc chắn
phần tử thứ 1 sẽ có giá trị lớn nhất. Ta sẽ dùng vòng lặp for… để duyệt các lần lượt
các phần tử từ thứ 2 đến thứ n. Tại lần lặp nào đó ta gặp phần tử nhỏ hơn phần tử
thứ 1, ta lưu giá trị của phần tử ấy vào một biến (ví dụ: second) và thoát khỏi vòng
lặp for…
Cụ thể:
int second;
for (i=1;i<=N-1;i++)
if (a[i]<a[0]){
second=a[i];
break;
}
Sau đoạn mã trên, second sẽ có giá trị chính là số nguyên lớn thứ hai trong
dãy. Ta chỉ cần in ra màn hình biến second là hoàn thành yêu cầu đề bài.
Chương trình:
#include <stdio.h>
int main()
{
int N;
do{
printf("Nhap so phan tu cua mang N= ");
scanf("%d",&N);
} while (N<=0||N>=10); //Kiểm tra điều kiện đầu vào
int a[N],i;
for(i=0;i<=N-1;i++){
printf("Nhap phan tu thu %d: ",i+1);
scanf("%d",&a[i]);
}
printf("Day so ban vua nhap la: ");
for(i=0;i<=N-1;i++) printf("%d ",a[i]);
28 | P a g e
//In dãy số ra màn hình

int tg,j;
for(i=0;i<=N-2;i++)
{
for(j=i+1;j<=N-1;j++)
if(a[i]<a[j])
{
tg=a[i];
a[i]=a[j];
a[j]=tg;
}
} //Sắp xếp dãy theo thứ tự giảm dần
int second;
for (i=1;i<=N-1;i++)
if (a[i]<a[0]){
second=a[i];
break;
} //Tìm phần tử lớn thứ 2
printf("\nPhan tu lon thu 2 trong day la: %d",second);
return 0;
}

Bài 23: Viết chương trình thực hiện các công việc sau:
Nhập vào số nguyên dương N.
Kiểm tra số vừa nhập có phải số lùi không.
Hiển thị thông báo ra màn hình.
Biết: Số lùi là số mà các chữ số theo thứ tự giảm dần

29 | P a g e
Ví dụ: abcd là số lùi khi a>b>c>d.
( ĐỀ 28 – BÀI KIỂM TRA THỰC HÀNH – THEZA2 )
Ý tưởng: Để kiểm tra xem một số N có phải số lùi hay không, ta phải so sánh
các chữ số của N. Vậy, ta cần tìm thuật toán để tách các chữ số của N
Nói đến việc tách số, ta có thể liên tưởng đến thuật toán của bài 13. Tuy
nhiên, thay vì cộng hết các chữ số lại, ta cần tách chúng thành các phần tử riêng biệt
để so sánh. Vì vậy, ta có thể khai báo một mảng a. Ở mỗi một lần lặp ta lại gán chữ
số được tách ra cho một phần tử của a. Cụ thể:
int a[100],dem=0;
while (N!=0)
{
a[dem]=N%10;
N=N/10;
dem++;
}
Giả sử số được nhập vào là xyzt. Sau khi kết thúc vòng lặp while…ta có:
a[0]=t, a[1]=z, a[2]=y, a[3]=x và dem nhận giá trị 3+1=4
Để số xyzt là số lùi thì a[3] > a[2] > a[1] > a[0] . Ta có thể kiểm tra điều kiện
này bằng vòng lặp for… kết hợp với lệnh if… như sau:
int kt=0; //Khởi tạo biến kiểm tra
int i;
for(i=dem-1;i>=1;i--)
if(a[i]<=a[i-1]){
kt=1;
break;
}
Kết thúc vòng lặp, nếu biến kt khác 0 thì số nhập vào không phải số lùi,
ngược lại nếu biến kt bằng 0 thì số nhập vào là số lùi.
Chương trình:

30 | P a g e
#include <stdio.h>
int main()
{
int N;
printf("Nhap so N= ");
scanf("%d",&N);
int a[100],dem=0;
while (N!=0)
{
a[dem]=N%10;
N=N/10;
dem++;
}
int kt=0,i;
for(i=dem-1;i>=1;i--)
if(a[i]<=a[i-1]){
kt=1;
break;
}
if(kt==0) printf("So vua nhap la so lui.");
else printf("So vua nhap khong phai la so lui");
return 0;
}

Bài 24: Nhập vào một xâu có tối đa 10 kí tự. In xâu đó ra màn hình
Ý tưởng: Đây là một bài toán cơ bản để làm quen với xâu. Ta dùng các lệnh
gets() kết hợp với fflush(stdin); và puts() để nhập xuất xâu, đồng thời khai báo tệp
tiêu đề #include<string.h> để thực hiện được các thao tác với xâu.

31 | P a g e
Do xâu đề bài yêu cầu có tối đa 10 kí tự nên ta khai báo một xâu chứa được ít
nhất 11 phần tử (10 phần tử kí tự chính, 1 phần tử kí tự kết thúc xâu)
Chương trình:
#include <stdio.h>
#include <string.h>
int main()
{
char str[11]; //Khai báo xâu kí tự
printf("Nhap xau: ");
fflush(stdin); gets(str); //Nhập xâu
printf("Xau vua nhap la: ");
puts(str); //Xuất xâu
return 0;
}

Bài 25: Nhập vào một xâu kí tự gồm tối đa 25 kí tự. Tính trung bình cộng các mã
ASCII của các kí tự trong xâu:
Ví dụ:
Xâu: abcdefgh→ 100.5
Ý tưởng: Muốn tính trung bình cộng các mã ASCII của các kí tự, ta phải tính
tổng các mã ASCII đó rồi chia cho số kí tự của xâu.
Xâu kí tự giống như một mảng các kí tự có thêm kí tự kết thúc xâu ‘\0’ ở cuối.
Giả sử ta có xâu kí tự s có độ dài 8 kí tự, s sẽ có 9 phần tử, trong đó từ s[0] đến s[7]
là các kí tự thường và s[8] là kí tự kết thúc xâu
s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] s[8]
‘a’ ‘b’ ‘c’ ‘d’ ‘e’ ‘f’ ‘g’ ‘h’ ‘\0’

Để tính độ dài xâu, ta có thể dùng hàm strlen(). Hàm này trả về giá trị là số
kí tự thường trong xâu.
Ví dụ, xâu s= “abcdefgh”

32 | P a g e
→strlen(s) trả về giá trị 8
Để tính tổng các mã ASCII của các kí tự, ta có thể dùng vòng lặp for…và cho
biến đếm i chạy từ 0 đến strlen(s)-1
int tong=0;
for(i=0;i<=strlen(s)-1;i++) tong=tong+s[i];
Số kí tự của xâu s chính là kết quả trả về của hàm strlen(s)
Chương trình:
#include <stdio.h>
#include <string.h>
int main()
{
char s[26];
printf("Nhap xau s: ");
fflush(stdin);gets(s);
int tong=0,i;
for(i=0;i<=strlen(s)-1;i++) tong=tong+s[i];
float TBC=(float)tong/strlen(s);
printf("Trung binh cong cac ma ASCII la: %f",TBC);
return 0;
}

Bài 26: Chuẩn hóa một xâu là việc xóa bỏ tất cả các kí tự trống ở đầu xâu, cuối
xâu và giữ một kí tự khoảng trống duy nhất ở giữa các từ.
Ví dụ:
Xâu ban đầu:•••This••time•For•You••
Xâu đã chuẩn hóa:This•time•For•You
với • là kí tự khoảng trống
Viết chương trình chuẩn hóa một xâu kí tự được nhập vào từ bàn phím.

33 | P a g e
Ý tưởng: Chuẩn hóa xâu là một thuật toán tương đối phức tạp. Giả sử ta có
một xâu kí tự s. Ta phải làm các bước sau để chuẩn hóa xâu s
Bước 1: Xóa bỏ các kí tự khoảng trống ở đầu xâu:
while(s[0] ==' ') strcpy(&s[0], &s[1]);
Bước 2: Xóa bỏ các kí tự khoảng trống ở cuối xâu:
while(s[strlen(s)-1]==' ') s[strlen(s)-1]='\0';
Bước 3: Để lại một kí tự khoảng cách duy nhất giữa các từ
int i;
for(i=0;i<strlen(s);i++)
{
if(s[i]==' '&&s[i+1]==' ')
{
strcpy(&s[i],&s[i+1]);
i--;
}
}
Sau khi thực hiện các bước trên, xâu s nhận giá trị là xâu ban đầu đã được
chuẩn hóa.
Chương trình:
#include <stdio.h>
#include <string.h>
int main()
{
char s[100];
printf("Nhap xau s: ");
fflush(stdin);gets(s);
while(s[0] ==' ') strcpy(&s[0], &s[1]);
//Xóa các kí tự khoảng cách ở đầu xâu

34 | P a g e
while(s[strlen(s)-1]==' ') s[strlen(s)-1]='\0';
//Xóa các kí tự khoảng cách ở cuối xâu
int i;
for(i=0;i<=strlen(s)-1;i++)
{
if(s[i]==' '&&s[i+1]==' ')
{
strcpy(&s[i],&s[i+1]);
i--;
}
}//Để lại một kí tự khoảng cách duy nhất ở giữa các từ
printf("Xau sau khi duoc chuan hoa:");
puts(s);
return 0;
}
Bài 27: Định nghĩa một hàm để tính giá trị tuyệt đối của một số với tham số là
một số thực, giá trị trả về là giá trị tuyệt đối của số thực ấy. Sử dụng hàm số ấy để
tính giá trị tuyệt đối của một số được nhập vào từ bàn phím.
Ý tưởng: Đây là một bài toán về việc định nghĩa một hàm trong C. Các bài
toán về hàm thường xuất hiện trong bài tập trắc nghiệm. Đối với các bài thực hành
trên phòng máy cũng như kiểm tra lập trình trong chương trình học, sinh viên có thể
sử dụng hàm hoặc không.
Quay trở lại với bài tập trên, ta cần định nghĩa một hàm để tính giá trị tuyệt
đối cũng như sử dụng trong chương trình. Hàm này có kiểu dữ liệu là float hoặc
double, có tham số và có kết quả trả về. Ta có thể định nghĩa hàm như sau:
float tuyet_doi(float x){
if(x>0) return x;
else return(-x);
} //Định nghĩa hàm

35 | P a g e
Khi cần tính giá trị tuyệt đối của một số, ta chỉ cần gọi hàm này trong hàm
main() ra đi kèm với một tham số tương ứng. Kết quả mà hàm trả về chính là giá trị
tuyệt đối của tham số đi kèm với hàm.
Ví dụ: tuyet_doi(-9) trả về giá trị 9.
Chương trình:
#include <stdio.h>
float tuyet_doi(float x){
if(x>0) return x;
else return(-x);
} //Định nghĩa hàm
int main()
{
int n;
printf("Nhap n= ");
scanf("%d",&n);
printf("|n|=%f", tuyet_doi(n)); //Gọi hàm để tính |n|
return 0;
}

36 | P a g e
PHẦN 2: BÀI TẬP TỰ GIẢI
Bài 1: Xuất ra màn hình 2 dòng chữ:
“Ten toi la
Nguyen Dang Duong”
Bài 2: Viết chương trình tính chu vi và diện tích của hình thang với độ dài đáy lớn,
đáy bé, chiều cao được nhập vào từ bàn phím.
Bài 3: Viết chương trình tính giá trị các biểu thức sau:
A = X2 + Y2
B = (X - Y)2
C = (X + Y)2
với A, B, C là các số thực nhập từ bàn phím.
Bài 4: Viết chương trình tính tổng
S=1+2+3+⋯+n
với n là số nguyên nhập từ bàn phím.
Bài 5: Viết chương trình tính các tổng sau:
a) 𝑆1 = 1 + 𝑥 + 𝑥 2 + 𝑥 3 + ⋯ + 𝑥 𝑛
b) 𝑆2 = 1 − 𝑥 + 𝑥 2 − 𝑥 3 + ⋯ + (−1)𝑛 . 𝑥 𝑛
𝑥 𝑥2 𝑥3 𝑥𝑛
c) 𝑆3 = 1 + + + +⋯+
1! 2! 3! 𝑛!

với n là một số nguyên dương và x là một số thực được nhập từ bàn phím
Bài 6: Viết chương trình giải phương trình bậc hai ax2+bx+c=0 với cả trường hợp
nghiệm thực và nghiệm phức.
Gợi ý: Với trường hợp nghiệm phức, ta có thể dùng kí tự i để biểu diễn cho đơn vị
ảo của số phức
Bài 7: Viết chương trình đổi một số nguyên nhập từ bàn phím sang hệ nhị phân
Bài 8: Nhập vào số nguyên N (N > 0). Kiểm tra xem N có là số "cân bằng" không?.
Một số nguyên được gọi là số "cân bằng" khi số lượng các chữ số lẻ bằng số lượng
các chữ số chẵn của số nguyên đó.
Ví dụ N=325476 là số "cân bằng".
37 | P a g e
( ĐỀ 34 – BÀI KIỂM TRA THỰC HÀNH – THEZA2 )
Bài 9: Viết chương trình thực hiện các công việc sau:
Nhập vào số nguyên N (0 < N < 100000).
Đưa ra kết quả số ngược của N.
Ví dụ: 1234 có số ngược là 4321
( ĐỀ 29 – BÀI KIỂM TRA THỰC HÀNH – THEZA2 )
Bài 10: Lập chương trình thực hiện các công việc sau:
a) Nhập 1 số nguyên N (0 < N < 10000) từ bàn phím.
b) Liệt kê các số tự mãn trong khoảng từ 0 đến N.
Biết: Số tự mãn là các số dương mà tổng mũ 3 các chữ số của nó bằng chính nó.
Ví dụ: 153=13+53+33
( ĐỀ 18 – BÀI KIỂM TRA THỰC HÀNH – THEZA2 )
Bài 11: Lập chương trình thực hiện các công việc sau:
a) Nhập một số nguyên N (0 < N < 10) từ bàn phím.
b) Nhập một mảng có N số nguyên từ bàn phím. In ra màn hình mảng vừa nhập như
một dãy số.
c) Tính và in ra trung bình cộng của các số chẵn trong dãy
( ĐỀ 6 – BÀI KIỂM TRA THỰC HÀNH – THEZA2 )
Bài 12: Lập chương trình thực hiện các công việc sau:
a) Nhập một số nguyên N (0 < N < 10) từ bàn phìm.
b) Nhập vào mảng có N số nguyên từ bàn phím. In ra màn hình mảng vừa nhập như
một dãy số.
c) In ra màn hình dãy số theo thự tự tăng dần về số lượng các ước của chúng (không
tính số 1 và chính bản thân số đó).
Bài 13: Lập chương trình thực hiện các công việc sau:
a) Nhập một số nguyên N (0 < N < 10) từ bàn phìm.
b) Nhập vào mảng có N số nguyên từ bàn phím. In ra màn hình mảng vừa nhập như
một dãy số.

38 | P a g e
c) In ra màn hình dãy số đã được sắp xếp dãy thành các bộ số giống nhau được xếp
cạnh nhau. Ví dụ: 1, 2, 5, -3, 2, -3, 7, -3, 7 →1, 2, 2, 5, -3, -3, -3, 7, 7
Bài 14: Nhập vào một xâu kí tự bao gồm các kĩ tự chữ hoa và chữ thường. In ra màn
hình 3 xâu kí tự, bao gồm:
- Xâu viết hoa
- Xâu viết thường
- Xâu đảo kiểu viết
Ví dụ: Xâu nhập vào: AbCd
Xâu xuất ra: ABCD
abcd
aBcD
Bài 15: Nhập vào một xâu kí tự. Sắp xếp lại các kí tự trong xâu ấy theo thứ tự mã
ASCII giảm dần. Xuất xâu mới ra màn hình.
Bài 16: Lập chương trình thực hiện các công việc sau:
a) Nhập vào danh sách họ tên các học sinh của một lớp từ bàn phím.
b) Chuẩn hóa lại tên các học sinh và chuyển các chữ cái thường ở đầu mỗi từ thành
chữ hoa tương ứng, đồng thời đưa các chữ cái ở phía sau chữ cái đầu tiên thành chữ
thường.
Ví dụ: nguYeN dANg DUOng → Nguyen Dang Duong
c) Đưa danh sách đã chuẩn hóa và viết hoa ra màn hình.
Bài 17: Định nghĩa một hàm để tính giai thừa của một số với tham số là một số
nguyên không âm, giá trị trả về là giai thừa của số nguyên đó. Sử dụng hàm số ấy
để tính giai thừa của một số được nhập vào từ bàn phím.

39 | P a g e
PHẦN 3: TỔNG HỢP CÁC TOÁN TỬ, HÀM VÀ CÚ PHÁP LỆNH
THƯỜNG DÙNG
1. Các toán tử thường dùng
Toán tử số học Ý nghĩa
+ Phép cộng
- Phép trừ
* Phép nhân
/ Phép chia lấy phần nguyên giữa 2 số nguyên
% Phép chia lấy phần dư giữa 2 số nguyên
/ Phép chia thông thường

Toán tử logic Ý nghĩa Toán tử thao Ý nghĩa


&& Và tác bit
|| Hoặc & and
! Trái | or
^ xor
~ not

Toán tử so sánh Ý nghĩa


== Bằng
> Lớn hơn
< Nhỏ hơn
>= Lớn hơn hoặc bằng
<= Nhỏ hơn hoặc bằng
!= Khác

Toán tử gán Ý nghĩa


= Gán chuẩn
+= Gán thu gọn
-= Gán thu gọn

Toán tử cộng, Ý nghĩa


trừ hậu tố (tiền
tố)
++ Cộng tiền tố (hậu tố)
-- Trừ tiền tố (hậu tố)

Toán tử lấy địa chỉ Ý nghĩa


& Lấy địa chỉ của biến (hằng)

40 | P a g e
Toán tử điều kiện Ý nghĩa
?: Tạo biểu thức điều kiện

2. Mức độ ưu tiên các toán tử


Mức Các toán tử Trật tự kết hợp
1 () [] . ++(hậu tố) --(hậu tố) →
2 ! ~ ++(tiền tố) --(tiền tố) 
3 * / % →
4 + - →
5 < <= > >= →
6 == != →
7 & →
8 ^ →
9 | →
10 && →
11 || →
12 ?: 
13 = += -= 

3. Các câu lệnh trong C


a) Lệnh khai báo và khởi tạo biến
- Khai báo biến
kiểu_dữ_liệu tên_biến;
- Khởi tạo biến
kiểu_dữ_liệu tên_biến = biểu_thức;
- Khai báo hằng
const kiểu_dữ_liệu tên_hằng = biểu_thức;
b) Lệnh gán
tên_biến = biểu thức;
c) Lệnh tăng giảm
tên_biến ++;

41 | P a g e
tên_biến --;
++ tên_biến;
-- tên biến;
d) Nhập, xuất dữ liệu
- Nhập dữ liệu
scanf("định_dạng_nhập",biểu_thức_địa_chỉ_biến);
- Nhập dữ liệu kiểu char hoặc string
fflush(stdin); scanf("%c",biểu_thức_địa_chỉ_biến);
fflush(stdin); scanf("%s",biểu_thức_địa_chỉ_biến);
- Xuất dữ liệu
printf("định_dạng_xuất",danh_sách_biểu_thức);
e) Cấu trúc lệnh khối
{
câu_lệnh_1;
câu_lệnh_2;
câu_lệnh_3;

câu_lệnh_n;
}
f) Cấu trúc điều kiện
- Cấu trúc if thiếu
if (biểu_thức_dk) câu_lệnh;
- Cấu trúc if đủ
if (biểu_thức_dk) câu_lệnh_1;
else câu_lệnh_2;
- Cấu trúc swich…case
switch (biểu_thức)

42 | P a g e
{
case giá_trị_1: lệnh_1;[break;]
case giá_trị_2: lệnh_2;[break;]

case giá_trị_n: lệnh_n;[break;]
[default: lệnh_n+1; [break;]]
}
g) Cấu trúc lặp
- Vòng lặp for…
for (lệnh_1;biểu_thức_đk;lệnh_2) lệnh_chính;
- Vòng lặp while…
while (biểu_thức_đk) câu_lệnh;
- Vòng lặp do…while
do câu_lệnh; while(biểu_thức_đk);
h) Lệnh thay đổi cấu trúc lập trình
- Lệnh break; : Thoát khỏi vòng lặp
- Lệnh continue; : Kiểm tra điều kiện lặp, nếu điều kiện thỏa mãn tiếp tục thực hiện
vòng lặp
i) Các thao tác với mảng
- Khai báo mảng:
tên_kiểu_dữ_liệu tên_mảng[số_lượng_phần_tử];
- Gán giá trị cho n phần tử của mảng số nguyên a:
for (i=0;i<=n-1;i++) scanf("%d",&a[i]);
- Xuất n phần tử của mảng số nguyên a ra màn hình dưới dạng một dãy số:
for (i=0;i<=n-1; i++) printf("%d ",a[i]);
j) Thao tác với xâu kí tự
- Khai báo xâu kí tự:
char tên_xâu[số_kí_tự_max+1];
43 | P a g e
- Nhập xâu kí tự:
fflush(stdin); gets(tên_xâu);
- Xuất xâu kí tự:
puts(tên_xâu);
- Các thao tác với xâu:
- Hàm đo chiều dài xâu:
strlen(tên_xâu)
- Hàm so sánh xâu:
strcmp(xâu_1,xâu_2)
- Lệnh nối xâu:
strcat(xâu_1,xâu_2);
- Lệnh gán xâu
strcpy(xâu_1,xâu_2);
- Lệnh chuyển xâu thành dạng viết HOA:
strupr(tên_xâu);
- Lệnh chuyển xâu thành dạng viết thường:
strlwr(tên_xâu);
- Lệnh đảo ngược xâu:
strrev(tên_xâu);
k) Hàm
- Phân loại hàm:
- Hàm có tham số, có giá trị trả về
- Hàm không có tham số, không có giá trị trả về
- Hàm có tham số, không có giá trị trả về
- Hàm không có tham số, có giá trị trả về
- Cú báo khai báo hàm nguyên mẫu:
kiểu_dữ_liệu tên_hàm();

44 | P a g e
l) Cấu trúc
- Định nghĩa cấu trúc:
struct tên_cấu_trúc {
<khai báo các trường dữ liệu>;
};
Ví dụ:
struct sinh_vien{
char ho_ten[50];
int mssv;
int diem_thi;
char diem_chu;
};
- Khai báo biến kiểu cấu trúc:
struct tên_cấu_trúc tên_biến_kiểu_cấu_trúc;
- Truy cập đến các trường dữ liệu của cấu trúc:
tên_biến_kiểu_cấu_trúc.tên_trường

45 | P a g e
PHẦN 4: CODE MINH HỌA CHO 5 BÀI THỰC HÀNH
Bài 1:
#include <stdio.h>
int main()
{
int a,b,tong;
scanf("%d",&a);
scanf("%d",&b);
tong=a+b;
printf("%d",tong);
return 0;
}

Bài 2.1:
#include <stdio.h>
int main()
{
float a,b,tong;
scanf("%f",&a);
scanf("%f",&b);
tong=a+b;
printf("%f",tong);
return 0;
}

Bài 2.2:
#include <stdio.h>
int main()

46 | P a g e
{
float a,b, max;
scanf("%f",&a);
scanf("%f",&b);
max=a;
if (max<b)
max = b;
printf("%6.2f",max);
return 0;
}

Bài 2.3:
#include <stdio.h>
int main()
{
float x,y,min;
scanf("%f",&x);
scanf("%f",&y);
if (x<y)
min=x;
else
min=y;
printf("%6.2f",min);
return 0;
}

Bài 2.4:
#include <stdio.h>

47 | P a g e
int main()
{
float x,y,max ;
scanf("%f",&x);
scanf("%f",&y);
if (x>y)
max = x;
else
max=y;
printf("%6.2f",max);
return 0;
}

Bài 2.5:
#include <stdio.h>
main()
{
int a,b,c,tong;
scanf("%d",&a);
scanf("%d",&b);
scanf("%d",&c);
tong=a+b+c;
printf("%d\n",tong);
printf("%.6f",(float)tong/3);
return 0;
}

Bài 3.1:

48 | P a g e
#include <stdio.h>
#include <math.h>
int main()
{
double x,y,z;
scanf("%lf",&x);
scanf("%lf",&y);
scanf("%lf",&z);
double F=((x+y+z)/(pow(x,2)+pow(y,2)+1))-fabs(x-z*cos(y));
printf("%.6f",F);
return 0;
}

Bài 3.2:
#include<stdio.h>
int main()
{
float r;
float pi=3.14159;
scanf("%f",&r);
printf("%f\n",2*pi*r);
printf("%f",pi*r*r);
return 0;
}

Bài 3.3:
#include <stdio.h>
#include <math.h>

49 | P a g e
int main()
{
float x,y,f;
scanf("%f%f",&x,&y);
if(x!=y)
{
f=(pow(x,7)-pow(y,7))/(x-y);
}
else
{
f=7*pow(x,6);
}
printf("%f",f);
return 0;
}

Bài 3.4:
#include <stdio.h>
int main()
{
float A, B, C;
scanf("%f%f%f", &A, &B, &C);
printf("%f", A + B + C);
printf("\n%f", ( A + B + C )/3);
return 0;
}

Bài 3.5:

50 | P a g e
#include <stdio.h>
int main()
{
float X, Y;
float A, B, C;
scanf("%f",&X);
scanf("%f",&Y);
A=X*X+Y*Y;
B=(X+Y)*(X+Y);
C=(X-Y)*(X-Y);
printf("%.6f", A);
printf("\n%.6f", B);
printf("\n%.6f", C);
return 0;
}

Bài 3.6:
#include <stdio.h>
int main ()
{
int n,S;
scanf("%d",&n);
S=n*(n+1)/2;
printf("%d",S);
return 0;
}

Bài 4.1:

51 | P a g e
#include <stdio.h>
int main()
{
int n,A=1,i;
scanf ("%d",&n);
while(n<0||n>=8) scanf("%d",&n);
if (n==0) A=1;
else
for (i=1;i<=n;i++) A*=i;
printf("%d",A);
return 0;
}

Bài 4.2:
#include <stdio.h>
int main()
{
int n, g=0;
scanf("%d",&n);
if (n<=1) printf("Khong phai so nguyen to");
else{
int i;
for (i=2;i<n;i++)
if (n%i==0) {g=1;break;}
if (g==0) printf("La so nguyen to"); else printf("Khong
phai so nguyen to");
}
return 0;
}

52 | P a g e
Bài 4.3:
#include <stdio.h>
int main()
{
int n;
do
scanf("%d",&n);
while (n>=1000);
int a=0;
do
{
a=a+n%10;
n=n/10;
}while (n!=0);
printf("%d",a);
return 0;
}

Bài 4.4:
#include <stdio.h>
int main()
{
int a,b;
do{
scanf("%d",&a);
scanf("%d",&b);
} while ((a<=0)||(b<=0));
int c;

53 | P a g e
if (b<a) c=b;
else c=a;
int i,k,j;
for (i=c;i>=1;i--) if ((a%i==0)&&(b%i==0)) {k=i;break;}
if (b>a) c=b;
else c=a;
for (i=c;i<=(a*b);i++) if ((i%a==0)&&(i%b==0)) {j=i;break;}
printf("%d\n%d",k,j);
return 0;
}

Bài 4.5:
#include <stdio.h>
#include <math.h>
int main()
{
float a,b,c;
double delta;
scanf("%f%f%f",&a,&b,&c);
if(a<0) {a=-a;b=-b;c=-c;}
if(a==0)
{
if(b==0)
{
if(c==0) printf("Phuong trinh vo so nghiem");
else printf("Phuong trinh vo nghiem");
}
else printf("%.6f",-c/b);

54 | P a g e
}
else
{
delta=b*b-4*a*c;
if(delta==0) printf("%.6f",-b/2/a);
if(delta>0) printf("%.6f""\n%.6f",(-
b+sqrt(delta))/2/a,(-b-sqrt(delta))/2/a);
if(delta<0) printf("%.6f+%.6fi""\n%.6f-%.6fi",-
b/2/a,sqrt(-delta)/2/a,-b/2/a,sqrt(-delta)/2/a);
}
return 0;
}

Bài 4.6:
#include <stdio.h>
#include <math.h>
int main()
{
int n,z=1;
float x,s1=0,s2=0,s3=1;
do
scanf("%d\n%f",&n,&x);
while (n<1);
int a;
for(a=0;a<=n;a++) {
s1=s1+pow(x,a);
s2=s2+pow(-1,a)*pow(x,a);
}
for(a=1;a<=n;a++) {

55 | P a g e
z=z*a;
s3=s3+pow(x,a)/z;
}
printf("%1.6f\n%1.6f\n%1.6f",s1,s2,s3);
return 0;
}

Bài 5.1:
#include <stdio.h>
int main()
{
int a[100];
int n,i; scanf("%d",&n);
for(i=1;i<=n;i++) scanf("%d",&a[i]);
float M=0,m=0,N=0;
for(i=1;i<=n;i++)
if (a[i]<0) {M=M+a[i];m++;} else N=N+a[i];
if (m==0) printf("0 "); else printf("%f ",M/m);
if (n==0) printf("0") ; printf("%f",N);
return 0;
}

Bài 5.2:
#include <stdio.h>
int main()
{
int a[10000];
int n; scanf("%d",&n);

56 | P a g e
int i,j;
for(i=0;i<n;i++) scanf("%d",&a[i]);
int tg;
for(i=0;i<n-1;i++){
for(j =i+1; j <n; j++){
if(a[i] > a[j]){
tg = a[i];
a[i] = a[j];
a[j] = tg;
}
}
}
for(i=0;i<n-1;i++) printf("%d ",a[i]);
printf("%d",a[n-1]);
return 0;
}

Bài 5.3:
#include <stdio.h>
#include <string.h>
int main()
{
char s[150];
fflush(stdin); gets(s);
while( s[0] == ' ' ) strcpy(&s[0], &s[1]);
while( s[ strlen(s)-1 ] == ' ') s[ strlen(s)-1 ] = '\0';
int i;
for(i = 0; i < strlen(s); i++)

57 | P a g e
{
if( s[i] == ' ' && s[i+1] == ' ')
{
strcpy(&s[i], &s[i+1]);
i--;
}
}
strupr(s);
printf("%s:%d",s,strlen(s));
return 0;
}

Bài 5.4:
#include <stdio.h>
#include <string.h>
int main()
{
char s[51];
fflush(stdin); gets(s);
while(s[0] ==' ') strcpy(&s[0], &s[1]);
while(s[strlen(s)-1]==' ') s[strlen(s)-1]='\0';
int i;
for(i=0;i<=strlen(s)-1;i++)
{
if(s[i]==' '&&s[i+1]==' ')
{
strcpy(&s[i],&s[i+1]);
i--;

58 | P a g e
}
}
strupr(s);
puts(s);
return 0;
}

Bài 5.5:
#include <stdio.h>
#include <string.h>
int main()
{
int n;
char s[60];
char tmp[110][60];
scanf("%d",&n);
fflush(stdin); gets(s);
for(int i=0;i<n;i++)
{
gets(s);
while(s[0]==' ') strcpy(&s[0],&s[1]);
while(s[strlen(s)-1]==' ') s[strlen(s)-1] = '\0';
char sub[60];
for(int j=0;j<60;j++) sub[j] = '\0';
int t = 0;
int j = 0;
while (j < strlen(s))
{

59 | P a g e
while(s[j]==' ') j++;
if (s[j] <= 'z' && s[j] >='a') sub[t] = s[j] - 32;
else sub[t] = s[j];
t++;
for(j=j+1; j<strlen(s); j++)
{
if (s[j] == ' ')
{
sub[t] = ' ';
t++;
break;
}
if (s[j] >= 'A' && s[j] <= 'Z') sub[t] = s[j] + 32;
else sub[t] = s[j];
t++;
}
}
strcpy(tmp[i],sub);
}
for(int i=0;i<n-1;i++)
for(int j=i;j<n;j++)
if (strcmp(tmp[i],tmp[j])>0)
{
char k[60];
strcpy(k,tmp[j]);
strcpy(tmp[j],tmp[i]);
strcpy(tmp[i],k);
}
for(int i=0;i<n-1;i++)
60 | P a g e
{
printf("(%d)%s\n",i+1,tmp[i]);
}
printf("(%d)%s",n,tmp[n-1]);
return 0;
}

61 | P a g e

You might also like