Помощь - Поиск - Пользователи - Календарь
Полная версия: Как вывести записи с нужными параметрами?
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
Анастасия
Задача:
Фамилия Имя Факультативы
Мат. Физ. Инф.
Павлов Серг true false true
Мисюченко Ира true true false
Сидорон Зоя false false true
Кладов Роман true false false
Создайте массив следующего содержания и структуры, выведите фамилии и имена школьников, которые не посещают факультатив по физике или по математике.

Var
 Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
StringGrid1.Cells[1,1] := 'Фамилия ';
 StringGrid1.Cells[2,1] := 'Имя';
 StringGrid1.Cells[3,1] := 'математика';
 StringGrid1.Cells[4,1] := 'физика';
 StringGrid1.Cells[5,1] := 'информатика';

  StringGrid1.Cells[1,2] := 'Иванов';
 StringGrid1.Cells[2,2] := 'Коля';
 StringGrid1.Cells[3,2] := 'да';
 StringGrid1.Cells[4,2] := 'да';
 StringGrid1.Cells[5,2] := 'нет';

  StringGrid1.Cells[1,3] := 'Петров';
 StringGrid1.Cells[2,3] := 'Вася';
 StringGrid1.Cells[3,3] := 'да';
 StringGrid1.Cells[4,3] := 'да';
 StringGrid1.Cells[5,3] := 'да';
 end;

procedure TForm1.Button2Click(Sender: TObject);
var i,j:integer;
begin
for j:=2 to 3 do    begin
for i:=1 to 4 do
if (StringGrid1.Cells[3,j]= 'нет') or (StringGrid1.Cells[4,j]= 'нет')  then
StringGrid1.Cells[1,j]:= StringGrid1.Cells[1,j];
StringGrid1.Cells[2,j]:= StringGrid1.Cells[2,j];
end;end;

procedure TForm1.Button3Click(Sender: TObject);
var i,j:integer;
begin
for j:=2 to 3 do    begin
for i:=1 to 4 do
StringGrid1.Cells[1,j]:='';
StringGrid1.Cells[2,j]:= '';
StringGrid1.Cells[3,j] := '';
StringGrid1.Cells[4,j] := '';
StringGrid1.Cells[5,j] := '';end;
end;
end.

Не знаю, как правильно задать Button2, чтобы вывелись только нужные записи.
volvo
А почему ты в RunTime создаешь массив, а не на этапе компиляции?

var
  arr: array[1 .. 4] of record
    name: string[50];
    math, phys, info: boolean;
  end = (
    (name:'Павлов Серг';   math:true;  phys:false; info:true ),
    (name:'Мисюченко Ира'; math:true;  phys:true;  info:false),
    (name:'Сидорон Зоя';   math:false; phys:false; info:true ),
    (name:'Кладов Роман';  math:true;  phys:false; info:false)
  );

И выбирай, какие записи отобразить...
Анастасия
Это я додумала 1-й вариант своей задачи со 2-й кнопкой. Кривовато, но работает.

procedure TForm1.Button2Click(Sender: TObject);
var i,j:integer;
begin

 for j:=2 to 3 do    begin
for i:=1 to 4 do
          begin
if (StringGrid1.Cells[3,j]= 'нет') or (StringGrid1.Cells[4,j]= 'нет')  then
begin
StringGrid1.Cells[1,j]:= StringGrid1.Cells[1,j];
StringGrid1.Cells[2,j]:= StringGrid1.Cells[2,j];
StringGrid1.Cells[3,j]:= '';
StringGrid1.Cells[4,j]:= '';
StringGrid1.Cells[5,j]:= '';end;
if (StringGrid1.Cells[3,j]= 'да') and (StringGrid1.Cells[4,j]= 'да')  then
begin
StringGrid1.Cells[1,j]:= '';
StringGrid1.Cells[2,j]:= '';
StringGrid1.Cells[3,j]:= '';
StringGrid1.Cells[4,j]:= '';
StringGrid1.Cells[5,j]:= '';
  end;end;
end;
end;

И начала делать вариант , предложенный вами,Volvo. Но на самих записях выходит ошибка :cannot initialise local parametrs,not enough actual parametrs.

procedure TForm1.Button1Click(Sender: TObject);
var
 i:integer;
  x: array[1 .. 4] of record
    name: string[50];
    math, phys, info: boolean;
   end = (                                                                               {выделяет эту строку}
    (name:'Павлов Серг';   math:true;  phys:false; info:true ),  
    (name:'Мисюченко Ира'; math:true;  phys:true;  info:false),
    (name:'Сидорон Зоя';   math:false; phys:false; info:true ),
    (name:'Кладов Роман';  math:true;  phys:false; info:false)
  );
