Cấu trúc Khái niệm, định nghĩa Khai báo cấu trúc Đặt tên kiểu dữ liệu Thao tác trên biến cấu trúc Truyền biến cấu trúc cho hàm... Khái niệm, định nghĩa Cấu trúc: có thể thuộc n
Trang 1NGÔN NGỮ LẬP TRÌNH C
Dữ liệu kiểu cấu trúc
Ninh Thị Thanh Tâm Khoa CNTT – HV Quản lý Giáo dục
Trang 3Nội dung
Cấu trúc
Trang 4Cấu trúc
Khái niệm, định nghĩa
Khai báo cấu trúc
Đặt tên kiểu dữ liệu
Thao tác trên biến cấu trúc
Truyền biến cấu trúc cho hàm
Trang 5Khái niệm, định nghĩa
Cấu trúc:
có thể thuộc nhiều kiểu dữ liệu khác nhau
Trang 6Khai báo cấu trúc
Khai báo kiểu dữ liệu cấu trúc:
struct <tên c ấu trúc> {
Trang 7Ví dụ
struct sinhvien { char ho_ten[30]; float diemtb;
};
struct diem {
float x,y;
};
Trang 8Khai báo cấu trúc (2)
Khai báo biến cấu trúc:
struct <tên c ấu trúc> <tên biến cấu trúc>;
Ví dụ:
struct sinhvien sv, dssv[100];
struct diem p, q, dsdiem[50];
Trang 9Khai báo cấu trúc (3)
Khai báo đồng thời cấu trúc và biến cấu trúc:
struct [<tên c ấu trúc>] {
<khai báo các thành phần>
} <danh sách biến cấu trúc>;
Trang 10phần là biến cấu trúc bên trong một cấu trúc lớn hơn
Trang 11Đặt tên kiểu dữ liệu
Từ khóa typedef
typedef <tên ki ểu đã có> <tên mới>;
<tên kiểu đã có> là kiểu dữ liệu muốn thêm
tên
<tên mới> là tên mới muốn đặt
hợp thành một tên duy nhất để dễ dàng khi viết
Trang 12Ví dụ
typedef unsigned char byte;
đương với unsigned char
kiểu dữ liệu khác
Trang 14Sử dụng typedef với cấu trúc
typedef struct sinhvien sv;
typedef struct sinhvien *ptr_sv;
Cấu trúc struct sinhvien sẽ là sv
Định nghĩa một kiểu con trỏ cấu trúc có tên là ptr_sv
Khi đó:
sv sv1, sv2, dssv[100]; ~ struct sinhvien sv1, sv2, dssv[100];
ptr_sv ptrsv; ~ struct sinhvien *ptrsv;
Trang 15Thao tác trên biến cấu trúc
Truy cập thành phần trong cấu trúc
Truy cập tới thành phần cấu trúc từ con trỏ cấu trúc
Nhập dữ liệu cho biến cấu trúc
Trang 16Truy cập thành phần trong cấu trúc
<tên biến cấu trúc>.<tên thành phần>
Dấu chấm (.) là toán tử truy cập thành phần cấu trúc
Nếu có nhiều cấu trúc lồng nhau thì sử dụng nhiều dấu (.) tương ứng
p.x = 0; p.y = 5;
dg1.dsdinh[10].x = 0; dg1.n = 10;
Trang 17Truy cập thành phần cấu trúc từ con trỏ cấu trúc
Nếu ptr là con trỏ cấu trúc, có 2 cách để truy cập tới thành phần của nó
(*ptr).<tên thành phần>
ptr-><tên thành phần>
Trang 18Nhập dữ liệu cho biến cấu trúc
Nhập dữ liệu qua biến trung gian
Gán các giá trị nhập được cho các thành phần cần nhập
Trang 19float temp;
clrscr();
Trang 21// printf("DS Sv nhan hoc bong");
for (i=0; i<n; i++){
Trang 22Phép gán giữa các biến cấu trúc
Gán nội dung của một biến cấu trúc cho một biến cấu trúc khác cùng kiểu
Trang 23}
Trang 24Kết quả
Trang 25Truyền biến cấu trúc cho hàm
Truyền biến cấu trúc bằng tham trị
thực được sao chép sang vùng nhớ dành cho tham số hình thức
Truyền biến cấu trúc bằng tham biến
Trang 26Ví dụ
Khai báo hai cấu trúc
tung độ
có kiểu điểm
nào
Trang 27float dientich(tamgiac);
Trang 28printf("Canh CA:%f\n", canh(tg.C,tg.A));
printf("Canh AB:%f\n", canh(tg.A,tg.B));
Trang 29void nhap(tamgiac *temp){ float t;
printf("Nhap dinh A\n"); printf("x=");
Trang 30float canh(diem p, diem q){
return (sqrt(pow(p.x-q.x,2.0)+pow(p.y-q.y,2.0)));}
float canhbp(diem p, diem q){
Trang 34Ví dụ - LIFO
Tạo danh sách móc nối gồm 100 số tự nhiên đầu tiên; in lại danh sách.
Trang 35#include <stdio.h>
#include <conio.h> typedef struct mn { int so;
struct nn *next; } mn;
Trang 36mn *ptmoi(int k){
mn *p;
p = (mn *)malloc(sizeof(mn)); p->so = k;
Trang 37void inds(){
mn *p;
for (p=ds; p; p=p->next)
printf("%5d",p->so); puts("");
}
Trang 40Ví dụ - LIFO
Tạo ngẫu nhiên một dãy gồm 10 số
nguyên, các số nằm trong khoảng từ 0 đến 100, đưa vào một danh sách móc nối
Sắp lại danh sách theo thứ tự giảm dần
Xóa tất cả các số chẵn
Trang 41p->next = ds;
ds = p;
}
}
Trang 42void sapxep(){
mn *p, *t;
int x;
p = ds;
for (p = ds; p->next; p = p->next)
for (t = p->next; t; t=t->next)
if (p->so < t->so){
x = p->so;
p->so = t->so;t->so = x;
}}
Trang 43void xoasau(mn *p){
if (p->next)
p->next = (p->next)->next; else
printf("Khong hop le"); }
Trang 44Kết quả
Trang 45Ví dụ - FIFO
Đưa vào một danh sách móc nối thông tin tên và điểm của từng học sinh; nhập điểm chuẩn:
Trang 46#include <stdio.h>
#include <alloc.h>
#include <stdlib.h> typedef struct {
char ten[20];
float diem;
} hocsinh;
typedef struct mn{ hocsinh hs;
struct mn *next; } ptr;
ptr *ds;
Trang 48}
Trang 49void inds(){
ptr *p;
for (p=ds; p; p=p->next)
printf("%s %6.1f\n",p->hs.ten,p->hs.diem); getch();
Trang 50Cây tìm kiếm nhị phân
Ví dụ:
Trang 53void them(float x, node *p){
if (x==p->k) return;
if (x<p->k){
if (p->left)
them(x,p->left); else p->left = nutmoi(x); }
else{
if(p->right)
them(x,p->right); else p->right = nutmoi(x); }
}
Trang 54}