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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.11.2011, 23:17   #11
Ирина1992
Новичок
Джуниор
 
Регистрация: 19.11.2011
Сообщений: 7
По умолчанию

Вот:
Код:
include <iostream>
using namespace std;
int main(){
int m,n,i,j;
int **a, **b, **c, *sum;
cout<<"Введите размерность матриц"<<endl;
cin>>n;
a=new int*[n];
b=new int*[n];
c=new int*[n];
sum=new int[n];

for (i=0;i<n;i++){
        a[i]=new int[n];
	b[i]=new int[n];
	c[i]=new int[n];
	sum=new int[n];
        }
 
cout<<"Введите элементы первой матрицы"<<endl;
for (i=0;i<n;i++){
                for (j=0; j<n; j++){
                        cin>>a[i][j];
                        }
                }
        
        
cout<<"Введите элементы второй матрицы"<<endl;
for (i=0;i<n;i++){
                for (j=0; j<n; j++){
                        cin>>b[i][j];
                        }
                }
        
        
cout<<"Введите элементы третьей матрицы"<<endl;
for (i=0;i<n;i++){
                for (j=0; j<n; j++){
                        cin>>c[i][j];
                        }
                }
        
        
cout<<"Введенные матрицы:"<<endl;
        for (i=0;i<n;i++){
                for (j=0;j<n;j++){
                        cout<<a[i][j]<<" ";
                }
        cout<<endl;
        }
	
	cout<<endl;
	for (i=0;i<n;i++){
                for (j=0;j<n;j++){
                        cout<<b[i][j]<<" ";
                }
        cout<<endl;
        }
	
	cout<<endl;
	for (i=0;i<n;i++){
                for (j=0;j<n;j++){
                        cout<<c[i][j]<<" ";
                }
        cout<<endl;
        }
 
 

//поиск нулевых строк


int k1=k2=k3=k=0;
for (i=0;i<n;i++){
	k=0;
	for (j=0;j<n;j++){
	if ((*(*(a+i)+j))!=0) k++;
	}
	if (k==0) k1++;
}

for (i=0;i<n;i++){
	k=0;
	for (j=0;j<n;j++){
	if ((*(*(b+i)+j)!=0) k++;
	}
	if (k==0) k2++;
}

for (i=0;i<n;i++){
	k=0;
	for (j=0;j<n;j++){
	if ((*(*(c+i)+j)!=0) k++;
	}
	if (k==0) k3++;
}

if (k1>=k2) {

for (i=0;i<n;i++){
for (j=0;j<n;j++){
*(*(matr+i)+j)=*(*(a+i)+j);
	}
	}
} else {

	
for (i=0;i<n;i++){
for (j=0;j<n;j++){
*(*(matr+i)+j)=*(*(b+i)+j);
	}
	}
};

if ((k1<k3)&&(k2<k3)) {

for (i=0;i<n;i++){
for (j=0;j<n;j++){
*(*(matr+i)+j)=*(*(c+i)+j);
	}
	}
};
if ((k1=0)&&(k2=0)&&(k3=0)){
cout<<"Не найдено матрицы с нулевыми строками"<<endl;
return 0;
}


//суммы строк

for (i=0;i<n;i++){
for (j=0;j<n;j++){	
	*(sum+i)+=*(*(matr+i)+j);
}
} 

//сортировка

int min, *tmp;

for(i=0;i<n-1;i++){
min=i;
for(k=i+1;k<n;k++){
	 if (*(sum+k)<*(sum+min))
	 min=k;
		  }
if (min!=i) {
	for (j=0;j<n;j++){	
	tmp=*(*(matr+i)+j);
	*(*(matr+i)+j)=*(*(matr+min)+j);	
	*(*(matr+min)+j)=tmp;
			 }
	    }
}


//вывод
cout<<"Отсортированная матрица:"<<endl;
        for (i=0;i<n;i++){
                for (j=0;j<n;j++){
                        cout<<matr[i][j]<<" ";
                }
        cout<<endl;
        }
	
return 0;
}
Только я не знаю, рабочая ли она, т.к. у меня Visual Studio сейчас не в рабочем состоянии, писала код в текст.редакторе Вроде правильный, глянь пожалуйста, нет ли ошибок)
И вопрос, а если в вывод я напишу через указатели, то будет выводить все правильно?
Код:
cout<<"Отсортированная матрица:"<<endl;
        for (i=0;i<n;i++){
                for (j=0;j<n;j++){
                        cout<<(*(*(matr+i)+j))<<" ";
                }
        cout<<endl;
        }
Ирина1992 вне форума Ответить с цитированием
Старый 20.11.2011, 00:53   #12
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

У тебя в первом цикле лишний раз выделяется память для массива sum, и массив matr так и не объявлен. Ну и переменная tmp (перед сортировкой) должна тоже быть типа int, а не int*.
А еще - когда ты ищешь нужную матрицу, ты копируешь все значения в новую переменную. Можно этого не делать, а просто сохранить указатель на нужную матрицу (посмотри в коде ниже).
Ну и эта проверка
Код:
if ((k1=0)&&(k2=0)&&(k3=0))
А когда ты выделяешь через new память для переменных типа int, они автоматически не обнуляются. Потому sum[i] нужно специально обнулить перед тем, как начинать суммировать.
И в сортировке вместе со строками нужно менять местами и их ключи в sum, иначе алгоритм запутается )
А все остальное правильно. И ты действительно молодец, если написала все это "вслепую" без компилятора. Очень мало кто из посетителей этого раздела смог бы так, далеко пойдешь

Вот итоговый поправленный код:
Код:
#include <iostream>
#include <clocale>
using namespace std;
int main()
{
	setlocale(LC_ALL,"Russian");
	int n,i,j;
	int **a, **b, **c, **matr, *sum;
	cout<<"Введите размерность матриц"<<endl;
	cin>>n;
	a=new int*[n];
	b=new int*[n];
	c=new int*[n];
	sum=new int[n];

	for (i=0;i<n;i++)
	{
		*(a+i)=new int[n];
		*(b+i)=new int[n];
		*(c+i)=new int[n];
	}
 
	cout<<"Введите элементы первой матрицы"<<endl;
	for (i=0;i<n;i++)
	{
		for (j=0; j<n; j++)
		{
			cin>>*(*(a+i)+j);
		}
	}
        
        
	cout<<"Введите элементы второй матрицы"<<endl;
	for (i=0;i<n;i++)
	{
		for (j=0; j<n; j++)
		{
			cin>>*(*(b+i)+j);
		}
	}
        
        
	cout<<"Введите элементы третьей матрицы"<<endl;
	for (i=0;i<n;i++)
	{
		for (j=0; j<n; j++)
		{
			cin>>*(*(c+i)+j);
		}
	}
                
	cout<<"Введенные матрицы:"<<endl;
	        for (i=0;i<n;i++)
	{
		for (j=0;j<n;j++)
		{
			cout<<*(*(a+i)+j)<<" ";
		}
		cout<<endl;
	}
	
	cout<<endl;
	for (i=0;i<n;i++)
	{
		for (j=0;j<n;j++)
		{
			cout<<*(*(b+i)+j)<<" ";
		}
		cout<<endl;
	}
	
	cout<<endl;
	for (i=0;i<n;i++)
	{
		for (j=0;j<n;j++)
		{
			cout<<*(*(c+i)+j)<<" ";
		}
		cout<<endl;
	}
 
 
	//поиск нулевых строк
	int k1=0, k2=0, k3=0, k=0;
	for (i=0;i<n;i++)
	{
		k=0;
		for (j=0;j<n;j++)
		{
			if (*(*(a+i)+j)!=0) k++;
		}
		if (k==0) k1++;
	}

	for (i=0;i<n;i++)
	{
		k=0;
		for (j=0;j<n;j++)
		{
			if (*(*(b+i)+j)!=0) k++;
		}
		if (k==0) k2++;
	}

	for (i=0;i<n;i++)
	{
		k=0;
		for (j=0;j<n;j++)
		{
			if (*(*(c+i)+j)!=0) k++;
		}
		if (k==0) k3++;
	}

	if (k1>=k2) 
	{
		matr=a;
	}
	else 
	{
		matr=b;
	}


	if ((k1<k3)&&(k2<k3)) 
	{
		matr=c;
	}

	if ((k1==0)&&(k2==0)&&(k3==0))
	{
		cout<<"Не найдено матрицы с нулевыми строками"<<endl;
		return 0;
	}

	//суммы строк

	for (i=0;i<n;i++)
	{
	*(sum+i)=0;
		for (j=0;j<n;j++)
		{
			*(sum+i)+=*(*(matr+i)+j);
		}
	}

	//сортировка

	int min, tmp;

	for(i=0;i<n-1;i++)
	{
		min=i;
		for(k=i+1;k<n;k++)
		{
			if (*(sum+k)<*(sum+min))
				min=k;
		}
		if (min!=i) 
		{
			tmp=*(sum+i);
			*(sum+i)=*(sum+min);
			*(sum+min)=tmp;
			for (j=0;j<n;j++)
			{
				tmp=*(*(matr+i)+j);
				*(*(matr+i)+j)=*(*(matr+min)+j);	
				*(*(matr+min)+j)=tmp;
			}
		}
	}


	//вывод
	cout<<"Отсортированная матрица:"<<endl;
	for (i=0;i<n;i++)
	{
		for (j=0;j<n;j++)
		{
			cout<<*(*(matr+i)+j)<<" ";
		}
		cout<<endl;
	}

//освобождение памяти
	for (i=0; i<n; ++i)
	{
		delete[] *(a+i);
		delete[] *(b+i);
		delete[] *(c+i);
	}
	delete[] a;
	delete[] b;
	delete[] c;
	delete[] sum;
		return 0;
}
Я дописал в начало две строчки, нужные для правильного вывода русских букв в консоли. Ну и освобождение выделенной памяти в конце - в принципе это не обязательно тут, но преподы могут обратить внимание )

Ну и если еще будут вопросы - можешь писать мне в icq.

Последний раз редактировалось Son Of Pain; 20.11.2011 в 00:59.
Son Of Pain вне форума Ответить с цитированием
Старый 20.11.2011, 13:01   #13
Ирина1992
Новичок
Джуниор
 
Регистрация: 19.11.2011
Сообщений: 7
По умолчанию

Спасибо большое за помощь!!!!!!!
Ирина1992 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ф-ия, определяющая сумму строк матрицы, если на главной диагонали матрицы имеется отрицательный эл-т. Volk_xD Помощь студентам 6 05.01.2011 13:39
Найти строки и индексы нулевых элементов матрицы, на паскале serrga Помощь студентам 1 18.12.2009 02:46
Получить матрицу B[1..N-1,1..M-1] из матрицы A[1..N,1..M] удалением какой-либо х-той строки и k-го столбц kempers Помощь студентам 2 18.12.2008 10:53
Вывести на экран матрицу, в которой наибольшее число нулевых строк Александр НИК-В Паскаль, Turbo Pascal, PascalABC.NET 0 05.12.2008 20:49
Помогите упорядочить строки матрицы по убыванию kitty Помощь студентам 1 06.12.2007 23:23