IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> списки. произведение чисел
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 49
Пол: Мужской

Репутация: -  0  +


program proizv_4isel;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  windows;

type
  Tinfo= integer;
  TList=^TElem;
  TElem= record
           info: Tinfo;
           next: TList;
         end;

procedure create_spisok (var p:TList; info:Tinfo); // создание списка
begin
  if p<>nil then create_spisok (p^.next,info)
            else begin
                   new(p);
                   p^.info:=info;
                   p^.next:=nil
                 end;

end;

procedure zap_spisok (var p:TList; n:integer); // заполнение списка
var e,i: integer;
begin
  if n<0 then begin
                 writeln ('список создать нельзя');
                 readln;
                 exit
               end
          else
  if n=0 then begin
                writeln ('список пуст');
                readln;
               exit
              end;
  if n>0 then
          begin
  for i:=1 to n do
  begin
    writeln('введите числа');
    readln(e);
    create_spisok(p,e)
  end;
               end;
end;

//ищем произведение чисел
function Proiz (L,p: TList): Tinfo;

begin
  p:=L;
  result:=0;
  while p<>nil do
  begin
    result:=result+p^.info;
    p:=p^.next;
  end;
end;

//печать
procedure Print_Proizv (r: Tinfo);
begin
  writeln('произведение чисел= ');
  writeln(r);
end;

// печать списка
procedure printList (l: TList);
var
  p: TList;
begin
  p:=L;
  while p<>nil do
  begin
    write(p^.info,' ');
    p:=p^.next;
  end;
  writeln;
end;


var
  p,L: TList;
  r,n,info: Tinfo;
begin
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
  writeln('введите кол-во чисел');
  readln(n);
  Create_spisok(L,info);
  zap_spisok(L,n);
  r:=proiz(L,p);
  Print_proizv(r);
  writeln('введенный список');
  printList(L);
  readln
end.



не могу понять, пишет что p и info не могут быть инизиализированны. решил посмотреть какой список выводит, так он мне кроме вводимых чисел еще и 5 сначала выводит. откуда появилась, ума не приложу. и произведение считает не правильно. так вроде подумать, все элементарно, но не могу увидеть как исправить ошибки в алгоритмах..

Сообщение отредактировано: Insomnia -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
не могу понять, пишет что p и info не могут быть инизиализированны.
Неправда. Пишет, что p и info могут быть НЕинициализированы, а это - разные вещи. Насчет p - компилятор прав абсолютно. Зачем ты передаешь его в качестве параметра, если можно описать локальной переменной - непонятно:

function Proiz (L: TList): Tinfo;
var p : TList;
begin
  p:=L;
  result:=0;
  while p<>nil do
  begin
    result:=result+p^.info;
    p:=p^.next;
  end;
end;
, и предупреждения как не бывало. Я тебе даже больше скажу: можно вообще изменять L внутри функции, все равно это параметр - значение, и его изменение останется только внутри функции, наружу не выйдет, снаружи будет то же значение, которое было при вызове функции.

А вот насчет info - это твой косяк:
Цитата
procedure create_spisok (var p:TList; info:Tinfo); // создание списка
// ...
   p^.info:=info; // <--- !!!

Ну, и откуда здесь программа должна взять значение info, если ты ничего не присвоил этой переменной перед вызовом процедуры? В чем вообще смысл create_spisok, ты можешь объяснить? Если я перепишу твой код БЕЗ использования этой процедуры, и он будет правильно работать - что будет?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 49
Пол: Мужской

Репутация: -  0  +


Цитата(IUnknown @ 25.06.2011 13:02) *

Я тебе даже больше скажу: можно вообще изменять L внутри функции, все равно это параметр - значение, и его изменение останется только внутри функции, наружу не выйдет, снаружи будет то же значение, которое было при вызове функции.


понял. действительно ошибки больше нет.

Цитата(IUnknown @ 25.06.2011 13:02) *

А вот насчет info - это твой косяк:
Ну, и откуда здесь программа должна взять значение info, если ты ничего не присвоил этой переменной перед вызовом процедуры? В чем вообще смысл create_spisok, ты можешь объяснить? Если я перепишу твой код БЕЗ использования этой процедуры, и он будет правильно работать - что будет?


хм. почему не нужна? я ввожу числа, рекурсивно заходя в процедуру, добавляю их в хвост. разве инфо не присваивается мой эелемент е?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 49
Пол: Мужской

