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

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

kz
Offline Offline

« : 20-09-2011 13:36 » 

задача:определите длину наибольшего постоянного участка, т.е. максимальное количество подряд идущих элементов с одним и тем же значением.
Код:
Код: (C++)
#include <stdio.h>
int main () {
   int prev,cur,count=1,max=1,x;
   FILE *fp;
   fp=fopen("4.txt","r");
   fscanf(fp,"%d",&cur);
   prev=cur;
   while (fscanf (fp,"%d",&cur)==1) {
      if (prev==cur) {
         count++;
         x=count;
         prev=cur;
      } else {
         if (max<x) {
            max=x;
            count=1;
            prev=cur;
         } else (prev!=cur);
     {
        prev=cur;
      }
      }
   }
   if (max<x) {
      max=x;
   }
   printf ("%d\n",max);
   fclose(fp);
   return 0;
}
« Последнее редактирование: 20-09-2011 13:59 от Finch » Записан
Finch
Спокойный
Администратор

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


« Ответ #1 : 20-09-2011 14:00 » 

В коде не разбирался. Но после условия if (max<x) У тебя что то не ладное творится.
Записан

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

kz
Offline Offline

« Ответ #2 : 20-09-2011 14:12 » 

Там мне кажется не важно что творится). Главная ошибка здесь:
Если самый длинный участок находится в начале или в середине файла, то программа правильно вычисляет число повторяющихся цифр.
Если самый длинный участок находится в конце файла, то пример 1) вычисляется точнее, чем пример 2)
1) ... 7 8 8 8 8 7 9 9 9 9 9 9 9 9 9;
2) ... 7 8 8 8 8 9 9 9 9 9 9 9 9 9.
Записан
Finch
Спокойный
Администратор

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


« Ответ #3 : 20-09-2011 14:28 » 

else (prev!=cur); Это что? Компилятор не падает, потому что с точки синтаксиса вроде бы корректно. Но в логике непонятно.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Sla
Модератор

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

WWW
« Ответ #4 : 20-09-2011 14:33 » 

Код:
while (fscanf (fp,"%d",&cur)==1) {
    if (prev==cur) {
count++;
x=count;
prev=cur;
    } else {
if (max<x) {
max=x;
count=1;
prev=cur;
        } else (prev!=cur);
        prev=cur;
    }
}

Кто-нибудь мне объяснит тайный ход мысли
(prev!=cur)

Ага... не только я надолго задумался...
« Последнее редактирование: 20-09-2011 14:35 от Sla » Записан

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

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


« Ответ #5 : 20-09-2011 14:38 » 

Твой код можно чуть чуть сократить без изменений функциональности.
Код: (C++)
#include <stdio.h>
int main () {
   int prev,cur,count=1,max=1;
   FILE *fp;
   fp=fopen("4.txt","r");
   fscanf(fp,"%d",&cur);
   prev=cur;
   while (fscanf(fp, "%d", &cur) == 1) {
      if (prev == cur) {
         count++;
      } else {
         if (max < count) {
            max=count;
            count=1;
            prev=cur;
         }
      }
   }
   if (max < count) {
      max=count;
   }
   printf ("%d\n",max);
   fclose(fp);
   return 0;
}
Записан

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

kz
Offline Offline

« Ответ #6 : 20-09-2011 15:14 » 

Твой код можно чуть чуть сократить без изменений функциональности.
Код: (C++)
#include <stdio.h>
int main () {
   int prev,cur,count=1,max=1;
   FILE *fp;
   fp=fopen("4.txt","r");
   fscanf(fp,"%d",&cur);
   prev=cur;
   while (fscanf(fp, "%d", &cur) == 1) {
      if (prev == cur) {
         count++;
      } else {
         if (max < count) {
            max=count;
            count=1;
            prev=cur;
         }
      }
   }
   if (max < count) {
      max=count;
   }
   printf ("%d\n",max);
   fclose(fp);
   return 0;
}
После первого if я думаю надо добавить prev=cur;

Добавлено через 33 минуты и 25 секунд:
Спасибо большое Finch! Я немного подправил твой код и вот что получилось:

