среда, 12 октября 2011 г.

Очередная порция задач (циклы, случайные числа)


Сегодня прошло очень приятное и интересное занятие с группой из Салавата. Несмотря на каникулы и на то, что частью уехала в Москву готовиться к одной из предметных олимпиад (ах, какие молодцы!), остальные пришли на занятие. Браво!
Мы позанимались сегодня двумя очень сложными задачами – и с хорошим результатом: не в том смысле, что мы разобрались с конкретными задачами, а в том смысле, что еще и поговорили о важных вещах в смысле подхода к решениям.




Поскольку каникулы – задач будет сегодня немного:
Три первых – на генерацию случайных чисел (или – ввод данных с клавиатуры) и использование счетчиков
Остальные – на всякие математические хитрости)))
Успеха!

Задание №1
Права на вождение мопеда можно получить с 14 лет, на вождение мотоцикла – с 16 лет, на вождение автомобиля – с 18 лет.
Напишите класс, который генерирует тройки чисел из набора 0-1 (0=нет права на вождение данного вида, 1-есть право) – какими видами транспорта данный водитель имеет право управлять.

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

Задание №3
Напишите класс, который генерирует серию из 20 случайных двузначных чисел и определяет:
Сколько раз повторяется в серии первое число
В каких позициях (местах) повторяется первое число
Сколько других чисел встречается между парой чисел, равных первом

Задача №4
Напишите класс, который принимает с клавиатуры число N и определяет, какая цифра стоит на N месте в серии целых положительных чисел.
Например: если N=26, то это цифра 7 (серия=01234567891011121314151617)

Задача №5
Напишите класс, который принимает с клавиатуры целое положительное число и определяет два целых числа, между которыми расположен корень из введенного с клавиатуры числа – или целое число, равное корню квадратному из введенного с клавиатуры числа.
Примечание: не использовать операцию вычисления квадратного корня.

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

