![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
Insomnia |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 49 Пол: Мужской Репутация: ![]() ![]() ![]() |
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 |
IUnknown |
![]()
Сообщение
#2
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата не могу понять, пишет что 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; // <--- !!!
|
Insomnia |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Сообщений: 49 Пол: Мужской Репутация: ![]() ![]() ![]() |
Я тебе даже больше скажу: можно вообще изменять L внутри функции, все равно это параметр - значение, и его изменение останется только внутри функции, наружу не выйдет, снаружи будет то же значение, которое было при вызове функции. понял. действительно ошибки больше нет. А вот насчет info - это твой косяк: Ну, и откуда здесь программа должна взять значение info, если ты ничего не присвоил этой переменной перед вызовом процедуры? В чем вообще смысл create_spisok, ты можешь объяснить? Если я перепишу твой код БЕЗ использования этой процедуры, и он будет правильно работать - что будет? хм. почему не нужна? я ввожу числа, рекурсивно заходя в процедуру, добавляю их в хвост. разве инфо не присваивается мой эелемент е? |
Insomnia |
![]()
Сообщение
#4
|
Новичок ![]() Группа: Пользователи Сообщений: 49 Пол: Мужской Репутация: ![]() ![]() ![]() |
я исправил почти все недочеты, оставил процедуру создание списка.
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 |
IUnknown |
![]()
Сообщение
#5
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Так...
Ты объясни мне, ты действительно считаешь, что Цитата 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 присваиваю начало списка. может совершенно правильно отработать (а она работает:введите кол-во чисел ), или опять прикалываешься? просто интересно, ты тут выкладываешь то, что запускаешь у себя, или это вообще РАЗНЫЕ исходники? Или у тебя компилятору пора на свалку? Сообщение отредактировано: IUnknown - 25.06.2011 13:08 |
Insomnia |
![]()
Сообщение
#6
|
Новичок ![]() Группа: Пользователи Сообщений: 49 Пол: Мужской Репутация: ![]() ![]() ![]() |
да блин. пень я. увидел . работает все
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 параметру. я же не изменяю сам список |
Krjuger |
![]()
Сообщение
#7
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 652 Пол: Мужской Реальное имя: Алексей Репутация: ![]() ![]() ![]() |
А как ты собираешся работать с p,если не сделаеш p:=L;,а если у тебя не будет L,то что тогда присвоится p.
|
IUnknown |
![]()
Сообщение
#8
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата правда не пойму, зачем передаю по 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, конечно. |
Insomnia |
![]()
Сообщение
#9
|
Новичок ![]() Группа: Пользователи Сообщений: 49 Пол: Мужской Репутация: ![]() ![]() ![]() |
если убираю var, то тут же не компилируется p:=L . Без p вообще все то же хорошо работает. спасибо
|
![]() ![]() |
![]() |
Текстовая версия | 28.07.2025 0:02 |