| 
							Staxxx
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 «  : 25-12-2008 21:09 »   | 
								
								 | 
							  
							 
							очень лёгкая!) но мне ни как не додуматься что надо дописать.. задание: написать программу для обработки строки. Вводиться строка состоящая из букв и цифр. а выводиться обработанная по условию:  символов меньше 10 (сделал); удаляются все маленькие буквы и знаки пунктуации (и это я сделал);  цифры окружить пробелами (в этом и собстна небольшая загвостка); пример: ввести строку -> FdFG145F6               вывести строку -> FFG 1 4 5 F 6 я написал цикл, окружающий цифры в строке (которые я нахожу isdigit'oм), но загвостка в том, что надо ставить пробел и перед цифрой.. с эти и прошу помочь!  код:  #include <string>   #include <iostream> using namespace std ; int main ( )   {     char tmp [80] ;     do       {         cout << "Vvedite stroku tmp" << endl ;         cin.getline (tmp,80) ;         if (!strcmp (tmp,""))               break ;         char *px ;         px = new char [strlen (tmp) +1] ;         strcpy (px, tmp) ;         cout << "Blok raven ->" ;         char *py, *pz ;         py = px ;         pz = py ;             if (strlen (px)< 10)             {                     while (*py)             {                     if (ispunct(*py) || islower(*py))                     {                     for ( pz=py ; *pz ;pz++)                     *pz = *(pz + 1);                     }                     else                     py++ ;             }                 py=px;               while (*py)             {                 if (ispunct (*py))                 {                     for (pz=py+strlen(py) ;pz!=py ; pz--)                         *(pz+1)=*pz;                     *(py+1)=*py;                     py=py+2;                 }                 py=py+1;             }             py=px;               while (*py)             {                 if (isdigit (*py))                 {                                         for (pz=py+strlen(py);pz!=py ; pz--)                         *(pz+2)=*pz;                     *(py+1)=' ';                     *(py+2)=' ';                 py=py+2;                 }                 py=py+1;             }                          }             else cout << "Men'she 10 simvolov"<< endl;             cout << px << endl ;             delete px ;     }           while (1);//     int n(0);     return 0 ;      }   прошу помощи!  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 25-12-2008 21:12 от Вад »
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Вад
							
						 | 
						
							
								  | 
								
									
									 « Ответ #1 : 25-12-2008 21:15 »   | 
								
								 | 
							  
							 
							Очевидно, нужно ставить пробел перед каждым числом, а также перед каждым не-числом, перед которым находится число    
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Staxxx
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #2 : 25-12-2008 21:21 »   | 
								
								 | 
							  
							 
							да, это всё хорошо) но я не понимаю как написать на языке C++)  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Staxxx
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #3 : 25-12-2008 21:22 »   | 
								
								 | 
							  
							 
							мне препод сказал что типа перед числом нужно просто напросто сдвигать строку вправо на пробел 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Алексей++
							
								глобальный и пушистый 
								Глобальный модератор
								
								 
								  Offline
								
								Сообщений: 13
								
								
								
								
								
							  
						 | 
						
							
								  | 
								
									
									 « Ответ #4 : 25-12-2008 21:35 »   | 
								
								 | 
							  
							 
							в MFC (правда, долгоработающий алгоритм    Но если действие одноразовое - покатит): CString txt= ".... входная строка";
  char LitLetter[2]="a";
  //удаляем мелкие буквы латинского алфавита for(LitLetter[0]='a'; LitLetter[0]<='z'; LitLetter[0]++) {    txt.Replace(LitLetter,""); }
  //ставим пробелы перед цифрами char SpNum[3]=" 0";
  //сначала чистим: все комбинации " #" (пробел и цифра) заменяем на "#" (цифра) for(SpNum[1]='0'; SpNum[1]<='9';SpNum[1]++) {   while(txt.Replace(SpNum,&SpNum[1])); }
  //теперь перед каждой цифрой вставляем пробел for(SpNum[1]='0'; SpNum[1]<='9';SpNum[1]++) {   txt.Replace(&SpNum[1],SpNum); }
  (компилировал, но не тестировал) думаю, легко переделать для других классов строк )  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 25-12-2008 22:26 от Алексей1153++ »
								 | 
								
									 
									Записан
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Staxxx
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									«  Ответ #5 : 25-12-2008 22:22 »    | 
								
								 | 
							  
							 
							спасибо! 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Алексей++
							
								глобальный и пушистый 
								Глобальный модератор
								
								 
								  Offline
								
								Сообщений: 13
								
								
								
								
								
							  
						 | 
						
							
								  | 
								
									
									 « Ответ #6 : 25-12-2008 22:30 »   | 
								
								 | 
							  
							 
							кстати, два последних цикла можно объединить: for(SpNum[1]='0'; SpNum[1]<='9';SpNum[1]++) {   //сначала чистим: все комбинации " #" (пробел и цифра) заменяем на "#" (цифра)   while(txt.Replace(SpNum,&SpNum[1]));
    //теперь перед каждой цифрой вставляем пробел   txt.Replace(&SpNum[1],SpNum); }
   
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Staxxx
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #7 : 26-12-2008 17:31 »   | 
								
								 | 
							  
							 
							о ужас) короче прога у меня работает на ура, только компилятор ругается.. что я залезаю в невыделенное место в памяти, мне предложили, чтобы я делал так: вот строка - DDD123 , "протягиваем" цифру и получается - DDD11123 , заменяем две единици на два пробела, надо написать что то типа *(py+1)=*py                                ||  ||                                                                                                                или py-1=py                                ' '  ' ' и создать цикл, который будет брать каждуу цифру по очереди и таким образом окружать её пробелами, понимаю что это ужасно но прошу помочь))
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Staxxx
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #8 : 26-12-2008 18:54 »   | 
								
								 | 
							  
							 
							хм) лана, додумаюсь напишу 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Dimka
							
								Деятель 
								Команда клуба
								
								 
								  Offline
								Пол:   
								
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #9 : 26-12-2008 19:35 »   | 
								
								 | 
							  
							 
							Неужели транслятор с автоматом не написать? Или надо непременно в той же самой строчке пробелы вставлять?
  Даже не автоматом, а простейшей функцией: на входе символ строки-источника, на выходе строка: либо пустая, если символ нужно исключить, либо с символом, если его надо оставить, либо с символом и пробелами кругом.
  Идти по символам строки-источника, результаты функции складывать как строки в приёмник. 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел) 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Staxxx
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #10 : 26-12-2008 20:05 »   | 
								
								 | 
							  
							 
							смысл такой, вводиться строка, находяться цифри, окружаются пробелами. тока для этих пробелов место в памяти не выделяется) спп меня в могилу сведёт) 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Dimka
							
								Деятель 
								Команда клуба
								
								 
								  Offline
								Пол:   
								
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #11 : 26-12-2008 20:18 »   | 
								
								 | 
							  
							 
							тока для этих пробелов место в памяти не выделяется) спп меня в могилу сведёт) Да, в C не было и нет автоматического управления памятью. Однако в C++ строчка как тип данных string стандартной библиотеки является динамической, сама управляет памятью и поддерживает в том числе операции сложения. Поэтому в C++ я не вижу таких уж больших трудностей.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел) 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Staxxx
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #12 : 26-12-2008 20:21 »   | 
								
								 | 
							  
							 
							да я бы тут не писал, если бы понимал что написать в коде, чтобы это место выделилось) эта лаба как заноза в ноге если чесно) она была третьей, а я уже 8 сдал, которые намного жещще) 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Алексей++
							
								глобальный и пушистый 
								Глобальный модератор
								
								 
								  Offline
								
								Сообщений: 13
								
								
								
								
								
							  
						 | 
						
							
								  | 
								
									
									 « Ответ #13 : 27-12-2008 03:56 »   | 
								
								 | 
							  
							 
							Staxxx, сделай процедуру, которую вызовешь 2 раза: int mycorrecting(const char* inputstr,char* outputstr=0, int lenofoutput=0); процедура принимает указатель на входную строку, возвращает количество символов, нужное для выходной строки. Если указать outputstr==0 , то работа с выходной строкой не производится, а только подсчитываются выходные символы в итоге: const char* pIn="входная строка"; int len=0; len=mycorrecting(pIn); if(len) {    char* pOut=new char[len]
     if(len==mycorrecting(pIn,pOut,len))    {      //pOut - искомая выходная строка    }
 
     delete [] pOut;    pOut=0; }
   
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 27-12-2008 03:59 от Алексей1153++ »
								 | 
								
									 
									Записан
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Dimka
							
								Деятель 
								Команда клуба
								
								 
								  Offline
								Пол:   
								
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #14 : 27-12-2008 10:32 »   | 
								
								 | 
							  
							 
							Алексей1153++, какой кошмарный стиль WinAPI 80-х годов    А потом говорят, что винда тормозит    
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел) 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Алексей++
							
								глобальный и пушистый 
								Глобальный модератор
								
								 
								  Offline
								
								Сообщений: 13
								
								
								
								
								
							  
						 | 
						
							
								  | 
								
									
									 « Ответ #15 : 27-12-2008 12:35 »   | 
								
								 | 
							  
							 
							dimka, покажи, где что тормозит ? ) Ну, кроме того, что 2 раза расчёт. Но это я из лени )  (правда, долгоработающий алгоритм  Но если действие одноразовое - покатит)
   
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Антон (LogRus)
							
						 | 
						
							
								  | 
								
									
									 « Ответ #16 : 29-12-2008 06:14 »   | 
								
								 | 
							  
							 
							я бы сделал на так: void Test() { 	std::string istr; 	std::cout << "Enter string: " << std::endl; 	std::cin >> istr; 	const int max_str_len = 9;
  	if (istr.size() > max_str_len) 	{ 		std::cout << "Too long" << std::endl; 		return; 	}
  	std::string ostr; 	bool lastCharIsDigit = false;
  	typedef std::string::iterator iterator; // можно земенить на номер элемента 	for (iterator it = istr.begin(); it != istr.end(); ++it) 	{ 		if(ispunct(*it) || islower(*it)) 			continue;
  		if (isdigit(*it)) 		{ 			lastCharIsDigit = true; 			ostr.push_back(' '); 		} 		else 		{ 			if (lastCharIsDigit) 				ostr.push_back(' ');
  			lastCharIsDigit = false; 		}
  		ostr.push_back(*it); 	}
  	std::cout << "Result: " << ostr << std::endl; }
  и заметьте один проход.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 29-12-2008 06:15 от LogRus »
								 | 
								
									 
									Записан
								 | 
							  
							 
							Странно всё это.... 
						 | 
					 
				 
			 |  
		 
	 | 
	 |