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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 2 3 [Все]   Вниз
  Печать  
Автор Тема: помогите разобраться с поиском в масиве (C/C++)  (Прочитано 57119 раз)
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   до самого первого элимента.
почему до первого?


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

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

ru
Offline Offline

« Ответ #30 : 19-11-2008 05:07 » 

почему до первого?
а до какого  ?
Код:
for (m=0,sum=0,d=5;d<0;d--)  
мне тут  d=5;d<0  не нравится  наверно надо d>0

кста, а ты нашел ошибку в алгоритме (в первом цикле)?
я нашёл ошибку в условии    (a[d]==0)   это то ?

Tщё вопрос. Так как у меня два нулевых элимента то какой он  возьмёт ?   
Если я правильно понял что цикол начинается с конца   то он возьмёт первый который найдёт  т.е.    a[4] 
так ?
Записан
pokk
Помогающий

ru
Offline Offline

« Ответ #31 : 19-11-2008 05:27 » 

вот что у меня получилось
Код:
#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,d=5;d>0;d--){
if (a[d]==7){
m=d;
         
  for (sum=0; m>0; m--){
     sum+=a[m];
        }
       
        printf("\t\t\t%d\n",sum );
        return 0;
    }
}

}

Цикол первый работает  всё нормально  условие тоже выполняется  ,а вот  со вторым циклом что-то не так не могу понять что иненно

Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #32 : 19-11-2008 07:11 » 

pokk, ахринеть  Не может быть...

1. оформление и форматирование кода ужасное!!!
2. d=5 с каких это щей?
3. sum+=a[m], нифига у тебя не получится.
« Последнее редактирование: 19-11-2008 09:43 от McZim » Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Sla
Модератор

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

WWW
« Ответ #33 : 19-11-2008 07:14 » 

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

pokk, Замечательно! Браво! ты нашел ошибку
мне тут  d=5;d<0  не нравится  наверно надо d>0



Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Sla
Модератор

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

WWW
« Ответ #34 : 19-11-2008 07:15 » 

McZim, мухи отдельно, котлеты отдельно

как с каких? а какая размерность массива?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Sla
Модератор

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

WWW
« Ответ #35 : 19-11-2008 07:16 » 

вот почему
Код:
if (a[d]==7)
если нам нужен НУЛЕВОЙ элемент
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #36 : 19-11-2008 07:18 » 

а какая размерность массива?

да....извиняюсь.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #37 : 19-11-2008 07:20 » 

вот почему
Код:
if (a[d]==7)
если нам нужен НУЛЕВОЙ элемент

это мне или аффтару?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Sla
Модератор

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

WWW
« Ответ #38 : 19-11-2008 07:22 » 

McZim, к автору
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #39 : 19-11-2008 08:47 » 

а я если честно не понял задачу Улыбаюсь
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #40 : 19-11-2008 09:15 » 

ааааа, ну примерно понял Улыбаюсь
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Sla
Модератор

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

WWW
« Ответ #41 : 19-11-2008 09:27 » 

где-то за пределами мира сего родилось в общении такое
Код:
for(int d = 5; d > 0; d--)
    {
        if(a[d] == 0)
        {
            do
            {
                d++;
                sum += a[d];
            }while(d != 5);

            break;
        }
    }
pokk, расскажи, что мы родили?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #42 : 19-11-2008 09:38 » 

ну раз такая пьянка, то еще расскажи, если заменить условие:

Код:
if(a[d] == 0)

на условие:

Код:
if(a[d] == 0 && d != 5)

что это даст?
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #43 : 19-11-2008 10:05 » 

Код:
#define ARRAY_SIZE(x) ( sizeof(x)/sizeof (x[0]))

void Test()
{
long a[] = {1,0,2,3,0,7};

size_t sum = 0;
bool useSum = false;
for (size_t i = 0; i != ARRAY_SIZE(a); ++i)
{
if (a[i] == 0)
useSum = !useSum;

if (useSum)
sum += a[i];
}
std::cout << "sum = " << sum << std::endl;
}
Записан

Странно всё это....
Sla
Модератор

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

WWW
« Ответ #44 : 19-11-2008 10:06 » 

McZim, кста, если делаеть второй цикл с предусловием, то
Код:
if(a[d] == 0 && d != 5)
не нужно
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #45 : 19-11-2008 10:12 » 

Sla, можно.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #46 : 19-11-2008 10:22 » 

LogRus, хм, это разве сумма элементов от последнего нулевого значения?

и потом, вот тут:

Код:
if (useSum)
   sum += a[i];

мне кажется нужно сделать:

Код:
if (useSum)
{
   sum += a[i];
   useSum = false;
}
« Последнее редактирование: 19-11-2008 10:25 от McZim » Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #47 : 19-11-2008 10:30 » 

LogRus, у тебя получается складываются только 2 и 3, но это ведь значения не после последнего нулевого элемента, а последним в данном массиве является 7.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #48 : 19-11-2008 10:54 » 

........ каким образом можно сделать так  что бы выполнялась сумма МЕЖДУ нулевыми элимантами масива  ...............
Записан

Странно всё это....
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #49 : 19-11-2008 10:55 » 

LogRus, ну тада ага, я не так понял, да еще и Слава меня смутил Улыбаюсь
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #50 : 19-11-2008 10:59 » 

только вот задача опять таки не ясна, а если вот такой массив будет: {0,1,2,0,5,0}; между какими считать?

В любом случае у автора, теперь богатый выбор рабочего кода Улыбаюсь
« Последнее редактирование: 19-11-2008 11:01 от McZim » Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #51 : 19-11-2008 11:28 » 

McZim, какой вопрос такой ответ Улыбаюсь будет уточнение в вопросе - будет уточнее в ответе
Записан

Странно всё это....
Sla
Модератор

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

WWW
« Ответ #52 : 19-11-2008 11:29 » 

Господа!
Мои слова вот отсюда
https://forum.shelek.ru/index.php/topic,16755.msg190554.html#msg190554

Цитата
а если перенести цикол туда тогда получится что  несколько раз выведется,а мне надо что бы он посчитал с нулегого элимента сумму до последнего    и один раз вывел   
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #53 : 19-11-2008 11:33 » 

ну в общем ждем аффтора, и внематочно его выслушиваем Улыбаюсь
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
pokk
Помогающий

ru
Offline Offline

« Ответ #54 : 19-11-2008 13:33 » 


вот полное задание.  Я делал от простого к сложному или рабивал задание на  более простоые примеры




В любом случае у автора, теперь богатый выбор рабочего кода Улыбаюсь
   
выбор не сильно большой  единствиное что понятно  вот это и то не всё 
Код:
for(int d = 5; d > 0; d--)
    {
        if(a[d] == 0)
        {
            do
            {
                d++;
                sum += a[d];
            }while(d != 5);

            break;
        }
    }

Код:

            do
            {
                d++;
                sum += a[d];
            }while(d != 5);

         

видимо этим вырожением  заменили цикол сумирования

Оо пока писал понял  Улыбаюсь
  пока  d не равно  5  как тока d=5  то  выполняется выход из цикла





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

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

WWW
« Ответ #55 : 19-11-2008 13:41 » 

Ёооо
Это же меняет суть, хотя и не намного
1. находим первый нулевой        B
2. находим последний нулевой   E
3 цикл от первого до последнего B...E  - сумма
Записан

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

ru
Offline Offline

« Ответ #56 : 19-11-2008 13:42 » 

Ёооо
Это же меняет суть, хотя и не намного
1. находим первый нулевой        B
2. находим последний нулевой   E
3 цикл от первого до последнего B...E  - сумма

Что бы это всё сделать надо было понять как вообще  сделать сумму с любого элимента   =))

Записан
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #57 : 19-11-2008 14:01 » 

pokk, тут есть решение для суммы чисел от последнего нулевого значения, есть решение между нулевыми значениями. Немного подумай и сделай так как от тебя требует задача.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #58 : 20-11-2008 05:33 » 

Пока без мата.

Какой-то фигнёй занимаемся - честное слово.
Задачи простые как 3 копейки, а автор даже сформулировать их не может.

особенно радуют слово цикол ( ЦИКЛ - ЦИКЛ - запомни раз и навсегда) и фразы

вот полное задание.  Я делал от простого к сложному или рабивал задание на  более простоые примеры

и где блин оно?

Что бы это всё сделать надо было понять как вообще  сделать сумму с любого элимента   =))

А на листочке ты, как суммы считаешь? Просто начни с нужного.

Пиши словесные алгоритмы.
« Последнее редактирование: 20-11-2008 08:12 от LogRus » Записан

Странно всё это....
Sla
Модератор

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

WWW
« Ответ #59 : 20-11-2008 07:11 » 

LogRus, человек явно нерусскоязычен. Поспокойней.
Просто тему нужно перенести в Памагите, и тогда все станет на свои места
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #60 : 20-11-2008 08:11 » 

больше не буду.
Записан

Странно всё это....
pokk
Помогающий

ru
Offline Offline

« Ответ #61 : 22-11-2008 10:20 » 

Пока я разбирался у меня возник вопрос как можно определить чётное число или нет(первое задание ) ??  и  как найти второй нулевой элимент (второе задание )??   
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #62 : 22-11-2008 10:32 » 

pokk, Чем отличается четное число от нечетного?
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
pokk
Помогающий

ru
Offline Offline

« Ответ #63 : 22-11-2008 10:48 » 

pokk, Чем отличается четное число от нечетного?
 
делится на 2 с остатком и без =)

Код:

int a,c;
float b;

for (a=0;a<10; a++){

     
b=a/2-int(a/2);
printf("%f\n",b); 
}
вот что я надумал    
где int выделяет целую часть   и должно выводится  0.5(не чётное )  или 0 (чётное )
вот тока получилось что выводится всё время 0 а понять не могу почему   
« Последнее редактирование: 22-11-2008 10:52 от pokk » Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #64 : 22-11-2008 10:57 » 

pokk, int это вообше то целочисленный тип. Никаких дробных частей нет в принципе. Иши более правильный путь с учетом данного утверждения.

Ну совсем запутанный способ
Код:
if (a & 1) 
{
   // Тут если число не четно
}
else
{
   // Тут если число четно
}
« Последнее редактирование: 22-11-2008 11:00 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
pokk
Помогающий

ru
Offline Offline

« Ответ #65 : 22-11-2008 10:59 » 

pokk, int это вообше то целочисленный тип. Никаких дробных частей нет в принципе. Иши более правильный путь с учетом данного утверждения.
то есть  если я напишу  int(2)  он выдаст  2,а если  int(1.5)  выдаст 1     так Не понял?     
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #66 : 22-11-2008 11:01 » 

Да так
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
pokk
Помогающий

ru
Offline Offline

« Ответ #67 : 22-11-2008 11:08 » 



Ну совсем запутанный способ
Код:
if (a & 1) 
{
   // Тут если число не четно
}
else
{
   // Тут если число четно
}

(a & 1)  это что означает ??
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #68 : 22-11-2008 11:10 » 

Ну я думал, что ты поднимеш книжку. И почитаеш булевые функции. В частности & в данном случае это логическое И.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
pokk
Помогающий

ru
Offline Offline

« Ответ #69 : 22-11-2008 11:18 » 

о а почему это работает ?? Улыбаюсь Улыбаюсь

если  (1 и 1 )  это что означает ?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #70 : 22-11-2008 11:31 » 

Фокусы булевой алгебры и знание двоичной системы счисления.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #71 : 22-11-2008 11:44 » 

pokk,

(1 && 1) равносильно (true && true) == true (булево И) ,

а (1&1) - результат число 1  (побитовое И)
Записан

pokk
Помогающий

ru
Offline Offline

« Ответ #72 : 22-11-2008 11:50 » 

pokk,

(1 && 1) равносильно (true && true) == true (булево И) ,

а (1&1) - результат число 1  (побитовое И)

оо что-то сильно сложно надо будет вернутся к моему способу =)))))  

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

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


« Ответ #73 : 22-11-2008 11:55 » 

да ничего сложного )

поиск второго элемента - начинай с элемента, следующего за первым нулевым , так ? )

break - это выход из цикла do...while , while...do или for
(а , наверное кстати, continue - это начать новую итерацию цикла)
Записан

pokk
Помогающий

ru
Offline Offline

« Ответ #74 : 22-11-2008 12:00 » 



поиск второго элемента - начинай с элемента, следующего за первым нулевым , так ? )





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

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


« Ответ #75 : 22-11-2008 12:03 » 

а. Ну тогда тот же самый поиск первого нулевого, только с конца массива )
Записан

pokk
Помогающий

ru
Offline Offline

« Ответ #76 : 22-11-2008 12:08 » 

а. Ну тогда тот же самый поиск первого нулевого, только с конца массива )
  оо  точно
Записан
Serg79
Команда клуба

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

WWW
« Ответ #77 : 24-11-2008 14:04 » 

Пока я разбирался у меня возник вопрос как можно определить чётное число или нет(первое задание ) ??  и  как найти второй нулевой элимент (второе задание )??   
Классический способ:
Код:
int digit;
...
if (digit % 2) {
    /* не четное */
} else {
    /* четное */
}
Записан
Вад
Команда клуба

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

« Ответ #78 : 24-11-2008 14:06 » 

Serg79, но неоптимальный Ага Можно что-то вроде (digit & 1) практиковать Улыбаюсь

P.S. Хотя, возможно, компилятор "% 2" на побитовое "и" сам заменит - такое, кажется, видел где-то.
« Последнее редактирование: 24-11-2008 14:11 от Вад » Записан
Serg79
Команда клуба

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

WWW
« Ответ #79 : 24-11-2008 14:22 » 

Serg79, но неоптимальный Ага Можно что-то вроде (digit & 1) практиковать Улыбаюсь

P.S. Хотя, возможно, компилятор "% 2" на побитовое "и" сам заменит - такое, кажется, видел где-то.
Зависит от платформы и компилятора Улыбаюсь

Но что читается лучше, это факт.
Записан
Serg79
Команда клуба

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

WWW
« Ответ #80 : 24-11-2008 14:29 » 

Для GCC платформа i386:
Код:
int test_func_1(int digit)
{
        if (digit % 2)
                return 0;

        return 1;
}

int test_func_2(int digit)
{
        if (digit & 1)
                return 0;

        return 1;
}

gcc -O2 -fomit-frame-pointer -S main.c дает результат:
Код:
.globl test_func_1
        .type   test_func_1, @function
test_func_1:
        movzbl  4(%esp), %eax
        andl    $1, %eax
        xorl    $1, %eax
        movzbl  %al, %eax
        ret
        .size   test_func_1, .-test_func_1
        .p2align 4,,15
.globl test_func_2
        .type   test_func_2, @function
test_func_2:
        movzbl  4(%esp), %eax
        andl    $1, %eax
        xorl    $1, %eax
        movzbl  %al, %eax
        ret
        .size   test_func_2, .-test_func_2
        .p2align 4,,15
Записан
Страниц: 1 2 3 [Все]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines