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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.03.2015, 19:30   #1
Maray
Форумчанин
 
Регистрация: 03.01.2015
Сообщений: 160
Восклицание Двумерный массив C++

Добрый день!

Пожалуйста, помогите с программой. В функции Input Вводится массив с клавиатуры, а затем выводится на экран. Во второй функции MasX нужно определить массив Х из 5 элементов,
каждый из которых равен сумме элементов соответствующей
строки, если они все либо положительны либо отрицательны, и
нулю в противном случае.
В результате работы функции MasX на экран ничего не выводится. Пожалуйста, помогите

Код:
#include <stdio.h>
#include <math.h>
#include <iostream>
using namespace std;
int Input()
{
	setlocale(LC_CTYPE, "");
	int count = 0, sum = 0;
	int **A;
	int N = 5, M = 5;
	A = new int*[N];
	for (int i = 0; i<N; i++) A[i] = new int[M];
	printf("Введите 25 элементов массива\n");
	for (int i = 0; i < N; ++i) {
		for (int j = 0; j < M; ++j) {
			cin >> A[i][j];
		}
	}
	cout << endl;
	for (int i = 0; i < N; i++){
		for (int j = 0; j < M; j++) {
			cout << " " << A[i][j];
			count = count + 1;
			if (count >= 5) {
				cout << endl;
				count = 0;
			}
		}
	}
	system("pause");
	return 0;
}
int MasX(int **A, int N, int M)
{
	int **X;
	int K = 5, i, count = 0;
	X = new int*[K];
	for (int g = 0; g < K; g++){
     for (int i = 0; i < N; i++) {
	  for (int j = 0; j < M; j++) {
		  if (A[i][j] >= 0 && A[i][j] <= 0)
		  {
			count = count + A[i][j];
		}
		  else
		  {
			  break;
		  }
		if (j >= 5) {
			X[g] = X[g] + count;
		}
		else{
			X[g] = 0;
		}
	}
}
	}
	for (int g = 0; g < K; g++){
		cout << " " << X[g];
	}
	system("pause");
	return 0;
}
int main(int **A, int N, int M)
{
	Input();
	MasX(A, N, M);
	system("pause");
}
Maray вне форума Ответить с цитированием
Старый 13.03.2015, 11:56   #2
Aleksander550
Форумчанин
 
Регистрация: 07.01.2014
Сообщений: 124
По умолчанию

не совсем понял задание.
как-то так
Код:
#include <stdio.h>
#include <math.h>
#include <iostream>

#include <iomanip.h>
#include <windows.h>

using namespace std;


void Input(int **A, int N, int M) {
	printf("Введиде массив:\n");
	for (int i = 0; i < N; ++i) {
		for (int j = 0; j < M; ++j) {
			cout << "Array[" << i << "][" << j << "] = ";
			cin >> A[i][j];  //ручной ввод
			//A[i][j] = i*10 + j;//автозаполнение массива
		}
	}
	//вывод
	cout << "\n\n\n";
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			cout << setw(5) << A[i][j];
		}
		cout << endl;
	}
}

void MasX(int **A, int N, int M) {
	int *X;
	bool flag; //флаг, все числа в строке имеют одинаковый знак
	//допустим что массив не 5х5, пусть K = N
	int K = N;
	X = new int [K];

	for (int i = 0; i < N; i++) {
		flag = true;//допустим знак одинаковый
		for (int j = 0; j < M - 1; j++) {
			//если знаки были разные
			if ( (A[i][j] >= 0 && A[i][j + 1] < 0 )
				 || (A[i][j] < 0 && A[i][j + 1] >= 0) ){
			   flag = false;
			   break;
			}
		}
		if (flag)
			for (int j = 0; j < M; j++)
				X[i] += A[i][j];
		else
			X[i] = 0;
	}

	//вывод Х
	for (int i = 0; i < K; i++) {
		if (i % 10 == 0)
			cout << endl;
		cout << setw(7) << X[i];
	}

	delete [ ] X;
}


////////////////////
int main() {
	//русские буквы в консоле
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);

	int **A, N, M;

	cout << "Введите N: "; cin >> N;
	cout << "Введите M: "; cin >> M;

	A = new int*[N];
	for (int i = 0; i<N; i++)
		A[i] = new int[M];

	Input(A, N, M);
	MasX(A, N, M);

	//не знаю как удалять динамические двумерные массивы
	//угадал?
	for (int i = 0; i<N; i++)
		delete [ ] A[i];
	delete [ ] A;

	cout << endl;
	system("pause");
	return 0;
}
#define TRUE FALSE //счастливой отладки
Aleksander550 вне форума Ответить с цитированием
Старый 13.03.2015, 13:12   #3
Wishmaster1504
Пользователь
 
Аватар для Wishmaster1504
 
Регистрация: 09.10.2012
Сообщений: 11
По умолчанию

Ну или вот еще вариант со статическими массивами (по скольку в задании не сказано что нужно использовать динамические). И если я правильно понял твое задание то: в одной строке должны быть либо все положительные, либо все отрицательные значения тогда считаем сумму элементов в строке; если есть ноль - строка не отвечает условию , сумма = 0.
Код:
#include <stdio.h>
#include <math.h>
#include <iostream>
using namespace std;

const int N = 5, M = 5, K = N;
int A[N][M];
int X[K]; // массив сумм строк

