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


 

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

75925. Борис Ельцин – первый президент РФ: личность и эпоха 15.83 KB
  А как к деятельности бывшего руководителя страны относятся наши местные политики Какое по их мнению место в истории он заслуживает Римма Ризванова руководитель исполкома Набережночелнинского отделения партии Единая Россия: – Время правления Ельцина – 1990е годы – было очень сложно. А сегодня многие даже не понимают что Путин –это его преемник который в свое время выделил бывшему президенту годовую пенсию равную 28 миллионов рублей в год Ельцина люди по-прежнему ненавидят. Под руководством Ельцина начала сеяться в России...
75926. Внешнеполитические причины дезинтеграции СССР 18.75 KB
  Борьба США и СССР. Целенаправленная помощь афганским моджахедам; Инновационная технологическая рецептура: Кампания по резкому сокращению притока валюты в СССР реализуемая посредством снижения по договоренности с Саудовской Аравией мировых цен на нефть ограничения советского природного газа в Западную Европу; Когда у СССР сформировалась иллюзия возможности безбедного существования за счет цен на нефть и когда советская экономика уже была полностью привязана к нефтяному экспорту произошел 1986 г. воздействие американцы активно...
75927. Внешняя политика во взглядах правящей элиты России: эволюция и современное состояние 21.02 KB
  На протяжении последних двух десятилетий в России сменилось несколько партий власти. На смену Выбору России и созданной одновременно с ним Партии российского единства и согласия пришло движение Наш дом Россия впоследствии влившееся в блок Единство который затем трансформировался в Единую Россию. В рамках переходной политической системы постсоветской России Ельцин находил достаточно прочную социальную и политическую базу как в широком демократическом движении так и в рыночно ориентированной части постсоветской номенклатуры.
75928. Внутриполитические причины дезинтеграции СССР 17.22 KB
  Отсутствие гибкого механизма управления огромной страной способного изменяться в соответствии с веяниями времен Разногласия в единой политике КПСС кризис коммунистической идеологии и ослабление роли КПСС с последующей ликвидацией ее партийно-политической монополии составлявшей основу СССР; было утрачено большинство политических и территориальных завоеваний СССР в годы Великой Отечественной войны были ликвидированы СЭВ и ОВД....
75930. Государство и церковь в современной России. Особенности взаимоотношений 16.87 KB
  Сегодня проблема взаимоотношений церкви и государства остра как никогда. Если принять во внимание что крупнейшей и наиболее структурированной религиозной организацией в нашей стране является Русская православная церковь Московский патриархат осуществляющая активные контакты с государством то становится очевидной необходимость особого подхода к изучению взаимоотношений церкви и государства. Повсеместное строительство и возрождение храмов рост авторитета и влияния Русской Православной Церкви стали приметой нашего времени. В этом...
75931. Демографическая ситуация и демографическая политика РФ на современном этапе 17.94 KB
  С конца 90х годов XX века демографическая проблема рассматривается как фактор национальной безопасности с 2000 года обсуждается демографическая ситуация в России и меры по ее оптимизации. В 2001 году число жителей России уменьшилось почти на 1 миллион человек. Сохранение нынешнего уровня рождаемости и смертности населения может привести к тому что уже через 15 лет население России уменьшится еще на 10 млн человек.
75932. Деятельность Государственной Думы и Совета Федерации в конце 20 века 20.16 KB
  Среди принятых федеральные конституционные законы Об арбитражных судах в Российской Федерации и О Конституционном Суде Российской Федерации О референдуме Российской Федерации; первая часть Гражданского кодекса; Семейный Водный Арбитражный процессуальный кодексы. Успехи: Вклад в развитие парламентаризма Установилось взаимодействие между Государственной думой и советом федерации начали складываться рабочие отношения между госдумы с Президентов РФ Правительством Рф и министерствами и ведомствами РФ. Государственная дума также...
75933. Избирательная система РФ и ее эволюция в конце 20 века 22.87 KB
  Граждане Российской Федерации имеют право участвовать в управлении делами государства как непосредственно так и через своих представителей. Граждане Российской Федерации имеют право избирать и быть избранными в органы государственной власти и органы местного самоуправления а также участвовать в референдуме. Президент Российской Федерации избирается сроком на шесть лет гражданами Российской Федерации на основе всеобщего равного и прямого избирательного права при тайном голосовании. Президентом Российской Федерации может быть избран гражданин...