Помощь - Поиск - Пользователи - Календарь
Полная версия: работа с записями
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
18192123
Дан массив записей. Каждая запись содержит сведения о студенте группы: Ф.И.О., оценки по 4 предметам.
упорядочить массив по невозрастанию сумм оценок.

начала делать, когда дошла до упорядочения: не пойму, как суммы сравнивать (if sum>sum+1??? или ждесь нужны какие-то индексы?)


uses crt;
type
tablica=record
name:string[18];
matan,alg,TP,info:byte;
sum:byte;
end;
var i,j,n:integer; a:tablica;
mas:array[1..24]of tablica; {tablica - massiv zapicey}
Begin
clrscr;
{vvod kol-va zapisey}
write ('n=');
readln(n);
{vvod elementov v massiv zapicey}
for i:=1 to n do
with mas[i] do
begin
writeln ('i=',i:4);
writeln('FIO');
readln(name);
write ('otsenki');
readln (matan,alg,tp,info);
end;
sum:=0;
for i:=1 to n do
sum:=sum+mas[i].matan+mas[i].alg+mas[i].tp+mas[i].info;
for i:=1 to n-1 do
for j:=1 to n-i do
if {????????}



а вот ещё: дан массив из эн натур. чисел. Сформировать множество цифр, которых нет в записи хотя бы одного из чисел массива.

я не пойму смысла этой задачи, что от меня тут требуется?
klem4
function Total(const T: tablica): Integer;
var
s: Integer;
begin
s := 0;
with T do
s := s + matan + alg + TP + Info;
Total := s;
end;

//...

var
T: tablica;

// ...

for i := n downto 2 do
for j := 1 to i - 1 do
if Total(mas[j]) < Total(mas[j + 1]) then begin
T := mas[j];
mas[j] := mas[j + 1];
mas[j + 1] := T;
end;






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

По-моему, тут можно двояко трактовать.
Либо те цифры, которые не встречаются ни в одном из чисел.
Либо те, которые встречаются не во всех...
Скорее второе. Уточнить не можешь?
Lapp
Цитата(18192123 @ 27.11.2006 22:28) *

дан массив из эн натур. чисел. Сформировать множество цифр, которых нет в записи хотя бы одного из чисел массива.

Цитата(мисс_граффити @ 27.11.2006 23:49) *

По-моему, тут можно двояко трактовать.

Условие сформулировано абсолютно четко, никаких двояких толкований.
Могу перефразировать:
в искомом множестве должны быть все цифры, кроме тех, которые входят в запись всех чисел.
мисс_граффити
"которых нет в записи хотя бы одного" = "не те, которые есть в записи хотя бы одного"
нет?
запуталась.
это из серии "ни один" и "любой" - синонимы или антонимы....
Lapp
Цитата(мисс_граффити @ 28.11.2006 2:17) *

"которых нет в записи хотя бы одного" = "не те, которые есть в записи хотя бы одного"

smile.gif
нет, вот так: "которых нет в записи хотя бы одного" = "не те, которые есть в записи всех"

Согласен, тут русский превносит свой колорит.. сочетание "хотя бы один" трудно формализовать.
Можно так:
X принадлежит M, если ......... существует >=1 слОва, в которых X отсутствует
X не принадлежит M, если .......... существует ровно 0 слов, в которых X отсутствует
Bokul
Переношу тему в Дискуссионный Клуб
Lapp
Цитата(Bokul @ 28.11.2006 2:46) *

Переношу тему в Дискуссионный Клуб

Bokul, хохмач, хоть бы улыбнулся при этом! smile.gif))))
С каких это пор математика стала предметом голосования??
PS
хватит флудить..
Bokul
Цитата
Bokul, хохмач, хоть бы улыбнулся при этом! smile.gif))))

Дык я на полном серьёзе blum.gif
P.S. только форум что-то глючит...
P.S.S. все, убегаю, больше не буду...
P.S.S.S. поверели...
18192123
Спасибо! смысл стал яснее! Но вот с чего мне начинать?
Вот ввела массив, а как быть с записью, не пойму как её формировать...
И ещё вопрос: в итоге мне нужно множество, для которого не определены операции вывода.
Как демонстрировать результат, что выводить в конце?
мисс_граффити
18192123, давай не будем сваливать в кучу 2 независимых задачи? а то путаница будет...
запись - это элемент массива, соответственно, ввести массив, не сформировав записи, не удастся.
если бы у тебя был массив целых чисел, заполнение было бы простым. Ну, что-то вроде такого:
for i:=1 to n do
begin
writeln('введите элемент');
readln(mas[i]);
end

Здесь же элемент - запись, состоящая из нескольких полей, каждое из которых надо заполнить. Например, так:
for i:=1 to n do
begin
writeln('введите фамилию');
readln(mas[i].name); {здесь мы заносим значение как бы не в целый элемент, а в его кусочек}
writeln('введите оценку по матану');
readln(mas[i].matan);
{и так со всеми полями}
end


это ты вполне благополучно делаешь:
for i:=1 to n do
with mas[i] do {благодаря этой строчке тебе не надо каждый раз писать mas[i].name - достаточно просто name}
begin
writeln ('i=',i:4);
writeln('FIO');
readln(name);
write ('otsenki');
readln (matan,alg,tp,info);
end;


в чем проблема-то?
или я вопрос не поняла...?
18192123
Цитата(мисс_граффити @ 28.11.2006 20:30) *


или я вопрос не поняла...?

У меня 2 задачки в этой теме, с первой - я разобралась, а вот с этой
"а вот ещё: дан массив из эн натур. чисел. Сформировать множество цифр, которых нет в записи хотя бы одного из чисел массива. "

ну никак!
volvo
18192123, а поконкретнее, что ИМЕННО не получается? Не можешь найти множество цифр, встречающихся в каждом числе?

Смотри:
for i := 1 to n do begin
digits := []; { <--- в начале обработки этого числа - пустое множество }
T := a[i]; { <--- временный буффер, чтобы не портить сам массив }

while T > 0 do begin
digits := digits + [T mod 10];
T := T div 10;
end;
{
Вот тут у тебя множество digits уже заполнено всеми цифрами,
которые есть в текущем элементе массива
}
end;


А вот теперь подумай, что нужно сделать, чтобы найти все числа, которые ЕСТЬ в каждом элементе массива? А потом из множества всех существующих цифр просто вычтешь найденное, и все...

М
P.S. На будущее - ОДНА тема - ОДИН вопрос...
Чтобы вот такого бардака, как сейчас не было...

18192123
Цитата(volvo @ 28.11.2006 21:02) *

18192123, а поконкретнее, что ИМЕННО не получается?

На счет одной задачи в теме - я поняла. Действительно бардак получается!
ну а с задачей вот что:
прежде всего не пойму насчет записи цифр, что там должно быть, как её формировать?
18192123
для множеств нет операций ввода,вывода.
а мне по условию второй задачи нужно сформировать именно его, а как выводить собственно результаты работы, ведь фактически это множество.

и ещё: в чём здесь смысл, почему мы делаем так


digits := digits + [T mod 10];
T := T div 10;


мисс_граффити
а, ты про это... вывод
for i:=0 to 9 do
if i in mn then
writeln(i)


а здесь:
digits := digits + [T mod 10];
T := T div 10;

мы разбиваем число на цифры.
допустим, у нас есть число Т=273.
на первом проходе T mod 10 даст нам 3. После этого делаем T div 10, получаем Т=27. На следующем проходе аналогично выделяем 7, а в Т остается 2.. идем на третий проход. Выделили 2, в Т остался 0.
18192123
Вот что у меня получилось, только всегда выводит от 0 до 9-ти;
и еще: я не знаю, как сюда приплести запись чисел массива


uses crt;
const n=5;
type vect=array[1..n]of integer;
var a:vect;
i:byte;
T:integer;
rez_mn,is_mn:set of byte;
begin
clrscr;
for i:=1 to n do read(a[i]);
is_mn:=[0..9];
for i:=1 to n do
begin
rez_mn:=[];
t:=a[i];
while T<>0 do
begin
rez_mn:=rez_mn+[T mod 10];
T:=T div 10;
end;
end;
rez_mn:=is_mn-rez_mn;
for i:=0 to 9 do
begin
if i in rez_mn then
writeln (i);
end;
readkey;
end.



мисс_граффити
естественно, у тебя будет выводится от 0 до 9. Ты же сама пишешь:
is_mn:=[0..9];
smile.gif

а вместо T у тебя должно быть a[i] - тебе же исследовать не мифическое Т, а элементы конкретного массива.
18192123
Цитата(мисс_граффити @ 30.11.2006 21:21) *

естественно, у тебя будет выводится от 0 до 9. Ты же сама пишешь:
is_mn:=[0..9];
smile.gif

а вместо T у тебя должно быть a[i] - тебе же исследовать не мифическое Т, а элементы конкретного массива.

мне что Т вообще не нужно?
а что насчет записи?
мисс_граффити
T - абсолютно не нужно.
вместо него пишешь a[i] и делаешь снаружи цикл по i. то есть чтобы действия, описанные volvo, выполнялись для каждого элемента.
записи? сначала у тебя множество пустое. а добавление в него эл-тов происходит здесь:
rez_mn:=rez_mn+[T mod 10];
18192123
Цитата(мисс_граффити @ 30.11.2006 21:54) *

T - абсолютно не нужно.
вместо него пишешь a[i] и делаешь снаружи цикл по i. то есть чтобы действия, описанные volvo, выполнялись для каждого элемента.
записи? сначала у тебя множество пустое. а добавление в него эл-тов происходит здесь:
rez_mn:=rez_mn+[T mod 10];


ты наверное не правильно поняла меня насчет записи:
"а вот ещё: дан массив из эн натур. чисел. Сформировать множество цифр, которых нет в записи хотя бы одного из чисел массива. "
Malice
Похоже вот этот блок в твоей программе:

rez_mn:=is_mn-rez_mn;
for i:=0 to 9 do
begin
if i in rez_mn then

надо поменять на:
is_mn:=is_mn-rez_mn;
for i:=0 to 9 do
begin
if i in is_mn then
мисс_граффити
18192123, запись числа - это совокупность его цифр, написанных по определенному закону! это то, что мы записываем.
тут речь не про тип "запись".
volvo
Цитата
T - абсолютно не нужно.
вместо него пишешь a[i] и делаешь снаружи цикл по i.
То есть, посмотреть на контекст нельзя никак? Сообщение №13 что говорит? Я по-моему, объяснил, ЗАЧЕМ здесь нужно T?
мисс_граффити
Ой. Сорри.
А нельзя тему на 2 разделить?
18192123
Цитата(мисс_граффити @ 30.11.2006 22:39) *

тут речь не про тип "запись".

Всё! теперь понятно!
18192123
ещё один вопрос:
составила прогу для второй задачи без процедур: все работает

Program lab_8_2;
uses crt;
const n=5;
type vect=array[1..n]of integer;
procedure input(var a:vect);
var i:byte;
begin
writeln ('vvedite massiv naturalnih 4isel');
for i:=1 to n do
read (a[i]);
end;
VAR
a:vect;
i,k:byte;
is_mn,rez_mn,mn_4isel:set of byte;
BEGIN
CLRSCR;
input (a);
mn_4isel:=[];
for i:=1 to n do begin
while a[i]<>0 do
begin
mn_4isel:=mn_4isel+[a[i] mod 10];
a[i]:=a[i] div 10;
end;
end;

is_mn:=[0..9];
rez_mn:=is_mn-mn_4isel;
for k:=0 to 9 do
begin
if k in rez_mn then
writeln (k);
end;
readkey;
end.





теперь хочу дополнить программу процедурой - не получается; не пойму в чем дело?


Program lab_8_2;
uses crt;
const n=5;
type vect=array[1..n]of integer;
procedure input(var a:vect);
var i:byte;
begin
writeln ('vvedite massiv naturalnih 4isel');
for i:=1 to n do
read (a[i]);
end;
procedure creat_mn(const a:vect);
var
mn_4isel:set of byte; i:byte;
begin
mn_4isel:=[];
for i:=1 to n do
begin
while a[i]<>0 do
begin
mn_4isel:=mn_4isel+[a[i] mod 10];
a[i]:=a[i] div 10;
end;
end;
end;

VAR
a:vect;
i:byte;
is_mn,rez_mn,mn_4isel:set of byte;
BEGIN
CLRSCR;
input (a);
creat_mn(a,i);
is_mn:=[0..9];
rez_mn:=is_mn-mn_4isel;
for i:=0 to 9 do
begin
if i in rez_mn then
writeln (i);
end;
readkey;
end.



volvo
procedure creat_mn(const a:vect); { <--- Проблема в Const }
Ты запретила изменять множество, а ниже пытаешься это делать... Значит, тебе надо Var ...
18192123
Цитата(volvo @ 3.12.2006 20:51) *

procedure creat_mn(const a:vect); { <--- Проблема в Const }
Ты запретила изменять множество, а ниже пытаешься это делать... Значит, тебе надо Var ...

компиляция проходит успешно, а программа выдает все цифры от 0 до 9
??????????????????
volvo
Цитата
а программа выдает все цифры от 0 до 9
blink.gif А что ты думала она будет выдавать? mn_4isel - локальная переменная, после выхода из процедуры уничтожается, а глобальная с тем же именем ничего про процедуру create_mn вообще не знает, и естественно равна [] ... Все правильно... Тебе надо как-то возвращать множество из процедуры... Подумай, как...
18192123
Цитата(volvo @ 3.12.2006 21:26) *

blink.gif А что ты думала она будет выдавать? mn_4isel - локальная переменная, после выхода из процедуры уничтожается, а глобальная с тем же именем ничего про процедуру create_mn вообще не знает, и естественно равна [] ... Все правильно... Тебе надо как-то возвращать множество из процедуры... Подумай, как...

у меня такая мысль:
объявить mn_4isel в списке формальных параметров(не знаю, как - пытаюсь сделать - ошибки??????)
18192123
Цитата(18192123 @ 3.12.2006 21:40) *

у меня такая мысль:
объявить mn_4isel в списке формальных параметров(не знаю, как - пытаюсь сделать - ошибки??????)

я права???
18192123
Цитата(volvo @ 3.12.2006 21:26) *

blink.gif А что ты думала она будет выдавать? mn_4isel - локальная переменная, после выхода из процедуры уничтожается, а глобальная с тем же именем ничего про процедуру create_mn вообще не знает, и естественно равна [] ... Все правильно... Тебе надо как-то возвращать множество из процедуры... Подумай, как...

ну объясните пожалуйста, как нужно

в правильном ли направлении я думаю???????
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.