Bài
2:
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 bài toán:
Với yêu cầu của bài toán là không dùng mảng, tức là
chúng ta không thể lưu được tất cả n
số thực nhập vào. Vậy, ta chỉ còn cách
là nhập số nào thì thực hiện phép tính ngay với số đó.
Nhưng trong phép tính Aver, lại có xuất hiện 2 giá trị Min và Max, mà Min và Max chỉ tính được khi chúng ta đã nhập hết tất cả n số. Như vậy, ta không thể thực hiện phép tính ngay với Min và Max trong các lần nhập, mà chỉ tính được sau khi đã nhập xong n số.
Nhưng trong phép tính Aver, lại có xuất hiện 2 giá trị Min và Max, mà Min và Max chỉ tính được khi chúng ta đã nhập hết tất cả n số. Như vậy, ta không thể thực hiện phép tính ngay với Min và Max trong các lần nhập, mà chỉ tính được sau khi đã nhập xong n số.
Giải
thuật:
Hàm Aver
ta có thể viết lại như sau:
Như
vậy để tính được Aver, ta sẻ tính qua 2 bước:
B1: tính d1 và d2 trong khi nhập các các giá trị a
B2:
các phép tính liên quan đến Min và Max ta sẻ tính sau khi nhập xong n giá trị.
Bài toán đã được giải
quyết.
Mã nguồn:
#include <stdio.h>
void aver(unsigned
int n, double&
kq);
void aver(unsigned
int n, double&
kq)
{
int i,a,d1,d2,min,max;
d1=0; d2=0;
min=2147483647; max=-2147483648;
for (i=1; i<=n; i++)
{
printf("a%d=",i);
scanf("%d",&a);
if
(a>max) max=a;
if
(a<min) min=a;
d1+= 2*a*a;
d2+=2*a;
}
kq = d1 - d2*(max+min) +
n*(max*max+min*min) +n/2.0*(max-min)*(max-min);
}
void main()
{
unsigned int
n;
int max,min;
double kq;
printf("nhap
n: ");
scanf("%u",&n);
aver(n,kq);
printf("ket
qua= %lf",kq);
}
|
Không có nhận xét nào:
Đăng nhận xét