Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КУРС Программирование на Си.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
606.21 Кб
Скачать

5. Структура программы. Функции.

В отличие от Паскаля в Си нет разделения на процедуры и функции. Имеются только функции, а если они ничего не возвращают, то есть являются аналогом процедур в Паскале, то считается (и явно указывается), что они возвращают значение "пустого" типа void. int nod(int a, int b)

{ if ( !b) return a;

else return nod(b, a%b) ;}

с помощью оператора return функция возвращает значение (и в этом месте заканчивает работу). 5.3. Еще один пример:

void day(int n)

{ switch (n)

{ case 1: printf("\nПн");break;

case 7: printf("\nBc");break;

default: printf("\nФункция day: ошибка в параметре ");} . }

Упрощенно заголовок функции может быть описан так:

<тип возвращаемого значения> <имя функции>(<список формальных параметров>)

2. Формальные параметры функций

Пример: в объявлении функции int sum(int a, int b) а и b ? формальные параметры, при вызове ? sum(x,y) х и у ? фактические. Итак, в этом разделе речь идет именно о формальных параметрах. Список параметров функции задается в круглых скобках после имени функции. Разделяются параметры запятыми.

Пример: int f(int n, int m, float r, char с)

При этом надо иметь в виду следующее:

Необходимо явно указывать тип каждого параметра (даже если типы подряд идущих параметров совпадают).

Пример: void f(int n,int m) ? верно, void f(int n,m) ? неверно.

Примеры:

void f(int a)

{ а++;}

3. Возвращаемые значения функций

Формально верная фраза такая: функция может возвращать значения любого типа, кроме массива или функции (но она может возвращать указатель на массив или функцию). Функция возвращает значение в момент выполнения оператора return, причем (в отличие от Паскаля, где присваивание значения имени функции на ход ее выполнения прямого действия не оказывает) при выполнении оператора return происходит выход из функции.

На Паскале:

function simple(n: integer):booleah; {является ли число простым}

var i: integer; sqrtn:real;

begin simple:=true;

i:=2;sqrtn:=sqrt (n) ;

while (i<=sqrtn) and (n mod i <> 0) inc(i);

if (n mod i=0) then simple:=false ;end;

На Си:

int simple(int n) /*является ли число простым*/

{ int i=2; float sqrtn=sqrt(n);

while (<i<=sqrtn) && (n%i)) i++;

return (n%i) ;

}

Обратите внимание, что в примере на Паскале после первого присваивания simple :=true ничего не происходит, а вот на Си оператор return "выбросил" бы нас из функции.

Самая равная среди равных (функция main)

В простейшем случае программа на Си состоит из одного файла, который, в свою очередь, содержит единственную функцию. И имя ей main. функция main является аналогом тела программы в Паскале.

вычисление квадрата

#include <stdio.h>

float sq(float y)

{return y*y;

}

main ()

{float x;

scanf("%f",&x);

printf("\n%f\n",sq(x));

}

НОД

# include <stdio.h>

int nod(int a, int b)

{ int i;

for (i=a;i>=1;i--) if ((a%i==0)&&(b%i==0)) return(i);

}

main()

{int x,y;

scanf("%d%d", &x,&y);

if (x>y) printf("%d",nod(y,x));else printf("%d",nod(x,y));

}

простое число

#include <stdlib.h>

#include <math.h>

int prost(int x)

{int i;

for (i=2;i<x;i++)

if (x%i==0) return(0);

return(1);

}

main()

{

int n;

for (n=1;n<20;n++) if (prost(n)) printf("\n%d", n);

}

Пример рекурсивной функции вычисления факториала

#include <stdio.h>

unsigned long fact(unsigned long n)

{ if (!n) return 1; else return n*fact(n-1);}

void main(void)

{ unsigned long n;

printf("\nЧисло? (<=12)");scanf("%ld",&n) ;

printf("Факториал %ld = %ld",n,fact(n));

}

Перевод десятичного числа в систему счисления с другим основанием (меньшим 10)

#include <stdio.h>

void translate(int n, int p)

{ if (n>=p) translate(n/p,p) ;

printf("%d",n%p) ;

}

void main (void)

{ int n,p;

printf( "n\Число?") ;scanf("%d", &n) ;

printf ("Основание системы счисления?");scant("%d",&p);

translate(n,p) ;

printf("\n") ;

}

Пример функции вычисления квадратного корня

#include <stdio.h>

#include <math.h>

float root2 (float x)

{ float e=lE-10, xn, xnplusl=x;

do {

xn=xnplus1;

xnplus1=0.5*(xn+x/xn) ;

} while (fabs(xn-xnplus1)>e) ;

return xnplus1;

}

void main(void)

{ float х;

printf ("\nЧисло?");scant("%f",&x) ;

printf("Наша функция возвращает: %f",root2(x);

printf("\nФункция sqrt возвращает: %f",sgrt(x));

}

. СТАНДАРТНЫЕ ПРОГРАММЫ.

К наиболее интересным и важным функциям языка относится printf.

Она предназначена для форматированного вывода данных. Например, что бы вывести некоторое сообщение на экран дисплея, достаточно использовать вызов функций: Printf (“Интересное сообщение\ n”);

Обычно printf служит для вывода значений переменных. Первым аргументом служит строка форматов, а последующими, если они есть, - выводимые объекты. Строка форматов может включать обычные символы, просто копируемые при выводе и спецификации преобразования, которые начинаются со знака %, за ним следует символ преобразования. Например, если a , b , c - целые величины, то их значения могут быть выданы в десятичном виде следующей командой:

printf(“Значения a , b, c равны: %d %d %d \ n, “ a, b, c);

Каждая спецификация преобразования соответствует одному из аргументов, которые следуют за форматной строкой; между ними устанавливается взаимно однозначное соответствие. Буква d в спецификации преобразования указывает, что значение аргумента должно быть нап6ечатано как десятичное число. Из других символов преобразования отметим : c- для вывода отдельного символа; s- для печати символьной строки; x и о- для вывода шестнадцатиричных и восьмеричных чисел соответственно; f- для вывода чисел с плавающей точкой. В следующем примере:

printf (“%c = %d \ n”, g, g);

значение переменной g выводится как символ алфавита, а после знака равенства—как числовое значение, соответствующее внутреннему (машинному) коду этого символа. Вот почему в качестве аргументов дважды используется одно и тоже имя. Перед символом преобразования может стоять числовой коэффициент, явно указывающий колличество позиций в выводимой строке, отведенных для элемента вывода:

printf(“%5d %c \n”, i*i, s);