![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
Rom1k |
![]() ![]()
Сообщение
#1
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 119 Пол: Мужской Репутация: ![]() ![]() ![]() |
Данные о студентах содержат фамилию и набор оценок на экзаменах.Требуется занести данные с клавиатуры в массив записей,упорядочить по фамилиям в алфавитном порядке.
Вот всё,что я смог сделать.мне кажется что в процедуре я что-то не правильно вырезаю.Помогите плиз.Ведь там не так много подправить надо. program n1;
const
nmax=7;
type
sotr=record
name:string[20];{Фамилия}
matan,progr,ist:byte;{Ocenki}
end;
function readdata(var rec:sotr):integer;
var
s:string[80];{Строка ввода}
p:integer;{Номер позиции в строке}
matanS,progrS,istS:string[1];{Строка, содержащая оценку за матан,progr и историю}
error:integer;{Код ошибки при преобразовании строки в число}
begin
readln(s);
if S='' then
ReadData:=-1
else
begin
p:=pos(' ',s);
if p=0 then
ReadData:=1
else
begin
rec.name:=copy(s,1,p-1);
delete(s,1,p);
matanS:=copy(S,1,pos(' ',s));
val(matanS,rec.matan,error);
delete(s,1,length(matanS));
progrS:=copy(S,1,pos(' ',s));
val(progrS,rec.progr,error);
delete(s,1,length(progrS));
istS:=copy(S,1,pos(' ',s));
val(istS,rec.ist,error);
delete(s,1,length(istS));
if Error <> 0 then
ReadData:=1
else
ReadData:=0;
end;
end;
end;
VAR
data:array[1..nmax] of sotr;{Массив записей о служащих}
N:integer;
readResult:integer;{Результат ввода записи}
I,j:integer;{номер очередного эл-та массива}
t:string[25];
BEGIN
{Ввод числа записей}
repeat
write('Задайте число служащих (1..',nmax,')');
readln(n);
if (n<=0) or (N>nmax) then
writeln('Вы ошиблись! Повторите!');
until (n>0) and (n<=nmax);
{Ввод массива записей}
writeln('Введите фамилии студентов и через пробел их оценки ');
for i:=1 to n do
begin
repeat
ReadResult:=ReadData(data[I]);
if ReadResult <> 0 then
writeln('Вы ошиблись! Повторите!');
until ReadResult=0;
end;
for i:=1 to n-1 do
for j:=i+1 to n do
if data[i].name>data[j].name then
begin
t:=data[i].name;
data[i].name:=data[j].name;
data[j].name:=t;
end;
writeln('Фамилия матан прогр история ');
for i:=1 to n do
writeln(data[i].name,' ',data[i].matan,' ',data[i].progr,' ',data[i].ist);
end.
Сообщение отредактировано: Rom1k - 8.04.2007 23:02 |
Rom1k |
![]()
Сообщение
#2
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 119 Пол: Мужской Репутация: ![]() ![]() ![]() |
никто ничем не может помочь?
Сообщение отредактировано: Rom1k - 8.04.2007 23:10 |
Айра |
![]()
Сообщение
#3
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 731 Пол: Женский Репутация: ![]() ![]() ![]() |
Может))) Замени rec.name:=copy(s,1,p-1);
delete(s,1,p);
matanS:=copy(S,1,pos(' ',s));
val(matanS,rec.matan,error);
delete(s,1,length(matanS));
progrS:=copy(S,1,pos(' ',s));
val(progrS,rec.progr,error);
delete(s,1,length(progrS));
istS:=copy(S,1,pos(' ',s));
val(istS,rec.ist,error);
delete(s,1,length(istS));
на rec.name:=copy(s,1,p-1);
delete(s,1,p);
matanS:=copy(S,1,1);
val(matanS,rec.matan,error);
delete(s,1,2);
progrS:=copy(S,1,1);
val(progrS,rec.progr,error);
delete(s,1,2);
istS:=copy(S,1,1);
val(istS,rec.ist,error);
delete(s,1,length(istS));
Но это работает правильно, только если пользователь вводит между оценками по одному пробелу... Хотя сообщение об ошибке выдается. Сообщение отредактировано: Айра - 8.04.2007 23:48 |
КМА |
![]()
Сообщение
#4
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 69 Пол: Мужской Репутация: ![]() ![]() ![]() |
for i:=1 to n-1 do
for j:=i+1 to n do
if data[i].name>data[j].name then
begin
t:=data[i].name;
data[i].name:=data[j].name;
data[j].name:=t;
end;
Здесь ошибка. У тебя не правильно сортируется. Я так понял, ты хочешь пузырьком? Тогда тебе надо по другому, вот так:
for i:=1 to n-1 do
for j:=1 to n-i do
if data[j].name>data[j+1].name then
begin
t:=data[j].name;
data[j].name:=data[j+1].name;
data[j+1].name:=t;
end;
Сообщение отредактировано: КМА - 8.04.2007 23:26 |
Rom1k |
![]()
Сообщение
#5
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 119 Пол: Мужской Репутация: ![]() ![]() ![]() |
КМА неправильно ты мне сортировку написал.Он так не сортирует их вообще.сортировка у меня правильная.
Айра.Большое спасибо! только вот не пойму.Он мне во что выводит.не правильно!!!! Где-то ошибка.подскажите плиз! ![]() |
Айра |
![]()
Сообщение
#6
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 731 Пол: Женский Репутация: ![]() ![]() ![]() |
Цитата Он так не сортирует их вообще.сортировка у меня правильная. Странно, у меня и при твоей сортировке и при варианте KMA результат одиноковый. Только все идет не от A до Z (от А до Я), а наоборот. И таже самая проблема с оценками. Хотя, по-моему, так оно и будет. Ты же в сортировке меняешь номер только параметра Name... Наверное надо поработать и с оценками... Сообщение отредактировано: Айра - 9.04.2007 0:02 |
Rom1k |
![]()
Сообщение
#7
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 119 Пол: Мужской Репутация: ![]() ![]() ![]() |
что-то я вообще ничего не пойму.Может кто нить помочь и исправить ошибку?
|
Айра |
![]()
Сообщение
#8
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 731 Пол: Женский Репутация: ![]() ![]() ![]() |
Замени свою сортировку на
for i:=1 to n-1 do
for j:=1 to n-i do
if data[j].name>data[j+1].name then
begin
t:=data[j].name;
data[j].name:=data[j+1].name;
data[j+1].name:=t;
m:=data[j].matan;
data[j].matan:=data[j+1].matan;
data[j+1].matan:=m;
p:=data[j].progr;
data[j].progr:=data[j+1].progr;
data[j+1].progr:=p;
y:=data[j].ist;
data[j].ist:=data[j+1].ist;
data[j+1].ist:=y;
end;
Это по методу KMA'я. Смысл в том, что надо для всех пунктов записи прописать изменение. Хотя мне кажется, что есть и другой способ - менять местами всю запись целиком, но я не знаю как это сделать. Но у меня все равно сортировка идет от Я до А. Как с этим бороться я пока не придумала... Сообщение отредактировано: Айра - 9.04.2007 7:00 |
Rom1k |
![]()
Сообщение
#9
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 119 Пол: Мужской Репутация: ![]() ![]() ![]() |
потом прост выводить ответ по downto наверное.спасибо большое.
|
volvo |
![]()
Сообщение
#10
|
Гость ![]() |
Цитата Хотя мне кажется, что есть и другой способ - менять местами всю запись целиком, но я не знаю как это сделать. Все просто:var t: sotr;
...
for i:=1 to n-1 do
for j:=1 to n-i do
if data[j].name>data[j+1].name then begin
t := data[j]; data[j] := data[j+1]; data[j+1] := t;
end;
...
Цитата Но у меня все равно сортировка идет от Я до А Меняем знак в операции сравнения с "больше" на "меньше", при этом направление сортировки меняется на противоположное...Сообщение отредактировано: volvo - 9.04.2007 20:43 |
Rom1k |
![]()
Сообщение
#11
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 119 Пол: Мужской Репутация: ![]() ![]() ![]() |
глупый вопрос.а как называется этот метод сортировки? меня просто по нему спросить могут!
|
КМА |
![]()
Сообщение
#12
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 69 Пол: Мужской Репутация: ![]() ![]() ![]() |
Этот метод назвается "Пузырек". И у меня он был записан правильно, по поводу того что сортировал не целую запись это я действительно оплашался.
|
Айра |
![]()
Сообщение
#13
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 731 Пол: Женский Репутация: ![]() ![]() ![]() |
Спасибо volvo, я пыталась так делать, но у меня была проблема с выбором типа переменной t.
var t: sotr;
Что значит sotr? Объясните ![]() Сообщение отредактировано: Айра - 9.04.2007 23:01 |
volvo |
![]()
Сообщение
#14
|
Гость ![]() |
Ну, так это же тип, описанный автором программы
![]() В качестве буферной переменной должна быть переменная того же типа, как и элемент массива... Поскольку массив описан, как data:array[1..nmax] of sotr;
, то T должна быть типа sotrСообщение отредактировано: volvo - 9.04.2007 21:28 |
Tan |
![]()
Сообщение
#15
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 559 Пол: Мужской Реальное имя: Бруно Репутация: ![]() ![]() ![]() |
t это перменная тип которой запись, описанная выше.
-------------------- Цитата Imagination is more important than knowledge. Albert Einstein |
Rom1k |
![]()
Сообщение
#16
|
![]() Пионер ![]() ![]() Группа: Пользователи Сообщений: 119 Пол: Мужской Репутация: ![]() ![]() ![]() |
Блин ребята.я вам мега благодарен! ! !Откуда у вас стока ума?
![]() |
![]() ![]() |
![]() |
Текстовая версия | 28.07.2025 1:13 |