Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.05.2012, 13:24   #1
subzero95
Пользователь
 
Регистрация: 10.03.2012
Сообщений: 22
Вопрос Паскаль выдаёт ошибку.

Ошибку нашёл. Теперь проблема в сортировке... Нужен какойто другой способ сортировки!
Задача:
Код:
Проанализировать данные по N секциям. Информация об участнике задаётся строкой, которая содержит номер секции, фамилия, имя, пол, рост, вес. 
1) Обеспечить приём всех данных с комментариями с клавиатуры и записать их в массив строк. 
2) Для тех секций, в которых максимальный вес участника больше среднего по всем секциям, упорядочить участников в 
порядке невозрастания их роста. Найти и вывести средний рост девушек, занимающихся в каждой секции. 
3) Вывести на печать отсортированный массив строк (не более 3-х первых строк по каждой секции).
Сама программа:
Код:
program aqsd;
type tabl=record
   nomer: 1..255;
   fam: string[50];
   name: string[50];
   pol: string[1];
   rost: 1..255;
   ves: 1..255;
    end;
    var a:array[1..100] of tabl;
             c,b:array[1..100] of integer;
             k,l,h,s,m,i,buf,n:integer;
             bufs:string[50];
             sr:real;


     begin
             writeln('vvedite kolvo ychasnichov');
             readln (n);
             if (n<=0) or (n>100) then
               writeln ('ANOMAL')
               else
               begin
               for i:=1 to n do
               begin
               writeln('VVEDITE INFO o ychasnike #',i);
               writeln('Nomer sekchii  ');
               readln(a[i].nomer);
               writeln('Familia ');
               readln(a[i].fam);
               writeln('name ');
               readln(a[i].name);
               writeln('pol ');
               readln(a[i].pol);
               writeln('rost ');
               readln(a[i].rost);
               writeln('ves ');
               readln(a[i].ves);
               end; l:=0; s:=0; h:=0;
               for i:=1 to n do
              begin
                s:=s+a[i].ves;
                inc(l);
              end;
                sr:=s/l;
               for i:=1 to n do                         {Nachalo sort}
               if a[i].ves>sr then
              begin
                 k:=a[i].nomer;
                 for m:=1 to n do
                  if a[m].nomer=k then             
                 begin
                  inc(h);
                  c[h]:=m;
                  b[h]:=m;
                 end;
                  for m:=1 to h-1 do
                   if a[c[m]].rost<a[c[m+1]].rost then
                  begin
                   buf:=c[m];
                   c[m]:=c[m+1];
                   c[m+1]:=buf;
                  end;
                   for h:=1 to m do
        begin
          bufs:=a[b[h]].fam;
          a[b[h]].fam:=a[c[h]].fam;
          a[c[h]].fam:=bufs;
          bufs:=a[b[h]].name;
          a[b[h]].name:=a[c[h]].name;
          a[c[h]].name:=bufs;
          bufs:=a[b[h]].pol;
          a[b[h]].pol:=a[c[h]].pol;
          a[c[h]].pol:=bufs;
          buf:=a[b[h]].rost;
          a[b[h]].rost:=a[c[h]].rost;
          a[c[h]].rost:=buf;
          buf:=a[b[h]].ves;
          a[b[h]].ves:=a[c[h]].ves;
          a[c[h]].ves:=buf;
         end;                                                     {Konec sort}
             end;
             s:=0; k:=0;
               for i:=1 to n do
             if a[i].pol='w' then
              begin
               s:=s+a[i].rost;
               k:=k+1;
               end;
               if k>0 then
               begin
               sr:=s/k;
               write('SREDNI ROST DEV. = ',sr:8:1);
               end
               else writeln('DEVOCHEK NET');
               writeln;
               for i:=1 to n do
                begin
                 write(a[i].nomer,'   '); write (a[i].fam,'   '); write(a[i].name,'    '); write(a[i].pol,'   ');
                  write(a[i].rost,'   '); write(a[i].ves,'   ');
                 writeln;
                 end;
                 end;
                 readln;
         end.

Последний раз редактировалось subzero95; 13.05.2012 в 22:28.
subzero95 вне форума Ответить с цитированием
Старый 13.05.2012, 13:42   #2
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Попробуйте разобраться сами с помощью пошаговой трассировки (клавиша F7). Строка, которая будет выполняться в данный момент, будет подсвечиваться. Одно нажатие - одно выполнение подсвеченной строки. Следите за значениями переменных.
Вадим Мошев вне форума Ответить с цитированием
Старый 13.05.2012, 13:47   #3
subzero95
Пользователь
 
