Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Java] Сокращение двумерной матрицы 
:(
    Опции темы
SERJ2006
  Дата 5.4.2012, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 22.1.2012

Репутация: нет
Всего: нет



требуется написать программу, которая будет сравнивать 2 столбца двумерного массива, и векторно меньший копировать другой двумерный массив. идея такая: создаем два двумерных массива. инициализируем первый. сравниваем первый элемент столбца и второй в первой строчке, если первый больше присваиваем некоторой переменной k=0, переходим на следующую строчку и также проверяем первый и второй элемент, если также больше, то двигаемся к следующей строчке, и так до последней строки. если 1 столбец полностью больше, то второй столбец копирум в новый массив.
 если же при сравнивании в одной строке 1 элементы столбца больше 2, но во второй строчке наоборот, то переходить к следующему столбцу.
 проверку производить до последнего столбца.
вот программа, но оно тупо копирует массив A в B. а должно в моем приеме оставаться только
1 0 1
1 1 0
Код

public class DM{
 public static void  main(String[]args){
  int [][]A={       {1, 0, 1},
                    {1, 1, 0},
                    {1, 0, 0}
            };
  int [][]B=new int [3][3];//сдесь правильнее будет указать размер массива A.length
    int k=0;
    int l=A.length;
    for (int i=1;i<A.length-1;i++){
      for (int j=1;j<A[i].length-1;j++){
        if (A [i][j]>A [i][j+1]){k=1;}
        if (A [i][j]<A [i][j+1]){k=0;}   
        i++;
        if (k==1){
          //копирование массивов
          for (int s=0;s<l;s++){
             for (int n=0;n<l;n++){
               B [s][n]=A [s][n];
             }
          }
        }
        if (k==0) j++;
      }
    }  
    
  System.out.println("Изначальный массив: ");
    //вывод массива
     for (int i=0;i<A.length;i++){
      for (int j=0;j<A[i].length;j++)
      System.out.print(A[i][j]+" ");
      System.out.println();
     }
  System.out.println("Новый массив: ");
   for (int i=0;i<B.length;i++){
     for (int j=0;j<B[i].length;j++){
      System.out.print(B[i][j]+" ");
      System.out.println();
     }
   }
}
}

помогите пожалуйста ее доделать!
PM MAIL   Вверх
jk1
Дата 6.4.2012, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1168
Регистрация: 17.10.2008
Где: Санкт-Петербург

Репутация: 1
Всего: 75



Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 


--------------------
Opinions are like assholes — everybody has one
PM MAIL   Вверх
Mirkes
Дата 6.4.2012, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 586
Регистрация: 18.8.2011
Где: Красноярск

Репутация: 4
Всего: 17



Цитата(SERJ2006 @  5.4.2012,  22:53 Найти цитируемый пост)
    for (int i=1;i<A.length-1;i++){

А почему не сравниваете элементы первой строки? И почему не сравниваете элементы последней строки?
Сравнение работает только по второй строке.

Цитата(SERJ2006 @  5.4.2012,  22:53 Найти цитируемый пост)
        i++;

Цитата(SERJ2006 @  5.4.2012,  22:53 Найти цитируемый пост)
        if (k==0) j++;

А вот за такие вещи в циклах for бьют канделябрами!

Вобщем текст - полный бред. Что вы пытались сэкономить?
Ведь в описании алгоритма вы по человечески описали, что нужно сделать, а в тексте программы?

Что должно происходить при равенстве элементов?
Что будет если первый столбец меньше второго?
Почему вы предлагаете сравнивать столбцы, а сравниваете строки?

Если прочитать задачу следующим образом:
Сравнить попарно все столбцы матрицы A. Если все элементы столбца i меньше всех элементов одного из других столбцов, то скопировать столбец i во вторую матрицу.
Для такой задачи реализация может быть следующей:
Код

public class DM{
 public static void  main(String[]args){
  int [][]a={  {1, 0, 1},  // в Java имена переменных начинают с маленькой буквы. 
                    {1, 1, 0},
                    {1, 0, 0}
                    {1, 0, 0}   // Добавил одну строку, чтобы не было соблазна считать матрицу квадратной, о чем в условии нет ни слова.
            };
  int [][] b =new int [a.length][a[0].length];//сдесь правильнее будет указать размер массива a.length
  int [] cop = new int [a[0].length];  // индикатор того, что столбец уже копировался
    for (int i=0;i<cop.length;i++){
        cop[i]=0;
    }
    int more,less,eq;  // переменные для остлеживания исходов 
    int n=0; // номер столбца, куда копировать
    for (int j=0;j<a[0].length-1;j++){  // номер первого из сравниваемых столбцов
      for (int k=J+1;k<a[0].length;k++){ // номер иторого из сравниваемых столбцов
         more=0;  // никто не был больше
         less=0;    // никто не был меньше
         eq=0;      // никто не был равен
         for (int i=0;i<a.length;i++) {  // номер строки
            if (a [i][j]>A [i][k]){
                more++;
            } else if (A [i][j]<A [i][k]){
                less++;
           } else
                eq++;
         }
         // анализируем, нужно ли копировать
         if (eq==0){  // копировать стоит только если не было равных элементов
           if (more>0 && less==0 && cop[k]=0){  // копируем второй из столбцов, если ранее он не копировался
              for (int i=0;i<a.length;i++){
                 b[i][n]=a[i][k];
              }
              cop[k]=1;
              n++;
           }
           if (more==0 && less>0 && cop[j]=0){  // копируем первый из столбцов, если ранее он не копировался
              for (int i=0;i<a.length;i++){
                 b[i][n]=a[i][j];
              }
              cop[j]=1;
              n++;
           }
         }
      }
    }  
    
  System.out.println("Изначальный массив: ");
    //вывод массива
     for (int i=0;i<a.length;i++){
      for (int j=0;j<a[i].length;j++)
        System.out.print(a[i][j]+" ");
      System.out.println();
     }
  System.out.println("Новый массив: ");
   for (int i=0;i<b.length;i++){
     for (int j=0;j<n;j++){
       System.out.print(b[i][j]+" ");
     System.out.println();
     }
   }
}
}

Код не проверял. писал по месту


--------------------
Mirkes
PM MAIL   Вверх
SERJ2006
Дата 9.4.2012, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 22.1.2012

Репутация: нет
Всего: нет



извините, со строчками ошибся. если элементы равны продолжать сравнение элементов столбцов в другой строчке. если первый столбец меньше второго, то первый уже сравнивать с третим, если нельзя сравнивать(к примеру в первом столбце первый элемент строки больше второго элемента второго столбца, тойже строчки, а элемент 1 столбца 2 строчки меньше элемента 2 столбца второй строки, то заносить два столбца в новый массив.

Добавлено через 1 минуту и 54 секунды
вот алгаритм:
0) Считаем исходную таблицу покрытий текущей, а множество ядерных строк – пустым.
1) Находим ядерные строки, запоминаем множество ядерных строк. Текущую таблицу покрытий сокращаем, вычеркивая ядерные строки и все столбцы, покрытые ими.
2) Вычеркиваем антиядерные строки.
3) Вычеркиваем поглощающие столбцы.
4) Вычеркиваем поглощаемые строки.
5) Если в результате выполнения пунктов с 1 по 4 текущая таблица покрытий изменилась, снова выполняем пункт 1, иначе преобразование заканчиваем.
Поэтому алгоритм работы следующий:
1) ввод числа строк и столбцов таблицы покрытия;
2) ввод таблицы покрытия ;
3) поиск ядерных строк. Если их нет, то п.4. Иначе, запоминаем эти ядерные строки. Ищем столбцы, покрытые ядерными строками. Вычеркиваем все ядерные строки и столбцы, покрытые ими.
4) вычеркивание антиядерных строк. Переход в п.5.
6) вычеркивание поглощающих столбцов.
7) вычеркивание поглощаемых строк.
8) если в результате преобразований таблица покрытий изменилась, выполняем пункт 3. Иначе - вывод множества покрытия, конец алгоритма.

Добавлено через 4 минуты и 27 секунд
ядерная - это когда в таблице строчка или столбец, содержащий одну еденицу, если ядерная строка, то мы ее вычеркиваем, и все поглащаемые ею строки, и запоминаем. если столбец, то поглощаем(если есть чем).

Добавлено через 6 минут и 15 секунд
требуется написать программу, которая будет сокращать марицу(через двумерный массив), т.е. результаты записывать в другой массив.
 1) нужно через цикл for сделать, чтобы сокращалось по принципу:  
 1 0 1 0 
 0 1 1 1
 0 0 0 1

 сокращение столбцов: сравнивать 2 столбца, и меньший столбец(разность должна быть в 1 еденице) заносится в новую матрицу, большие не заносятся. а не сравниваемые, заносятся
 результат после сокращения таков:
 2 столбец поглощает четвертый, первый поглощает третий.
1 0
0 1
0 0

2)метод, который выполняет сокращение по строкам( из оставшихся элементов)
 только сдесь большая заносится в новый массив, а меньшая нет.
 например:
1 0 0
0 1 1
0 1 0

2 строка поглощает 3 
 результат:
1 0 0
0 1 1
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0835 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.