1. Trang chủ
  2. » Luận Văn - Báo Cáo

báo cáo tiểu luận cấu trúc dữ liệu giải thuật

13 0 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Bài toán học bổng khuyến học cho sinh viên
Tác giả Nguyễn Minh Trí
Người hướng dẫn TS. Lê Thị Ngọc Thơ
Trường học ĐẠI HỌC CÔNG NGHỆ TP. HỒ CHÍ MINH
Chuyên ngành CÔNG NGHỆ THÔNG TIN
Thể loại Báo cáo tiểu luận
Năm xuất bản 2022
Thành phố TP. Hồ Chí Minh
Định dạng
Số trang 13
Dung lượng 757,56 KB

Nội dung

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 1

BÁ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 2

TP 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 3

Lê 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 4

p->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 5

printf("\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 6

p->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 7

SINHVIEN 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 8

Hà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 10

Câ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 11

Hà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 12

while (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;

}

Ngày đăng: 14/08/2024, 16:46