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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2009, 20:06   #1
mamant1
 
Регистрация: 06.10.2009
Сообщений: 5
По умолчанию Разобраться с кодом - поиск палиндрома

Помогите,пожалуйста, разобраться как работает программа - генерация палиндромов методом симметричных сумм:

Код:
#include<iostream>
#include<string.h>
using namespace std;
class chislo
{ 
public: char *number;

chislo(char *base) 
{ 
	number = new char [strlen(base)+1];
	strcpy(number,base); 
}

chislo(int size) 
{ 
	number = new char [size]; }

void invers(chislo base); 

void zero(char*,int); //udalyaet perednie nuli, naprimer 00023405->23405

chislo operator+ (chislo) const; 

int polindrom(); //proverka yavlyetsa li 4islo polindromom

~chislo() { }; 
};
До этого момента все понятно
Код:
void chislo::invers(chislo base)
{ 
  int i;
  int size=strlen(base.number);
  for(i=0; i<size;i++)
В этом месте непонятно, что происходит:
Код:
  *(number+i)=*(base.number+size-1-i);
  *(number+size)='\0';
Код:
};


void chislo::zero(char* arg,int zero)
{ 
  int i,size;
  size=strlen(arg)-zero;
  for(i=0;i<size;i++)
  *(number+i)=*(arg+zero+i);
  *(number+size)='\0';
}


chislo chislo::operator+ (chislo inv_base) const
{ 
  int perenos=0,sum_raz,i;
  int size=strlen(number)+1;
  chislo temp(size+1);
  for(i=0;i<size-1;i++)
{ 
  sum_raz=(*(number+size-2-i)-'0')+(*(inv_base.number+size-2-i)-'0');
  *(temp.number+size-1-i)=(sum_raz%10+perenos)%10+'0';
  if(sum_raz+perenos>=10) perenos=1; else perenos=0;
}
if(perenos) *temp.number='1'; else *temp.number='0';
*(temp.number+size)='\0';
return temp;
}


int chislo::polindrom()
{ 
  int i,polindrom; 
  int right=0,wrong=0;
  for(i=0;i<=strlen(number)/2;i++)
    if(*(number+i)==*(number+strlen(number)-1-i)) right++; else wrong++;
	if(polindrom=((right>0) && (wrong==0)))
	return 1;  else return 0;
}
			
int main(int argc,char *argv[])
{ 
int size,i,zero,rezim=0,count=0;
char error_msg[]="Wrong arguments\nFormat vvoda: SYMSUM chislo nomer_rezima\nNomer rezima yavlaetsa neobyazatelnim argumentom, mozet prinimat' znachenia:\n0 - rezim po umolchaniu, 1 - rezim diagnostiki.\nNaprimer: SYMSUM 378791 1 ili SYMSUM 51174";
/* vsevozmonie proverki vvodimih argumentov */
//////////////////////////////////////////
if(!(argc==2 || argc==3)) //proverka na kol-vo argumentov
{ cerr<<error_msg; exit(0); }
if(argc==3)                                          // rezim
if((*argv[2])=='1' && strlen(argv[2])==1) rezim=1;  //proverka na tip argumentov
else if((*argv[2])!='0' || strlen(argv[2])!= 1) { cerr<<error_msg; exit(0);}   
for(i=0;i<strlen(argv[1]);i++)
if(isdigit(argv[1][i])) ; else { cerr<<error_msg; exit(0);}
if(strlen(argv[1])==1) { cout<<argv[1]<<" is allready polyndrom\nKol-vo iteracii="<<count; return 0;} //если одна цифра -> уже полиндром
chislo base(argv[1]);
////////////////////////////////////////////
if(argv[1][0]!='0') //проверка на передние нули 
zero=0;
else 
for(i=1,zero=1;argv[1][i]=='0';i++)
zero++;
chislo base_zero(strlen(argv[1])+1-zero);
base_zero.zero(argv[1],zero);
size=strlen(base.number)+1;
if(zero)
base=base_zero;
if(strlen(base.number)==1 || base.polindrom()) { cout<<base.number<<" is allready polindrom.\nKol-vo iteracii="<<count; exit(0);}
chislo inv_base(size);
inv_base.invers(base);
chislo sum(strlen(base.number)+2);
sum=base+inv_base;
if(*sum.number=='0') sum.zero(sum.number,1);
count=1;
if(sum.polindrom() && rezim==1) 
{ 
  cerr<<"Rezim diagnostiki:\nStep "<<count<<"\nBase of polindrom="<<base.number<<"  Symmetric base="<<inv_base.number<<endl;
  cerr<<base.number<<"+"<<inv_base.number<<"="<<sum.number<<" -  polindrom\nKol-vo iteracii="<<count<<endl;
  exit(0);
}
if(!sum.polindrom() && rezim==1)
cerr<<"Rezim diagnostiki:\n";
while(!sum.polindrom())
{ 
  if(rezim==1) 
{ 
  cerr<<"Step "<<count<<"\nBase of polindrom="<<base.number<<"  Symmetric base="<<inv_base.number<<endl;
  cerr<<base.number<<"+"<<inv_base.number<<"="<<sum.number<<" - ne polindrom\nKol-vo iteracii="<<count<<endl;
}
base=sum; 
inv_base.invers(base); 
sum=base+inv_base;
if(*sum.number=='0') sum.zero(sum.number,1); 
count++;
if(count>=1000) { cerr<<"Polindrom ne naiden"<<endl; exit(1);}//-------- c этой строчкой ошибка в винде
}
if(rezim==1)
{
cerr<<"Step "<<count<<"\nBase of polindrom="<<base.number<<"  Symmetric base="<<inv_base.number<<endl;
cerr<<base.number<<"+"<<inv_base.number<<"="<<sum.number<<" -  polindrom\n________________________________________________________________\n\nItogovii polindrom="<<sum.number<<"\nKol-vo iteracii="<<count<<endl;
exit(0);
}

cout<<"Itogovii polindrom="<<sum.number<<"\nKol-vo iteracii="<<count<<endl;

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


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите разобраться с кодом! sid Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 13.04.2010 17:53
Помогите разобраться с кодом Superlotles Общие вопросы Delphi 6 19.08.2009 22:24
помогите разобраться с кодом samosval Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 27.12.2007 00:20
Помогите разобраться с кодом С++ Noor Помощь студентам 20 10.10.2007 17:42