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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2008, 01:10   #1
DeFace
Пользователь
 
Аватар для DeFace
 
Регистрация: 27.09.2008
Сообщений: 60
По умолчанию Алгоритм смены столбцов в массиве

Здравствуйте, господа! Я учусь на первом курсе заочного отделения. Дали много контрольных. Я работаю поэтому неуспеваю Помогите пожалуйста написать программки.

I. В двумерном массиве элементы которого целые числа, произвести следующие действия:
1) Вставить новый столбец после столбца, в котором нет ни одного отрицательного элемента.
--------------------------------------
2) Удалить все строки, в которых сумма элементов не превышает заданного числа.

II. Дан массив размером nxn, элементы которого целые числа:
1) Подсчитать среднее арифметическое четных элементов, расположенных ниже главной диагонали.
--------------------------------------
2) Поменять местами два средних столбца, если кол-во столбцов нечетное, и первый со средним столбцом, если кол-во столбцов четное.
DeFace вне форума Ответить с цитированием
Старый 20.11.2008, 09:03   #2
StarWorm
Форумчанин
 
Регистрация: 17.11.2008
Сообщений: 233
По умолчанию

Если не очень горит, то как приду с работы, то постараюсь написать (тут делов то?) xD
Согласен?! (а то еще зря время тратить неохота!!!)
StarWorm вне форума Ответить с цитированием
Старый 20.11.2008, 11:17   #3
StarWorm
Форумчанин
 
Регистрация: 17.11.2008
Сообщений: 233
Счастье Сделал на шаблонах...

Вот тебе задача номер II.
Код:
#include "stdafx.h"
#include <conio.h>
#include <iostream>
#include <ctime>

using namespace std;

template <class varType>
void swapElement(varType &a,varType &b)
{
	varType tmp=a;a=b;b=tmp;
}

template <class varType>
void swapMatrix(varType** arr, int dimension)
{
	for(int i=0;i<dimension;i++)
		for(int j=0;j<dimension;j++)
			if(i>j)
			{
				swapElement(arr[i][j],arr[j][i]);
			}
}

template <class varType>
void printArr(varType** arr,int dimension)
{
	for(int i=0;i<dimension;i++)
	{
		for(int j=0;j<dimension;j++)
			cout<<arr[i][j]<<"\t";
		cout<<"\n";
	}
}

template <class varType>
void swapStr(varType* &str1,varType* &str2)
{
	varType* tmp=str1;str1=str2;str2=tmp;
}

template <class varType>
float sredneeArifm(varType** arr,int dimension)
{
	float sum=0;
	int count=0;
	for(int i=0;i<dimension;i++)
		for(int j=0;j<dimension;j++)
			if(j<i)
				if(arr[i][j]%2==0)
				{
					sum+=(float)arr[i][j];
					count++;
				}
	if(count)
		return sum/=(float)count;
	else
		return 0;
}

int main()
{
	int min_range=1,max_range=9;
	srand(time(0));
	const int dimension=5;
	
	int** arr=new int*[dimension];
	for(int i=0;i<dimension;i++)
	{
		arr[i]=new int[dimension];
		for(int j=0;j<dimension;j++)
			arr[i][j]=min_range +(int)(max_range-min_range+1) * (rand() / (RAND_MAX+1.0));
	}
	cout<<"Your array is:\n\n";
	printArr(arr,dimension);
	cout<<"\n\nSrednee arifmeti4eskoe = "<<sredneeArifm(arr,dimension);
	
	swapMatrix(arr,dimension);
	if(dimension%2==0)
		swapStr(arr[dimension/2-1],arr[dimension/2]);
	else
		swapStr(arr[0],arr[(dimension-1)/2]);
	swapMatrix(arr,dimension);
	
	cout<<"\n\nAfter changed columns:\n\n";
	printArr(arr,dimension);
	cout<<"\n\nSrednee arifmeti4eskoe = "<<sredneeArifm(arr,dimension);
	
	getch();
	for(int i=0;i<dimension;i++)
		delete arr[i];
	delete [] arr;
	return 0;
}
Алгоритм смены столбцов:
1)транспонируем матрицу
2)меняем указатели соответствующих строк (ну бывших столбцов)
3)транспонируем матрицу обратно
4) ну а среднее арифметическое из условия, что столбец>строка

