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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.10.2019, 12:46   #1
Alina266
Пользователь
 
Регистрация: 19.03.2017
Сообщений: 10
По умолчанию Поправить программу с функцией, передачей параметров

Код:

#include "stdafx.h"
#include <iostream>
#include <ctime>
#include <Windows.h>

using namespace std;


int sortShell(int *mas, int h, int s) {
	int step, k, temp, count = 0;
	step = s / 2;//шаг
	while (step > 0)
	{
		for (h = 0; h < (s - step); h++) {
			k = h;
			while (h >= 0 && mas[h] > mas[h + step])
			{
				count++;
				temp = mas[h];
				mas[h] = mas[h + step];
				mas[h + step] = temp;
				h--;
				count++;

			}
		}
		step = step / 2;//уменьшили в два раза шаг
	}

	return count;

}

void fastSort(int *mas, int begin, int end, int check,int &count) {

	int temp;
	int tmpbegin = begin;
	int tmpend = end;
	 


	temp = mas[begin];


	switch (check)
	{
	case 1:
	{
		while (begin<end)
		{
			while ((mas[end] >= temp) && (begin < end))
			{
				end--;
				count++;
			}
			if (begin != end)
			{
				mas[begin] = mas[end];
				begin++;
				count++;
			}
			while ((mas[begin] <= temp) && (begin < end))
			{
				begin++;
				count++;
			}
			if (begin != end)
			{
				mas[end] = mas[begin];
				end--;
				count++;
			}
		}

		mas[begin] = temp;
		temp = begin;
		begin = tmpbegin;
		end = tmpend;

		if (begin < temp)
		{
			fastSort(mas, begin, temp - 1, check,count);
		}

		if (end>temp)
		{
			fastSort(mas, temp + 1, end, check,count);
		}
		break;
	}

	case 2:
	{
		while (begin<end)
		{
			while ((mas[end] <= temp) && (begin < end))
			{
				end--;
				count++;
			}
			if (begin != end)
			{
				mas[begin] = mas[end];
				begin++;
				count++;
			}
			while ((mas[begin] >= temp) && (begin < end))
			{
				begin++;
				count++;
			}
			if (begin != end)
			{
				mas[end] = mas[begin];
				end--;
				count++;
			}
		}

		mas[begin] = temp;
		temp = begin;
		begin = tmpbegin;
		end = tmpend;

		if (begin < temp)
		{
			fastSort(mas, begin, temp - 1, check,count);
		}

		if (end>temp)
		{
			fastSort(mas, temp + 1, end, check,count);
		}
	}
	default:
	{
		break;
	}

	}

	//return count;
}

int bulbSort(int *mas, int h, int s) {

	int k, buf, count=0;
	for (h = 1; h < s; h++)
	{
		k = h;
		for (k = 0; k < s - 1; k++)
		{
			if (mas[k] > mas[k + 1])
			{
				count++;
				buf = mas[k];
				mas[k] = mas[k + 1];
				mas[k + 1] = buf;
				count++;
			}
		}
	}

	return count;
}





int main()
{
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	const int n = 40;
	int arr[n], arrtemp[n];
	int i, j, point, point1, point2, point3, countSh, countFs=0, countBl;

	srand(time(0));


	do
	{
		system("cls");
		cout << "Введите желаемый пункт меню:\n1.Сортировка\n2.Выход\n";
		cin >> point;
		switch (point)
		{
		case 1:
		{
			system("cls");
			cout << "Массив до сортировки :" << endl;

			for (i = 0; i < n; i++)
			{
				arr[i] = rand() % 90 + 10;
				arrtemp[i] = arr[i];
				cout << arr[i] << " ";
			}

			
			cout << endl;
			do
			{

				cout << "Введите желаемый пункт меню:\n1.Сортировка по возрастанию\n2.Сортировка по убыванию\n";

				cin >> point1;

				fastSort(arr, 0, n - 1, point1, countFs);

				cout << "\nМассив после быстрой сортировки :" << endl;

				for (i = 0; i < n; i++)
				{
					cout << arr[i] << " ";
				}

				cout << "\nКол-во шагов в быстрой сортировке = " << countFs << endl;
				countFs = 0;


				cout << endl;

				for (i = 0; i < n; i++)
				{
					arr[i] = arrtemp[i];
				}

				cout << endl;
				countSh = sortShell(arr, i, n);

				cout << "\nКол-во шагов в сортировке Шелл = " << countSh << endl;

				cout << endl;

				for (i = 0; i < n; i++)
				{
					arr[i] = arrtemp[i];
				}

				cout << endl;
				countBl = bulbSort(arr, i, n);

				cout << "\nКол-во шагов в сортировке пузырьком = " << countBl << endl;


				
				



				cout << "\nХотите повторить? \n1.Да\n2.Нет\n";
				cin >> point1;

				if (point1 == 2) break;				


				cout << "Использовать старый массив, или генерируем новый? \n1.Старый\n2.Новый\n";
				cin >> point2;
				if (point2 == 2)
				{
					system("cls");
					cout << "Новый массив" << endl;
					for (i = 0; i < n; i++)
					{
						arr[i] = rand() % 90 + 10;
						cout << arr[i] << " ";
						arrtemp[i] = arr[i];
					}
				}

			} while (point1 == 1);
			break;
		}


		case 2:
		{

			break;
		}

		default: cout << "Вы выбрали неправильно! Введите заново\n";
			break;
		}
		

	} while (point != 2);


	


	
	

	
	

	system("pause");
	return 0;
}
Программа, по сути, работает правильно, но есть одно но.
Проблема вот в чём: если пройтись по цепочке: Сортировка---Сортировка по возрастанию---Повторить---Старый----(любую сортировку), фун-ия быстрой сортировки fastSort накапливает значение ещё раз. Помогите поправить именно эту часть, желательно, не меняя ничего существенного, и не используя чего-то супер-серьёзного чего я не пойму.
Спасибо
Alina266 вне форума Ответить с цитированием
Старый 26.10.2019, 15:01   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Насколько понял, если выбрать "повторить" и "использовать старый", то в быструю сортировку попадает уже отсортированный массив arr, так как никто его не восстанавливает из arrtemp.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 26.10.2019, 21:24   #3
Alina266
Пользователь
 
Регистрация: 19.03.2017
Сообщений: 10
По умолчанию

Большое спасибо. Хотя я и понимала это сама, но почему то поправить прогу у меня вышло, только после того как Вы написали. Спасибо
Alina266 вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Cкрипты с передачей параметров. Ссылки. ggjgj Помощь студентам 0 05.12.2018 14:10
Поправить программу - поправить процедуры и сделать из глобальных переменных - локальные Topse Паскаль, Turbo Pascal, PascalABC.NET 10 16.03.2018 09:30
Запрос из таблицы, с передачей параметров из ячеек. IliaIT Microsoft Office Excel 0 26.02.2015 10:59
Вопрос с передачей параметров в С swooppy Помощь студентам 0 09.05.2012 08:47
проблема с передачей параметров Mira-girl Общие вопросы по Java, Java SE, Kotlin 2 22.11.2010 23:59