Код: (C++)
#include <stdio.h>
int main () {
   int prev,cur,count=1,max=1;
   FILE *fp;
   fp=fopen("4.txt","r");
   fscanf(fp,"%d",&cur);
   prev=cur;
   while (fscanf(fp, "%d", &cur) == 1) {
      if (prev == cur) {
         count++;
         prev=cur;
      } else {
         if (max < count) {
            max=count;
            count=1;
            prev=cur;
         }
                 else (max>=count);{
                         count=1;
                         prev=cur;
                 }
      }
   }
   if (max < count) {
      max=count;
   }
   printf ("%d\n",max);
   fclose(fp);
   return 0;
}
Добавлено через 18 секунд:
Все работает!)
« Последнее редактирование: 20-09-2011 17:01 от Джон » Записан
Finch
Спокойный
Администратор

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


« Ответ #7 : 20-09-2011 17:00 » 

mr_madik_7, Логический смысл строчки prev=cur в этом куске?
Код: (C++)
      if (prev == cur) {
         count++;
         prev=cur;
      }
Также объясни логический смысл else (max>=count);
Записан

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

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

« Ответ #8 : 20-09-2011 18:15 » 

Offtopic:
... не, я завязал.
Поставлю в угол.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
mr_madik_7
Интересующийся

kz
Offline Offline

« Ответ #9 : 21-09-2011 12:24 » 

mr_madik_7, Логический смысл строчки prev=cur в этом куске?
Код: (C++)
      if (prev == cur) {
         count++;
         prev=cur;
      }
Также объясни логический смысл else (max>=count);


Если убрать prev=cur, то на следующем шаге в "prev"е будет заложено значение препредыдущего.
По второму вопросу:я добавил этот кусок чтобы сбить счетчик, в том случае если max>=count.
Записан
Sla
Модератор

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

WWW
« Ответ #10 : 21-09-2011 12:32 » 

mr_madik_7,
прочитай вслух, с выражением
Код: (C)
    if (prev == cur) {
         count++;
         prev=cur;
      }
вслушиваясь в каждое слово
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
mr_madik_7
Интересующийся

kz
Offline Offline

« Ответ #11 : 21-09-2011 12:40 » 

Код верный, я не понимаю что вам не нравится

Добавлено через 2 минуты и 46 секунд:
Если предыдущий равен текущему, то к счетчику прибавить единицу и предыдущему присвоить значение текущего!!!
« Последнее редактирование: 21-09-2011 12:42 от mr_madik_7 » Записан
RXL
Технический
Администратор

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

WWW
« Ответ #12 : 21-09-2011 12:55 » 

А зачем присваивать? Они уже равны!
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Модератор

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

WWW
« Ответ #13 : 21-09-2011 13:26 » 

Если предыдущий равен текущему, то к счетчику прибавить единицу и предыдущему присвоить значение текущего!!!
Вслух получилось, а вот с выражением - нет.
RXL не выдержал и подсказал.

Код действительно верный. Присваивание работе не помешает, но увеличивает код Улыбаюсь
Существует иногда необходимость выравнивания веток переходов по длине кода, но для этого их выравнивают "пустыми" операциями.
В твоем случае присваивание - пустое.

зы 1. А потом сам удивляешься, почему все висит.
зы 2. Здесь может возникнуть спор о преждевременной оптимизации.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
mr_madik_7
Интересующийся

kz
Offline Offline

« Ответ #14 : 21-09-2011 15:05 » 

Sla, спасибо. приму во внимание твои советы)
Записан
Sla
Модератор

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

WWW
« Ответ #15 : 21-09-2011 15:33 » 

У тебя есть блок объявления переменных
max = 1
count =1

Теперь подходим к основному блоку
я ВСЛУХ читаю твой код
Открыл файл
Прочитал символ
Предыдущий равен Текущему (инициализация алгоритма)
Цикл до конца файла
  Прочитать
  Сравнить
  Если равны, то Инкрементировать счетчик....

Стоп ... А где счетчик инициализирован? Ого как далеко...
Т.е. если тебе требуется инициализировать переменные, то делай это как можно ближе к основному алгоритму.

зы переменные инициализировать нужно всегда.

я например предпочитаю такое, например

k=0;
if TRUE then k = 1

чем

