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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.03.2013, 20:11   #1
programka311
 
Регистрация: 08.10.2012
Сообщений: 8
По умолчанию Оптимизация программы на С++

Помогите оптимизировать программу, я не представляю, что в ней можно изменить. Хотя бы намек на функцию, в которой нужна оптимизация
Код:
#include <iostream.h>
//прототипы функций
void vvod (long &,int &);
void conversion(long,int,int *&,int &);
int polin(int *&,int);
void vivod(int *&,int);
void summa(int *, int , int , int & , int * , int * &, int);
void vichitanie(int *,int , int *,int ,int *&,int &,int);
void main()
{
	//инициализация переменных
	long j,con_dip;
	int *a,na,osn,*min,*max,nmin,nmax,l=0,*s,ns,*v,nv;
	//вызов функции ввода
	vvod(con_dip,osn);
	cout<<"Osnovanie sistemi="<<osn<<endl;
	//цикл по всему диапазону чисел
	for(j=100;j<con_dip;j++)
	{
		//вызов функции перевода из 10 в заданную системы счисления и наоборот
		conversion(j,osn,a,na);
		conversion(j,10,b,nb);
		//вызов функции нахождения палиндрома и запись результат в переменную
		int voz1= polin(a,na);
		int voz2=polin(b,nb);
		//сравниваем результаты функции нахождения палиндромав
		if(voz1==1 && voz2==1)
			{
				//запоминаем 1 палиндром
				if(l==0)
    				{
					min=a;
     					nmin=na;
     					l=1;
    				}
				//вывод палиндромов
				vivod(a,na);
				//запоминаем последний палиндром
				max=a;
				nmax=na;
			}
   }
   //вывод минимума
   cout<<"**********MIN**********"<<endl;
   vivod(min,nmin);
      //вывод максимума
   cout<<"**********MAX**********"<<endl;
   vivod(max,nmax);
      //расчет и вывод суммы
   cout<<"**********SUMMA**********"<<endl;
   summa(min,nmin,nmax,ns,max,s,osn);
   vivod(s,ns);
      //расчет и вывод разности
   cout<<"**********RAZNOST**********"<<endl;
   vichitanie(min,nmin,max,nmax,v,nv,osn);
   vivod(v,nv);
      //задержка 
   cin >>na;
}
//функция ввода
void vvod(long &con_dip,int &osn)
{
	do
	{
		cout<<"Vvedite chislo:"<<endl;
		cin>>con_dip;
	}
   while(con_dip<100 );//ввод основания системы счисления от 100
   do
	{
		cout<<"Vvedite osnovanie sistemi:"<<endl;
		cin>>osn;
	}
   while(osn<2 || osn>16);//ввод основания системы счисления от 2 до 16
}
//функция перевода числа из 10-ой в заданную систему счисления
void conversion(long j, int osn, int *&x, int &n)
{
	int i;
	//заносим число из диапазона в переменную s, чтобы само число не менять для дальнейшей работы с ним
	long s=j;
	//определяем размер массива для палиндрома
	for(n=1;s>=osn;n++)
		{
			s=s/osn;
		}
		//выделение памяти для массива битов числа
    x=new int[n];
	//перевод числа в заданную систему счисления
	for(i=n-1;i>=0;i--)
		{
			//остаток от делание на основание системы счисления
			x[i]=j%osn;
			//уменьшение числа для дальнейшего деления с остатком
			j=j/osn;
		}
}
//функция нахождения палиндромов
int polin(int *&x, int n)
{
	int i; 
	//определяем палиндром или нет
	for(i=0;i<=n/2;i++)
		{
			if(x[i]!=x[n-i-1])
			//если не палиндром
			return 0;
		}
		//если палиндром
    return 1;
}
//функция вывода
void vivod(int *&x, int n)
{
	int i;
	for(i=0;i<n;i++)
		{
			////Если значения в ячейке больше 9, то заменяем их буквами, для 16 системы счисления
			if(x[i]==10)
				cout << 'A';
			else
			if(x[i]==11)
				cout<<'B';
			else
			if(x[i]==12)
				cout<<'C';
			else
			if(x[i]==13)
				cout<<'D';
			else
			if(x[i]==14)
				cout<<'E';
			else
			if(x[i]==15)
				cout<<'F';
			else
				cout<<x[i];//вывод для остальных систем счисления
		}
	cout<<endl;
}
//функция нахождения суммы максимального и минимального палиндромов
void summa(int * min, int nmin, int nmax, int & n, int * max, int * & x, int osn)
{
	int d=0;
	//выделение памяти под массив суммы
	n = nmax+1;
    x = new int [n];
   	for (int i=nmin-1,k=nmax-1; i>=0; i--, k--)
       	{
			//сумма заносится по разрядно в массив суммы
			x[k+1]=(max[k]+min[i]+d)%osn; 
			//установка переполнения
                                 d=(max[k]+min[i]+d)/osn;
        }
		
	//снос оставшихся битов с переполнением
    for (int i=nmax-nmin; i>0; i--)
		{
			x[i]=(max[i-1]+d)%osn;
            d=(max[i-1]+d)/osn;
        }
    x[0]=d;
}
//функция нахождения разности между максимальным и минимальным 
void vichitanie(int *min,int nmin,int *max,int nmax,int *&x,int &n,int osn)
{
	n=nmax;
	//Выделение памяти для результирующего массива разности
	x=new int [nmax]; 
	long t = 0;
	
	//цикл, пока не начало массива максимального палиндрома
	for(int i=nmax-1, k=nmin-1; i>=0; i--, k--) 
		{
			 //Если минимальный палиндром закончился
			if(k<0)
			//От текущего элемента массива максимального палиндрома отнимается "займ"
				x[i]=max[i]-t; 
			//От текущего элемента массива максимального палиндрома отнимается соответствующий минимальный и отнимается "займ"
			x[i]=max[i]-min[k]-t; 
			 //Если вычитание отрицательно
			if(x[i]<0)
			{
				//Добавление основания системы к результату вычитания
				x[i]=x[i]+osn;
				//Установка необходимости займа
				t=1;	
			}
			else
			t=0; 
		}
}

