| 
			| 
					
						| pokk 
								Помогающий    Offline | 
								|  | «  : 14-11-2008 19:05 »  |  | 
 
 #include "stdafx.h"
 
 int _tmain(int argc, _TCHAR* argv[])
 {
 
 int a[6],max,u;
 a[0]=0;
 a[1]=1;
 a[2]=2;
 a[3]=3;
 a[4]=40;
 a[5]=7;
 
 for (max=u=0; u<6; u++){
 if (a[u]>a[max])
 {   max=u;
 }
 }
 printf("%d",max);
 return 0;
 }
 
Вот код программы которая ищет максимальный элемент массива  с помощью метода тыканья проверил всё работает  вот тока не как не могу понять  каким образом это всё происходил ,а именно  for (max=u=0; u<6; u++){  if (a[u]>a[max])    так как max=u то получается  a[0]>a[0]    так что ли ?? и что это получается ?? |  
						| 
								|  |  
								| « Последнее редактирование: 14-11-2008 19:12 от Алексей1153++ » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #1 : 14-11-2008 19:20 »  |  | 
 
 для понимания, сначала напишем всё красиво: int _tmain(int argc, _TCHAR* argv[]){
 
 int a[6];
 int max=0;
 int u=0;
 a[0]=0;
 a[1]=1;
 a[2]=2;
 a[3]=3;
 a[4]=40;
 a[5]=7;
 
 for (max=0, u=0; u<6; u++)
 {
 if (a[u]>a[max])
 {
 max=u;
 }
 }
 
 printf("%d",max);
 return 0;
 }
 
видим, что запоминается индекс наибольшего элемента - переменная max. Вначале индекс нулевой, но это неважно, так как сканируется весь массив - всё равно найдём максимальный элемент. сканируется при помощи индекса u . Если текущий элемент (a[u]) больше уже найденного ранее самого большого элемента (a[max])) , то вместо max запоминаем u (max=u). Таким образом, в max окажется индекс максимального элемента (а если одинаковые элементы есть, то самого первого максимального) |  
						| 
								|  |  
								| « Последнее редактирование: 14-11-2008 19:21 от Алексей1153++ » |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| Вад | 
								|  | « Ответ #2 : 14-11-2008 19:20 »  |  | 
 
 Ну, изначально будет a[0], и присваивания быть в данном случае не должно. Попробуй протрассировать этот код - условие в if всегда должно давать false для такого тестового массива. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| pokk 
								Помогающий    Offline | 
								|  | « Ответ #3 : 15-11-2008 10:40 »  |  | 
 
 Вроде немного понятно.  Я вот немного преобразовал в другой код а почему не работает не понятно     #include "stdafx.h"
 int _tmain(int argc, _TCHAR* argv[])
 {
 
 int a[6];
 int max=0;
 int u=0;
 
 a[1]=1;
 a[2]=20;
 a[3]=3;
 a[4]=4;
 a[5]=7;
 
 for (u=0; u<6; u++)
 {
 if (a[u]>a[u+1])
 {
 max=u;
 }
 }
 
 printf("%d",max);
 return 0;
 }
 
 
получается мы сравниваем   первый элимент  с 2   потом  2 элимент  с 3 ....  и записываем  в max     но что-то не получается  в чём причина ??               |  
						| 
								|  |  
								| « Последнее редактирование: 15-11-2008 11:44 от Алексей1153++ » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Sands 
								Помогающий    Offline | 
								|  | « Ответ #4 : 15-11-2008 11:05 »  |  | 
 
 pokk,  У тебя массив из 6 элементов, тоесть последний индекс должен быть 5. А когда выполняется цикл, то при i == 5(которое удовлетворяет условиям цикла) внутри ты будеш доступаться к u[5+1], что некорректно. Перепиши цикл в виде  for (u=0; u<5; u++){
 if (a[ u ]>a[u+1])
 {
 max=u;
 }
 }
 
и все должно сработать. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #6 : 15-11-2008 11:49 »  |  | 
 
 а ещё остался неинициализирован 0-й элемент  a[1]=1;a[2]=20;
 a[3]=3;
 a[4]=4;
 a[5]=7;
 
перед началом работы всегда нужно инициализировать массив: статический : enum{
 e_len=100,
 };
 
 int a[e_len];
 memset(a,0,sizeof(a));
 
 //или так
 memset(a, 0, sizeof(*a)*e_len);
 
