MỤC TIÊU:
- Biết cách định nghĩa kiểu dữ liệu cấu trúc
- Biết cách sử dụng thuật toán sắp xếp, tìm kiếm
LÝ THUYẾT:
Cấu trúc hay struct:
- Một kiểu dữ liệu do người dùng tự định nghĩa (user defined datatype), cho phép bạn kết hợp các dữ liệu khác kiểu nhau.
- Mỗi phần tử của một cấu trúc được gọi là một thành viên (member).
Khởi tạo:
- Khởi tạo structure bằng cách sử dụng từ khóa struct.
- Struct có dạng:
struct <structure_name>
{
data_type member1;
data_type member2;
...
data_type memeberN;
} [một hoặc nhiều biến cấu trúc];
Ví dụ: Tạo cấu trúc có tên SinhVien gồm các trường dữ liệu:
maSinhVien, tenSinhVien, diemTrungBinh;
Code:
struct SinhVien{
char maSinhVien[10];
char tenSinhVien[50];
float diemTrungBinh;
};
Khai báo trong hàm main:
#include<stdio.h>
struct SinhVien{
char maSinhVien[10];
char tenSinhVien[50];
float diemTrungBinh;
};
int main(){
struct SinhVien a;
}
Khai báo dùng alias:
#include<stdio.h>
struct SinhVien{
char maSinhVien[10];
char tenSinhVien[50];
float diemTrungBinh;
};
typedef struct SinhVien SV;
int main(){
SV a;
}
Cách truy cập:
Truy cập các thành viên trong struct sử dụng dấu chấm (.), nếu viết dạng con trỏ thì sử dụng dấu trừ + mũi tên "->"
Ví dụ 1:
#include<stdio.h>
struct SinhVien{
char maSinhVien[8];
char tenSinhVien[50];
float diemTrungBinh;
};
typedef struct SinhVien SV;
int main(){
SV a = {"PS12345", "Nguyen Van A", 8.5};
printf ("\nThong tin sinh vien 'a'");
printf ("\nMa so SV: %s", a.maSinhVien);
printf ("\nHo ten SV: %s", a.tenSinhVien);
printf ("\nDiem trung binh cac mon: %.1f", a.diemTrungBinh);
}
Ví dụ 2: Chỉ hoạt động trên C
(lưu file .C), KHÔNG chạy trên C++
#include<stdio.h>
struct SinhVien{
char maSinhVien[8];
char tenSinhVien[50];
float diemTrungBinh;
};
typedef struct SinhVien SV;
int main(){
// cách khai báo này chỉ hoạt động trên C, KHÔNG chạy trên C++
SV b = {.maSinhVien = "PS56789", .tenSinhVien = "Nguyen Van B", .diemTrungBinh = 9.5};
printf ("\n\nThong tin sinh vien 'b'");
printf ("\nMa so SV: %s", b.maSinhVien);
printf ("\nHo ten SV: %s", b.tenSinhVien);
printf ("\nDiem trung binh cac mon: %.1f", b.diemTrungBinh);
}
Ví dụ 3:
- Cú pháp bị lỗi: [Error] assignment to expression with array type
int main(){
SV c;
c.maSinhVien = "PS99999";
c.tenSinhVien = "Tony Teo";
}
- Hướng khắc phục: Gán giá trị thành chuỗi, sử dụng hàm strcpy
int main(){
SV c;
strcpy(c.maSinhVien, "PS99999");
strcpy(c.tenSinhVien, "Tony Teo");
}
Full code:
#include<stdio.h>
struct SinhVien{
char maSinhVien[8];
char tenSinhVien[50];
float diemTrungBinh;
};
typedef struct SinhVien SV;
int main(){
SV c;
strcpy(c.maSinhVien, "PS99999");
strcpy(c.tenSinhVien, "Tony Teo");
c.diemTrungBinh = 9.5;
printf ("\n\nThong tin sinh vien 'c'");
printf ("\nMa so SV: %s", c.maSinhVien);
printf ("\nHo ten SV: %s", c.tenSinhVien);
printf ("\nDiem trung binh cac mon: %.1f", c.diemTrungBinh);
}
Ví dụ:
Viết chương trình nhập thông tin sinh viên bao gồm các trường: maSinhVien,
tenSinhVien, diemTrungBinh
Input: Nhập thông tin maSinhVien, tenSinhVien, diemTrungBinh từ bàn phím
Output: Xuất ra thông tin sinh viên vừa nhập
a. Viết thông thường:
#include<stdio.h>
struct SinhVien{
char maSinhVien[8];
char tenSinhVien[50];
float diemTrungBinh;
};
typedef struct SinhVien SV;
int main(){
SV sv;
printf("\nNhap ma so SV: "); scanf("%s", &sv.maSinhVien);
printf("\nNhap ho ten SV: ");
getchar(); // để đọc phím enter, nếu không có sẽ trôi lệnh gets
//fflush(stdin); // xóa vùng nhớ đệm
gets(sv.tenSinhVien);// đọc chuỗi nhập từ bàn phím, CHẤP NHẬN chuỗi có khoảng trắng
printf("\nNhap diem trung binh: "); scanf("%f", &sv.diemTrungBinh);
printf ("\n\nThong tin sinh vien:");
printf ("\nMa so SV: %s", sv.maSinhVien);
printf ("\nHo ten SV: %s", sv.tenSinhVien);
printf ("\nDiem trung binh cac mon: %.1f", sv.diemTrungBinh);
}
Noted:
- getchar(); để đọc phím enter, nếu không có sẽ trôi lệnh gets
- có thể dùng fflush(stdin) thay vì getchar(); để xóa vùng nhớ đệm
- gets(sv1.tenSinhVien); đọc chuỗi nhập từ bàn phím, CHẤP NHẬN chuỗi có khoảng trắng
- scanf("%[^\n]s", &tenBien); đọc chuỗi nhập từ bàn phím, CHẤP NHẬN chuỗi có khoảng trắng
b. Viết dạng hàm:
- Khai báo
- Hàm xuất
- Hàm nhập struct
- Hàm nhập trên C++
- Hàm nhập con trỏ
- Hàm chính
Có thể dùng SV thay vì SinhVien (dùng alias)
#include<stdio.h>
struct SinhVien{
char maSinhVien[8];
char tenSinhVien[50];
float diemTrungBinh;
};
typedef struct SinhVien SV;
Muốn truy cập vào các thành viên của struct dùng dấu chấm (.)
void xuatSinhVien(SV sv){
printf ("\n\nThong tin sinh vien:");
printf ("\nMa so SV: %s", sv.maSinhVien);
printf ("\nHo ten SV: %s", sv.tenSinhVien);
printf ("\nDiem trung binh cac mon: %.1f", sv.diemTrungBinh);
}
Hàm nhập dạng trả về struct
SV nhapSinhVien(){
SV sv;
printf("\nNhap ma so SV: "); scanf("%s", &sv.maSinhVien);
printf("\nNhap ho ten SV: ");
getchar();
gets(sv.tenSinhVien);
printf("\nNhap diem trung binh: "); scanf("%f", &sv.diemTrungBinh);
return sv;
}
Hàm nhập trên C++ (lưu file file .CPP)
void nhapSinhVien_CPP(SV &sv){
printf("\nNhap ma so SV: "); scanf("%s", &sv.maSinhVien);
printf("\nNhap ho ten SV: ");
getchar();
gets(sv.tenSinhVien);
printf("\nNhap diem trung binh: "); scanf("%f", &sv.diemTrungBinh);
}
Hàm nhập dạng con trỏ: (sử dụng dấu trừ + dấu lớn "->")
void nhapSinhVienConTro(SV *sv){
printf("\nNhap ma so SV: "); scanf("%s", &sv->maSinhVien);
printf("\nNhap ho ten SV: ");
getchar();
gets(sv->tenSinhVien);
printf("\nNhap diem trung binh: "); scanf("%f", &sv->diemTrungBinh);
}
Hàm chính của chương trình
int main(){
// SV sv = nhapSinhVien(); // gọi hàm nhập viết dạng trả về cấu trúc
SV sv;
nhapSinhVien_CPP(sv); // gọi hàm nhập viết dạng C++
// nhapSinhVienConTro(&sv); // gọi hàm nhập viết dạng con trỏ
xuatSinhVien(sv);
}
YÊU CẦU:
BÀI 1: XÂY DỰNG CHƯƠNG TRÌNH LƯU THÔNG TIN SINH VIÊN
Input: Nhập vào từ bàn phím các thông tin sinh viên như: mã số sinh viên, tên sinh viên, ngành học, điểm trung bình.
Output: Xuất ra thông tin của tất cả sinh viên trên màn hình
Input: Nhập vào từ bàn phím các thông tin sinh viên như: mã số sinh viên, tên sinh viên, ngành học, điểm trung bình.
Output: Xuất ra thông tin của tất cả sinh viên trên màn hình
BÀI 2: TRÊN CƠ SỞ BÀI 1
Input: nhập số lượng sinh viên muốn thêm từ bàn phím
Output: Xuất ra thông tin của tất cả sinh viên trên màn hình
BÀI 3: SẮP XẾP SINH VIÊN THEO ĐIỂM TĂNG DẦN
Hướng dẫn: Sử dụng lại bài số 1, trước khi hiển thị sinh viên ra màn hình
thì chạy giải thuật sắp xếp
BÀI 4: TÌM KIẾM SINH VIÊN
Hướng dẫn: Sau khi đã nhập thông tin sinh viên vào mảng. Tìm kiếm sinh viên theo mã sinh viên
Hướng dẫn: Sau khi đã nhập thông tin sinh viên vào mảng. Tìm kiếm sinh viên theo mã sinh viên
THỰC HIỆN:
BÀI 1: XÂY
DỰNG CHƯƠNG TRÌNH LƯU THÔNG TIN SINH VIÊN
Input: Nhập vào từ bàn phím các thông tin sinh viên như: mã số sinh viên, tên sinh viên, ngành học, điểm trung bình.
Output: Xuất ra thông tin của tất cả sinh viên trên màn hình
Input: Nhập vào từ bàn phím các thông tin sinh viên như: mã số sinh viên, tên sinh viên, ngành học, điểm trung bình.
Output: Xuất ra thông tin của tất cả sinh viên trên màn hình
code tham khảo:
#include<stdio.h>
struct SinhVien{
char maSinhVien[8];
char tenSinhVien[50];
float diemTrungBinh;
};
typedef struct SinhVien SV;
void nhapSinhVienConTro(SV *sv){
printf("\nNhap ma so SV: "); scanf("%s", &sv->maSinhVien);
printf("\nNhap ho ten SV: ");
getchar();
gets(sv->tenSinhVien);
printf("\nNhap diem trung binh: "); scanf("%f", &sv->diemTrungBinh);
}
void xuatSinhVien(SV sv){
printf ("\n\nThong tin sinh vien:");
printf ("\nMa so SV: %s", sv.maSinhVien);
printf ("\nHo ten SV: %s", sv.tenSinhVien);
printf ("\nDiem trung binh cac mon: %.1f", sv.diemTrungBinh);
}
int main(){
SV sv[100];
int i;
int n;
printf ("\nNhap vao so luong SV muon them: ");
scanf("%d", &n);
for (i = 0; i < n; i++){
nhapSinhVienConTro(&sv[i]);
}
for (i = 0; i < n; i++){
xuatSinhVien(sv[i]);
}
}
BÀI 2: TRÊN CƠ SỞ BÀI 1
Input: nhập số lượng sinh viên muốn thêm từ bàn phím
Output: Xuất ra thông tin của tất cả sinh viên trên màn hình
code tham khảo:
#include<stdio.h>
struct SinhVien{
char maSinhVien[8];
char tenSinhVien[50];
float diemTrungBinh;
};
typedef struct SinhVien SV;
void nhapSinhVienConTro(SV *sv){
printf("\nNhap ma so SV: "); scanf("%s", &sv->maSinhVien);
printf("\nNhap ho ten SV: ");
getchar();
gets(sv->tenSinhVien);
printf("\nNhap diem trung binh: "); scanf("%f", &sv->diemTrungBinh);
}
void xuatSinhVien(SV sv){
printf ("\n\nThong tin sinh vien:");
printf ("\nMa so SV: %s", sv.maSinhVien);
printf ("\nHo ten SV: %s", sv.tenSinhVien);
printf ("\nDiem trung binh cac mon: %.1f", sv.diemTrungBinh);
}
int main(){
SV sv[100];
int i;
int n;
printf ("\nNhap vao so luong SV muon them: ");
scanf("%d", &n);
for (i = 0; i < n; i++){
nhapSinhVienConTro(&sv[i]);
}
for (i = 0; i < n; i++){
xuatSinhVien(sv[i]);
}
}
BÀI 3:
SẮP XẾP SINH VIÊN THEO ĐIỂM TĂNG DẦN
Hướng dẫn: Sử dụng lại bài số 1, trước khi hiển thị sinh viên ra màn
hình thì chạy giải thuật sắp xếp
code tham khảo:
#include<stdio.h>
struct SinhVien{
char maSinhVien[8];
char tenSinhVien[50];
float diemTrungBinh;
};
typedef struct SinhVien SV;
void nhapSinhVienConTro(SV *sv){
printf("\nNhap ma so SV: "); scanf("%s", &sv->maSinhVien);
printf("\nNhap ho ten SV: ");
getchar();
gets(sv->tenSinhVien);
printf("\nNhap diem trung binh: "); scanf("%f", &sv->diemTrungBinh);
}
void xuatSinhVien(SV sv){
printf ("\n\nThong tin sinh vien:");
printf ("\nMa so SV: %s", sv.maSinhVien);
printf ("\nHo ten SV: %s", sv.tenSinhVien);
printf ("\nDiem trung binh cac mon: %.1f", sv.diemTrungBinh);
}
void sapXep(SV sv[], int n){
int i, j;
for (i = 0; i < n - 1; i++){
for (j = i + 1; j < n; j++){
if (sv[i].diemTrungBinh > sv[j].diemTrungBinh){
SV svtmp;
svtmp = sv[i];
sv[i] = sv[j];
sv[j] = svtmp;
}
}
}
}
int main(){
SV sv[100];
int i;
int n;
char maTimKiem[100];
printf ("\nNhap vao so luong SV muon them: ");
scanf("%d", &n);
for (i = 0; i < n; i++){
nhapSinhVienConTro(&sv[i]);
}
for (i = 0; i < n; i++){
xuatSinhVien(sv[i]);
}
sapXep(sv, n);
for (i = 0; i < n; i++){
xuatSinhVien(sv[i]);
}
}
BÀI 4:
TÌM KIẾM SINH VIÊN
Hướng dẫn: Sau khi đã nhập thông tin sinh viên vào mảng. Tìm kiếm sinh viên theo mã sinh viên
Hướng dẫn: Sau khi đã nhập thông tin sinh viên vào mảng. Tìm kiếm sinh viên theo mã sinh viên
code tham khảo:
#include<stdio.h>
struct SinhVien{
char maSinhVien[8];
char tenSinhVien[50];
float diemTrungBinh;
};
typedef struct SinhVien SV;
SV nhapSinhVien(){
SV sv;
printf("\nNhap ma so SV: "); scanf("%s", &sv.maSinhVien);
printf("\nNhap ho ten SV: ");
getchar();
gets(sv.tenSinhVien);
printf("\nNhap diem trung binh: "); scanf("%f", &sv.diemTrungBinh);
return sv;
}
void nhapSinhVienConTro(SV *sv){
printf("\nNhap ma so SV: "); scanf("%s", &sv->maSinhVien);
printf("\nNhap ho ten SV: ");
getchar();
gets(sv->tenSinhVien);
printf("\nNhap diem trung binh: "); scanf("%f", &sv->diemTrungBinh);
}
void xuatSinhVien(SV sv){
printf ("\n\nThong tin sinh vien:");
printf ("\nMa so SV: %s", sv.maSinhVien);
printf ("\nHo ten SV: %s", sv.tenSinhVien);
printf ("\nDiem trung binh cac mon: %.1f", sv.diemTrungBinh);
}
void timKiemSinhVien(SV sv[], int n, char maSoSinhVien[100]){
int i;
for (i = 0; i < n; i++){
if (strcmp(maSoSinhVien, sv[i].maSinhVien) == 0){
xuatSinhVien(sv[i]);
return;
}
}
printf("\nKhong tim thay sinh vien co ma %s", maSoSinhVien);
}
int main(){
SV sv[100];
int i;
int n;
char maTimKiem[100];
printf ("\nNhap vao so luong SV muon them: ");
scanf("%d", &n);
for (i = 0; i < n; i++){
nhapSinhVienConTro(&sv[i]);
}
for (i = 0; i < n; i++){
xuatSinhVien(sv[i]);
}
printf("\nNhap vao ma sinh vien can tim: ");
scanf("%s", maTimKiem);
timKiemSinhVien(sv, n, maTimKiem);
}
Xong!
No comments:
Post a Comment