Bài giảng Kỹ thuật lập trình: Bài 6 do TS. Ngô Hữu Dũng biên soạn cung cấp cho người học các kiến thức: Hàm nhập phân số - Trả về kiểu cấu trúc, tham biến và kiểu con trỏ, truyền tham biến dùng kiểu con trỏ, hàm nhập mảng kiểu cấu trúc, hàm nhập mảng kiểu cấu trúc – dùng con trỏ,...
Trang 1Kỹ thuật lập trình
Bài 6 – Một số bài toán kiểu cấu trúc
TS Ngô Hữu Dũng
Trang 2Bài toán phân số
Xây dựng dữ liệu cấu trúc
Kiểu trả về của hàm là cấu trúc
Cách 2: Truyền tham biến
Đối số là tham biến
Hàm không có kiểu trả về
1 struct t_phso{
3 };
4 struct t_phso nhapPS();
5 void nhapPS2( struct t_phso*);
Trang 3Hàm nhập phân số - Trả về kiểu cấu trúc
1 struct t_phso nhapPS(){ // Trả về kiểu struct
Trang 4Hàm nhập phân số - Truyền tham biến
1 void nhapPS2( struct t_phso *ps ) // Tham biến
2 {
3 printf( "Nhap tu so: " );
4 scanf( "%d" ,&ps->tuso); // Dùng dấu ->
Trang 5Chú ý C và C++
Hàm bên là cách viết
của C++
Khai báo biến, đối số
không cần viết struct
1 void nhapPS3( t_phso &);
2 void nhapPS3(t_phso &ps )
Trang 6Tham biến và kiểu con trỏ
Trong C chuẩn, để truyền tham
biến, ta dùng kiểu con trỏ
p : Địa chỉ ô nhớ của biến
*p : Giá trị của biến
Sẽ học kỹ ở phần sau
2 int *p; // Biến con trỏ
Trang 7Truyền tham biến dùng kiểu con trỏ
1 void swap ( int *px , int *py ) // Hoán vị
2 {
3 int temp = *px; // Dùng dấu *
4 *px = *py; // để truy cập giá trị
Trang 8Mảng kiểu cấu trúc
Khai báo mảng một chiều
Kiểu cấu trúc phân số
2 void nhapMangPS( struct t_phso [] , int );
4 struct t_phso mps[MAX];
Trang 96 printf( "Nhap phan so thu %d: \n" ,i+1);
8 }
9 }
10 // Cách viết: for( int i = 0 ;…) là C++
11 // m[] là tham biến, không cần dùng con trỏ
Trang 10Nhập mảng kiểu cấu trúc
1 // Khai báo mảng kiểu cấu trúc
2 struct t_phso mps [MAX] ;
3 // Nhập số phần tử của mảng
4 do {
6 scanf( "%d" ,&n);
7 } while (!(n>0 && n<=MAX)); //Kiểm tra điều kiện
8 // Hoặc while(n<=0 || n>MAX);
10 // Truyền tham biến cho mảng không cần truyền
địa chỉ (&mps)
Trang 11Hàm nhập mảng kiểu cấu trúc – dùng con trỏ
1 void nhapMangPS( struct t_phso *m , int n)
Trang 12Phép toán trên mảng cấu trúc
Viết hàm tính tổng các phân số trên mảng
Input: Mảng phân số kiểu cấu trúc, số phần tử của mảng
Output: Trả về kết quả là phân số kiểu cấu trúc
Gợi ý giải thuật
Viết hàm tính tổng hai phân số
Quy đồng mẫu số
Thực hiện phép cộng tử số
Rút gọn phân số kết quả
Tìm ước số chung lớn nhất của tử số và mẫu số (viết hàm riêng)
Chia tử số và mẫu số cho ước số chung lớn nhất
Lần lượt gọi hàm tính tổng hai phân số để tính tổng mảng các phân số
Trang 13Tổng mảng phân số
1 struct t_phso congMangPS( struct t_phso[], int );
2 struct t_phso congPS( struct t_phso, struct t_phso);
3 int UCLN( int , int );
4 struct t_phso congMangPS( struct t_phso mps[], int n)
Trang 16Vận dụng mảng cấu trúc - Quản lý điểm
Viết chương trình quản lý điểm và phân tích thống kê lớp học (20sv)
Mỗi bảng ghi sinh viên gồm: ID, tên, giới tính, điểm thường kỳ, giữa kỳ,
cuối kỳ và điểm tổng kết (20% ĐTK + 30% ĐGK + 50% ĐCK).
Chương trình hiển thị menu danh sách các tác vụ để người dùng lựa chọn
1 Thêm một bảng ghi sinh viên
2 Xem tất cả danh sách bảng điểm của sinh viên
3 Xóa một bảng ghi sinh viên
4 Cập nhật một bảng ghi sinh viên
5 Tìm kiếm sinh viên bằng ID
6 Hiển thị sinh viên có số điểm cao nhất, thấp nhất
7 Sắp xếp danh sách sinh viên theo điểm tổng kết
8 Thoát chương trình
Trang 17Cấu trúc dữ liệu, header
2 void addRecord(t_student, int *);
3 void showAllRecords(t_student, int );
4 void deleteRecord(t_student, int *);
5 void updateRecord(t_student, int );
6 void findStudent(t_student, int );
7 void showMaxScore(t_student, int );
8 void sortByScore(t_student, int );
9 int search(t_student, int , int );
10 void updateID(t_student, int , int );
11 void showRecord(t_student, int );
12 void deleteID(t_student, int *, int );
13 void showMenu();
Trang 185. showMenu(); // Gọi hàm hiển thị menu
6. printf( "Enter your action: " );
7. scanf( "%d" , &act);
8. switch (act){
9. case 1: addRecord(records,&n); break ;
10. case 2: showAllRecords(records,n); break ;
11. case 3: deleteRecord(records,&n); break ;
12. case 4: updateRecord(records,n); break ;
13. case 5: findStudent(records,n); break ;
14. case 6: showMaxScore(records,n); break ;
15. case 7: sortByScore(records,n); break ;
17. } while (act!=8);
18. }
Trang 19Hiển thị menu
1 void showMenu()
2 {
3 printf( " -MENU - Student records -\n" );
4 printf( "1 Add a record\n" );
5 printf( "2 Show all student records\n" );
6 printf( "3 Delete a record\n" );
7 printf( "4 Update a record\n" );
8 printf( "5 Find a student by ID\n" );
9 printf( "6 Show student who gets max total score\n" );
10 printf( "7 Sort records by total score\n" );
11 printf( "8 Exit\n" );
12 }
Trang 20Chức năng 1 - Thêm bảng ghi
1 void addRecord(t_student rec[], int *n)
7 if (search(rec,*n,sID)>-1) // Gọi hàm search
8 printf( "This ID already exists\n" );
9 } while (search(rec,*n,sID)>-1); // Kiểm tra ID
10 updateID(rec,sID,*n); // Gọi hàm updateID
11 printf( "Student %d was added\n" , sID);
12 (*n)++; // Tăng số bảng ghi
13 }
Trang 22Cập nhật thông tin cho một ID
1 void updateID(t_student rec[], int sID, int n)
2 {
3 rec[n].ID=sID;
4 printf( "Enter name: " ); scanf( "%s" ,&rec[n].name);
5 printf( "Enter sex: " ); scanf( "%s" ,&rec[n].sex);
6 printf( "Enter regular score: " );
Trang 23Chức năng 2 - Hiển thị tất cả các bảng ghi
1 void showAllRecords(t_student rec[], int n)
Trang 25Chức năng 3 – Xóa bảng ghi
1 void deleteRecord(t_student rec[], int *n)
11 deleteID(rec,n,num); // Gọi hàm xóa bảng ghi
12 printf( "Student %d was delelted\n" , sID);
13 }
Trang 26Hàm xóa bảng ghi thứ num
Trang 2711 updateID(rec,sID,num); // Gọi hàm, đã định nghĩa
12 printf( "Student %d was updated\n" , sID);
13 }
Trang 28Chức năng 5 – Tìm kiếm một bảng ghi
1 void findStudent(t_student rec[], int n)
Trang 29Chức năng 6 – Tìm sinh viên có điểm cao nhất
1 void showMaxScore(t_student rec[], int n)
Trang 30Chức năng 7 – Sắp xếp bảng ghi theo điểm
1 void sortByScore(t_student rec[], int n)