Автор Тема: задача по Java  (Прочитано 4431 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Хакамада

  • Старожил
  • ****
  • Сообщений: 504
  • Карма: -66
  • Пол: Женский
    • Просмотр профиля
задача по Java
« : 04.03.07, 14:18:38 »
 [preved] Недавно начла изучать Java, но, к сожалению, нам уже задали задачи. две я смогла решить, а третью не могу понять, как сделать <:/
1) Нужно проверить, принадлежит ли элемент множеству..
как правильно задать множество?..
2) Подскажите русскоязычные сайты по Java, которые могут помочь новичку или на которых выложены разные программы - примеры. 
[elsite]  [elsite]  [elsite]  [elsite]  [elsite]


Оффлайн koks

  • Пользователь
  • **
  • Сообщений: 55
  • Карма: 5
  • Пол: Мужской
  • jazz
    • Просмотр профиля
Re: задача по Java
« Ответ #1 : 05.03.07, 19:18:38 »
может быть, если обозначить и прописать множество, как массив...?!
потом можно будет делать с ним все, что угодно, в т.ч. и сравнить элемент с каждым элементом массива

Оффлайн LEND

  • Пользователь
  • **
  • Сообщений: 95
  • Карма: 155
  • Истина как всегда где-то рядом
    • Просмотр профиля
Re: задача по Java
« Ответ #2 : 05.03.07, 21:12:20 »
Правильно koks надо через массив.
Хакамада! ВЫ не помните, что означает МНОЖЕСТВО?
Давайте вспомним.
Множество - это группа элементов, которая ассоциируется с ее именем и с которой можно сравнивать другие величины, чтобы определить, принадлежат ли они этому множеству. Один и тот же элемент не может входить в множество более одного раза. Как частный случай, множество может быть пустым.
Множества определяется перечислением его элементов, заключенным в прямоугольные скобки. Такая форма определения называется конструктором множества.
 Ну, еще - Под множеством также понимается совокупность объектов, которая может состоять, например, из одного, двух и т.д. элементов.
Множества чаще всего обозначаются прописными буквами латинского алфавита
A,B,...,X, а их элементы - малыми буквами:  a,b,...,x.
Пустое множество обозначается специальным символом круг с наклонным пересечением.
Если множество A состоит из n элементов a1,a2,...,an, то пишут
    A={a1;a2;...;an}
Указывают: <<элемент a принадлежит множеству A>> - и записывают:
a (- A  или A -) a (A содержит a); запись a # A или A # a означает, что элемент a не принадлежит множеству A (A не содержит a).
Я не буду писать об операциях над множествами. Все это можно найти в учебниках по математике или в  справочниках по математике.

В вашем примере необходимо доказать - входит ли введенное вами число или элемент (как ВАМ удобно) в множество.
Пусть в нашем случае множество - A имеет следующие элементы -5,-4,-3,-1,0,1,4,6
или A={-5,-4,-3,-1,0,1,4,6}
Можно еще и Матрицу подвести под множество. Лишь бы не было одинаковых элементов. Мы можем ее приставить как Массив. Тогда просто делаем поиск в массиве.
Есть просто ПОИСК, а есть ДВОИЧНЫЙ ПОИСК. Есть просто ПОИСК в неотсортированном массиве, а есть просто ПОИСК в отсортированном массиве.
Двоичный поиск возможен только в отсортированном массиве. Вся задача сводится к поиску введенного числа в массиве.
Привожу пример на C++(самый легкий) - поиск в отсортированном массиве.
Mnoj.cpp
===============================================
# include <stdio.h>
# include <conio.h>
# include <stdlib.h>
# include <string.h>
# include <iostream.h>
# include <time.h>
main(void)
 {
const n=8; //Кол. элементов множества A
const li=1; // Элемент который мы хотим найти в массиве - т.е. узнать входит ли он в множество A
                                              //  Это число можно менять
int m,j,p; //Cчетчики
int min;   //Переменная обмена

int k1[n]={-3,4,-5,1,6,0,-4,-1}; // Элементы множества
int k[n]; //Массив  k[n]
int priz; // Признак вхождения элемента в множество A
clrscr();
cout <<"Всего элементов множества A=";cout <<n ;
puts("\n");
//priz=0;
cout <<"Узнать входит ли число ";cout <<li <<" в множество A";
puts("");
puts("Даны элементы множества A");
          for(m=0;m< sizeof(k1)/sizeof(k1[0]); m++)
             {
           printf("%d ",k1[m],' ');
                k[m]=k1[m];
              }

//================ Сортируем элементы множества A в возрастающем порядке
    for(m=1;m<=n-1;m++)
    {
      for(j=1;j<=n-1;j++)
      {
       if (k[j+1]<=k[j]) {
                  min=k[j];
                  k[j]=k[j+1];
                  k[j+1]=min;
                 }
    }
     }
//==== Отсортированный порядок элементов множества A ==== }
puts("");
puts("Отсортированная порядок");

          for(m=1;m<=n;m++)
             {
           printf("%d ",k[m],' ');
              }
          puts("\n");
//================== Ищем Элемент в множестве ========= }
          for(m=1;m<=n;m++)
             {
              if(li==k[m])
               {
             priz=0;
             break;
                               }
              }
        if(priz==0) puts("Входит"); else puts("Нет");


//==================================================== }
puts("Продолжение - ENTER(ВВОД)");
getche();
return 0;
 }

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
А теперь программу написанную на С++ переводим в java программу.
Вот, только не помню, есть ли JAVA операции с sizeof. Все остальное присутсвует.
Если нет sizeof, то просто вместо -> for(m=0;m< sizeof(k1)/sizeof(k1[0]); m++)
поставьте for(m=0;m<=n;m++)
Программа на Java
Mnoj.java
================================================
package com.basics // должно быть доменное имя
//Создайте директорию MJAVA, a в нем КАТАЛОГ СОМ, а в нем каталог BASICS

public class mnoj
{
public static void main(String[] args)
  {
const n=8; //Кол.элементов множества A
const li=1;

int m,j,p; //Cчетчики
int min;   //Переменная обмена

int k1[n]={-3,4,-5,1,6,0,-4,-1}; // Элементы множества A
int k[n]; //Массив  k[n]
int priz; // Признак вхождения элемента в множество A

System.out.println("Всего элементов множества A="+n);
System.out.println("Узнать входит ли число "+li+" в множество A");
System.out.println("Даны элементы множества A");
          for(m=0;m< sizeof(k1)/sizeof(k1[0]); m++)
             {
          System.out.print(k1[m],' ');
                k[m]=k1[m];
              }
//================ Сортируем элементы множества A в возрастающем порядке
    for(m=1;m<=n-1;m++)
    {
      for(j=1;j<=n-1;j++)
      {
       if (k[j+1]<=k[j]) {
                  min=k[j];
                  k[j]=k[j+1];
                  k[j+1]=min;
                 }
    }
     }
//==== Отсортированный порядок элементов множества A ==== }
System.out.println("Отсортированная порядок");
          for(m=1;m<=n;m++)
             {
           System.out.print(k[m]+' ');
              }
          System.out.println("");
//================== Ищем Элемент в множестве ========= }
          for(m=1;m<=n;m++)
             {
              if(li==k[m])
               {
             priz=0;
             break;
                               }
              }
  if(priz==0) System.out.println("Входит"); else System.out.println("Нет");
//==================================================== }
  }
}


Ну вот и все.
В свое время я пользовался книгой
Девид Фленаган "JAVA в примерах" Справочник,Учебное пособие к книге "Java. Справочник"
Программа на C++ работает, а вот программу на Java я не запускал на исполнение.
Если ВЫ уже сделали 2 программы, то запустите и эту. Все ВАМ придется проверить самой.
Удачи. Я уверен что у ВАС все получится.
С уважением LEND
« Последнее редактирование: 05.03.07, 21:17:58 от LEND »
В мире временном, сущность которого - тлен,
Не сдавайся вещам несущественным в плен. © О.Х.

Оффлайн rockerzz

  • Старожил
  • ****
  • Сообщений: 762
  • Карма: 118
  • Пол: Мужской
  • Freefly
    • Просмотр профиля
Re: задача по Java
« Ответ #3 : 05.03.07, 22:40:15 »
Нафик такие сложности? Есть коллекции HashSet и TreeSet и есть метод equals() или contains() который как раз и предназначен для определения наличия объекта в множестве. Лучше использовать специально предназначенные для этого средства. =)


И вот что получается:


HashSet set = new HashSet();
final int size = 10;
final int element = 3;

for( int i = 0; i < size; i++ )  set.add( i );
       
System.out.println( set.contains( element ) ? "входит" : "фиг" );

« Последнее редактирование: 05.03.07, 23:17:06 от rockerzz »
Fly like a brick

Оффлайн LEND

  • Пользователь
  • **
  • Сообщений: 95
  • Карма: 155
  • Истина как всегда где-то рядом
    • Просмотр профиля
Re: задача по Java
« Ответ #4 : 06.03.07, 20:26:35 »
rockerzz
Согласен и поддерживаю.
Написал легкий код чтобы было понятно для тех, кто только начал писать на JAVA и возможно знают C,C++.
Можно вообще написать набор массива от 1 до N и не указывать сам МАССИВ.
  for( int i = 0; i <=N; i++ )
   где N допустим 10

Здесь поиск элемента прост.
li - допустим будет равно 3
priz - признак определения вхождения Элемента.
          for(i=1;i<=n;i++)
             {
              if(li==i)
               {
             priz=0;
             break;
                               }
              }
        if(priz==0) puts("Входит"); else puts("Нет");

Я же брал неупорядочное приведенное множество.
И еще - если применять конструкцию которая ВАМИ граммотно написана:
===================================================================
HashSet set = new HashSet();
final int size = 10;
final int element = 3;
for( int i = 0; i < size; i++ )  set.add( i );
System.out.println( set.contains( element ) ? "входит" : "фиг" );
===================================================================
то надо еще добавить import java.util.*;
Интерфейс collection из пакета java.util описывает общие свойства коллекций List и set . Он содержит методы добавления и удаления элементов, проверки и преобразования элементов.
И выглядит это так

package com.basics
 import java.util.*; 
  public class mnoj
  {
    и т.д. и т.д.
  }
В моем же примере этот пакет ставить необязательно.
А так все правильно!
Спасибо что написали.
LEND
В мире временном, сущность которого - тлен,
Не сдавайся вещам несущественным в плен. © О.Х.

Оффлайн Хакамада

  • Старожил
  • ****
  • Сообщений: 504
  • Карма: -66
  • Пол: Женский
    • Просмотр профиля
Re: задача по Java
« Ответ #5 : 06.03.07, 22:23:31 »
спасибо, )
Всё понятно, т.к. знаю С/С++ ( основное).
А коллекциями HashSet и TreeSet и методами equals() или contains()  мы ещё не занимались, для меня пока рановато.
Вношу некоторые изменения, попозже выложу)
[elsite]  [elsite]  [elsite]  [elsite]  [elsite]

Оффлайн Хакамада

  • Старожил
  • ****
  • Сообщений: 504
  • Карма: -66
  • Пол: Женский
    • Просмотр профиля
Re: задача по Java
« Ответ #6 : 06.03.07, 23:14:10 »
Вроде бы всё хорошо, но выдается одна ошибка -у priz неправльный тип, он меняется.Как исправить?
файл Mnojestvo2.java
..................................................................................................................................................

class Mnojestvo2
{
public static void main(String[] args)
  {
int a[],i,j,z,k=0, n=10;
int li=1;
int priz;
int m;
a=new int[10];
for (i=0; i<n; i++)
a=i%2==0?i:-i;
//упорядочение элементов массива
for(i=0;i<n;i++)
if(a<0)
     {z=a;
      for(j=i-1;j>=k;j--)
      a[j+1]=a[j];
      a[k++]=z;}
//печать результатов
for(i=0; i<n; i++)
System.out.print(a+" ");
System.out.println();

for(m=1;m<=n;m++)
             {
              if(li==a[m])
               { priz=0;
                 break; }
              }
  if(priz=0) System.out.println("Vhodit"); else System.out.println("Ne vhodit"); 
}
}
[elsite]  [elsite]  [elsite]  [elsite]  [elsite]

Оффлайн Хакамада

  • Старожил
  • ****
  • Сообщений: 504
  • Карма: -66
  • Пол: Женский
    • Просмотр профиля
