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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2015, 21:36   #1
astrathorns
Новичок
Джуниор
 
Регистрация: 12.04.2015
Сообщений: 1
По умолчанию Кол-во совпадений элемента

Произвожу поиск элемента в массиве двумя способами: линейным(последовательным) поиском и бинарным(двоичным). Первый работает на ура. Второй корректно показывает есть элемент в массиве или нет. Мне необходимо кол-во всех совпадений элемента при бинарном поиске, а он ищет наличие хотя бы одного, возвращает его и совпадения всегда равны одному. Не пойму как исправить сей косяк. Приложил скрин работы.Безымянный12345678.jpg

Код:
#include <iostream>
#include <string>
#include <ctime>

using namespace std;
bool f;

void output_matrix(int ** matrix, int rows, int columns)
{
	for (int i = 0; i < rows; ++i)
	{
		for (int j = 0; j < columns; ++j)
		{
			cout << matrix[i][j] << ' ';
		}
		cout << endl;
	}
}

void copy_matrix(int ** dest_matrix, int ** source_matrix, int rows, int columns)
{
	for (int i = 0; i < rows; ++i)
	for (int j = 0; j < columns; ++j)
		dest_matrix[i][j] = source_matrix[i][j];
}

void LineSearch(int **arr, int rows, int cols, int key)
{
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; ++j)
		if (arr[i][j] == key)
		{
			cout << "Найденный элемент находится на " << i + 1 << " строке, в " << j + 1 << " столбце." << endl;
			f = true;
		}
	}
}

void insertSort(int * arr, int arr_size)
{
	int tmp;
	for (int i = 1, j; i < arr_size; ++i) // цикл проходов, i - номер прохода
	{
		tmp = arr[i]; 
		for (j = i - 1; j >= 0; j -= 1) 
		{
			//Цикл идет в обратном направлении (от i к 0)
			//в цикле сдвигаем элементы "направо", пока не найдем позицию вставки
			if (arr[j] > tmp) //Если данный элемент меньше проверяемого, то
			{
				arr[j + 1] = arr[j]; //Сдвигаем данный элемент вправо
				//	++swap_count;
			}
			else
			{
				break;
			}
		}//++swap_count;
		//Когда цикл завершен - позиция найдена
		if ((j + 1) != i)
		{

			arr[j + 1] = tmp; // вставить проверяемый элемент в найденную позицию
		}
	}
}

int BinarSearch(int **arr, int rows, int cols, int key, int &number)
{
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < cols; ++j)
		{
	        int center = 0, left = 0;
	        int right = cols - 1;
			while (left <= right)
			{
				center = left + (right - left) / 2;
				if (key<arr[i][center])
				{
					right = center - 1;
				}
				else if (key>arr[i][center])
				{
					left = center + 1;
				}
				else {
					number++;
					return center;
				}
			}
		}
	}
	return -1;
}

int main()
{
	srand(time(NULL));
	setlocale(LC_ALL, "");
	string insert_rows, insert_columns, insert_key;
	int key, rows, columns, number=0, count = 0;
	int i = 0;

	cout << "Введите кол-во строк матрицы: ";
	getline(cin, insert_rows);
	while (!insert_rows[0])
	{
		cout << "Вы ввели Enter" << endl;
		getline(cin, insert_rows);
	}
	rows = stoi(insert_rows);

	cout << "Введите кол-во стобцов матрицы: ";
	getline(cin, insert_columns);
	while (!insert_columns[0])
	{
		cout << "Вы ввели Enter" << endl;
		getline(cin, insert_columns);
	}
	columns = stoi(insert_columns);

	int ** matrix = new int*[rows];
	int ** sorted_matrix = new int*[rows];
	//Динамическое создание двумерного массива
	for (int count = 0; count < rows; count++)
	{
		matrix[count] = new int[columns];
		sorted_matrix[i] = new int[columns];
	}

	//Заполнение и вывод массива 
	for (int i = 0; i < rows; ++i) //Проходим по всем строкам
	{
		matrix[i] = new int[columns];//Выделяем память под элементы строки
		sorted_matrix[i] = new int[columns];//Выделяем память под элементы строки
		for (int j = 0; j < columns; ++j) //проходим по элементам строки
		{
			matrix[i][j] = rand() % 10; //Генерируем число в интервале [10,99]
		}
	}
	cout << "Исходная матрица:\n";
	output_matrix(matrix, rows, columns);
	cout << "Искомый элемент: ";
	getline(cin, insert_key);
	while (!insert_key[0])
	{
		cout << "Вы ввели Enter" << endl;
		getline(cin, insert_key);
	}
	key = stoi(insert_key);
	LineSearch(&matrix[i], rows, columns, key);
	if (!f)
	{
		cout << "Элемент не найден" << endl;
	}

	//////////////////////////////////////////////
	//////СОРТИРОВКА ДЛЯ БИНАРНОГО ПОИСКА/////////
	//////////////////////////////////////////////

	copy_matrix(sorted_matrix, matrix, rows, columns);

	for (int i = 0; i < rows; ++i)
	{
		insertSort(sorted_matrix[i], columns);
	}
	output_matrix(sorted_matrix, rows, columns);
	cout << "Искомый элемент: ";
	cin >> key;

	if (BinarSearch(&sorted_matrix[i], rows, columns, key, number) != -1)
	{
		cout << "Искомый элемент есть в массиве" << endl;
	cout << "Количество совпадений = " << number << endl;
    }
	else
		cout << "Искомый элемент не найден" << endl;

	//Удаление двумерного динамического массива
	for (int count = 0; count < rows; count++)
	{
		delete[] matrix[count];
	}
	delete[] matrix;
	return 0;
}
astrathorns вне форума Ответить с цитированием
Старый 13.04.2015, 00:34   #2
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Цитата:
Сообщение от astrathorns Посмотреть сообщение
Приложил скрин работы.
Скрин, конечно, дело хорошее. Но всё-же, желательно указать в коде, проблемный участок. Не у всех есть время заводить компиль и вводить туда такой нехилый код.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 13.04.2015, 23:13   #3
Gekan
Пользователь
 
Регистрация: 29.06.2012
Сообщений: 39
По умолчанию

Не вдаваясь в сам алгоритм, видны проблемы с функцией BinarSearch:
1. Есть цикл for (int j = 0; j < cols; ++j), в теле которого переменная j нигде не используется.
2. Инструкция return center осуществляет выход из функции, но есть подозрения, что на самом деле идея в том, что хотелось бы вернуть number, ту самую переменную, которую точно не следует делать параметром этой функции, т.к. в этом просто нет необходимости.
Gekan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Структура элемента массива «пассажир»: фамилия, номер рейса, багаж - количество вещей, общий вес. Определить число пассажиров, кол Masha Koks Помощь студентам 3 26.11.2013 19:00
Задачи на обработку строк: удалить каждую 3-ю букву, найти кол-во гласных, кол-во цифр в строке,совпадения в 2-х строках Ирина93 Паскаль, Turbo Pascal, PascalABC.NET 6 05.11.2011 22:10
Си -Расположить элементы в порядке возрастания от первого нулевого элемента до отрицательного элемента Freia Помощь студентам 17 13.12.2009 15:41
макрос - подсчитать для каждой строки кол-во ячеек с «+», кол-во ячеек с «-» Vadim_abs Microsoft Office Excel 36 14.07.2009 12:08
Найти кол-во целых чисел в первой последовательности и кол-во нечетных во второй. DjDeniels-61 Помощь студентам 7 28.06.2009 13:04