Thứ Tư, 28 tháng 11, 2012

Đồ án NMCNTT1: Bài 2


ĐỒ ÁN MÔN HỌC NM CNTT1
LỚP CỬ NHÂN TÀI NĂNG KHÓA 2012
Giảng viên ra đề:
ThS. Trương Phước Hưng


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):

  Aver = Σ(ai – Max)2 + Σ(ai – Min)2 + n/2(Max – Min)2


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 : Thông thường bái toán xử lý tính toán trên dãy số nhập vào, các giá trị nhập vào sẽ được lưu trữ trong một mảng, sau đó tùy vào yêu cầu tính toán ta sẽ duyệt các phần tử của mảng để làm tính.   Nhưng ở bài toán trên yêu cầu của đề là không dùng mảng, vì vậy ta phải tìm một giải pháp để tính trực tiếp tổng ngay trong quá trình nhập liệu.
 Ta phân tích lại phép tính như sau:
 Aver = Σ(ai – Max)2 + Σ(ai – Min)2 + n/2(Max – Min)2
         =2Σai2 – 2(Max + Min)Σa+ n(Max2 + Min2) + n/2(Max – Min)2
Sau khi phân tích lại Aver ta nhận thấy bài toán trở thành hai bài toán đơn giản hơn
  - Tính 2Σai2 và Σai các tổng này có thể tính toán trực tiếp ngay sau quá trình nhập liệu
  - Tính  n/2(Max – Min)2 và (Max2 + Min2) bằng thuật toán ta sẽ tìm được Min, Max sau khi quá trình nhập liệu kết thúc.

Sau đây là code bài toán:
  
#include <iostream>
#include <conio.h>
#include <math.h>
using namespace std;

void main()
{
 int i =0;// so luong so hang nhap vao
 double  Max= -numeric_limits<double>::min();
 double Min = numeric_limits<double>::max();
 double a;
 double S1 = 0; // s1 = a1^2 + a2^2 + .... + an^2
 double S2 =0; // s2 = a1 + a2 + a3 + a4... + an;
 double aver;
 
 while((cout <<"Nhap so a" << i << " = ")&&(cin >> a))
 {
  S2 +=  a;
  S1 +=  a*a;
  if(Max < a) Max = a;
  if(Min > a) Min = a;

  i++;
 }

 aver = 2 * S1 - 2 * (Max + Min) * S2 + i * (Max * Max + Min * Min) + (double)i/2 * (Max - Min) * (Max - Min);
 cout << "Gia tri Aver tinh duoc la " << aver;
 system("pause");
}
    

Không có nhận xét nào:

Đăng nhận xét