Назад | Начало урока | Вперед
Содержание

Глава 6

Задача 6.11 "Рост населения."

С 1980 года статистические данные о численности населения Саванны хранятся в файле, где в каждой строке указан год рождения и количество жителей Саванны за текущий год. Напишите программу, которая считывает эти данные из файла и находит два идущих подряд года, когда процент увеличения населения был наивысшим. Возможно данные придется отсортировать.

Решение

Эта небольшая программа превратилась в целое исследование. Пришлось создать специализированный класс

class StatPeople {

int year;
int people;
int grow;
double proc;
StatPeople(int y, int p, int g, double pr ){
year = y;
people = p;
grow = g;
proc = pr;
}
void write () {
System.out.println(year + " " + people + " people " + " grow: " + grow + " " + Stream.format(proc,4,2) + " %");
}
}

Переменные в этом классе обозначают год, количество населения, абсолютный прирост за год, процент прироста за год. Поскольку нам точно известно количество лет, за которые велась статистика, то используем в программе обычный массив объектов класса StatPeople. При чтении из файла заполним массив объектами. Затем при повторном прохождении массива заполним данными поля абсолютного и процентного роста населения.

Затем найдем два идущих подряд два года, в течение которых прирост населения был наибольшим.

Затем отсортируем массив по абсолютному приросту и по процентному приросту.
Программа интересная.

Код программы:


import java.io.*;
import javagently.*;
import util.*;

class GrowthPeople {


// сортировка по абсолютному приросту
void selectionSort2 (StatPeople[] a, int n) {
StatPeople temp;
int chosen;
for (int leftmost = 0; leftmost < n-1; leftmost++) {
chosen = leftmost;
for (int j = leftmost+1; j < n; j++)
if (a[j].grow < a[chosen].grow)
chosen = j;
temp = a[chosen];
a[chosen] = a[leftmost];
a[leftmost] = temp;
}
}

// сортировка по процентному приросту
void selectionSort3 (StatPeople[] a, int n) {

StatPeople temp;
int chosen;
for (int leftmost = 0; leftmost < n-1; leftmost++) {
chosen = leftmost;
for (int j = leftmost+1; j < n; j++)
if (a[j].proc < a[chosen].proc)
chosen = j;
temp = a[chosen];
a[chosen] = a[leftmost];
a[leftmost] = temp;
}
}

GrowthPeople() throws IOException {

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");
}

System.out.println();
System.out.println(" GrowthPeople ");

int m = 21;
StatPeople[] p = new StatPeople[m];

//считаем из файла в массив
try {

for(int i = 0;i < p.length;i++){
p[i] = new StatPeople(0,0,0,0);
p[i].year = fin.readInt();
p[i].people = fin.readInt();
}
}
catch (EOFException e) {
System.out.println(" All data is reading ");
}

// for(int j = 0; j < p.length; j++){

// p[j].write(); //
//}

//заполним переменные grow (прирост) и proc (процент) в объектах
for(int j = 0; j < p.length - 1; j++){
p[j].grow = (p[j+1].people - p[j].people);
p[j].proc = (double)p[j].grow*100/p[j].people;
}

//-------------------
//найдем два подряд года с наибольшим абсолютным приростом
int max = 0;
int index = 0;

for(int j = 0; j < p.length - 2; j++){

int k = 0;
int h = 0;
int sum = 0;
k = p[j].grow;
h = p[j+1].grow;
sum = k+h;
if(max < sum){
max = sum;
index = j;
}
}

System.out.println(" ");
System.out.println(" Maximum growth in absolute");
p[index].write();
System.out.println(" Growth to year " + p[index].grow);
p[index+1].write();
System.out.println(" Growth to year " + p[index+1].grow);

System.out.println(" Sum of grow for 2 years: " + (p[index].grow + p[index+1].grow));

//-------------------------
//найдем два подряд года с наибольшим % приростом
double max1 = 0;
index = 0;

for(int j = 0; j < p.length - 2; j++){

double k = 0;
double h = 0;
double sum = 0;
k = p[j].proc;
h = p[j+1].proc;
sum = k+h;
if(max1 < sum){
max1 = sum;
index = j;
}
}

System.out.println(" ");
System.out.println(" Maximum growth in % ");
p[index].write();
System.out.println(" Growth to year " + Stream.format(p[index].proc,4,4));
p[index+1].write();
System.out.println(" Growth to year " + Stream.format(p[index+1].proc,4,4));

System.out.println(" Sum of grow for 2 years: " + Stream.format((p[index].proc + p[index+1].proc),4,4)+" %");

//-------------------
//определим абсолютную величину прироста населения за 20 лет
System.out.println(" " );
int z = p[p.length-1].people - p[0].people;
System.out.println(" Grow in 20 years: "+ (p[p.length-1].people - p[0].people)+ " peoples" );

//определим % прироста населения за 20 лет
System.out.println(" Grow in % in 20 years: " + Stream.format((double)z*100/p[0].people,4,4) + " %");

//отсортируем массив по абсолютному приросту
selectionSort2(p,p.length);

//выведем отсортированный по абсолютному приросту массив
System.out.println(" " );
System.out.println(" Sorting in absolute " ); for (int j=0;j < p.length;j++) {

p[j].write();
}

//отсортируем массив по % приросту
selectionSort3(p,p.length);

//выведем отсортированный по % приросту массив
System.out.println(" " );
System.out.println(" Sorting in % " );
for (int j=0;j < p.length;j++) {

p[j].write();
}

}//end construct

public static void main (String[] args) throws IOException {

new GrowthPeople();
}

}// end class

class StatPeople {

int year;
int people;
int grow;
double proc;
StatPeople(int y, int p, int g, double pr ){
year = y;
people = p;
grow = g;
proc = pr;
}
void write () {
System.out.println(year + " " + people + " people " + " grow: " + grow + " " + Stream.format(proc,4,2) + " %");

}

}


Результат :

GrowthPeople

Maximum growth in absolute
1982 63511 people grow: 214 0,34 %
Growth to year 214
1983 63725 people grow: 745 1,17 %
Growth to year 745
Sum of grow for 2 years: 959

Maximum growth in %
1982 63511 people grow: 214 0,34 %
Growth to year 0,3369
1983 63725 people grow: 745 1,17 %
Growth to year 1,1691
Sum of grow for 2 years: 1,5060 %

Grow in 20 years: 5578 peoples
Grow in % in 20 years: 8,8540 %

Sorting in absolute
2000 68578 people grow: 0 0,00 %
1984 64470 people grow: 140 0,22 %
1997 67667 people grow: 143 0,21 %
1985 64610 people grow: 148 0,23 %
1991 66121 people grow: 193 0,29 %
1982 63511 people grow: 214 0,34 %
1994 66839 people grow: 215 0,32 %
1993 66618 people grow: 221 0,33 %
1987 65020 people grow: 231 0,36 %
1980 63000 people grow: 250 0,40 %
1999 68325 people grow: 253 0,37 %
1981 63250 people grow: 261 0,41 %
1986 64758 people grow: 262 0,40 %
1990 65839 people grow: 282 0,43 %
1996 67383 people grow: 284 0,42 %
1988 65251 people grow: 292 0,45 %
1989 65543 people grow: 296 0,45 %
1992 66314 people grow: 304 0,46 %
1995 67054 people grow: 329 0,49 %
1998 67810 people grow: 515 0,76 %
1983 63725 people grow: 745 1,17 %

Sorting in %
2000 68578 people grow: 0 0,00 %
1997 67667 people grow: 143 0,21 %
1984 64470 people grow: 140 0,22 %
1985 64610 people grow: 148 0,23 %
1991 66121 people grow: 193 0,29 %
1994 66839 people grow: 215 0,32 %
1993 66618 people grow: 221 0,33 %
1982 63511 people grow: 214 0,34 %
1987 65020 people grow: 231 0,36 %
1999 68325 people grow: 253 0,37 %
1980 63000 people grow: 250 0,40 %
1986 64758 people grow: 262 0,40 %
1981 63250 people grow: 261 0,41 %
1996 67383 people grow: 284 0,42 %
1990 65839 people grow: 282 0,43 %
1988 65251 people grow: 292 0,45 %
1989 65543 people grow: 296 0,45 %
1992 66314 people grow: 304 0,46 %
1995 67054 people grow: 329 0,49 %
1998 67810 people grow: 515 0,76 %
1983 63725 people grow: 745 1,17 %


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz