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

Bài tập 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.
Giải:
Điều kiện không dùng vòng lặp là hiển nhiên bởi tính đến lúc viết  tôi vẫm chưa học mảng.
Nhìn vào đề bài ta thấy ngay cần phải tách các giá trị Max,Min là các số chưa biết vì đến cuối vòng lặp ta mới xác định được 2 số này.
Ta có :

Chỉ cần tính   sau khi lặp được các giá trị Max, Min thế vào Aver ta được ngay đáp số với chỉ 1 vòng lặp
Mã nguồn:
#include <stdio.h>
void main()
{
       int n,i,j,max,min;
       float aver1,aver2;
       aver1=aver2=0;
       min=2147483648;
       max=-1*min;
       printf("Input n = ");
       scanf("%d",&n);
       for (i=1;i<n;i++)
       {
              printf("nhap so thu %d\t",i);
              scanf("%d",&j);
              aver1 += j;
              aver2 += j*j;
              if (min >= j)
                     min=j;
              if (max <= i)
                     max=j;
       }
       float aver;
       aver= 2*aver2 -2*(max+min)*aver1+(n/2.0)*(max-min)*(max-min)+max*max+min*min;
       printf("%f",aver);
}






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

Đăng nhận xét