Помощь - Поиск - Пользователи - Календарь
Полная версия: вопрос по массивам
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
amebka
Задание:
Вводится размерность одномерного массива A(N) и его элементы. Вывести на экран сумму составных чисел среди элементов массива.
Вот программка:
Исходный код

var
i,k,s,n:integer;
a:array[1..n] of integer;
begin
readln(n);
i:=1;
s:=0;
for i = 1 to n do
begin k:=0;
k:=a(i)mod2;
if k=0 then goto m1
else k:=a(i)mod3;
if k=0 then goto m1
else k:=a(i)mod5;
if k=0 then goto m1
else k:=a(i)mod7;
if k=0 then goto m1;
m1: s:=s+a(i);
end;
writeln (s);
end.


Теги !

Но она даже не компилируется (в месте, отмеченном красным цветом)...
Как думаете, почему? и вообще, как она (программка)? действенная?
volvo
Цитата
Как думаете, почему?
Потому, что ты пытаешься задать размер массива через переменную, а должна быть - константа!
const n_max = 100;
var
i,k,s,n:integer;
a:array[1..n_max] of integer;
...
Дальше - без изменений...
Гость
Спасибо большое) я бы и не догадалась...
Теперь он не компелирует в следующем месте...
Исходный код

const n_max=100;
var
i,k,s,n:integer;
a:array[1..n_max] of integer;
begin
readln(n);
i:=1;
s:=0;
for i = 1 to n do
begin k:=0;
k:=a[i]mod2;
if k=0 then goto m1
else k:=a[i]mod3;
if k=0 then goto m1
else k:=a[i]mod5;
if k=0 then goto m1
else k:=a[i]mod7;
if k=0 then goto m1;
m1: s:=s+a[i];
end;
writeln (s);
end.

Теги !

