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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.06.2010, 20:08   #1
Alex TGM
Пользователь
 
Регистрация: 25.04.2010
Сообщений: 10
По умолчанию Упрощение кода программы

Условие задачи:
«Выравнивание»
Даны 5 чисел. Одним ходом разрешается выбрать любые три из них и увеличить каждое на одно и тоже число. Затем, при необходимости. Выбирается другая тройка чисел и тоже увеличивается каждое из выбранных. Итак, до тех пор, пока все пять не станут равными.
Ваша программа должна:
· Запросить пять чисел;
· Найти и вывести каждый шаг до получения равных чисел.
Например. 3,7,1,11,4
Шаг 0. 3,7,1,11,4
Шаг 1. 7,11,5,11,4
Шаг 2. 7,14,5,14,7
Шаг 3. 7,16,7,16,7
Шаг 4. 16,16,16,16,16
Мое решение:
Код:
#include <iostream>
using namespace std;

/****************
 * ВЫРАВНИВАНИЕ *
 ****************/

int main()
{
	/* Просим пользователя ввести 5 произвольных чисел */

	int a = 0, b = 0, c = 0, d = 0, e = 0;	
	cout << "Vvedite 5 chisel:" << endl;
	cin >> a >> b >> c >> d >> e;

	/* Ищем наибольшее, наименьшее и промежуточные значения */

	int z1 = 0, z2 = 0, z3 = 0, z4 = 0, z5 = 0;
	int size = 0;
	
	/* Для 'a' */

	if (a > b)
	{
		size += 1; 
	}
	if (a > c)
	{
		size += 1; 
	}
	if (a > d)
	{
		size += 1; 
	}
	if (a > e)
	{
		size += 1; 
	}
	switch(size)
      {
	  case 1: 
		  z2 = a;
		  break;
	  case 2: 
		  z3 = a;
		  break;
	  case 3: 
		  z4 = a;
		  break;
	  case 4: 
		  z5 = a;
		  break;
	  case 0:
          z1 = a;
		  break;
      }

	size = 0;

	/* Для 'b' */
	
	if (b > a)
	{
		size += 1; 
	}
	if (b > c)
	{
		size += 1; 
	}
	if (b > d)
	{
		size += 1; 
	}
	if (b > e)
	{
		size += 1; 
	}
	switch(size)
      {
	  case 1: 
		  z2 = b;
		  break;
	  case 2: 
		  z3 = b;
		  break;
	  case 3: 
		  z4 = b;
		  break;
	  case 4: 
		  z5 = b;
		  break;
	  case 0:
          z1 = b;
		  break;
      }

	size = 0;

	/* Для 'c' */
	
	if (c > a)
	{
		size += 1; 
	}
	if (c > b)
	{
		size += 1; 
	}
	if (c > d)
	{
		size += 1; 
	}
	if (c > e)
	{
		size += 1; 
	}
	switch(size)
      {
	  case 1: 
		  z2 = c;
		  break;
	  case 2: 
		  z3 = c;
		  break;
	  case 3: 
		  z4 = c;
		  break;
	  case 4: 
		  z5 = c;
		  break;
	  case 0:
          z1 = c;
		  break;
      }

	size = 0;

	/* Для 'd' */
	
	if (d > a)
	{
		size += 1; 
	}
	if (d > c)
	{
		size += 1; 
	}
	if (d > b)
	{
		size += 1; 
	}
	if (d > e)
	{
		size += 1; 
	}
	switch(size)
      {
	  case 1: 
		  z2 = d;
		  break;
	  case 2: 
		  z3 = d;
		  break;
	  case 3: 
		  z4 = d;
		  break;
	  case 4: 
		  z5 = d;
		  break;
	  case 0:
          z1 = d;
		  break;
      }

	size = 0;

	/* Для 'e' */
	
	if (e > a)
	{
		size += 1; 
	}
	if (e > c)
	{
		size += 1; 
	}
	if (e > b)
	{
		size += 1; 
	}
	if (e > d)
	{
		size += 1; 
	}
	switch(size)
      {
	  case 1: 
		  z2 = e;
		  break;
	  case 2: 
		  z3 = e;
		  break;
	  case 3: 
		  z4 = e;
		  break;
	  case 4: 
		  z5 = e;
		  break;
	  case 0:
          z1 = e;
		  break;
      }

	size = 0;

	/* Запускаем алгоритм */

	/* ШАГ 1*/
	/* Берем 2 самых маленьких (z1, z2) и (z4) */
	/* Прибавляем к этой тройке разницу между (z5) и (z4) */
	
	int steps = 0; /* В этой переменной мы будем считать количество шагов */
	int w = 0, x = 0, y = 0, z = 0;

	w = z5 - z4;

	z1 += w;
	z2 += w;
	z4 += w;
	steps += 1;

	/* ШАГ 2*/
	/* Берем 2 самых больших (z4, z5) и (z3) */
	/* Прибавляем к этой тройке разницу между (z2) и (z3) */

	x = z2 - z3;

	z4 += x;
	z5 += x;
	z3 += x;
	steps += 1;

	/* ШАГ 3*/
	/* Берем 2 самых больших (z4, z5) и (z3) */
	/* Прибавляем к этой тройке разницу между (z3) и (z1) */

	y = z3 - z1;

	z4 += y;
	z5 += y;
	z1 += y;
	steps += 1;

	/* ШАГ 4*/
	/* Берем числа (z1, z2 и z3) */
	/* Прибавляем к этой тройке разницу между (z5) и (z1) */
	
	z = z5 - z1;

	z1 += z;
	z2 += z;
	z3 += z;
	steps += 1;

	/*for (step)
	cout*/
	cout << z1 << ' ' << z2 << ' ' << z3 << ' ' << z4 << ' ' << z5;
	return 0;
}
Согласитесь, я написал в коде много лишнего. Хотелось бы сократить .
Конкретно интересует упрощение этой части, так как она повторяется 5 раз:
Код:
if (a > b)
	{
		size += 1; 
	}
	if (a > c)
	{
		size += 1; 
	}
	if (a > d)
	{
		size += 1; 
	}
	if (a > e)
	{
		size += 1; 
	}
	switch(size)
      {
	  case 1: 
		  z2 = a;
		  break;
	  case 2: 
		  z3 = a;
		  break;
	  case 3: 
		  z4 = a;
		  break;
	  case 4: 
		  z5 = a;
		  break;
	  case 0:
          z1 = a;
		  break;
      }