Регистрация: 10.03.2012
Сообщений: 22
По умолчанию

У меня не получается...(
Он подсвечивает всегда первый begin.
subzero95 вне форума Ответить с цитированием
Старый 13.05.2012, 13:50   #4
Вадим Мошев

Старожил
 
Аватар для Вадим Мошев
 
Регистрация: 12.11.2010
Сообщений: 8,568
По умолчанию

Так дальше нажимайте. Или он с места не двигается никуда?
Вадим Мошев вне форума Ответить с цитированием
Старый 13.05.2012, 13:51   #5
subzero95
Пользователь
 
Регистрация: 10.03.2012
Сообщений: 22
По умолчанию

Когда жму второй раз, он запускает программу.
Код:
Runtime error 207 at 007A:0007!
vvedite kolvo ychasnichov♠ANOMAL♥   ♦    Ъ  2^Ъ▌☻2^UЙх╕♀ Ъ┼☻2^Гь♀┐·,▲W┐P ♫W1└PЪ`
72^Ъ═62^ЪЙ☻2^┐·+▲WЪМ72^г░+ЪН
subzero95 вне форума Ответить с цитированием
Старый 13.05.2012, 15:18   #6
Arhangel7
Пользователь
 
Регистрация: 27.02.2010
Сообщений: 90
По умолчанию

Код:
for i:=1 to n do // переменная I - счетчик, ошибка выскакивать должна
      if a[i].ves>sr then 
      begin
      g:=a[i].nomer;
      for i:=1 to n do //тут, так - как этот вложеный кусок кода изменяет
       if a[i].nomer=g then //переменную I, от которой зависит кол-во раз
       begin                    //выполнится вложеный кусок кода,
       b[h]:=i;                //короче так нельзя, используй другую переменную во 
       c[h]:=i;               //вложенном куске кода
       h:=h+1;
неинициализированные переменные K и S // не присвоено какое либо значение перед использованием, например:
s:=s+a[i].ves;// чему равна переменная S неизвесно даже компьютеру
как-то так

Последний раз редактировалось Arhangel7; 13.05.2012 в 15:24.
Arhangel7 вне форума Ответить с цитированием
Старый 13.05.2012, 15:38   #7
subzero95
Пользователь
 
Регистрация: 10.03.2012
Сообщений: 22
По умолчанию

Решил переделать прогу... Чуть позже выложу...
subzero95 вне форума Ответить с цитированием
Старый 13.05.2012, 16:03   #8
subzero95
Пользователь
 
Регистрация: 10.03.2012
Сообщений: 22
По умолчанию

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



Написал новую программу, но она не сортирует... Поможете?
Код:
program aqsd;
type tabl=record
   nomer: 1..255;
   fam: string[50];
   name: string[50];
   pol: string[1];
   rost: 1..255;
   ves: 1..255;
    end;
    var a:array[1..100] of tabl;
             c,b:array[1..100] of integer;
             k,l,h,s,m,i,buf,n:integer;
             bufs:string[50];
             sr:real;


     begin
             writeln('vvedite kolvo ychasnichov');
             readln (n);
             if (n<=0) or (n>100) then
               writeln ('ANOMAL')
               else
               begin
               for i:=1 to n do
               begin
               writeln('VVEDITE INFO o ychasnike #',i);
               writeln('Nomer sekchii  ');
               readln(a[i].nomer);
               writeln('Familia ');
               readln(a[i].fam);
               writeln('name ');
               readln(a[i].name);
               writeln('pol ');
               readln(a[i].pol);
               writeln('rost ');
               readln(a[i].rost);
               writeln('ves ');
               readln(a[i].ves);
               end; l:=0; s:=0; h:=0;
               for i:=1 to n do
              begin
                s:=s+a[i].ves;
                inc(l);
              end;
                sr:=s/l;
               for i:=1 to n do
               if a[i].ves>sr then
              begin
                 k:=a[i].nomer;
                 for m:=1 to n do
                  if a[m].nomer=k then             {Nachalo sort}
                 begin
                  inc(h);
                  c[h]:=m;
                  b[h]:=m;
                 end;
                  for m:=1 to h-1 do
                   if a[c[m]].rost<a[c[m+1]].rost then
                  begin
                   buf:=c[m];
                   c[m]:=c[m+1];
                   c[m+1]:=buf;
                  end;
                   for h:=1 to m do
        begin
          bufs:=a[b[h]].fam;
          a[b[h]].fam:=a[c[h]].fam;
          a[c[h]].fam:=bufs;
          bufs:=a[b[h]].name;
          a[b[h]].name:=a[c[h]].name;
          a[c[h]].name:=bufs;
          bufs:=a[b[h]].pol;
          a[b[h]].pol:=a[c[h]].pol;
          a[c[h]].pol:=bufs;
          buf:=a[b[h]].rost;
          a[b[h]].rost:=a[c[h]].rost;
          a[c[h]].rost:=buf;
          buf:=a[b[h]].ves;
          a[b[h]].ves:=a[c[h]].ves;
          a[c[h]].ves:=buf;
         end;                                                     {Konec sort}
             end;
             s:=0; k:=0;
               for i:=1 to n do
             if a[i].pol='w' then
              begin
               s:=s+a[i].rost;
               k:=k+1;
               end;
               if k>0 then
               begin
               sr:=s/k;
               write('SREDNI ROST DEV. = ',sr:8:1);
               end
               else writeln('DEVOCHEK NET');
               writeln;
               for i:=1 to n do
                begin
                 write(a[i].nomer,'   '); write (a[i].fam,'   '); write(a[i].name,'    '); write(a[i].pol,'   ');
                  write(a[i].rost,'   '); write(a[i].ves,'   ');
                 writeln;
                 end;
                 end;
                 readln;
         end.

Последний раз редактировалось subzero95; 13.05.2012 в 16:08.
subzero95 вне форума Ответить с цитированием
Старый 13.05.2012, 16:35   #9
Arhangel7
Пользователь
 
Регистрация: 27.02.2010
Сообщений: 90
По умолчанию

тут, пока не напьешся, не разберешся.
ИМХО - через процедуры проще делать, легче кот просмотреть и увидеть где ошибка, а так там все в один блок свалино, лично вы сможите выполнить все это без ошибок вместо компа ?
как-то так
Arhangel7 вне форума Ответить с цитированием
Старый 13.05.2012, 16:39   #10
subzero95
Пользователь
 
Регистрация: 10.03.2012
Сообщений: 22
По умолчанию

У меня с процедурами туговато...
Тут у меня не правильный способ сортировки... Короче говоря нужен другой способ сортировки вместо этого:
Код:
        for i:=1 to n do
               if a[i].ves>sr then
              begin
                 k:=a[i].nomer;
                 for m:=1 to n do
                  if a[m].nomer=k then            
                 begin
                  inc(h);
                  c[h]:=m;
                  b[h]:=m;
                 end;
                  for m:=1 to h-1 do
                   if a[c[m]].rost<a[c[m+1]].rost then
                  begin
                   buf:=c[m];
                   c[m]:=c[m+1];
                   c[m+1]:=buf;
                  end;
                   for h:=1 to m do
        begin
          bufs:=a[b[h]].fam;
          a[b[h]].fam:=a[c[h]].fam;
          a[c[h]].fam:=bufs;
          bufs:=a[b[h]].name;
          a[b[h]].name:=a[c[h]].name;
          a[c[h]].name:=bufs;
          bufs:=a[b[h]].pol;
          a[b[h]].pol:=a[c[h]].pol;
          a[c[h]].pol:=bufs;
          buf:=a[b[h]].rost;
          a[b[h]].rost:=a[c[h]].rost;
          a[c[h]].rost:=buf;
          buf:=a[b[h]].ves;
          a[b[h]].ves:=a[c[h]].ves;
          a[c[h]].ves:=buf;
         end;
Расшифрую кое-что: Массив b - номера участников из одной секции. Массив c - номера участников из одной секции упорядоченые по убыванию роста.
Для тех секций, в которых максимальный вес участника больше среднего по всем секциям, упорядочить участников в порядке невозрастания их роста.

Последний раз редактировалось subzero95; 13.05.2012 в 16:44.
subzero95 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Паскаль выдаёт ошибку в последней строке. Getman Помощь студентам 1 01.02.2012 23:39
Выдаёт ошибку Stanislava7 Общие вопросы C/C++ 1 05.05.2010 17:55
Выдаёт ошибку: acos DOMAIN error,полсе нажатия окей,ещё одну ошибку pow OWERFLAW ERROR prikolist Общие вопросы C/C++ 4 10.04.2009 20:27
Выдаёт ошибку DM_bite Помощь студентам 2 08.08.2008 10:33