Программа исследования функций

Программа исследования функций 

Пояснительная записка к курсовой работе по дисциплине “Основы алгоритмизации и программирования”

Выполнил : студент гр. 96ВВ3 Гаврищенко О.Н.

Пензенский  государственный технический университет, Кафедра   “Вычислительная Техника”

1997

Введение

В настоящее время индустрия производства компьютеров и  программного обеспечения для них является  одной  из  наиболее  важных сфер экономики развитых стран. Ежегодно в мире  продаются  десятки миллионов компьютеров. Только в США объем продаж компьютеров  составляет десятки миллионов долларов и постоянно продолжает расти.

В чем же причины такого стремительного роста индустрии персональных компьютеров и их сравнительная выгодность для многих деловых применений?

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

2. Относительно высокие возможности по  переработке  информации, наличие программного обеспечения, а так же мощных систем  для разработки нового программного обеспечения.

Имеются и другие причины.

Язык С++ - универсальный язык общего назначения, область приложений которого - программирование систем в самом широком смысле. Кроме этого, С++ успешно используется как во  многих  приложениях, так и в мощных операционных системах. Реализация С++  осуществлена для машин в диапазоне от самых простых персональных компьютеров  до  самых мощных суперкомпьютеров и для  всех операционных систем.

1 Постановка задачи

Задача курсовой работы  состоит в разработки  системы , позволяющей исследовать некоторые функций:

 y = sin(x);

 y = cos(x);

Cистема должна обеспечивать выполнение следующих функций:

 Выбор из предложенного списка исследуемой функции;

 Задание диапазона (диапазонов) изменения параметров;

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

 Вывод на экран графика функции.

2 Описание программы

2.1 Общие сведения

Данная программа предназначена для исследования математических функций (см. пункт 1). Программа do.cpp разработана на алгоритмическом языке Turbo C++ v.3.0. , и предназначена для использования на персональном компьютере IBM PC/XT или совместимым с ним.

2.2 Краткое описание метода решения задачи

Работа с программой организована в графическом режиме 640х480 точек , 16 цветов через меню, по пунктам которого можно передвигать цветовой курсор  с помощью клавиш управления курсором.

Основное меню описано при помощи массива структур menu_ на 5 элементов , который заначительно упрощает работу программы при обращении к этому меню. Каждый пункт основного меню (кроме "Выход") содержит в себе подменю , каждый пункт которого вызывает какие-либо действия программы.

Главное меню состоит из следующих пунктов: 

 "Функция" - выбор исследуемой функции;

 "Диапазон" - задание минимального и максимального значения Х для отображения графика функции и занесения значений в таблицу;

 "Масштаб" - задание масштаба по оси X;

 "Таблица" - вывод значений функции на экран или в файл (имя файла задаётся пользователем) , изменение числа выволимых значений;

 "Выход" - завершение работы программы.

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

2.3 Функциональное назначение

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

2.4 Описание  данных

Структура , массив которых образует меню , состоит из 3 полей:

1. num - поле целого типа (int) - содержит количество пунктов меню;

2. onum - поле целого типа (int) - содержит количество опрашиваемых пунктов меню;

3. capt - массив символов (по 20 символов на элемент) из 6 элементов - содержит имена пунктов меню.

Глобальные переменные,которые использует программа:

Название 

Тип

Начальное значение

Назначение

MinX

float

-4

Начальное значение Х

MaxX

float

4

Начальное значение Y

MX

float

80

Масштаб по оси Х

MY

float

80

Масштаб по оси Y

CF

int

0

Номер функции

SC

int

20

Число строк в таблице

2.5 Структура программы

   Данная программа разработана на  алгоритмическом  языке  С++  и состоит из следующих функциональных модулей:

   1. Функция fun - Возвращает 0 , если невозможно вычислить значение функции при заданном значении Х, иначе вычисляет значение Y и возвращает 1;

   2. Функция output  - Осуществляет вывод графика функции на экран с учётом всех параметров;

   3. Функция use_scroll - Осуществляет обработку вертикального меню;

   4. Функция use_menu - Осуществляет обработку главного меню;

   5. Функция InputFloat - Осуществляет ввод вещественного числа в графическом режиме;

   6. Функция InputString - Осуществляет ввод строки символов в графическом режиме;

   7. Функция prttabl - Осуществляет вывод таблицы в файл или на экран;

   8. Основная программа Main - Заполняет массив меню , организует взаимодействие всех функциональных модулей.

2.6 Спецификация на функциональные модули

2.6.1 Функция fun

Назначение: Возвращает 0 , если невозможно вычислить значение функции при заданном значении Х, иначе вычисляет значение Y и возвращает 1;

