Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1] 2 3  Все   Вниз
  Печать  
Автор Тема: помогите разобраться с поиском в масиве (C/C++)  (Прочитано 57071 раз)
0 Пользователей и 1 Гость смотрят эту тему.
pokk
Помогающий

ru
Offline 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++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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++ » Записан

Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 14-11-2008 19:20 » 

Ну, изначально будет a[0], и присваивания быть в данном случае не должно. Попробуй протрассировать этот код - условие в if всегда должно давать false для такого тестового массива.
Записан
pokk
Помогающий

ru
Offline 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
Помогающий

ua
Offline 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;
   }
 }
и все должно сработать.
Записан
pokk
Помогающий

ru
Offline Offline

« Ответ #5 : 15-11-2008 11:09 » 

всё спасибо всё работает  Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Помогающий

ru
Offline 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++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 16-11-2008 13:56 » 

pokk, поьзуйся тегом [code]...[/code] !
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 16-11-2008 14:02 » 

pokk, запусти под отладчикам, погляди всё по шагам
Записан

pokk
Помогающий

ru
Offline Offline

« Ответ #10 : 16-11-2008 14:05 » 

Код:
for (max=0 ; u=0; u<5; u++){
 if (a[u]>a[max])
 {   max=u;
 }


это всё работает а почему хз
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 16-11-2008 14:07 » 

Цитата
это всё работает а почему хз
так я же написал , как оно работает ) См верхний пост
Записан

pokk
Помогающий

ru
Offline 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 » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 16-11-2008 14:27 » 

ты о чём ? )  Ты отладчик уже запускал ?
Записан

Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #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
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #15 : 16-11-2008 14:31 » 

(Предыдущее сообщение я исправил) Да-да
« Последнее редактирование: 16-11-2008 14:40 от Inkognito » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 16-11-2008 14:40 » 

Inkognito,
Цитата
А не проще написать для статического:
const int e_len = 100;

нет, не проще )))


Записан

Dr.Yevhenius
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #17 : 16-11-2008 14:45 » 

нет, не проще )))
Во-первых дольше, а во-вторых надо знать ещё что такое в С++ enum, а const - он во всех языках программирования const.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #18 : 16-11-2008 14:49 » 

Inkognito, ДОЛЬШЕ ? Чем ? Это же на этапе компиляции обрабатывается всё. И наплевать мне на другие языки, тут речь про с++ ))

Цитата
надо знать ещё что
знаю )
Записан

pokk
Помогающий

ru
Offline 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
Опытный

ua
Offline Offline
Пол: Мужской

« Ответ #20 : 16-11-2008 14:58 » 

Это же на этапе компиляции обрабатывается всё
А кто о компиляторе говорит?

И наплевать мне на другие языки, тут речь про с++ ))
Во-первых, я не говорил о том, как описывать константу на языке Pascal!, во-вторых, я знаю 6 языков программирования и во всех есть const, и когда я говорю, что "const - он во всех языках программирования const", это значит, что тот, кто только недавно перешёл с другого языка на С++, особой сложности написать const не составит.

тут речь про с++ ))
А я и обсуждаю С++ (поиск в массиве и елемент enum)
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #21 : 16-11-2008 15:00 » 

Inkognito, хватит воду лить Улыбаюсь Речь идёт о c++ , enum никому не мешает
Записан

pokk
Помогающий

ru
Offline 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
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #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
Помогающий

ru
Offline 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
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #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;
}

расставь правильно скобки
откомментируй код
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
pokk
Помогающий

ru
Offline Offline

« Ответ #26 : 18-11-2008 15:45 » 

 Здесь была моя ладья...  что-то я не понимаю что сделать надо  скопки раставил  а  на экран нечего не выдаёт

Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #27 : 18-11-2008 15:51 » 

pokk, я допустил ошибку в коде поэтому и не выводится. (я код не проверял не на чем)

я просил откомментировать код

Задача
Вывести сумму элементов массива, от последнего ненулевого.

смотрим первый цикл, почему он такой?
смотрим условие - почему именно такое?
смотрим второй цикл - почему именно такой?

Не скупись на слова - старайся упорядочить свои мысли
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
pokk
Помогающий

ru
Offline Offline

« Ответ #28 : 18-11-2008 16:11 » 

первый цикол перебирает весь масив  с  5 элимента до 0   пока не получим  a[d]=0(не найдём нулевой элимент )  если такое находим то  записываем в переменную его номер( m=d;)  и теперь  вычисляем  сумму с  m   до самого первого элимента.   Так ?


 
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #29 : 18-11-2008 18:51 » 

Цитата
вычисляем  сумму с  m   до самого первого элимента.
почему до первого?


кста, а ты нашел ошибку в алгоритме (в первом цикле)?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Страниц: [1] 2 3  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines