BÀI 2 – Đồ Án NMCNTT1

ĐỀ BÀI

Xem công thức tính sau đây (đề thi tuyển sinh cao học ngành KHMT, năm 2011):

Aver=\sum\limits_{i=0}^{n-1}{{{\left( {{a}_{i}}-Max \right)}^{2}}+\sum\limits_{i=0}^{n-1}{{{\left( {{a}_{i}}-Min \right)}^{2}}+\frac{n}{2}{{\left( Max-Min \right)}^{2}}}}

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) {{a}_{0}}, {{a}_{1}}, …, {{a}_{n-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.

BÀI GIẢI + SUY LUẬN

Theo đề bài, 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, vì vậy ta cần 1 giải pháp khôn khéo để nhập và tính toán mà không đưa trước các số thực này vào mảng.

Thật vậy, đối với công thức Aver nói trên, ta chỉ dùng một vòng lặp (for hoặc while) để giải quyết bài toán. Vì thế ta cần biến đổi và rút gọn Aver lại để trở thành 1 biểu thức khác dễ sử dụng vòng lặp hơn. Và ta biến đổi như sau:

Aver=\sum\limits_{i=0}^{n-1}{{{\left( {{a}_{i}}-Max \right)}^{2}}+\sum\limits_{i=0}^{n-1}{{{\left( {{a}_{i}}-Min \right)}^{2}}+\frac{n}{2}{{\left( Max-Min \right)}^{2}}}}
=\left( \sum\limits_{i=0}^{n-1}{a_{i}^{2}-2Max\sum\limits_{i=0}^{n-1}{{{a}_{i}}+nMa{{x}^{2}}}} \right)+\left( \sum\limits_{i=0}^{n-1}{a_{i}^{2}-2Min\sum\limits_{i=0}^{n-1}{{{a}_{i}}+nMi{{n}^{2}}}} \right)+\frac{n}{2}{{\left( Max-Min \right)}^{2}}
=2\sum\limits_{i=0}^{n-1}{a_{i}^{2}-2\left( Max+Min \right)}\sum\limits_{i=0}^{n-1}{{{a}_{i}}}+n\left( Ma{{x}^{2}}+Mi{{n}^{2}} \right)+\frac{n}{2}{{\left( Max-Min \right)}^{2}}
=2P-2\left( Max+Min \right)Q+\frac{3n}{2}\left( Ma{{x}^{2}}+Mi{{n}^{2}} \right)-n.Max.Min
với P=\sum\limits_{i=0}^{n-1}{a_{i}^{2}} và Q=\sum\limits_{i=0}^{n-1}{{{a}_{i}}}

Ban đầu, ta gán max = min = giá trị a đầu tiên nhập vào, kế đến sử dụng 1 vòng lặp for để tính lần lượt giá trị P và Q theo các a tiếp theo, đồng thời trong quá trình này, ta cũng tìm min và max mới để so sánh lần lượt với giá trị cũ để tìm ra kết quả min và max cuối cùng.

Sau đó tính S = Aver. Tóm lại bằng duy nhất 1 vòng lặp for, nhưng hạn chế ở chỗ trùng mã printf và scanf, ta tính được giá trị Aver.

MÃ NGUỒN

#include <stdio.h>
void main()
{
float a, P=0, Q=0, S=0, max, min;
int n, i;
printf(“Nhap may so: “);
scanf(“%d”, &n);
printf(“Nhap a: “);
scanf(“%f”, &a);
P=P+a*a;
Q=Q+a;
max = min = a;
for (i=1; i<=(n-1); i++)
{
printf(“Nhap a: “);
scanf(“%f”, &a);
P=P+a*a;
Q=Q+a;
if (max < a)
max = a;
if (min > a)
min = a;
}
S = 2*P – 2*(max+min)*Q + 3*n*0.5*(max*max+min*min) – n*max*min;
printf(“Aver = %f\n”, S);
}

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s