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

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

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

 
 Ответить  Открыть новую тему 
> списки. произведение чисел
Insomnia
сообщение 25.06.2011 11:49
Сообщение #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 - 25.06.2011 11:52
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 25.06.2011 12:02
Сообщение #2


a.k.a. volvo877
*****

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

Репутация: -  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 
 К началу страницы 
+ Ответить 
Insomnia
сообщение 25.06.2011 12:28
Сообщение #3


Новичок
*

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

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


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

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


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

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

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


хм. почему не нужна? я ввожу числа, рекурсивно заходя в процедуру, добавляю их в хвост. разве инфо не присваивается мой эелемент е?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Insomnia
сообщение 25.06.2011 12:49
Сообщение #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 - 25.06.2011 12:54
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
IUnknown
сообщение 25.06.2011 13:08
Сообщение #5


a.k.a. volvo877
*****

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

Репутация: -  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 - 25.06.2011 13:08
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Insomnia
сообщение 25.06.2011 13:15
Сообщение #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 
 К началу страницы 
+ Ответить 
Krjuger
сообщение 25.06.2011 14:10
Сообщение #7


Профи
****

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

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


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


a.k.a. volvo877
*****

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

Репутация: -  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 
 К началу страницы 
+ Ответить 
Insomnia
сообщение 25.06.2011 14:48
Сообщение #9


Новичок
*

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

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


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

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

 

- Текстовая версия 28.07.2025 0:02
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"