пишет, что там должна быть точка с запятой... (
мисс_граффити
 for i:= 1 to n do

двоеточие забыли
k:=a[i] mod 2;

Пробелы.

В следующий раз будет ругаться на m1...
а вообще лучше бы без goto обойтись...
volvo
klem4, ТЕГИ это прекрасно, но попробуй теперь прочесть обе эти программы!
klem4
Хм действительно с pascоde какие-то проблемы тут ... codebox вроде нормально
amebka
Спасибо большое ... программа скомпилировалась, но все равно не работает...
конечный вариант выглядит так...
 
var
i,k,s,n:integer;
a:array[1..n] of integer;
begin
readln(n);
i:=1; 
s:=0;
for i: = 1 to n do
begin k:=0;
k:=a(i) mod 2;
if k=0 then s:=s+a(i)
else k:=a(i) mod 3;
if k=0 then s:=s+a(i)
else k:=a(i) mod 5;
if k=0 then s:=s+a(i)
else k:=a(i) mod 7;
if k=0 then s:=s+a(i);
end;
writeln (s);
end.


Может, кто-нибудь сможет мне помочь? rolleyes.gif
volvo
Давай ты не будешь врать, ОК?
var
  i,k,s,n:integer;
  a:array[1..n] of integer;

Это - не будет компилироваться ни при каких условиях...

Почему - см. сообщение №2
amebka
Цитата(volvo @ 14.03.2006 9:54) *
Это - не будет компилироваться ни при каких условиях...


Извиняюсь ... моя невнимательность wacko.gif
вроде так... (уже не уверена)...
 const n_max=100;
var
i,k,s,n:integer;
a:array[1..n_max] of integer;
begin
readln(n);
i:=1; 
s:=0;
for i: = 1 to n do
begin k:=0;
k:=a(i) mod 2;
if k=0 then s:=s+a(i)
else k:=a(i) mod 3;
if k=0 then s:=s+a(i)
else k:=a(i) mod 5;
if k=0 then s:=s+a(i)
else k:=a(i) mod 7;
if k=0 then s:=s+a(i);
end;
writeln (s);
end.


volvo
Цитата
вроде так... (уже не уверена)...
Правильно, что не уверена... Откомпилируй программу, потом пришлешь полученный вариант... Компилятором работать, я думаю, ни у кого желания нет...

k:=a(i) mod 2;
тоже не будет компилироваться. Ибо скобки не те... Квадратные нужны.
amebka

const n_max=100;
var
i,k,s,n:integer;
a:array[1..n_max] of integer;
begin
readln(n);
i:=1; 
s:=0;
for i: = 1 to n do
begin k:=0;
k:=a[i] mod 2;
if k=0 then s:=s+a[i]
else k:=a[i] mod 3;
if k=0 then s:=s+a[i]
else k:=a[i] mod 5;
if k=0 then s:=s+a[i]
else k:=a[i] mod 7;
if k=0 then s:=s+a[i];
end;
writeln (s);
end.


Извиняюсь, конечно, за такое количество ошибок... просто я не умею ее из паскаля копировать (пришлось перебивать вручную, поэтому и ляпов столько)...
Ozzя
for i: = 1 to n do
Это тоже не будет компилироваться. Между : и = пробел.
Цитата
просто я не умею ее из паскаля копировать

1. Открыть pas-файл блокнотом.
2. Щелкнуть кнопку системного меню, если bp запущен в оконном режиме. Изменить -> Выделить -> Выделить программу -> Нажать enter -> Вставить сюда
amebka

const n_max=100;
var
i,k,s,n:integer;
a:array[1..n_max] of integer;
begin
readln(n);
i:=1; s:=0;
for i:=1 to n do
begin
k:=0;
k:=a[i] mod 2;
if k=0 then  s:=s+a[i]
else  k:=a[i] mod 3;
if k=0 then  s:=s+a[i]
else  k:=a[i] mod 5;
if k=0 then   s:=s+a[i]
else  k:=a[i] mod 7;
if k=0 then   s:=s+a[i];
end;
writeln (s);
end.


у меня она компилируется, но не работает... я не понимаю почему...
Ozzя
amebka
Но мне проще написать заново, чем в чужом коде разбираться. rolleyes.gif

Функция isNotPrime взята из ФАК и переделана. Определяет составное число или нет
Const
  n=5;
var
  i,s : Integer;
  a: array [1..N] of Integer;

function isNotPrime(X: word): boolean;
  var  i: integer;
Begin
  isNotPrime:=true;
  for i:=2 to trunc(sqrt(x)) do
	if x mod i = 0 then Exit;
  isNotPrime:=false
End;

begin
  for i:=1 to N do
	readln(a[i]);
  s:=0;
  for i:=1 to N do
	if isNotPrime(a[i]) then
	  s:=s+a[i];
  Writeln('Summa = ',s);
end.
amebka
да... мне тоже в чужом коде тяжело разбираться.... ( и не работает он у меня что-то (( я ввожу числа массива и ничего не происходит.... (( может, я чего-то не понимаю???
после компиляции нажимаю ctrl+F9 ввожу числа... они вводятся и вводятся... как долго это должно продолжаться, когда массив всего из 5 чисел?
Ozzя
Вводишь одно число, затем Enter.
Так делала?
amebka
Цитата(Ozzя @ 14.03.2006 16:41) *

Вводишь одно число, затем Enter.
Так делала?

Спасибо, без Enter делала - через пробел... ща исправлюсь... а заодно и в своей программе покопаюсь... может заработает...
Ozzя
через пробел - это в Basic'е.
Цитата
может заработает...

Возможно
amebka
Нет, не заработала, хотя я и не понимаю, в чем дело dry.gif
вот программа:
 const n_max=100;
var
i,k,s,n:integer;
a:array[1..n_max] of integer;
begin
readln(n);
readln(a[i]);
i:=1; s:=0;
for i:=1 to n do
 begin
 k:=0;
 k:=a[i] mod 2;
 if k=0 then  s:=s+a[i]
		else  k:=a[i] mod 3;
			  if k=0 then  s:=s+a[i]
			  else  k:=a[i] mod 5;
					if k=0 then   s:=s+a[i]
						   else  k:=a[i] mod 7;
								 if k=0 then   s:=s+a[i];
 end;
writeln (s);
end.


Опишу, что моя программа должна была бы делать... хотя и не делает mega_chok.gif
Начиная с begin...
вводим размер массива (n), который не должен превышать 100
вводим данные в массив
начинается цикл от первого элемента массива до n-го
попадая в цикл кажый элемент проверяется на наличие остатка от деления на числа 2, 3, 5, 7 - это те числа, на которые могут делиться составные числа, кроме как на себя и единицу
если при каком-то из делений остаток (k) равен нулю (т.е. данный элемент массива делится на 2, 3, 5 или 7 без остатка), то к сумме (s), которая изначально равна нулю, прибавляется данный элемент массива
в конце должна вывестись сумма всех составных чисел данного массива...
Ozzя
Цитата
вводим данные в массив

Не вводим!

Код
for i:=1 to n <- забыла!
  readln(a[i]);
amebka
Хорошо...
 const n_max=100;
var
i,k,s,n:integer;
a:array[1..n_max] of integer;
begin
readln(n);
for i:=1 to n do
readln(a[i]);
i:=1; s:=0;
for i:=1 to n do
 begin
 k:=0;
 k:=a[i] mod 2;
 if k=0 then  s:=s+a[i]
		else  k:=a[i] mod 3;
			  if k=0 then  s:=s+a[i]
			  else  k:=a[i] mod 5;
					if k=0 then   s:=s+a[i]
						   else  k:=a[i] mod 7;
								 if k=0 then   s:=s+a[i];
 end;
writeln (s);
end.

Ввожу n=5
дальше ввожу числа 1, 2, 3, 4, 5... ответ получается 43 wink.gif
Ozzя
Проверка:
Код
if (a[i] mod 2=0) or (a[i] mod 3=0) or (a[i] mod 5=0) or (a[i] mod 7=0) then  
  s:=s+a[i];

То есть, если число нацело делится хотя бы на одно из чисел 2,3,5 или 7, оно уже составное.

Наврал wub.gif

Счас проверю, исправлю
amebka
Да)) это работает... осталось только сделать ограничения, что само a(i) не должно быть равно 2, 3, 5 и 7 ))) lol.gif Спасибо)))
volvo
Цитата
осталось только сделать ограничения
yes2.gif
const n_max=100;
var
  i,k,s,n:integer;
  num: integer;
  a:array[1..n_max] of integer;