Последний раз редактировалось programka311; 20.03.2013 в 13:42.
programka311 вне форума Ответить с цитированием
Старый 19.03.2013, 20:34   #2
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Заключите код в теги [CODE] - #
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 20.03.2013, 13:43   #3
programka311
 
Регистрация: 08.10.2012
Сообщений: 8
По умолчанию

Заключила
programka311 вне форума Ответить с цитированием
Старый 20.03.2013, 14:22   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Более-менее нормально написано. Из мелочей - обычно аргументы, передаваемые "по ссылке", стоит передавать как указатели, чтобы в вызывающем коде было видно, что вызов может изменить переменную. Или, скажем, это
Код:
		//вызов функции нахождения палиндрома и запись результат в переменную
		int voz1= polin(a,na);
		int voz2=polin(b,nb);
		//сравниваем результаты функции нахождения палиндромав
		if(voz1==1 && voz2==1)
Можно заменить на
Код:
if(polin(a,na) && polin(b,nb))
Не очень хороший момент: всякому new[] должен соответствовать delete[], а у Вас их нет. Стоит добавить в конец main(), чтобы не привыкать к плохому.
Код:
			if(x[i]==10)
				cout << 'A';
			else
			if(x[i]==11)
				cout<<'B';
			else
			if(x[i]==12)
				cout<<'C';
			else
			if(x[i]==13)
				cout<<'D';
			else
			if(x[i]==14)
				cout<<'E';
			else
			if(x[i]==15)
				cout<<'F';
			else
				cout<<x[i];//вывод для остальных систем счисления
Общий способ:
Код:
switch(x[i]){
case 10: cout << 'A'; break;
//...
case 15: cout << 'F'; break;
default: cout << x[i];
}
Частный способ, небольшой трюк для данного случая:
Код:
static const char* digits = "0123456789ABCDEF";
cout << digits[x[i]];
А ещё есть манипулятор вывода hex.


Хорошая мысль нормально расставить аргументы в функциях (мне пришлось потратить время, соображая, что чему соответствует в summa):
Код:
void summa(int osn, const int* arg1, size_t arg1Size, const int* arg2, size_t arg2Size, int ** pResult, size_t* pResultSize)
Обратите внимание: аргументы избавились от вводящих в заблуждение названий min и max (и в функции стоит отдельно посчитать максимальную из длин и модуль разности длин), это просто суммирование. Для размеров массивов C++ предлагает специальный тип size_t (который "на самом деле" unsigned int, но теперь всем понятно, что речь о размере). Функция явно гарантирует неизменность слагаемых (в том числе страховка от собственных опечаток).
Abstraction вне форума Ответить с цитированием
Старый 20.03.2013, 16:14   #5
rrrFer
Санитар
Старожил
 
Аватар для rrrFer
 
Регистрация: 04.10.2008
Сообщений: 2,577
По умолчанию

Цитата:
laba1.22.cpp:1:22: fatal error: iostream.h: Нет такого файла или каталога
laba1.22.cpp:10:11: error: ‘::main’ must return ‘int’
laba1.22.cpp: In function ‘int main()’:
laba1.22.cpp:23:19: error: ‘b’ was not declared in this scope
laba1.22.cpp:23:21: error: ‘nb’ was not declared in this scope
рано оптимизировать МБ?

-------
А вобще, хотел под Valgrind-ом запустить, потому что утечки тут налицо
rrrFer вне форума Ответить с цитированием
Старый 20.03.2013, 19:00   #6
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Спасибо Abstraction, интересный трюк....
Код:
static const char* digits = "0123456789ABCDEF";
cout << digits[x[i]];
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 21.03.2013, 08:21   #7
programka311
 
Регистрация: 08.10.2012
Сообщений: 8
По умолчанию

Хорошая мысль нормально расставить аргументы в функциях (мне пришлось потратить время, соображая, что чему соответствует в summa):
Код:
void summa(int osn, const int* arg1, size_t arg1Size, const int* arg2, size_t arg2Size, int ** pResult, size_t* pResultSize)
запутали
programka311 вне форума Ответить с цитированием
Старый 21.03.2013, 08:25   #8
programka311
 
Регистрация: 08.10.2012
Сообщений: 8
По умолчанию

СПАСИБО ОГРОМНЕЙШЕЕ, Abstraction!!! С меня шоколадка
programka311 вне форума Ответить с цитированием
Старый 21.03.2013, 08:31   #9
programka311
 
Регистрация: 08.10.2012
Сообщений: 8
По умолчанию

Частный способ, небольшой трюк для данного случая:
Код:

Код:
static const char* digits = "0123456789ABCDEF";
cout << digits[x[i]];
А можно коментарий к трюку???
programka311 вне форума Ответить с цитированием
Старый 21.03.2013, 09:07   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Строка digits содержит цифры и буквы.
0 символ "0" соответствует 0, и так далее. 10 символ "A". То есть на k-ой позиции k-я цифра.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация программы danil123 Общие вопросы Delphi 8 20.01.2013 19:34
Оптимизация программы Семоха Валерий Помощь студентам 1 26.05.2012 14:04
Оптимизация программы 0479 Помощь студентам 7 09.03.2011 17:15
Оптимизация программы Lenya Помощь студентам 2 05.01.2011 18:56