Заранее спасибо!

Последний раз редактировалось Stilet; 29.06.2010 в 13:17.
Alex TGM вне форума Ответить с цитированием
Старый 29.06.2010, 00:34   #2
loser
Пользователь
 
Регистрация: 19.02.2010
Сообщений: 30
По умолчанию

Рекомендую изучить: циклы, функции и массивы. Тогда все упростится.
loser вне форума Ответить с цитированием
Старый 29.06.2010, 06:20   #3
sever-42
Пользователь
 
Регистрация: 22.04.2010
Сообщений: 96
По умолчанию

Код:
#include <iostream>
using namespace std;
	
bool check(int *a)
{
	return (a[0] == a[1] && a[0] == a[2] && a[0] == a[3] && a[0] == a[4]);
}
void min_max(int *a, int *mm)
{
	int i, j, size;

	for (i = 0; i < 5; i++)
		for (j = 0; j < 5; j++) {
			if (a[i] > a[j])
				size++;
			switch(size) {
			case 0 : mm[0] = a[i];
				break;
			case 1 : mm[1] = a[i];
				break;
			case 2 : mm[2] = a[i];
				break;
			case 3 : mm[3] = a[i];
				break;
			case 4 : mm[4] = a[i];
				break;
			}
			size = 0;
		}
}

int main() 
{
	setlocale(LC_ALL, "");
	int a[5];
	int mm[5];
	int i;

	for (i = 0; i < 5; i++)
		cin >> a[i];
	do {
		/*Шаг 1*/
                /*...*/
	} while (!check(a));
    return 0;
}
вот так получилось, немного не понял условия...

a = a[0];
b = a[1];
c = a[2];
...
z1 = mm[1];
z2 = mm[2];
z3 = mm[3];
...
дальше заменяешь a, b, c на a[0], a[1], a[2], z на mm
include <Qt>

Последний раз редактировалось sever-42; 29.06.2010 в 13:41.
sever-42 вне форума Ответить с цитированием
Старый 29.06.2010, 11:49   #4
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2sever-42
Код:
return (a[0] == a[1] == a[2] == a[3] == a[4]);
это неверно
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 29.06.2010, 13:03   #5
NiCola999
Не
Участник клуба
 
Регистрация: 29.10.2009
Сообщений: 1,456
По умолчанию

да че париться, сказали же изучите циклы, функции и код уменьшится раз в 5

