18587

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

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

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

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

Русский

2014-03-24

2.74 MB

9 чел.

Лабораторная работа №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, что означает о тесной функциональной связи значений  ординаты с аргументом.


 

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

23995. Выживание в экстремальных ситуациях. Перечень вопросов для определения дальнейших действий 15.52 KB
  Всё снаряжение тоже отнести безопасное место. если ваше место положения не известно то придерживались ли вы маршрута если обнаружат ваше отсутствие то будут искать на том маршруте по которому вы шли хорошо ли виден ваш лагерь с воздуха или окружающихся возвышенностей. знаете ли вы точно своё место нахождение если да то насколько оно близко к населённому пункту. Решение оставаться на месте: сигналы бедствия переданы место происшествия точно не определено местность не знакомая и трудно проходимая неизвестно расстояние до...
23996. Сооружение временного укрытия 18.84 KB
  Направление ударов должно быть таким чтобы искры попадали на трут легковоспламеняющийся или тлеющий материал. Поэтому трут можно заготовить заранее и носить с собой в герметической упаковке. Сделать трут несложно пропитав концентрированным раствором калиевой селитры и хорошо просушив кусок медицинской ваты. Трут можно изготовить также из куска чистошерстяной или хлопчатобумажной ткани.
23997. Обеспечение водой 23 KB
  Обеззараживающим эффектом обладают и некоторые растения и травы. Многие старые растения способны накапливать в себе токсичные вещества поэтому надо стараться выбирать свежую молодую растительность. В целях предупреждения отравлений не рекомендуется: употреблять в пищу растения выделяющие на изломе Млечный сок; луковицы растений не имеющие характерного луковичного и чесночного запаха; косточки и семена растений; фрукты которые делятся на пять долек; растения покрытые волосками; траву и растения имеющие на корне листьях крошечные...
23998. Положение об организации слётов и соревнований 15.36 KB
  Туристические соревнования учащихся в значительной мере отличаются от соревнований взрослых т. туристические слёты и соревнования в учреждениях образования 2. муниципальные слёты и соревнования 3. областные краевые слёты и соревнования 4.
23999. Организация питания 15.62 KB
  Чаще всего продукты вывозятся к месту соревнований какимлибо продовольственным магазином определенным управлением торговли и имеющим набор необходимых продуктов. Но это не исключает развертывания на месте соревнований магазина в котором продают хлеб овощи и фрукты кондитерские изделия фруктовую воду и другие продукты. Если недалеко есть столовая можно готовить пищу там и привозить ее в термосах к месту соревнований. Во время соревнований когда судьи не могут покинуть свой пост необходимо организовать доставку питания в термосах прямо...