Входные данные: x - значение переменной х , *y - имя функции.

Выходные данные: fun.

Не вызывает никаких функций.

Вызывается из output: rt=fun(x,&y);

  prttabl: if (fun(x,&y)) fprintf (f,"Fun(%f)=%f\n\f",x,y);

2.6.2 Функция output

Назначение: Осуществляет вывод графика функции на экран с учётом всех параметров.

Входные данные:  нет.

Выходные данные: нет.

Вызывает функцию fun.

Вызывается из основной программы: output();

В пункте 2.11 приведён алгоритм работы данной функции.

2.6.3 Функция use_scroll

Назначение: Осуществляет обработку вертикального меню - опрос клавиатуры , отображение пунктов подменю , передвижение курсора , при нажатии клавиши Enter возврвщает код выбранного пункта меню , при нажатии клавиши ESC возвращает -1.

Входные данные: menu_m - название массива меню , х-координата х вывода меню.

Выходные данные: use_scroll.

Не вызывает никаких функций.

Вызывается из основной программы: CF=use_scroll(fun,0);

					     switch (se_scroll(dia,105))

					     switch (se_scroll(mas,205))

					     switch (se_scroll(tabl,305))

2.6.4 Функция use_menu

Назначение: Осуществляет обработку главного меню - вывод пунктов меню на экран , отображение цветового курсора , при нажатии клавиши Enter возврвщает код выбранного пункта меню , при нажатии клавиши ESC возвращает -1.

Входные данные: menu_m - название массива меню.

Выходные данные: use_menu.

Не вызывает никаких функций.

Вызывается из основной программы: switch (use_menu(m1))

2.6.5 Функция InputFloat

Назначение: Осуществляет ввод и редактирование вещественного числа в графическом режиме , возвращает введённое число.

Входные данные: x1,y1,x2,y2 - координаты окна редактирования , last - текущее значение данного параметра.

Выходные данные:InputFloat.

Не вызывает никаких функций.

Вызывается из основной программы:MinX=InputFloat(210,30,310,45,MinX);

					   MaxX=InputFloat(210,50,310,65,MaxX);

					   MY=InputFloat(310,30,410,55,MY);

2.6.6 Функция InputString

Назначение: Осуществляет ввод и редактирование строки символов в графическом режиме , возвращает указатель на введённую строку.

Входные данные: x1,y1,x2,y2 - координаты окна редактирования ,* last - указатель на строку.

Выходные данные: *InputString.

Не вызывает никаких функций.

Вызывается из основной программы: prttabl(Inputstring(410,30,510,45,"Prn"));

2.6.7 Функция PrtTabl

Назначение: Осуществляет вывод таблицы в файл или на экран.

Входные данные: *fname - указатель на имя файла , если имя файла "con" то вывод осуществляется на экран в текстовом режиме.

Выходные данные:  нет.

Вызывает функцию fun.

Вызывается из основной программы: prttabl("con\x0");

     prttabl(Inputstring(410,30,510,45,"Prn"));

2.7 Описание работы основной программы

Основная программа осуществляет следующие действия:

 Заполнеие массива меню.

 Установку начальных пунктов меню.

 Установку графического режима , очистку экрана.

 Вызов функции оформления экрана.

 Опрос меню , вызов функций , соответствующих каждому из выбраннх пунктов. 

 Выход из программы.

Основная программа использует следующие функции: output , use_scroll , use_menu , InputFloat , Inputstring , prttabl.

Далее в пункте 2.10 приведён подробный алгоритм работы основной программы.

2.8 Схема взаимодействия функциональных модулей

2.9 Описание алгоритма основной программы и функции Output

В нижеприведённом алгоритме работы основной программы отображены следующие блоки:

Блоки 0,30 - Начало программы , функции;

Блоки 11,12,14,15,18,19,23,26,40,41 - Операции ввода,вывода;

Блоки 1,2,3,5,13,21,28,32,33,38 - Операции действия , вычисления , присваивания.

Блоки 6,8,16,20 - Операция ветвления.

Блоки 31,37,39,44 - Условная операция.

Блоки 4,7,8,17,22,24,25,36 - Вызов функции.

Блоки 29,45 - Конец программы,функции.

2.10 Алгоритм работы основной программы

 

 

 

 

2.11 Алгоритм работы функции output

 

 

3 План отладки программы

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

1. Пишется и отлаживается функция fun.

2. Пишется и отлаживается функция use_menu.

3. Пишется и отлаживается функция use_scroll.

4. Пишется основная программа с заглушками.

5. Пишется и отлаживается функция output.

