Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2017, 21:37   #1
Программистер
Пользователь
 
Регистрация: 12.01.2017
Сообщений: 10
По умолчанию Не могу найти ошибку в коде

Условие:
Задан целочисленный одномерный массив A из N элементов. Найти номер первого
минимального элемента среди положительных элементов, кратных 7, расположенных до
последнего отрицательного элемента. Если нет отрицательных элементов, искать до конца
массива. (Подсказка: «Сначала найти первый положительный и к тому же кратный 7-ми и
последний отрицательный, а затем уже искать минимум либо вывести сообщение о причинах
невозможности поиска.»)

Используемый массив :
5
7 14 -7 21 -7

Код:
Код:
program Lab6procedure;

{$APPTYPE CONSOLE}
const nmax=10;
type mas=array[1..nmax] of integer;

             procedure K7 (const n:integer; const A:mas; out Nomp1:integer;var f1:boolean;var otr_num:integer);
                   var i : byte;
                      begin
                            Nomp1 := 1;
                            f1:=False;
                            i:=1;
                               while (i < otr_num)
                                do
                                  begin
                                     if (A[i]>0) and (A[i] mod 7 = 0) then
                                      begin
                                        if Nomp1 = 1 then
                                          Nomp1 := i
                                        else
                                           if (A[i]) < (A[Nomp1]) then
                                             Nomp1 := i;
                                        f1:=true;
                                       end ;
                                      inc(i) ;
                                  end;
                      end;
              procedure PoslOtr(const n :integer; const A:mas; out Nomotr:integer; var f2:boolean);
                    var i:byte;
                    begin
                       f2:=false;
                        i:=n;
                        while (i>1) and (f2=false) do
                          begin
                            if A[i]<0 then
                              begin
                                Nomotr:=i;
                                f2:=true;
                              end
                              else dec(i) ;
                           end;
                        end;
       var
      dat, res : TextFile;
   Nomp1,Nomotr,i,n : integer;
      A:mas;
      f2,f1:boolean;
  begin
     AssignFile(dat,'dat6.txt');Reset(dat);
     AssignFile(res,'res6.txt');Rewrite(res);
     readln(dat,n);
              for i := 1 to n do
                read(dat,A[i]);
              PoslOtr(n,A,Nomotr,f2);
              if (not f2) then
                begin
                writeln(res,'Массив не имеет отрицательных элементов. Поиск наименьшего положительного элемента кратного 7ми будет произведен до конца массива');
                Nomotr := n ;
                end
              else
                writeln(res,'Номер последнего отрицательного числа = ', Nomotr, '.');
               K7(n,A,Nomp1,f1,Nomotr);
              if f1 then
                writeln (res,'Номер первого минимального положительного числа кратного 7ми = ', Nomp1)
              else
                 writeln(res,'В диапазоне элементов от 1го до ', Nomotr, 'го нет положительных чисел, кратных 7');
             CloseFile(dat);
             CloseFile(res);
end.
Ожидаемый ответ:
Номер последнего отрицательного числа = 5.
Номер первого минимального положительного числа кратного 7ми = 1
Реальный ответ:
Номер последнего отрицательного числа = 5.
Номер первого минимального положительного числа кратного 7ми = 2

Последний раз редактировалось Программистер; 12.01.2017 в 21:48.
Программистер вне форума Ответить с цитированием
Старый 12.01.2017, 22:42   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

У вас случаи, когда первый положительный и кратный 7 элемент находится в 1 ячейке массива и когда такой элемент еще на найден, одинаковы. Проверяйте лучше флаг f1, а не Nomp1.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 13.01.2017 в 00:05.
BDA на форуме Ответить с цитированием
Старый 12.01.2017, 23:38   #3
Программистер
Пользователь
 
Регистрация: 12.01.2017
Сообщений: 10
По умолчанию

Исправил ошибку и все заработало корректно!Спасибо!
Программистер вне форума Ответить с цитированием
Старый 13.01.2017, 00:23   #4
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Ах, немного опоздал, ну да ладно.

Обошелся одной кнопочной процедурой на языке делфи, думаю далее сами переведете, все работает, файлы не применял))
Код:

procedure TForm1.Button1Click(Sender: TObject);
var arrays:array of shortint;
   i,j,n:byte;
   s:string;
   ok,polog:boolean;
   otric,index_otr:ShortInt;
   pologiteln,index_pol:ShortInt;
begin
memo1.Clear;
s:='';
  try
    n:=strtoint(trim(edit1.Text));
  except
     ShowMessage('Введите целое число от -127 до 128!');
     Edit1.Clear;
     Edit1.SetFocus;
     exit;
   end;

   Randomize;

   ok:=False;
   polog:=false;

   SetLength(arrays,n);

   Memo1.Lines.Add('Ваш массив: ');

   for i:=0 to N-1 do
   begin
     arrays[i]:=Random(255)-128;
     s:=s+IntToStr(arrays[i])+', ';
      if (i mod 9 =0) and (i<>0) then begin  memo1.Lines.Add(s); s:=''; end;
   end;

   memo1.Lines.Add(s);
   memo1.Lines.Add('');
   memo1.Lines.Add('Результат: ') ;

   i:=0;
   j:=Length(arrays)-1;

   while ((i<N))  or ((arrays[i]>=0 ) and (arrays[i] mod 7<>0))   do
   begin

     if (arrays[j]<0) and not ok  then
     begin
       otric:=arrays[j];
       index_otr:=j;
       Memo1.Lines.add('Последний отрицательный элемент: '+inttostr(otric)+' Индекс: '+inttostr(j+1));
       ok:=true;
     end else Dec(j);

      if (arrays[i] mod 7=0) and (arrays[i]>=0) and not polog then
      begin
         polog:=true;
         pologiteln:=arrays[i];
         index_pol:=i;
         Memo1.Lines.add('Первый кратный положительный элемент: '+inttostr(pologiteln)+' Индекс: '+inttostr(i+1));
      end;


     inc(i);
   end;



   if not polog then memo1.Lines.Add('Кратных элементов не найдено! Программа завершена! !') else
   begin

     if not ok then index_otr:=n-1;

      for i:=index_pol to index_otr do
      if ((arrays[i]<=pologiteln) and (arrays[i] mod 7=0) and (arrays[i]>=0)) then
      begin
        pologiteln:=arrays[i];
        j:=i;
      end;
      Memo1.Lines.Add('Номер минимального кратного положительного элемента: '+inttostr(j+1)+', Число: '+inttostr(pologiteln));
   end;



   arrays:=nil;
end;

end.
Изображения
Тип файла: jpg result.jpg (48.7 Кб, 40 просмотров)
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не могу найти ошибку в коде С++ kirillkucelap Помощь студентам 4 06.04.2014 19:03
Не могу найти ошибку в коде youngster Паскаль, Turbo Pascal, PascalABC.NET 3 17.11.2013 22:26
Не могу найти ошибку в коде sashmedv Паскаль, Turbo Pascal, PascalABC.NET 2 25.03.2012 08:31
не могу найти ошибку в коде pavelstraut Общие вопросы C/C++ 5 24.07.2009 23:20
Не могу найти ошибку в коде! Natasha666 Помощь студентам 1 20.05.2009 09:27