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 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Новичок
*

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

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


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

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


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

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

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


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

Сообщений в этой теме


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

 





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