Главная
страница 1
Пример выполнения задания.

 

Задача х.хх Результаты торгов по американскому доллару, евро и британскому фунту на валютной бирже вводятся с клавиатуры в формате ‘день,доллар,евро,фунт’. Результаты торгов следующего дня от предыдущего разделяются одним пробелом. При вводе результатов торгов очередного дня номер дня, курс доллара, курс евро и курс фунта разделяются запятыми без пробелов. Примером ввода может служить строка:

‘3,27.44,33.98,45.23  4,27.55,33.92,45.7  5,27.6,33.95,44.9’.

Написать программу, определяющую максимальные и минимальные значения курсов валют и соответствующие этим значениям номера дней. Кроме того, полученные результаты записать в текстовый файл с именем D:\Results.txt

 

Решение.

Выделим основные логические блоки хода решения задачи:

1. Анализ введенных с клавиатуры исходных данных и определение количества введенных дней.

2. Выделение из исходной строки результатов торгов очередного дня в виде подстроки ‘день,доллар,евро,фунт’.

3. Выделение из подстроки ‘день,доллар,евро,фунт’ номера дня, курсов доллара, евро и фунта.

4. Повторение предыдущей операции для каждого дня.

5. Запоминание извлеченных значений в какой-либо структуре, для последующего определения максимальных и минимальных значений курсов валют и соответствующих этим значениям номеров дней. Очевидно, что для реализации данного логического блока удобно использовать массивы.

6. Поиск максимальных и минимальных значений курсов валют и соответствующих этим значениям номеров дней.

7. Вывод результатов.

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



function KolvoDays(s : string) : integer; 

var

  i : integer;



begin

  result:=1;                                   // всегда есть один результат

  for i:=1 to length(s) do

    if s[i]=' ' then result:=result+1; // каждый пробел в строке увеличивает

    // результат на 1

end;

           

            Для того чтобы выделить из последовательности «день,доллар,евро,фунт» номер дня, а также курсы доллара, евро и фунта напишем процедуру Kurses, получающую на входе строку с данными в вышеуказанном формате, и отдающую в вызывающую среду интересующие значения посредством var-параметров: d (номер дня), Dollar (курс доллара), Euro (курс евро), Funt (курс фунта). Ниже приведен листинг процедуры Kurses, для удобства анализа кода строки программы пронумерованы:

1:         procedure Kurses (s : stringvar d : integer; var Dollar, Euro, Funt : real);

2:        var

3:          p,Code : integer;

4:          st : string;

5:        begin

6:           p:=pos(',',s);             // определение номера дня

7:           st:=copy(s,1,p-1);

8:           d:=StrToInt(st);

9:           delete(s,1,p);

 

10:          p:=pos(',',s);             // определение курса доллара



11:          st:=copy(s,1,p-1);

12:          val(st, Dollar, Code);

13:          delete(s,1,p);

 

14:          p:=pos(',',s);             // определение курса евро



15:          st:=copy(s,1,p-1);

16:          val(st, Euro, Code);

17:          delete(s,1,p);

 

18:          val(s, Funt, Code);        // определение курса фунта



19:        end;

 

Алгоритм работы процедуры следующий (рассмотрим на примере s=’3,27.44,33.98,45.23’). Сначала (строка 6) определяется позиция p запятой в строке s (для данного примера получим p=2), далее (в строке 7) все символы строки s c 1 до p-1 копируются в локальную переменную st (для данного примере получаем st=’3’) и  с помощью функции StrToInt(строка 8) преобразовывается в целое число и присваивается переменной d (номер дня). Далее удаляется часть строки от начала до p включительно (в данном случае после выполнения строки 9 переменная s примет значение ‘27.44,33.98,45.23’). 



Далее в строке 10 опять определяется позиция p запятой в строке s (напомним, что к этому моменту s=‘27.44,33.98,45.23’, таким образом p=6), далее в строке 11 все что до pкопируется из s в локальную переменную st (в результате st=’27.44’) и в строке 12 с помощью процедуры val преобразовывается в число и присваивается переменной Dollar (курс доллара). Переменная Code нужна здесь как вспомогательная для вызова процедуры val (при неудачном преобразовании строки в число в этой переменной возвращается номер позиции строки, вызвавшей ошибку, при удачном преобразовании Code=0). Далее опять удаляется уже не нужная часть строки от начала до p включительно (в данном случае после выполнения строки 13 переменная s примет значение ‘33.98,45.23’).

Далее в строке 14 опять определяется позиция p запятой в строке s (т.к. к этому моменту s=‘33.98,45.23’, то p=6), далее в строке 15 все что до p копируется из в локальную переменную st (в результате st=’33.98’) и в строке 16 с помощью процедуры val преобразовывается в число и присваивается переменной Euro (курс евро). Переменная Code опять нужна здесь как вспомогательная для вызова процедуры val. Далее опять удаляется уже не нужная часть строки от начала до p включительно (в данном случае после выполнения строки 17 переменная s примет значение ‘45.23’).

Последнее, что нужно сделать – преобразовать s в значение курса фунта (строка 18).

Таким образом, имея на входе в Kurses значение входного параметра s=’3,27.44,33.98,45.23’ на выходе var-параметры примут значения: d=3; Dollar=27.44; Euro=33.98; Funt=45.23.

 

Указав особенности реализации основных процедуры и функции, приведем полный листинг программы – консольного приложения Delphi:



program Valuta;

 

{$APPTYPE CONSOLE}

 

uses

  SysUtils;

 

function KolvoDays(s : string) : integer;  // позволяет определить кол-во

     // введенных результатов



var

  i : integer;



begin

  result:=1;                            // всегда есть один результат

  for i:=1 to length(s) do

    if s[i]=' ' then result:=result+1; // каждый пробел в строке увеличивает

    // результат на 1

end// конец функции KolvoDays

 

 



// позволяет выделить из последовательности Day,Dollar,Euro,Funt,

// заданной строкой s, соответствующие значения

procedure Kurses(s : stringvar d : integer; var Dollar, Euro, Funt : real);

var

  p,Code : integer;

  st : string;

begin

  p:=pos(',',s);             // определение номера дня

  st:=copy(s,1,p-1);

  d:=StrToInt(st);

  delete(s,1,p);

 

  p:=pos(',',s);             // определение курса доллара



  st:=copy(s,1,p-1);

  val(st, Dollar, Code);

  delete(s,1,p);

 

  p:=pos(',',s);             // определение курса евро



  st:=copy(s,1,p-1);

  val(st, Euro, Code);

  delete(s,1,p);

 

  val(s, Funt, Code);        // определение курса фунта



end;     // конец процедуры Kurses

 

var     // блок описания глобальных переменных

  N, i, p, d : integer;

  Dollar, Euro, Funt : real;

  st,one : string;

  arrDays : array of integer;               // массив "номера дней"

  arrValuta : array of array of real;       // массив "курсы валют"

  maxKurs, minKurs : array [1..3] of real;  // минимальные и



// максимальные значения курсов валют

  maxDayKurs, minDayKurs : array [1..3] of integer;  // дни минимальных



// и максимальных значений курсов валют

  f : system.text;

  ch : char;

 

begin  // начало основной программы

  repeat

    writeln('Input data, please');

    readln(st);                   // считали исходные данные с клавиатуры

    st:=trim(st);   // удалили ведущие и замыкающие пробелы из строки st

    N:=KolvoDays(st);     // определили кол-во дней, за которые введены

         // данные по курсам валют

    SetLength(arrDays,N);          // распределили память под динамические

          // массивы "номера дней"

    SetLength(arrValuta,N,3);    // и "курсы валют"

 

{--- Выделение данных из строки st и заполнение массивов "номера дней" и "курсы валют" ---}



for i:=1 to N-1 do

   begin

       p:=pos(' ',st);             // находим, где в st заканчиваются данные то

// текущему дню

       one:=copy(st,1,p-1);      // выделяем этот день в переменную one

       Kurses(one, d, Dollar, Euro, Funt);  // выделяем из one номер дня,

    // курс $, курс евро и курс фунта

               // запоминаем полученные значения в соответствующих массивах

       arrDays[i-1]:=d;              

       arrValuta[i-1,1]:=Dollar;

                 arrValuta[i-1,2]:= Euro;

                 arrValuta[i-1,3]:=Funt;

       delete(st,1,p);   // удаляем из st данные по уже обработанному дню

     end;

 

// после заверщения цикла в st останутся необработанные данные по



// последнему дню, выделяем из st номер последнего дня, курсы валют

// и запоминаем полученные значения в соответствующих массивах

               Kurses(st, d, Dollar, Euro, Funt);  

   arrDays[N-1]:=d;

    arrValuta[N-1,1]:=Dollar;

    arrValuta[N-1,2]:= Euro;

     arrValuta[N-1,3]:=Funt;

    {------------------------------------------------------------------------------------}

 

    {------- Распечатываем полученные данные в табличном виде -------}



    writeln;  // пустая строка на экране для улучшения внешнего вида

    writeln('Day  Dollar  Euro  Funt');

    for i:=1 to N do

      begin

        write(' ',arrDays[i-1],'   ');

        writeln(arrValuta[i-1,1]:6:2, arrValuta[i-1,2]:6:2, arrValuta[i-1,3]:6:2);

      end;

    {------------------------------------------------------------------------------------}

 

    {--- Определение максимального и минимального значений курсов и соответствующих дней ---}



    // в качестве начальных максимальных и минимальных значений

    // выбираем первые элементы массивов для

    maxKurs[1]:=arrValuta[0,1]; minKurs[1]:=arrValuta[0,1];   // доллара                             

    maxKurs[2]:=arrValuta[0,2]; minKurs[2]:=arrValuta[0,2];   // евро                           

    maxKurs[3]:=arrValuta[0,3]; minKurs[3]:=arrValuta[0,3];   // фунта                           

    // в качестве дней начальных максимальных и минимальных

    // значений курсов выбираем первый день для

    maxDayKurs[1]:=arrDays[0]; minDayKurs[1]:=arrDays[0]; // доллара

    maxDayKurs[2]:=arrDays[0]; minDayKurs[2]:=arrDays[0]; // евро

    maxDayKurs[3]:=arrDays[0]; minDayKurs[3]:=arrDays[0];  // фунта

    for i:=2 to N do

      begin

 

        if arrValuta[i-1,1]>maxKurs[1] then



          begin

            maxKurs[1]:=arrValuta[i-1,1];  // запомнили новый максимум для

  // доллара

            maxDayKurs[1]:=arrDays[i-1];   // запомнили день максимума

          end;

        if arrValuta[i-1,1]then

          begin

            minKurs[1]:=arrValuta[i-1,1];  // запомнили новый минимум для

  // доллара

            minDayKurs[1]:=arrDays[i-1];   // запомнили день минимума

          end;

 

        if arrValuta[i-1,2]>maxKurs[2] then



          begin

            maxKurs[2]:=arrValuta[i-1,2];  // запомнили новый максимум для

  // евро

            maxDayKurs[2]:=arrDays[i-1];   // запомнили день максимума

          end;

        if arrValuta[i-1,2]then

          begin

            minKurs[2]:=arrValuta[i-1,2];  // запомнили новый минимум для

  // евро

            minDayKurs[2]:=arrDays[i-1];   // запомнили день минимума

          end;

 

        if arrValuta[i-1,3]>maxKurs[3] then



          begin

            maxKurs[3]:=arrValuta[i-1,3];  // запомнили новый максимум для

  // фунта

            maxDayKurs[3]:=arrDays[i-1];   // запомнили день максимума

          end;

        if arrValuta[i-1,3]then

          begin

            minKurs[3]:=arrValuta[i-1,3];  // запомнили новый минимум для

 // фунта

            minDayKurs[3]:=arrDays[i-1];   // запомнили день минимума

          end;

 

      end;



    // печать результатов

    writeln('max Dollar value = ',maxKurs[1]:1:2,' at Day ',maxDayKurs[1]);

    writeln('min Dollar value = ',minKurs[1]:1:2,' at Day ',minDayKurs[1]);

    writeln('max Euro value = ',maxKurs[2]:1:2,' at Day ',maxDayKurs[2]);

    writeln('min Euro value = ',minKurs[2]:1:2,' at Day ',minDayKurs[2]);

    writeln('max Funt value = ',maxKurs[3]:1:2,' at Day ',maxDayKurs[3]);

    writeln('min Funt value = ',minKurs[3]:1:2,' at Day ',minDayKurs[3]);

    {-------------------------------------------------------------------------------------}

 

    {------- Запись результатов в файл D:\Results.txt -------}



    AssignFile(f,'D:\Results.txt');  // связали файловую переменную с

  // файлом D:\Results.txt

    ReWrite(f);              // Открытие файла для перезаписи, если файл не