Re: задача по Java
« Ответ #7 : 07.03.07, 22:43:01 »
Вотъ, неправильная у меня програмка, точнее, множество задано правильно, отсортированно правильно, но !
массив задается числами в "двоичной системе".
Например, 6=000001( на шестом месте единица).
И сравнение с множеством будет другим.
Всё равно решу эту задачу!!!!
П.с. А тип у priz так и меняется(
found: int
required:boolean
[elsite]  [elsite]  [elsite]  [elsite]  [elsite]

Оффлайн Хакамада

  • Старожил
  • ****
  • Сообщений: 504
  • Карма: -66
  • Пол: Женский
    • Просмотр профиля
Re: задача по Java
« Ответ #8 : 07.03.07, 23:52:48 »
Так поставлена  задача.
[elsite]  [elsite]  [elsite]  [elsite]  [elsite]

Оффлайн rockerzz

  • Старожил
  • ****
  • Сообщений: 762
  • Карма: 118
  • Пол: Мужской
  • Freefly
    • Просмотр профиля
Re: задача по Java
« Ответ #9 : 08.03.07, 00:10:06 »
П.с. А тип у priz так и меняется(
found: int
required:boolean


Не удивительно...   if(priz=0) - это чего такое? Может все таки вместо "=" "==" стоит попробовать? =))
Fly like a brick

Оффлайн Хакамада

  • Старожил
  • ****
  • Сообщений: 504
  • Карма: -66
  • Пол: Женский
    • Просмотр профиля
Re: задача по Java
« Ответ #10 : 08.03.07, 00:15:24 »
Никак не могу понять, зачем нужен package com.basics?
 
[elsite]  [elsite]  [elsite]  [elsite]  [elsite]

Оффлайн rockerzz

  • Старожил
  • ****
  • Сообщений: 762
  • Карма: 118
  • Пол: Мужской
  • Freefly
    • Просмотр профиля
Re: задача по Java
« Ответ #11 : 08.03.07, 00:21:57 »
Никак не могу понять, зачем нужен package com.basics?

Прочтите хоть одну книгу по яве до конца. Рекомендую Thinking in Java,, автор Bruce Eckel, ссылка - http://www.ozon.ru/context/detail/id/1829558/. Или двухтомник Java 2, авторы Хорстманн и Корнелл, ссылка - http://www.ozon.ru/context/detail/id/2620455/.

А то вы вообще самых основ не знаете даже.
Fly like a brick

Оффлайн Хакамада

  • Старожил
  • ****
  • Сообщений: 504
  • Карма: -66
  • Пол: Женский
    • Просмотр профиля
Re: задача по Java
« Ответ #12 : 08.03.07, 01:17:25 »
 ::book:: изучаю Java в универе полмесяца  :-o , знаю только начало.
На парах писали программки, легкие, там никаких package com.basics не было ( просто до них ещё не дошли).
Читаю книгу Ноутон, Шилд "Java 2".
Спасибо за рекомендованные книги, с удовольствием почитаю.  ::book::
[elsite]  [elsite]  [elsite]  [elsite]  [elsite]

Оффлайн LEND

  • Пользователь
  • **
  • Сообщений: 95
  • Карма: 155
  • Истина как всегда где-то рядом
    • Просмотр профиля
Re: задача по Java
« Ответ #13 : 08.03.07, 01:25:35 »
Удивительно!
А я то не заметил, что ВЫ написали  if(priz=0) - моя невнимательность.
На это правильно указал rockerzz .
Я же писал if(priz==0). Да, не увидел эту ошибку. Бывает. Естественно priz будет менять тип. Ну это поправимо.
Хакамада напишите if(priz==0).   
Что такое package com.basics - уникальный префикс класса. Он указывает имя пакета класса(package) в который входит эта программа. Именем программы является mnoj - public class mnoj
Мы можем упростить и соединить их чтобы получить полное имя программы com.basics.mnoj
Применение пакетов обеспечивает каждую программу Java уникальным пространством имен.
Это сделано для того, чтобы поместив программу mnoj в пакет я знаю, что если кто-нибудь назовет свою программу mnoj, конфликта имени не произойдет. Для обеспечения ЗАВЕДОМОЙ уникальности имени пакета, можно следовать тому, что имя пакета может начинаться с доменного имени в ИНТЕРНЕТЕ записанного в обратном порядке.
Допустим ВЕБ сайт называется h t t p://www.basics.com Только не путайте c basic
Это я просто произвольно придумал. Поэтому имя пакета com.basics. Можно назвать и по другому.
Вообще это можно долго и нудно рассказывать. Почитайте.

Ну а Public, Private, Local - это легко, тоже почитайте
В нашем случае класс mnoj  внешний и его может использовать кто угодно.
И т.д.  и т.д.
Решите сначала простенькую задачу, а потом постепенно повышайте сложность решения и все у ВАС получится.
« Последнее редактирование: 08.03.07, 01:34:58 от LEND »
В мире временном, сущность которого - тлен,
Не сдавайся вещам несущественным в плен. © О.Х.

Оффлайн Хакамада

  • Старожил
  • ****
  • Сообщений: 504
  • Карма: -66
  • Пол: Женский
    • Просмотр профиля
Re: задача по Java
« Ответ #14 : 08.03.07, 23:11:32 »
class Mnoj
{
public static void main(String[] args)
  {
int n=8; //Кол.элементов множества A
int li=1;

int m,j,p; //Cчетчики
int min;   //Переменная обмена


int k1[]={-3,4,-5,1,6,0,-4,-1}; // Элементы множества A
int k[]=new int[n]; //Массив  k[n]
int priz=1; // Признак вхождения элемента в множество A

System.out.println("Vsego elementiv mnojestva A="+n);
System.out.println("Uznat, vhodit li chislo "+li+" v mnojestvo A");
System.out.println("Dany elementy mnojestva A");
         for(m=0;m<=n;m++)
             {
          System.out.println(k1[m]+" ");
                k[m]=k1[m];
              }
//================ Сортируем элементы множества A в возрастающем порядке
    for(m=1;m<=n-1;m++)
    {
      for(j=1;j<=n-1;j++)
      {
       if (k[j+1]<=k[j]) {
                  min=k[j];
                  k[j]=k[j+1];
                  k[j+1]=min;
                 }
   
     }
//==== Отсортированный порядок элементов множества A ==== }
System.out.println("Otsortirovannoe mnojestvo");
          for(m=1;m<=n;m++)
             {
           System.out.print(k[m]+" ");
              }
//================== Ищем Элемент в множестве ========= }
          for(m=1;m<=n;m++)
             {
              if(li==k[m])
               {
             priz=0;
             break;
                               }
              }
  if(priz==0) System.out.println("Vhodit"); else System.out.println("Net");
//==================================================== }
  }
}
}


Не работает, т.е. работает всё, до вывода отсортированного множества.
Всё, что после этого не работает.
Сегодня, точнее завтра разберусь с этим.
[elsite]  [elsite]  [elsite]  [elsite]  [elsite]

Оффлайн rockerzz

  • Старожил
  • ****
  • Сообщений: 762
  • Карма: 118
  • Пол: Мужской
  • Freefly
    • Просмотр профиля
Re: задача по Java
« Ответ #15 : 09.03.07, 23:59:31 »
Не работает, т.е. работает всё, до вывода отсортированного множества.
Всё, что после этого не работает.
Сегодня, точнее завтра разберусь с этим.

Девушка, ваш код это пример отвратительного программирования. Во-первых, вам четко выкинули исключение в котором говорится, что вы превысили границы массива.           for(m=1;m<=n;m++)      {    System.out.print(k[m]+" "); } - вот что это такое?  Элементы массива начинаются с нуля, если вы не в курсе. То есть предел у вас с k[0] по k[7]. Вы же пытаетесь обратится к k[8], которого не существует. На это вам выкидывается исключение. Во-вторых, никогда не используйте пузырьковую сортировку. Давным, давно основные алгоритмы сортировок реализованы во всех мало-мальски значимых языках. Если вам так хочется сортировать самой, то начните свое изучение программирования с книг Кнута. Ну и в-третьих, учитесь анализировать то, что выдает вам компилятор при сборке программы.

Fly like a brick