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 2Mụ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 3Mụ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 4Hì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 5Bà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 6Hình 2 Minh chứng đã pass bài 2.1
Trang 7return 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 8Hì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 10Hì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 12Bà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 14Bà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 16Complex 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 18cin >> 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 19Bà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 20Hình 14 Code bài 2.6
IT3040 – 2023.1 – Mã lớp: 732827
Trang 21Hình 15 Minh chứng pass bài 2.6
Trang 22void 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 23Bà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 24T 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 25cout << 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 26Hì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 29Hình 22 Code bài 2.9
Hình 23 Code bài 2.9
IT3040 – 2023.1 – Mã lớp: 732827
Trang 30Hì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 33taken = (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 34printf("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 35Hình 26 Code bài 2.10
Hình 27 Code bài 2.10
IT3040 – 2023.1 – Mã lớp: 732827
Trang 37bool 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 39const 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 40double 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 42using 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 43A0[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 44for(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 45multiply(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 46Hì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 47int 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 49Hình 44 Code bài 2.13
Hình 45 Code bài 2.13
IT3040 – 2023.1 – Mã lớp: 732827
Trang 50Hình 46 Code bài 2.13
Hình 47 Code bài 2.13
IT3040 – 2023.1 – Mã lớp: 732827
Trang 51Hì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