Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЭУМК-2.doc
Скачиваний:
192
Добавлен:
11.05.2015
Размер:
626.18 Кб
Скачать

Int newton(double (*f)(double), // Функция

double (*f1)(double), // Производная функция

double x0, // Начальное приближение

double *x, // Значение корня

double eps) // Требуемая точность

{

int i=0; // i - количество шагов

do

{

x0=*x;

*x=x0-func(x0)/derfunc(x0);

i++;

} while (fabs(x0-*x)>eps);

return i;

}

///////////////////////////////////////////

void main()

{

int i;

double a=1.0,b=3.0,eps=0.00000000001,x;

x=b;

i = newton(func, derfunc,2.0,&x, eps);

printf ("\nRoot= %.20lf\n",x);

printf ("number of steps: %u\n",i);

getch();

}

Основные понятия структур данных

1. Типы данных – простые и составные.

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

Целочисленные

С плавающей точкой

Строковые и символьные

integer (4)

float (4)

char [n]

short (2)

double (8)

char (1)

long (4)

char (1)

Указание типа переменной позволяет транслятору отвести для значения переменной определенный объем памяти.

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

Пусть имеется структура

struct Str1

{

char cCode;

int nWeight;

char cSymbol;

}

В зависимости от установленного режима трансляции возможны следующие варианты размещения элементов структуры в памяти:

2. Агрегирование данных.

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

int Array[12];

const int DIM=5;

double dMat[DIM][DIM];

При описании массива его размерность не может быть задана не константной переменной.

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

для массива A[n][m][p]элементaijkимеет смещение от начала(i*m+j)*p+k. Т. о. для массива А[2][3][2] последовательность элементов будет

a000, a001, a010, a011, a020, a021, a100, a101, a110, a111, a120, a121

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

int *pArray, nDim;

scanf (“%u”, &nDim);

pArray = (int*)malloc((unsigned int)nDim);

if (pArray == NULL)

{ printf (“Out of memory!\n”);

exit(-1);

}

pArray[i] = …

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

#include <stdio.h>

#include <stdlib.h>

#include <malloc.h>

#include <conio.h>

void main()

{

int **ppArr;

int n=4, m=5, i, j ,k;

ppArr = (int**)malloc(n*sizeof(int*));

if (ppArr == NULL)

printf ("Out of memory!\n");

for (i=0; i<n; i++)

{

ppArr[i] = (int*)malloc(m*sizeof(int));

if (ppArr[i] == NULL)

{

printf ("Out of memory!\n"); exit(-1);

}

}

for (j=0; j<n; j++)

for (k=0; k<m; k++)

scanf("%u",&ppArr[j][k]);

for (j=0; j<n; j++)

{ printf("\n");

for (k=0; k<m; k++)

printf("%u ",ppArr[j][k]);

}

for (i=0; i<n; i++)

free(ppArr[i]);

free(ppArr);

getch();

}

Распределение памяти, осуществляемое в этом случае, показано на рисунке: