Курсовая

Курсовая Разработка консольных приложений в среде Delphi

Работа добавлена на сайт bukvasha.net: 2015-10-25

Поможем написать учебную работу

Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.

Предоплата всего

от 25%

Подписываем

договор

Выберите тип работы:

Скидка 25% при заказе до 28.1.2025





Кафедра информационных технологий

Учебная дисциплина

«Информатика и программирование»

КУРСОВАЯ РАБОТА

На тему: Разработка  консольных  приложений  в  среде Delphi
Выполнила       Жолобова Д. Е.

Руководитель             Родин Д. А.

                                                                        
Тула, 2010 год
Оглавление
Введение. 2

Глава 1. Простейшие арифметические и логические операции. 2

Глава 2. Линейные программы.. 2

Глава 3. Ветвящиеся программы.. 2

Глава 4. Циклические программы.. 2

Глава 5. Двумерные массивы.. 2

Глава 6. Строковый тип данных. 2

Глава 7. Операции с файлами. 2

Заключение. 2

Список использованной литературы.. 2



Введение




В наше время программированием занимаются многие ПК-пользователи. И это вполне объяснимо: с помощью программ можно решать достаточно сложные задачи – задачи, которые могут отнять у человека много драгоценных часов, в то время как компьютер решит их за доли секунд. Кроме того, поработав какое-то время с чужими программами, хочется создать нечто свое, родное. И тогда возникает вопрос: с чего начать? Выбор языков программирования на данный момент очень велик: Basic, Pascal, C, Perl и так далее. Basic – самый легкий из этого списка, его не зря называют основой программирования, так как обычно начинают именно с него. Однако этот язык недостаточно мощный, поэтому сейчас многие начинают  с чего-то более серьезного, например, с Паскаля (Pascal)[1]. 

Именно с ним в данной курсовой работе мы и будем работать. В качестве среды для разработки приложений на этом языке выберем среду языка Delphi, который развился из Турбо Паскаля, а тот, в свою очередь, – из Паскаля.

Delphi позволяет разрабатывать приложения Windows. Но в этой работе мы рассмотрим только создание программ в стиле MS-DOS, называемых консольными приложениями. Внешне они выглядят, как программы с текстовым интерфейсом, но способны обращаться к большинству функций Windows. Пример консольного приложения показан ниже, на рис. 1.

Подпись: Рис. 1. Консольное приложение
Чтобы создать консольное приложение, например, в Borland Delphi 7, надо дать команду File


New
и в диалоговом окне New

Items
выбрать значок Console

application
(рис. 2.).



Подпись: Рис. 2. Выбор категории, к которой относится создаваемая программа





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





Глава 1. Простейшие арифметические и логические операции




Задача 1.7. Некто располагает суммой в А руб. Он хочет купить В книг по С руб. и D журналов по Е руб. Написать программу, про­веряющую, возможна ли такая покупка.

Решение.

Вначале составим алгоритм решения поставленной задачи.

1.     Ввести с клавиатуры исходные данные: А, В, С, D
,
E


2.     Проверить корректность введенных данных. Например, очевидно, что количество не может быть меньше единицы, так же как и стоимость не может быть отрицательной.

3.     Повторить ввод данных, если они некорректны, или перейти к следующему шагу, если все верно.

4.     Подсчитать стоимость всей покупки.

5.     Сравнить сумму имеющихся денег (А) со стоимостью покупки (K) и вывести соответствующее сообщение: если A < K, то покупка не удастся, в ином случае покупка удастся.

Так как в данном случае количество может быть только целым числом, мы присвоим переменным, обозначающим количество книг и журналов, B и D целочисленный тип integer, а переменным A
,
C
,
E
,
K
– вещественный тип real.

В данной задаче удобно воспользоваться циклом с постусловием repeat

until
, который повторяется до тех пор, пока не станет истинным условие. Чтобы организовать из него выход, введем еще одну, дополнительную, переменную f логического типа boolean и присвоим ей значение false. Так, если пользователь ввел некорректные данные, то переменной f присваивается значение true, цикл повторяется, и ввод данных осуществляется снова; если данные корректны, то цикл завершается.

 repeat                      //входим в цикл repeat...until