bool IsTrue(int rowNum,int find)
{  // проверяем строку все ли числа положительные либо все ли отрицательные 
	int cnt = 0;
	switch (find)
	{  
	case 1: // < 0
		    for(int i=0;i<M;i++) 
				if(A[rowNum][i] < 0)  cnt++; 
			 
			if (cnt >= 0 && cnt < M) return false; // не все числа в строке отрицательные
	    break;
	case 2: // > 0
			for(int i=0;i<M;i++) 
				if(A[rowNum][i] > 0)  cnt++; 
			 
			if (cnt >= 0 && cnt < M) return false; // не все числа в строке положительные
		break; 
	default:
		break;
	}
	

	return true;
}

int CalcSum(int rowNum) // подсчет суммы в строке
{
	int sum = 0;

	for(int i=0;i<M;i++)
		sum += A[rowNum][i];

	return sum;
}

void Input()
{
	setlocale(LC_CTYPE, "");
	int count = 0, sum = 0; 
	
	printf("Введите 25 элементов массива\n");
	for (int i = 0; i < N; ++i) {
		for (int j = 0; j < M; ++j) {
			cin >> A[i][j];
			//A[i][j] = rand()%9 + 0;
		}
	}
	cout << endl;
	for (int i = 0; i < N; i++){
		cout << "Строка " << i+1 << ": ";
		for (int j = 0; j < M; j++) 
		{
			cout << " " << A[i][j];  
		}
		cout << endl;
	} 
}

void MasX()
{   
	for (int i = 0; i < N; i++)
	{
		if(IsTrue(i,1) || IsTrue(i,2))
			X[i] = CalcSum(i);
		else  // походу есть нули
			X[i] = 0; 
	}
	// print result
 	for (int g = 0; g < K; g++){
		cout << "Строка " << g+1 << ": Сумма : " << X[g] << endl;
	} 
}

int main()
{ 
	Input();
	system("pause"); 
	MasX();
	system("pause");
}

Последний раз редактировалось Wishmaster1504; 13.03.2015 в 13:15.
Wishmaster1504 вне форума Ответить с цитированием
Старый 13.03.2015, 17:41   #4
Maray
Форумчанин
 
Регистрация: 03.01.2015
Сообщений: 160
Восклицание

Цитата:
Сообщение от Wishmaster1504 Посмотреть сообщение
Ну или вот еще вариант со статическими массивами (по скольку в задании не сказано что нужно использовать динамические). И если я правильно понял твое задание то: в одной строке должны быть либо все положительные, либо все отрицательные значения тогда считаем сумму элементов в строке; если есть ноль - строка не отвечает условию , сумма = 0.
Код:
#include <stdio.h>
#include <math.h>
#include <iostream>
using namespace std;

const int N = 5, M = 5, K = N;
int A[N][M];
int X[K]; // массив сумм строк

bool IsTrue(int rowNum,int find)
{  // проверяем строку все ли числа положительные либо все ли отрицательные 
	int cnt = 0;
	switch (find)
	{  
	case 1: // < 0
		    for(int i=0;i<M;i++) 
				if(A[rowNum][i] < 0)  cnt++; 
			 
			if (cnt >= 0 && cnt < M) return false; // не все числа в строке отрицательные
	    break;
	case 2: // > 0
			for(int i=0;i<M;i++) 
				if(A[rowNum][i] > 0)  cnt++; 
			 
			if (cnt >= 0 && cnt < M) return false; // не все числа в строке положительные
		break; 
	default:
		break;
	}
	

	return true;
}

int CalcSum(int rowNum) // подсчет суммы в строке
{
	int sum = 0;

	for(int i=0;i<M;i++)
		sum += A[rowNum][i];

	return sum;
}

void Input()
{
	setlocale(LC_CTYPE, "");
	int count = 0, sum = 0; 
	
	printf("Введите 25 элементов массива\n");
	for (int i = 0; i < N; ++i) {
		for (int j = 0; j < M; ++j) {
			cin >> A[i][j];
			//A[i][j] = rand()%9 + 0;
		}
	}
	cout << endl;
	for (int i = 0; i < N; i++){
		cout << "Строка " << i+1 << ": ";
		for (int j = 0; j < M; j++) 
		{
			cout << " " << A[i][j];  
		}
		cout << endl;
	} 
}

void MasX()
{   
	for (int i = 0; i < N; i++)
	{
		if(IsTrue(i,1) || IsTrue(i,2))
			X[i] = CalcSum(i);
		else  // походу есть нули
			X[i] = 0; 
	}
	// print result
 	for (int g = 0; g < K; g++){
		cout << "Строка " << g+1 << ": Сумма : " << X[g] << endl;
	} 
}

int main()
{ 
	Input();
	system("pause"); 
	MasX();
	system("pause");
}
Ну вот нам ещё поставили условие, что в программе не должно быть глобальных переменных. То есть как я поняла, что массив передается из одной функции в другую при помощи указателя
Maray вне форума Ответить с цитированием
Старый 13.03.2015, 20:02   #5
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
То есть как я поняла, что массив передается из одной функции в другую при помощи указателя
умница!
так держать!
+совет: побольше комментариев и минимум (в идеале - 0) коротких (одно-, двухбуквенных имён переменных/функций).
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программирование в VBA: двумерный массив M на N, нужно создать новый одномерный массив TheAnnihilyator Помощь студентам 1 04.06.2014 09:16
Java: Дан двумерный массив чисел А размером 6х6 и одномерный массив Х из 6-ти чисел. Заменить первые три строки массива A vikysha55 Помощь студентам 1 16.04.2014 10:50
Двумерный массив развернуть в одномерный массив по строкам[QBASIC] TrueStyle777 Помощь студентам 3 29.05.2013 21:56
Одномерный массив и Двумерный массив eugene1437 Общие вопросы C/C++ 15 25.05.2011 19:17
Двумерный массив, одномерный массив. Branbal Помощь студентам 14 18.11.2009 12:40