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

Đồ Án Môn Học 1 Chuẩn Hoá Chuỗi.pdf

20 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

Nội dung

Trang 1

BỘ GIÁO DỤC VÀ ĐÀO TẠOTRƯỜNG ĐẠI HỌC PHÚ YÊN

Trang 2

PHẦN 1

Các yêu cầu:- Chuẩn hoá chuỗi- Trích xuất chuỗi- Tìm kiếm, thay thế chuỗi- Chuỗi đảo ngược- Chuỗi đối xứng- Bài tập xử lý chuỗi

- Bài toán ứng dụng : Cộng hai số lớn- Kiểm tra biểu thức hợp lệ

Phân tích và cài đặt bài toán:1 Chuẩn hoá chuỗi

- Input : Một chuỗi ký tự cần được chuẩn hoá (chuỗi bị thừa dấu cách hoặc dấu

tab ở đầu dòng, giữa dòng, cuối dòng)

Ví dụ input bài toán: " Đây là một ví dụ input ";

- Output: Chuỗi ký tự đưa vào đã được chuẩn hoá

Ví dụ output bài toán: "Đây là một ví dụ input"

- Cài đặt thuật toán bằng ngôn ngữ lập trình C

void chuanHoaChuoichar* chuoi) {int n = strlen(chuoi);

int i = 0;

// Xoa dau cach dau

Trang 3

while (chuoi[i] == ' ' && i < n) {for (int j = 0; j < n - 1; j++) {chuoi[j] = chuoi[j + 1];}

chuoi[n - 1] = '\0';n ;

int j;

int demDauCach = 0;i = 0;

// Xoa dau cach o giuawhile (i < n) {if (chuoi[i] == ' ') {demDauCach++;if (demDauCach > 1) {for (j = i; j < n - 1; j++) {chuoi[j] = chuoi[j + 1];}

Trang 4

chuoi[n - 1] = '\0';n ;

i ;}} else {

demDauCach = 0;}

- Độ phức tạp của giải thuật :

Độ phức tạp của thuật toán là O(n), trong đó n là độ dài của chuỗi đầu vào.

2 Trích xuất chuỗi

- Input: Cần đưa vào bài toán một chuỗi nguồn đề trích xuất , vị trí bắt đầu trích

xuất từ chuỗi nguồn và vị trí kết thúc

- Output: Nhận được chuỗi địch cần trích xuất từ chuỗi nguồn từ vị trí bắt đầu

đến vị tri kết thúc

- Cài đặt thuật toán bằng ngôn ngữ lập trình C

void trichXuatChuoi(char* chuoiDich, const char* chuoiNguon, int start, int end) {

int i, j = 0;

// Đảm bảo vị trí bắt đầu hợp lệ if (start < 0) {

start = 0; }

Trang 5

// Xác định vị trí kết thúc hợp lệ int doDaiChuoiNguon = strlen(source); if (end >= sourceLength) {

end = sourceLength - 1; }

if (end < start) { end = start; }

for (i = start; i <= end; i++) { chuoiDich[j] = chuoiNguon[i]; j++;

}

// Kết thúc chuỗi đích bằng '\0' chuoiDich[j] = '\0';

- Độ phức tạp của giải thuật :

Độ phức tạp của giải thuật trichXuatChuoi như trên là O(n), trong đó n là độ dài của phần trích xuất (end - start) Điều này bởi vì giải thuật chỉ duyệt qua cácký tự từ start đến end của chuỗi nguồn một lần, không phụ thuộc vào độ dài tổng của chuỗi nguồn

3 Tìm kiếm , thay thế chuỗi

- Input: Đưa vào một chuỗi cha, một chuỗi con để tìm kiếm bên trong chuỗi cha,

một chuỗi thay thế chuỗi con

Trang 6

- Output: Chuỗi mới thay thế chuỗi con bên trong chuỗi cha nếu như tìm thấy

chuỗi con trong chuỗi cha

- Cài đặt thuật toán bằng ngôn ngữ lập trình C

#include <stdio.h>#include <string.h>

int TimViTriChuoi(const char* chuoiCha, const char* chuoiCon) { int doDaiChuoiCha = strlen(chuoiCha);

int doDaiChuoiCon = strlen(chuoiCon);

for (int i = 0; i <= doDaiChuoiCha - doDaiChuoiCon; i++) { int viTriChuoiCon = 0;

int timThay = 1;

for (int j = i; j < i + doDaiChuoiCon; j++) { if (chuoiCha[j] != chuoiCon[viTriChuoiCon]) { timThay = 0;

break; }

viTriChuoiCon++; }

if (timThay) { return i; }

} return -1; }

Trang 7

void ThayTheChuoi(char* chuoiCha, const char* chuoiCon, const char* chuoiMoi) {

}}

Trang 8

scanf("%s", chuoiMoi);

ThayTheChuoi(chuoiCha, chuoiCon, chuoiMoi);

printf("Chuoi sau khi thay the: %s\n", chuoiCha);

return 0;}

- Đánh giá độ phức tạp của thuật toán

Hàm ThayTheChuoi:

Trong trường hợp tồi nhất, nếu phải thay thế tất cả các xuất hiện của chuỗi con trong chuỗi cha, thì ThayTheChuoi có thể chạy nhiều lần tương ứng với số lần xuất hiện của chuỗi con.

Mỗi lần thay thế, chúng ta cần dời các ký tự sau chuỗi mới để làm cho độ dài của chuỗi cha không thay đổi.

Vì vậy, độ phức tạp của ThayTheChuoi có thể ước tính là O(số lần xuất hiện của chuỗi con * (doDaiChuoiCha - doDaiChuoiMoi)).

Trang 9

4 Chuỗi đảo ngược

- Input: Một chuỗi ký tự được đưa vào- Output: Đảo ngược chuỗi được đưa vào

Ví dụ: chuỗi đưa vào là: ngo thanh dat Chuỗi đảo ngược sẽ là: tad hnaht ogn

- Cài đặt thuật toán bằng ngôn ngữ lập trình C:

void daoNguocChuoi(char* chuoi){int doDaiChuoi = strlen(chuoi);char temp;

int i,j;

for(i=0 , j = doDaiChuoi -1 ;i<j;i++,j ){temp = chuoi[i];

chuoi[i] = chuoi[j];chuoi[j] = temp ;}

- Đánh giá độ phức tạp của thuật toán:

Vòng lặp trong hàm chạy từ đầu chuỗi (i = 0) đến giữa chuỗi (i < doDaiChuoi / 2) và thực hiện hoán đổi ký tự tương ứng ở cả hai đầu Vì vậy, số lần lặp của vòng lặp là doDaiChuoi / 2

Do đó, độ phức tạp của thuật toán đảo ngược chuỗi này có thể xem như là O(doDaiChuoi/2), nhưng trong tính toán độ phức tạp thường bỏ đi hằng số, vì vậy độ phức tạp cuối cùng của hàm này là O(doDaiChuoi).

5 Chuỗi đối xứng

- Input: Một chuỗi ký tự được đưa vào

- Output: Kiểm tra và thông báo chuỗi vừa đưa vào có phải là chuỗi đối xứng

hay không

Trang 10

- Cài đặt thuật toán bằng ngôn ngữ lập trình C:

int kiemTraChuoiDoiXung(char* chuoi){int doDaiChuoi = strlen(chuoi);char temp;

int i,j;

for(i=0 , j = doDaiChuoi -1 ;i<j;i++,j ){if(chuoi[i]!=chuoi[j]){

return 0 ;}

}return 1 ;}

- Đánh giá độ phức tạp của thuật toán:

Độ phức tạp của thuật toán là O(doDaiChuoi)6 Câu I 6đ Viết các hàm xử lý thực hiện yêu cầu sau

Cho chuỗi s chứa các thông tin một giao dịch bao gồm: mã, ngày, giờ và giá trị đi kèm

Vidu: s=“ 1 15-09-2023 07:30:45 9.99”

Khoảng cách trống ở giữa các thành phần có thể là kí tự space hoặc tab1 Viết hàm thay thế ký tự nào đó trong chuỗi trong chuỗi thành kí tự khác (1đ) Áp dụng:

- Thay các kí tự tab ‘\t” thành kí tự space - Thay kí tư nối ngày ‘-‘ thành kí tự ‘/’2 Xóa 1 ký tự ở vị trí bất kỳ trong chuỗi (2đ) Áp dụng:

- Xóa các ký tự trắng đầu và cuối chuỗi

- Xóa các ký tự trắng thừa bên trong chuỗi (giữa 2 từ chỉ có một khoảng trắng)

Trang 11

3 Tách các thành phần dữ liệu trong chuỗi được cách nhau bởi ký tự trắng vào các chuỗi riêng biệt, in ra màn hình theo mẫu: (2đ)

Ví dụ:- Mã: 1

2 Khai báo mảng cấu trúc, mỗi phần tử của mảng có kiểu cấu trúc bao gồm cácthông tin mã, ngày, giờ và giá trị nhận được Đọc từ file data2.txt ra mảng, tính giá trị nhận được lớn nhất, nhỏ nhất và giá trị trung bình.

- Input: Chuỗi ký tự đưa vào bao gồm các thành phần mã, ngày, giờ và giá trị đi kèm , chuỗi chưa được chuẩn hoá nên thừa khoảng trắng

- Output:

Câu 1.1 và 1.2: Chuẩn hoá chuỗi được đưa vào, thay thế kí tự tab ‘\t” thành kí tự space , kí tự nối ngày ‘-‘ thành kí tự ‘/’ và xoá các khoảng trắn dư thừa ở đầu,giữa, cuỗi chuỗi

Câu 1.3 Tách các thành phần trong chuỗi được ngăn cách nhau bởi dấu khoảngtrắng, sau đó in ra màn hình theo mẫu

Trang 12

Câu 2.1: Xử lý chuỗi đưa vào về định dạng 1;10-09-2023; 07:30:45:9.99

2;15/09/2023:09:20:15;6.56Sau đó đưa vào file

Câu 2.2 Đọc từ file data2.txt ra mảng cấu trúc mã, ngày, giờ và giá trị nhận được , xuất ra giá trị nhận được lớn nhất, nhỏ nhất và giá trị trung bình.

- Cài đặt thuật toán bằng ngôn ngữ lập trình C:

#include <stdio.h>#include <stdlib.h>#include <string.h>

typedef struct Date { int d;

int m; int y;} Date;

typedef struct Time { int hour;

int minute; int second;} Time;

typedef struct data { int id;

Date date; Time time;

Trang 13

float diem;} data;

void replaceTabsWithSpaces(char *str) { for (int i = 0; str[i] != '\0'; i++) { if (str[i] == '\t') {

str[i] = ' '; }

}}

void removeExtraSpaces(char *str) { int len = strlen(str);

int i, j;

while (len > 0 && str[0] == ' ') { memmove(str, str + 1, len); len ;

Trang 14

for (i = 0, j = 0; i < len; i++) {

if (str[i] != ' ' || (i > 0 && str[i - 1] != ' ')) { str[j] = str[i];

j++; } } str[j] = '\0';}

int demSoPhanTuTrongFile( char *filename) { FILE *file = fopen(filename, "r");

while (fgets(line, sizeof(line), file)) { count++;

}

fclose(file); return count;

Trang 15

char *token = strtok(line, " ");

if (token != NULL) { data[i].id = atoi(token);

token = strtok(NULL, " "); char StringDate[20]; strcpy(StringDate,token);

Trang 16

token = strtok(NULL, " "); char StringTime[20]; strcpy(StringTime,token);

token = strtok(NULL, " "); data[i].diem = atof(token);

if (StringDate != NULL) { char *dateToken = strtok(StringDate, "/"); if (dateToken != NULL) { data[i].date.d = atoi(dateToken); dateToken = strtok(NULL, "/"); if (dateToken != NULL) { data[i].date.m = atoi(dateToken); dateToken = strtok(NULL, " "); if (dateToken != NULL) { data[i].date.y = atoi(dateToken); }

Trang 17

char *timeToken = strtok(StringTime, ":"); if (timeToken != NULL) { data[i].time.hour = atoi(timeToken); timeToken = strtok(NULL, ":"); if (timeToken != NULL) { data[i].time.minute = atoi(timeToken); timeToken = strtok(NULL, " "); if (timeToken != NULL) { data[i].time.second = atoi(timeToken);}

printf("ID: %d\n", data[i].id); printf("Date: %d/%d/%d\n", data[i].date.d, data[i].date.m, data[i].date.y); printf("Time: %d:%d:%d\n", data[i].time.hour, data[i].time.minute, data[i].time.second); printf("Diem: %.2f\n", data[i].diem); printf(" -\n");

Trang 18

float minValue = data[0].diem;float maxValue = data[0].diem ;float sumValue = 0;

for(int i=0 ;i<length ; i++){sumValue += data[i].diem;if(minValue>data[i].diem){

minValue = data[i].diem;}

if(maxValue < data[i].diem){maxValue = data[i].diem;}

float giaTriTrungBinh = sumValue/length ;printf("\nGia tri nho nhat la: %.2f",minValue);printf("\nGia tri lon nhat la: %.2f",maxValue);printf("\nGia tri trung binh la: %.2f",giaTriTrungBinh);

fclose(file);

FILE *file2 = fopen("data1.txt", "r"); if (file2 == NULL) {

perror("Khong the mo tep tin");

Trang 19

return 1; }

FILE *outputFile = fopen("data2.txt", "w"); if (outputFile == NULL) {

perror("Không th? t?o ho?c m? t?p tin data2.txt"); fclose(file2);

return 1; }

char line2[256];

while (fgets(line2, sizeof(line2), file2)) {replaceTabsWithSpaces(line2);removeExtraSpaces(line2);for (int i = 0; line2[i] != '\0'; i++) { if (line2[i] == ' ') {

line2[i] = ';'; }

}

fprintf(outputFile, "%s\n", line2);

printf("\nDA CHUAN HOA CHUOI VAO FILE DATA2.TXT!");fclose(file2);

fclose(outputFile);return 0;}

- Đánh giá độ phức tạp của thuật toán:

Trang 20

Độ phức tạp của hàm demSoPhanTuTrongFile là O(n), trong đó n là số dòng trong tệp tin đầu vào "data.txt".

Vòng lặp trong while (fgets(line, sizeof(line), file)) chạy theo số dòng trong tệp tin, nên có độ phức tạp là O(n).

Ngày đăng: 27/06/2024, 19:05

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w