В
Все
М
Математика
О
ОБЖ
У
Українська мова
Д
Другие предметы
Х
Химия
М
Музыка
Н
Немецкий язык
Б
Беларуская мова
Э
Экономика
Ф
Физика
Б
Биология
О
Окружающий мир
Р
Русский язык
У
Українська література
Ф
Французский язык
П
Психология
А
Алгебра
О
Обществознание
М
МХК
В
Видео-ответы
Г
География
П
Право
Г
Геометрия
А
Английский язык
И
Информатика
Қ
Қазақ тiлi
Л
Литература
И
История
danil546
danil546
08.01.2022 12:41 •  Информатика

Решить в паскале! в файле marks.csv записаны сведения о результатах экзаменов в 9-х классах района. всего в списке 1000 записей, каждая из которых содержит • фамилию • имя • отметки по четырем предметам (, языку, и ). все элементы в каждой строке разделены запятыми. напишите программу, которая читает данные из файла в массив структур (записей) и выводит на экран: а) средний в районе по каждому предмету; б) максимальную сумму , полученных учащимися; в) список учащихся (фамилии и имена), набравших эту максимальную сумму, в алфавитном порядке; г) количество учащихся, получивших хотя бы одну отметку «2». пример данных в файле александрова,маргарита,3,3,4,2 алескеров,имран,3,4,4,2 бармин,владимир,4,3,4,2

Показать ответ
Ответ:
зайчик851
зайчик851
07.10.2020 17:50
// PascalABC.NET 3.3, сборка 1611 от 06.01.2018
// Внимание! Если программа не работает, обновите версию!

type
  Exams=record
    fam:string;
    nam:string;
    ball:=new integer[4];
  end;
    
begin
  var Ls:=new List<Exams>;
  var b:Exams; // буфер
  ReadLines('marks.csv')
      .Foreach(t->begin
          var a:=t.ToWords(',');
          (b.fam,b.nam):=(a[0],a[1]);
          b.ball:=a[2:].Select(q->q.ToInteger).ToArray;
          Ls.Add(b)
          end);
  var n:=Ls.Count;
  // а
  var m:=Arr(0,0,0,0);
  var c:=Ls.Select(t->t.Ball);
  foreach var d in c do
    for var i:=0 to 3 do m[i]+=d[i];
  Writeln('Средние по предметам: ', m[0]/n:0:1,', ',m[1]/n:0:1,
      ', ',m[2]/n:0:1,', ',m[3]/n:0:1);
  // б
  var max:=Ls.Select(t->t.Ball.Sum).Max;
  Writeln(NewLine,'Максимальная сумма ',max);
  // в
  Writeln(NewLine,'Учащиеся, набравшие максимальную сумму :');
  Ls.Where(t->t.Ball.Sum=max).Select(t->t.fam+' '+t.nam)
      .OrderBy(t->t).Println(NewLine);
  // г
  Writeln(NewLine,'Получили хотя бы одну двойку:');
  Ls.Where(t->t.Ball.Any(t->t=2)).Select(t->t.fam+' '+t.nam)
      .OrderBy(t->t).Println(NewLine)
end.

Пример:
Средние по предметам: 3.3, 3.3, 4.0, 2.0

Максимальная сумма 13

Учащиеся, набравшие максимальную сумму :
Алескеров Имран
Бармин Владимир

Получили хотя бы одну двойку:
Александрова Маргарита
Алескеров Имран
Бармин Владимир

Замечание:
В PascalABC.NET 3.3 динамические массивы реализованы с списков, поэтому было принято решение использовать именно список, позволяющий не знать заранее размера массива и добавлять элементы по мере необходимости. Если возникнет причуда иметь данные именно в массиве, перед end. добавьте строку var x:=Ls.ToArray; - она создаст из списка массив х.
0,0(0 оценок)
Ответ:
Miniplayer
Miniplayer
11.01.2024 03:20
Хорошо, давайте разберемся с этой задачей по шагам.

Шаг 1: Чтение данных из файла в массив структур
Для начала нам нужно открыть файл marks.csv и прочитать данные из него. Мы будем использовать функцию AssignFile для связывания файла с переменной типа TextFile и функцию Reset для чтения данных из файла.

Примерный код для этого шага выглядит следующим образом:

```pascal
type
Student = record
LastName: string;
FirstName: string;
LanguageMark: Integer;
MathMark: Integer;
HistoryMark: Integer;
GeographyMark: Integer;
end;

var
MarksFile: TextFile;
Students: array[1..1000] of Student;
i: Integer;
begin
AssignFile(MarksFile, 'marks.csv');
Reset(MarksFile);

i := 1;
while not Eof(MarksFile) do
begin
ReadLn(MarksFile, Students[i].LastName, Students[i].FirstName,
Students[i].LanguageMark, Students[i].MathMark, Students[i].HistoryMark,
Students[i].GeographyMark);
Inc(i);
end;

CloseFile(MarksFile);
end.
```

