Re: Таблиці - відфільтрувати записи з данними про холодильники (продовж.)
misha_beginner
А що це Ви на російську перейшли?
виправлено, а просто перевтомився дуже, вибачаюсь
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → Pascal/Delphi → Таблиці - відфільтрувати записи з данними про холодильники (продовж.)
Сторінки Попередня 1 2 3 4 5 6 Наступна
Для відправлення відповіді ви повинні увійти або зареєструватися
misha_beginner
А що це Ви на російську перейшли?
виправлено, а просто перевтомився дуже, вибачаюсь
const
n=4;
virobn:array[1..n] of string[45]=('Samsung' , 'Atlant' , 'Lg' , 'Boshch');
nazva:array[1..n] of string[50]=('Samsung-3400' , 'Atlant-200' , 'Lg-120' , 'Boshch-9000');
kamera:array[1..n] of real=(1,2,3,3);
rik:array[1..n] of integer=(1993,1993,1999,2000);
misce:array[1..n] of string[45]=('Korea' , 'Russia' , 'Japan' , 'Japan');
cina:array[1..n] of integer=(13000 , 19000 , 12500 , 14500);
kilkist:array[1..n] of real=(1,1,1,1);
type
xolod = record
vr:string[50];
nv:string[45];
kr:real;
rk:integer;
misc:string[45];
cn:real;
kst:real;
end;
var
i:integer;
f:text;
sh:xolod;
Procedure stvor;
var
j:integer;
begin
Assign(f,'zadolbalo.txt');
Rewrite(f);
for j:=1 to n do
writeln(f, virobn[j]:10,'|',
nazva[j]:15,'|',
kamera[j]:16,'|',
rik[j]:4,'|',
misce[j]:9,'|',
cina[j]:9,'|',
kilkist[j]:9,'|'
);
Close(f);
End;
Procedure vvid;
begin
Assign(f, 'zadolbalo.txt');
Append(f);
Writeln('Vvedenna dannix');
with sh do
begin
Write('virobn:');
readln(vr);
Write('nazvanie:');
readln(nv);
Write('kamera:');
readln(kr);
Write('rik:');
readln(rk);
Write('misce:');
readln(misc);
Write('cina:');
readln(cn);
Write('kilkist:');
readln(kst);
writeln(f, vr:10, nv:15, kr:16, rk:4, misc:9, cn:9, kst:9);
end;
Close(f);
End;
Procedure Zagol;
begin
writeln('-----------------------------------------------------------------------');
writeln('| Виробництво | Назва | Обэм Камери | Рік | Місце | Ціна | Кількість|');
writeln('-----------------------------------------------------------------------');
End;
Procedure Vuvid;
var
sss:string;
begin
assign(f, 'zadolbalo.txt');
Reset(f);
while not eof(f) do
begin
readln(f, sss);
writeln(sss);
end;
Close(f);
writeln('-----------------------------------------------------------------------');
End;
Procedure obrobka;
var
sss:string;
j : integer;
begin
j := 0;
Zagol;
Assign(f, 'zadolbalo.txt');
Reset(f);
while not eof(f) do
begin
readln(f, sss);
If (rik[j] = 1993) then
writeln(sss);
end;
Close(f);
End;
BEGIN
stvor;
vvid;
vuvid;
obrobka;
End.
Просто відформатував, і ще одну змінну додав
Просто відформатував, і ще одну змінну додав
дякую за форматування проте навіть якщо поставити в умові If sh.rk=1993 то воно не виводить холодильників 1993 року + чомусь не пише в файл, а навіть і якщо пише то знову ж тільки таку таблицю, відфільтровану не пише в файл
ідеї закінчились
▼Прихований текстщо ж робити воно ругається не існує tabl на строке
readln(f,tabl[i].virobn
вообще не знаю чи правильно переробив код .гляніть пліз
Щоб записати інформацію потрібне місце, куди її записувати, якась змінна. У вас немає глобальної змінної tabl, немає такої змінної і у процедурах vivod та obrobka.
Просто відформатував, і ще одну змінну додав
дякую за форматування проте навіть якщо поставити в умові If sh.rk=1993 то воно не виводить холодильників 1993 року + чомусь не пише в файл, а навіть і якщо пише то знову ж тільки таку таблицю, відфільтровану не пише в файл
sh може містити у собі інформацію лише про один холодильник. У цьому випадку про останній із введених. Якщо вам потрібно зберегти інформацію про кілька холодильників, то вам потрібен масив.
sh може містити у собі інформацію лише про один холодильник. У цьому випадку про останній із введених. Якщо вам потрібно зберегти інформацію про кілька холодильників, то вам потрібен масив.
If tabl[i].rik = 1993 then ... write(' |', tabl[i].virobn:10,'|');
write(tabl[i].nazvanie:15,'|',tabl[i].kamera:16,'|', tabl[i].rik:4,'|', tabl[i].misce:9,'|' , tabl[i].cina:9,'|' , tabl[i].kilkist:9,'|');
якось так?
Так, якщо у вас є змінна tabl, яка є масивом. У першому повідомленні теми така була.
ось повний код:
const
n=4;
virobn:array[1..n] of string[45]=('Samsung' , 'Atlant' , 'Lg' , 'Boshch');
nazva:array[1..n] of string[50]=('Samsung-3400' , 'Atlant-200' , 'Lg-120' , 'Boshch-9000');
kamera:array[1..n] of real=(1,2,3,3);
rik:array[1..n] of integer=(1993,1993,1999,2000);
misce:array[1..n] of string[45]=('Korea' , 'Russia' , 'Japan' , 'Japan');
cina:array[1..n] of integer=(13000 , 19000 , 12500 , 14500);
kilkist:array[1..n] of real=(1,1,1,1);
type
xolod = record
vr:string[50];
nv:string[45];
kr:real;
rk:integer;
misc:string[45];
cn:real;
kst:real;
end;
var
i:integer;
f:text;
tabl:xolod;
Procedure stvor;
var
j:integer;
begin
Assign(f,'zadolbalo.txt');
Rewrite(f);
for j:=1 to n do
writeln(f, virobn[j]:10,'|',
nazva[j]:15,'|',
kamera[j]:16,'|',
rik[j]:4,'|',
misce[j]:9,'|',
cina[j]:9,'|',
kilkist[j]:9,'|'
);
Close(f);
End;
Procedure vvid;
begin
Assign(f, 'zadolbalo.txt');
Append(f);
Writeln('Vvedenna dannix');
with tabl do
begin
Write('virobn:');
readln(vr);
Write('nazvanie:');
readln(nv);
Write('kamera:');
readln(kr);
Write('rik:');
readln(rk);
Write('misce:');
readln(misc);
Write('cina:');
readln(cn);
Write('kilkist:');
readln(kst);
writeln(f, vr:10, nv:15, kr:16, rk:4, misc:9, cn:9, kst:9);
end;
Close(f);
End;
Procedure Zagol;
begin
writeln('-----------------------------------------------------------------------');
writeln('| Виробництво | Назва | Обэм Камери | Рік | Місце | Ціна | Кількість|');
writeln('-----------------------------------------------------------------------');
End;
Procedure Vuvid;
var
sss:string;
begin
assign(f, 'zadolbalo.txt');
Reset(f);
while not eof(f) do
begin
readln(f, sss);
writeln(sss);
end;
Close(f);
writeln('-----------------------------------------------------------------------');
End;
Procedure obrobka;
var
sss:string;
j : integer;
begin
Zagol;
Assign(f, 'zadolbalo.txt');
Reset(f);
while not eof(f) do
begin
readln(f, sss);
If (tabl[i].rk = 1993) then
write(' |', tabl[i].virobn:10,'|');
write(tabl[i].nazvanie:15,'|',tabl[i].kamera:16,'|', tabl[i].rik:4,'|', tabl[i].misce:9,'|' , tabl[i].cina:9,'|' , tabl[i].kilkist:9,'|');
writeln(sss);
end;
Close(f);
End;
BEGIN
stvor;
vvid;
vuvid;
obrobka;
End.
Нет индексного свойства по умолчанию для типа xolod на ціх строках
If (tabl[i].rk = 1993) then
write(' |', tabl[i].virobn:10,'|');
write(tabl[i].nazvanie:15,'|',tabl[i].kamera:16,'|', tabl[i].rik:4,'|', tabl[i].misce:9,'|' , tabl[i].cina:9,'|' ,
Змінна tabl у вас є записом xolod, а має бути масивом цих записів. Іще раз даю посилання на статтю про масиви: http://pascal.org.ua/structure-types#array
ось так зробив
const
n=4;
type
xolod = record
vr:string[50];
nv:string[45];
kr:real;
rk:integer;
misc:string[45];
cn:real;
kst:real;
end;
var
i:integer;
f:text;
tabl:xolod;
virobn:array[1..n] of string[45];
nazva:array[1..n] of string[50];
kamera:array[1..n] of real;
rik:array[1..n] of integer;
misce:array[1..n] of string[45];
cina:array[1..n] of integer;
kilkist:array[1..n] of real;
Procedure stvor;
var
j:integer;
begin
Assign(f,'zadolbalo.txt');
Rewrite(f);
for j:=1 to n do
writeln(f, virobn[j]:10,'|',
nazva[j]:15,'|',
kamera[j]:16,'|',
rik[j]:4,'|',
misce[j]:9,'|',
cina[j]:9,'|',
kilkist[j]:9,'|'
);
Close(f);
End;
Procedure vvid;
begin
Assign(f, 'zadolbalo.txt');
Append(f);
Writeln('Vvedenna dannix');
with tabl do
begin
Write('virobn:');
readln(vr);
Write('nazvanie:');
readln(nv);
Write('kamera:');
readln(kr);
Write('rik:');
readln(rk);
Write('misce:');
readln(misc);
Write('cina:');
readln(cn);
Write('kilkist:');
readln(kst);
writeln(f, vr:10, nv:15, kr:16, rk:4, misc:9, cn:9, kst:9);
end;
Close(f);
End;
Procedure Zagol;
begin
writeln('-----------------------------------------------------------------------');
writeln('| Виробництво | Назва | Обэм Камери | Рік | Місце | Ціна | Кількість|');
writeln('-----------------------------------------------------------------------');
End;
Procedure Vuvid;
var
sss:string;
begin
assign(f, 'zadolbalo.txt');
Reset(f);
while not eof(f) do
begin
readln(f, sss);
writeln(sss);
end;
Close(f);
writeln('-----------------------------------------------------------------------');
End;
Procedure obrobka;
var
sss:string;
j : integer;
begin
Zagol;
Assign(f, 'zadolbalo.txt');
Reset(f);
while not eof(f) do
begin
readln(f, sss);
If (rik[i]= 1993) then
write(' |', virobn[i]:10,'|');
write(nazva[i]:15,'|', kamera[i]:16,'|', rik[i]:4,'|', misce[i]:9,'|' , cina[i]:9,'|' , kilkist[i]:9,'|');
writeln(sss);
end;
Close(f);
End;
BEGIN
stvor;
vvid;
vuvid;
obrobka;
End.
помилка на
If (rik[i]= 1993) then
Ошибка времени выполнения: Индекс находился вне границ массива.
Після старту програми змінна i має значення 0, і я не бачу щоб ви це значення десь міняли. Разом з тим, індекси масивів у вас від 1 до n.
Це усе одно, що попросити друга витягти з коробки нульовий олівець, хоча ви щойно домовилися з ним, що перший олівець має номер 1, а останній, скажімо, 12. Що б вам відповів ваш друг? От і комп'ютер вас не розуміє.
Після старту програми змінна i має значення 0, і я не бачу щоб ви це значення десь міняли. Разом з тим, індекси масивів у вас від 1 до n.
Це усе одно, що попросити друга витягти з коробки нульовий олівець, хоча ви щойно домовилися з ним, що перший олівець має номер 1, а останній, скажімо, 12. Що б вам відповів ваш друг? От і комп'ютер вас не розуміє.
ну поміняв я замість n поставив наприклад 4 . я так зрозумів десь циклу не хватає???
Після старту програми змінна i має значення 0, і я не бачу щоб ви це значення десь міняли.
я трошкі цього не зрозумів. вкажіть де помилка в моєму коді будь ласка
Помилка в тому, що перед викликом rik[i ] ви ніде не змінюєте це i. Оскільки у вас цикл while то я б зробив усередині цього циклу отак "i := i + 1;", а потім усе решта, що там іще має бути.
отак зробив
while not eof(f) do
begin
i:=i+1;
readln(f, sss);
For j:=1 to 4 do
If (rik[i]= 1993) then
begin
write(' |', virobn[i]:10,'|');
write(nazva[i]:15,'|', kamera[i]:16,'|', rik[i]:4,'|', misce[i]:9,'|' , cina[i]:9,'|' , kilkist[i]:9,'|');
writeln(sss);
всеодно помилка та сама
в мене взагалі неправильно все написано. я вде н знаю
Ну хоча б компілюється, це уже прогрес. А діється у програмі ось що:
while not eof(f) do //повторюємо наступні дії поки не дочитаємо до кінця файлу
//якщо у файлі один рядок, то повторюємо один раз
begin
i:=i+1; //збільшуємо значення i на одиницю
readln(f, sss); //зчитуємо один рядок із файлу у sss
For j:=1 to 4 do //чотири рази повторюємо наступну дію
//номер поточної ітерації записуємо в j, хоч він усе одно потім ніде не використовується
If (rik[i]= 1993) then //якщо значення i-го елементу масиву rik дорівнює 1993,
//то робимо наступні дії
begin
write(' |', virobn[i]:10,'|'); //виводимо рядок з характеристиками холодильника
write(nazva[i]:15,'|', kamera[i]:16,'|', rik[i]:4,'|', misce[i]:9,'|' , cina[i]:9,'|' , kilkist[i]:9,'|');
writeln(sss); //виводимо рядок, який зчитали із файлу
end; //кінець дій, які виконуються якщо умова if вірна
end; //кінець дій, які виконуються у циклі while
Ну хоча б компілюється, це уже прогрес. А діється у програмі ось що:
while not eof(f) do //повторюємо наступні дії поки не дочитаємо до кінця файлу //якщо у файлі один рядок, то повторюємо один раз begin i:=i+1; //збільшуємо значення i на одиницю readln(f, sss); //зчитуємо один рядок із файлу у sss For j:=1 to 4 do //чотири рази повторюємо наступну дію //номер поточної ітерації записуємо в j, хоч він усе одно потім ніде не використовується If (rik[i]= 1993) then //якщо значення i-го елементу масиву rik дорівнює 1993, //то робимо наступні дії begin write(' |', virobn[i]:10,'|'); //виводимо рядок з характеристиками холодильника write(nazva[i]:15,'|', kamera[i]:16,'|', rik[i]:4,'|', misce[i]:9,'|' , cina[i]:9,'|' , kilkist[i]:9,'|'); writeln(sss); //виводимо рядок, який зчитали із файлу end; //кінець дій, які виконуються якщо умова if вірна end; //кінець дій, які виконуються у циклі while
і що ж порадите робити? )))
Зараз у вас на опис одного холодильника йде один рядок у файлі. Зчитувати інформацію з цього рядка буде потім досить важко. Тому я раджу вам робити приблизно як описано отут: http://replace.org.ua/post/20393/#p20393
я вас трохи не розумію за яку ви вже строку говорите, я виправив так
type
xolod = record
vr:string[50];
nv:string[45];
kr:real;
rk:integer;
misc:string[45];
cn:real;
kst:real;
end;
var
i:integer;
f:text;
tabl:xolod;
type
xolod = record
vr:string[50];
nv:string[45];
kr:real;
rk:integer;
misc:string[45];
cn:real;
kst:real;
end;
var
i:integer;
f:text;
tabl:xolod;
virobn:array[1..4] of string[45];
nazva:array[1..4] of string[50];
kamera:array[1..4] of real;
rik:array[1..4] of integer;
misce:array[1..4] of string[45];
cina:array[1..4] of integer;
kilkist:array[1..4] of real;
Procedure stvor;
var
j:integer;
begin
Assign(f,'zadolbalo.txt');
Rewrite(f);
for j:=1 to 4 do
writeln(f, virobn[j]:10,'|',
nazva[j]:15,'|',
kamera[j]:16,'|',
rik[j]:4,'|',
misce[j]:9,'|',
cina[j]:9,'|',
kilkist[j]:9,'|'
);
Close(f);
End;
Procedure vvid;
begin
Assign(f, 'zadolbalo.txt');
Append(f);
Writeln('Vvedenna dannix');
with tabl do
begin
Write('virobn:');
readln(vr);
Write('nazvanie:');
readln(nv);
Write('kamera:');
readln(kr);
Write('rik:');
readln(rk);
Write('misce:');
readln(misc);
Write('cina:');
readln(cn);
Write('kilkist:');
readln(kst);
writeln(f,vr:10);
writeln(f,nv:15);
writeln(f,kr:16);
writeln(f,rk:4);
writeln(f,misc:9);
writeln(f,cn:9);
writeln(f,kst:9);
end;
Close(f);
End;
Procedure Zagol;
begin
writeln('-----------------------------------------------------------------------');
writeln('| Виробництво | Назва | Обэм Камери | Рік | Місце | Ціна | Кількість|');
writeln('-----------------------------------------------------------------------');
End;
Procedure Vuvid;
var
sss:string;
begin
assign(f, 'zadolbalo.txt');
Reset(f);
while not eof(f) do
begin
readln(f,tabl.vr);
readln(f,tabl.nv);
readln(f,tabl.kr);
readln(f,tabl.rk);
readln(f,tabl.misc);
readln(f,tabl.cn);
readln(f,tabl.kst);
end;
writeln(sss);
End;
Procedure obrobka;
var
sss:string;
i : integer;
begin
Zagol;
Assign(f, 'zadolbalo.txt');
Reset(f);
while not eof(f) do
begin
i:=i+1;
readln(f, sss);
For i:=1 to 4 do
If (rik[i]= 1993) then
begin
write(' |', virobn[i]:10,'|');
write(nazva[i]:15,'|', kamera[i]:16,'|', rik[i]:4,'|', misce[i]:9,'|' , cina[i]:9,'|' , kilkist[i]:9,'|');
writeln(sss);
end;
end;
Close(f);
End;
BEGIN
stvor;
vvid;
vuvid;
obrobka;
End.
скажіть в точності який рядок виправити на код з поста 44 будь ласка
О, ви більш-менш правильно переробили процедури vvid та Vuvid. Але у процедурі Vuvid дані треба зчитувати у масиви virobn, nazva... а не у tabl. І щоб воно правильно працювало, після рядків "while not eof(f) do
begin" додайте "i:=i+1;". Завдяки цьому на кожній ітерації циклу while ви звертатиметеся до наступного елементу у масивах virobn, nazva... а не до одного й того ж.