динамический DWORD dwdLen=100;int* a=new[dwdLen];
 
 memset(a, 0, sizeof(*a)*dwdLen);
 
 ...
 
 //освобождаем память после работы
 if(a)
 {
 delete [] a;
 a=0;
 }
 
 |  
						| 
								|  |  
								| « Последнее редактирование: 15-11-2008 11:51 от Алексей1153++ » |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| pokk 
								Помогающий    Offline | 
								|  | « Ответ #7 : 16-11-2008 13:47 »  |  | 
 
 for (max=0;u=0; u<5; u++){if (a[u]>a[u+1])
 {   max=u;
 }
 Этот  код в  который я преобразовал он не коректный  тока щас заметил  :)  (если получится ряд чисел 9,8,7,... то он не найдёт масимальное число  )
 
 надо разбиратся с этим кодом
 
 for (max=0 ; u=0; u<5; u++){
 if (a[u]>a[max])
 {   max=u;
 }
 
 Я вот не как не могу понять. Получается что  при u=1 тогда  max=1  и мы находим a[1]>a[1]    и так получается при любом u   что заставляет  его смешатся ?   |  
						| 
								|  |  
								| « Последнее редактирование: 16-11-2008 13:57 от Алексей1153++ » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #8 : 16-11-2008 13:56 »  |  | 
 
 pokk, поьзуйся тегом [code]...[/code] ! |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #9 : 16-11-2008 14:02 »  |  | 
 
 pokk, запусти под отладчикам, погляди всё по шагам |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| pokk 
								Помогающий    Offline | 
								|  | « Ответ #10 : 16-11-2008 14:05 »  |  | 
 
 for (max=0 ; u=0; u<5; u++){if (a[u]>a[max])
 {   max=u;
 }
 
 
это всё работает а почему хз  |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #11 : 16-11-2008 14:07 »  |  | 
 
 это всё работает а почему хз 
 так я же написал , как оно работает ) См верхний пост |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| pokk 
								Помогающий    Offline | 
								|  | « Ответ #12 : 16-11-2008 14:16 »  |  | 
 
 
 
 видим, что запоминается индекс наибольшего элемента - переменная max. Вначале индекс нулевой, но это неважно, так как сканируется весь массив - всё равно найдём максимальный элемент.
 
 сканируется при помощи индекса u . Если текущий элемент (a[u]) больше уже найденного ранее самого большого элемента (a[max])) , то вместо max запоминаем u (max=u). Таким образом, в max окажется индекс максимального элемента (а если одинаковые элементы есть, то самого первого максимального)
 
 
 
 оооо    десятый раз задумался и понял  получается что он в начале  сравнивает с 0 и записывает его в max если оно больше 0  потом  со  следущим   элимен  это записаное число  и так далее  так ??     и запись   for (max=u=0; u<5; u++){if (a[u]>a[max])
 {   max=u;
 }
 
max=u=0  неверно  =)) |  
						| 
								|  |  
								| « Последнее редактирование: 16-11-2008 14:25 от pokk » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #13 : 16-11-2008 14:27 »  |  | 
 
 ты о чём ? )  Ты отладчик уже запускал ? |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| Dr.Yevhenius | 
								|  | « Ответ #14 : 16-11-2008 14:28 »  |  | 
 
 enum{
 e_len=100,
 };
 
 А не проще написать для статического: const int e_len = 100; ? Теперь код поиска максимального елемента: include "stdafx"
 int main(...)
 {
 int a[6] = {15, 20, 12, 11, 21, -9};
 int max, u;
 
 for(max = 0, u = 0; u < 5; ++u)
 {
 if (a[u] > a[max]
 max = u;
 }
 //и результатом программы будет max = 4!!!
 
 return 0;
 }
 
А теперь обьясняю: когда u = 0, то if дасть false, потому что у нас строго сказано >, а  ; дальше: когда u = 1 (но max у на пока равен max = 0), и тогда a[u ] = a[1] = 20, a[max] = a[0 ] = 15 (в данном случае) if даст true и сделает max = u (тоесть max = 1); анализируя каждый шаг цикла могу сказать, что if вернёт true до конца цикла ещё только один раз при u = 4 (a[u ] = a[4] = 21). Вот так.
 Совет: когда у вас программа не работает, а компилятор ошибки не выдаёт, то используйте пошаговый режим. P. S.: люди, ну что же это такое: for (max=0;u=0; u<5; u++){if (a[u]>a[u+1])
 {   max=u;
 }
, это же ненужное усложнение... |  
						| 
								|  |  
								| « Последнее редактирование: 16-11-2008 14:39 от Inkognito » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Dr.Yevhenius | 
								|  | « Ответ #15 : 16-11-2008 14:31 »  |  | 
 
 (Предыдущее сообщение я исправил)   |  
						| 
								|  |  
								| « Последнее редактирование: 16-11-2008 14:40 от Inkognito » |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #16 : 16-11-2008 14:40 »  |  | 
 
 Inkognito,  А не проще написать для статического:const int e_len = 100;
 
 нет, не проще ))) |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| Dr.Yevhenius | 
								|  | « Ответ #17 : 16-11-2008 14:45 »  |  | 
 
 нет, не проще )))
 Во-первых дольше, а во-вторых надо знать ещё что такое в С++ enum, а const - он во всех языках программирования const. |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #18 : 16-11-2008 14:49 »  |  | 
 
 Inkognito, ДОЛЬШЕ ? Чем ? Это же на этапе компиляции обрабатывается всё. И наплевать мне на другие языки, тут речь про с++ )) надо знать ещё что 
 знаю ) |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| pokk 
								Помогающий    Offline | 
								|  | « Ответ #19 : 16-11-2008 14:52 »  |  | 
 
 enum{
 e_len=100,
 };
 
 А не проще написать для статического: const int e_len = 100; ? Теперь код поиска максимального елемента: include "stdafx"
 int main(...)
 {
 int a[6] = {15, 20, 12, 11, 21, -9};
 int max, u;
 
 for(max = 0, u = 0; u < 5; ++u)
 {
 if (a[u] > a[max]
 max = u;
 }
 //и результатом программы будет max = 4!!!
 
 return 0;
 }
 
А теперь обьясняю: когда u = 0, то if дасть false, потому что у нас строго сказано >, а  ; дальше: когда u = 1 (но max у на пока равен max = 0), и тогда a[u ] = a[1] = 20, a[max] = a[0 ] = 15 (в данном случае) if даст true и сделает max = u (тоесть max = 1); анализируя каждый шаг цикла могу сказать, что if вернёт true до конца цикла ещё только один раз при u = 4 (a[u ] = a[4] = 21). Вот так.
 Совет: когда у вас программа не работает, а компилятор ошибки не выдаёт, то используйте пошаговый режим. P. S.: люди, ну что же это такое: for (max=0;u=0; u<5; u++){if (a[u]>a[u+1])
 {   max=u;
 }
, это же ненужное усложнение...всё спасибо разобрался  теперь всё понял хорошо  |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Dr.Yevhenius | 
								|  | « Ответ #20 : 16-11-2008 14:58 »  |  | 
 
 Это же на этапе компиляции обрабатывается всё
 А кто о компиляторе говорит? И наплевать мне на другие языки, тут речь про с++ ))
 Во-первых, я не говорил о том, как описывать константу на языке Pascal!, во-вторых, я знаю 6 языков программирования и во всех есть const, и когда я говорю, что "const - он во всех языках программирования const", это значит, что тот, кто только недавно перешёл с другого языка на С++, особой сложности написать const не составит. тут речь про с++ ))
 А я и обсуждаю С++ (поиск в массиве и елемент enum) |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Алексей++ 
								глобальный и пушистыйГлобальный модератор    Offline 
								Сообщений: 13
								
								
								
								
								
							 | 
								|  | « Ответ #21 : 16-11-2008 15:00 »  |  | 
 
 Inkognito, хватит воду лить    Речь идёт о c++ , enum никому не мешает |  
						| 
								|  |  
								|  |  Записан | 
 
 |  |  | 
	| 
			| 
					
						| pokk 
								Помогающий    Offline | 
								|  | « Ответ #22 : 18-11-2008 14:27 »  |  | 
 
 Опять не могу понять       каким образом можно сделать так  что бы выполнялась сумма между нулевыми элимантами масива    вот  что я надумал  // про.cpp : Defines the entry point for the console application.//
 
 #include "stdafx.h"
 
 
 int _tmain(int argc, _TCHAR* argv[])
 {
 
 int a[6],max,u,d,sum,m;
 a[0]=1;
 a[1]=0;
 a[2]=2;
 a[3]=3;
 a[4]=0;
 a[5]=7;
 for (m=0,sum=0,d=0;d<6;d++){
 if (a[d]=0){
 m=d;
 
 }
 for (sum=0; m<6; m++){
 sum+=a[m];
 }
 }
 
 printf("\t\t\t%d\n",sum);
 return 0;
 }
 
 
 
