V. Kiểu liệt kê
Có thể gán các giá trị nguyên liên tiếp (tính từ 0) cho các tên gọi cụ thể bằng kiểu liệt kê theo khai báo sau đây:
enum tên_kiểu { d/s tên các giá trị };
Ví dụ:
enum Bool {false, true};
khai báo kiểu mới đặt tên Bool chỉ nhận 1 trong 2 giá trị đặt tên false và true, trong đó false ứng với giá trị 0 và true ứng với giá trị 1. Cách khai báo kiểu enum trên cũng tương đương với dãy các macro sau:
#define false 0
#define true 1
Với kiểu Bool ta có thể khai báo một số biến như sau:
Bool Ok, found;
hai biến Ok và found sẽ chỉ nhận 1 trong 2 giá trị false (thay cho 0) hoặc true (thay cho 1). Có nghĩa có thể gán:
Ok = true;
hoặc: found = false;
Tuy nhiên không thể gán các giá trị nguyên trực tiếp cho các biến enum mà phải thông qua ép kiểu. Ví dụ:
Ok = 0; // sai
Ok = Bool(0) ; // đúng
hoặc Ok = false ; // đúng
VI. Tóm tắt nội dung bài học
I. Cấu trúc tự định nghĩa
1 Khái niệm
2. Khai báo biến cấu trúc
3. Các thao tác trên biến kiểu cấu trúc
4. Con trỏ cấu trúc
II. Kiểu ngăn xếp
1. Khái niệm
2. Các thao tác cơ bản
3. Cài đặt
4. Ứng dụng
III. Kiểu hàng đợi
1. Khái niệm
2. Các thao tác cơ bản
3. Cài đặt
4. Ứng dụng
VII. Bài tập
Xem Bài 11 - Bài tập thực hành Cấu trúc dữ liệu tự định nghĩa.
Bài 11 - Bài thực hành: CẤU TRÚC DỮ LIỆU DO NGƯỜI DÙNG TỰ ĐỊNH NGHĨA I. Thực hiện các ví dụ sau 1. Biểu diễn và thực hiện các phép toán phân số
Yêu cầu: Xây dựng cấu trúc biểu diễn phân số; cho phép nhập vào 2 phân số, thực hiện các phép cộng, trừ, nhân, chia 2 phân số đó.
Soạn thảo văn bản chương trình như sau
#include
#include
typedef struct fraction
{
int numerator;
int denominator;
};
///-- khai bao cac ham
fraction add(fraction x, fraction y) ;
fraction sub(fraction x, fraction y) ;
fraction multiply(fraction x, fraction y) ;
fraction divide(fraction x, fraction y) ;
void printFraction(fraction x);
int main()
{
fraction a,b;
printf("Nhap phan so, tu so truoc, mau so sau:");
scanf("%d%d",&a.numerator, &a.denominator);
printf("Nhap phan so, tu so truoc, mau so sau:");
scanf("%d%d",&b.numerator, &b.denominator);
printf("Hieu:\n");
printFraction(sub(a,b));
printf("\nTong:\n");
printFraction(add(a,b));
printf("\nTich:\n");
printFraction(multiply(a,b));
printf("\nThuong:\n");
printFraction(divide(a,b));
getch();
return 0;
}
///--------------- trien khai cac ham
fraction add(fraction x, fraction y)
{
fraction t;
t.numerator=x.numerator * y.denominator + x.denominator * y.numerator;
t.denominator = x.denominator * y.denominator;
return t;
}
///------------------
fraction sub(fraction x, fraction y)
{
fraction t;
t.numerator=x.numerator * y.denominator - y.numerator * x.denominator;
t.denominator = x.denominator * y.denominator;
return t;
}
fraction multiply(fraction x, fraction y)
{
fraction t;
t.numerator=x.numerator * y.numerator;
t.denominator = x.denominator * y.denominator;
return t;
}
fraction divide(fraction x, fraction y)
{
fraction t;
t.numerator=x.numerator * y.denominator;
t.denominator = x.denominator * y.numerator;
return t;
}
void printFraction(fraction x)
{
printf("%d/%d",x.numerator,x.denominator);
}
Thử nghiệm 1:
Thử nghiệm 2:
Thử nghiệm với hai giá trị là 3/4, và 1/2 đưa ra nhận xét, cần cải tiến như thế nào?
Thử nghiệm 3:
Thử nghiệm với hai giá trị là 3/4, và 0/2 đưa ra nhận xét, cần cải tiến như thế nào?
2. Chuyển biểu thức trung tố về dạng hậu tố
Yêu cầu: Viết chương trình cho phép chuyển một chuỗi biểu diễn biểu thức dạng trung tố thành chuỗi biểu diễn biểu thức dạng hậu tố.
Soạn thảo văn bản chương trình như sau
#include
#include
#include
#include
typedef struct stackNode
{
char item;
stackNode *next;
};
typedef struct stack{
stackNode* top;
};
///
void init(stack *s);
///0: empty
int empty(stack *s);;
///-1: cant push to stack
int push(stack *s,char value);
///-1: pop empty stack
int pop(stack *s,char *out);
char getTop(stack *s);
int isnumber(char ch);
int isoperator(char ch);
int priority(char ch);
int convert(char source[], char chuoihauto[]);
stack s;
int main()
{
int i;
char v;
char c[100];
char o[100];
gets(c);
convert(c,o);
puts(o);
getch();
return 0;
}
///implemention
void init(stack *s)
{
s->top=NULL;
}
///---------
///0: empty
int empty(stack *s)
{
if(s->top==NULL)
{
return 0;
}
else
{
return 1;
}
}
///-----------
///-1: cant push to stack
int push(stack *s,char value)
{
stackNode *a;
a=(stackNode*)malloc(sizeof(stackNode));
if(a==NULL)
{
return -1;
}
a->item=value;
a->next=s->top;
s->top=a;
return 0;
}
///-------------
///-1: pop empty stack
int pop(stack *s,char *out)
{
stackNode *cur;
if(s->top==NULL)
{
return -1;
}
cur=s->top;
*out=s->top->item;
s->top=cur->next;
free(cur);
}
///---------------
char getTop(stack *s)
{
return s->top->item;
}
///----------------
int isnumber(char ch)
{
return ((int(ch)>=48&&int(ch)<=57));
}
///---------
int isoperator(char ch)
{
return (ch=='+'||ch=='-'||ch=='*'||ch=='/');
}
///---------
int priority(char ch)
{
if(ch=='+'||ch=='-')
return 0;
if(ch=='*'||ch=='/')
return 1;
}
///------------------
int convert(char source[], char suffixExp[])
{
stack S;
init(&S);
int count=0;
char temp;
for(int i=0;i
{
if(isoperator(source[i])&&isoperator(source[i+1]))
return i;
if((source[i]>=65&&source[i]<=90)||(source[i]>=97&&source[i]<=121))
return i;
}
for(int i=0;i
{
char ch=source[i];
if(isnumber(ch))
{
suffixExp[count]=ch;
count++;
}
else//operator
{
if(empty(&S)!=0)//not empty
{
if(isoperator(getTop(&S))&&(priority(getTop(&S))>=priority(ch)))
{
pop(&S,&temp);
suffixExp[count++]=temp;
push(&S,ch);
}
else
push(&S,ch);
}
else
push(&S,ch);
}
}//END FOR
while(empty(&S)!=0)//Lay het nhung gi con lai trong stack
{
pop(&S,&temp);
suffixExp[count++]=temp;
}
suffixExp[count++]='\0';//CHEN KI TU NULL VAO CUOI XAU;
}
Thử nghiệm 1:
Nhập chuỗi là: 1-3*4/5+6+7-8
Thử nghiệm 2:
Nhập chuỗi là: 1+3-2*3
Nhận xét và phát triển cho trường hợp có dấu ngoặc (, ), phép toán ^
Chia sẻ với bạn bè của bạn: |