61

Re: Таблиці - відфільтрувати записи з данними про холодильники (продовж.)

Chemist-i написав:

misha_beginner
А що це Ви на російську перейшли?

виправлено, а просто перевтомився дуже, вибачаюсь

62 Востаннє редагувалося Chemist-i (18.01.2014 14:56:06)

Re: Таблиці - відфільтрувати записи з данними про холодильники (продовж.)

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.

Просто відформатував, і ще одну змінну додав

63

Re: Таблиці - відфільтрувати записи з данними про холодильники (продовж.)

Просто відформатував, і ще одну змінну додав

дякую за форматування проте навіть якщо поставити в умові If sh.rk=1993 то воно не виводить холодильників 1993 року + чомусь не пише в файл, а навіть і якщо пише то знову ж тільки таку таблицю, відфільтровану не пише в файл

64

Re: Таблиці - відфільтрувати записи з данними про холодильники (продовж.)

misha_beginner написав:

ідеї закінчились

Прихований текст
const 
      n=4;
 type
    xolod = record
      virobn:string[50];
      nazvanie:string[45];
      kamera:real;
      rik:integer;
      misce:string[45];
      cina:real;
      kilkist:real;
    end;
   var
   f:text;
   i:integer;
   procedure vvod;
  var
     i:integer;
     tabl:xolod;
     begin
           Assign(f,'d:\xolod.txt');
           rewrite(F);
           for i:=1 to n do begin
           Write('virobn:');
            Write('nazvanie:'); 
            Write('kamera:');  
             Write('rik:'); 
     Write('misce:'); 
     Write('cina:'); 
     Write('kilkist:'); 
writeln(f,tabl.virobn);
writeln(f,tabl.nazvanie);
writeln(f,tabl.kamera);
writeln(tabl.rik);
writeln(tabl.misce);
writeln(tabl.cina);
writeln(tabl.kilkist);
end;
Close(f);
End;

Procedure vivod;
var 
   s:string;
   begin
   writeln('-----------------------------------------------------------------------');
   writeln(' | Виробництво | Назва | Обэм Камери | Рік | Місце | Ціна | Кількість|');
   writeln('-----------------------------------------------------------------------');
assign(f,'d:\xolod.txt');
Reset(f);
 while not eof(f) do 
 begin
 readln(f,tabl[i].virobn , tabl[i].nazvanie , tabl[i].kamera  , tabl[i].rik  , tabl[i].misce , tabl[i].cina , tabl[i].kilkist );
 writeln(tabl.virobn:10,'|' ,tabl.nazvanie:15,'|',tabl.kamera:16,'|', tabl.rik:4,'|', tabl.misce:9,'|' , tabl.cina:9,'|' , tabl.kilkist:9,'|');
end;
Close(f);
End;

Procedure obrobka;
begin
assign(f, 'd:\xolod.txt');
Reset(f);
while not eof(f) do begin
    readln(f,tabl[i].virobn , tabl[i].nazvanie , tabl[i].kamera  , tabl[i].rik  , tabl[i].misce , tabl[i].cina , tabl[i].kilkist   );
     If (tabl[i].rik = 1993) then 
     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,'|');
     end;
     Close(f);
     End;
     
     BEGIN
     vvod;
     vivod;
     obrobka;
     End.

що ж робити воно ругається не існує tabl на строке

 readln(f,tabl[i].virobn 

:( вообще не знаю  чи правильно переробив  код .гляніть пліз

Щоб записати інформацію потрібне місце, куди її записувати, якась змінна. У вас немає глобальної змінної tabl, немає такої змінної і у процедурах vivod та obrobka.

misha_beginner написав:

Просто відформатував, і ще одну змінну додав

дякую за форматування проте навіть якщо поставити в умові If sh.rk=1993 то воно не виводить холодильників 1993 року + чомусь не пише в файл, а навіть і якщо пише то знову ж тільки таку таблицю, відфільтровану не пише в файл

sh може містити у собі інформацію лише про один холодильник. У цьому випадку про останній із введених. Якщо вам потрібно зберегти інформацію про кілька холодильників, то вам потрібен масив.

65

Re: Таблиці - відфільтрувати записи з данними про холодильники (продовж.)

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,'|');

якось так?

66

Re: Таблиці - відфільтрувати записи з данними про холодильники (продовж.)

Так, якщо у вас є змінна tabl, яка є масивом. У першому повідомленні теми така була.

67 Востаннє редагувалося misha_beginner (18.01.2014 16:47:49)

Re: Таблиці - відфільтрувати записи з данними про холодильники (продовж.)

ось повний  код:
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,'|' , 

68

Re: Таблиці - відфільтрувати записи з данними про холодильники (продовж.)

Змінна tabl у вас є записом xolod, а має бути масивом цих записів. Іще раз даю посилання на статтю про масиви: http://pascal.org.ua/structure-types#array

69

Re: Таблиці - відфільтрувати записи з данними про холодильники (продовж.)

ось так зробив

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

   Ошибка времени выполнения: Индекс находился вне границ массива.

70

Re: Таблиці - відфільтрувати записи з данними про холодильники (продовж.)

Після старту програми змінна i має значення 0, і я не бачу щоб ви це значення десь міняли. Разом з тим, індекси масивів у вас від 1 до n.
Це усе одно, що попросити друга витягти з коробки нульовий олівець, хоча ви щойно домовилися з ним, що перший олівець має номер 1, а останній, скажімо, 12. Що б вам відповів ваш друг? От і комп'ютер вас не розуміє.

71

Re: Таблиці - відфільтрувати записи з данними про холодильники (продовж.)

Torbins написав:

Після старту програми змінна i має значення 0, і я не бачу щоб ви це значення десь міняли. Разом з тим, індекси масивів у вас від 1 до n.
Це усе одно, що попросити друга витягти з коробки нульовий олівець, хоча ви щойно домовилися з ним, що перший олівець має номер 1, а останній, скажімо, 12. Що б вам відповів ваш друг? От і комп'ютер вас не розуміє.

ну поміняв я замість n поставив наприклад 4 . я так зрозумів десь циклу не хватає???

72

Re: Таблиці - відфільтрувати записи з данними про холодильники (продовж.)

Після старту програми змінна i має значення 0, і я не бачу щоб ви це значення десь міняли.

я трошкі цього не зрозумів. вкажіть де помилка в моєму коді будь ласка

73

Re: Таблиці - відфільтрувати записи з данними про холодильники (продовж.)

Помилка в тому, що перед викликом rik[i ] ви ніде не змінюєте це i. Оскільки у вас цикл while то я б зробив усередині цього циклу отак "i := i + 1;", а потім усе решта, що там іще має бути.

74 Востаннє редагувалося misha_beginner (18.01.2014 18:43:07)

Re: Таблиці - відфільтрувати записи з данними про холодильники (продовж.)

отак зробив

 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);

всеодно помилка  та сама

75

Re: Таблиці - відфільтрувати записи з данними про холодильники (продовж.)

в мене взагалі неправильно все написано. я вде н знаю

Post's attachments

Безымянный.png 1.1 mb, 257 downloads since 2014-01-18 

76

Re: Таблиці - відфільтрувати записи з данними про холодильники (продовж.)

Ну хоча б компілюється, це уже прогрес. А діється у програмі ось що:

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

77

Re: Таблиці - відфільтрувати записи з данними про холодильники (продовж.)

Torbins написав:

Ну хоча б компілюється, це уже прогрес. А діється у програмі ось що:

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

і що ж порадите робити?  )))

78

Re: Таблиці - відфільтрувати записи з данними про холодильники (продовж.)

Зараз у вас на опис одного холодильника йде один рядок у файлі. Зчитувати інформацію з цього рядка буде потім досить важко. Тому я раджу вам робити приблизно як описано отут: http://replace.org.ua/post/20393/#p20393

79 Востаннє редагувалося misha_beginner (18.01.2014 22:21:04)

Re: Таблиці - відфільтрувати записи з данними про холодильники (продовж.)

я вас трохи не розумію за яку ви вже строку говорите, я виправив так

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 будь ласка

80 Востаннє редагувалося Torbins (18.01.2014 22:53:48)

Re: Таблиці - відфільтрувати записи з данними про холодильники (продовж.)

О, ви більш-менш правильно переробили процедури vvid та Vuvid. Але у процедурі Vuvid дані треба зчитувати у масиви virobn, nazva... а не у tabl. І щоб воно правильно працювало, після рядків "while not eof(f) do
begin" додайте "i:=i+1;". Завдяки цьому на кожній ітерації циклу while ви звертатиметеся до наступного елементу у масивах virobn, nazva... а не до одного й того ж.