f:=false;                     //предположим, что ошибок нет

write ('Введите сумму (A): ');

readln(A);

write ('Количество желаемых книг (B): ');

readln(B);

write ('Стоимость одной книги (C): ');

readln(C);

write ('Количество желаемых журналов (D): ');

readln(D);

write ('Стоимость одного журнала (E): ');

readln(E);

if ((A<1) or (B<1) or (C<0) or (D<1) or (E<0)) then // Проверяем правильность ввода

begin

 f:=true;         //Если что-то введено неправильно, присваиваем переменной f значение true

 writeln ('Ошибка! Повторите ввод, пожалуйста');

 end;

until not f;                  //Если ошибок нет, выходим из цикла

Посчитаем общую стоимость покупки: количество книг умножим на цену одной книги и сложим с произведением количества журналов на стоимость одного журнала. Получившуюся сумму присвоим переменной K и сравним со значением переменной А. 

K := C * B + E * D;              // считаем общую стоимость покупки

If A<K then  // Проверяем возможность покупки и выводим соответствующее сообщение

Для удобства, при выводе результатов типа real целесообразно их округлять. Что мы и сделали:

writeln('Покупка невозможна, так как ее стоимость (',K:2:2,') превышает ',A:2:2,' р.')

else

writeln('Покупка возможна, ее стоимость (',K:2:2,') не превышает ',A:2:2,' р.');

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

Теперь, когда мы обсудили все основные моменты, приведем полный листинг программы:
program Project1;

{$APPTYPE CONSOLE}

uses

  SysUtils;

  var B, D:integer;

      A,C,E,K: real;

      f:boolean;

begin

repeat                      //входим в цикл repeat...until

f:=false;

write ('Введите сумму (A): ');

readln(A);

write ('Количество желаемых книг (B): ');

readln(B);

write ('Стоимость одной книги (C): ');

readln(C);

write ('Количество желаемых журналов (D): ');

readln(D);

write ('Стоимость одного журнала (E): ');

readln(E);

if ((A<1) or (B<1) or (C<0) or (D<1) or (E<0)) then // Проверяем правильность ввода

begin

 f:=true;         //Если что-то введено неправильно, присваиваем переменной f значение true

 writeln ('Ошибка! Повторите ввод, пожалуйста');

 end;

until not f;                  //Если ошибок нет, выходим из цикла

K := C * B + E * D;              // считаем общую стоимость покупки

If A<K then   //Проверяем возможность покупки и выводим соответствующее сообщение

writeln('Покупка невозможна, так как ее стоимость (',K:2:2,') превышает ',A:2:2,' р.')

else

writeln('Покупка возможна, ее стоимость (',K:2:2,') не превышает ',A:2:2,' р.');

readln;        // Задерживает выполнение программы до нажатия кнопки Enter                    

end.

На рис. 1.1. показана экранная форма с результатами работы программы.

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

Подпись: Рис. 1.1. Результат работы программы для задачи 1.7.




Глава 2. Линейные программы




Задача
2.7.
Написать программу, определяющую, на какую цифру заканчивается заданное натуральное число.
Решение.

Для начала составим алгоритм.

1.     Ввести натуральное число N.

2.     Вычислить остаток от деления числа N на 10, который и будет являться последней цифрой этого числа.

3.     Вывести результат.

Итак, для того, чтобы определить последнюю цифру числа N, достаточно вычислить остаток от деления этого числа на 10.  В Паскале для этого существует операция mod – получение остатка от целочисленного деления. Давайте рассмотрим примеры, представленные в таблице 1. 1. В первой колонке дано действие, во второй – результат.

12345 mod 10

5

1234 mod 10

4

123 mod 10

3

12 mod 10

2

1 mod 10

1

Подпись: Таблица 1.1. Определение последней цифры числа


Разобравшись с методом решения задачи, перейдем к ее реализации на языке Паскаль. Нам понадобятся две переменные типа integerN и M. В переменную M запишем конечный результат программы – последнюю цифру числа N, а затем выведем на экран.

Приведем полный код программы:

program Project2;

{$APPTYPE CONSOLE}

uses

  SysUtils;

var N,M: integer;

begin

write ('Введите натуральное число: ');

readln(N);                  // Вводим натуральное число

M:=N mod 10;          // вычисляем остаток от деления на 10

Write ('Число ',N,' оканчивается на цифру  ',M); // выводим результат

readln;

end.

Экранная форма с результатами работы программы:

Подпись: Рис. 2.1. Результат работы программы для задачи 2.7. 



Глава 3. Ветвящиеся программы




Задача
3.7.
Написать программу, проверяющую, поместится ли равносторонний треугольник площадью Р в круг площадью S, или круг поместится в треугольник, или они не поместятся друг в друга.
Решение.

Составим алгоритм решения задачи.

1.     Ввести исходные данные: площадь круга (S) и треугольника (P).

2.     Вычислить радиус круга.

3.     Вычислить сторону треугольника (a).

4.     Вычислить радиус описанной окружности около данного треугольника через его сторону.

5.     Вычислить радиус вписанной окружности для данного треугольника через его сторону.

6.     Сравнить радиус круга с результатами пунктов 4 и 5 и вывести соответствующее сообщение.

Итак, чтобы определить, поместится ли треугольник в круг, или круг поместится в треугольник, необходимо:

·     Вычислить радиус круга.

·     вычислить радиус описанной окружности, т.е. той, которая бы могла пройти через все три его точки (рис. 3.1).

·     вычислить радиус вписанной окружности, т.е. той, которая бы могла касаться всех его сторон (рис. 3.2).
Подпись: Рис 3.1. Описанная около треугольника окружность. Подпись: Рис 3.2. Вписанная в треугольник окружность.






Очевидно, что для того чтобы треугольник вошел в круг, его радиус не должен быть меньше радиуса описанной окружности около треугольника; а для того чтобы круг вошел в треугольник, радиус круга не должен превышать радиус вписанной окружности в треугольник.

Перед тем как приступить к разбору кода программы, отметим, что всем переменным следует присвоить вещественный тип real.

1:                 program Project3;

2:                 {$APPTYPE CONSOLE}

3:                 uses

4:                 SysUtils;

5:                 var S, P, r, r1, r2, a:real;

6:                 begin

7:                 write ('S = ');

8:                 readln(S);       //ввод площади круга

9:                 write ('P = ');

10:              readln(P);       //ввод площади треугольника

11:              r:=sqrt(S/Pi);        //радиус круга

12:              a:=sqrt(4*P/sqrt(3));   //сторона треугольника a

13:              r1:=a*sqrt(3)/3;     //радиус описанной окружности около треугольника

14:              r2:=a*sqrt(3)/6;       //радиус вписанной окружности в треугольник

15:              
if
(r < r1) and (r > r2) then write ('Они не войдут друг в друга')

16:              
else

if
r1 < r then write ('Треугольник поместится в круге')

17:              
else
if r2 > r then write('Круг войдет в треугольник');

18:              readln;

19:              end.

Как видите, на сей раз мы пронумеровали строки – для удобства.

Радиус круга S (строка 11) вычисляется по формуле: . Перед тем, как вычислять радиус описанной окружности около треугольника, необходимо сначала найти его стороны. Так как нам дан равносторонний треугольник, наша задача существенно упрощается, потому что, как известно, у такого треугольника все стороны равны, и, следовательно, его площадь рассчитывается по следующей формуле: . Исходя из этой формулы, получаем, что  (строка 12). Функция sqrt
(
x
)
извлекает квадратный корень из числа x, причем необходимо помнить, что возвращаемый результат всегда вещественного типа.

Найдя сторону a, мы можем вычислить радиус описанной () и радиус вписанной () окружности для данного треугольника:  (строка 13) и  (строка 14). Далее нам остается только сравнить. В строке 15 говорится, что если и , то они не войдут друг в друга; если то треугольник войдет в круг (строка 16); а если , то круг поместится в треугольнике (строка 17). Давайте теперь посмотрим результаты работы программы (рис. 3.3.):



Подпись: Рис. 3.3. Результат работы программы для задачи 3.7.





Глава 4. Циклические программы




Задача
4.7.
Написать программу, позволяющую вычислить с помощью цикла: , где n задается с клавиатуры.
Решение.

Вначале, как обычно, составим алгоритм, по которому будет решаться наша задача.

1.     Ввести число n.

2.     Присвоить переменной s значение n.

3.     Прибавить к переменной s выражение n – 1.

4.     Повторить предыдущую операцию (пункт 3) m раз.

5.     Прибавить к переменной s число 2, а затем 1.

6.     Вывести результат.

В этой задаче нам необходимо вычислить выражение , в котором n – 1 суммируется с самим собой m раз. Заметим, что переменная m в данном случае является константой[2]. Теперь приступим к разбору кода программы.

1:                 program Project4;

2:                 {$APPTYPE CONSOLE}

3:                 uses

4:                 SysUtils;

5:                 const m = 10;   // объявляем константу m и присваиваем ей значение 10

6:                 var n,i,s:integer;

7:                 begin

8:                 write('n = ');

9:                 readln(n);

10:             s:=n;                        // стартовое значение

11:             for i:=1 to m do
     
// i будет поочередно принимать значения от 1 до m

12:             s:=s+(n-1);                   //(n - 1) прибавляется к общей сумме

13:             s:=s+2+1;

14:             write (' Результат выражения: ', s);         //вывод результата

15:             readln;

16:             end.


 

Итак, вводим число n (строка 9). Переменной s, предназначенной для накапливания суммы, присваиваем изначально число n (строка 10). Затем организовываем цикл for

do
, параметром которого  выступает переменная i (строка 11). Если значение i меньше или равно m, то выполняется тело цикла, в котором к переменной s прибавляется выражение n – 1 (строка 12). После завершения цикла к s прибавим оставшиеся числа: 2 и 1(строка 13). И в четырнадцатой строке мы выводим результат нашего выражения на экран, как показано на рис. 4.1.

Подпись: Рис. 4.1. Результат работы программы для задачи 4.7.



Глава 5. Двумерные массивы




Задача
7.7.
В двухмерном массиве поменять местами строки, со­держащие максимальный и минимальный элементы.
Решение.

Составим алгоритм.

1.     Ввести элементы матрицы.

2.     Сравнить элементы массива и записать в переменную min
номер строки с минимальным элементом.

3.     Сравнить элементы массива и записать в переменную max
номер строки с максимальным элементом.

4.     Перезаписать строки min и max друг в друга.

5.     Вывести измененный массив.

В этой задаче снова удобнее использовать константы – n
и m, в которых будут храниться размеры двухмерного массива, т.е. количество столбцов и строк соответственно.

const n=3;        //количество столбцов

const m=3;        //количество строк

var B:array [1..n, 1..m] of integer;

Итак, вначале нам необходимо ввести данные в массив. Для этого воспользуемся циклом for

do
.

          
for
i:=1 to n do         //столбцы

for j:=1 to m do           //строки

begin

write ('B[',i,', ',j,'] = ');     

readln (B[i,j]);                //Ввод элемента матрицы

  end;

 Когда i превысит n, цикл завершится и, если текущий столбец – не последний (то есть j < m), повторится снова. Таким образом, массив заполняется построчно.

Дальше переходим к поиску минимального элемента матрицы. Предположим, что минимальным является первый элемент в первой строке (B[1,1]), и присвоим переменной k значение B[1,1], а min – единицу. Затем снова организуем цикл for

do
и сравним переменную k
со всеми последующими элементами массива; если нашлось значение меньше k, записываем его в переменную k, а номер текущей строки – в min.

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

k:=B[1,1];

min:=1;

for i:=2 to n do          //столбцы

for j:=1 to m do      //строки


if B[i,j]<k then
      
//если очередной элемент массива меньше k


begin

 k :=B[i,j];            //присвоить k
этот элемент


  min :=i;             //и присвоить min
номер этой строки

end;

//Так же находим и максимальное значение:

k:=B[1,1];

max:=1;

for i:=2 to n do

  for j:=1 to m do

if B[i,j]>k then

begin

 k :=B[i,j];

 max:=i;

end;

Теперь нам осталось только поменять строки двухмерного массива, содержащие минимальный и максимальный элемент, местами, то есть перезаписать их друг в друга. Но как это сделать? Ведь если мы напишем, например, так: B[1,1] = B[2,3] – то значение B[1,1] пропадет. В этом нам поможет наша вспомогательная переменная k
.
Она будет хранить значение этого элемента массива.

for j:=1 to n do

begin

k:=B[max,j];         

B[max,j]:=B[min,j];

B[min,j]:=k;

end;

И, наконец, выводим измененный массив на экран:

for i:=1 to n do

  for j:=1 to m do

   writeln ('B[',i,', ',j,'] = ',B[i,j]);

  Теперь приведем полный код программы:

program Project5;

{$APPTYPE CONSOLE}

uses

  SysUtils;

const n=3;

const m=3;

var B:array [1..n, 1..m] of integer;

i,j,k,min,max:integer;

begin

for i:=1 to n do         //столбцы

for j:=1 to m do           //строки

begin

write ('B[',i,', ',j,'] = ');     

             readln (B[i,j]);                //Ввод элемента матрицы

     end;

//---начинаем поиск минимального элемента массива:

k:=B[1,1];

min:=1;

for i:=2 to n do          //столбцы

for j:=1 to m do      //строки


if B[i,j]<k then
      
//если очередной элемент массива меньше k


begin

 k :=B[i,j];            //присвоить k
этот элемент


  min :=i;             //и присвоить min
номер этой строки

end;

//---начинаем поиск максимального элемента массива:

k:=B[1,1];

max:=1;

for i:=2 to n do

 for j:=1 to m do

if B[i,j]>k then

begin

 k :=B[i,j];

 max:=i;

end;

writeln;

//перезаписываем строки друг в друга:

for j:=1 to n do

begin

k:=B[max,j];

B[max,j]:=B[min,j];

B[min,j]:=k;

end;

//выводим массив на экран:

for i:=1 to n do

  for j:=1 to m do

  writeln ('B[',i,', ',j,'] = ',B[i,j]);      //вывод массива

  readln;

  end.

В заключение хотелось бы отметить, что хотя в данной программе мы присвоили массиву целочисленный тип integer, он может иметь и вещественный, например real. На рис. 5.1. показан результат работы программы на экране, а на рис. 5.2. показаны те же результаты, только в матричном виде.


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





Глава 6. Строковый тип данных




Задача

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

Составим алгоритм решения задачи.

1.     Ввести строку S.

2.     Сравнить каждую букву с предыдущими.

3.     Если нашлась хоть одна равная, то проверить, является ли текущая буква гласной. Если является – удалить из строки.

4.     Вывести измененную строку.

Итак, в соответствии с условиями задачи нам требуется не просто составить программу, а еще написать процедуру. Процедура – это подпрограмма, состоящая из заголовка и тела. Заголовок включает в себя служебное слово procedure, имя процедуры и список формальных параметров с указанием их типов.

procedure DelVow (S:string);


где DelVow
– имя процедуры, а S

это наша строка, из которой нам и надо удалить повторные гласные.

В процедуре нам понадобятся три переменные типа integer: i, j, k. А также переменная str типа string. Идея в том, чтобы сравнить каждый элемент строкового массива со всеми предыдущими. Для этого очень удобно организовать два цикла for

do
: первый – с параметром i, который будет принимать значения от 1 до числа, обозначающего количество символов (букв) в строке; второй – с параметром j, который будет принимать значения от 0 до i
– 1.

1.            str:='aeiouAEIOU';       //записываем все гласные буквы с учетом регистра

2.            for i:=1 to length(S) do       

3.            for j:=0 to i-1 do

4.            if S[i]=S[j] then                //сравниваем очередную букву с предыдущими

5.            begin

6.            for k:=0 to length(str) do         

7.            if S[i]=str[k] then
delete (S,i,1);          //если текущая буква – гласная, то удалить ее

8.            end;

9.            write (S);

10.        end;

В первой строке представленного выше фрагмента в строковую переменную str записываем все гласные буквы английского языка с разными регистрами. Далее, в строке 2, i
принимает определенное значение: от 1 до length(S). Необходимо отметить, что функция length(S) возвращает длину строки S. Переменная j
принимает значения от 0 до номера текущего элемента строкового массива (строка 3). В строке 4 текущий символ (буква) сравнивается с предыдущими. Если нашелся хотя бы один равный элемент, то проверяем, является ли текущая буква гласной: снова организовываем цикл for

