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

báo cáo bài thực hành số 2

57 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

Định dạng
Số trang 57
Dung lượng 3 MB

Nội dung

Viết hàm tính độ dài cạnh huyền của tam giác theo độ hai cạnh góc vuông..... Sau khi thực hiện hàm, các biến a, b, c tương ứng nhận các giá trị mới b, c, a.iết hàm tính độ dài cạnh huyền

Trang 1

Đại học Bách Khoa Hà Nội

Trường Công Nghệ Thông Tin và Truyền Thông

***********

Báo cáo Bài thực hành số 2

Giảng viên hướng dẫn: Lê Thị Hoa Sinh viên thực hiện: Lương Hoài Nam

MSSV: 20210623

Hà Nội, ngày 6 tháng 11 năm 2023

IT3040 – 2023.1 – Mã lớp: 732827

Trang 2

Mục lục

Bài thực hành số 2 5Bài tập 2.1 Viết hàm tính độ dài cạnh huyền của tam giác theo độ hai cạnh góc vuông 5Bài tập 2.2 Viết hàm hoán vị vòng tròn 3 biến a, b, c Sau khi thực hiện hàm, các biến

a, b, c tương ứng nhận các giá trị mới b, c, a.iết hàm tính độ dài cạnh huyền của tam giác theo độ hai cạnh góc vuông 7Bài tập 2.3 Viết chương trình yêu cầu nhập giá trị cho số nguyên x nhỏ hơn 100 In ra giá trị ax2+bx+c với a, b, c định sẵn 9Bài tập 2.4 Viết các hàm tính lập phương của số nguyên và số thực 12Bài tập 2.5 Viết các toán tử tính tổng, hiệu, tích và thương của hai số phức 14Bài tập 2.6 Giả thuyết Collatz: bắt đầu từ số dương n bất kỳ, nếu n chẵn thì chia 2, nếu

lẻ thì nhân 3 cộng 1, giả thuyết cho rằng ta luôn đi đến n = 1 Hãy viết chương trình môphỏng lại quá trình biến đổi để kiếm chứng giả thuyết với giá trị của n nhập từ bàn phím 18Bài tập 2.7 Viết hàm tính tổng các phần tử trong hai mảng Yêu cầu sử dụng function template để cho phép hàm làm việc với các mảng số nguyên lẫn số thực 18Bài tập 2.8 Viết hàm so sánh cho thuật toán sắp xếp 19Bài tập 2.9 Tính hàm sigmoid Dưới đây cung cấp đoạn code đơn giản để tính hàm sigmoid theo công thức trực tiếp Hãy viết hàm tính xấp xỉ sigmoid(x) đến độ chính xác 10^−6 và có tốc độ nhanh hơn ít nhất 30% so với code đơn giản 22Bài tập 2.10 Tính tích hai ma trận vuông 28Bài tập 2.11 Cho 2 đa thức A(x) và B(x) tương ứng có bậc N và M Hãy tính ma trận tích C(x) = A(x) * B(x) có bậc N+M−1 34Bài tập 2.12 Hôm nay, cô giáo giao cho An một câu hỏi hóc búa Cô cho một danh sách với mỗi phần tử có dạng <key, value> và yêu cầu An sắp xếp danh sách đó giảm dần theo giá trị value Nếu 2 phần tử có value giống nhau thì sắp xếp giảm dần theo key Hãy viết một chương trình sử dụng hàm nặc danh để giúp An làm bài tập 39Bài 2.13 Số nguyên lớn là các số nguyên có giá trị rất lớn và không thể biểu diễn bằngcác kiểu dữ liệu nguyên cơ bản Để biểu diễn số nguyên lớn, ta có thể dùng kiểu struct như sau: 42

IT3040 – 2023.1 – Mã lớp: 732827

Trang 3

Mục lục hình ản

Hình 1 Code bài 2.1 5

Hình 2 Minh chứng đã pass bài 2.1 6

Hình 3 Code bài 2.2 7

Hình 4 Minh chứng đã pass bài 2.2 8

Hình 5 Code bài 2.3 9

Hình 6 Minh chứng đã pass bài 2.3 10

Hình 7 Code bài 2.4 12

Hình 8 Minh chứng đã pass bài 2.4 12

Hình 9 Code bài 2.5 14

Hình 10 Code bài 2.5 14

Hình 11 Code bài 2.5 15

Hình 12 Minh chứng đã pass bài 2.5 15

