ĐỀ BÀI:
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:
Chúng ta thấy đây, đây sẽ là một bài rất dễ dàng nếu như chúng ta được sử dụng mảng phải không!
Nhưng rất tiếc, điều đó không được cho phép sử dụng trong đề bài này. Vậy làm sao có thể vừa nhập vừa đọc hết và lưu lại hết các giá trị mà không được cái gì lưu lại (ở đây có thể nói là mảng).
Do vậy, cách tốt nhất có thề đó chúng ta làm cho việc tính (ai - Max) và tính (ai-Min) được tách hẳn ra thành việc tính ai, Max, Min.
THUẬT TOÁN:
Dựa vào nhận định trên, ta sẽ phân tích Aver ra để dễ dàng tính toán:
Ta thấy đó, như vậy công việc còn lại rất là nhẹ nhàng, chỉ với một vòng lặp, ta có thể:
* Đồng thời tìm Max, Min.
Cuối cùng sau vòng lặp ta dễ dàng tính được tổng Aver.
VÀ ĐÂY LÀ CODE THAM KHẢO:
#include <stdio.h>
#include <conio.h>
#include <math.h>
void main()
{
int n,i;
float a,Min,Max,sum1,sum2;
double Aver;
printf("Nhap vao so phan tu n \n");
scanf("%d",&n);
printf("Nhap vao n phan tu \n");
sum1=0;
sum2=0;
for (i=0;i<n;i++)
{
scanf("%f",&a);
if (i==0)
{
Max=a;
Min=a;
}
else
{
if (Max<a) Max=a;
if (Min>a) Min=a;
}
sum1+=pow(a,2);
sum2+=(2*a);
}
Aver=2*sum1+n*pow(Max,2)+n*pow(Min,2)-(Max+Min)*sum2+(n/2.0)*(Max-Min)*(Max-Min);
printf("Gia tri Aver = %f",Aver);
getch();
}
CẢM ƠN CÁC BẠN ĐÃ THEO DÕI.
Không có nhận xét nào:
Đăng nhận xét