Консультация № 178074
28.04.2010, 11:14
42.84 руб.
0 8 1
Доброго времени суток Дорогие Эксперты:

Требуется решить 2 задания в среде тп-7 на тему "Комбинированный тип. Тип запись";

Задание 1: Используя данное представление структуры данных :
----------------------------------------------------------------------------------------
1) type ДеньНедели = (пн, вт, ср, чт, пт, сб, вс);
Время = record
часы: 0..23;
минуты: 0..59
end;
Семинар = record
предмет, преподаватель: String;
день: ДеньНедели;
часы: record
начало, конец: Время
end;
номер_группы: 1..300;
аудитория: Integer;
end.
-----------------------------------------------------------------------------------
написать программу, печатающую расписание группы с номером n на конкретный день недели.

задача 2)
Для задачи составить структуру данных (типа запись или массив записей) и организовать соответствующую обработку данных согласно условию задачи.

сама задача:
2) В таблицу занесена информация об итогах зимней сессии на 1 курсе. Сведения о каждом студенте заданы в виде следующего текста: <фамилия>, <номер группы>, <оценка1>, <оценка2>, <оценка3>, причем, <номер группы> - целое число от 101 до 116, <оценка> - это 2, 3, 4 или 5, причем первая по мат. анализу, втора по алгебре, третья по программированию. Написать программу, которая определяет:
А) "качество" успеваемости, т.е. процент студентов, сдавших все экзамены на 5 и 4;
Б) название предмета, который был сдан лучше всего.

Обсуждение

Неизвестный
29.04.2010, 12:27
общий
Как хранить информацию: в виде массива фиксированной длины, в виде динамического массива или, может, в виде динамической структуры - списка, али еще что?
Может в файле? (текстовом, типизированном, бинарном?)
Неизвестный
29.04.2010, 18:49
общий
это ответ
Здравствуйте, Юдин Евгений Сергеевич.

В приложении приведено решение второй задачи. Пример исходных данных:
Код:
Пупкин , 101 , 3,4,5
Иванов , 101 , 4,4,4
Петров , 101 , 4,5,5
Сидоров, 102 , 3,2,3
Жуков,102,4,5,4


Программа отлажена в Borland Pascal 7.0
При возникновении вопросов обращайтесь в мини-форум.

Успехов!

Приложение:
{
Для задачи составить структуру данных (типа запись или массив записей)
и организовать соответствующую обработку данных согласно условию задачи.
Сама задача:
В таблицу занесена информация об итогах зимней сессии на 1 курсе.
Сведения о каждом студенте заданы в виде следующего текста: <фамилия>,
<номер группы>, <оценка1>, <оценка2>, <оценка3>, причем, <номер
группы> - целое число от 101 до 116, <оценка> - это 2, 3, 4 или 5,
причем первая по мат. анализу, вторая по алгебре, третья по
программированию. Написать программу, которая определяет:

А) "качество" успеваемости, т.е. процент студентов, сдавших все
экзамены на 5 и 4;
Б) название предмета, который был сдан лучше всего.
}
program q178074b;

type
PTStudent = ^TStudent;
TStudent = record
next : PTStudent;
name : string; { фамилия }
group: byte; { номер группы }
mark : array [0..2] of byte; { оценки }
end;

var
nTotal : integer; { общее кол-во корректных записей в файле }

