Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 24.11.2013, 22:24   #1
ELaX
Пользователь
 
Регистрация: 24.11.2013
Сообщений: 29
Вопрос Укажите ошибку С++

Задача такая: Упорядочить строки целочисленной прямоугольной матрицы по возрастанию количества одинаковых элементов в каждой строке.
Найти номер первого из столбцов, не содержащих ни одного отрицательного элемента.
Вот мой код.
Код:
#include <iostream>

using namespace std;

int main(void)
{
	int i, j, n, m,e,max,temp,k=0;

cin >> n >> m;
    int *a=new int[m];
	int *bi=new int[m];

    int **matrix = new int*[n];
    for (i = 0; i < n; i++)
        *(matrix + i) = new int[m];
    for (i = 0; i < n; i++)
        for (j = 0; j < m; j++) 
           cin >> *(*(matrix + i) + j);
		for (i = 0; i < n; i++){
        for (j = 0; j < m; j++){		
			a[i]=0;
			for (e = 0; e < m; e++){
				if (matrix[i][j] == matrix[i][e]) {a[i]=a[i]+1;bi[i]=matrix[i][e];}
		}}}
	for (i=0; i<n; i++){
		max=a[i];
		int index=i;
			for (j=i+1; j<n; j++){
				if (a[j]<max)
				{
					max=a[j];
					index=j;				
				}
				temp=a[i];
				a[i]=max;
				a[index]=temp;
				for (e=0; e<m; e++){
		temp=matrix[i][e];
		matrix[i][e]=matrix[index][e];
		matrix[index][e]=temp;
	}}}
for (i=0; i<n; i++){
for (j = 0; j < m; j++){
		
            cout << *(*(matrix + i) + j) << ' ';
}
        cout << endl;

}
	for (j=0; j<m; j++){
		k=0;
for (i = 0; i < n; i++){
	if (matrix[i][j]>=0) k=k+1;
} 
if (k>n-1)  cout << j+1 << endl;
	}
    return 0;
	}
Входные данные.
4 5-размер
-5 6 0 -1 -5
-1 1 0 -5 0
-5 0 4 1 1
-1 -5 0 -5 -5
У меня получается
-5 6 0 -1 -5
-1 1 0 -5 0
-5 0 4 1 1
-1 -5 0 -5 -5
3
Должно быть
-1 1 0 -5 0
-5 0 4 1 1
-5 6 0 -1 -5
-1 -5 0 -5 -5
3
Я не могу понять по какому принципу происходит сортировка...
Помогите пожалуйста, где у меня не так... .
ELaX вне форума
Старый 25.11.2013, 10:24   #2
Baburek
Форумчанин
 
Аватар для Baburek
 
Регистрация: 12.12.2010
Сообщений: 205
По умолчанию

Упорядочиваю строки матрицы по возрастанию количества одинаковых элементов. Номер первого из столбцов, который не содержит отрицательных элементов, думаю, будет дописать не сложно:
Код:
#include <iostream>

using namespace std;

int main()
{
 int n = 0, m = 0;
 int temp;
 cin >> n >> m;
 int ** matrix = new int *[n];
 for(int i = 0; i < n; i++) matrix[i] = new int[m];
 int max = 0;
 for(int i = 0; i < n; i++){
 for(int j = 0; j < m; j++) {
     cin >> matrix[i][j]  ;
     cout << matrix[i][j]<<" ";
     }
     cout << endl;
     }
 cout << endl;

 int i=0;
 int k=0;
 while (i < n){
 for(int j = 0; j < m; j++) {
  bool common=false;
   for (int l=0; l<m; l++){
            if (j-l!=0 && matrix[i][j]==matrix[i][l]) {common=true;};
            if (common) k++;
            }
  }
  if (k<max){
        for (int j=0; j<m; j++){
                                temp = matrix[i-1][j];
                                matrix[i-1][j]= matrix[i][j];
                                matrix[i][j] = temp;
                               }
		i=0;
		max=0;
                k=0;
        }
 else {
        max=k;
        k=0;
        i++;
       }
 }

 for(int i = 0; i < n; i++){
 for(int j = 0; j < m; j++) {
     cout << matrix[i][j]<<" ";
     }
     cout << endl;
     }
 cout << endl;



 for(int i = 0; i < n; i++) delete[] matrix[i];
 delete[] matrix;
 return 0;
}
Baburek вне форума
Старый 25.11.2013, 10:45   #3
Baburek
Форумчанин
 
Аватар для Baburek
 
Регистрация: 12.12.2010
Сообщений: 205
По умолчанию

Если добавить - найдется минимальный столбец:
Код:
 for (int j = 0; j < m; j++)   {
 for (int i=0; i<n; i++)
 {
  if (matrix[i][j]<=0) k++;
 }
 if (k == 0){
        cout << "Check: " << j+1 <<endl;
        break;
 }
 else k=0;
 }
Baburek вне форума
Старый 25.11.2013, 11:07   #4
ELaX
Пользователь
 
Регистрация: 24.11.2013
Сообщений: 29
По умолчанию

