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 до самого первого элимента.
почему до первого? кста, а ты нашел ошибку в алгоритме (в первом цикле)?
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
|