begin
  readln(n);

  s := 0;
  for i := 1 to n do begin

    readln(a[i]);
    if (a[i] mod 2 = 0) and (a[i] > 2) then s := s + a[i]
    else
      if (a[i] mod 3 = 0) and (a[i] > 3) then s := s + a[i]
      else
        if (a[i] mod 5 = 0) and (a[i] > 5) then s := s + a[i]
        else
          if (a[i] mod 7 = 0) and (a[i] > 7) then s := s + a[i];

  end;


  writeln (s);
end.
Ozzя
Const
  n=5;
var
  k,i,s : Integer;
  p: boolean;
  a: array [1..N] of Integer;

begin
  for i:=1 to N do
	readln(a[i]);
  s:=0;
  for i:=1 to N do
	begin
	  { Проверка }
	  p:=true;
	  k:=2;
	  while p and (sqr(k)<=n) do
		if a[i] mod k=0 then
		  p:=false
		else
		  k:=k+1;
	  { Подсчет суммы }
	  if p then
		s:=s+a[i];
	 end;
  Writeln('Summa = ',s);
end.
amebka
Все))) заработало))))))))
Огромное всем спасибо))))

Код
num: integer;
- а это что???

и еще надо букву k убрать из начала...
Ozzя
give_rose.gif

Уфф, ура good.gif
amebka
Цитата(Ozzя @ 14.03.2006 17:31) *

Const
  n=5;