begin
 for i:=1 to 4 do
if (x[i].math=false) or (x[i].phys=false)  then
 with x[i] do
StringGrid1.Cells[i] :=x[i].name;
end;
end.


Я в Паскале более-менее разбираюсь, а здесь вообще на каждом шагу ошибки делаю. unsure.gif
volvo
Ага... Правильно... Переменная X должна быть либо Var, но глобально (вне процедуры), либо можно локально (прямо внутри процедуры), но только с Const ...
мисс_граффити
 with x[i] do
StringGrid1.Cells[i] :=x[i].name;

это равнозначно
StringGrid1.Cells[i] :=x[i].x[i].name;
Анастасия
Цитата(мисс_граффити @ 2.12.2006 11:59) *

 with x[i] do
StringGrid1.Cells[i] :=x[i].name;

это равнозначно
StringGrid1.Cells[i] :=x[i].x[i].name;


По этому вопросу, оно не идет ни так ни как равнозначно.
и так не идет

stringgrid1.cells[1,i]:=x[i].x[i].name;


так тоже не идет

stringgrid1.cells[1,i]:=x[i].name;


Как правильно?
мисс_граффити
ты последовательно обращаешься к элементам
что такое x[i].x[i] компилятор не может понять...
а вот почему не идет
stringgrid1.cells[1,i]:=x[i].name;
- не могу сходу сказать. может, до этого что-то не то?
какая хоть ошибка?...
или выложи кусок кода побольше.
Анастасия
 stringgrid1.cells[1,i]:=x[i].name;


вот при таком коде программа запускается без ошибки, но по нажатии кнопки ничего не выводит.
А код этот весь. Остальное стандартное окно делфи.
мисс_граффити
blink.gif
можешь прикрепить проект?
в архиве... все, кроме ехе-шника
мисс_граффити
выводит... но ты этого не видишь, так как выводит в первый столбец (а у тебя только нулевой).
вот так работает:
for i:=1 to 4 do
  if not(x[i].math) or not(x[i].phys)  then
    stringgrid1.cells[0,i]:=x[i].name;

что еще заменила:
1) убрала строчку with...
ты же и так явно пишешь, что работаешь с x[i]. Зачем дублировать информацию?
2) чуть-чуть перефразировала условие - мы ж работаем с логическими переменными, зачем делать сравнение через =?

...но будет выводить "с дырками".
тебя это устроит?
Анастасия
Спасибо. Я все поняла. Выводится сообщения начались, но с "дырками". Я попыталась исправить ситуацию, изменив вот так код:

procedure TForm1.Button1Click(Sender: TObject);
var
 i,j,n,k:integer;
 y:array[1..4] of record
 name1:string[50]; end;
 const x: array[1 .. 4] of record
    name: string[50];
    math, phys, info: boolean;
 end = (                                                                               
    (name:'Павлов Серг';   math:true;  phys:false; info:true ),  
    (name:'Мисюченко Ира'; math:true;  phys:true;  info:false),
    (name:'Сидорон Зоя';   math:false; phys:false; info:true ),
    (name:'Кладов Роман';  math:true;  phys:false; info:false)
  );
begin
n:=0;
 for i:=1 to 4 do
  begin
   k:=0;
  if not(x[i].math) or not(x[i].phys)  then
   begin
     stringgrid1.cells[0,i]:=x[i].name;
  k:=k+1;
      if k=1 then begin n:=n+1; y[n].name1:=x[i].name;end;{создаю  в отдельную запись правильные ответы}
   end;
    end;

for i:=1 to 4 do  begin {вывожу  отдельную запись}
   stringgrid1.cells[0,i]:=y[i].name1; end;
end;
end.


и там, где вывожу ,после вывода появляется на следующей строке какая-то бяка. Набор символов разных шрифтов.Нажмите для просмотра прикрепленного файла
мисс_граффити
а зачем такие сложности?
дополнительный массив...
k:=1;
for i:=1 to 4 do
  if not(x[i].math) or not(x[i].phys)  then
    begin
    stringgrid1.cells[0,k]:=x[i].name;
    inc(k);
    end;


если этот вариант не нравится...
кракозябры появляются вот почему: реально заполнены у тебя только y[1..3], а в y[4] хранится какой-то мусор. надо изначально опустошать все строки:
y[i].name1:=''
Анастасия
Большое спасибо за помощь!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.