Thứ Hai, 3 tháng 12, 2012

Bài 2


Đề 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 đó MaxMin lần lượt là giá trị lớn nhất, nhỏ nhất của 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 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 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 a 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 + nMin + Max + Min -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ố ađế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