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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.03.2018, 22:51   #1
NOMAD2377
 
Регистрация: 02.03.2018
Сообщений: 5
По умолчанию Ввод двумерного массива

вот собственно функция, которая не хочет вводить массив в память
помогите конкретно по коду

Код:
int input(int *z, int **&arr, int *N, int *M) {
	*z = 1;
	char input_perem[256], button_key_ran;
	int k, i, j;
	cout << "1. С клавиатуры" << endl;
	cout << "2. Генератором случайных чисел" << endl;
	button_key_ran = '0';
	while (button_key_ran != '1' && button_key_ran != '2')
	{
		button_key_ran = _getch();
	}
	if (button_key_ran == '1') {
		while (N == 0) {
			k = 0;
			cout << "Введите кол-во вещественных строк квадратной матрицы (1>...>100): ";
			cin >> input_perem;
			for (i = 0; i < strlen(input_perem); i++) {
				if (input_perem[i] < '0' || input_perem[i] > '9') {
					k++;
				}
			}
			if (k == 0 && atoi(input_perem) < 100 && atoi(input_perem) > 1) {
				*N = atoi(input_perem);
			}
		}
		while (M == 0) {
			k = 0;
			cout << "Введите кол-во столбцов квадратной матрицы (1>...>100): ";
			cin >> input_perem;
			for (i = 0; i < strlen(input_perem); i++) {
				if (input_perem[i] < '0' || input_perem[i] > '9') {
					k++;
				}
			}
			if (k == 0 && atoi(input_perem) < 100 && atoi(input_perem) > 1) {
				*M = atoi(input_perem);
			}
		}
		cout << "Введите элементы массива" << endl;
		*arr = new int[*N];
		for (i = 0; i<*N; i++) {
			arr[i] = new int[*M];
		}
		//ввод с клавиатуры
		for (i = 0; i<*N; i++) {
			for (j = 0; j <*M; j++) {
				arr[i][j] = 0;
				while (arr[i][j] == 0) {
					k = 0;
					cout << "A[" << i + 1 << "][" << j + 1 << "]: ";
					cin >> input_perem;
					for (int x = 0; x < strlen(input_perem); x++) {
						if (x == 0 && input_perem[x] == '-') {
							k--;
						}
						if (input_perem[x] < '0' || input_perem[x] > '9') {
							k++;
						}
					}
					if (k == 0 && atoi(input_perem) < 2e3 && atoi(input_perem) > -2e3) {
						arr[i][j] = 1;
					}
				}
				arr[i][j] = atoi(input_perem);
			}
		}
		return **arr;
	}
	if (button_key_ran == '2') {
		//ввод рандомно
		while (N == 0) {
			k = 0;
			cout << "Введите кол-во вещественных строк квадратной матрицы (1>...>100): ";
			cin >> input_perem;
			for (i = 0; i < strlen(input_perem); i++) {
				if (input_perem[i] < '0' || input_perem[i] > '9') {
					k++;
				}
			}
			if (k == 0 && atoi(input_perem)<100 && atoi(input_perem)>1) {
				*N = atoi(input_perem);
			}
		}
		while (M == 0) {
			k = 0;
			cout << "Введите кол-во вещественных столбцов квадратной матрицы (1>...>100): ";
			cin >> input_perem;
			for (i = 0; i < strlen(input_perem); i++) {
				if (input_perem[i] < '0' || input_perem[i] > '9') {
					k++;
				}
			}
			if (k == 0 && atoi(input_perem)<100 && atoi(input_perem)>1) {
				*M = atoi(input_perem);
			}
		}

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

		for (i = 0; i <*N; i++) {
			for (j = 0; j <*N; j++) {
				arr[i][j] = rnd(-100, 100);
			}
		}
	}
	return 0;
}
NOMAD2377 вне форума Ответить с цитированием
Старый 14.03.2018, 18:38   #2
СтудПом
Форумчанин
 
Регистрация: 08.11.2017
Сообщений: 347
По умолчанию Программа работы с векторами на Си

Что-то шибко много кода в функции.
Функция ввода вектора - три строки.
СтудПом вне форума Ответить с цитированием
Старый 14.03.2018, 19:44   #3
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Отрефакторь код
У тебя он переусложнён.

Например, можно вынести в отдельную функцию ввод ненулевого числа:
Код:
int get_non_zero(const std::string& message)
{
   int ret;
   do{
      std::cin>>ret;
      if (ret==0){
         std::cout<<"Must be nonzero"<<std::endl;  
      }
   }
   while(ret==0);
}
И потом вместо твоих ужасных циклов просто писать:
Код:
int N = get_non_zero("Number of rowS?:");
int M = get_non_zero("Number of columns?:");
Ну, и массив ты делаешь неправильно:
Код:
int** arr;
arr = new int*[N];
for (i = 0; i<N; i++) {
			arr[i] = new int[M];
		}
for (i = 0; i<N; i++) 
   for (j = 0; i<M; i++) {
			std::cin>>arr[i][j];
		}
Ну, и, наконец, не передавай аргументы по указателю, потому что для таких как ты давно изобрели ссылки!

int input(int&z, int **&arr, int &N, int &M)
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает ввод двумерного динамического массива типа float. Aris96 Общие вопросы C/C++ 1 14.04.2015 07:45
сортировка двумерного массива Miles Помощь студентам 3 19.12.2011 22:14
Как обнулить элементы строки двумерного массива, содержащей наибольшее количество элементов одномерного массива griignat Помощь студентам 1 22.11.2011 20:04
Сортировка двумерного массива Makarov Помощь студентам 8 29.10.2011 11:55
Заполнение двумерного массива pisikaker Паскаль, Turbo Pascal, PascalABC.NET 2 15.05.2011 10:01