Форум «Всё о Паскале» _ Задачи _ работа с записями
Автор: 18192123 28.11.2006 1:28
Дан массив записей. Каждая запись содержит сведения о студенте группы: Ф.И.О., оценки по 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 28.11.2006 1:34
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 - это избыточная информация, не нужно хранить то, что можно получить из имеющейся информации
Автор: мисс_граффити 28.11.2006 2:49
Цитата
Сформировать множество цифр, которых нет в записи хотя бы одного из чисел массива.
По-моему, тут можно двояко трактовать. Либо те цифры, которые не встречаются ни в одном из чисел. Либо те, которые встречаются не во всех... Скорее второе. Уточнить не можешь?
Автор: lapp 28.11.2006 5:10
Цитата(18192123 @ 27.11.2006 22:28)
дан массив из эн натур. чисел. Сформировать множество цифр, которых нет в записи хотя бы одного из чисел массива.
Цитата(мисс_граффити @ 27.11.2006 23:49)
По-моему, тут можно двояко трактовать.
Условие сформулировано абсолютно четко, никаких двояких толкований. Могу перефразировать: в искомом множестве должны быть все цифры, кроме тех, которые входят в запись всех чисел.
Автор: мисс_граффити 28.11.2006 5:17
"которых нет в записи хотя бы одного" = "не те, которые есть в записи хотя бы одного" нет? запуталась. это из серии "ни один" и "любой" - синонимы или антонимы....
Автор: lapp 28.11.2006 5:34
Цитата(мисс_граффити @ 28.11.2006 2:17)
"которых нет в записи хотя бы одного" = "не те, которые есть в записи хотя бы одного"
нет, вот так: "которых нет в записи хотя бы одного" = "не те, которые есть в записи всех"
Согласен, тут русский превносит свой колорит.. сочетание "хотя бы один" трудно формализовать. Можно так: X принадлежит M, если ......... существует >=1 слОва, в которых X отсутствует X не принадлежит M, если .......... существует ровно 0 слов, в которых X отсутствует
Автор: Bokul 28.11.2006 5:46
Переношу тему в http://forum.pascal.net.ru/index.php?showforum=42
Автор: lapp 28.11.2006 6:00
Цитата(Bokul @ 28.11.2006 2:46)
Переношу тему в http://forum.pascal.net.ru/index.php?showforum=42
Bokul, хохмач, хоть бы улыбнулся при этом! )))) С каких это пор математика стала предметом голосования?? PS хватит флудить..
Автор: Bokul 28.11.2006 6:11
Цитата
Bokul, хохмач, хоть бы улыбнулся при этом! smile.gif))))
Дык я на полном серьёзе P.S. только форум что-то глючит... P.S.S. все, убегаю, больше не буду... P.S.S.S. поверели...
Автор: 18192123 29.11.2006 0:06
Спасибо! смысл стал яснее! Но вот с чего мне начинать? Вот ввела массив, а как быть с записью, не пойму как её формировать... И ещё вопрос: в итоге мне нужно множество, для которого не определены операции вывода. Как демонстрировать результат, что выводить в конце?
Автор: мисс_граффити 29.11.2006 0:30
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 29.11.2006 0:46
Цитата(мисс_граффити @ 28.11.2006 20:30)
или я вопрос не поняла...?
У меня 2 задачки в этой теме, с первой - я разобралась, а вот с этой "а вот ещё: дан массив из эн натур. чисел. Сформировать множество цифр, которых нет в записи хотя бы одного из чисел массива. "
ну никак!
Автор: volvo 29.11.2006 1:02
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 29.11.2006 3:13
Цитата(volvo @ 28.11.2006 21:02)
18192123, а поконкретнее, что ИМЕННО не получается?
На счет одной задачи в теме - я поняла. Действительно бардак получается! ну а с задачей вот что: прежде всего не пойму насчет записи цифр, что там должно быть, как её формировать?
Автор: 18192123 30.11.2006 22:20
для множеств нет операций ввода,вывода. а мне по условию второй задачи нужно сформировать именно его, а как выводить собственно результаты работы, ведь фактически это множество.
и ещё: в чём здесь смысл, почему мы делаем так
digits := digits + [T mod 10]; T := T div 10;
Автор: мисс_граффити 30.11.2006 22:27
а, ты про это... вывод
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 1.12.2006 0:31
Вот что у меня получилось, только всегда выводит от 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.
Автор: мисс_граффити 1.12.2006 1:21
естественно, у тебя будет выводится от 0 до 9. Ты же сама пишешь:
is_mn:=[0..9];
а вместо T у тебя должно быть a[i] - тебе же исследовать не мифическое Т, а элементы конкретного массива.
Автор: 18192123 1.12.2006 1:50
Цитата(мисс_граффити @ 30.11.2006 21:21)
естественно, у тебя будет выводится от 0 до 9. Ты же сама пишешь:
is_mn:=[0..9];
а вместо T у тебя должно быть a[i] - тебе же исследовать не мифическое Т, а элементы конкретного массива.
мне что Т вообще не нужно? а что насчет записи?
Автор: мисс_граффити 1.12.2006 1:54
T - абсолютно не нужно. вместо него пишешь a[i] и делаешь снаружи цикл по i. то есть чтобы действия, описанные volvo, выполнялись для каждого элемента. записи? сначала у тебя множество пустое. а добавление в него эл-тов происходит здесь:
rez_mn:=rez_mn+[T mod 10];
Автор: 18192123 1.12.2006 1:58
Цитата(мисс_граффити @ 30.11.2006 21:54)
T - абсолютно не нужно. вместо него пишешь a[i] и делаешь снаружи цикл по i. то есть чтобы действия, описанные volvo, выполнялись для каждого элемента. записи? сначала у тебя множество пустое. а добавление в него эл-тов происходит здесь:
rez_mn:=rez_mn+[T mod 10];
ты наверное не правильно поняла меня насчет записи: "а вот ещё: дан массив из эн натур. чисел. Сформировать множество цифр, которых нет в записи хотя бы одного из чисел массива. "
Автор: Malice 1.12.2006 2:36
Похоже вот этот блок в твоей программе:
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
Автор: мисс_граффити 1.12.2006 2:39
18192123, запись числа - это совокупность его цифр, написанных по определенному закону! это то, что мы записываем. тут речь не про тип "запись".
Автор: volvo 1.12.2006 2:50
Цитата
T - абсолютно не нужно. вместо него пишешь a[i] и делаешь снаружи цикл по i.
То есть, посмотреть на контекст нельзя никак? Сообщение №13 что говорит? Я по-моему, объяснил, ЗАЧЕМ здесь нужно T?
Автор: мисс_граффити 1.12.2006 2:57
Ой. Сорри. А нельзя тему на 2 разделить?
Автор: 18192123 1.12.2006 3:02
Цитата(мисс_граффити @ 30.11.2006 22:39)
тут речь не про тип "запись".
Всё! теперь понятно!
Автор: 18192123 4.12.2006 0:48
ещё один вопрос: составила прогу для второй задачи без процедур: все работает
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 4.12.2006 0:51
procedure creat_mn(const a:vect); { <--- Проблема в Const }
Ты запретила изменять множество, а ниже пытаешься это делать... Значит, тебе надо Var ...
Автор: 18192123 4.12.2006 1:16
Цитата(volvo @ 3.12.2006 20:51)
procedure creat_mn(const a:vect); { <--- Проблема в Const }
Ты запретила изменять множество, а ниже пытаешься это делать... Значит, тебе надо Var ...
компиляция проходит успешно, а программа выдает все цифры от 0 до 9 ??????????????????
Автор: volvo 4.12.2006 1:26
Цитата
а программа выдает все цифры от 0 до 9
А что ты думала она будет выдавать? mn_4isel - локальная переменная, после выхода из процедуры уничтожается, а глобальная с тем же именем ничего про процедуру create_mn вообще не знает, и естественно равна [] ... Все правильно... Тебе надо как-то возвращать множество из процедуры... Подумай, как...
Автор: 18192123 4.12.2006 1:40
Цитата(volvo @ 3.12.2006 21:26)
А что ты думала она будет выдавать? mn_4isel - локальная переменная, после выхода из процедуры уничтожается, а глобальная с тем же именем ничего про процедуру create_mn вообще не знает, и естественно равна [] ... Все правильно... Тебе надо как-то возвращать множество из процедуры... Подумай, как...
у меня такая мысль: объявить mn_4isel в списке формальных параметров(не знаю, как - пытаюсь сделать - ошибки??????)
Автор: 18192123 4.12.2006 3:27
Цитата(18192123 @ 3.12.2006 21:40)
у меня такая мысль: объявить mn_4isel в списке формальных параметров(не знаю, как - пытаюсь сделать - ошибки??????)
я права???
Автор: 18192123 4.12.2006 4:13
Цитата(volvo @ 3.12.2006 21:26)
А что ты думала она будет выдавать? mn_4isel - локальная переменная, после выхода из процедуры уничтожается, а глобальная с тем же именем ничего про процедуру create_mn вообще не знает, и естественно равна [] ... Все правильно... Тебе надо как-то возвращать множество из процедуры... Подумай, как...