{ удаление из строки начальных и конечных пробелов }
function trim( s: string ): string;
var i,j : integer;
begin
i := length( s );
while i > 0 do begin { пропускаем конечные пробелы }
if (s[i] <> ' ') and (s[i] <> #9) then break;
dec( i );
end;
j := 1;
while j <= i do begin { пропускаем начальные пробелы }
if (s[j] <> ' ') and (s[j] <> #9) then break;
inc( j );
end;
trim := copy( s, j, i-j+1 );
end;

{ разбор одной строки и добавление в конец списка }
function parseLine( s: string; var pListEnd: PTStudent ): boolean;
var
i, i1, i2, code : integer;
m : byte;
r : TStudent;
pR: PTStudent;
begin
parseLine := false; { при любой ошибке выходим и возвращаем false }

{ фамилия, номер_группы, оценка1, оценка2, оценка3 }
{ 1. фамилия }
i1 := pos( ',', s );
if i1 = 0 then exit;
r.name := trim(copy( s, 1, i1-1 ));

{ 2. номер групы }
s[i1] := ' ';
i2 := pos( ',', s );
if i2 = 0 then exit;
inc( i1 );
val( trim(copy( s, i1, i2-i1 )), r.group, code );
if (code <> 0) or (r.group < 101) or (r.group > 116) then exit;

{ 3. читаем оценки }
for i := 0 to 2 do begin
i1 := i2;
s[i1] := ' ';
if i < 2 then begin
i2 := pos( ',', s );
if i2 = 0 then exit;
end
else
i2 := length( s ) + 1;
inc( i1 );
val( trim(copy( s, i1, i2-i1 )), m, code );
if (code <> 0) or (m < 2) or (m > 5) then exit;
r.mark[i] := m;
end;

{ добавляем новую запись в конец списка, так что при просмотре
списка записи идут в том же порядке, что и в файле }
new( pR );
r.next := nil;
pR^ := r;
if pListEnd <> nil then
pListEnd^.next := pR;
pListEnd := pR;

parseLine := true;
end;

{ чтение файла с заданным именем и формирование списка }
function readFile( fname: string ): PTStudent;
var
f: text;
s: string;
pList, pListEnd: PTStudent;
begin
pList := nil;
pListEnd := nil;
nTotal:= 0;

assign( f, fname );
reset( f );
while not eof(f) do begin { читаем по одной строке до конца файла }
readln( f, s );
if parseLine( s, pListEnd ) then begin
inc( nTotal ); { подсчитываем число студентов }
if pList = nil then pList := pListEnd;
end;
end;
close( f );
readFile := pList; { возвращаем сформированный список }
end;

{ дополнение строки пробелами (для форматированного вывода) }
function pad_with_spaces( s: string; len: integer ): string;
var n: integer;
begin
n := length( s );
while n < len do begin
inc(n);
s[n] := ' ';
end;
s[0] := chr( n );
pad_with_spaces := s;
end;

{ вывод списка на экран }
procedure print_list( pList: PTStudent );
var
i, nGood: word;
good : boolean;
begin
writeln( '--------------------------------' );
while pList <> nil do begin
with pList^ do begin
write( pad_with_spaces( name, 20 ), group:4, ' ' );
for i := 0 to 2 do write( mark[i]:2 );
writeln;
end;
pList := pList^.next;
end;
writeln( '--------------------------------' );
end;

{ вычисление качества успеваемости }
function quality( pList: PTStudent ): real;
var
i, nGood: word;
good : boolean;
begin
nGood := 0; { счетчик успевающих студентов }
while pList <> nil do begin
good := true;
with pList^ do
for i := 0 to 2 do
if mark[i] < 4 then begin
good := false;
break;
end;
if good then inc( nGood );
pList := pList^.next;
end;
quality := nGood*100.0/nTotal;
end;

{ определяем предмет, сданный лучше всего, по сумме баллов }
function bestSubject( pList: PTStudent ): word;
var
i, iMax, max: word;
s : array [0..2] of word;
begin
for i := 0 to 2 do { инициализируем суммы баллов }
s[i] := 0;

while pList <> nil do begin
with pList^ do
for i := 0 to 2 do
inc( s[i], mark[i] );

pList := pList^.next;
end;
{ ищем предмет с максимальной суммой баллов }
max := 0;
for i := 0 to 2 do
if s[i] > max then begin max := s[i]; iMax := i; end;

bestSubject := iMax;
end;

{ удаление всего списка }
procedure clear_data( pList: PTStudent );
var p: PTStudent;
begin
while pList <> nil do begin
p := pList^.next;
dispose( pList );
pList := p;
end;
end;

var
pList : PTStudent;
fname : string;

const
subj : array [0..2] of string[16] =
( 'мат.анализ', 'алгебра', 'программирование' );

begin
write( 'Введите имя файла с данными: ' ); readln( fname );
pList := readFile( fname );
if pList <> nil then begin
print_list( pList );
writeln( 'Качество успеваемости = ', quality( pList ):6:2, '%' );
writeln( 'Лучше всего сдали предмет "', subj[bestSubject( pList )], '"');
end;
clear_data( pList );
end.
Неизвестный
30.04.2010, 15:03
общий
[b]amnick[/b]:
В каком формате проверять? я вставлял в txt.txt фаил ваш пример данных и программа не работает. Кто что подскажет?
Неизвестный
30.04.2010, 16:05
общий
Юдин Евгений Сергеевич:
Как именно не работает? Что сообщает? Какой результат?
Программу надо скомпилировать и запускать exe-файл не из среды. При запуске из среды Borland Pascal, действительно, какие-то странные глюки при вычислениях с плавающей точкой. Непосредственно из-под Windows (запускается эмулятор DOS) или DOSBOX работает нормально. Вот специально сделал снимок экрана (под картинкой ссылка на полноразмерное изображение (61К), открывается в новом окне):
Неизвестный
30.04.2010, 16:12
общий
amnick:
Да действительно программа работает не из паскаля..... а вот что делать с тем что проверку надо осуществить именно в паскале...вы можете устранить этот глюк и чтобы программа из среды работала?
Неизвестный
30.04.2010, 16:19
общий
Да и что будет с 1 задачей? разобрана тока же одна
Неизвестный
30.04.2010, 17:04
общий
Юдин Евгений Сергеевич:
Цитата: 324791
устранить этот глюк и чтобы программа из среды работала

К сожалению, это глюк не программы, а среды выполнения. Попробуйте выключить поддержку сопроцессора и включить эмуляцию: Options -> Compiler -> Numeric Processing: 8087/80287 - off, Emulation - on. У меня это помогло, тесты прошли нормально.

Цитата: 324791
Да и что будет с 1 задачей? разобрана тока же одна

По правилам: один вопрос — одна задача. Если в вопросе несколько задач, то эксперт имеет право ответить на одну или несколько по своему выбору. Если будет время сегодня, то могу сделать и первую. Обычно, в таких случаях отвечают несколько человек. Первый решает задачу по своему выбору, остальные - или предлагают другой вариант, или решают оставшиеся задачи.
Неизвестный
03.05.2010, 10:43
общий
Цитата: 307758
Цитата: Юдин Евгений Сергеевич
Да и что будет с 1 задачей? разобрана тока же одна

По правилам: один вопрос — одна задача. Если в вопросе несколько задач, то эксперт имеет право ответить на одну или несколько по своему выбору. Если будет время сегодня, то могу сделать и первую. Обычно, в таких случаях отвечают несколько человек. Первый решает задачу по своему выбору, остальные - или предлагают другой вариант, или решают оставшиеся задачи.


Хорошо я это учту
Форма ответа