для начала надо сделать так что бы выполнялась сумма после нулегого элимента  что я и пытался сделать  for (m=0,sum=0,d=0;d<6;d++)  запускается цикол  поиска нулегого элиманта    if (a[d]=0)    если наёден такой ,то  записываем его индекс в переменую м    дальше запускается цикол  сумирования с [m]   но вот почемуто это всё не работает  программа запускается а результат   всегда получается 0   что я не так сделал ??     |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Sla | 
								|  | « Ответ #23 : 18-11-2008 14:40 »  |  | 
 
 int a[6],max,u,d,sum,m;a[0]=1;
 a[1]=0;
 a[2]=2;
 a[3]=3;
 a[4]=0;
 a[5]=7;
 for (m=0,sum=0,d=0;d<6;d++){
 if (a[d]=0){
 //если a[d]=0 то запоминаем его номер
 m=d;
 }
 //цикл от нулевого элемента   m=d до 6 - а почему 6?
 for (sum=0; m<6; m++){
 sum+=a[m];
 }
 }
 
 printf("\t\t\t%d\n",sum);
 //если вывод сделать здесь то выведешь только последнюю сумму - эту строку нужно перенести в цикл
 return 0;
 }
 
смотри коменты |  
						| 
								|  |  
								|  |  Записан | 
 
 Мы все учились понемногу... Чему-нибудь и как-нибудь. |  |  | 
	| 
			| 
					
						| pokk 
								Помогающий    Offline | 
								|  | « Ответ #24 : 18-11-2008 15:08 »  |  | 
 
 int a[6],max,u,d,sum,m;a[0]=1;
 a[1]=0;
 a[2]=2;
 a[3]=3;
 a[4]=0;
 a[5]=7;
 for (m=0,sum=0,d=0;d<6;d++){
 if (a[d]=0){
 //если a[d]=0 то запоминаем его номер
 m=d;
 }
 //цикл от нулевого элемента   m=d до 6 - а почему 6?
 for (sum=0; m<6; m++){
 sum+=a[m];
 }
 }
 
 printf("\t\t\t%d\n",sum);
 //если вывод сделать здесь то выведешь только последнюю сумму - эту строку нужно перенести в цикл
 return 0;
 }
 
смотри коменты6 потому что это размерность массива  а если перенести цикол туда тогда получится что  несколько раз выведется,а мне надо что бы он посчитал с нулегого элимента сумму до последнего    и один раз вывел    |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Sla | 
								|  | « Ответ #25 : 18-11-2008 15:19 »  |  | 
 
 nt a[6],max,u,d,sum,m;a[0]=1;
 a[1]=0;
 a[2]=2;
 a[3]=3;
 a[4]=0;
 a[5]=7;
 for (m=0,sum=0,d=5;d<0;d--){
 if (a[d]=0){
 m=d;
 //цикл от нулевого элемента   m=d до 6 - а почему 6?
 for (sum=0; m<6; m++){
 sum+=a[m];
 }
 printf("\t\t\t%d\n",sum);
 return 0;
 }
 }
 //для отладки и для понимания
 printf("\t\t\t%d\n",sum);
 
 return 0;
 }
 
расставь правильно скобки откомментируй код |  
						| 
								|  |  
								|  |  Записан | 
 
 Мы все учились понемногу... Чему-нибудь и как-нибудь. |  |  | 
	|  | 
	| 
			| 
					
						| Sla | 
								|  | « Ответ #27 : 18-11-2008 15:51 »  |  | 
 
 pokk, я допустил ошибку в коде поэтому и не выводится. (я код не проверял не на чем)
 я просил откомментировать код
 
 Задача
 Вывести сумму элементов массива, от последнего ненулевого.
 
 смотрим первый цикл, почему он такой?
 смотрим условие - почему именно такое?
 смотрим второй цикл - почему именно такой?
 
 Не скупись на слова - старайся упорядочить свои мысли
 
 |  
						| 
								|  |  
								|  |  Записан | 
 
 Мы все учились понемногу... Чему-нибудь и как-нибудь. |  |  | 
	| 
			| 
					
						| pokk 
								Помогающий    Offline | 
								|  | « Ответ #28 : 18-11-2008 16:11 »  |  | 
 
 первый цикол перебирает весь масив  с  5 элимента до 0   пока не получим  a[d]=0(не найдём нулевой элимент )  если такое находим то  записываем в переменную его номер( m=d;)  и теперь  вычисляем  сумму с  m   до самого первого элимента.   Так ? 
 
 
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| Sla | 
								|  | « Ответ #29 : 18-11-2008 18:51 »  |  | 
 
 вычисляем  сумму с  m   до самого первого элимента.
 почему до первого? кста, а ты нашел ошибку в алгоритме (в первом цикле)? |  
						| 
								|  |  
								|  |  Записан | 
 
 Мы все учились понемногу... Чему-нибудь и как-нибудь. |  |  | 
	|  |