Đề bài: Xem công thức tính sau đây (đề thi tuyển sinh cao học ngành KHMT, năm 2011):
Trong đó Max, Min lần lượt là giá trị lớn nhất, nhỏ nhất của n số thực (được nhập vào từ thiết bị nhập chuẩn) a0, a1, …, an-1.
Chỉ dùng duy nhất 1 vòng lặp (for hoặc while), đề xuất cách thức để nhập n số thực như trên và tính giá trị của biểu thức Aver, xuất kết quả tính ra thiết bị xuất chuẩn. Viết chương trình để minh họa đề xuất đó.
Lưu ý: Phần này sinh viên chưa học về mảng, như vậy vấn đề chính của bài toán này là không thể dùng mảng để lưu giá trị của n số thực nói trên. Như vậy phải đề xuất một giải pháp “thông minh” để nhập và tính toán mà không đưa trước các số thực này vào mảng.
Phân Tích:
Với bài toán này ta thấy nó có vẻ rườm rà, rắc rối vì Max, Min chạy theo ai với i=0 tới
(n-1). Nhưng khi ta phân tích công thức ta thấy:
Aver = 2.a*a(i=0 –n-1) - 4a(i=0 –n-1)+ nMax2 + nMin2 + Max2 + Min2 -nMaxMin
= 2..a*a(i=0 –n-1) - 4a(i=0 –n-1) + 3n/2(Max2 + Min2) – nMaxMin (1)
(n-1). Nhưng khi ta phân tích công thức ta thấy:
Aver = 2.a*a(i=0 –n-1) - 4a(i=0 –n-1)+ nMax2 + nMin2 + Max2 + Min2 -nMaxMin
= 2..a*a(i=0 –n-1) - 4a(i=0 –n-1) + 3n/2(Max2 + Min2) – nMaxMin (1)
Vậy ta chỉ cần tìm :
- Tổng các số ai đến an
- Tổng bình phương các số từ ai đến an
- Tìm Max, Min.
–> Áp dụng vào (1) ta tính được aver
- Tổng các số ai đến an
- Tổng bình phương các số từ ai đến an
- Tìm Max, Min.
–> Áp dụng vào (1) ta tính được aver
Code:
+ Tính max, min, tổng, tổng bình phương:
float tinhTong(float &max, float &min, float &s1, float &s2, int n ) // tính tong, tong binh phuong, max, min
{
float a1;
float a;
int i;
s2=0;
printf("Nhap phan tu thu 0 : ");
scanf("%f",&a1);
max = a1;
min = a1;
printf(" Nhap tat ca cac phan tu: \n");
for (i=0; i<= n-1; i++)
{
printf("Phan tu thu %d : ",i);
scanf("%f",&a);
s1 = s1 + a;
s2 = s2 + a*a;
if (a > max)
max= a;
if (a< min)
min = a;
}
return s1;
}
Không có nhận xét nào:
Đăng nhận xét