Глава 6
Задача 6.7 "Средняя величина напряжения."
Для определения среднего напряжения в электросети показания вольтметра фиксируются каждый час в течение 72 часов. На основе этих данных и вычисляется искомая величина. Напишите программу, в которой предусмотрен ввод 72 показаний вольтметра, и определите
- среднее напряжение в сети
- часы, когда отклонение вольтажа от среднего значения превысило 10%
- любые смежные часы, когда разница между показаниями вольтметра превысила 15% от средней величины напряжения
Программа должна выводить на экран график вольтажа за 72 часа. Используйте для этого класс Graph.
Решение 2
В этой программе мы определим:
- среднее напряжение в сети
- часы, когда отклонение вольтажа от среднего значения превысило 10%
Для придания программе практического смысла, поместим данные в текстовый файл. Текстовый файл будет иметь следующий вид:
220 230 219 218 220 235 215 210
196 195 195 233 221 200 195 198
205 208 203 200 205 210 210 218
220 222 230 218 231 219 215 210
196 195 200 195 236 200 195 198
205 208 203 200 205 210 210 218
220 232 219 218 220 233 215 210
196 195 195 220 221 200 195 198
205 208 203 200 205 210 210 218
считаем данные из текстового файла в обычный массив.
После этого применим испытанную нами ранее функцию mean(), которая находит среднее значение.
Для определения значения, превысившего среднее на 10%, применим функцию
//------------------------
// через массив в параметре возвращает индексы, по которым
// в исходном массиве находятся элементы, большие,чем переданный элемент
// возвращает число повторений элемента в массиве
int moreInt2(double mas[], int n, double eql,double mas1[]){
Эта функция помещает значения, превысившие определенное значение, в новый "внешний" массив scoreFreqs2[].
Поместим данные о среднем значении и ежечастных значениях напряжения в график.
Код программы:
import java.io.*;
import java.util.*;
import java.text.*;
import javagently.Stream;
import javagently.*;
import myutilities.*;
class TestVoltage{
public static double mean (double a[], int n) {
double sum = 0;
for (int i = 1; i<= n; i++)
sum += a[i];
return sum / n;
}
TestVoltage() throws IOException {
Graph g = new Graph("Voltage", "hour", "volt");
g.setTitle("Voltage");
g.setColor(g.blue);
g.setSymbol(true);
//создадим три массива со значениями типа double
int mass = 72;
double scoreFreqs [] = new double [mass];
double scoreFreqs1 [] = new double [mass];
double scoreFreqs2 [] = new double [mass];
double meanDouble = 0; // среднее значение
Stream fin = new Stream(System.in);
try {
fin = Filer.open("data.txt");
}
catch (FileNotFoundException e) {
System.out.println("Five tries up");
System.out.println("Connecting to keyboard by default");
}
// try read file
try {
for(;;){
// инициализируем первый массив значениями
for(int i=0;i < mass; i++){
scoreFreqs [i] = fin.readInt();
}
}
}
catch (EOFException e) {
System.out.println(" All data is reading ");
}
fin.close();
// выведем массив напряжений за 72 часа
for (int i=0; i < mass; i++) {
if(i<24)
System.out.println("Day 1 houre " + i + " " +scoreFreqs[i]);
if(i >23 & i< 48)
System.out.println(" Day 2 houre " + (i-24) + " " +scoreFreqs[i]);
if(i> 47 & i< 72)
System.out.println(" Day 3 houre " + (i-48) + " " +scoreFreqs[i]);
}
//определим среднее значение напряжения использовав функцию
meanDouble = Stats.mean(scoreFreqs, (mass-1));
//выведем среднее значение
System.out.println("meanDouble --- " + Stream.format(meanDouble, 4, 1) );
//Инициализируем список для графики значениями из массива
for (int i = 0; i < mass; i++) {
g.add(i,scoreFreqs[i]);
}
////////////////////////////////
//определим часы, когда напряжение превысило среднее значение на 10%
int m = moreInt2(scoreFreqs,scoreFreqs.length, (meanDouble*1.1),scoreFreqs2);
//выведем эти часы
int d = 0;
for (int i=0; i < m; i++) {
if(scoreFreqs2[i]<24){
d =(int)scoreFreqs2[i];
System.out.println("Too large voltage: Day 1 houre "+ scoreFreqs2[i] + " " + scoreFreqs[d]);
}
if(scoreFreqs2[i] >23 & scoreFreqs2[i]< 48){
d =(int)scoreFreqs2[i];
System.out.println("Too large voltage: Day 2 houre "+ (scoreFreqs2[i]-24) + " " +scoreFreqs[d]);
}
if(scoreFreqs2[i]> 47 & scoreFreqs2[i]< 72){
d =(int)scoreFreqs2[i];
System.out.println("Too large voltage: Day 3 houre "+ (scoreFreqs2[i]-48) + " " +scoreFreqs[d]);
}
}//for
//заполним массив средним значением для графика
for (int i=0; i < mass; i++)
scoreFreqs1[i] = meanDouble;
g.nextGraph();
g.setColor(g.red);
g.setSymbol(true);
g.setTitle("Mean");
//Инициализируем список для графики значениями из второго массива
for (int i = 0; i < mass; i++) {
g.add (i, scoreFreqs1[i]);
}
///////////////////////
g.showGraph();
} // end constructor
public static void main (String [ ] args) throws IOException {
new TestVoltage ();
}
//------------------------
// через массив в параметре возвращает индексы, по которым
// в исходном массиве находятся элементы, большие,чем переданный элемент
// возвращает число повторений элемента в массиве
int moreInt2(double mas[], int n, double eql,double mas1[]){
double equal = eql;
int j = 0;
for (int i = 0; i < n; i++) {
if (mas[i] > equal) {
mas1[j] = i;
j++;
}
}
return j;
}
}//TestVoltage
Результат :
All data is reading
Day 1 houre 0 220.0
Day 1 houre 1 230.0
Day 1 houre 2 219.0
Day 1 houre 3 218.0
...
Day 2 houre 0 220.0
Day 2 houre 1 222.0
Day 2 houre 2 230.0
...
Day 3 houre 0 220.0
Day 3 houre 1 232.0
Day 3 houre 2 219.0
Day 3 houre 3 218.0
Day 3 houre 4 220.0
...
meanDouble --- 210,2
Too large voltage: Day 1 hour 5.0 235.0
Too large voltage: Day 1 hour 11.0 233.0
Too large voltage: Day 2 hour 12.0 236.0
Too large voltage: Day 3 hour 1.0 232.0
Too large voltage: Day 3 hour 5.0 233.0
Назад |
Начало урока |
Вверх |
Вперед
Содержание