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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2009, 02:39   #1
ЕвгениуS
студент
Пользователь
 
Аватар для ЕвгениуS
 
Регистрация: 02.03.2008
Сообщений: 81
Вопрос Помогите разъяснить функцию в паскале?

надо писать отчет по курсовой, а я её не до конца понимаю, т.д. частично писал не я... ...
вот код программы...
Код:
Program tr;
uses Crt;
type
   TEtap=record
      		name:string;
          speed, time: real;
          end;

Var
   x: array [1..25] of TEtap;
   y: array [1..25] of TEtap;
   z: array [1..25] of TEtap;
      first1,  first2,  first3 : string;
      i, n: integer;
      min, d1, d2, d3 : real;

function Rus(mes: string):string;
var
  i: integer;   // номер обрабатываемого элемента
begin
  for i:= 1 to length(mes) do
    case mes[i] of
      'А'..'п': mes[i]:= Chr(Ord(mes[i]) - 64);
      'р'..'я': mes[i]:= Chr(Ord(mes[i]) - 16);
    end;
  Rus:= mes;
end;
label 1;
label 2;
label 3;
label 4;
label 5;
label 6;

begin clrscr;
writeln(Rus('perviy etap - Beg'));
1:write(Rus('vvedite distanciyu 1-go etapa (matters): d1= '));
read(d1);

if d1<0 then begin
     writeln('error: vvedite chislo ot 0 do 10000');goto 1;
             end;
if d1>10000 then begin
     writeln('error: vvedite chislo ot 0 do 10000');goto 1;
     end;
     
2:write(Rus('vvedite kolichestvo sportsmenov :  n= '));
read(n);

        if n<0 then begin
        writeln('error: vvedite chislo ot 2 do 25');goto 2;
        end;
        if n>25 then begin
        writeln('error: vvedite chislo ot 2 do 25');goto 2;
        end;

for i:=1 to n do
Begin
write(Rus('vvedite imya '),i,Rus('-go sportsmena : '));
read(x[i].name);

y[i].name:=x[i].name;
z[i].name:=x[i].name;

4:write(Rus('vvedite skorost'' sportsmena : '));
read(x[i].speed);
        if x[i].speed<0 then begin
        writeln('error: skorost'' ne moget byt'' otrecatel''noy');goto 4;
        end;
x[i].time:=d1/x[i].speed;
end;
i:=1;
min:=x[i].time;
for i:= 1 to n do
if x[i].time<min then
begin

min:=x[i].time;
first1:=x[i].name;
end;
writeln ('na 1-m etape pobedil  ',first1,' !!!   ');

{------------------------------------------------------------}
writeln(Rus('vtoroy etap - zapliv'));
3:write(Rus('vvedite distanciyu 2-go etapa (matters): d2= '));
read(d2);
         if d2<0 then begin
         writeln('error: vvedite chislo ot 0 do 10000');goto 3;
         end;
         if d2>10000 then begin
         writeln('error: vvedite chislo ot 0 do 10000');goto 3;
         end;

for i:=1 to n do
Begin
write ('vvedite scorost ',i,' sportsmena : ',y[i].name,' - ');
5:readln (y[i].speed);
         if y[i].speed<0 then begin
         writeln('error: skorost'' ne moget byt'' otrecatel''noy');goto 5;
         end;
y[i].time:=d1/y[i].speed;
end;
i:=1;
min:=y[i].time;
for i:= 1 to n do
if y[i].time<min then
begin
min:=y[i].time;
first2:=y[i].name;
end;
writeln ('na 2-m etape pobedil  ',first2,' !!!   ');
{------------------------------------------------------------}
writeln(Rus('tretiy etap - velogonka'));
6:write(Rus('vvedite distanciyu 3-go etapa (matters): d3= '));
read(d3);

if d3<0 then begin
     writeln('error: vvedite chislo ot 0 do 100000');goto 6;
             end;
if d3>10000 then begin
     writeln('error: vvedite chislo ot 0 do 100000');goto 6;
     end;

for i:=1 to n do
Begin
write ('vvedite scorost'' ',i,' sportsmena : ',z[i].name,' - ');
readln (z[i].speed);
z[i].time:=d3/z[i].speed;
end;
i:=1;
min:=z[i].time;
for i:= 1 to n do
if z[i].time<min then
begin
min:=z[i].time;
first3:=z[i].name;
end;
writeln ('na 1-m etape pobedil  ',first1,' !!!   ');
writeln ('na 2-m etape pobedil  ',first2,' !!!   ');
writeln ('na 3-m etape pobedil  ',first3,' !!!   ');
readln;
end.
что делает функция
Код:
function Rus(mes: string):string;
var
  i: integer;   // номер обрабатываемого элемента
begin
  for i:= 1 to length(mes) do
    case mes[i] of
      'А'..'п': mes[i]:= Chr(Ord(mes[i]) - 64);
      'р'..'я': mes[i]:= Chr(Ord(mes[i]) - 16);
    end;
  Rus:= mes;
end;
и все ее составляющие...
зачем здесь цифры 64 и 16? для чего она тут использована в этой программе?
ЕвгениуS вне форума Ответить с цитированием
Старый 30.09.2009, 03:09   #2
Вавел из ГМТУ
Форумчанин
 
Регистрация: 19.06.2009
Сообщений: 896
По умолчанию

Как известно (вроде как) в Паскале нельзя использовать Русский шрифт(вместо него будут "крякозябры"). Вот эта функция как раз и предназначена для того, чтобы использовать в программе Русский шрифт.
см. таблицу кодов ASCII и станет понятно почему 16 и 64. (см. пост от Greblin'a, он указал в каких таблицах глядеть)

Далее по коду:
1. "Первый этап - бег".
2. Введите дистанцию 1-ого этапа: (d1)
Если d1 < 0 и d1 > 10000 то "goto 1 пункт".
3. Введите кол-во спортсменов: (n)
Если n < 0 и n > 25 то "goto 2 пункт".
4. Мы заполняем массив "спортсмен" где содержатся коекакие сведения.
Имя, скорость и вычисляется время за которое пробегают спортсмены указанную дистанцию. На основании этого времени определяется победитель.

Потом по такомуже принципу проводяться 2 и 3 этап и в конце печается таблица:
writeln ('na 1-m etape pobedil ',first1,' !!! ');
writeln ('na 2-m etape pobedil ',first2,' !!! ');
writeln ('na 3-m etape pobedil ',first3,' !!! ');

PS: убогий код.
Доработка:
1. Убрать метки и пользовать цикл.
2. Написать нормально "коректность входных данных".

PSS: Зачем юзается функция Rus(...), если ты пишиш на транслите? Разве выходит чтото читабельное?

Последний раз редактировалось Вавел из ГМТУ; 30.09.2009 в 03:33.
Вавел из ГМТУ вне форума Ответить с цитированием
Старый 30.09.2009, 03:17   #3
Greblin
Меркантильный кю
Участник клуба
 
Аватар для Greblin
 
Регистрация: 02.02.2008
Сообщений: 1,001
По умолчанию

Цитата:
Сообщение от Вавел из ГМТУ Посмотреть сообщение
см. таблицу кодов ASCII и станет понятно почему 16 и 64.
Точнее надо смотреть таблицу CP-1251 и CP-866 (OEM) и сравнивать их. Функция переводит строку-параметр из CP-1251 в CP-866
Росли вроде умными, выросли дурнями... (c)А.Васильев
Greblin вне форума Ответить с цитированием
Старый 30.09.2009, 03:25   #4
Вавел из ГМТУ
Форумчанин
 
Регистрация: 19.06.2009
Сообщений: 896
По умолчанию

Ну незнаю, я неочень то знаю про такие таблицы.
Но могу сказать, то что эта функция баян жуткий. Я впервые увидел её когда только начинал кодить в какомто электронном учебнике.
Так как имена в этой функции никто не поменял, то найти оригинал(тот который я помню) не составило труда:

Код:
// Функция Rus преобразует ANSI-строку в ASCII-строку

function Rus(mes: string): string;
    //  В ANSI русские буквы кодируются числами от 192 до 255,
    //  в ASCII - от 128 до 175 (А..Яа..п) и от 224 239 (р..я).
var
  i: integer; // номер обрабатываемого символа
begin
  for i := 1 to length(mes) do
    case mes[i] of
      'А'..'п': mes[i] := Chr(Ord(mes[i]) - 64);
      'р'..'я': mes[i] := Chr(Ord(mes[i]) - 16);
    end;
  rus := mes;
end;
Такчто эта функция скопипастена откудато и вот её оригинал с оригинальными коментариями.
Вавел из ГМТУ вне форума Ответить с цитированием
Старый 05.10.2009, 16:41   #5
ЕвгениуS
студент
Пользователь
 
Аватар для ЕвгениуS
 
Регистрация: 02.03.2008
Сообщений: 81
По умолчанию

Цитата:
Сообщение от Вавел из ГМТУ Посмотреть сообщение
PS: убогий код.
Доработка:
1. Убрать метки и пользовать цикл.
2. Написать нормально "коректность входных данных".

PSS: Зачем юзается функция Rus(...), если ты пишиш на транслите? Разве выходит чтото читабельное?
просто до этого код писал с русскими комментариями.. а потом ошибки разные пошли.. вотя и решил не мучаться...написал так... Все читабельно вроде.
ЕвгениуS вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача на модуль и функцию в паскале Cheerful-mermaid Помощь студентам 1 09.04.2009 23:07
помогите написать функцию SkCr Microsoft Office Excel 5 14.03.2009 23:47
Помогите вычислить функцию Xander Помощь студентам 6 13.11.2008 18:28
Протабулировать функцию, помогите Sidsukana Помощь студентам 2 13.11.2008 14:19
Кто сможет разъяснить как и зачем использовать виртуальные функции в C++? Dunhil Помощь студентам 5 20.12.2007 14:19