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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.08.2008, 23:30   #11
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Задача №3.
Что-то у Вас неправильно написано в строке
write (rus('Введите максимальное число массива '), 'MAX= ');
при перекопировании трудно понять. Вы русские буквы в код программы не копируйте, а вводите вручную, может получиться разная кодировка и программа не будет правильно работать. Добавил функцию проверки чисел на простоту, а то делать это вручную с каждым элементом массива очень трудно.
Вот код, который работает. При публикации кода в сообщении обрамляйте его тегами Code (кнопка в виде решетки над окном сообщения.)
На всякий случай приложу проект.

Код:
program Project2;
{$APPTYPE CONSOLE}
uses
  SysUtils;

function rus(s:string):string;
var
i:integer;
begin
for i:=1 to length (s) do case s [i] of
'À'..'ï': s[i]:=chr(ord(s[i])-64);
'ð'..'ÿ': s[i]:=chr(ord(s[i])-16);
end;
rus:=s;
end;
function Prost(n:integer):boolean;
var i:integer;
begin
  Prost:=true;
  for i:=2 to (n div 2) do
  if n mod i=0 then
      begin
        Prost:=false;
        break;
      end
end;

var max:integer;
    a,b:array[1..100] of integer;
    i,j,k:integer;
begin
write (rus('Введите максимальное число массива '),'MAX= ');
readln(max);
j:=0;
for i:=1 to max do
if max mod i=0 then
   begin
    j:=j+1;
    a[j]:=i;
   end;
writeln (rus('Массив А: '));
for i:=1 to j do
write(a[i],' ');
writeln;
k:=0;
for i:=1 to j do
if Prost(a[i]) then
   begin
     k:=k+1;
     b[k]:=a[i];
   end;
writeln (rus('Массив B: '));
for i:=1 to k do
write(b[i],' ');
readln
end.
Вложения
Тип файла: rar Простые делители.rar (23.8 Кб, 6 просмотров)
puporev вне форума Ответить с цитированием
Старый 11.09.2008, 14:56   #12
Аннюточка
 
Регистрация: 28.08.2008
Сообщений: 7
По умолчанию

Здравствуйте, помогите, пожалуйста, разобраться с функциями и процедурами. Хотела в этой задаче удаление нолей сделать как процедуру

Код:

Код:
uses crt;
var a:array[1..100] of integer;
    n,i,k,x:integer;
{Opredelenie pervoj cifry}
function Cifr(x:integer):byte;
var s:string;
    t,c:integer;
begin
str(x,s);
val(s[1],t,c);
Cifr:=t;
end;
begin
clrscr;
randomize;
write('n=');readln(n);
writeln('Ishodnyj massiv:');
for i:=1 to n do
   begin
    a[i]:=random(100);
    write(a[i],' ');
   end;
writeln;
{Udalenie nolej}
for i:=n downto 1 do
if a[i]=0 then
  begin
    for k:=i to n-1 do
    a[k]:=a[k+1];
    n:=n-1;
  end;
{Sortirovka po pervoj cifre}
for i:=1 to n-1 do
for k:=1 to n-1 do
if Cifr(a[k])>Cifr(a[k+1])then
   begin
    x:=a[k];
    a[k]:=a[k+1];
    a[k+1]:=x;
   end;
writeln('Rezultat:');
for i:=1 to n do
write(a[i],' ');
readln
end.
Процедуру оформила вот так:
Код:
procedure UdalenieNolej(k,n,i:integer; var x:array of integer);
  begin
  for i:=n downto 1 do
  if x[i]=0 then
begin
    for k:=i to n-1 do
    x[k]:=x[k+1];
    n:=n-1;
  end;
  end;
если ноль первый, то не удаляется, а на остальных позициях заменяется на предшествующий элемент. Скажите в чем у меня тут ошибка, как нужно правильно записывать переменные в процедуре?
Аннюточка вне форума Ответить с цитированием
Старый 11.09.2008, 15:27   #13
rainbow
Форумчанин
 
Регистрация: 06.09.2008
Сообщений: 156
По умолчанию

Цитата:
Сообщение от Аннюточка Посмотреть сообщение
как нужно правильно записывать переменные в процедуре?
Код:
procedure <имя_процедуры> [(<список_параметров>)];

Список параметров

В заголовке подпрограммы (в ее объявлении) указывается список формальных параметров переменных, которые принимают значения, передаваемые в подпрограмму извне во время ее вызова. Для краткости мы далее будем опускать слово "формальный".

Поскольку внутри подпрограммы параметры рассматриваются как переменные с начальным значением, то имена локальных переменных, описываемые в разделе var (внутреннем для подпрограммы), не могут совпадать с именами параметров этой же подпрограммы. Подробнее о локальных и глобальных переменных мы расскажем в пункте "Разграничение контекстов".

Список параметров может и вовсе отсутствовать: 

procedure proc1;
function func1: boolean;

В этом случае подпрограмма не получает никаких переменных "извне". Упомянутый в начале лекции песенный припев как раз и является примером подпрограммы, в которую не передается никаких данных при вызове.

Однако отсутствие параметров и, как следствие, передаваемых извне значений вовсе не означает, что при каждом вызове подпрограмма будет выполнять абсолютно одинаковые действия. Поскольку глобальные переменные видны изнутри любой подпрограммы, их значения могут неявно изменять внутреннее состояние подпрограмм. Этому очень нежелательному эффекту будет посвящен пункт "Побочный эффект".

Если же параметры имеются, то каждый из них описывается по следующему шаблону:

[<способ_подстановки>]<имя_параметра>:<тип>;

О возможных способах подстановки значений в параметры (<пустой>, var, const) мы расскажем в разделе "Способы подстановки аргументов".

Если способ подстановки и тип нескольких параметров совпадают, описание этих параметров можно объединить:

[<способ_подстановки>]<имя1>,...,<имяN>: <тип>;

Пример описания всех трех способов подстановки:

function func2(a,b:byte; var x,y,z:real; const c:char);

В заголовке подпрограммы можно указывать только простые (не составные) типы данных. Следовательно, попытка записать

procedure proc2(a: array[1..100]of char);

вызовет ошибку уже на этапе компиляции. Для того чтобы обойти это ограничение, составной тип данных нужно описать в разделе type, а при объявлении подпрограммы воспользоваться именем этого типа:

type arr = array[1..100] of char;
procedure proc2(a: arr);
function func2(var x: string): arr;
Ужас, как я устал от тупизны...

Последний раз редактировалось rainbow; 11.09.2008 в 18:30.
rainbow вне форума Ответить с цитированием
Старый 11.09.2008, 15:35   #14
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Во первых само тело процедуры написано неправильно, так у Вас действительно будет удаляться что попало, а ноли могут остаться.
Кроме того у Вас n в процедуре меняется, поэтому нужно
(var x:array of integer;var n:integer);
остальные переменные локальные и их в параметры включать не надо.
Короче будет так :
Код:
procedure UdalenieNolej(var x:array of integer;var n:integer);
var
i,k:integer;
begin
i:=1;
while i<=n do
   begin
    if x[i]=0 then
      begin
        for k:=i to n-1 do
        x[k]:=x[k+1];
        n:=n-1;
      end;
    i:=i+1;
  end;
end;
При вызове процедуры естественно напишете оба параметра, фактически используемые в программе. Они могут отличаться от формальных параметров процедуры, например:
UdalenieNolej(a,m);

Последний раз редактировалось puporev; 11.09.2008 в 15:41.
puporev вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
задачи по массивам - помогите !!! Heidi Паскаль, Turbo Pascal, PascalABC.NET 18 18.12.2010 15:37
Помогите студенту решить задачи traden24 Microsoft Office Excel 3 18.12.2007 12:16