Консультация № 188364
08.12.2015, 21:27
0.00 руб.
13.12.2015, 13:37
0 4 0
Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
Здравствуйте. Написал программу, мне нужно было организовать стек дисциплин: хранить название дисциплины и количество часов. Программа вроде работает, но при вводе более 5 строк, она вылетает, кто может помочь и объяснить, в чем дело? Мне кажется дело в распределении памяти, но возможно ошибаюсь...
Код программы:
[code lang=pascal]//12. Организовать стек дисциплин: хранить название дисциплины и количество часов.
Unit Unit1;

interface

uses System, System.Drawing, System.Windows.Forms, Unit2;

type
Form1 = class(Form)
procedure show;
procedure saveFile;
procedure button1_Click(sender: Object; e: EventArgs);
procedure button2_Click(sender: Object; e: EventArgs);
procedure button3_Click(sender: Object; e: EventArgs);
procedure toolStripMenuItem5_Click(sender: Object; e: EventArgs);
procedure toolStripMenuItem4_Click(sender: Object; e: EventArgs);
procedure label1_Click(sender: Object; e: EventArgs);
{$region FormDesigner}
private
{$resource Unit1.Form1.resources}
listBox1: ListBox;
menuStrip1: MenuStrip;
toolStripMenuItem1: ToolStripMenuItem;
toolStripMenuItem4: ToolStripMenuItem;
toolStripMenuItem5: ToolStripMenuItem;
textBox1: TextBox;
textBox2: TextBox;
label1: &Label;
label2: &Label;
button1: Button;
button2: Button;
openFileDialog1: OpenFileDialog;
saveFileDialog1: SaveFileDialog;
button3: Button;
{$include Unit1.Form1.inc}
{$endregion FormDesigner}
public
constructor;
begin
InitializeComponent;
end;
end;

implementation

var stk:= new Stack;
p: pnode; //указатель на следующий элемент

procedure Form1.show;
begin
var stArr: array of string;
stArr:= stk.toStr;
listBox1.Items.Clear;
for var i:=low(stArr) to high(stArr) do
if i mod 2 = 0 then
listBox1.Items.Add('Название предмета: ' + stArr[i] + ' ' + 'Количество часов: ' + stArr[i+1]);
end;



procedure Form1.saveFile;
begin
if saveFileDialog1.ShowDialog = System.Windows.Forms.DialogResult.OK then
try
writeAllLines(saveFileDialog1.FileName, stk.toStr);//создает новый файл и записывает в него строки из массив
except
messageBox.Show('Неудалось сохранить файл');
end;
end;

procedure Form1.button1_Click(sender: Object; e: EventArgs);// "Добавить"
begin
try
stk.add(textBox1.Text,StrToInt(textBox2.Text));
except
on System.FormatException do messageBox.Show('Входная строка имела неверный формат');
end;
show;
end;

procedure Form1.button2_Click(sender: Object; e: EventArgs);// "Удалить"
begin
try
stk.del;
except
on System.NullReferenceException do messageBox.show('Нечего удалять!');
end;
show;
end;

procedure Form1.button3_Click(sender: Object; e: EventArgs); // "Редактировать"
begin
try
stk.red(textBox1.Text, StrToInt(textBox2.text));
except
on System.FormatException do messageBox.Show('Входная строка имела неверный формат');
end;
show;
end;


procedure Form1.toolStripMenuItem5_Click(sender: Object; e: EventArgs);
begin
halt;
end;

procedure Form1.toolStripMenuItem4_Click(sender: Object; e: EventArgs);
begin
saveFile;
end;

procedure Form1.label1_Click(sender: Object; e: EventArgs);
begin

end;

end.[/code]

и вот:
[code lang=pascal]unit Unit2;

interface

type
pnode = ^node;

node = record
predmet: string;
hours: integer;
next: pnode;
end;

Stack = class
private
top: pnode;
public
procedure add(m:string; y:integer);
procedure del;
procedure red(m:string; y:integer);
function toStr: array of string;
end;

implementation

procedure Stack.add(m:string; y:integer);
var
p: pnode;//указатель на следующий элемент
begin
new(p);
p^.predmet := m;
p^.hours := y;
p^.next := top;
top := p;
end;

procedure Stack.del;
var
p: pnode;
begin
p:= top^.next;
dispose(top);
top:= p;
end;

procedure Stack.red(m: string; y: integer); //Редактировать
begin
top^.predmet := m;
top^.hours := y;
end;

function Stack.toStr: array of string;
var
i: integer;
p: pnode;
begin
p:= top;
i:= 0;
while p <> nil do
begin
setLength(result, i+2);
writeln(p^.predmet);
if i mod 2 = 0 then
begin
result[i] := p^.predmet;
result[i+1] := intToStr(p^.hours);
end;
inc(i);
inc(i);
p:= p^.next;
end;
writeln(result);
end;

end.[/code]

Обсуждение

давно
Мастер-Эксперт
425
4118
09.12.2015, 05:48
общий
Адресаты:
К сожалению Ваша ссылка заблокирована.
Вылодите свой код в сообщение мини-форума вопроса.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Посетитель
399158
228
09.12.2015, 08:36
общий
09.12.2015, 11:37
[code lang=pascal]//12. Организовать стек дисциплин: хранить название дисциплины и количество часов.
Unit Unit1;

interface

uses System, System.Drawing, System.Windows.Forms, Unit2;

type
Form1 = class(Form)
procedure show;
procedure saveFile;
procedure button1_Click(sender: Object; e: EventArgs);
procedure button2_Click(sender: Object; e: EventArgs);
procedure button3_Click(sender: Object; e: EventArgs);
procedure toolStripMenuItem5_Click(sender: Object; e: EventArgs);
procedure toolStripMenuItem4_Click(sender: Object; e: EventArgs);
procedure label1_Click(sender: Object; e: EventArgs);
{$region FormDesigner}
private
{$resource Unit1.Form1.resources}
listBox1: ListBox;
menuStrip1: MenuStrip;
toolStripMenuItem1: ToolStripMenuItem;
toolStripMenuItem4: ToolStripMenuItem;
toolStripMenuItem5: ToolStripMenuItem;
textBox1: TextBox;
textBox2: TextBox;
label1: &Label;
label2: &Label;
button1: Button;
button2: Button;
openFileDialog1: OpenFileDialog;
saveFileDialog1: SaveFileDialog;
button3: Button;
{$include Unit1.Form1.inc}
{$endregion FormDesigner}
public
constructor;
begin
InitializeComponent;
end;
end;

implementation

var stk:= new Stack;
p: pnode; //указатель на следующий элемент

procedure Form1.show;
begin
var stArr: array of string;
stArr:= stk.toStr;
listBox1.Items.Clear;
for var i:=low(stArr) to high(stArr) do
if i mod 2 = 0 then
listBox1.Items.Add('Название предмета: ' + stArr[i] + ' ' + 'Количество часов: ' + stArr[i+1]);
end;



procedure Form1.saveFile;
begin
if saveFileDialog1.ShowDialog = System.Windows.Forms.DialogResult.OK then
try
writeAllLines(saveFileDialog1.FileName, stk.toStr);//создает новый файл и записывает в него строки из массив
except
messageBox.Show('Неудалось сохранить файл');
end;
end;

procedure Form1.button1_Click(sender: Object; e: EventArgs);// "Добавить"
begin
try
stk.add(textBox1.Text,StrToInt(textBox2.Text));
except
on System.FormatException do messageBox.Show('Входная строка имела неверный формат');
end;
show;
end;

procedure Form1.button2_Click(sender: Object; e: EventArgs);// "Удалить"
begin
try
stk.del;
except
on System.NullReferenceException do messageBox.show('Нечего удалять!');
end;
show;
end;

procedure Form1.button3_Click(sender: Object; e: EventArgs); // "Редактировать"
begin
try
stk.red(textBox1.Text, StrToInt(textBox2.text));
except
on System.FormatException do messageBox.Show('Входная строка имела неверный формат');
end;
show;
end;


procedure Form1.toolStripMenuItem5_Click(sender: Object; e: EventArgs);
begin
halt;
end;

procedure Form1.toolStripMenuItem4_Click(sender: Object; e: EventArgs);
begin
saveFile;
end;

procedure Form1.label1_Click(sender: Object; e: EventArgs);
begin

end;

end.[/code]
давно
Посетитель
399158
228
09.12.2015, 08:36
общий
09.12.2015, 11:39
и вот:

[code lang=pascal]unit Unit2;

interface

type
pnode = ^node;

node = record
predmet: string;
hours: integer;
next: pnode;
end;

Stack = class
private
top: pnode;
public
procedure add(m:string; y:integer);
procedure del;
procedure red(m:string; y:integer);
function toStr: array of string;
end;

implementation

procedure Stack.add(m:string; y:integer);
var
p: pnode;//указатель на следующий элемент
begin
new(p);
p^.predmet := m;
p^.hours := y;
p^.next := top;
top := p;
end;

procedure Stack.del;
var
p: pnode;
begin
p:= top^.next;
dispose(top);
top:= p;
end;

procedure Stack.red(m: string; y: integer); //Редактировать
begin
top^.predmet := m;
top^.hours := y;
end;

function Stack.toStr: array of string;
var
i: integer;
p: pnode;
begin
p:= top;
i:= 0;
while p <> nil do
begin
setLength(result, i+2);
writeln(p^.predmet);
if i mod 2 = 0 then
begin
result[i] := p^.predmet;
result[i+1] := intToStr(p^.hours);
end;
inc(i);
inc(i);
p:= p^.next;
end;
writeln(result);
end;

end.
[/code]
давно
Мастер-Эксперт
425
4118
09.12.2015, 11:41
общий
Адресаты:
Теперь расскажите, каким образом Вы строки вводите.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Форма ответа