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

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

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

 
 Ответить  Открыть новую тему 
> Задачка по записям., Немного помощи
Rom1k
сообщение 8.04.2007 22:37
Сообщение #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 - 8.04.2007 23:02
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Rom1k
сообщение 8.04.2007 23:03
Сообщение #2


Пионер
**

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

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


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

Сообщение отредактировано: Rom1k - 8.04.2007 23:10
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Айра
сообщение 8.04.2007 23:24
Сообщение #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));

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

Сообщение отредактировано: Айра - 8.04.2007 23:48
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
КМА
сообщение 8.04.2007 23:25
Сообщение #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;



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


Пионер
**

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

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


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

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

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


Профи
****

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

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


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

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

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


Пионер
**

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

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


что-то я вообще ничего не пойму.Может кто нить помочь и исправить ошибку?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Айра
сообщение 9.04.2007 0:25
Сообщение #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'я. Смысл в том, что надо для всех пунктов записи прописать изменение. Хотя мне кажется, что есть и другой способ - менять местами всю запись целиком, но я не знаю как это сделать.
Но у меня все равно сортировка идет от Я до А. Как с этим бороться я пока не придумала...

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


Пионер
**

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

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


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


Пионер
**

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

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


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


Пионер
**

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

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


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


Профи
****

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

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


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

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

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


Гость






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

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

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


Профи
****

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

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


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


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


Пионер
**

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

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


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

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

 

- Текстовая версия 28.07.2025 1:13
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"