Репутация: -  0  +


я исправил почти все недочеты, оставил процедуру создание списка.
program proizv_4isel;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  windows;

type
  Tinfo= integer;
  TList=^TElem;
  TElem= record
           info: Tinfo;
           next: TList;
         end;

procedure create_spisok (var p:TList; info:Tinfo); // создание списка
begin
  if p<>nil then create_spisok (p^.next,info)
            else begin
                   new(p);
                   p^.info:=info;
                   p^.next:=nil
                 end;

end;

procedure zap_spisok (var p:TList; n:integer); // заполнение списка
var i: integer;
      e: Tinfo;
begin
  if n<0 then begin
                 writeln ('список создать нельзя');
                 readln;
                 exit
               end
          else
  if n=0 then begin
                writeln ('список пуст');
                readln;
               exit
              end;
  if n>0 then
          begin
  for i:=1 to n do
  begin
    writeln('введите числа');
    readln(e);
    create_spisok(p,e)
  end;
               end;
end;

//ищем произведение чисел
function Proiz (L: TList): Tinfo;
var
  p: Tlist;

begin
  p:=L;  
  result:=0;
  while p<>nil do
  begin
    result:=result+p^.info;
    p:=p^.next;
  end;
end;

//печать
procedure Print_Proizv (r: Tinfo);
begin
  writeln('произведение чисел= ');
  writeln(r);
end;

// печать списка
procedure printList (l: TList);
var
  p: TList;
begin
  p:=L;
  while p<>nil do
  begin
    write(p^.info,' ');
    p:=p^.next;
  end;
  writeln;
end;


var
  L: TList;
  r,n: Tinfo;
begin
  SetConsoleCP(1251);
  SetConsoleOutputCP(1251);
  writeln('введите кол-во чисел');
  readln(n);
  zap_spisok(L,n);
  r:=proiz(L);
  Print_proizv(r);
  writeln('введенный список');
  printList(L);
  readln
end.


но когда ищу произведение не хочет компилировать 1 срочку, когда я эл-ту p присваиваю начало списка.

Сообщение отредактировано: Insomnia -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Так...

Ты объясни мне, ты действительно считаешь, что
Цитата
function Proiz (L: TList): Tinfo;
var
  p: Tlist;
begin
  p:=L;  
  result:=0;
  while p<>nil do
  begin
    result:=result+p^.info; // Сложение чисел
    p:=p^.next;
  end;
end;
- это поиск ПРОИЗВЕДЕНИЯ, или прикалываешься? Ты действительно считаешь, что программа, которая
Цитата
не хочет компилировать 1 срочку, когда я эл-ту p присваиваю начало списка.
может совершенно правильно отработать (а она работает:
введите кол-во чисел
5
введите числа
1
введите числа
2
введите числа
3
введите числа
4
введите числа
5
произведение чисел=
15
введенный список
1 2 3 4 5


), или опять прикалываешься? просто интересно, ты тут выкладываешь то, что запускаешь у себя, или это вообще РАЗНЫЕ исходники? Или у тебя компилятору пора на свалку?

Сообщение отредактировано: IUnknown -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 49
Пол: Мужской

Репутация: -  0  +


да блин. пень я. увидел . работает все
function Proiz (var L: TList): Tinfo;
var
  p: TList;

begin
  result:=1;
  p:=L;
  while p<>nil do
  begin
    result:=result*p^.info;
    p:=p^.next;
  end;
end;


правда не пойму, зачем передаю по var параметру. я же не изменяю сам список
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


А как ты собираешся работать с p,если не сделаеш p:=L;,а если у тебя не будет L,то что тогда присвоится p.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
правда не пойму, зачем передаю по var параметру. я же не изменяю сам список
Вот и я не пойму, зачем ты добавил Var. И без него все точно так же прекрасно работает. Как сделать вообще без P, я тоже уже говорил:

function Proiz (L: TList) : Tinfo;
begin
   result := 1;
   while L <> nil do
   begin
      result := result * L^.info;
      L := L^.next;
   end;
end;
И этот вариант тоже работает. Если произведение помещается в тип TInfo, конечно.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 49
Пол: Мужской

Репутация: -  0  +


если убираю var, то тут же не компилируется p:=L . Без p вообще все то же хорошо работает. спасибо
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 20.04.2025 7:27
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name