var
  k,i,s : Integer;
  p: boolean;
  a: array [1..N] of Integer;

begin
  for i:=1 to N do
	readln(a[i]);
  s:=0;
  for i:=1 to N do
	begin
	  { Проверка }
	  p:=true;
	  k:=2;
	  while p and (sqr(k)<=n) do
		if a[i] mod k=0 then
		  p:=false
		else
		  k:=k+1;
	  { Подсчет суммы }
	  if p then
		s:=s+a[i];
	 end;
  Writeln('Summa = ',s);
end.


при вводе 1, 2, 3, 4, 5 выдает 9... а должна выдать 4...
Ozzя
Цитата
if not p then


А 1 и 2 - это простые числа?
Еще и их надо отслеживать
amebka
Цитата(Ozzя @ 14.03.2006 17:39) *

А 1 и 2 - это простые числа?
Еще и их надо отслеживать

2 надо... а 1 нет - на него мы не делим...
Ozzя
Const
  n=5;
var
  k,i,s : Integer;
  p: boolean;
  a: array [1..N] of Integer;

begin
  for i:=1 to N do
	readln(a[i]);
  s:=0;
  for i:=1 to N do
	begin
	  { Проверка }
	  p:=true;
	  k:=2;
	  while p and (sqr(k)<=n) do
		begin
		if (a[i] = 1) or (a[i] = 2) then
		  break;
		  if a[i] mod k=0 then
			p:=false
		  else
			k:=k+1;
		end;
	  { суммирование }
	  if not p then
		s:=s+a[i];
	 end;
  Writeln('Summa = ',s);
end.
amebka
Вот три рабочие программы:
 const n_max=100;
var
  i,s,n:integer;
  a:array[1..n_max] of integer;

begin
  writeln ('Razmer massiva raven ');
  readln(n);

  s := 0;
  writeln ('Elementy massiva:');

  for i := 1 to n do begin

	readln(a[i]);
	if (a[i] mod 2 = 0) and (a[i] <> 2) then s := s + a[i]
	else
	  if (a[i] mod 3 = 0) and (a[i] <> 3) then s := s + a[i]
	  else
		if (a[i] mod 5 = 0) and (a[i] <> 5) then s := s + a[i]
		else
		  if (a[i] mod 7 = 0) and (a[i] <> 7) then s := s + a[i];

  end;


  writeln ('Summa = ', s);
end.

и
 Const
  n=5;
var
  i,s : Integer;
  a: array [1..N] of Integer;

function isNotPrime(X: word): boolean;
  var  i: integer;
Begin
  isNotPrime:=true;
  for i:=2 to trunc(sqrt(x)) do
	if x mod i = 0 then Exit;
  isNotPrime:=false
End;

begin
  for i:=1 to N do
	readln(a[i]);
  s:=0;
  for i:=1 to N do
	if isNotPrime(a[i]) then
	  s:=s+a[i];
  Writeln('Summa = ',s);
end.


и
Const
  n=5;
var
  k,i,s : Integer;
  p: boolean;
  a: array [1..N] of Integer;

begin
  for i:=1 to N do
	readln(a[i]);
  s:=0;
  for i:=1 to N do
	begin
	  { Проверка }
	  p:=true;
	  k:=2;
	  while p and (sqr(k)<=n) do
		begin
		if (a[i] = 1) or (a[i] = 2) then
		  break;
		  if a[i] mod k=0 then
			p:=false
		  else
			k:=k+1;
		end;
	  { суммирование }
	  if not p then
		s:=s+a[i];
	 end;
  Writeln('Summa = ',s);
end.

(Во второй и третьей массив состоит из 5 элементов, а в первой размер массива надо вводить...)

Спасибо большое всем за помощь и поддержку... give_rose.gif
Ozzя
Шампанское в студию! give_rose.gif
amebka
Цитата(Ozzя @ 14.03.2006 17:49) *

Шампанское в студию! give_rose.gif

Отдельное спасибо smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.