1 Востаннє редагувалося Ostapchuk (14.06.2015 15:56:38)

Тема: Потрібна порада у виправленні помилки програми (у циклі)

Усім привіт, я не так давно на форумі, але вже потрібна невеличка консультація на рахунок виправлення помилки в коді програми

program s55;

uses
  crt;

var
  s1, a, S, n, i, v, kil: integer;
  v1: real;
  f1: text;

begin
  clrscr;
  S := 0;
  s1 := 0;
  writeln('Введите количество чисел');
  readln(n);
  randomize;
  Assign(f1, 'C:\1.txt');
  rewrite(f1);
  for i := 1 to n do 
  begin
    a := random(40) + 10;
    writeln(f1, a:5, ';');
  end;
  close(f1);
  reset(f1);
  begin
    for i := 1 to n do 
    begin
      if (a / 5 = v) and (a / 7 = v1) then
      begin
        readln(f1, a);
        kil := s1 + 1;
        S := S + a; 
      end;
  end;
  end;
  writeln('Suma =', S);
  writeln('Kol-vo =', kil);
end.

Я ніяк не можу зрозуміти, чому воно не рахує суму чисел та кількість чисел у цьому циклі

 if (a / 5 = v) and (a / 7 = v1) then

P.S. я розумію , що V та V1 не присвоєні значення, але я не розумію які саме потрібно підставити, щоб виконувалася умова, або ж ця умова не правильна у мене (:

Умова, якщо трохи не зрозуміло
http://savepic.org/7402616.png

P.S.2 Використання масиву не дозволяється

2 Востаннє редагувалося quez (14.06.2015 16:05:00)

Re: Потрібна порада у виправленні помилки програми (у циклі)

У вас не ініціалізована змінна v.

Подякували: Ostapchuk1

3 Востаннє редагувалося P.Y. (14.06.2015 16:05:21)

Re: Потрібна порада у виправленні помилки програми (у циклі)

1) Що собою символізують змінні v та v1, яким у програмі ніде не присвоюється значення?
2) Для перевірки на подільність краще використати операцію mod (знаходження остачі). Якщо a mod n = 0, то a ділиться на n.
3) За умовою, треба шукати числа, що діляться на 5 й НЕ діляться на 7. Тобто, (a mod 5 = 0) and (a mod 7 <> 0)

Подякували: Ostapchuk1

4

Re: Потрібна порада у виправленні помилки програми (у циклі)

P.Y. написав:

1) Що собою символізують змінні v та v1, яким у програмі ніде не присвоюється значення?
2) Для перевірки на подільність краще використати операцію mod (знаходження остачі). Якщо a mod n = 0, то a ділиться на n.
3) За умовою, треба шукати числа, що діляться на 5 й НЕ діляться на 7. Тобто, (a mod 5 = 0) and (a mod 7 <> 0)

Я виправив на вашу пораду, але нічого не змінилося , так і не рахує суму та кількість.
(a mod 5 = 0) and (a mod 7 <> 0)

5

Re: Потрібна порада у виправленні помилки програми (у циклі)

quez написав:

У вас не ініціалізована змінна v.

В темі було написано

P.S. я розумію , що V та V1 не присвоєні значення, але я не розумію які саме потрібно підставити, щоб виконувалася умова, або ж ця умова не правильна у мене (:

6

Re: Потрібна порада у виправленні помилки програми (у циклі)

Ostapchuk написав:

Я виправив на вашу пораду, але нічого не змінилося , так і не рахує суму та кількість.
(a mod 5 = 0) and (a mod 7 <> 0)

Тут немає телепатів, ми не можемо сказати, чому не працює програма, без коду цієї програми. Попередньох версію коду з уточненням "я виправив" недостатньо, ми не знаємо, що і як ви виправили. Щоб не засмічувати тему, використовуйте тег spoiler.

Подякували: Ostapchuk1

7

Re: Потрібна порада у виправленні помилки програми (у циклі)

Ще подивіться на 32-й рядок. Чому ми спершу перевіряємо a на подільність, і тільки потім її зчитуємо (причому, тільки якщо поточне значення відповідає умові)?

Подякували: Ostapchuk1

8

Re: Потрібна порада у виправленні помилки програми (у циклі)

P.Y. написав:

Ще подивіться на 32-й рядок. Чому ми спершу перевіряємо a на подільність, і тільки потім її зчитуємо (причому, тільки якщо поточне значення відповідає умові)?

Дякую велике за аналіз мого коду, я врахував ваші поради і у мене все заробило, звичайно я рішився і почав все з нуля

Прихований текст
uses
  crt;

var
  f: text;
  i, n, kil, t: integer;
  s, k: real;

begin
  clrscr;
  randomize;
  s := 0;
  kil := 0;
  t := 0;
  write('n=');
  readln(n);
  assign(f, '..\1.txt');
  rewrite(f);
  for i := 1 to n do
  begin
    t := t + 1;
    k := random(41) + 10;
    writeln(f, ' ', t:3, '. ', k);
    writeln(t:3, '. ', k);
    if(frac (k / 5) = 0) and (frac(k / 7) <> 0)   then
    begin
      s := s + k;
      kil := kil + 1;
    end;
  end;
  writeln(f, 's=', s:6:2, '    kil=', kil);
  writeln('s=', s:6:2, '    kil=', kil);
  close(f);
end.

дещо змінив на frac, для мене було так зрозуміліше

Прихований текст
if(frac (k / 5) = 0) and (frac(k / 7) <> 0)   then

Усім дякую за поради, програма працює!  *THUMBSUP*

Подякували: koala1