вторник, 10 января 2012 г.

Задачи на массивы: с методами, но можно и без


Я догадываюсь, что эти задачи вы увидите уже только завтра: уж если у нас дело к ночи, то у вас-то уж совсем… 
Но, честное слово, раньше было никак не успеть.

Задачи можно делать с использованием методов (это самое правильное), а можно, конечно и без методов, со всеми действиями в главном методе. Во втором варианте эти задачи позже можно будет использовать для того, чтобы разобраться, как блоки из главного метода выносятся в отдельные методы и как эти методы вызываются из главного.

Задание №1
Назовем "сбалансированным" массив, в котором сумма значений в первой половине равна сумме значений во второй половине (для массива с нечетным числом ячеек центральная не учитывается при подсчете сумм).
Напишите класс, который сначала создает массив, потом заполняет его случайными числами (все нужные параметры устанавливаются гибко, то есть через ввод нужных значений с клавиатуры) и проверяет, является ли этот массив "сбалансированным".

Задание №2
Назовем "точкой баланса" в массиве ячейку, для которой выполняется следующее правило: сумма значений в ячейках "до нее" равна сумме значений в ячейках "после нее".
Напишите класс, который для каждой ячейки (начиная со второй от начала и до предпоследней – почему?) определяет, является ли она "точкой баланса" или нет.
Разумеется, сначала надо заполнить массив значениями – по такому же принципу, как и в предыдущем задании.

Задание №3
Назовем "весами" массив, в котором имеется только одна единственная "точка баланса".

Задание №4
Назовем массив "идеальными весами", если он:
1.      Соответствует определению "весы" из задания №3
2.      Значение в ячейке, которая является "точкой баланса", является делителем для суммы значений всего массива.
Напишите класс, который сначала заполняет массив значениями (как в задании №1), а затем проверяет, является ли этот массив "идеальными весами".

Уф-ф-ф-ф-ф… это все… )))
Удачи!

8 комментариев:

  1. import java.util.*;
    class n1
    { static Scanner reader=new Scanner(System.in);
    public static void main(String[] args)
    { int a[]=new int[reader.nextInt()];
    int x=reader.nextInt(), y=reader.nextInt();
    zapolni(a,x,y);
    System.out.println (Arrays.toString(a));
    int a1[]=new int[a.length/2];
    int a2[]=new int[a.length/2];
    zapolni1(a, a1, a2);
    if (sum(a1)==sum(a2)) System.out.println ("Сбалансированный");
    else System.out.println ("Не сбалансированный"); }
    static int sum (int[] b)
    { int s=0;
    for(int i=0;i<b.length;i++)
    s=s+b[i];
    return s; }
    static void zapolni(int[] l, int m, int n)
    { for(int i=0;i<l.length;i++)
    l[i]=m+(int)(n*Math.random()); }
    static void zapolni1(int[] c, int[] c1, int[] c2)
    { for (int i=0;i<c1.length;i++)
    c1[i]=c[i];
    for (int j=0;j<c2.length;j++)
    c2[j]=c[c.length-1-j]; }}

    ОтветитьУдалить
  2. Аня, я посмотрел, скопировал к себе, проверил -- все работает.
    Молодец!

    ОтветитьУдалить
  3. import java.util.*;
    class n2
    { static Scanner reader=new Scanner(System.in);
    public static void main(String[] args)
    { int a[]=new int[reader.nextInt()];
    int x=reader.nextInt(), y=reader.nextInt();
    zapolni(a,x,y);
    System.out.println (Arrays.toString(a));
    for (int i=1;i<a.length-1;i++)
    { if (sum1(a, i)==sum2(a, i))
    System.out.println (a[i]+" - точка баланса"); } }
    static int sum1 (int[] b, int k)
    { int s=0;
    for(int i=0;i<k;i++)
    s=s+b[i];
    return s; }
    static int sum2 (int[] c, int t)
    {int s=0;
    for(int i=t+1;i<c.length;i++)
    s=s+c[i];
    return s;}
    static void zapolni(int[] l, int m, int n)
    { for(int i=0;i<l.length;i++)
    l[i]=m+(int)(n*Math.random()); }}

    ОтветитьУдалить
  4. import java.util.*;
    class n3
    { static Scanner reader=new Scanner(System.in);
    public static void main(String[] args)
    { int a[]=new int[reader.nextInt()];
    int x=reader.nextInt(), y=reader.nextInt();
    zapolni(a,x,y);
    System.out.println (Arrays.toString(a));
    int a1[]=new int[a.length-2];
    int h=0;
    for (int i=1;i<a.length-1;i++)
    { if (sum1(a, i)==sum2(a, i))
    {a1[h]=1;
    h++;} }
    System.out.println(Arrays.toString(a1));
    if (a1[0]==1 && a1[1]==0)
    System.out.println("Массив является весами");
    else System.out.println("Массив не является весами"); }
    static int sum1 (int[] b, int k)
    { int s=0;
    for(int i=0;i<k;i++)
    s=s+b[i];
    return s; }
    static int sum2 (int[] c, int t)
    {int s=0;
    for(int i=t+1;i<c.length;i++)
    s=s+c[i];
    return s;}
    static void zapolni(int[] l, int m, int n)
    { for(int i=0;i<l.length;i++)
    l[i]=m+(int)(n*Math.random()); }}

    ОтветитьУдалить
  5. Аня, вторая задача решена верно, молодец.
    У меня к тебе просьба: подумай, как можно переделать твое решение так, чтобы использовать только один дополнительный метод ычисления суммы. В том виде, как ты это написала -- есть такая возможность.

    ОтветитьУдалить
  6. Аня, я посмотрел твое решение задачи №3. Должен сказать, что вариант с заполнением дополнительного массива и проверки 0-й и 1-й ячеек вместе мне даже и в голову не приходил))) Остроумно.
    Я-то сделал просто с переменной-счетчиком, по старинке)))
    Молодца.

    ОтветитьУдалить
  7. Ну да, точно, счетчик...)))

    Изменила, метод счета сумм:
    static int sum (int[] b, int k)
    { int s=0, s1=0, v;
    for(int i=0;i<k;i++)
    s=s+b[i];
    for (int j=k+1;j<b.length;j++)
    s1=s1+b[j];
    if (s==s1) v=1;
    else v=0;
    return v; }
    Цикл в главном методе:
    for (int i=1;i<a.length-1;i++)
    { if (sum(a, i)==1)
    System.out.println (a[i]+" - точка баланса");}

    ОтветитьУдалить
  8. Аня -- уважаю упорных)))
    Мы вот как раз завтра на занятии немного поговорим про один приемчик как раз на примере твоего последнего варианта.

    ОтветитьУдалить