Удачи...
StarWorm вне форума Ответить с цитированием
Старый 20.11.2008, 13:56   #4
StarWorm
Форумчанин
 
Регистрация: 17.11.2008
Сообщений: 233
Счастье Ну теперь главное разобраться!!! :)

Написал оч. круто, главное разобраться! Написана на структурах (почти классах) и на шаблонах...
Делает то - что тебе нужно!
Код:
#include "stdafx.h"
#include <conio.h>
#include <iostream>
#include <ctime>

using namespace std;

float min_range=-5.0,max_range=5.0;

template <class varType>
struct dimStruct
{
public:
	varType** arr;
	int dimStr,dimCol;
public:
	void newArr(int str, int col)
	{
		dimStr=str;dimCol=col;
		arr=new varType*[dimStr];
		for(int i=0;i<dimStr;i++)
		{
			arr[i]=new varType[dimCol];
			for(int j=0;j<dimCol;j++)
			{
				arr[i][j]=min_range +(max_range-min_range+1) * ((double)rand() / (RAND_MAX+1.0));
			}

		}
	}
	void printArr()
	{
		for(int i=0;i<dimStr;i++)
		{
			for(int j=0;j<dimCol;j++)
				cout<<arr[i][j]<<"\t";
			cout<<"\n";
		}
	}
	void deleteArr()
	{
		for(int i=0;i<dimStr;i++)
			delete arr[i];
		delete [] arr;
		dimStr=0;dimCol=0;
	}
	void addColumn(int number)
	{
		int str=dimStr,col=dimCol+1;
		varType** tmp=new varType*[str];
		for(int i=0;i<str;i++)
		{
			tmp[i]=new varType[col];
			for(int j=0;j<col;j++)
				tmp[i][j]=0;
		}
		bool flag=false;
		for(int j=0,k=0;k<col;j++,k++)
		{
			flag=false;
			for(int i=0;i<str;i++)
			{
				if(k==number)
				{
					tmp[i][k]=0;
					flag=true;
				}
				else
					tmp[i][k]=arr[i][j];
			}
			if(flag==true)j--;
		}
		deleteArr();
		arr=tmp;
		dimCol=col;dimStr=str;
	}
	void delStr(int number)
	{
		int str=dimStr-1,col=dimCol;
		varType** tmp=new varType*[str];
		for(int i=0;i<str;i++)
		{
			tmp[i]=new varType[col];
			for(int j=0;j<col;j++)
				tmp[i][j]=0;
		}
		for(int i=0,k=0;i<str;i++,k++)
		{
			for(int j=0;j<col;j++)
			{
				if(k==number)k++;
				tmp[i][j]=arr[k][j];
			}
		}
		deleteArr();
		arr=tmp;
		dimCol=col;dimStr=str;
	}
};

template <class varType>
void addColumn(dimStruct<varType>*myArr)
{
	bool flag=false;
	for(int j=0;j<myArr->dimCol;j++)
	{
		flag=false;	
		for(int i=0;i<myArr->dimStr;i++)
		{
			if(myArr->arr[i][j]<0)
			{
				flag=true;				
				break;
			}
		}
		if(flag!=true)
		{
			myArr->addColumn(++j);
		}
	}
}

template <class varType>
void delStr(dimStruct<varType>*myArr,varType number)
{
	varType sum=0;
	for(int i=0;i<(myArr->dimStr);i++)
	{
		sum=0;		
		for(int j=0;j<myArr->dimCol;j++)
		{
			sum+=myArr->arr[i][j];
		}
		if(sum<=number)
		{
			myArr->delStr(i);
			--i;
		}
	}
}