Задача №7
Назовем "уникальным" трехзначное число, для которого выполняются (одновременно) следующие правила:
В "перевернутом" виде оно не равно самому себе (121 – не годится)
Не содержит двух нулей подряд (300 – не годится)
Корень квадратный из произведения числа на число с обратным порядком цифр – тоже целое число.
Напишите класс, который принимает с клавиатуры целое положительное число и проверяет, является ли оно "уникальным".
Измените класс так, чтобы он выводил на экран все "уникальные" трехзначные числа.
Примечание: не использовать операцию вычисления квадратного корня.

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

  1. Поменьше строчек сделала, чтобы снова странностей с публикацией комментариев не было

    import java.util.*;
    class Zadanie_2
    {static Scanner reader = new Scanner (System.in);
    public static void main (String [] args)
    {int b,a,c,d,e,i;
    e=0; d=0; c=0; b=0;
    for (i = 1; i<21; i++) {
    a=(int)((40-10+1)*Math.random())+10;
    System.out.print (a+" ");
    if (a>=14) b=b+1;
    if (a>=16) c=c+1;
    if (a>=18) d=d+1;
    if (a<14) e=e+1;}
    System.out.print ("Права на вождение мопеда имеют "+b);
    System.out.print (" Права на вождение мотоцикла имеют "+c);
    System.out.print (" Права на вождение автомобиля имеют "+d);
    System.out.print (" Прав не имеют "+e);}}

    ОтветитьУдалить
  2. import java.util.*;
    class Zadanie_3
    { static Scanner reader = new Scanner (System.in);
    public static void main (String [] args)
    { int n,a,i,x,b;
    n=0; b=0;
    for (i = 1; i<21; i++)
    { a=(int)(90*Math.random())+10;
    n=n+1;
    if (n==1)
    {x=a;
    if (x==a)
    { b=b+1;
    System.out.println ("В позициях под номерами "+n+" ");
    System.out.print (b+" раз"); }}}}}

    ОтветитьУдалить
  3. Со второй задачей все хорошо. Есть пара замечаний по стилю программирования - штука важная, особенно когда программы становятся все сложнее и сложнее.
    1) когда речь идет о счетчике, общепринято писать b++ вместо b=b+1
    2) если мы планируем вывод большого количества результатов, то удобнее выводить их в строку, используя
    System.out.print (a+" ");
    а вот результаты суммирующие лучше выводить с помощью команды System.out.println
    3) а возраст старше 40 уже не бывает? Грустно )))

    ОтветитьУдалить
  4. А с третьей задачей хуже.
    К сожелению, она работает неправильно. Это может быть незаметно, если запустить только один раз, но в задачах на случайные числа всегда следует проверять несколько раз. Я советую изменить диапазон случайных чисел, скажем, на числа однозначные (1-9), тогда вероятность повторения первого числа гораздо выше и будет заметна ошибка

    Обрати внимание, что у первого сгенерированного числа есть особая роль по сравнению с остальными, поэтому логично не генерировать 20 чисел, а генерировать первое (в переменную х) и еще 19 в переменную а. Тогда и проверки будут проще

    ОтветитьУдалить
  5. Этот комментарий был удален автором.

    ОтветитьУдалить
  6. Извиняюсь по поводу возраста, не хотела обидеть

    Третью переделала, обнаружила, что забыла про последнее условие задачи. Программа получилась "неуклюжая", уверена, что можно было сделать как-то иначе

    ОтветитьУдалить
  7. import java.util.*;
    class Zadanie_3
    { static Scanner reader = new Scanner (System.in);
    public static void main (String [] args)
    { int n,a,i,m,b,l,k,o;
    n=0; m=0; l=0; k=0; o=0;
    a=(int)(90*Math.random())+10;
    for (i=1; i<20; i++)
    { b=(int)(90*Math.random())+10; n++;
    if (b==a)
    {m++;
    System.out.println ("В позици под номером "+n);
    System.out.println (m+"раз"); }
    if (m==1) l++;
    if (b==a && m!=1)
    System.out.println (l-1+" чисел между повторениями 1 и 2");
    if (m==2) k++;
    if (b==a && m>2)
    System.out.println (k-1+" чисел между повторениями 2 и 3");
    if (m==3) o++;
    if (b==a && m>3)
    System.out.println (o-1+" чисел между повторениями 3 и 4");}}}

    ОтветитьУдалить
  8. Этот комментарий был удален автором.

    ОтветитьУдалить
  9. Annie, упорство вознаграждается)))
    В последнем варианте есть одна проблема, которую надо исправить: команда System.out.println (r+" максимальный диапозон чисел"); у тебя расположена внутри цикла, и поэтому есть шанс, что она будет срабатывать несколько раз (сделай верию из 200 чисел, сама увидишь), а ведь она должна выдавать инормацию один-единственный раз.
    Выведи ее за пределы цикла -- это называется "не печатать промежуточные результаты, если нужен только конечный".

    ОтветитьУдалить
  10. Вот, все исправила, все добавила, работает, кажется, верно

    import java.util.*;
    class Zadanie_3_1
    { static Scanner reader = new Scanner (System.in);
    public static void main (String [] args)
    { int n,a,i,b,r,m;
    n=0; m=0; r=0;
    a=(int)(90*Math.random())+10;
    for (i=1; i<21; i++)
    { b=(int)(90*Math.random())+10;
    if (b!=a) n++;
    if (b==a)
    { System.out.println ("В позиции под номером "+(i+1));
    System.out.println (n+" чисел между ними");
    if (m>r)
    r=Math.max(m,n);
    if (r>m)
    r=Math.max(r,n);
    m=n;
    n=0; }}
    System.out.println (r+" максимальный диапозон чисел");}}

    ОтветитьУдалить
  11. Задача выше содержит еще одно условие - находит самую длинную серию чисел между числами, равными первому

    ОтветитьУдалить
  12. Annie, все отлично!
    Одно совсем не принципиальное соображение: поскольку у тебя написано for (i=1; i<21; i++), то в общей сложности получается 21 число. Но это правда не принципиально, просто лучше изменить на for (i=1; i<20; i++) для полного сооответствия

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