Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.04.2012, 23:34   #1
Vitia666
Новичок
Джуниор
 
Регистрация: 21.04.2012
Сообщений: 13
По умолчанию Беда с задачей)

Вообщем,что сделать надо;типо известны оценки по контрольной для каждого студента,(они вводяться вручную),найти количество 2,3,4,5.Написал код,но он никоим образом не хочет корректно работать.Подскажите что не так,как сделать что бы он всё считал по нормальному?)
Кто подскажет,получит огроомный плюс к карме,ну и либидо повысит)
(Что закоменчено это мне просто удалять лень))

Код:
var
  Form1: TForm1;
 a:Array[1..4] of Real;
N,i,k,n5 ,n2, n4, n3:integer;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
N:=StrToInt(Edit1.Text);
StringGrid1.ColCount:=N;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
N:=0;
Edit1.Text:=intToStr(N);
StringGrid1.RowCount:=N;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
for i:=1 to n do
begin
//B[i]:=StrToFloat(StringGrid2.Cells[0,i]);
  if a[i]=5 then n5:=n5+1;
  if a[i]=4 then n4:=n4+1;
  if a[i]=3 then n3:=n3+1;
  if a[i]=2 then n2:=n2+1;
  //StringGrid2.Cells[0,100]:=FloatToStr(a[i]);
end;

stringGrid2.Cells[0,0]:=FloattoStr(n2);
stringGrid2.Cells[1,0]:=FloattoStr(n3);
stringGrid2.Cells[2,0]:=FloattoStr(n4);
stringGrid2.Cells[3,0]:=FloattoStr(n5);
end;

end.

Последний раз редактировалось Stilet; 22.04.2012 в 00:51.
Vitia666 вне форума Ответить с цитированием
Старый 21.04.2012, 23:51   #2
temaps
Форумчанин
 
Регистрация: 15.05.2011
Сообщений: 160
По умолчанию

А где хранятся оценки?
И код отформатируй. Используй тег [ code ]
temaps вне форума Ответить с цитированием
Старый 22.04.2012, 00:14   #3
Vitia666
Новичок
Джуниор
 
Регистрация: 21.04.2012
Сообщений: 13
По умолчанию

Вввод в СтриннгСрид1,считаються и выводятся в СтриннгГрид2
Vitia666 вне форума Ответить с цитированием
Старый 22.04.2012, 01:15   #4
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

Вот пример (честно, лень разбираться в вашем коде).
Вложения
Тип файла: zip Project1.zip (252.1 Кб, 12 просмотров)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 22.04.2012, 01:36   #5
Vitia666
Новичок
Джуниор
 
Регистрация: 21.04.2012
Сообщений: 13
По умолчанию

Огромнейшее спасибо)

Блин а со старым кодом никтол не может подсказать?А то программа эта <вырезано цензурой> как написана,плохо её понимаю

Последний раз редактировалось ACE Valery; 22.04.2012 в 19:15.
Vitia666 вне форума Ответить с цитированием
Старый 22.04.2012, 15:08   #6
mishanama
Пользователь
 
Регистрация: 04.06.2009
Сообщений: 22
По умолчанию

Ты напиши ЧТО именно у тебя не работает.
mishanama вне форума Ответить с цитированием
Старый 22.04.2012, 15:09   #7
Vitia666
Новичок
Джуниор
 
Регистрация: 21.04.2012
Сообщений: 13
По умолчанию

Не хочет считать оценки,вообще никак.
Vitia666 вне форума Ответить с цитированием
Старый 22.04.2012, 15:10   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,431
По умолчанию

Нашел один баг в коде (исправленная версия во вложении).

Разбор кода:
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
  i: integer;
begin
  stringgrid1.Cells[0, 0] := 'Оценка';
  stringgrid2.Cells[0, 0] := 'Оценка';
  stringgrid2.Cells[1, 0] := 'Кол-во';
  for i := 2 to 5 do begin
    stringgrid2.Cells[0, i - 1] := '"' + inttostr(i) + '"';
    stringgrid2.Cells[1, i - 1] := '0';
  end;
  ScrollBar1Change(self);
end;
При создании формы заполняем таблицы теми надписями, которые нужны
И вызываем ScrollBar1Change

Код:
procedure TForm1.ScrollBar1Change(Sender: TObject);
var
  i: integer;