int main()
{
	int yourNumber= 1;
	srand(time(NULL));
	const int dimStr=3,dimCol=5;
	dimStruct<int> *myArr= new dimStruct<int>;
	myArr->newArr(dimStr,dimCol);
	cout<<"Your array BEFOR:\n";
	myArr->printArr();
	addColumn(myArr);
	cout<<"\n\nYour array AFTER insert columns:\n";
	myArr->printArr();
	delStr(myArr,yourNumber);
	cout<<"\n\nYour array AFTER delete strings:\n";
	myArr->printArr();


	myArr->deleteArr();
	delete myArr;
	getch();
	return 0;
}
StarWorm вне форума Ответить с цитированием
Старый 20.11.2008, 14:05   #5
ivan89
Пользователь
 
Аватар для ivan89
 
Регистрация: 22.09.2008
Сообщений: 59
По умолчанию

II. Дан массив размером nxn, элементы которого целые числа:
1) Подсчитать среднее арифметическое четных элементов, расположенных ниже главной диагонали.
--------------------------------------
2) Поменять местами два средних столбца, если кол-во столбцов нечетное, и первый со средним столбцом, если кол-во столбцов четное.
Код:
#include <iostream>
using namespace std;
int n,m;
void zamena(int A[][10],int k1, int k2)
{
	int temp;
	for(int i=0; i<n; i++)
	{
		temp=A[i][k1];
	    A[i][k1]=A[i][k2];
		A[i][k2]=temp;
	}
}
void vivod(int A[][10])
{
	for(int i=0; i<n; i++)
	{
	 for(int j=0; j<m; j++)
		cout<<A[i][j] <<" ";
	  cout<<endl;
	}
}
void sredni_aref(int A[][10])
{
	int sum=0,k=0;
	for(int i=0; i<n; i++)
	 for(int j=0; j<m; j++)
		  if(i>j && A[i][j]%2==0)
		  {
			sum+=A[i][j];
			k++;
		  }
		  cout<<"srednia:="<<sum/k<<endl;
}
int main()
{
	cout<<"vvedi n:=";
	 cin>>n;
	cout<<"vvedi m:=";
	  cin>>m;
	 int a[10][10];
	for(int i=0; i<n; i++)
	 for(int j=0; j<m; j++)
	 cin>>a[i][j];
	 if(n==m)
	 sredni_aref(a);
            cout<<"__________\n";
             int k=m/2;
	 if(m%2==0)
             zamena(a,k-1,0);
	 else
	 {
	  int t=k-1;
	   zamena(a,k,t);
	 } 
	 vivod(a);
   
	 return 0;
}
2) Удалить все строки, в которых сумма элементов не превышает заданного числа.
Код:
#include <iostream>
int main()
{
	using namespace std;
	int a[10][10],n,m,i,j;
	cout<<"vvedi n:=";
	 cin>>n;
	cout<<"vvedi m:=";
	  cin>>m;
	  cout<<"zadai hislo:=";
	 nt k;
	  cin>>k;
	for(i=0; i<n; i++)
	 for(j=0; j<m; j++)
	cin>>a[i][j];
             cout<<"_________\n";
	 int sum=0;
	 for(i=0; i<n; i++)
	 {
	   for(j=0; j<m; j++)
             sum+=a[i][j];

	   if(k<=sum)
	   {
	     for(int j1=0; j1<m; j1++)
	       cout<< a[i][j1] <<" ";
	       cout<< endl;
	        um=0;
	   }
	 }

	 return 0;
}

Последний раз редактировалось ivan89; 20.11.2008 в 14:33.
ivan89 вне форума Ответить с цитированием
Старый 20.11.2008, 14:30   #6
StarWorm
Форумчанин
 
Регистрация: 17.11.2008
Сообщений: 233
Смущение

Нда... со статическими элементами работать - никогда не научишься программить!
По поводу
Цитата:
Удалить все строки, в которых сумма элементов не превышает заданного числа.
Я что-то не понял этого маневра???
Цитата:
Код:
	   if(k==sum)
	   {
	     for(int j1=0; j1<m; j1++)
	       cout<< a[i][j1] <<" ";
	       cout<< endl;
	        um=0;
	   }
Это ты повторно выводил строчку, в которой заданное число (k) равно сумме строки (sum)??? Дык не это требуется! И вообще, на будующее все ответы должны быть доступны для дальнейшего использования, инче зачем вообще все это делать???

P.S. Причем у тебя нельзя создать массив, больше чем 10х10
StarWorm вне форума Ответить с цитированием
Старый 20.11.2008, 14:36   #7
StarWorm
Форумчанин
 
Регистрация: 17.11.2008
Сообщений: 233
Смех

Ну а с данной задачей ты справился... Очень даже ничего получилось поменять столбцы Но у мну алгоритм немного другой...

Цитата:
II. Дан массив размером nxn, элементы которого целые числа:
1) Подсчитать среднее арифметическое четных элементов, расположенных ниже главной диагонали.
--------------------------------------
2) Поменять местами два средних столбца, если кол-во столбцов нечетное, и первый со средним столбцом, если кол-во столбцов четное.
P.S. Молодец ivan89, теперь переходи на динамическик массивы!
StarWorm вне форума Ответить с цитированием
Старый 20.11.2008, 14:48   #8
ivan89
Пользователь
 
Аватар для ivan89
 
Регистрация: 22.09.2008
Сообщений: 59
По умолчанию

Спосибо тебе StarWorm !! завтра обезательно переду на динамическик массивы!
ivan89 вне форума Ответить с цитированием
Старый 20.11.2008, 15:17   #9
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Цитата:
Сообщение от StarWorm Посмотреть сообщение
Написал оч. круто, главное разобраться! Написана на структурах (почти классах) и на шаблонах...
Делает то - что тебе нужно!
Круто-круто! Что же не на классах? Или вообще бы в Visual С++ написали. Конечно же, в середине первого курса все могут написать так круто. И еще вопрос: а зачем вы делаете динамический массив, если передаете в него все равно константы и пользователь никак не влияет на процесс? Не логично как-то.
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 20.11.2008, 15:32   #10
StarWorm
Форумчанин
 
Регистрация: 17.11.2008
Сообщений: 233
Смущение Отвечаем за свою писанину :)

Хех... злобная критика пошла!!! Ну чтож, я и не супер программист, просто редко пишу такие проги! xD
Цитата:
Круто-круто! Что же не на классах?
Да на классах как-то легче что ли... Да и зачем на классах, когда тут одна единица... На классах лучше писать когда есть абстракция, виртуальные функции и наследование, а здесь и так сойдет

Цитата:
Или вообще бы в Visual С++ написали.
Зачем делать ту работу, которая не требуется... Причем, если я напишу на VC++, человек, которому я ее пишу, не сможет ею пользоваться!
Цитата:
Конечно же, в середине первого курса все могут написать так круто.
А я и не говорю что я ниибись программер... Я просто любитель, сам еще учусь в универе и работаю... Так что не надо на меня гнать!
Цитата:
И еще вопрос: а зачем вы делаете динамический массив, если передаете в него все равно константы и пользователь никак не влияет на процесс? Не логично как-то.
Если это касаемо функции main и в структуре она заполняется автоматически, то это сделано лишь для того, чтобы отладка не занимала много времени!
Если нужно исправить, то в main() следует написать
Код:
cout<<"Enter dimensions of array: ";
cin>>dimStr>>dimCol;
А также исправить немного в методе структуры newArr() на
Код:
cout<<"Enter element ("<<i+1<<", "<<j+1<<") of your array: ";
cin>>arr[i][j]
P.S. Еще есть вопросы?!
StarWorm вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перемещение столбцов Janny Microsoft Office Excel 6 10.11.2008 07:58
Вывод имен столбцов maxix БД в Delphi 2 29.09.2008 16:28
Циклический сдвиг столбцов в массиве С++ Помогите! Ладушка Общие вопросы C/C++ 10 01.05.2008 23:17
Снова о массиве Constellation Общие вопросы Delphi 2 09.02.2008 20:42