6. Пишется и отлаживается функция inputfloat.

7. Пишется и отлаживается функция inputstring.

8. Пишется и отлаживается функция prttabl.

9. Отлаживается основная программа без заглушек.

4.Руководство пользователя

Для запуска данной программы необходимо наличие  персонального компьютера IBM PC/XT c операционной системой MS-DOS.

Необходимый объем оперативной памяти - от 640 КБайт и выше.

Для работы программы необходимо наличие видеокарты VGA , для обеспечения установки графического режима 640х480 точек 16 цветов.

Дла запуска программы необходимо сделать текущем каталог с программой do.exe и вызвать её на выполнение. В этом же каталоге должен находиться файл графической библиотеки egavga.bgi.

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

Выход из программы - клавиша ESC или выбор пункта "Выход".

Заключение

В курсовой работе решена задача исследования математических функций.

Разработан алгоритм решения поставленной задачи. По этому алгоритму на языке Turbo C++ составлена и отлажена программа, анализ работы которой показал, что поставленная задача успешно решается.

Список литературы

1.Бьярн Страуструп. Язык программирования С++.в двух частях.  Пер. с англ. Киев:"ДиаСофт",1993.-296 с.,ил.

2.Корриган Джон Компьютерная графика: Секреты и решения: Пер с англ. -М.:Энтроп, 1995. - 352 с., ил.

ПРИЛОЖЕНИЕ 1

Распечатка программы

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <graphics.h>

#include <string.h>

#include <math.h>

// Драйвер - VGA, Режим - 640x480x16

int drv=VGA,mode=VGAHI;

// Структура, описывающая меню

struct menu_ {

  int num;	// Количество пунктов

  int onum;	// Количество опрашиваемых пунктов

  char capt[6][20];// Имена пунктов

};

// Глобальные переменные

float MinX=-4;	// Начальное значение X

float MaxX=4;   // Конечное значение X

float MX=80;	// Масштаб по X

float MY=80;	// Масштаб по Y

int CF=0;	// Номер функции

int SC=20;      // Число строк в таблице

// Возвращает 0, если невозможно подсчитать функцию при данном X,

// иначе изменяет Y и возвращает 1

int fun(float x,float * y) {

  switch(CF) {

    case(0):

      *y=sin(x);

      return 1;

    case(1):

      *y=cos(x);

      return 1;

    case(2):

      *y=x*x;

      return 1;

    case(3):

      if (x<0) return 0;

      *y=sqrt(x);

      return 1;

    case(4):

      if (fabs(x)<0.0000001) return 0;

      *y=1/fabs(x);

      return 1;

    case(5):

      if (fabs(x)<0.0000001) return 0;

      *y=2*sin(x*x)/x;

      return 1;

  }

  return 0;

}

// Вывод графика функции на экран

void output() {

  float x;	// Очередная точка

  float y;      // графика

  float stp;	// Шаг изменения X

  float px,py;	// Предыдущая точка

  int rp=0;	// 1 - если предыдущая точка существует

  int rt=0;	// 1 - если текущая точка существует

// Выход при неправильно заданном диапазоне

  if ((MaxX-MinX)<=0) return;

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

  x=MinX;

  stp=(MaxX-MinX)/320;

// Вывод линий

  setcolor(12);

  line(0,240,639,240);

  if ((MinX<0)&&(MaxX>0))

    line((0-MinX)*MX,0,(0-MinX)*MX,480); 

  setcolor(15);

// Вывод функции

  do {

  // Нахождение очередной точки

    rt=fun(x,&y);

    if (rt==0) {

      // Если точки нет - сброс значения предыдущей

      rp=0;

    } else {

      // Иначе - проверка:

      if (rp==0) {

	// Если предыдущей нет, ставим точку

	putpixel((x-MinX)*MX,(240-y*MY),15);

	rp=1;

      } else {

	// Иначе рисуем линию

	line((px-MinX)*MX,(240-py*MY),(x-MinX)*MX,(240-y*MY));

      }

      // Новые значения предыдущей точки

      px=x;

      py=y;

    }

  // Новое значение X

    x+=stp;

  } while (x<MaxX);

}

// Процедура обработки вертикального меню

// Параметры: меню, координата X вывода меню

int use_scroll(menu_ m,int x) {

  int n;	// Счетчик

  int vp=0; 	// Выбранный пункт

  char c;	// Считанный с клавиатуры символ

// Очистка места под меню

  setfillstyle(1,8);

  settextjustify(1,1);

  bar(x,0,x+105,479);

  do {

// Вывод пунктов меню

    for (n=0;n<m.num;n++) {

  // Выделение цветом выбранного пункта и неактивных поселдних пунктов

      if (n==vp) {

	setfillstyle(1,4);

	setcolor(15);

      } else {

	if (n>(m.onum-1)) {

	  setfillstyle(1,8);

	  setcolor(10);

	} else {

	  setfillstyle(1,1);

	  setcolor(14);

	}

      }

  // Вывод пункта

      bar(x+5,5+30*n,x+100,25+30*n);

      rectangle(x+6,6+30*n,x+99,24+30*n);

      outtextxy(x+55,15+30*n,m.capt[n]);

    }

  // Опрос клавитауры

    do {

      c=getch();

      if (c==0) c=getch();

    // Клавиша Вниз

      if (c==72) {

	vp--;

	if (vp<0) vp=m.onum-1;

      }

    // Клавиша Вверх

      if (c==80) {

	vp++;

	if (vp>=m.onum) vp=0;

      }

    } while ((c!=72)&&(c!=80)&&(c!=13)&&(c!=27));

  } while ((c==72)||(c==80));

// Возврат выбраннго пункта

  if (c==13) return vp;

// Возврат -1 при ESC

  return -1;

} 

// Процедура обработки горизонтального меню

int use_menu(menu_ m) {

  int n;	// Счетчик

  int vp=0;	// Выбранный пункт

  char c;	// Символ

// Очистка места под меню

  setfillstyle(1,0);

  settextjustify(1,1);

  bar(0,0,639,25);

  do {

// Вывод пунктов меню

    for (n=0;n<m.num;n++) {

  // Выделение цветом

      if (n==vp) {

	setfillstyle(1,4);

	setcolor(15);

      } else {

	if (n>(m.onum-1)) {

	  setfillstyle(1,8);

	  setcolor(10);

	} else {

	  setfillstyle(1,1);

	  setcolor(14);

	}

      }

  // Вывод пункта

      bar(10+100*n,5,105+100*n,25);

      rectangle(11+100*n,6,104+100*n,24);

      outtextxy(60+100*n,15,m.capt[n]);

    }

  // Опрос клавиатуры

    do {

      c=getch();

      if (c==0) c=getch();

      if (c==75) {

      // Влево

	vp--;

	if (vp<0) vp=m.onum-1;

      }

      if (c==77) {

      // Вправо

	vp++;

	if (vp>=m.onum) vp=0;

      }

    } while ((c!=75)&&(c!=77)&&(c!=13)&&(c!=27));

  } while ((c==75)||(c==77));

  if (c==13) return vp;

  return -1;

}

// Ввод числа

// Параметры: координаты прямоугольной рамочки и значение по умолчанию

float InputFloat(int x1,int y1,int x2,int y2,float last) {

  char s[100];		// Строка

  char s1[100];		// Промежуточная строка

  char c;		// Символ

// Вывод рамочки

  setfillstyle(1,2);

  setcolor(14);

  bar(x1,y1,x2,y2);

  rectangle(x1+1,y1+1,x2-1,y2-1);

  sprintf(s,"%2.3f",last);

  settextjustify(0,1);

  // Опрос клавиатуры

  do {

    // Вывод строки и курсора

    bar(x1+2,y1+2,x2-2,y2-2);

    strcpy(s1,s);

    strcat(s1,"_");

    outtextxy(x1+5,y1+10,s1);

    c=getch();

    if (((c>='0')&&(c<='9'))||(c=='.')||(c=='-')) {

    // Нажат разрешенный символ - добавление

      s[strlen(s)+1]=0;

      s[strlen(s)]=c;

    }

    // Нажат BackSpace

    if ((c==8)&&(strlen(s)>0)) s[strlen(s)-1]=0;

  } while ((c!=13)&&(c!=27)); 

// Если не ESC - перевод нового значения из строки в число

  if (c!=27) sscanf(s,"%f",&last);

  return last;

}

// Ввод строки

// Параметры: координаты прямоугольной рамочки и значение по умолчанию

char * InputString(int x1,int y1,int x2,int y2,char * last) {

  char s[100];

  char s1[100];

  char c;

// Вывод рамочки

  setfillstyle(1,2);

  setcolor(14);

  bar(x1,y1,x2,y2);

  rectangle(x1+1,y1+1,x2-1,y2-1);

  strcpy(s,last);

  settextjustify(0,1);

  // Опрос клавиатуры

  do {

    // Вывод строки и курсора

    bar(x1+2,y1+2,x2-2,y2-2);

    strcpy(s1,s);

    strcat(s1,"_");

    outtextxy(x1+5,y1+10,s1);

    c=getch();

    if ((c!=13)&&(c!=27)&&(c!=8)) {

    // Нажат разрешенный символ - добавление

      s[strlen(s)+1]=0;

      s[strlen(s)]=c;

    }

    if ((c==8)&&(strlen(s)>0)) s[strlen(s)-1]=0;

  } while ((c!=13)&&(c!=27));

// Если ESC - возвращаем старое значение

  if (c==27) return last;

  return s;

}

// Вывод таблицы в файл

void prttabl(char * fname) {

  FILE * f;	// Указатель на файл

  float stp;	// Шаг изменения функции

  float x;	// Текущая

  float y;      //  точка

// Выход при неправильно заданном диапазоне

  if ((MaxX-MinX)==0) return;

// Открываем файл на запись

  f=fopen(fname,"wb");

// Начальные значения

  x=MinX;

  stp=(MaxX-MinX)/SC;

  do {

// Если значение функции верно - вывод в файл

    if (fun(x,&y)) fprintf(f,"Fun( %f )= %f \n\r",x,y);

    x+=stp;

  } while (x<=MaxX);

// Закрываем файл

  fclose(f);

}

// Основная программа

void main() {

  char s[30];

// Описание меню

  menu_ m1;

  menu_ fun;

  menu_ dia;

  menu_ mas;

  menu_ tabl;

  strcpy(m1.capt[0],"Функция\x0");

  strcpy(m1.capt[1],"Диапазон\x0");

  strcpy(m1.capt[2],"Масштаб\x0");

  strcpy(m1.capt[3],"Таблица\x0");

  strcpy(m1.capt[4],"Выход  \x0");

  m1.num=6;

  m1.onum=5;

  strcpy(fun.capt[0],"Sin(X)\x0");

  strcpy(fun.capt[1],"Cos(X)\x0");

  strcpy(fun.capt[2],"X^2\x0"); 

  strcpy(fun.capt[3],"Sqrt(X)\x0");

  strcpy(fun.capt[4],"1/|X|\x0");

  strcpy(fun.capt[5],"2Sin(X^2)/X\x0");

  fun.num=6;

  fun.onum=6;

  strcpy(dia.capt[0],"Диапазон\x0");

  strcpy(dia.capt[1],"Min:\x0");

  strcpy(dia.capt[2],"Max:\x0");

  dia.num=3;

  dia.onum=3;

  strcpy(mas.capt[0],"Масштаб\x0");

  strcpy(mas.capt[1],"Y:\x0");

  strcpy(mas.capt[2],"X:\x0");

  mas.num=3;

  mas.onum=2;

  strcpy(tabl.capt[0],"Таблица\x0");

  strcpy(tabl.capt[1],"На экран\x0");

  strcpy(tabl.capt[2],"В файл\x0");

  strcpy(tabl.capt[3],"Число строк\x0");

  tabl.num=4;

  tabl.onum=4;

// Инициализация графики

  initgraph(&drv,&mode,"");

  for (;;) {

  // Вывод графика функции

    cleardevice();

    output();

    strcpy(m1.capt[5],fun.capt[CF]);

    // Опрос меню

    switch(use_menu(m1)) {

      case 0:

	CF=use_scroll(fun,0);

	break;

      case 1:

	switch(use_scroll(dia,105)) {

	  case 1:

	    MinX=InputFloat(210,30,310,45,MinX);

	    break;

	  case 2:

	    MaxX=InputFloat(210,50,310,65,MaxX);

	    break;

	}

	sprintf(dia.capt[1],"Min: %2.3f",MinX);

	sprintf(dia.capt[2],"Max: %2.3f",MaxX);

	MY=MX=(640/(MaxX-MinX));

	sprintf(mas.capt[1],"Y: %2.1f",MY);

	sprintf(mas.capt[2],"X: %2.1f",MX);

	break;

      case 2:

	switch(use_scroll(mas,205)) {

	  case 1:

	    MY=InputFloat(310,30,410,45,MY);

	    break;

	}

	sprintf(mas.capt[1],"Y: %2.1f",MY);

	sprintf(mas.capt[2],"X: %2.1f",MX);

	break;

      case 3:

	switch(use_scroll(tabl,305)) {

	  case(1):

	    cleardevice();

	    prttabl("con\x0");	// В качестве файла - консоль

	    getch();

	    break;

	  case(2):

	    prttabl(InputString(410,30,510,45,"Prn"));

	    break;

	  case(3):

	    SC=InputFloat(410,30,510,45,SC);

	    break;

	}

	sprintf(tabl.capt[3],"Строк: %d",SC);

	break;

      case -1:

      case 4:

	return;

    }

  }

}