Untitled

 avatar
unknown
plain_text
a year ago
4.5 kB
9
Indexable
#include <stdio.h>
#include <stdlib.h>

// Khai báo cấu trúc phân số
typedef struct {
    int tuSo;
    int mauSo;
} PhanSo;

// Hàm nhập phân số từ bàn phím
void nhapPhanSo(PhanSo *ps) {
    printf("Nhap tu so: ");
    scanf("%d", &(ps->tuSo));

    printf("Nhap mau so: ");
    scanf("%d", &(ps->mauSo));
}

// Hàm xuất phân số ra màn hình
void xuatPhanSo(const PhanSo *ps) {
    printf("%d/%d\n", ps->tuSo, ps->mauSo);
}

// Hàm tính tổng mảng phân số
PhanSo tinhTongMangPhanSo(const PhanSo *mangPhanSo, int n) {
    PhanSo tong = {0, 1}; // Khởi tạo tổng ban đầu là 0
    for (int i = 0; i < n; i++) {
        tong.tuSo = tong.tuSo * mangPhanSo[i].mauSo + mangPhanSo[i].tuSo * tong.mauSo;
        tong.mauSo *= mangPhanSo[i].mauSo;
    }

    // Rút gọn phân số tổng nếu có thể
    int a = tong.tuSo;
    int b = tong.mauSo;
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    tong.tuSo /= a;
    tong.mauSo /= a;

    return tong;
}

// Hàm tìm phân số lớn nhất trong mảng
PhanSo timPhanSoLonNhat(const PhanSo *mangPhanSo, int n) {
    PhanSo max = mangPhanSo[0];
    for (int i = 1; i < n; i++) {
        if ((float)mangPhanSo[i].tuSo / mangPhanSo[i].mauSo > (float)max.tuSo / max.mauSo) {
            max = mangPhanSo[i];
        }
    }
    return max;
}

// Hàm tìm phân số nhỏ nhất trong mảng
PhanSo timPhanSoNhoNhat(const PhanSo *mangPhanSo, int n) {
    PhanSo min = mangPhanSo[0];
    for (int i = 1; i < n; i++) {
        if ((float)mangPhanSo[i].tuSo / mangPhanSo[i].mauSo < (float)min.tuSo / min.mauSo) {
            min = mangPhanSo[i];
        }
    }
    return min;
}

// Hàm kiểm tra xem phân số có tồn tại trong mảng hay không
int phanSoTonTaiTrongMang(const PhanSo *mangPhanSo, int n, const PhanSo *ps) {
    for (int i = 0; i < n; i++) {
        if (mangPhanSo[i].tuSo == ps->tuSo && mangPhanSo[i].mauSo == ps->mauSo) {
            return 1; // Phân số tồn tại trong mảng
        }
    }
    return 0; // Phân số không tồn tại trong mảng
}

// Hàm so sánh 2 phân số
// Trả về -1 nếu ps1 < ps2, 0 nếu ps1 = ps2, 1 nếu ps1 > ps2
int soSanhPhanSo(const PhanSo *ps1, const PhanSo *ps2) {
    float value1 = (float)ps1->tuSo / ps1->mauSo;
    float value2 = (float)ps2->tuSo / ps2->mauSo;
    if (value1 < value2) return -1;
    else if (value1 > value2) return 1;
    else return 0;
}

int main() {
    int n;

    printf("Nhap so luong phan so: ");
    scanf("%d", &n);

    // Khởi tạo mảng phân số với kích thước n
    PhanSo *mangPhanSo = (PhanSo*)malloc(n * sizeof(PhanSo));

    // Kiểm tra xem việc cấp phát bộ nhớ có thành công không
    if (mangPhanSo == NULL) {
        printf("Loi! Khong du bo nho.");
        return 1;
    }

    // Nhập các phân số vào mảng
    for (int i = 0; i < n; i++) {
        printf("Nhap phan so thu %d:\n", i + 1);
        nhapPhanSo(&mangPhanSo[i]);
    }

    // Tính tổng mảng phân số
    PhanSo tong = tinhTongMangPhanSo(mangPhanSo, n);
    printf("Tong cac phan so: ");
    xuatPhanSo(&tong);

    // Tìm phân số lớn nhất và nhỏ nhất
    PhanSo max = timPhanSoLonNhat(mangPhanSo, n);
    PhanSo min = timPhanSoNhoNhat(mangPhanSo, n);
    printf("Phan so lon nhat: ");
    xuatPhanSo(&max);
    printf("Phan so nho nhat: ");
    xuatPhanSo(&min);

    // Kiểm tra phân số có tồn tại trong mảng hay không
    PhanSo ps;
    printf("Nhap phan so can kiem tra:\n");
    nhapPhanSo(&ps);
    if (phanSoTonTaiTrongMang(mangPhanSo, n, &ps)) {
        printf("Phan so ton tai trong mang.\n");
    } else {
        printf("Phan so khong ton tai trong mang.\n");
    }

    // So sánh 2 phân số
    PhanSo ps1, ps2;
    printf("Nhap phan so thu nhat:\n");
    nhapPhanSo(&ps1);
    printf("Nhap phan so thu hai:\n");
    nhapPhanSo(&ps2);
    int ketQua = soSanhPhanSo(&ps1, &ps2);
    if (ketQua == -1) {
        printf("Phan so thu nhat nho hon phan so thu hai.\n");
    } else if (ketQua == 0) {
        printf("Hai phan so bang nhau.\n");
    } else {
        printf("Phan so thu nhat lon hon phan so thu hai.\n");
    }

    // Giải phóng bộ nhớ đã cấp phát cho mảng phân số
    free(mangPhanSo);

    return 0;
}
Editor is loading...
Leave a Comment