Шаг 2: Вычисление среднего значения по каждому предмету
Теперь, когда мы прочитали данные из файла, мы можем вычислить среднее значение по каждому предмету. Мы будем использовать цикл для прохода через все записи в массиве структур и вычисление суммарной оценки по каждому предмету. Затем мы разделим эту сумму на количество записей в массиве, чтобы получить среднее значение.

Примерный код для этого шага выглядит следующим образом:

```pascal
var
LanguageSum, MathSum, HistorySum, GeographySum: Integer;

LanguageAvg, MathAvg, HistoryAvg, GeographyAvg: Real;

begin
LanguageSum := 0;
MathSum := 0;
HistorySum := 0;
GeographySum := 0;

for i := 1 to 1000 do
begin
LanguageSum := LanguageSum + Students[i].LanguageMark;
MathSum := MathSum + Students[i].MathMark;
HistorySum := HistorySum + Students[i].HistoryMark;
GeographySum := GeographySum + Students[i].GeographyMark;
end;

LanguageAvg := LanguageSum / 1000;
MathAvg := MathSum / 1000;
HistoryAvg := HistorySum / 1000;
GeographyAvg := GeographySum / 1000;

WriteLn('Средняя оценка по языку:', LanguageAvg:0:2);
WriteLn('Средняя оценка по математике:', MathAvg:0:2);
WriteLn('Средняя оценка по истории:', HistoryAvg:0:2);
WriteLn('Средняя оценка по географии:', GeographyAvg:0:2);
end.
```

Шаг 3: Вычисление максимальной суммы оценок и список учащихся с этой суммой
Для того чтобы найти максимальную сумму оценок, мы будем использовать цикл для прохода через все записи в массиве структур и нахождения суммы оценок для каждого ученика. Затем мы будем сравнивать эту сумму с максимальной найденной суммой и обновлять ее, если текущая сумма больше. После этого мы составим список учащихся, у которых сумма оценок равна максимальной сумме.

Примерный код для этого шага выглядит следующим образом:

```pascal
var
MaxSum: Integer;
StudentsWithMaxSum: array[1..1000] of string;
StudentsCountWithMaxSum: Integer;

begin
MaxSum := 0;
StudentsCountWithMaxSum := 0;

for i := 1 to 1000 do
begin
// Находим сумму оценок каждого ученика
Sum := Students[i].LanguageMark + Students[i].MathMark +
Students[i].HistoryMark + Students[i].GeographyMark;

// Обновляем максимальную сумму, если текущая сумма больше
if Sum > MaxSum then
begin
MaxSum := Sum;
StudentsCountWithMaxSum := 1;
StudentsWithMaxSum[StudentsCountWithMaxSum] :=
Students[i].LastName + ' ' + Students[i].FirstName;
end
else if Sum = MaxSum then
begin
// Добавляем ученика в список, если его сумма оценок такая же, как у максимальной
Inc(StudentsCountWithMaxSum);
StudentsWithMaxSum[StudentsCountWithMaxSum] :=
Students[i].LastName + ' ' + Students[i].FirstName;
end;
end;

WriteLn('Максимальная сумма оценок:', MaxSum);
WriteLn('Список учащихся с максимальной суммой оценок:');

// Сортируем список учеников в алфавитном порядке
for i := 1 to StudentsCountWithMaxSum - 1 do
begin
for j := i + 1 to StudentsCountWithMaxSum do
begin
if StudentsWithMaxSum[i] > StudentsWithMaxSum[j] then
begin
Temp := StudentsWithMaxSum[i];
StudentsWithMaxSum[i] := StudentsWithMaxSum[j];
StudentsWithMaxSum[j] := Temp;
end;
end;
end;

// Выводим список учеников
for i := 1 to StudentsCountWithMaxSum do
WriteLn(StudentsWithMaxSum[i]);
end.
```

Шаг 4: Подсчет количества учеников, получивших хотя бы одну оценку "2"
Чтобы подсчитать количество учеников, получивших хотя бы одну оценку "2", мы снова будем использовать цикл для прохода через все записи в массиве структур и проверки условия, что хотя бы одна оценка равна 2. Если условие выполняется, мы увеличиваем счетчик на 1.

Примерный код для этого шага выглядит следующим образом:

```pascal
var
StudentsWith2Count: Integer;

begin
StudentsWith2Count := 0;

for i := 1 to 1000 do
begin
if (Students[i].LanguageMark = 2) or (Students[i].MathMark = 2) or
(Students[i].HistoryMark = 2) or (Students[i].GeographyMark = 2) then
Inc(StudentsWith2Count);
end;

WriteLn('Количество учащихся, получивших хотя бы одну оценку "2":',
StudentsWith2Count);
end.
```

Теперь у нас есть полная программа, которая читает данные из файла, выполняет различные вычисления и выводит результаты на экран. Вы можете объединить все шаги в одну программу и запустить ее для получения результатов.

Общий код для всех шагов выглядит следующим образом:

```pascal
program SchoolMarks;

type
Student = record
LastName: string;
FirstName: string;
LanguageMark: Integer;
MathMark: Integer;
HistoryMark: Integer;
GeographyMark: Integer;
end;

var
MarksFile: TextFile;
Students: array[1..1000] of Student;
i, j, Sum: Integer;
LanguageSum, MathSum, HistorySum, GeographySum: Integer;
LanguageAvg, MathAvg, HistoryAvg, GeographyAvg: Real;
MaxSum: Integer;
StudentsWithMaxSum: array[1..1000] of string;
StudentsCountWithMaxSum: Integer;
Temp: string;
StudentsWith2Count: Integer;

begin
AssignFile(MarksFile, 'marks.csv');
Reset(MarksFile);

i := 1;
while not Eof(MarksFile) do
begin
ReadLn(MarksFile, Students[i].LastName, Students[i].FirstName,
Students[i].LanguageMark, Students[i].MathMark, Students[i].HistoryMark,
Students[i].GeographyMark);
Inc(i);
end;

CloseFile(MarksFile);

LanguageSum := 0;
MathSum := 0;
HistorySum := 0;
GeographySum := 0;

for i := 1 to 1000 do
begin
LanguageSum := LanguageSum + Students[i].LanguageMark;
MathSum := MathSum + Students[i].MathMark;
HistorySum := HistorySum + Students[i].HistoryMark;
GeographySum := GeographySum + Students[i].GeographyMark;
end;

LanguageAvg := LanguageSum / 1000;
MathAvg := MathSum / 1000;
HistoryAvg := HistorySum / 1000;
GeographyAvg := GeographySum / 1000;

WriteLn('Средняя оценка по языку:', LanguageAvg:0:2);
WriteLn('Средняя оценка по математике:', MathAvg:0:2);
WriteLn('Средняя оценка по истории:', HistoryAvg:0:2);
WriteLn('Средняя оценка по географии:', GeographyAvg:0:2);

MaxSum := 0;
StudentsCountWithMaxSum := 0;

for i := 1 to 1000 do
begin
Sum := Students[i].LanguageMark + Students[i].MathMark +
Students[i].HistoryMark + Students[i].GeographyMark;

if Sum > MaxSum then
begin
MaxSum := Sum;
StudentsCountWithMaxSum := 1;
StudentsWithMaxSum[StudentsCountWithMaxSum] :=
Students[i].LastName + ' ' + Students[i].FirstName;
end
else if Sum = MaxSum then
begin
Inc(StudentsCountWithMaxSum);
StudentsWithMaxSum[StudentsCountWithMaxSum] :=
Students[i].LastName + ' ' + Students[i].FirstName;
end;
end;

WriteLn('Максимальная сумма оценок:', MaxSum);
WriteLn('Список учащихся с максимальной суммой оценок:');

for i := 1 to StudentsCountWithMaxSum - 1 do
begin
for j := i + 1 to StudentsCountWithMaxSum do
begin
if StudentsWithMaxSum[i] > StudentsWithMaxSum[j] then
begin
Temp := StudentsWithMaxSum[i];
StudentsWithMaxSum[i] := StudentsWithMaxSum[j];
StudentsWithMaxSum[j] := Temp;
end;
end;
end;

for i := 1 to StudentsCountWithMaxSum do
WriteLn(StudentsWithMaxSum[i]);

StudentsWith2Count := 0;

for i := 1 to 1000 do
begin
if (Students[i].LanguageMark = 2) or (Students[i].MathMark = 2) or
(Students[i].HistoryMark = 2) or (Students[i].GeographyMark = 2) then
Inc(StudentsWith2Count);
end;

WriteLn('Количество учащихся, получивших хотя бы одну оценку "2":',
StudentsWith2Count);
end.
```

Надеюсь, что этот подробный ответ будет полезен для вас и поможет в решении задачи! Если у вас возникнут еще вопросы, не стесняйтесь задавать их.
0,0(0 оценок)
Популярные вопросы: Информатика
Полный доступ
Позволит учиться лучше и быстрее. Неограниченный доступ к базе и ответам от экспертов и ai-bota Оформи подписку
logo
Начни делиться знаниями
Вход Регистрация
Что ты хочешь узнать?
Спроси ai-бота