BÁO CÁO TIỂU LUẬN... Kiểu cấu trúc Sinh Viên :typedef struct _Sinhvien{char tenSV[30];int MSV;float diemhocphan[6];float Dtb;Khai báo cấu trúc một nút :typedef struct node{SINHVIEN data;
Trang 1BÁO CÁO TIỂU LUẬN
Mã học phần: COS120
Tên học phần: CẤU TRÚC DỮ LIỆU ; GIẢI THUẬT
Giảng viên: TS Lê Thị Ngọc Thơ
Sinh viên:
21DTHJA1
ĐẠI HỌC CÔNG NGHỆ TP HỒ CHÍ MINH KHOA CÔNG NGHỆ THÔNG TIN
Trang 2TP Hồ Chí Minh, tháng 9 năm 2022 CỘNG HÒA XÃ HỘI CHỦ NGHĨA VIỆT NAM
Độc lập – Tự do – Hạnh phúc
-NHẬN XÉT CỦA GIẢNG VIÊN
Sinh viên:
21DTHJA1
Nhận xét của giảng viên:
TP.HCM, ngày ………
(ký tên)
Trang 3Lê Thị Ngọc Thơ
Câu 1: Bài toán học bổng khuyến học cho sinh viên.
// Làm bài tại đây
Khai báo thư viện :
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <assert.h>
Kiểu cấu trúc Sinh Viên :
typedef struct _Sinhvien{
char tenSV[30];
int MSV;
float diemhocphan[6];
float Dtb;
}SINHVIEN;
Khai báo cấu trúc một nút :
typedef struct node
{
SINHVIEN data;
struct node *next;
}Node;
Node *create_node(SINHVIEN s){
Node *p=(Node*)malloc(sizeof(Node));
Trang 4p->next=NULL;
return p;
}
Khai báo cấu trúc một danh sách :
typedef struct list{
Node *head=NULL;
}LIST;
Hàm nhập số lượng Sinh Viên :
void NhapSL(int &n){
do{
printf("Nhap so luong sinh vien (0<n<35):");
scanf("%d", &n);
if(n<=0||n>35){
printf("nhap sai nhap lai:");
scanf("%d", &n);
}
}while(n<=0||n>35);(Nếu như số lượng sinh viên khác với yêu cầu đề bài thì lệnh while dùng để đưa vào vòng lặp )
}
Hàm nhập thông tin một Sinh Viên :
int NhapSV(SINHVIEN &s )
{
float tong=0;
Trang 5printf("\nNhap MSSV:");
scanf("%d",&s.MSV);
printf("nhap ho ten:");
fflush(stdin);
gets(s.tenSV);
printf("\tnhap vao diem hoc phan");
for (int j=0;j<6;j++)
{
printf("\nNhap diem hoc phan thu %d:",j+1);
scanf("%f",&s.diemhocphan[j]);
tong+=s.diemhocphan[j];
}
s.Dtb=tong/6;
}
Hàm xuất thông tin Sinh Viên nhận học bổng :
void Xuat1SV(SINHVIEN s)
{
printf("\ndanh sach sinh vien duoc hoc bong");
printf("%-10d %-24s %7.2f\n",s.MSV, s.tenSV,s.Dtb); }
Hàm chèn thông tin sinh viên vào đầu danh sách :
void chendauds(LIST &l, Node *p){
if(l.head==NULL){
(if dùng để kiểm tra danh sách có rỗng hay không)
l.head=p;
Trang 6p->next=l.head;
l.head=p;
}
}
Hàm kiểm tra Sinh Viên có bị rớt môn hay không :
bool ktrarotmon(Node *p)
{
for (int j=0;j<6;j++)
if(p->data.diemhocphan[j]<=4)
(cho một nút p trỏ tới điểm từng học phần của 1 sinh viên , nếu như có môn nhỏ hơn 5 thì sinh viên đó rớt môn, khi đó hàm trả về 0)
return 0;
return 1;
}
Hàm sắp xếp Sinh Viên giảm dần theo điểm trung bình :
void interchangesort(LIST &l)
{
Node *p,*q;
for(p=l.head;p!=NULL;p=p->next)
{
for(q=p->next;q!=NULL;q=q->next)
if(p->data.Dtb<q->data.Dtb)(khai báo nút p và q trỏ tới điểm trung bình của 2 sinh viên trước và sau , nếu điểm trung bình của sinh viên sau lớn hơn sinh viên trước thì thực hiện đổi thứ tự)
{
Trang 7SINHVIEN temp= p->data;
p->data=q->data;
q->data=temp;
}
}
}
Hàm xuất 3 Sinh Viên đạt học bổng:
void in3sv(LIST &l,SINHVIEN s)
{
int count=0;
Node *p;
if(l.head!=NULL)(kiểm tra xem danh sách có khác rỗng hay không)
{
for(p=l.head;p!=NULL;p=p->next)
{
if(ktrarotmon(p)==0)(nếu như sinh viên đó có một môn bị rớt thì sẽ gọi lệnh continue để chuyển đến sinh viên tiếp theo)
continue;
Xuat1SV(p->data);(hàm gọi thông tin 1 sinh viên )
count++;(tăng biến đếm lên 1 đơn vị )
if(count==3)(nếu như biến đếm đến 3 thì sẽ ngắt lệnh )
break;
}
}
}
Trang 8Hàm main dùng để gọi hàm :
int main()
{
SINHVIEN X;
int n;
NhapSL(n);// nhap n
LIST l;
for(int i=0;i<n;i++){
NhapSV(X);
chendauds(l,create_node(X));
}
interchangesort(l);// sap xep diem trung binh giam dan in3sv(l,X);// xuat sinh vien duoc hoc bong
return 0;
}
Trang 10Câu 2: Bài toán đảo ngược trật tự các từ trong câu.
Yêu cầu : đảo ngược chuỗi “the lazy dog jumped over the quick brown fox”
Kết quả : “ fox brown quick the over jumped dog lazy the” Khai báo thư viện :
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>
Khai báo cấu trúc một nút :
typedef struct Node {
char word[10];
struct Node* next;
};
Gọi nút với kiểu dữ liệu con trỏ
typedef struct Node* NODE;
int isEmpty(Node *root) {(kiểm tra ngăn xếp rỗng)
return !root;
}
char* top(NODE stack) {
(khai báo đầu của ngăn xếp)
return stack->word;
(trả về giá trị word)
}
Trang 11Hàm pop dùng để lấy phần tử đầu tiên của ngăn xếp :
void pop(NODE* stack) {
if(!isEmpty(*stack)) {
struct Node* p = *stack;
*stack = (*stack)->next;
free(p);
}
}
Hàm push để thêm phần tử mới vào ngăn xếp
void push(NODE* stack, char* data) {
struct Node* p = (struct Node*)malloc(sizeof(struct Node));
p->next = NULL;
strcpy(p->word, data);
if(stack == NULL) {
*stack = p;
} else {
p->next = *stack;
*stack = p;
}
}
Hàm tách Dùng hàm strtok(data, “ ”) để tách dữ liệu ở tại những vị trí
có dấu cách Chạy vòng lặp khi nào token còn khác NULL thì sẽ chạy hàm push :
void splitWord(NODE* stack, char* data) {
char * token = strtok(data, " ");
Trang 12while (token != NULL) {
push(stack,token);
token = strtok(NULL, " ");
}
}
Hàm in chuỗi lên màn hình :
void showWord(NODE stack) {
while (!isEmpty(stack)) {
printf("%s ", top(stack));
pop(&stack);
}
}
Hàm main dùng nhập chuỗi kí tự và gọi hàm thực hiện : int main() {
NODE stack = NULL;
char data[200]=" the lazy dog jumped over the qick brown fox"; splitWord(&stack,data);
showWord(stack);
return 0;
}