Форум программистов, компьютерный форум, киберфорум
Наши страницы

Lazarus

Войти
Регистрация
Восстановить пароль
 
Mega_Destroer
0 / 0 / 0
Регистрация: 15.11.2015
Сообщений: 12
#1

Обработка текста: добавить средние баллы групп - Lazarus

09.05.2016, 11:59. Просмотров 337. Ответов 9
Метки нет (Все метки)

Нужно добавить средние баллы групп в конце списка каждой группы в файле добавить значения соотвецтвующих средних балов с двумя цифрами в дробной части. Использовать дополнительный текстовый файл. Отобразить измененный файл в окне редактора.

Cамо условие
Задания на обработку TextFile
Общее для всех заданий
1. Подпункты меню Файл: Создать..., Открыть..., Закрыть..., Сохранить..., Сохранить как..., Выход... и соответствующие им диалоги, а также пункт меню Обработка, но с двумя индивидуальными для каждого задания подпунктами.

2. Исходный (создаваемый с использованием меню Файл) файл должен иметь следующую структуру строк (в скобках указаны длины полей и выпранивание): Номер строки (2, правое), пробелы (1), Фамилия (12, левое), пробелы (1), Группа (8, левое), Оценка 1 (2, правое), Оценка 2 (2, правое), Оценка 3 (2, правое),
например, _3_Иванов______СМ4-21___3_4_5

3. Исходный файл должен храниться в каталоге проекта программы и иметь данные по трём группам, для каждой из которых должно быть число строк, достаточное для проверки работ по подпунктам меню Обработка, но не менее 5 для каждой группы. Сделать Memo1 шириной >= длине строки файла и с вертикальной полосой прокрутки (в Инспекторе объектов свойствву ScrollBars дать значение ssVertical при создании макета формы).

4. Если в задании какие-либо данные отсутствуют или сказано, что они должны быть введены/выбраны в диалогах, то предполагается использование OpenDialog, SaveDialog, MessageDlg или InputBox

В некоторых заданиях будет предложено отбирать строки файлов по маске. Маской является строка, содержащая символы замещения: * (звёздочка) – представляет любую, в том числе и пустую, последовательность символов; ? (знак вопроса) – представляет любой один, и только один символ. Например, маске *т? удовлетворяет любая последовательность символов, предпоследним символом которой является буква «т», после которого должен стоять ровно один любой символ. Такой маске будут, в частности, соответствовать слова та, эта, приметы, но не такт, этак, приметный.
Стандартную функцию не использовать.

Как выглядит исходное условие
Код
 1 Иванов       РКТ1-21  5 5 5
 2 Петров       РКТ1-21  5 4 5
 3 Сидоров      РКТ1-21  5 5 4
 4 Капустин     РКТ2-21  5 4 4
 5 Агольцов     РКТ2-21  5 3 5
 6 Безруков     РКТ2-21  4 5 3
 7 Булгаков     ИУ1-21   3 4 3
 8 Пушкин       ИУ1-21   3 3 3
 9 Лермонтов    РК1-21   4 4 4
 10Новиков      ИУ1-21   5 5 5
 11Никитин      ИУ9-21   3 5 4
 12Абрамович    ИУ9-21   4 3 5
 13Моторин      РК1-21   3 3 5
 14Овечкин      ИУ9-21   5 5 4
 15Березов      РК1-21   3 5 5

текстовый 2.0.rar - програмка

вроде бы я написал, но что то как то не получается у меня проверить правильность моей процедурки, ибо вылезает ошибка

Обработка текста: добавить средние баллы групп

я так понимаю это связано с конвертированием, но вроде у меня все четко
Текст програмки
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Menus,
  StdCtrls;
 
type     mas=array[1..100]of real;
 
  { TForm1 }
 
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    Memo1: TMemo;
    MenuItem1: TMenuItem;
    MenuItem2: TMenuItem;
    MenuItem3: TMenuItem;
    MenuItem4: TMenuItem;
    MenuItem5: TMenuItem;
    MenuItem6: TMenuItem;
    MenuItem7: TMenuItem;
    MenuItem8: TMenuItem;
    MenuItem9: TMenuItem;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    procedure FormCreate(Sender: TObject);
    procedure MenuItem2Click(Sender: TObject);
    procedure MenuItem3Click(Sender: TObject);
    procedure MenuItem4Click(Sender: TObject);
    procedure MenuItem5Click(Sender: TObject);
    procedure MenuItem6Click(Sender: TObject);
    procedure MenuItem7Click(Sender: TObject);
    procedure MenuItem9Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