if TRUE
   then k = 1
   else k = 0


 
Записан

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

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

WWW
« Ответ #16 : 21-09-2011 16:37 » 

Если предыдущий равен текущему, то к счетчику прибавить единицу и предыдущему присвоить значение текущего!!!
RXL не выдержал и подсказал.

Слав, после "прочтения" я уже не мог больше мучить человека. Ну, не понимает он - надо прямо сказать.

Добавлено через 3 минуты:
зы 2. Здесь может возникнуть спор о преждевременной оптимизации.

mr_madik_7, для твоего случая есть очень полезная статья: Оптимизация: ваш злейший враг. Хотя, это, наверно, еще не твой уровень. Тогда просто забудь про оптимизацию вообще, пока не научишься. Просто научись не косячить.
« Последнее редактирование: 21-09-2011 16:42 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
mr_madik_7
Интересующийся

kz
Offline Offline

« Ответ #17 : 22-09-2011 12:35 » 

да, я вас не понимаю просто. наверно из-за того что я только начинающий. Еще даже месяц не прошел с того момента как я начал изучать язык Си. НЕ судите строго)
Записан
Sla
Модератор

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

WWW
« Ответ #18 : 22-09-2011 12:47 » 

mr_madik_7, ну что ты? Какие же мы судьи, так... легкий шлепок, чтоб был более внимателен и аккуратен.

Записан

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

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

« Ответ #19 : 22-09-2011 12:59 » 

По поводу prev=cur можно так: если что-то одинаково повторяется в обоих ветках условия, то выноси за пределы условия.

Цитата: mr_madik_7
if (max < count) {
            max=count;
            count=1;
            prev=cur;
         }
                 else (max>=count);{
                         count=1;
                         prev=cur;
                 }
Прочитай (опиши словами, как работает) этот кусок. Особенно в районе else.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Джон
просто
Администратор

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

« Ответ #20 : 22-09-2011 14:41 » 

Все работает!)

Код верный, я не понимаю что вам не нравится

mr_madik_7, если тебе неоднократно на что-то намекают, то наверное что-то в этом есть? Или? Как ты думаешь?

Ещё раз внимательно посмотри на этот кусок и ты поймёшь, что нам не нравится:

else (max>=count);{
                         count=1;
                         prev=cur;
                 }


Такой код не может быть рабочим, то есть отображать задуманную логику, даже если, как ты утверждаешь, ВСЁ РАБОТАЕТ. Ага
« Последнее редактирование: 22-09-2011 14:44 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
mr_madik_7
Интересующийся

kz
Offline Offline

« Ответ #21 : 22-09-2011 14:45 » 

Код:
#include <stdio.h>
int main () {
   int prev,cur,count=1,max=1;
   FILE *fp;
   fp=fopen("4.txt","r");
   fscanf(fp,"%d",&cur);
   prev=cur;
   while (fscanf(fp, "%d", &cur) == 1) {
      if (prev == cur) {
         count++;
prev=cur;
      }
      else {
         if (max < count)
            max=count;
count=1;
prev=cur;
      }
   }
   if (max < count) {
      max=count;
   }
   printf ("%d\n",max);
   fclose(fp);
   return 0;
}

Прислушался к вашим замечаниям)  Думаю вот это самый оптимальный код, хотя ещё не проверял
Записан
Dimka
Деятель
Команда клуба

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

« Ответ #22 : 22-09-2011 15:48 » 

mr_madik_7, конечно, код пишется для того, чтобы работала машина. Но код пишется и для того, чтобы люди потом его читали и понимали, как работает машина. Поэтому, чем короче, тем лучше, но без хакерства.

Сравни:
Код: (C++)
bool isNextNumber();
int readNextNumber();

int sizeOfLongestSubsequenceOfTheSameItems()
{
  int sizeOfSubsequenceOfTheSameItems = 0, maxSizeOfSubsequenceOfTheSameItems = 0, previousItem;
  if(isNextNumber())
  {
    previousItem = readNextNumber();
    maxSizeOfSubsequenceOfTheSameItems = sizeOfSubsequenceOfTheSameItems = 1;
  }
  while(isNextNumber())
  {
    int currentItem = readNextNumber();
    if(currentItem != previousItem)
    {
      previousItem = currentItem;
      sizeOfSubsequenceOfTheSameItems = 1;
    }
    else
    {
      sizeOfSubsequenceOfTheSameItems += 1;
    }
    if(maxSizeOfSubsequenceOfTheSameItems < sizeOfSubsequenceOfTheSameItems)
    {
      maxSizeOfSubsequenceOfTheSameItems = sizeOfSubsequenceOfTheSameItems;
    }
  }
  return maxSizeOfSubsequenceOfTheSameItems;
}

Функции isNextNumber и readNextNumber придуманы мною как вспомогательные, чтобы не тащить в алгоритм работу с файлом или чтение с клавиатуры. Алгоритм выделен в отдельную функцию. Если ты этого не понимаешь - пока не важно.

Посмотри, сколько здесь действий (операций присваивания, условий). Сравни со своим вариантом.

P.S. Кстати, посмотри на случаях, когда вообще ни одного числа не прочитано - у тебя результат будет 1, что, очевидно, неправильно.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
mr_madik_7
Интересующийся

kz
Offline Offline

« Ответ #23 : 22-09-2011 16:20 » 

Dimka, почитаю на досуге  Улыбаюсь
p.s. этот частный случай мне не нужен, задание не для пустого файла)

И в общем всем спасибо за советы. Думаю ближайшее время буду активным пользователем вашего форума. В основном буду нуждаться консультации)
Записан
Sla
Модератор

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

WWW
« Ответ #24 : 22-09-2011 17:11 » 

mr_madik_7, ты не совсем правильно понял слова Dimka.

Между прочим он привел алгоритм решения твоей задачи, но на, назовем это, формальном языке.

Он не написал функции работы с файлом - открытие и чтение т.к. они ни как на суть алгоритма не влияют.
Попробуй прочитать Димкин текст словами. И ты поймешь разницу
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
mr_madik_7
Интересующийся

kz
Offline Offline

« Ответ #25 : 23-09-2011 10:31 » 

Да, я понял. у Димки алгоритм получился намного короче. Попробую применить этот алгоритм.
Результат покажу позже.
P.s. че такое bool?

Добавлено через 23 минуты и 4 секунды:
Ну вроде все:  Внимание! Говорит и показывает...
Код:
#include <stdio.h>
int main () {
   int prev,cur,count=0,max=0;
   FILE *fp;
   fp=fopen("4.txt","r");
   fscanf(fp,"%d",&cur);
   prev=cur;
   max=count=1;
   while (fscanf(fp, "%d", &cur) == 1) {
      if (prev != cur) {
         count=1;
      }
      else {
         count++;
      }
      prev=cur;
      if (max < count) {
      max=count;
      }
   }
   printf ("%d\n",max);
   fclose(fp);
   return 0;
}
« Последнее редактирование: 23-09-2011 11:10 от mr_madik_7 » Записан
Sla
Модератор

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

WWW
« Ответ #26 : 23-09-2011 11:26 » 

Почти....
Не раскрыт вопрос  пустого файла.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
mr_madik_7
Интересующийся

kz
Offline Offline

« Ответ #27 : 23-09-2011 12:13 » 

если честно я не знаю как записать это.
может так?
if (fscanf(fp."%d",&cur)==0)
    count=0;
Записан
Dimka
Деятель
Команда клуба

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

« Ответ #28 : 23-09-2011 12:17 » 

Хм... Налицо непонимание текста программы. Шаманство с буковками, продолжающееся до тех пор, пока не заработает.

mr_madik_7, расскажи, зачем ты вообще взялся за программирование? Чего ты хочешь получить в результате выполнения этого учебного задания? Научиться программировать или заставить машину решить данную задачу?
« Последнее редактирование: 23-09-2011 12:19 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
mr_madik_7
Интересующийся

kz
Offline Offline

« Ответ #29 : 23-09-2011 13:59 » 

мне надо научиться составлять различные алгоритмы для решения задач. А код, который снизу, я взял и придумал на ходу)
if (fscanf(fp."%d",&cur)==0)
    count=0;
« Последнее редактирование: 23-09-2011 15:13 от mr_madik_7 » Записан
Страниц: [1] 2  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines