18587

Функции в языке ANSI C

Лабораторная работа

Информатика, кибернетика и программирование

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

Русский

2014-03-24

2.74 MB

11 чел.

Лабораторная работа №8

по дисциплине “Языки программирования”

Функции

Цель работы

Целью данной лабораторной работы является изучение функций в языке ANSI C.

Задача лабораторной работы

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

Задание

Реализовать алгоритм, приведенный в приложении 1.

Модифицировать программу, добавив код, запускающий алгоритм поиска (для

1-й точки) в диапазоне всех точек от 10 до 5000 и регистрирующий время работы с

данными одной размерности.

Модифицировать программу, добавив код, запускающий поиск для 1 до 5000

точек при общем количестве точек 5000.

Модифицировать программу, добавив код записи в файл времен выполнения (согласно приложения к МУ ЛР8).

Использовать полученный файл в MS Excel для построения графика зависимости (согласно приложения к МУ ЛР8).

Построить тренд по полученным данным (согласно приложения к МУ ЛР8). Сделать выводы о характере полученных зависимостей. Выводы и графики включить в отчет.

Блок-схема основной программы и дополнительных функций и процедур

Составим схему программы

 

Листинг программы

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#include <conio.h>

#include <string.h>

#include <algorithm>

#include <fstream>

#include <iostream>

#include <omp.h>

using namespace std;

const double PI = 3.14159265;

const int Size_array = 5000;

char Res[1024];

struct ArrValue {

 int ID;

 float Argument;

 float Ordinata;

   } ArrValue_Temp;

struct ArrValue ArrValue_G[Size_array];

struct ArrValue ArrValue_F[Size_array];

struct ArrValue ArrValue_Y[Size_array];

ArrValue ArrValue_Tmp;

void FindNearValue(struct ArrValue ArrValue_Temp[5000],  int i_max) //нахождение близлежайщей точки с ее номером,  аргументом и ординатой

{

  double t_1, t_2; //временные интервалы 

  float FoundedX, FoundedVal;

  printf("Enter Founded Value Argument\n");

  scanf("%f", &FoundedX);

  printf("Enter Founded Value Ordinata\n");

  scanf("%f", &FoundedVal);

  float deltaX, deltaVal, R, R0, NearX, NearVal;

  int NearID;

  t_1 = omp_get_wtime(); //начальный замер времени

  NearID = ArrValue_Temp[0].ID;

  NearX = ArrValue_Temp[0].Argument;

  NearVal = ArrValue_Temp[0].Ordinata;

   deltaX = ArrValue_Temp[0].Argument - FoundedX;

   deltaVal = ArrValue_Temp[0].Ordinata - FoundedVal;

R0 = sqrt (deltaX*deltaX + deltaVal*deltaVal);

 for (int i=0; i<i_max; i++)

  {

   deltaX = ArrValue_Temp[i].Argument - FoundedX;

   deltaVal = ArrValue_Temp[i].Ordinata - FoundedVal;

R = sqrt (deltaX*deltaX + deltaVal*deltaVal);

   if (R < R0)

 {

  R = R0;

        NearID = ArrValue_Temp[i].ID;

  NearX = ArrValue_Temp[i].Argument;

  NearVal = ArrValue_Temp[i].Ordinata;

       }

}

  t_2 = omp_get_wtime(); //конечный замер времени выводим результаты на экран

  printf("omp_get_max_threads(): %d\n", omp_get_max_threads()); //выводим результаты на экран

  printf("time: %f\n", t_2 - t_1);

  printf("Value ID nearest Point: %d\n", NearID);

  printf("Value Argument nearest Point: %f\n", NearX);

  printf("Value Ordinata nearest Point:  %f\n", NearVal);

 

}

void SaveToFile(struct ArrValue ArrValue_Temp[5000], const char* FileName, int i_max)

{

 

 FILE *file;

 file = (FILE *)fopen(FileName, "w+");

 if ((file = fopen(FileName,"w")) == NULL)

 {

 printf("Error for opening File\n");

 exit(1);

 }

 for (int i=0; i<i_max; i++)

  {

   fprintf(file, "%i %f %f\n", ArrValue_Temp[i].ID, ArrValue_Temp[i].Argument, ArrValue_Temp[i].Ordinata);

  }

fclose(file);

 

 return;

}

void LoadFromFile(struct ArrValue ArrValue_Temp[5000], const char* FileName)

{

 FILE *file;

 file = (FILE *)fopen(FileName, "rt");

 int i_max = 0;

 while( !feof(file) ) if ( fgetc(file) == '\n' ) i_max++;

 printf("Loaded Value from File: %s\n", FileName);

 clearerr(file);

 fseek(file,0,SEEK_SET);

 for (int i=0; i<i_max; i++)

  {

  fscanf(file, "%i %f %f\n", &ArrValue_Temp[i].ID, &ArrValue_Temp[i].Argument, &ArrValue_Temp[i].Ordinata);

  printf("%i %f %f\n", ArrValue_Temp[i].ID, ArrValue_Temp[i].Argument, ArrValue_Temp[i].Ordinata);

 }

 fclose(file);

 

 return;

}

float EnterDigit(char* Param ) //функция считывания введенных символов в память как числовых данных

{

 char*  mmm_string="\0";

 char   buf[30];

 _flushall();

 printf("Enter %s:", Param);

 scanf("%s",buf);

 _flushall();

 mmm_string = _strdup(buf);

 

 return atof(mmm_string);

}

void OutArr(int Cnt, float ArrVal[])

{

 

 char *buffer;

 int  decimal, sign;

 strcpy_s(Res,"Result: ");

 

 for (int i=0;i<Cnt;i++)

 {

   buffer = _fcvt(ArrVal[i], 7, &decimal, &sign );

strcat_s(Res,buffer);

   strcat_s(Res," ");

 }

 printf("\n%s\n", Res);

 return;

}

void FindSub()

{

 

 char   buf[30];

 char* buff;

 _flushall();

 printf("Enter substr:");

 fgets(buf,30,stdin);

 _flushall();

 int cnt=0;

 buff = strdup(Res);

 int i=0;

 while (buf[i]!=NULL)

 {

   if (buf[i] == '\n')

   {

     buf[i] = '\0';

   }

   i++;

 }

 buff = strstr(buff+1,buf);

 while (buff!=NULL)

 {

   

   buff = strstr(buff+1,buf);

   cnt++;

 }

 printf("Find %d \n",cnt);

 return;

}

void f_G(float a, float x1, float x2, int k)

{

 printf("Calculation G\n");

 

 float G,gg;

 float ArrG[5000];

 float x,dx;

 x = x1;

 dx = fabs((x2-x1)/k);

 int i = 0;

 do 

 {

   gg = 25 * a * a + 30 * a * x + 9 * x * x;

   if (gg != 0 )

   {

     G = 9 * (7 * a * a - 19 * a * x + 10 * x * x) / gg;

     

  ArrValue_G[i].ID = i;

  ArrValue_G[i].Argument = x;

     ArrValue_G[i].Ordinata = G;

  ArrG[i] = G;     

  i++;

   }

   x = x + dx;

 } while (x<x2);

 printf("******SUBMENU*******\n");

 OutArr(i, ArrG);

 FindSub();

 SaveToFile(ArrValue_G, "ArrValue_G.txt", i);

 FindNearValue(ArrValue_G, i);

 memset (ArrValue_G, 0 , sizeof(ArrValue_G));

 

 return;

}

void f_F(float a, float x1,float x2, int k)

{

 printf("Calculation F\n");

 float F,ff;

 float ArrF[5000];

 float x,dx;

 x = x1;

 dx = fabs((x2-x1)/k);

 int i = 0;

 do 

 {

     ff = 9 * a * a - 13 * a * x - 10 * x * x;

   

     F = cos(ff);

     ArrValue_F[i].ID = i;

  ArrValue_F[i].Argument = x;

     ArrValue_F[i].Ordinata = F;

  ArrF[i] = F;

     i++;

 

   x = x + dx;

 } while (x<x2);

 printf("******SUBMENU*******\n");

 OutArr(i, ArrF);

 FindSub();

 SaveToFile(ArrValue_F, "ArrValue_F.txt", i);

 FindNearValue(ArrValue_F, i);

 memset (ArrValue_F, 0 , sizeof(ArrValue_F));

 return;

}

void f_Y(float a, float x1,float x2, int k)

{

 printf("Calculation Y\n");

 float Y,yy;

 float ArrY[5000];

 float x,dx;

 x = x1;

 dx = fabs((x2-x1)/k);

 int i = 0;

 do 

 {

 yy = -80 * a * a - 46 * a * x + 21 * x * x + 1;

   

 if (yy >= 0)

   {

     Y = logf(yy)/logf(10.0);  

   

  ArrValue_Y[i].ID = i;

  ArrValue_Y[i].Argument = x;

     ArrValue_Y[i].Ordinata = Y;

  ArrY[i] = Y;

     i++;

   }

   x = x + dx;

 } while (x<x2);

 printf("******SUBMENU*******\n");

 OutArr(i, ArrY);

 FindSub();

 SaveToFile(ArrValue_Y, "ArrValue_Y.txt", i);

 FindNearValue(ArrValue_Y, i);

 memset (ArrValue_Y, 0 , sizeof(ArrValue_Y));

 return;

}

void vvod_dannih()

{

 

 int k;

 float a,x1,x2;

 

   system("cls");

printf("Program from Work with File. In/Out Value F, G, Y\n");

   

 a = EnterDigit("a");

     _flushall();

     x1 = EnterDigit("x1");

     _flushall();

     x2 = EnterDigit("x2");

     _flushall();

     do 

     {

       _flushall();

       printf("Enter K (< 5000):");

       scanf_s("%d",&k);

     } while (k<0 || k>5000);

     f_G(a,x1,x2,k);

     f_F(a,x1,x2,k);

     f_Y(a,x1,x2,k);

  return;                 

}

int main()

{

printf("Calculation (1) Array or load from file (2 or other) G,F,X ? \n");

 int ch;

ch = _getch();

 if ( ch != '1' )

   {

 LoadFromFile(ArrValue_G, "ArrValue_G.txt");

    LoadFromFile(ArrValue_F, "ArrValue_F.txt");

 LoadFromFile(ArrValue_Y, "ArrValue_Y.txt");

 system("pause");

 

  }

 vvod_dannih();

 system("pause");

 return 0;

}

Результаты работы

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

Для функции f_F

Для функции f_G

Загрузка данных из массива стурктур в среду Excel через файлы ArrVal.txt. Для правильного восприятия строчных данных и разбиения  строки на 3 столбца выполним преобразование строковых данных в табличный через функцию MS WORD  «ВСТАВКА» -> «ТАБЛИЦА» -> «ПРЕОБРАЗОВАТЬ В ТАБЛИЦУ»

График точек массива ArrValue_G. Аппроксимированная кривая, коэффициент корреляции

График точек массива ArrValue_F. Аппроксимированная кривая, коэффициент корреляции

График точек массива ArrValue_Y. Аппроксимированная кривая, коэффициент корреляции

Выводы по работе

В ходе выполнения лабораторной работы я изучил особенности  написания  программы  на языке ANSI C, в основе которой лежит алгоритм структуры и  работа с файлами. Также была выполнения загрузка данных в среду Excel получен тренд по исходным данным, подобрана аппроксимирующая кривая, найден коэффициент корреляции. Найденный коэффициент оказался близкий к 1, что означает о тесной функциональной связи значений  ординаты с аргументом.


 

А также другие работы, которые могут Вас заинтересовать

55505. Похід більшовицьких військ на Київ. Четвертий Універсал Центральної Ради. Крути 38.5 KB
  ІУ Універсал Центральної Ради. Вчитель дає запитання учням: Коли було проголошено І Універсал За Ім Універсалом Україна проголошувалась Як називався Ій український уряд Український уряд очолив Коли було проголошено ІІй Універсал...
55506. Радянізація західноукраїнських земель 90 KB
  Мета уроку: Охарактеризувати процес радянізації на західноукраїнських землях у повоєнні роки; показати трагізм долі УГКЦ; визначити цілі і методи збройної боротьби ОУНУПА...
55508. РАДІСТЬ ТВОРЧИХ ВІДКРИТТІВ НА УРОЦІ 192 KB
  Після закінчення встановлених двох хвилин усі команди що встигли то встигли міняються своїми розмальованими аркушами. У кожної команди чийсь чужий аркуш який тепер потрібно перевірити другий раунд.
55509. Групи слів за значенням: синоніми, антоніми. Синоніми. Типи синонімів. Синонімічні ряди. Антоніми 65.5 KB
  Групи слів за значенням: синоніми антоніми. Антоніми. Мета: поглибити знання про групи слів за значенням; формувати вміння визначати в реченнях і текстах синоніми і антоніми; учити утворювати синонімічні ряди і добирати антонімічні пари доречно вживати їх у мовленні...
55510. Розробка заняття з інформатики на тему "Використання сортування, фільтрації даних, робота з підсумками, перевіркою даних, захистом листів" з використанням інтерактивних методів та програми Radmin 383 KB
  Цілеспрямований розвиток індивідуальності можливий лише тоді, коли теорія освіти не декларуватиме необхідність творчості педагога і творчості студента, а систематично за допомогою доцільних методів втілюватиме її у навчально-виховному процесі.
55511. Чтобы радость людям дарить, надо добрым и вежливым быть 59.5 KB
  Дорогие ребята! Весь учебный год наш класс работал на маршруте «Путешествие в страну Вежливых». Мы продолжаем наше путешествие. И сегодня остановка на станции «Доброта». Девиз (читают с доски): «Чтобы радость людям дарить, надо добрым и вежливым быть»
55512. Щедра осінь 506 KB
  Вчити бачити красу рідного краю, виразно читати вірші. Розвивати усне мовлення, збагачувати словниковий запас, розвивати спостережливість, естетичні смаки, творчі здібності. Виховувати любов до природи, праці, шанобливе ставлення до хліба, повагу до традицій рідного краю