var sf:string;
 
{$R *.lfm}
 
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject); //При запуске
begin
  memo1.Align:=alClient;
  memo1.Font.Name:='Courier New';
  memo1.modified:=false;
end;
 
procedure TForm1.MenuItem2Click(Sender: TObject); //Создать
begin
  memo1.lines.clear;
  sf:='';
  form1.Caption:='Tform1';
  memo1.modified:=false;
end;
 
procedure TForm1.MenuItem3Click(Sender: TObject); //Открыть
begin
 if memo1.Modified then
 case messagedlg('Текст был изменен'+#13+'Сохранить изменения?',mtconfirmation,[mbyes,mbno,mbcancel],0)
 of mryes:MenuItem6Click(self);
    mrno:;
    mrcancel:exit;
 end;
 if opendialog1.execute then
  begin
    sf:=opendialog1.FileName;
    memo1.lines.LoadFromFile(sf);
    form1.caption:=sf;
    memo1.modified:=false;
  end;
end;
 
procedure TForm1.MenuItem4Click(Sender: TObject); //Закрыть
begin
  if memo1.Modified then
  case messagedlg('Текст был изменен'+#13+'Сохранить изменения?',mtconfirmation,[mbyes,mbno,mbcancel],0)
 of mryes:MenuItem6Click(self);
    mrno:;
    mrcancel:exit;
 end;
  memo1.lines.clear;
  sf:='';
  form1.Caption:='Tform1';
  memo1.modified:=false;
 end;
 
procedure TForm1.MenuItem5Click(Sender: TObject); //Сохранить
begin
  if sf='' then
  case messagedlg('Текст был изменен'+#13+'Сохранить изменения?',mtconfirmation,[mbyes,mbno,mbcancel],0)
 of mryes:MenuItem6Click(self);
    mrno:;
    mrcancel:exit;
 end
  else memo1.lines.savetofile(sf);
  memo1.Modified:=false;
end;
 
procedure TForm1.MenuItem6Click(Sender: TObject); //Сохранить как..
begin
  if savedialog1.execute then
  begin
    sf:=Savedialog1.FileName;
    memo1.Lines.savetofile(sf);
    form1.caption:=sf;
    memo1.Modified:=false;
  end;
end;
 
procedure TForm1.MenuItem7Click(Sender: TObject); //Выход
begin
  if memo1.modified then
  case messagedlg('Текст был изменен'+#13+'Сохранить изменения?',mtconfirmation,[mbyes,mbno,mbcancel],0)
 of mryes:memo1.lines.savetofile(sf);
    mrno:;
    mrcancel:exit;
 end;
 showmessage('Приложение будет завершено');
 close;
end;
 
procedure TForm1.MenuItem9Click(Sender: TObject);
var
  i,j,k1:integer;
  gr,gr1:string;
  sr:mas;
  begin
    For i:=1 to Memo1.lines.count-1 do begin
     k1:=1;
     gr:=copy(Memo1.lines[i],15,7);
     For j:=1 to Memo1.lines.count-1 do  begin
     gr1:=copy(Memo1.lines[j],15,7);
        If (gr=gr1) and (i<=j) then begin //сравнение групп
        inc(k1); //  кол-во свопадений
  sr[i]:=sr[i]+strtofloat(copy(Memo1.lines[j],25,1))+strtofloat(copy(Memo1.lines[j],26,1))+strtofloat(copy(Memo1.lines[j],27,1)); // сумма оценок i+j
  end;
  end;
  sr[i]:=sr[i]/(3*(k1-1));//среднее значение
  end;
  end;
 
end.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2016, 11:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Обработка текста: добавить средние баллы групп (Lazarus):

Обработка текста в делфи - Delphi
Требуется определить все слова в тексте и подсчитать их количество.

Как добавить много текста в Memo? - Delphi
Такая проблема: существует форма на которой есть мемо, в него нужно добавить много много текста, при чем текст нужно сменить при нажатии на...

Вычислить средние баллы по студентам и по каждому предмету - C (СИ)
Здравствуйте товарищи! Есть вот такая задача: Ввести фамилии N студентов и их экзаменационные оценки по M предметам a.Вычислить...

Вывести фамилии, имена и отчества и средние баллы студентов, не получающих стипендии - Turbo Pascal
1) Вывести фамилии,имена и отчества и средние баллы студентов, не получающих степендию

Ошибки в программе. Процедура, подсчитывающая средние баллы студентов по соответствующим дисциплинам - Delphi
Задача: В компонент StringGrid заносятся сведения о студентах (успеваемость по различным предметам). Составить алгоритм и написать...

Найти средние постоянные, средние переменные, средние общие издержки фирмы на основе указанных данных - Экономика
Найти средние постоянные, средние переменные, средние общие издержки фирмы на основе следующих данных: расходы на сырье и материалы – 150...

9
qwertehok
1587 / 1578 / 334
Регистрация: 29.08.2013
Сообщений: 10,582
09.05.2016, 12:27 #2
Цитата Сообщение от Mega_Destroer Посмотреть сообщение
я так понимаю это связано с конвертированием, но вроде у меня все четко
если у тебя все четко, то откуда тогда проблема?
делфи придумывает?

везде где ты делаешь strtofloat поставь Showmessage и проверяй где у тебя совсем не float
1
Пытливый
1304 / 620 / 148
Регистрация: 29.05.2013
Сообщений: 2,661
09.05.2016, 14:09 #3
Delphi
1
sr[i]:=sr[i]+strtofloat(copy(Memo1.lines[j],25,1))+strtofloat(copy(Memo1.lines[j],26,1))+strtofloat(copy(Memo1.lines[j],27,1))
А почему вы позицию числа вычисляете без учета пробелов?
А зачем вам преобразовывать к float если числа целые.
1
Mega_Destroer
0 / 0 / 0
Регистрация: 15.11.2015
Сообщений: 12
09.05.2016, 15:38  [ТС] #4
Вроде с учетом пробелов, а к Float я преобразовываю для того что потом мне надо дать ответ с двумя числами в дробной части. А как по вашему надо это все сделать ?

Добавлено через 48 минут
Цитата Сообщение от qwertehok Посмотреть сообщение
везде где ты делаешь strtofloat поставь Showmessage и проверяй где у тебя совсем не float
А как поставить, что именно написать надо?
0
edukra
474 / 451 / 135
Регистрация: 24.01.2012
Сообщений: 1,079
10.05.2016, 09:00 #5
Где здесь с учетом пробелов?
Pascal
1
sr[i]:=sr[i]+strtofloat(copy(Memo1.lines[j],25,1))+strtofloat(copy(Memo1.lines[j],26,1))+strtofloat(copy(Memo1.lines[j],27,1));
с учетом пробелов было бы так
Pascal
1
sr[i]:=sr[i]+strtofloat(copy(Memo1.lines[j],25,1))+strtofloat(copy(Memo1.lines[j],27,1))+strtofloat(copy(Memo1.lines[j],29,1));
А вообще Пытливый, дал дельный совет. Перед преобразованием - лучше все увидеть
Pascal
1
showmessage(copy(Memo1.lines[j],25,1)+#13#10+copy(Memo1.lines[j],26,1)+#13#10+copy(Memo1.lines[j],27,1));
1
Пытливый
1304 / 620 / 148
Регистрация: 29.05.2013
Сообщений: 2,661
10.05.2016, 10:48 #6
Вы привели пример данных в самом начале темы. Там видно, что оценки у вас идут с пробелом.
функция copy(Memo1.lines[j],25,1) берет один символ в 25 позиции из строки. Если после него идет пробел, то следующий нужный символ будет уже в 27 позиции и последний по аналогии в 29. А теперь посмотрите что вы делаете у себя в коде.
1
Mega_Destroer
0 / 0 / 0
Регистрация: 15.11.2015
Сообщений: 12
14.05.2016, 17:45  [ТС] #7
помогите мне написать процедуру которая считает средние балы, а то я что то уже совсем запутался.
Вот что я исправил, теперь она выводит, но считает неправильно

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
procedure TForm1.MenuItem9Click(Sender: TObject);
var
 i,j,k1:integer;
 s,st,gr,gr1:string;
  sr:mas;
  sum:real;
  begin
 
 For i:=1 to Memo1.lines.count-1 do begin
     k1:=1;
     gr:=copy(Memo1.lines[i],17,7);
     For j:=1 to Memo1.lines.count do  begin
     gr1:=copy(Memo1.lines[j],17,7);
        If (gr=gr1) and (i<=j) then begin //сравнение групп
        inc(k1); //  кол-во свопадений
  sr[i]:=sr[i]+(strtofloat(copy(Memo1.lines[j],26,1))+strtofloat(copy(Memo1.lines[j],28,1))+strtofloat(copy(Memo1.lines[j],30,1)))/3;
 
 
 
  end;
      end;
  sum:=sr[i]/(k1*3);//среднее значение
 
  str(sum:2:2,s);
  memo1.lines.add(s);
 
     end;
  end;
0
Пытливый
1304 / 620 / 148
Регистрация: 29.05.2013
Сообщений: 2,661
14.05.2016, 18:49 #8
Вы неправильно считаете средний балл. У вас надо по каждой колонке считать средний балл т.е. будет 3 числа, а то что вы там накрутили я даже не берусь назвать
0
Mega_Destroer
0 / 0 / 0
Регистрация: 15.11.2015
Сообщений: 12
14.05.2016, 23:05  [ТС] #9
можете пожалуйста написать правильную процедуру ?
0
Mega_Destroer
0 / 0 / 0
Регистрация: 15.11.2015
Сообщений: 12
10.06.2016, 14:17  [ТС] #10
Вот решение
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
procedure TForm1.MenuItem9Click(Sender: TObject);
var
 
 i,j,k1:integer;
 sr,s,st,gr,gr1:string;
 sum:real;
 alreadyDone: boolean;
begin           sr:='sred bal';
 memo1.lines.add(sr);
 
  For i:=0 to Memo1.lines.count-2 do
  begin
       gr:=copy(Memo1.lines[i],17,7);
       //начало проверка на более раннюю обработку
       alreadyDone := false;
       for j:=0 to i-1 do
       begin
            gr1:=copy(Memo1.lines[j],17,7);
            if (gr=gr1) then
            begin
               alreadyDone := true;
               break;
            end;
       end;// конец проверки
 
       if alreadyDone = false then
       begin
         sum := 0;
         k1:=0;
         For j:=i to Memo1.lines.count-2 do
         begin
              gr1:=copy(Memo1.lines[j],17,7);
              If (gr=gr1) then
              begin //сравнение групп
                    inc(k1); //  кол-во свопадений
                    st:=copy(Memo1.lines[j],17,7)+'  ';
                    sum:=sum+strtofloat(copy(Memo1.lines[j],26,1))+strtofloat(copy(Memo1.lines[j],28,1))+strtofloat(copy(Memo1.lines[j],30,1));
              end;
        end;
        sum:=sum/(k1*3);//среднее значение
        str(sum:2:2,s);
        memo1.lines.add(st+s);
 
       end;
     end;
0
10.06.2016, 14:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.06.2016, 14:17
Привет! Вот еще темы с ответами:

Чему будут равны средние постоянные, средние переменные, средние общие затраты? - Экономика
Здравствуйте. Помогите, пожалуйста, решить задачки. 1. Фирма по производству фаянсовой посуды изготавливает в месяц 4000 сервизов....

В заданной строке текста определите число групп символов и число групп цифр - Pascal
Добрый день, пожалуйста помогите со следующей задачкой на паскале: Составьте программу для обработки строки текста, введенной с...

В заданной строке текста определите число групп символов и число групп цифр - Pascal ABC
7. В заданной строке текста определите число групп символов и число групп цифр.

Рассчитать общие, предельные, средние постоянные, средние переменные и средние общие затраты предприятия - Экономика
Задание 6. Рассчитать общие, предельные, средние постоянные, средние переменные и средние общие затраты предприятия, если известно, что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru