IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Задачка по записям., Немного помощи
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


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


Вот всё,что я смог сделать.мне кажется что в процедуре я что-то не правильно вырезаю.Помогите плиз.Ведь там не так много подправить надо.
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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


никто ничем не может помочь?

Сообщение отредактировано: Rom1k -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +



Может)))
Замени
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));

Но это работает правильно, только если пользователь вводит между оценками по одному пробелу... Хотя сообщение об ошибке выдается.

Сообщение отредактировано: Айра -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Пионер
**

Группа: Пользователи
Сообщений: 69
Пол: Мужской

Репутация: -  3  +


 
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;



Сообщение отредактировано: КМА -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


КМА неправильно ты мне сортировку написал.Он так не сортирует их вообще.сортировка у меня правильная.
Айра.Большое спасибо!

только вот не пойму.Он мне во что выводит.не правильно!!!!
Где-то ошибка.подскажите плиз!

Изображение
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


Цитата
Он так не сортирует их вообще.сортировка у меня правильная.

Странно, у меня и при твоей сортировке и при варианте KMA результат одиноковый. Только все идет не от A до Z (от А до Я), а наоборот. И таже самая проблема с оценками.
Хотя, по-моему, так оно и будет. Ты же в сортировке меняешь номер только параметра Name... Наверное надо поработать и с оценками...

Сообщение отредактировано: Айра -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


что-то я вообще ничего не пойму.Может кто нить помочь и исправить ошибку?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


Замени свою сортировку на
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'я. Смысл в том, что надо для всех пунктов записи прописать изменение. Хотя мне кажется, что есть и другой способ - менять местами всю запись целиком, но я не знаю как это сделать.
Но у меня все равно сортировка идет от Я до А. Как с этим бороться я пока не придумала...

Сообщение отредактировано: Айра -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


потом прост выводить ответ по downto наверное.спасибо большое.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


глупый вопрос.а как называется этот метод сортировки? меня просто по нему спросить могут!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Пионер
**

Группа: Пользователи
Сообщений: 69
Пол: Мужской

Репутация: -  3  +


Этот метод назвается "Пузырек". И у меня он был записан правильно, по поводу того что сортировал не целую запись это я действительно оплашался.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Профи
****

Группа: Пользователи
Сообщений: 731
Пол: Женский

Репутация: -  25  +


Спасибо volvo, я пыталась так делать, но у меня была проблема с выбором типа переменной t.
var t: sotr;

Что значит sotr? Объясните rolleyes.gif

Сообщение отредактировано: Айра -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гость






Ну, так это же тип, описанный автором программы smile.gif

В качестве буферной переменной должна быть переменная того же типа, как и элемент массива... Поскольку массив описан, как
data:array[1..nmax] of sotr;
, то T должна быть типа sotr

Сообщение отредактировано: volvo -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Профи
****

Группа: Пользователи
Сообщений: 559
Пол: Мужской
Реальное имя: Бруно

Репутация: -  10  +


t это перменная тип которой запись, описанная выше.


--------------------
Цитата
Imagination is more important than knowledge.
Albert Einstein
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Пионер
**

Группа: Пользователи
Сообщений: 119
Пол: Мужской

Репутация: -  0  +


Блин ребята.я вам мега благодарен! ! !Откуда у вас стока ума? blink.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 24.11.2020 1:29
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name