Hình 13 Code bài 2.6 18

Hình 14 Code bài 2.6 18

Hình 15 Minh chứng pass bài 2.6 18

Hình 16 Code bài 2.7 18

Hình 17 Minh chứng pass bài 2.7 18

Hình 18 Code bài 2.8 19

Hình 19 Minh chứng pass bài 2.8 19

Hình 20 Code bài 2.9 22

Hình 21 Code bài 2.9 22

Hình 22 Code bài 2.9 23

Hình 23 Code bài 2.9 23

Hình 24 Minh chứng pass bài 2.9 24

Hình 25 Code bài 2.10 28

Hình 26 Code bài 2.10 29

Hình 27 Code bài 2.10 29

Hình 28 Code bài 2.10 30

Hình 29 Test bài 2.10 30

Hình 30 Code bài 2.11 34

Hình 31 Code bài 2.11 35

Hình 32 Code bài 2.11 35

Hình 33 Test 1 bài 2.11 35

Hình 34 Test 2 bài 2.11 35

Hình 35 Test 3 bài 2.11 36

Hình 36 Test 4 bài 2.11 36

Hình 37 Test 5 bài 2.11 36

IT3040 – 2023.1 – Mã lớp: 732827

Trang 4

Hình 38 Code bài 2.12 39

Hình 39 Test 1 bài 2.12 39

Hình 40 Test 2 bài 2.12 40

Hình 41 Test 3 bài 2.12 40

Hình 42 Test 4 bài 2.12 40

Hình 43 Test 5 bài 2.12 41

Hình 44 Code bài 2.13 43

Hình 45 Code bài 2.13 43

Hình 46 Code bài 2.13 44

Hình 47 Code bài 2.13 44

Hình 48 Code bài 2.13 45

Hình 49 Test 1 bài 2.13 45

Hình 50 Test 2 bài 2.13 45

Hình 51 Test 3 bài 2.13 46

Hình 52 Test 4 bài 2.13 46

IT3040 – 2023.1 – Mã lớp: 732827

Trang 5

Bài thực hành số 2

Bài tập 2.1 Viết hàm tính độ dài cạnh huyền của tam giác theo độ hai cạnh góc vuông

Hình 1 Code bài 2.1

IT3040 – 2023.1 – Mã lớp: 732827

Trang 6

Hình 2 Minh chứng đã pass bài 2.1

Trang 7

return 0;

}

// Lương Hoài Nam - 20210623

Bài tập 2.2 Viết hàm hoán vị vòng tròn 3 biến a, b, c Sau khi thực hiện hàm, các biến a,

b, c tương ứng nhận các giá trị mới b, c, a.iết hàm tính độ dài cạnh huyền của tam giác theo độ hai cạnh góc vuông

Hình 3 Code bài 2.2

IT3040 – 2023.1 – Mã lớp: 732827

Trang 8

Hình 4 Minh chứng đã pass bài 2.2

Trang 9

// Lương Hoài Nam – 20210623

Bài tập 2.3 Viết chương trình yêu cầu nhập giá trị cho số nguyên x nhỏ hơn 100 In ra giátrị ax2+bx+c với a, b, c định sẵn

Hình 5 Code bài 2.3

IT3040 – 2023.1 – Mã lớp: 732827

Trang 10

Hình 6 Minh chứng đã pass bài 2.3

Trang 11

int a = 2; //# giá trị mặc định của a

int b = 1; //# giá trị mặc định của b

int c = 0; //# giá trị mặc định của c

return 0;

}

// Lương Hoài Nam - 20210623

IT3040 – 2023.1 – Mã lớp: 732827

Trang 12

Bài tập 2.4 Viết các hàm tính lập phương của số nguyên và số thực.

Hình 7 Code bài 2.4

Hình 8 Minh chứng đã pass bài 2.4

#include <stdio.h>

IT3040 – 2023.1 – Mã lớp: 732827

Trang 14

Bài tập 2.5 Viết các toán tử tính tổng, hiệu, tích và thương của hai số phức

Hình 9 Code bài 2.5

Hình 10 Code bài 2.5

IT3040 – 2023.1 – Mã lớp: 732827

Trang 16

Complex operator * (Complex a, Complex b) {

/*****************

IT3040 – 2023.1 – Mã lớp: 732827

Trang 17

# YOUR CODE HERE #

*****************/

Complex tmp;

tmp.real = a.real * b.real - a.imag * b.imag; // Tính phần thực của tích 2 số phức tmp.imag = a.imag * b.real + a.real * b.imag; // Tính phần ảo của tích 2 số phức return tmp;

// Hàm đa năng hóa toán tử << cho việc in ra số phức

ostream& operator << (ostream& out, const Complex &a) {

out << '(' << std::setprecision(2) << a.real << (a.imag >= 0 ? '+' : '-') <<

std::setprecision(2) << fabs(a.imag) << 'i' << ')';

Trang 18

cin >> real_a >> img_a;

cin >> real_b >> img_b;

Complex a{real_a, img_a}; // Khởi tạo số phức a Complex b{real_b, img_b}; // Khởi tạo số phức b

cout << a << " + " << b << " = " << a + b << endl; cout << a << " - " << b << " = " << a - b << endl; cout << a << " * " << b << " = " << a * b << endl; cout << a << " / " << b << " = " << a / b << endl;

Trang 19

Bài tập 2.6 Giả thuyết Collatz: bắt đầu từ số dương n bất kỳ, nếu n chẵn thì chia 2, nếu lẻthì nhân 3 cộng 1, giả thuyết cho rằng ta luôn đi đến n = 1 Hãy viết chương trình mô phỏng lại quá trình biến đổi để kiếm chứng giả thuyết với giá trị của n nhập từ bàn phím.

Hình 13 Code bài 2.6

IT3040 – 2023.1 – Mã lớp: 732827

Trang 20

Hình 14 Code bài 2.6

IT3040 – 2023.1 – Mã lớp: 732827

Trang 21

Hình 15 Minh chứng pass bài 2.6

Trang 22

void simulate(int n, int (*odd)(int), int (*even)(int), void (*output)(int)) { (*output)(n); // Gọi hàm truyền vào con trỏ hàm output

if (n == 1) return; // Nếu n = 1 thì dừng chương trình

Trang 23

Bài tập 2.7 Viết hàm tính tổng các phần tử trong hai mảng Yêu cầu sử dụng function template để cho phép hàm làm việc với các mảng số nguyên lẫn số thực.

Hình 16 Code bài 2.7

Hình 17 Minh chứng pass bài 2.7

#include <iostream>

IT3040 – 2023.1 – Mã lớp: 732827

Trang 24

T sum = 0; // Khởi tạo tổng = 0

for (int i = 0; i < size_a; i++)

int a[] = {3, 2, 0, val}; // Khởi tạo mảng a

int b[] = {5, 6, 1, 2, 7}; // Khởi tạo mảng b

IT3040 – 2023.1 – Mã lớp: 732827

Trang 25

cout << arr_sum(a, 4, b, 5) << endl;

}

{

double a[] = {3.0, 2, 0, val * 1.0}; // Khởi tạo mảng a double b[] = {5, 6.1, 1, 2.3, 7}; // Khởi tạo mảng b cout << arr_sum(a, 4, b, 5) << endl;

}

return 0;

}

// Lương Hoài Nam - 20210623

Bài tập 2.8 Viết hàm so sánh cho thuật toán sắp xếp

Hình 18 Code bài 2.8

IT3040 – 2023.1 – Mã lớp: 732827

Trang 26

Hình 19 Minh chứng pass bài 2.8

int val1, val2;

cin >> val1 >> val2;

Trang 28

// Lương Hoài Nam – 20210623

Bài tập 2.9 Tính hàm sigmoid Dưới đây cung cấp đoạn code đơn giản để tính hàm sigmoid theo công thức trực tiếp Hãy viết hàm tính xấp xỉ sigmoid(x) đến độ chính xác 10^−6 và có tốc độ nhanh hơn ít nhất 30% so với code đơn giản

Hình 20 Code bài 2.9

Hình 21 Code bài 2.9

IT3040 – 2023.1 – Mã lớp: 732827

Trang 29

Hình 22 Code bài 2.9

Hình 23 Code bài 2.9

IT3040 – 2023.1 – Mã lớp: 732827

Trang 30

Hình 24 Minh chứng pass bài 2.9

const int LIMIT = 100;

const int NUM_ITER = 100000;

const int NUM_INPUTS = NUM_ITER * 100;

Trang 31

// Hàm sinh ra input ngẫu nhiên để test hàm sigmoid

void prepare_input() {

const int PRECISION = 1000000;

const double RANGE = LIMIT / 20.0;

for (int i = 0; i < NUM_INPUTS; ++i) {

x[i] = RANGE * (rand() % PRECISION - rand() % PRECISION) / PRECISION; }

}

//# BEGIN fast code

//# khai báo các biến phụ trợ cần thiết

//# hàm tính sigmoid(x) nhanh sigmoid_fast(x)

inline double sigmoid_fast(double x) {

/*****************

IT3040 – 2023.1 – Mã lớp: 732827

Trang 32

# YOUR CODE HERE #

*****************/

if(x<-LIMIT) return 0; // Nếu x quá bé thì trả về 0

if(x>=LIMIT) return 1; // Nếu x quá lớn thì trả về 1

static double delta=(LIMIT*2.0)/N; // Tính toán tham số delta

int i=(x+LIMIT)/delta; // Tính toán tham số i

return (x-(-LIMIT+(delta*i)))/delta*(y[i+1]-y[i])+y[i]; // Tính toán xấp xỉ sigmoid(x)}

//# END fast code

// Đây là hàm tính thời gian chạy hàm truyền vào con trỏ hàm calc

double benchmark(double (*calc)(double), vector<double> &result) {

const int NUM_TEST = 20;

double taken = 0;

result = vector<double>();

result.reserve(NUM_ITER);

int input_id = 0;

clock_t start = clock();

for (int t = 0; t < NUM_TEST; ++t) {

Trang 33

taken = (double)(finish - start);

return taken;

}

// Đây là hàm check xem liệu hàm sigmoid_fast có đúng không

bool is_correct(const vector<double> &a, const vector<double> &b) {

const double EPS = 1e-6;

if (a.size() != b.size()) return false;

for (int i = 0; i < (int)a.size(); ++i) {

if (fabs(a[i] - b[i]) > EPS) {

scanf("%lf", &xval);

printf("%.2f \n", sigmoid_fast(xval));

if (is_correct(a, b) && (slow/fast > 1.3)) {

printf("Correct answer! Your code is faster at least 30%%!\n");

} else {

IT3040 – 2023.1 – Mã lớp: 732827

Trang 34

printf("Wrong answer or your code is not fast enough!\n"); }

return 0;

}

// Lương Hoài Nam – 20210623

Bài tập 2.10 Tính tích hai ma trận vuông

Hình 25 Code bài 2.10

IT3040 – 2023.1 – Mã lớp: 732827

Trang 35

Hình 26 Code bài 2.10

Hình 27 Code bài 2.10

IT3040 – 2023.1 – Mã lớp: 732827

Trang 37

bool operator == (const Matrix &a, const Matrix &b) { for (int i = 0; i < N; ++i) {

// Hàm nhân ma trận thông thường

Matrix multiply_naive(const Matrix &a, const Matrix &b) { Matrix c;

for (int i = 0; i < N; ++i) {

Trang 38

// Hàm tính toán thời gian chạy

double benchmark(Matrix (*multiply) (const Matrix&, const Matrix&), Matrix &result) {

IT3040 – 2023.1 – Mã lớp: 732827

Trang 39

const int NUM_TEST = 10;

const int NUM_ITER = 64;

Matrix a = base;

result = a;

double taken = 0;

for (int t = 0; t < NUM_TEST; ++t) {

clock_t start = clock();

for (int i = 0; i < NUM_ITER; ++i) {

a = multiply(a, result);

result = multiply(result, a);

}

clock_t finish = clock();

taken += (double)(finish - start);

Trang 40

double slow = benchmark(multiply_naive, a);

// Lương Hoài Nam – 20210623

Bài tập 2.11 Cho 2 đa thức A(x) và B(x) tương ứng có bậc N và M Hãy tính ma trận tích C(x) = A(x) * B(x) có bậc N+M−1

Hình 30 Code bài 2.11

IT3040 – 2023.1 – Mã lớp: 732827

Trang 42

using Complex = complex<double>;

typedef struct polynomial{

int deg; // Bậc của đa thức

vector<int>coeffecient; // Hệ số của đa thức

}polynomial;

void fastFourierTransform(vector<Complex> &A, bool isInverted){int n = A.size();

if(n<=1) return; // Nếu độ dài vector bằng 1 thì dừng

vector<Complex>A0(n/2); // Khai báo vector A0 có kích thước n/2 vector<Complex>A1(n/2); // Khai báo vector A1 có kích thước n/2 for(int i=0; 2*i<n; i++){

IT3040 – 2023.1 – Mã lớp: 732827

Trang 43

A0[i] = A[2*i]; // Chia vector A thành 2 vector con

A1[i] = A[2*i+1];

}

fastFourierTransform(A0, isInverted); // Gọi đệ quy với vector A0

fastFourierTransform(A1, isInverted); // Gọi đệ quy với vector A1

double angle = (2 * PI)/n * (isInverted? -1 : 1); // Khởi tạo góc angle

Complex w(1), w_n(cos(angle), sin(angle));

for(int i=0; 2 * i < n ; i++){

A[i] = A0[i] + w * A1[i]; // y_k = y0_k + (w_n)^k * y1_k (k=0,1, ,n/2-1)A[i + n/2] = A0[i] - w * A1[i]; // y_k+n/2 = y0_k - (w_n)^k * y1_k (k=0,1, ,n/2-1)

fastFourierTransform(b, false); // Gọi 2 hàm FFT thuận

IT3040 – 2023.1 – Mã lớp: 732827

Trang 44

for(int i=0; i<n; i++) a[i] = a[i] * b[i]; // DiscreteFT(A.B) =

DiscreteFT(A).DFT(B)

fastFourierTransform(a, true); // Gọi hàm FFT ngược với vector hệ số a sau khi tính toán

vector<int>result(deg1+deg2+1);

for(int i=0; i<deg1+deg2+1; i++){

result[i] = round(a[i].real()); // Tính toán các hệ số kết quả

cin>>P1.deg; // Nhập vào bậc đa thức 1

for(int i=0; i<=P1.deg; i++){ // Nhập vào hệ số đa thức 1

int coef;

cin>>coef;

P1.coeffecient.push_back(coef);

}

cin>>P2.deg;// Nhập vào bậc đa thức 2

for(int i=0; i<=P2.deg; i++){// Nhập vào hệ số đa thức 1

Trang 45

multiply(P1.coeffecient, P2.coeffecient, P1.deg, P2.deg); // Gọi hàm nhân đa thức}

// Lương Hoài Nam – 20210623

Bài tập 2.12 Hôm nay, cô giáo giao cho An một câu hỏi hóc búa Cô cho một danh sách với mỗi phần tử có dạng <key, value> và yêu cầu An sắp xếp danh sách đó giảm dần theogiá trị value Nếu 2 phần tử có value giống nhau thì sắp xếp giảm dần theo key Hãy viết một chương trình sử dụng hàm nặc danh để giúp An làm bài tập

Hình 38 Code bài 2.12

Hình 39 Test 1 bài 2.12

IT3040 – 2023.1 – Mã lớp: 732827

Trang 46

Hình 40 Test 2 bài 2.12

Hình 41 Test 3 bài 2.12

Hình 42 Test 4 bài 2.12

IT3040 – 2023.1 – Mã lớp: 732827

Trang 47

int key; // Biến key của Map

int value; // Biến value của Map

Map newMap; // Khai báo 1 Map mới

newMap.key = key;newMap.value = value; // Khởi tạo các trường v.push_back(newMap); // Đẩy Map mới vào vector

}

sort(v.begin(),v.end(),[](Map i, Map j)

IT3040 – 2023.1 – Mã lớp: 732827

Trang 48

// Lương Hoài Nam – 20210623

Bài 2.13 Số nguyên lớn là các số nguyên có giá trị rất lớn và không thể biểu diễn bằng các kiểu dữ liệu nguyên cơ bản Để biểu diễn số nguyên lớn, ta có thể dùng kiểu struct như sau:

struct bigNum{

char sign;

char num[101];

};

Nhiệm vụ các bạn là đa năng hóa các toán tử để thực hiện các phép toán số học với kiểu

dữ liệu số nguyên lớn vừa định nghĩa ở trên

IT3040 – 2023.1 – Mã lớp: 732827

Trang 49

Hình 44 Code bài 2.13

Hình 45 Code bài 2.13

IT3040 – 2023.1 – Mã lớp: 732827

Trang 50

Hình 46 Code bài 2.13

Hình 47 Code bài 2.13

IT3040 – 2023.1 – Mã lớp: 732827

Trang 51

Hình 48 Code bài 2.13

Hình 49 Test 1 bài 2.13

Hình 50 Test 2 bài 2.13

IT3040 – 2023.1 – Mã lớp: 732827

Ngày đăng: 11/06/2024, 17:42

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

TÀI LIỆU LIÊN QUAN

w