1. Xuất chuỗi khởi tạo ra màn hình
Mục tiêu: Viết chương trình đơn giản nhất để hiển thị thông điệp "Hello world!" lên bảng điều khiển.
Dữ liệu đầu vào: Không yêu cầu nhập liệu.
Dữ liệu đầu ra: Hiển thị dòng văn bản "Hello world!".
Đoạn mã mẫu:
#include<stdio.h>
int main(void) {
printf("Hello world!\n");
return 0;
}
2. In hình tam giác ngược
Mục tiêu: Sắp xếp các dấu sao (*) thành dạng hình tam giác ngược chính xác theo định dạng quy định.
Dữ liệu đầu vào: Không yêu cầu nhập liệu.
Dữ liệu đầu ra: 4 hàng ký tự, mỗi hàng giảm dần một dấu sao và được thụt lề đúng vị trí.
| Kiểu đầu vào | Giá trị trả về |
|---|---|
| (Không) | * * * *\n * * *\n * *\n * |
Đoạn mã mẫu:
#include<stdio.h>
int main(void) {
printf("* * * *\n");
printf(" * * *\n");
printf(" * *\n");
printf(" *\n");
return 0;
}
3. Thực hiện dãy phép toán số nguyên
Mục tiêu: Đọc hai số nguyên từ bàn phím và tính toán toàn bộ 5 phép toán cơ bản: cộng, trừ, nhân, chia lấy nguyên và modulo.
Dữ liệu đầu vào: Một dòng chứa hai số nguyên cách nhau bởi khoảng trắng.
Dữ liệu đầu ra: Năm dòng kết quả, mỗi dòng thể hiện cú pháp `SốA{toán_tử}SốB={kết_quả}`.
Lưu ý: Khi in ký tự phần dư %, cần dùng %% trong chuỗi định dạng printf.
Đoạn mã mẫu:
#include<stdio.h>
int main(void) {
int lhs, rhs;
if (scanf("%d %d", &lhs, &rhs) != 2) return 1;
printf("%d+%d=%d\n", lhs, rhs, lhs + rhs);
printf("%d-%d=%d\n", lhs, rhs, lhs - rhs);
printf("%d*%d=%d\n", lhs, rhs, lhs * rhs);
printf("%d/%d=%d\n", lhs, rhs, lhs / rhs);
printf("%d%% %d=%d\n", lhs, rhs, lhs % rhs);
return 0;
}
4. Phân tách chữ số và tính tổng
Mục tiêu: Nhận diện một số có ba chữ số, trích xuất giá trị từng hàng trăm, chục, đơn vị và trả về tổng của chúng.
Dữ liệu đầu vào: Một số nguyên dương gồm đúng ba chữ số.
Dữ liệu đầu ra: Một số nguyên duy nhất là kết quả tổng các chữ số.
Đoạn mã mẫu:
#include<stdio.h>
int main(void) {
int number, hundred, ten, unit, total_digits;
scanf("%d", &number);
hundred = number / 100;
ten = (number % 100) / 10;
unit = number % 10;
total_digits = hundred + ten + unit;
printf("%d", total_digits);
return 0;
}
5. Tính diện tích đa giác theo công thức Heron
Mục tiêu: Nhập độ dài ba cạnh của tam giác và áp dụng công thức海伦秦九韶 (Heron) để tìm diện tích chính xác đến hai chữ số thập phân.
Dữ liệu đầu vào: Ba số thực biểu diễn chiều dài cạnh a, b, c.
Dữ liệu đầu ra: Giá trị diện tích đã làm tròn 2 chữ số sau dấu phẩy.
Gợi ý: Hàm căn bậc hai nằm trong thư viện math.h.
Đoạn mã mẫu:
#include<stdio.h>
#include<math.h>
int main(void) {
double side_a, side_b, side_c;
double semi_p, area_val;
scanf("%lf %lf %lf", &side_a, &side_b, &side_c);
semi_p = (side_a + side_b + side_c) / 2.0;
area_val = sqrt(semi_p * (semi_p - side_a) * (semi_p - side_b) * (semi_p - side_c));
printf("%.2f", area_val);
return 0;
}
6. Tra cứu mã bảng mã ASCII
Mục tiêu: Chuyển đổi một ký tự nhập từ bàn phím sang giá trị số nguyên thập phân tương ứng trong bảng mã ASCII.
Dữ liệu đầu vào: Một ký tự đơn.
Dữ liệu đầu ra: Số nguyên đại diện cho mã ASCII.
Đoạn mã mẫu:
#include<stdio.h>
int main(void) {
char target_char;
scanf(" %c", &target_char);
printf("%d", target_char);
return 0;
}
7. Phương pháp mã hóa dịch chuyển ký tự
Mục tiêu: Xây dựng cơ chế mã hóa đơn giản bằng cách thay thế mỗi ký tự gốc bằng ký tự đứng sau nó 3 vị trí trong bảng mã.
Dữ liệu đầu vào: Hai ký tự liên tiếp không cách ngăn.
Dữ liệu đầu ra: Chuỗi ký tự đã được biến đổi.
Đoạn mã mẫu:
#include<stdio.h>
int main(void) {
char src_one, src_two;
char enc_one, enc_two;
scanf("%c%c", &src_one, &src_two);
enc_one = src_one + 3;
enc_two = src_two + 3;
printf("%c%c", enc_one, enc_two);
return 0;
}
8. Giải hệ phương trình bài toán Gà - Thỏ
Mục tiêu: Dựa trên tổng số đầu và tổng số chân, suy luận ngược lại số lượng từng loại vật nuôi.
Dữ liệu đầu vào: Hai số nguyên lần lượt là số đầu (h) và số chân (f).
Dữ liệu đầu ra: Thông báo số thỏ và số gà theo định dạng chỉ định.
Đoạn mã mẫu:
#include<stdio.h>
int main(void) {
int total_heads, total_legs, rabbit_cnt, chicken_cnt;
scanf("%d %d", &total_heads, &total_legs);
rabbit_cnt = (total_legs / 2) - total_heads;
chicken_cnt = total_heads - rabbit_cnt;
printf("rabbit=%d,chicken=%d", rabbit_cnt, chicken_cnt);
return 0;
}
9. Tính gia tốc tăng tốc độ máy bay phản lực
Mục tiêu: Áp dụng các đẳng thức động học để tìm gia tốc (a) khi biết vận tốc cất cánh (v) và quãng đường trượt (s). Vận tốc đầu vào đơn vị km/h cần chuyển đổi sang m/s trước khi tính.
Dữ liệu đầu vào: Vận tốc cất cánh (km/h) và khoảng cách弹射器 (m).
Dữ liệu đầu ra: Gia tốc a làm tròn 2 chữ số thập phân.
Đoạn mã mẫu:
#include<stdio.h>
int main(void) {
double vel_kmh, distance_m, vel_ms, acceleration;
scanf("%lf %lf", &vel_kmh, &distance_m);
vel_ms = vel_kmh / 3.6;
acceleration = (vel_ms * vel_ms) / (2.0 * distance_m);
printf("%.2f", acceleration);
return 0;
}
10. Quy tắc tính thời gian phạt trong kỳ thi lập trình
Mục tiêu: Tính tổng điểm phạt dựa trên thời gian hoàn thành bài toán và số lần nộp sai. Mỗi lỗi bị phạt cộng thêm 20 phút vào mốc thời gian làm đúng.
Dữ liệu đầu vào: Giờ:phút bắt đầu, Giờ:phút hoàn thành, số lần nộp sai (≥0).
Dữ liệu đầu ra: Tổng phút phạt.
Đoạn mã mẫu:
#include<stdio.h>
int main(void) {
int s_hour, s_min, e_hour, e_min, error_count;
int elapsed_minutes, penalty_total;
scanf("%d:%d %d:%d %d", &s_hour, &s_min, &e_hour, &e_min, &error_count);
elapsed_minutes = (e_hour * 60 + e_min) - (s_hour * 60 + s_min);
penalty_total = elapsed_minutes + (error_count * 20);
printf("%d", penalty_total);
return 0;
}
11. Chuyển đổi khoảng thời gian giây sang định dạng lịch
Mục tiêu: Từ mốc thời gian chuẩn (01/01/2011 00:00:00), tính toán xem sau N giây sẽ rơi vào ngày nào. Coi chuẩn hóa 1 năm = 12 tháng, 1 tháng = 30 ngày.
Dữ liệu đầu vào: Một số nguyên N biểu diễn tổng giây đã trôi qua.
Dữ liệu đầu ra: Ba số nguyên cách nhau: Năm, Tháng, Ngày.
Đoạn mã mẫu:
#include<stdio.h>
int main(void) {
long long total_sec;
int year_offset, day_in_year, month_idx, day_idx;
scanf("%lld", &total_sec);
// 1 năm giả định = 360 ngày = 31,536,000 giây
year_offset = total_sec / (360 * 24 * 3600);
day_in_year = total_sec % (360 * 24 * 3600);
month_idx = day_in_year / (30 * 24 * 3600);
day_idx = (day_in_year % (30 * 24 * 3600)) / (24 * 3600);
printf("%d %d %d", 2011 + year_offset, 1 + month_idx, 1 + day_idx);
return 0;
}
12. Đo đếm thời gian di chuyển của tàu hỏa
Mục tiêu: Nhập giờ phút khởi hành và giờ phút đích dưới dạng số nguyên 4 chữ số (HHMM), tính chênh lệch thời gian và xuất ra định dạng hh:mm.
Dữ liệu đầu vào: Thời gian bắt đầu và thời gian kết thúc (giống định dạng HHMM).
Dữ liệu đầu ra: Khoảng thời gian di chuyển định dạng hh:mm (thường xuyên hóa 2 chữ số).
Đoạn mã mẫu:
#include<stdio.h>
int main(void) {
int dep_time, arr_time;
int diff_hours, diff_minutes;
scanf("%d %d", &dep_time, &arr_time);
diff_hours = (arr_time / 100) - (dep_time / 100);
diff_minutes = (arr_time % 100) - (dep_time % 100);
if (diff_minutes < 0) {
diff_minutes += 60;
diff_hours -= 1;
}
printf("%02d:%02d", diff_hours, diff_minutes);
return 0;
}
13. Tính lượng vật liệu lát mặt sàn hình chữ nhật
Mục tiêu: Xác định số lượng tấm đá vuông kích thước a×a tối thiểu để phủ kín khu vực sân rộng n×m. Không được cắt vỡ tấm đá, cho phép phần nhô ra ngoài biên.
Dữ liệu đầu vào: Chiều rộng n, chiều dài m và kích thước tấm đá a.
Dữ liệu đầu ra: Tổng số tấm đá cần thiết.
Đoạn mã mẫu:
#include<stdio.h>
int main(void) {
long long dim_n, dim_m, tile_a;
long long plates_along_n, plates_along_m, total_plates;
scanf("%lld %lld %lld", &dim_n, &dim_m, &tile_a);
// Công thức làm tròn lên khi chia nguyên
plates_along_n = (dim_n + tile_a - 1) / tile_a;
plates_along_m = (dim_m + tile_a - 1) / tile_a;
total_plates = plates_along_n * plates_along_m;
printf("%lld", total_plates);
return 0;
}
14. Xác định số ngày trong tháng hai theo điều kiện nhuận
Mục tiêu: Trả về 29 ngày nếu năm nhuận, ngược lại là 28 ngày.
Hạn chế kỹ thuật: Tuyệt đối không sử dụng cấu trúc rẽ nhánh if hay câu lệnh switch, cũng như toán tử tam nguyên (? :).
Dữ liệu đầu vào: Chuỗi boolean "true" hoặc "false".
Dữ liệu đầu ra: Số nguyên đại diện ngày trong tháng 2.
Đoạn mã mẫu:
#include<stdio.h>
int main(void) {
char status_str[10];
int leap_days[] = { 28, 29 };
int result_index;
scanf("%s", status_str);
// Kiểm tra ký tự đầu tiên để đánh chỉ mục mảng
result_index = (status_str[0] == 't') ? 1 : 0;
printf("%d", leap_days[result_index]);
return 0;
}