2server-42
твоя прога в бесконечный цикл входит после ввода цифр
NiCola999 вне форума Ответить с цитированием
Старый 29.06.2010, 13:18   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
и код уменьшится раз в 5
Оффтоп: Скорее во все 20...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 29.06.2010, 13:32   #7
sever-42
Пользователь
 
Регистрация: 22.04.2010
Сообщений: 96
По умолчанию

Цитата:
Сообщение от pproger Посмотреть сообщение
2sever-42
Код:
return (a[0] == a[1] == a[2] == a[3] == a[4]);
это неверно
Код:
bool check(int *a)
{
    return (a[0] == a[1] && a[0] == a[2] && a[0] == a[3] && a[0] == a[4]);
}
2NiCola999
так я сам алгоритм в тело цикла не вставлял, автор пускай сам сделает
include <Qt>

Последний раз редактировалось sever-42; 29.06.2010 в 13:39.
sever-42 вне форума Ответить с цитированием
Старый 30.06.2010, 22:40   #8
Alex TGM
Пользователь
 
Регистрация: 25.04.2010
Сообщений: 10
По умолчанию

Все, спасибо всем, упростил. Из всего кода осталось всего 97 строк(считая коментарии).
Код:
#include <iostream>
using namespace std;

/****************
 * ВЫРАВНИВАНИЕ *
 ****************/

int main()
{
	/* Просим пользователя ввести 5 произвольных чисел */

	int p = 0, b = 0, c = 0, d = 0, e = 0;
	int A, a[5];
	int i = 0, j = 1, s = 0;
	cout << "Vvedite 5 chisel:" << endl;
	cin >> p >> b >> c >> d >> e;
	a[0] = p;
	a[1] = b;
	a[2] = c;
	a[3] = d;
	a[4] = e;

	/* Ищем наибольшее, наименьшее и промежуточные значения */
	/* Сортируем по возрастанию */

	A = 5;
	
	for (i = 0; i <= A-1; i++)
		for (j=i+1; j <= A-1; j++)
		{
			if (a[i] >= a[j])
			{
				s = a[i];
				a[i] = a[j];
				a[j] = s;
			}
		}

	/* Запускаем алгоритм */

	/* ШАГ 1*/
	/* Берем 2 самых маленьких (a[0], a[1]) и (a[3]) */
	/* Прибавляем к этой тройке разницу между (a[4]) и (a[3]) */
	
	int steps = 0; /* В этой переменной мы будем считать количество шагов */
	int w = 0, x = 0, y = 0, z = 0;

	w = a[4] - a[3];

	a[0] += w;
	a[1] += w;
	a[3] += w;
	steps += 1;

	cout << "Step 1: " << a[0] << "  " << a[1] << "  " << a[2] << "  " << a[3] << "  " << a[4] << endl;

	/* ШАГ 2*/
	/* Берем 2 самых больших (a[3], a[4]) и (a[2]) */
	/* Прибавляем к этой тройке разницу между (a[1]) и (a[2]) */

	x = a[1] - a[2];

	a[3] += x;
	a[4] += x;
	a[2] += x;
	steps += 1;

	cout << "Step 1: " << a[0] << "  " << a[1] << "  " << a[2] << "  " << a[3] << "  " << a[4] << endl;

	/* ШАГ 3*/
	/* Берем 2 самых больших (a[3], a[4]) и (a[2]) */
	/* Прибавляем к этой тройке разницу между (a[2]) и (a[0]) */

	y = a[2] - a[0];

	a[3] += y;
	a[4] += y;
	a[0] += y;
	steps += 1;

	cout << "Step 1: " << a[0] << "  " << a[1] << "  " << a[2] << "  " << a[3] << "  " << a[4] << endl;

	/* ШАГ 4*/
	/* Берем числа (a[0], a[1] и a[2]) */
	/* Прибавляем к этой тройке разницу между (a[4]) и (a[0]) */
	
	z = a[4] - a[0];

	a[0] += z;
	a[1] += z;
	a[2] += z;
	steps += 1;

	cout << "Step 1: " << a[0] << "  " << a[1] << "  " << a[2] << "  " << a[3] << "  " << a[4] << endl << endl;

	return 0;
}
Alex TGM вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разъяснение кода программы ) Expelio Помощь студентам 2 25.03.2010 00:00
Упрощение кода R@Ziel Помощь студентам 0 26.12.2009 20:27
Анализ кода программы virput1 Софт 8 04.08.2009 14:53
Упрощение кода программы за счет использования процедур uraura Общие вопросы Delphi 10 26.03.2009 21:54
Оптимизация кода программы insi Фриланс 2 17.05.2008 18:30