do
с параметром k, который принимает значения от 0 до length(str) (строка 6); сравним текущую букву S[i] с каждым элементом строки str. Если нашлась равная, значит S[i] является гласной буквой. Исключаем ее из строки с помощью процедуры delete, которая удалит из строки S, начиная с позиции i, один символ (строка 7). После завершения всех циклов выводим измененную строку (строка 9).

Итак, процедура написана. Переходим к основному телу программы. Нам осталось только ввести строку и вызвать процедуру DelVow.  

write('S = ');

readln(S);

DelVow(S);

Теперь приведем полный код программы.

program Project6;

{$APPTYPE CONSOLE}

uses

  SysUtils, windows;

//-----Начало процедуры:

procedure DelVow (S:string);

var i,j,k:integer;

str:string;

begin

str:='aeiouAEIOU';       //записываем все гласные буквы с учетом регистра

for i:=1 to length(S) do       

for j:=0 to i-1 do

if S[i]=S[j] then                //сравниваем очередную букву с предыдущими

begin

for k:=0 to length(str) do         

if S[i]=str[k] then
delete (S,i,1); //если текущая буква – гласная, удалить ее

end;

write (S);              //выводим измененную строку                                 

end;

//-----Конец процедуры

  var S:string;

begin

write('S = ');     

readln(S);             //вводим строку

DelVow(S);          //вызываем процедуру, указав S в качестве параметра

readln;

end.

Конечно, наверное, приятнее иметь дело с родной кириллицей, но эта программа с русскими буквами работать не будет, вернее, будет, но некорректно. Вообще, к сожалению, консольные приложения не очень-то любят кириллицу, поэтому иногда приходится писать латиницей. Теперь посмотрим, что у нас получилось (рис. 6.1): 




Рис. 6.1. Экранный результат работы программы для задачи 8.7.
 


Глава 7. Операции с файлами.




Задача 10.7. В файле хранятся реквизиты рабочих: фамилия, имя, отчество, дата рождения, адрес, количество детей, количество от­работанных часов, расценка одного часа. Заработная плата вы­числяется умножением количества отработанных часов на рас­ценку минус 13% налога. Величина налога уменьшается на 0,01 %
на каждого имеющегося ребенка. Записать в другой файл фами­лии и инициалы рабочих и их заработную плату.

Решение.

Итак, пусть файл с реквизитами рабочих будет именоваться «rec.txt», а файл, в который нам нужно записать фами­лии и инициалы рабочих и их заработную плату, назовем «abc.txt».

Составим алгоритм.

1.     Открыть файлы: «rec.txt» - в режиме «для чтения»,  «abc.txt» - в режиме «для записи».

2.     Считать из файла «rec.txt» фамилию, первые буквы имени и отчества и записать в файл «abc.txt».

3.     Считать из файла «rec.txt» количество детей, количество отработанных часов и расценку одного часа.

4.     Рассчитать налог с учетом количества детей в процентах.

5.     Рассчитать заработную плату с учетом налога и записать в файл «abc.txt».

6.     Закрыть файлы «abc.txt» и «rec.txt».

Для начала работы с файлами необходимо описать две переменные f и f
1
и присвоить им тип textfile.

Нам нужно открыть два файла: один – для считывания, другой – для записи. Но прежде воспользуемся процедурой assign, которая связывает файловую переменную с файлом.

  assign(f, 'C:\rec.txt');

  assign(f1, 'C:\abc.txt');

Первый параметр – это файловая переменная, второй – полный путь к файлу (если файл находится в текущем каталоге, то путь к нему можно не указывать).

Теперь откроем файлы с помощью процедур reset
и rewrite.

  reset(f);                    //открываем для чтения

  rewrite(f1);             //открываем для записи

Если файла для записи (т.е. «abc.txt») в указанном каталоге не обнаружится, то он создастся программой после ее запуска.

Создадим цикл while

do
, который будет продолжаться до тех пор, пока не будет достигнут конец файла «rec.txt».

1.            while not eof(f) do
//пока не будет достигнут конец файла, выполнять цикл

2.            begin

3.            readln (f,S);                  //считываем из файла фамилию

4.            write(f1,S,' ');               //записываем ее в «abc.txt»

5.            readln (f,S);                 //считываем имя

6.            write(f1,S[1],'. ');        //записываем его первую букву в файл

7.            readln (f,S);                 //считываем отчество

8.            writeln(f1,S[1],'.');     

9.            readln (f,S);                //считываем дату рождения

10.        readln (f,S);                 //считываем адрес

11.        readln (f,S);                //считываем количество детей

12.        Val(S,ch,j);                  //преобразуем строку в число

13.          if j>0 then break;    //если преобразование некорректно, выйти из цикла

14.        readln (f,S);                  //считываем количество отработанных часов

15.        Val(S,z,j);

16.          if j>0 then break;

17.        readln (f,S);                 //считываем расценку одного часа   

18.        Val(S,h,j);

19.          if j>0 then break;

20.        n:=13-(ch*0.01);          // налог с учетом детей

21.        z:=h*z;                         //зарплата без учета налога

22.        z:=z-(z/100)*n;            //зарплата с учетом налога

23.        writeln(f1,z:2:2);         //записываем зарплату в файл «abc.txt»

24.        end;
Функция eof(f) (строка 1) принимает значение «истина» (true), если достигнут конец файла, иначе – «ложь» (false).

В теле цикла while

do
происходит построчное считывание из файла «rec.txt» в переменную S типа string
(так как считанные из файла данные имеют строковой тип). В третьей строке считываем фамилию рабочего, в четвертой – записываем в файл. Далее (строка 5) считываем имя рабочего и записываем первую букву в файл «abc.txt» вместе с точкой (строка 6). То же самое делаем в седьмой и восьмой строке с отчеством: считываем и записываем в файл «abc.txt» первую букву отчества, так же добавив после нее точку.

В строках 9 и 10 считываем дату рождения и адрес. Эти данные нам не нужны, но пропустить мы их не можем. В строке 11 считываем количество детей. Так как мы имеем дело со строковыми данными, математические операции мы с ними проводить не можем. Но мы можем преобразовать эти данные в их численные значения с помощью процедуры val, где первый параметр – строка, которую необходимо преобразовать, второй – переменная соответствующего численного типа, в которую будет записан результат, а третий параметр хранит позицию первого недопустимого символа. Так, если после преобразования третий параметр больше нуля – выходим из цикла.

Таким образом, мы считаем из файла «rec.txt» и запишем в переменные ch, h, z количество детей, количество от­работанных часов и расценку одного часа соответственно.

В строке 20 рассчитаем налог в процентах, который будет вычитаться из зарплаты: умножим 0,01 на количество детей и вычтем это произведение из 13. Затем, в строке 21, мы умножим расценку одного часа на количество отработанных часов. А в строке 22 посчитаем зарплату рабочих с учетом налога. И, наконец, запишем зарплату в файл «abc.txt». Отметим, что после чтения или записи все открытые файлы рекомендуется закрыть.

Приведем полный код программы.

program Project7;

{$APPTYPE CONSOLE}

uses

SysUtils;

var f,f1:textfile;

j,ch,h:integer;

n,z:real;

S:string;

begin

assign(f, 'C:\rec.txt');

assign(f1, 'C:\abc.txt');

reset(f);                      //открыть файл «rec.txt» в режиме чтения

rewrite(f1);                //открыть файл «abc.txt» в режиме записи

while not eof(f) do
//пока не будет достигнут конец файла, выполнять цикл

begin

readln (f,S);                  //считываем из файла фамилию

write(f1,S,' ');               //записываем ее в «abc.txt»

readln (f,S);                 //считываем имя

write(f1,S[1],'. ');        //записываем его первую букву в файл

readln (f,S);                 //считываем отчество

writeln(f1,S[1],'.');     

readln (f,S);                //считываем дату рождения

readln (f,S);                 //считываем адрес

readln (f,S);                //считываем количество детей

