PHẦẦN TH C HÀNHỰVí D 1: ụ Biên d ch chịươ ng trình đầầu tiênA: Code Chươ ng Trình// hello.c#include void hello{printf"Hello world...!. //hello2.c#include void hello2int i{ printf"Hello p
Trang 1TRƯỜNG ĐẠI HỌC TÔN ĐỨC THẮNG KHOA CÔNG NGHỆ THÔNG TIN
BÁO CÁO BÀI TẬP NMHĐH
HK2, 2022-2023
Lab 3
1: Ngô Xuân Bình ( MSSV: 52200270)
Trang 2B: Kếết Qu Demo ả 3
V Í D 2: T Ụ RUYÊẦN VÀ IN ĐỐỐI SỐỐ RA MÀN HÌNH 3
A: Code Ch ươ ng Trình 3
B: Kếết Qu Demo ả 4
V Í D 3: Ụ Ứ NG D NG Ụ THƯ VI N Ệ TĨNH VÀ TH Ư VI N Ệ Đ NG Ộ 4
A: Code Ch ươ ng Trình 4
B: Kếết Qu Demo ả 5
V Í D 4: T Ụ IÊỐN TRÌNH CĂN B N Ả 6
A: Code Ch ươ ng Trình 6
B: Kếết qu Demo ả 7
B PHẦẦN BÀI T P Ậ 8
BÀI 1: V IÊỐT CH ƯƠ NG TRÌNH SAU CHO KHI TRUYÊẦN ĐỐỐI SỐỐ N VÀO THÌ XUẦỐT RA T NG Ổ S = 1 + 2 + … + N 8
A: Code Ch ươ ng Trình: 8
B: Kếết Qu Demo: ả 9
BÀI 2: V IÊỐT CH ƯƠ NG TRÌNH NH P Ậ SỐỐ L ƯỢ NG PHẦẦN TỬ C A Ủ M NG Ả TỪ BIÊỐN MỐI TR ƯỜ NG , SAU ĐÓ NH P Ậ GIÁ TRỊ C A Ủ CÁC PHẦẦN T Ử TRONG M NG Ả VÀ TÍNH T NG Ổ C A Ủ CÁC PHẦẦN TỬ ĐÓ 9
A: Code Ch ươ ng Trình: 9
B: Kếết Qu Demo: ả 11
BÀI 3: T Ạ O T P Ệ LIB 1 C ĐỂ TÍNH T NG Ổ CÁC SỐỐ TỪ 1 ĐÊỐN N ; T P Ệ LIB 2 C CH A Ứ HÀM GIAI TH A Ừ CHO GIÁ TRỊ NGUYÊN TỪ 1 ĐÊỐN N , TRONG ĐÓ N LÀ ĐỐỐI SỐỐ ĐẦẦU VÀO VÀ N LÀ M T Ộ SỐỐ NGUYÊN D ƯƠ NG 12
A) T Ạ O THƯ VI N Ệ TĨNH LIBS S ; T Ạ O T P Ệ SELECTS C V I Ớ HÀM MAIN T RONG HÀM MAIN NÊỐU ARGV , [1] = 1, TH C Ự HI N Ệ TÍNH T NG Ổ TỪ 1 ĐÊỐN ARGV [2], NG ƯỢ C L I Ạ TH C Ự HI N Ệ TÍNH GIAI TH A Ừ TỪ 1 ĐÊỐN ARGV [2] - NHỚ S Ử D NG Ụ LIÊN KÊỐT THƯ VI N Ệ 12
B) T Ạ O THƯ VI N Ệ Đ NG Ộ LIBD D ; T Ạ O T P Ệ SELECTD C V I Ớ HÀM MAIN T RONG HÀM MAIN NÊỐU ARGV , [1] = 1, TH C Ự HI N Ệ TÍNH T NG Ổ TỪ 1 ĐÊỐN ARGV [2], NG ƯỢ C L I Ạ TH C Ự HI N Ệ TÍNH GIAI TH A Ừ TỪ 1 ĐÊỐN ARGV [2] - NHỚ S Ử D NG Ụ LIÊN KÊỐT THƯ VI N Ệ 12
A: Code Ch ươ ng Trình 12
B: Kếết Qu Demo: ả 16
BÀI 4: T Ạ O M T Ộ TIÊỐN TRÌNH TRONG CẦY TH Ư M C Ụ SAU TÊN IN GHI CHÚ , ID TIÊỐN TRÌNH , ID C A Ủ TIÊỐN TRÌNH CHA : 18
A: Code Ch ươ ng Trình 18
B: Kếết Qu Demo: ả 19
C KẾẾT LU N Ậ 20
Trang 5Tạo thư viên tĩnh libh.a từ 2 file hello1.c và hello2.c
Tạo thư viện động libd.a từ 2 file hello1.c và hello2.c
B: Kêết Qu Demoả
Chạy bằng thư viên tĩnh
Trang 6Chạy bằng thư viên động
Trang 7int main()
{
printf("current process ID: %d\n", getpid());
printf("parent process ID: %d\n", getppid());
Trang 9// Nhập giá trị của n từ người dùng
printf("Nhập vào một số nguyên dương n: ");
if (scanf("%d", &n) != 1 || n <= 0) {
// Xử lý ngoại lệ: Nếu người dùng nhập không phải số nguyên dương // hoặc số âm, thì hiển thị thông báo và kết thúc chương trình printf("Vui lòng nhập một số nguyên dương.\n");
return 1; // Kết thúc chương trình với mã lỗi 1
}
// Tính tổng sử dụng vòng lặp
for (int i = 1; i <= n; i++) {
sum += i; // Cộng giá trị i vào tổng
}
// Hiển thị kết quả
printf("Tổng của %d số nguyên dương đầu tiên là: %d\n", n, sum);
return 0; // Kết thúc chương trình thành công
}
B: Kêết Qu Demo:ả
Báo lỗi nếu lời gọi có đối số không phải là một số nguyên dương
Trang 10BÀI : Viêết ch2 ươ ng trình nh p sốế lậ ượ ng phầần t c a m ng t biêến mối ử ủ ả ừ
tr ng, sau đó nh p giá tr c a các phầần t trong m ng và tính t ng
int num_elements = atoi(env_var); // Chuyển đổi giá trị từ biến môi trường thành số nguyên
// Kiểm tra xem giá trị của num_elements có hợp lệ hay không
if (num_elements <= 0) {
printf("Giá trị của NUM_ELEMENTS không hợp lệ.\n");
Trang 11return 1; // Kết thúc chương trình với mã lỗi 1 nếu giá trị không hợp lệ }
int sum = 0;
int element;
// Nhập giá trị của các phần tử và tính tổng
printf("Nhập giá trị cho %d phần tử:\n", num_elements);
for (int i = 0; i < num_elements; i++) {
printf("Phần tử %d: ", i + 1);
if (scanf("%d", &element) != 1) {
// Xử lý ngoại lệ: Nếu nhập không phải số nguyên, hiển thị thông báo lỗi
và kết thúc
printf("Lỗi: Vui lòng nhập số nguyên.\n");
return 1; // Kết thúc chương trình với mã lỗi 1
}
sum += element;
}
// Hiển thị tổng
printf("Tổng của các phần tử là: %d\n", sum);
return 0; // Kết thúc chương trình thành công
}
Trang 12a Báo lỗi nếu không cài biến môi trường
b Báo lỗi nếu lời gọi có đối số không phải là một số nguyên dương
Trang 13BÀI : T o t p lib1.c đ tính t ng các sốế t 1 đêến n; t p lib2.c ch a 3ạ ệ ể ổ ừ ệ ứ
hàm giai th a cho giá tr nguyên t 1 đêến n, trong đó n là đốếi sốế đầầu ừ ị ừ
vào và n là m t sốế nguyên dộ ương
A) T o th vi n tĩnh libs.s; T o t p selects.c v i hàm main Trong
hàm main, nêếu argv[1] = 1, th c hi n tính t ng t 1 đêến argv[2], ự ệ ổ ừ
ng c l i th c hi n tính giai th a t 1 đêến argv[2] - nh s d ng liên
kêết th vi n.ư ệ
B) T o th vi n đ ng libd.d; T o t p selectd.c v i hàm main Trong
hàm main, nêếu argv[1] = 1, th c hi n tính t ng t 1 đêến argv[2], ự ệ ổ ừ
ng c l i th c hi n tính giai th a t 1 đêến argv[2] - nh s d ng liên
printf("Lỗi: n phải là số nguyên dương.\n");
return -1; // Kết thúc chương trình với mã lỗi -1
Trang 14if (n < 1) {
printf("Lỗi: n phải là số nguyên dương.\n"); return -1; // Kết thúc chương trình với mã lỗi -1 }
#include "lib1.c" // Sử dụng thư viện tính tổng
#include "lib2.c" // Sử dụng thư viện tính giai thừa
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Sử dụng: %s [1|2] [n]\n", argv[0]); return 1;
Trang 15}
int option = atoi(argv[1]);
int n = atoi(argv[2]);
if (option != 1 && option != 2) {
printf("Lựa chọn không hợp lệ Sử dụng 1 để tính tổng hoặc 2 để tínhgiai thừa.\n");
Trang 16if (option != 1 && option != 2) {
printf("Lựa chọn không hợp lệ Sử dụng 1 để tính tổng hoặc 2 để tínhgiai thừa.\n");
return 1;
}
void *lib; // Con trỏ thư viện động
int (*calculate)(int); // Con trỏ hàm tính tổng hoặc giai thừa
// Mở thư viện động libd.d
lib = dlopen("./libd.d", RTLD_LAZY);
if (!lib) {
printf("Lỗi khi mở thư viện động.\n");
return 1;
}
Trang 17// Liên kết động hàm tính tổng hoặc giai thừa
printf("Lỗi khi liên kết động hàm.\n");
dlclose(lib); // Đóng thư viện động
printf("Giai thừa của %d là: %d\n", n, result); }
}
dlclose(lib); // Đóng thư viện động
return 0;
Trang 18f) Biên dịch lib1.c và lib2.c thành thư viên động:
g) Biên dịch selects.c
h) Biên dịch selectd.c
Trang 19B: Kêết Qu Demo:ả
a) Kết quả chạy thử của selects.c với thư viên tĩnh libs.s
- Một số trường hợp phát sinh lỗi
b) Kết quả chạy thử của selectd.c với thư viện động libd.d
- Một số trường hợp phát sinh lỗi
Trang 20BÀI 4: T o m t tiêến trình trong cầy th m c sau tên in ghi chú, ID tiêến ạ ộ ư ụ
Trang 23C KẾẾT LU N Ậ
Sau khi học và hoàn thành phần lab 3 nhóm thu được kết sau:
- Biết được cách biên dịch và chạy chương trình C cơ bản trên hệ điều hành linux.
- Biết được cách ứng dụng thư viên tĩnh và động vào trong các chương trình C.
- Liên tục thực hành và thuần thục cách điều khiển command-line trên
hệ điều hành linux.
- Hiểu được cơ chế hoạt động của tiến trình trong hệ điều hành