Руководство полного чайника по программированию на языке Си

       

напечатать корни из чисел от


/* Задача: напечатать корни из чисел от 1 до 100.

Новая информация: Нам понадобится новый тип данных - ДЕЙСТВИТЕЛЬНЫЕ ЧИСЛА. Это числа, имеющие дробную часть (после точки). Как мы уже знаем, целые - это int. буква - это char. действительное число - это double. (есть еще слово float, но им пользоваться не рекомендуется).

Для вычисления корня используется итерационный алгоритм Герона.

q = корень из x;

q[0] := x; q[n+1] := 1/2 * ( q[n] + x/q[n] );

Главное тут не впасть в ошибку, не клюнуть на q[n] и не завести массив. Нам не нужны результаты каждой итерации, нам нужен только конечный ответ. Поэтому нам будет вполне достаточно ОДНОЙ, но изменяющейся в цикле, ячейки q. */

#include

/* Еще одно новое ключевое слово - const. Обозначает константы. В отличие от переменных, такие имена нельзя изменять. То есть, если где-то потом попробовать написать epsilon = ... ; то это будет ошибкой. */ const double epsilon = 0.0000001; /* точность вычислений */

/* Функция вычисления модуля числа */ double doubleabs(double x){ if(x < 0) return -x; else return x; }

/* Функция вычисления квадратного корня */ double sqrt(double x){

double sq = x;

/* Такая конструкция есть просто склейка двух строк: double sq; sq = x; Называется это "объявление переменной с инициализацией". */

while(doubleabs(sq*sq - x) >= epsilon){ sq = 0.5 * (sq + x/sq); } return sq; }



void main() { int n;

for(n=1; n <= 100; n++) printf("sqrt(%d)=%lf\n", n, sqrt((double) n) );

}

/* Здесь в операторе printf() мы печатаем ДВА выражения. ФОРМАТ ЗНАЧЕНИЕ ------ -------- %d -- n %lf -- sqrt((double) n)

По формату %d печатаются значения типа int. По формату %c печатаются значения типа char. По формату %lf (или %g) печатаются значения типа double.

Что значит "напечатать значение выражения sqrt(xxx)" ? Это значит: - вызвать функцию sqrt() с аргументом, равным xxx; - вычислить ее; - возвращенное ею значение напечатать по формату %lf, то есть как действительное число.

Заметьте, что тут возвращаемое значение НЕ присваивается никакой переменной, мы не собираемся его хранить.



Точно так же, как в операторе x = 12 + 34; 12 и 34 не хранятся ни в каких переменных, а оператор
printf("%d\n", 12);
печатает ЧИСЛО 12, а не переменную.
Точно так же, как можно писать
double z;
z = sqrt(12) + sqrt(23);
где значение, вычисленное каждой функцией, НЕ хранится в своей собственной переменной (такая переменная на самом деле существует в компьютере, но программисту она не нужна и недоступна). Или
z = sqrt( sqrt(81));
(корень из корня из 81 --> даст 3)
Далее, что означает конструкция (double) n ? Функция sqrt() требует аргумента типа double. Мы же предлагаем ей целый аргумент
int n;
Целые и действительные числа представлены в памяти машины ПО-РАЗНОМУ, поэтому числа
12 и 12.0 хранятся в памяти ПО-РАЗНОМУ.
Машина умеет преобразовывать целые числа в действительные и наоборот, надо только сказать ей об этом. Оператор (double) x называется "приведение типа к double".
Заметим, что часто преобразование типа выполняется автоматически.
Так, например, при сложении int и double int автоматически приводится к double, и результат имеет тип double.
int var1; double var2, var3;
var1 = 2; var2 = 2.0; var3 = var1 + var2;
что означает на самом деле
var3 = (double) var1 + var2;
var3 станет равно 4.0
Более того, к примеру тип char - это тоже ЦЕЛЫЕ ЧИСЛА из интервала 0...255. Каждая буква имеет код от 0 до 255.
*/

Содержание раздела