Baburek результат при вводе
4 5-размер
-5 6 0 -1 -5
-1 1 0 -5 0
-5 0 4 1 1
-1 -5 0 -5 -5
получается
-5 0 4 1 1
-1 1 0 -5 0
-5 6 0 -1 -5
-1 -5 0 -5 -5
Должно быть
-1 1 0 -5 0
-5 0 4 1 1
-5 6 0 -1 -5
-1 -5 0 -5 -5

Отсортировать по убыванию значений повторяющихся элементов я тоже смог но другим способом... Нужно чтобы получался именно такой результат. иначе работа не принимается. Я не понимаю вообще как так можно отсортировать чтобы строки были именно в таком порядке.
ELaX вне форума
Старый 25.11.2013, 11:53   #5
Baburek
Форумчанин
 
Аватар для Baburek
 
Регистрация: 12.12.2010
Сообщений: 205
По умолчанию

Цитата:
Сообщение от ELaX Посмотреть сообщение
при вводе:
-5 6 0 -1 -5
-1 1 0 -5 0
-5 0 4 1 1
-1 -5 0 -5 -5

Должно быть
-1 1 0 -5 0
-5 0 4 1 1
-5 6 0 -1 -5
-1 -5 0 -5 -5

Я не понимаю вообще как так можно отсортировать чтобы строки были именно в таком порядке.
Вангую, что "кто-то" берет первую строку и сравнивает со следующей до тех пор пока у следующей не станет отрицательных элементов больше чем у первой. Видимо, "кто-то" не правильно поставил условие. Просто цикл убери на "начать с начала" и все будет хорошо

Если в моем коде, то это так:
Код:
...
while (i < n){
 for(int j = 0; j < m; j++) {
  bool common=false;
   for (int l=0; l<m; l++){
            if (j-l!=0 && matrix[i][j]==matrix[i][l]) {common=true;};
            if (common) k++;
            }
  }
  if (k<max){
        for (int j=0; j<m; j++){
                                temp = matrix[i-1][j];
                                matrix[i-1][j]= matrix[i][j];
                                matrix[i][j] = temp;
                               }
		//i=0; <========================ВОТ ТУТ ЗАКОММЕНТИМ
		max=0;
                k=0;
        }
 else {
        max=k;
        k=0;
        i++;
       }
 }
 ...
Получишь свою матрицу на выходе - инфа 100%

Последний раз редактировалось Baburek; 25.11.2013 в 12:02.
Baburek вне форума
Старый 25.11.2013, 12:23   #6
ELaX
Пользователь
 
Регистрация: 24.11.2013
Сообщений: 29
По умолчанию

Всё замечательно, матрицу получил, но это такое НО от которого нервный тик начинается) Тест 1 пройден, тест 2 не пройден.
Входные данные
3 4
-2 0 4 0
6 -8 1 1
0 -3 5 1
Выходные данные вашей программы
6 -8 1 1
0 -3 5 1
-2 0 4 0
3
Верный результат
0 -3 5 1
6 -8 1 1
-2 0 4 0
3
ELaX вне форума
Старый 25.11.2013, 12:43   #7
Baburek
Форумчанин
 
Аватар для Baburek
 
Регистрация: 12.12.2010
Сообщений: 205
По умолчанию

Цитата:
Сообщение от ELaX Посмотреть сообщение
Всё замечательно, матрицу получил, но это такое НО от которого нервный тик начинается) Тест 1 пройден, тест 2 не пройден.
Входные данные
3 4
-2 0 4 0
6 -8 1 1
0 -3 5 1
Выходные данные вашей программы
6 -8 1 1
0 -3 5 1
-2 0 4 0
3
Верный результат
0 -3 5 1
6 -8 1 1
-2 0 4 0
3
Кажется, прозрел...ничего комментировать не надо. Просто знак поменяйте тут:

Код:
while (i < n)
Baburek вне форума
Старый 25.11.2013, 12:59   #8
ELaX
Пользователь
 
Регистрация: 24.11.2013
Сообщений: 29
По умолчанию

Кажется, прозрел...ничего комментировать не надо. Просто знак поменяйте тут:
while (i < n)
Не вариант. получается
-2 0 4 0
6 -8 1 1
0 -3 5 1
3
А предыдущая матрица вообще
-5 6 0 -1 -5
-1 1 0 -5 0
-5 0 4 1 1
-1 -5 0 -5 -5

Последний раз редактировалось ELaX; 25.11.2013 в 13:02.
ELaX вне форума
Старый 25.11.2013, 13:13   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ELaX, а Вас не напрягает, что Вы, в нарушение правил создали две дублирующие темы?!!

вот эту тему я имею в виду: Укажите ошибку С++

А меня, как модератора, напрягает!
Поэтому закрываю данную тему. Нечего правила нарушать!

Модератор
Serge_Bliznykov вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Укажите на ошибку в программе Draurign Помощь студентам 10 18.07.2012 23:42
Укажите ошибку bad9 Помощь студентам 3 11.06.2012 03:23
укажите на ошибку маГГ85 JavaScript, Ajax 2 23.02.2012 13:15
Укажите на ошибку. Wh15per Общие вопросы C/C++ 2 27.12.2011 20:02
Укажите ошибку kerbeross PHP 7 25.08.2009 21:47