Val(S,ch,j);                  //преобразуем строку в число

  if j>0 then break;    //если преобразование некорректно, выйти из цикла

readln (f,S);                  //считываем количество отработанных часов

Val(S,z,j);

  if j>0 then break;

readln (f,S);                 //считываем расценку одного часа   

Val(S,h,j);

  if j>0 then break;

n:=13-(ch*0.01);          // налог с учетом детей

z:=h*z;                         //зарплата без учета налога

z:=z-(z/100)*n;            //зарплата с учетом налога

writeln(f1,z:2:2);         //записываем зарплату в файл «abc.txt»

end;

close(f1);                     //закрываем файл «abc.txt»

close(f);                       //закрываем файл «rec.txt»

end.

В заключение стоит заметить, что если файл «abc.txt», в случае его отсутствия в указанной папке, создается автоматически после запуска программы, то файл «rec.txt» должен существовать, иначе возникнет ошибка, и программа не сможет корректно работать. На рис. 7.1. показан результат работы программы, а на рис. 7.2. и рис. 7.3. показано содержимое файлов «rec.txt» и «abc.txt».





Рис. 7.1. Экранный результат работы программы для задачи 10.7.
 



 


Рис. 7.3. Содержимое файла «abc.txt» в результате решения задачи 10.7.
 

Рис. 7.2. Содержимое файла «rec.txt».
 





Заключение




В наше время среднестатистическому ПК-пользователю достаточно редко приходится сталкиваться с консольными приложениями, большее предпочтение он отдает оконным. И кажется, что программы с текстовым интерфейсом уходят в прошлое. Напрасно. На самом деле такие  программы и в настоящее время необходимы. Может быть, внешне они и малопривлекательны, однако, как мы выше уже убедились, по функциональности ничем не уступают приложениям с богатым графическим интерфейсом – а это самое главное.

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

Хотелось бы еще добавить, что все-таки в современном мире обойтись без программирования крайне сложно. В самом начале я уже говорила, что  существует немало таких задач, решение которых у человека отнимает много времени. Возьмем для примера хотя бы задачу 4.7 (стр. 13). Вообразите, сколько времени ушло бы на ее решение без помощи программы, если бы m
было равно, например, 10000? Не говоря уже о том, что человек – не робот, он способен допускать различные ошибки в расчетах, особенно когда ему приходится проделывать долгую и утомительную работу. В то время как компьютер всегда максимально точен.

А, к примеру, в современной экономике ошибки, пусть даже самые, казалось бы, мелкие, могут привести к катастрофическим последствиям. Именно поэтому очень важно уметь грамотно и качественно писать различные программы для решения экономически важных задач, которые с каждым новым этапом в развитии страны становятся все сложнее.



Список использованной литературы




1.     Алексеев, Е. Р., & Чеснокова, О. В. (2004). Шаг за шагом. Турбо Паскаль 7.0. Москва: NT Press.

2.     Бобровский, С. (2000). Delphi 5. Учебный курс. Санкт-Петербург: Питер.

3.     Гаврилов, С. Программирование консольных приложений на Delphi. Получено 09. 04. 2010 r., из http://www.gptelecom.ru/Articles/Console/index.htm




[1] Pascal – язык программирования, автором которого является Вирт – профессор Высшей технической школы города Цюриха. Именно он впервые описал этот язык в 1968 году. А назван Паскаль в честь французского математика XVIII века Блеза Паскаля.

1 Константа именованный элемент программы, который на протяжении всей программы не меняет свое значение. Перед употреблением объявляется в разделе констант const.

1. Реферат на тему Линейное программирование симплекс-методом Данцига
2. Реферат на тему Война как лекарство от глупости
3. Реферат Текущий бухгалтерский учет и стоимостное измерение документация, оценка и калькуляция
4. Реферат Основные понятия надежности. классификация отказов. Составляющие надежности
5. Биография на тему Фердинанд Брюнетьер
6. Реферат Общее представление о математическом моделировании экономических задач
7. Реферат Османы династия
8. Реферат Антиинфляционная политика и её содержание
9. Реферат Загрязнение пресных вод
10. Реферат на тему The Three Part Assertion Method Essay Research