Trang

24/11/12

Bài tập nghiên cứu 2



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ị MinMax, mà MinMax 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 MinMax 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 d1d2 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