| 
							nikedeforest
							
						 | 
						
							
								  | 
								
									
									 « Ответ #30 : 12-10-2005 13:45 »   | 
								
								 | 
							  
							 
							Калькулятор - это простейшая хрестоматийная задача, чуть сложнее "Hello, world".
  Это конечно понятно, не даром с него начинают новички.  Но выражения типа 2*5+3*(2+3+1-9)+cos(0.5) по науке надо разбивать на лексемы. Хотя я могу ошибаться, если так, то поправьте меня. Мои знания по этому предмету слабенькие, не любил я его и в подробности особенно не вдавался, но при желании могу поднять материал.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							ещё один вопрос ... 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Alf
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #31 : 12-10-2005 13:54 »   | 
								
								 | 
							  
							 
							Но выражения типа 2*5+3*(2+3+1-9)+cos(0.5) по науке надо разбивать на лексемы. Конечно, надо. А почему "но", разве это неразрешимая задача? Обработка строковых выражений - обычное явление в работе пограммиста, у меня редкая программа без нее обходится.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							nikedeforest
							
						 | 
						
							
								  | 
								
									
									 « Ответ #32 : 12-10-2005 14:01 »   | 
								
								 | 
							  
							 
							разве это неразрешимая задача?
  Не, я про это не говорил.  Обработка строковых выражений - обычное явление в работе пограммиста, у меня редкая программа без нее обходится.
  Мне, например, не нравится с этим сталкиваться, при любой возможности стараюсь этого избежать  и ввязываюсь, когда др. выхода нет. Не знаю, откуда то у меня не любовь к работе со строками, возможно когда-то где-то серьезно напоролся и до сих пор неприятный осадок  остался.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							ещё один вопрос ... 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Vadim Mc
							
						 | 
						
							
								  | 
								
									
									 « Ответ #33 : 12-10-2005 14:48 »   | 
								
								 | 
							  
							 
							Я в си новичек, попросили написать простейшую программу с использованием цикла while на нахождение количества букв в тексте проблема в том что нам дали мукулатуру, так вот в этой мукулатуре нет почти ничего из того что говорит преподаватель он дал "общие рекомендации" из которых я и написал то что выше   + есть несколько вопросов на которые он и сам не смог дать нормального ответа: почему, например, тип char, а не int (short, long)? (по идее int ведь и обрабатывается быстрее и может может содержать большее по значению число) Я так понял можно даже задать вещественный тип double? Что лучше использовать вместо scanf? (он вроде не допускает пробелов?) Что за функция puts? (ни в одной книжке не нашел (имеется также borland c++ Киммел. П.) ====================================== Я тоже новичек, намедни купил  Страуструпа, C++  (он автор С++) там нормально расписано - рекомендую  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							"Теория теорией, но сточки зрения инженера-практика никакая, даже самая элегантная методология, предлагаемая учеными, не стоит и ломаного гроша, если она не помогает в построении реальных, работающих систем." @ Гради Буч 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							LP
							
								Помогающий 
								
								 
								  Offline
								
								
								
								
								
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #34 : 12-10-2005 19:46 »   | 
								
								 | 
							  
							 
							А я бы не рекомендовал Страуструпа    Это явно не учебник для начинающих, хоть там все и написано от простого к сложному...  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							Если эта надпись уменьшается, значит ваш монитор уносят 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Vadim Mc
							
						 | 
						
							
								  | 
								
									
									 « Ответ #35 : 12-10-2005 19:59 »   | 
								
								 | 
							  
							 
							И такое есть, но в качестве справочника очень неплох - даже не удивился, что отец основатель С++ - датчанин из Европы 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							"Теория теорией, но сточки зрения инженера-практика никакая, даже самая элегантная методология, предлагаемая учеными, не стоит и ломаного гроша, если она не помогает в построении реальных, работающих систем." @ Гради Буч 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							CENTNER
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #36 : 13-10-2005 10:43 »   | 
								
								 | 
							  
							 
							Да, побеседовал вчера с преподавателем, так реализовать нормальный калькулятор не получится   , надо использовать другой, более сложный, алгоритм     2 NL - это книжечка этакая листов на 600 по цене рблей 300?  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Vadim Mc
							
						 | 
						
							
								  | 
								
									
									 « Ответ #37 : 13-10-2005 11:16 »   | 
								
								 | 
							  
							 
							Да, побеседовал вчера с преподавателем, так реализовать нормальный калькулятор не получится   , надо использовать другой, более сложный, алгоритм     2 NL - это книжечка этакая листов на 600 по цене рблей 300? ===================================================== Листов у книги 1100, цена в Питере  -~ 350 рублей. Язык С++ 4-е издание. Там кстати рассмотрен в главе 6 пример простроения калькулятора.... Временами очень просто читается, временами и трудновато, но мне книга понравилась именно концептуальностью  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							"Теория теорией, но сточки зрения инженера-практика никакая, даже самая элегантная методология, предлагаемая учеными, не стоит и ломаного гроша, если она не помогает в построении реальных, работающих систем." @ Гради Буч 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							CENTNER
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #38 : 18-10-2005 09:19 »   | 
								
								 | 
							  
							 
							Вот доработал старый вариант: #include <stdio.h> main() { double x; char znak; double y; double d; char e; puts ("Љ «мЄг«пв®а v 0.002 by Centner"); new: scanf("%lf %c %lf",&x,&znak,&y); if (znak =='+') { d = x + y; } else if (znak =='-') { d = x - y; } else if (znak =='*') { d = x * y; } else if (znak =='*') { d = x / y; } else { puts ("ЌҐЇа ўҐ«м® ўўҐ¤Ґл© бЁ¬ў®«"); goto new; } printf ("®вўҐв %.2lf\n",d); printf ("•®вЁвҐ ҐйҐ? Ќ ¦¬ЁвҐ Є« ўЁиг y"); scanf("%s",&e); if (e == 'y') { goto new; } else { printf ("‘Ї бЁЎ® §  Ї®«м§®ў ЁҐ  иЁ¬ б®д⮬. ‚ᥠЇа ў  § йЁйҐл."); scanf("%lf",&x); } } Проблема в седующем - прога некорректно работает Если ввести несколько символов (любых) - должен сообщать об ошибке, и возвращаться в начало (goto), но получается бесконечный цикл   если ввести например 3+4y, пишет ответ и предлагает продолжить - потом снова ответ и продолжить, и так циклически   если ввести например 3+4ui, тода пишет ответ и асе осчтальные сообщения и завершает программу   А мнен нужно чтоб он просто по окончании предлагал начать снова, а при вводе некорректного запроса сообщал об ошибке и все  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 19-12-2007 19:56 от Алексей1153++ »
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Алексей++
							
								глобальный и пушистый 
								Глобальный модератор
								
								 
								  Offline
								
								Сообщений: 13
								
								
								
								
								
							  
						 | 
						
							
								  | 
								
									
									 « Ответ #39 : 18-10-2005 10:18 »   | 
								
								 | 
							  
							 
							ну так правильно    else { puts ("ЌҐЇа ўҐ«м® ўўҐ¤Ґл© бЁ¬ў®«"); goto new; } а вообще , надо цикл  for{;;} { } использовать - удобнее. тогда: ... else { puts ("ЌҐЇа ўҐ«м® ўўҐ¤Ґл© бЁ¬ў®«"); break; }  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Алексей++
							
								глобальный и пушистый 
								Глобальный модератор
								
								 
								  Offline
								
								Сообщений: 13
								
								
								
								
								
							  
						 | 
						
							
								  | 
								
									
									 « Ответ #40 : 18-10-2005 10:28 »   | 
								
								 | 
							  
							 
							я бы написал так: #include <stdio.h> main() { 	double x; 	char znak; 	double y; 	double d; 	char e; 	puts ("Љ «мЄг«пв®а v 0.002 by Centner");
  	for(;;) 	{
  		scanf("%lf %c %lf",&x,&znak,&y);
  		switch(znak) 		{ 			case '+':d = x + y; break; 			case '-':d = x - y; break; 			case '*':d = x * y; break; 			case '/':d = x / y; break; 			default:puts ("ЌҐЇа ўҐ«м® ўўҐ¤Ґл© бЁ¬ў®«"); 		}
  		printf ("®вўҐв %.2lf\n",d); 		printf ("•®вЁвҐ ҐйҐ? Ќ ¦¬ЁвҐ Є« ўЁиг y"); 		scanf("%s",&e);
  		if (e != 'y') 		{ 			printf ("‘Ї бЁЎ® §  Ї®«м§®ў ЁҐ  иЁ¬ б®д⮬. ‚ᥠЇа ў  § йЁйҐл."); 			scanf("%lf",&x); 			break; 		} 	}//for(;;) }
 
  русские символы не вижу, поэтому оставил их как есть (к модерам - сделайте пожалуйста примочку - выделил текст, поменял кодировку)  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 19-12-2007 19:58 от Алексей1153++ »
								 | 
								
									 
									Записан
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							nikedeforest
							
						 | 
						
							
								  | 
								
									
									 « Ответ #41 : 18-10-2005 12:45 »   | 
								
								 | 
							  
							 
							scanf("%s",&e);
  Может в это дело. попробуй так scanf("%c",&e); p.s. вообще-то крякозябли неплохо было бы заменить на нормальный текст - это внесло бы чуть больше ясности, к тому же CENTNER это в твоих интересах  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 18-10-2005 12:47 от nikedeforest »
								 | 
								
									 
									Записан
								 | 
							  
							 
							ещё один вопрос ... 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							nikedeforest
							
						 | 
						
							
								  | 
								
									
									 « Ответ #42 : 18-10-2005 13:17 »   | 
								
								 | 
							  
							 
							 Метку называть new нельзя, это же оператор распределения динамическорй памяти. Обзови по другому. здесь вроде все работает. #include <stdio.h> #include <conio.h> main() { 		       double x,y,d; 		       char znak,e; clrscr(); puts (" Made in China by Centner :)"); label_new: 	       scanf("%lf %c %lf",&x,&znak,&y); switch(znak){ case '+': d = x + y; break; case'-': d = x - y; break; case '*': d = x * y; break; case '/': d = x / y; break; default: puts ("Wrong operation"); goto label_new; }
  printf ("otvet= %.2lf\n",d); printf ("for repeating input Y"); 		  scanf("%s",&e);
  		      if (e == 'y') 		      { 		       goto label_new; 		       //	printf ("repeat\n")  ; 		       } 		       else 		       { 		       printf ("input X"); 		       scanf("%lf",&x); 		       } return 0; }
 
 
   
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 19-12-2007 20:01 от Алексей1153++ »
								 | 
								
									 
									Записан
								 | 
							  
							 
							ещё один вопрос ... 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Алексей++
							
								глобальный и пушистый 
								Глобальный модератор
								
								 
								  Offline
								
								Сообщений: 13
								
								
								
								
								
							  
						 | 
						
							
								  | 
								
									
									 « Ответ #43 : 19-10-2005 04:18 »   | 
								
								 | 
							  
							 
							насчёт глюков - может быть, я не компилировал чоб проверить   а про метку вообще забудьте! Вы чего? 21 век на дворе    
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							nikedeforest
							
						 | 
						
							
								  | 
								
									
									 « Ответ #44 : 19-10-2005 09:36 »   | 
								
								 | 
							  
							 
							а про метку вообще забудьте! Вы чего? 21 век на дворе  Я знаю, но если человеку хочется, что я могу поделать.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							ещё один вопрос ... 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							CENTNER
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #45 : 19-10-2005 12:23 »   | 
								
								 | 
							  
							 
							за кальк спасибо а насчет goto - это святое, я его еще в basic-е использовал 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							nikedeforest
							
						 | 
						
							
								  | 
								
									
									 « Ответ #46 : 19-10-2005 12:29 »   | 
								
								 | 
							  
							 
							а насчет goto - это святое, я его еще в basic-е использовал
  В С/С++ goto считается дурным стилем программирования.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							ещё один вопрос ... 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							Vadim Mc
							
						 | 
						
							
								  | 
								
									
									 « Ответ #47 : 19-10-2005 12:57 »   | 
								
								 | 
							  
							 
							С другой стороны Страуструп в своей книге  приводит примеры когда оправдано именно использование go to в целях оптимизации 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							"Теория теорией, но сточки зрения инженера-практика никакая, даже самая элегантная методология, предлагаемая учеными, не стоит и ломаного гроша, если она не помогает в построении реальных, работающих систем." @ Гради Буч 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Алексей++
							
								глобальный и пушистый 
								Глобальный модератор
								
								 
								  Offline
								
								Сообщений: 13
								
								
								
								
								
							  
						 | 
						
							
								  | 
								
									
									 « Ответ #48 : 20-10-2005 04:22 »   | 
								
								 | 
							  
							 
							CENTNER , раз ты перешёл на СИ, забудь про метки - намаешься 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Алексей++
							
								глобальный и пушистый 
								Глобальный модератор
								
								 
								  Offline
								
								Сообщений: 13
								
								
								
								
								
							  
						 | 
						
							
								  | 
								
									
									 « Ответ #49 : 20-10-2005 04:24 »   | 
								
								 | 
							  
							 
							NL , ну и какая тут оптимизация произошла? вообще, если никак не удаётся без гоуто, а время выполнения не критично, то данный участок процедуры заменяем на вызод подпрограммы    а там всё решится. Либо переписываем алгоритм по человечески  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							CENTNER
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #50 : 23-10-2005 17:14 »   | 
								
								 | 
							  
							 
							 Вот новая прога :vzhik: Должна находить наибольший элемент в массиве: #include <stdio.h> main() { char a[10]; //задаем массив int i; double d; gets (a); //вводим значение массива a[i]=d; //1 элем массива присваиваем знач d while (a[i]!='\0') { //"пока" остались элементы в массиве if (a[i+1] > d) { //Если элем массива больше d a[i]=d; //присваиваем новое знач i++; } else { //если равен или меньше i++; //след элемент } } printf ("Naibolshiy element\n",d); gets (a); } Компилится, но после ввода строки ХРюша выбрасывает ошибку :-(
 
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 19-12-2007 20:02 от Алексей1153++ »
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							nikedeforest
							
						 | 
						
							
								  | 
								
									
									 « Ответ #51 : 23-10-2005 18:32 »   | 
								
								 | 
							  
							 
							Указываю на ошибки. Во первых: int i; double d; a[i]=d; //1 элем массива присваиваем знач d
  А счего ты решил, что i сожержит в себе 1? Для того, чтобы в переменнной было значение, надо в переменную это значение присвоить. Во-вторых, ты отличаешь символьный тип от вещественного? Я так понимаю, ты хочешь, чтобы в массиве a сожержались вещественные числа, так почему же массив а типа char, а не double, а сдругой стороны, будь он типом double, ты бы не смог так его заполнить. Определись, что ты хочешь от этого массива. В третьих, алгоритм поиска какой-то неправильный, вот так будет верней: #include <stdio.h> #include <iostream.h> #include <conio.h>
  int main() { clrscr();
  double a[10], d; int i, schet=0;           cout<<"Заполните пожалуйста массив числами вещественного типа\n";                                         for(i=0;i<10;i++)                   {                     cout<<"заполните элемент "<<i+1<<" ";                     cin>>a[i];                    } d=a[0];
  for(i=0;i<10;i++) {   if(d<a[i])   {d=a[i]; schet=i;} }
           cout<<"наибольший элемент находится на "<<schet+1<<"позиции и равен "<<d;
  return 0; }
   
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							ещё один вопрос ... 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							CENTNER
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #52 : 24-10-2005 17:47 »   | 
								
								 | 
							  
							 
							 Спасибо за ошибки  a[i]=d; //1 элем массива присваиваем знач d - тут 1 имеется ввиду "первому" с типами данных да, пока проблемы Хотя, не понимаю чем мой алгоритм плох, вроде должен работать, другое дело, что реализовал я его скорее всего неправильно :-( За прогу спасибо, вот только интересуют 2 строчки:                     cout<<"заполните элемент "<<i+1<<" ";                     cin>>a[i];  это наподобие ввод и вывод? и зачем эти библиотеки - #include <iostream.h> #include <conio.h>?
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 22-04-2006 14:30 от Алексей1153 »
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							nikedeforest
							
						 | 
						
							
								  | 
								
									
									 « Ответ #53 : 24-10-2005 18:59 »   | 
								
								 | 
							  
							 
							      cout<<"заполните элемент "<<i+1<<" ";                     cin>>a;  это наподобие ввод и вывод?
  Это тоже самое, что  printf("заполните элемент %d, i+1); scanf("%lf",&a[i]); библиотку conio.h я подключаю для того, чтобы использовать функцию clrscr(), которая производит очистку консоли, а iostream.h для того, чтобы использовать функции cout и cin. Хотя, не понимаю чем мой алгоритм плох, вроде должен работать, другое дело, что реализовал я его скорее всего неправильно 
  Надо полагать этим он и плох   .  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 22-04-2006 14:30 от Алексей1153 »
								 | 
								
									 
									Записан
								 | 
							  
							 
							ещё один вопрос ... 
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						| 
							CENTNER
							 
								Гость 
							 
						 | 
						
							
								  | 
								
									
									 « Ответ #54 : 25-10-2005 11:58 »   | 
								
								 | 
							  
							 
							Что-то при компиляции ругается на stdcomp.h, пришет надо использовать c++ для его использования У меня в библиотеках он есть, а компилятор я качал с borland.com, в чем грабли? 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Последнее редактирование: 25-10-2005 12:00 от CENTNER »
								 | 
								
									 
									Записан
								 | 
							  
						 | 
					 
				 
			 |  
		 
	 | 
	
		
		
			
				
					
						
							Алексей++
							
								глобальный и пушистый 
								Глобальный модератор
								
								 
								  Offline
								
								Сообщений: 13
								
								
								
								
								
							  
						 | 
						
							
								  | 
								
									
									 « Ответ #55 : 22-04-2006 14:31 »   | 
								
								 | 
							  
							 
							(комент)
  ЧАВО 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									Записан
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 | 
	 |