// существует, то он будет создан

    // вывод исходных данных в файл табличном виде

    writeln(f, 'Day  Dollar  Euro  Funt');

    for i:=1 to N do

      begin

         write(f, ' ',arrDays[i-1],'   ');

       writeln(f,arrValuta[i-1,1]:6:2, arrValuta[i-1,2]:6:2, arrValuta[i-1,3]:6:2);

      end;

    writeln(f);  // пустая строка в файле для улучшения внешнего вида

    // вывод результатов в файл

    writeln(f,'max Dollar value = ',maxKurs[1]:1:2,' at Day ',maxDayKurs[1]);

    writeln(f, 'min Dollar value = ',minKurs[1]:1:2,' at Day ',minDayKurs[1]);

    writeln(f, 'max Euro value = ',maxKurs[2]:1:2, ' at Day ',maxDayKurs[2]);

    writeln(f, 'min Euro value = ',minKurs[2]:1:2, ' at Day ',minDayKurs[2]);

    writeln(f, 'max Funt value = ',maxKurs[3]:1:2, ' at Day ',maxDayKurs[3]);

    writeln(f, 'min Funt value = ',minKurs[3]:1:2, ' at Day ',minDayKurs[3]);

    CloseFile(f);  // Закрытие файла после вывода результатов

    {--------------------------------------------------------}

 

  writeln;  // пустая строка на экране для улучшения внешнего вида



  write('This results is write to file D:\Results.txt. Continue (Y-yes, N-no)? ');

  readln(ch);

  if not ((ch='Y') or (ch='y')) then break;

  writeln;  // пустая строка на экране для улучшения внешнего вида



until false;

      end.

 

            Несмотря на то, что листинг сопровождается комментариями, поясним подробнее отдельные моменты.



            Во-первых, массивы номеров дней и курсов валют объявлены динамическими:

  arrDays : array of integer;               // массив "номера дней"

  arrValuta : array of array of real;       // массив "курсы валют"

их размер устанавливаем после того, как с помощью функции  KolvoDays определим  число введенных результатов:

N:=KolvoDays(st);   

          SetLength (arrDays, N);          // распределили память под динамические

SetLength (arrValuta, N,3);    // массивы

 

Во-вторых, выделение данных из строки st и заполнение массивов arrDays и arrValuta организовано по схожему с реализацией процедуры Kurses принципу:



for i:=1 to N-1 do

   begin

       p:=pos(' ',st);             // находим, где в st заканчиваются данные то

// текущему дню

       one:=copy(st,1,p-1);      // выделяем этот день в переменную one

       Kurses(one, d, Dollar, Euro, Funt);  // выделяем из one номер дня,

    // курс $, курс евро и курс фунта

               // запоминаем полученные значения в соответствующих массивах

       arrDays[i-1]:=d;              

       arrValuta[i-1,1]:=Dollar;

                 arrValuta[i-1,2]:= Euro;

                 arrValuta[i-1,3]:=Funt;

       delete(st,1,p);   // удаляем из st данные по уже обработанному дню

     end;

// после заверщения цикла в st останутся необработанные данные по

// последнему дню, выделяем из st номер последнего дня, курсы валют

// и запоминаем полученные значения в соответствующих массивах

  Kurses(st, d, Dollar, Euro, Funt); 

  arrDays[N-1]:=d;

  arrValuta[N-1,1]:=Dollar;

  arrValuta[N-1,2]:= Euro;

  arrValuta[N-1,3]:=Funt;



{------------------------------------------------------------------------------------}

Т.е. в текущем значении переменной st ищется позиция пробела; в переменную one выделяется часть подстроки до пробела (результаты одного дня); с помощью процедурыKurses из one получаем номер дня, курсы доллара, евро и фунта и сохраняем их в соответствующих массивах; удаляем из st обработанную, уже не нужную часть (до пробела включительно). Так повторяем N-1 раз и в результате от st остается часть с результатами последнего дня торгов, из которой уже вне цикла получаем необходимые сведения.

В-третьих, для определения максимальных и минимальных значений курсов валют, и соответствующих им дней объявлены статические массивы:

  maxKurs, minKurs : array [1..3] of real;  // минимальные и



// максимальные значения курсов валют

  maxDayKurs, minDayKurs : array [1..3] of integer;  // дни минимальных



// и максимальных значений курсов валют

Первый элемент массива maxKurs используются для определения максимального значения доллара, второй – максимального значения евро, третий – максимального значения фунта. Аналогичным образом используются элементы массивов minKurs (минимальные значения доллара, евро и фунта), maxDayKurs (день максимального значения доллара, евро и фунта) и minDayKurs (день минимального значения доллара, евро и фунта)

На рис.1 показана экранная форма с результатами работы программы, а на рис. 2 – содержимое файла D:\Results.txt.

 

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


Рис. 1. Результаты работы программы для задачи х.хх

 

 


Рис. 2. Содержимое D:\Results.txt в результате решения задачи х.хх

 

 



 

 


Смотрите также:
Пример выполнения задания. Задача х хх
198.79kb.
1 стр.
Аргумент – пример из литературы для выполнения задания «С» на егэ по русскому языку. Составлены учителем мобу сош №19 г. Кореновска Краснодарского края Гузей Светланой Анатольевной
131.06kb.
1 стр.
План-конспект открытого урока по английскому языку (5 класс) Тема урока: «Моя семья мое богатство» Основные задачи: повторение, обобщение, систематизация знаний по теме
56.41kb.
1 стр.
Тема 1 Задача 6 Тема 2 задача 2 Тема 3 задача 5
198kb.
1 стр.
Главный герой. В. Драгунский «Что я люблю»
54.92kb.
1 стр.
Пояснительная записка к отчету об исполнении муниципального задания за 1 квартал 2012 года
82.11kb.
1 стр.
А. С. Краснова №41 от «06» декабря 2012 г
239.46kb.
1 стр.
Постановление JÖП от 29 декабря 2010 года №242 с. Кош-Агач о порядке формирования муниципального задания в отношении муниципальных учреждений и финансового обеспечения выполнения муниципального задания
257.1kb.
1 стр.
«Недельные домашние задания, как форма подготовки к егэ»
151.37kb.
1 стр.
Задание №2. Выполнить до 1 февраля! Для выполнения задания внимательно прочитай текст и коротко (1-3 предложения) ответь на вопросы после текста. Древняя история нашего края
120.55kb.
1 стр.
Методические рекомендации для выполнения контрольных работ 5 Задания для выполнения контрольных работ 11
515.58kb.
3 стр.
Приложение Исходные данные для выполнения задания 3
151.17kb.
1 стр.