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®;
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®;
writeln('введенный список');
printList(L);
readln
end.



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

Сообщение отредактировано: Insomnia -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 8)
сообщение
Сообщение #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®;
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®;
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

 





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