begin
  for i := scrollbar1.Position + 1 to stringgrid1.RowCount - 1 do
    stringgrid1.Cells[0, i] := '';
  label1.Caption := inttostr(scrollbar1.Position) + ' students';
  stringgrid1.Height := 30 + scrollbar1.Position * 25;
  stringgrid1.RowCount := scrollbar1.Position + 1;
  for i := 2 to 5 do
    stringgrid2.Cells[1, i - 1] := '0';
end;
При изменении количества студентов первым циклом удаляем те оценки, которые уже не существуют (при изменении количества строк таблицы, данные, которые не влезают в нее, остаются все равно в таблице, и восстановятся опять, когда размер увеличится)
Устанавливаем в label количество студентов.
Изменяем количество строк и размер 1 таблицы.
Обнуляем количество студентов во второй таблице.

Код:
procedure TForm1.StringGrid2DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  with (Sender as TStringGrid).Canvas do begin
    if (ACol = 0) or (ARow = 0) then
      Brush.Color := clbtnface
    else
      Brush.Color := clwhite;
    FillRect(Rect);
    Font.Color := clblack;
    TextOut(Rect.Left + 2, Rect.Top, (Sender as TStringgrid).cells[acol, arow])
  end;
end;
Просто собственный обработчик отрисовки 2 таблицы (чтобы не было синего квадратика, ужасно портящего вид).

Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: integer;
begin
  for i := 2 to 5 do
    stringgrid2.Cells[1, i - 1] := '0';
  for i := 1 to stringgrid1.RowCount - 1 do
    if stringgrid1.Cells[0, i] <> '' then
      stringgrid2.Cells[1, strtoint(stringgrid1.Cells[0, i]) - 1] := inttostr(strtoint(stringgrid2.Cells[1, strtoint(stringgrid1.Cells[0, i]) - 1]) + 1);
end;
Первый цикл предварительно обнуляет количество студентов с оценками 2, 3, 4, 5.
Второй цикл проходит по всем оценкам в 1 таблице.
Если клетка с оценкой не пуста, то вычисляется клетка во второй матрице, которая должна быть увеличена.
Берется предыдущее значение этой ячейки. Прибавляется единичка, и полученное значение записывается обратно.
Вложения
Тип файла: zip Project1.zip (252.1 Кб, 5 просмотров)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 22.04.2012 в 15:20.
BDA на форуме Ответить с цитированием
Старый 22.04.2012, 15:12   #9
Vitia666
Новичок
Джуниор
 
Регистрация: 21.04.2012
Сообщений: 13
По умолчанию

Попробовал сделать с тем кодом которых кинули,так и с ним никак не могу)
Код:
var
  Form1: TForm1;
   i,n: integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  for i := 1 to stringgrid1.RowCount - 1 do
    if stringgrid1.Cells[0, i] <> '' then
      stringgrid2.Cells[1, strtoint(stringgrid1.Cells[0, i]) - 1] := inttostr(strtoint(stringgrid2.Cells[1, strtoint(stringgrid1.Cells[0, i]) - 1]) + 1);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
N:=StrToInt(Edit1.Text);
StringGrid1.RowCount:=N;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
N:=0;
Edit1.Text:=intToStr(N);
StringGrid1.RowCount:=N;

  stringgrid1.Cells[0, 0] := 'Оценка';
  stringgrid2.Cells[0, 0] := 'Оценка';
  stringgrid2.Cells[1, 0] := 'Кол-во';
  stringgrid2.Cells[0, 1] := '2';
  stringgrid2.Cells[0, 2] := '3';
  stringgrid2.Cells[0, 3] := '4';
  stringgrid2.Cells[0, 4] := '5';



end;



end.
Вот эту строчку вообще не понимаю)Как так?))
Код:
stringgrid2.Cells[1, strtoint(stringgrid1.Cells[0, i]) - 1] := inttostr(strtoint(stringgrid2.Cells[1, strtoint(stringgrid1.Cells[0, i]) - 1]) + 1);

Последний раз редактировалось Vitia666; 22.04.2012 в 15:19.
Vitia666 вне форума Ответить с цитированием
Старый 22.04.2012, 15:18   #10
Vitia666
Новичок
Джуниор
 
Регистрация: 21.04.2012
Сообщений: 13
По умолчанию

BDA-Да мне не поверят что это я сделал))
Vitia666 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Беда с windows.h nury Visual C++ 7 16.08.2011 10:15
Беда с указателями Soundkilla Помощь студентам 5 08.03.2011 22:05
беда Морячок Паскаль, Turbo Pascal, PascalABC.NET 3 05.06.2010 15:41