Тема № 5. Функции. Символьные строки и функции над ними
<тип> <имя_функции> (<спецификация параметров>)
<тело функции>
<обозначение_типа> <имя_параметра>
, …
int printf (const char *format, …);
int scanf (const char *format, …);
return; // Возврат без передачи результата
return <выражение>; // Возврат значения
<тип> <имя_функции>(<спецификация параметров>);
double Func(int n, double x);
double Func(int, double);
<обозначение_функции>(<список факт. параметров>)
#include <stdio.h>
#include <conio.h>
int add(int x1, int x2); // прототип (описание) функции
int add(int x1, int x2) // определение функции
{ return (x1 + x2); }
void main()
{
float j = 12.99;
printf("\n1.%d",add(j,14.99));// вызов функции
// Передача float-> int
getch(); // Результат - 26
}
double Mat(long x, int n)
{
if (x*x < n) return (x*2);
return (n – 1);
}
return (double)(x*2);
return (double)(n–1);
…
int func1(int k, double x)
{
k++; x = x*x;
return (k+2);
}
Void main()
{ int k0=12, res;
double x0=2.2;
res = func1(k0, x0);
printf(“k0=%d,x0=%10.4lf”,k0,x0);// k0=12, x0=2.2
// - то, что было до обращения к func1
}
Стек
…
int func1(int *k, double *x)
{
(*k)++;
*x = (*x)*(*x);
return ((*k)+2);
}
Void main()
{ int k0=12, res;
double x0=2.2;
res = func1(&k0, &x0);
printf(“k0=%d, x0= %10.4lf”,k0,x0);// k0=13, x0=4.84
}
double Num[]
double *Num
char Str[] == char *Str
‘\0’
Указатели на функции
<тип>(*<имя_указат.>)(<спецификация_параметров>);
где <тип> - определяет тип возвращаемого функцией значения
<имя_указателя>
<спецификация_параметров>
int (*func0)(void);
int *func0(void);
#include <stdio.h>
#include <conio.h>
Int add(int x1, int x2); // прототип (описание) функции
int sub(int x1, int x2);
int mult(int x1, int x2);
int add(int x1, int x2) { return (x1 + x2); }
int sub(int x1, int x2) { return (x1 - x2); }
int mult(int x1, int x2) { return (x1 * x2); }
Void main()
{
int (*oper)(int x1,int x2);//Указатель oper 0xcf2
printf("\n1.%d",add(12,14));//Явный вызов функции
oper = add;
printf("\n2.%d",(*oper)(112,114));//oper 0x00401005
add(int,int)
oper = sub;
printf("\n3.%d",(*oper)(114,100));//oper 0x00401014
sub(int,int)
oper = mult;
printf("\n4%d",oper(4,100));//Вызов через имя
// указателя oper 0x0040100a mult(int,int)
getch();
}
Массивы указателей на функции
<тип>(*<имя_масс.>[<размер>])(<спец.параметров>);
Пример:
int (*farray[4]) (int);
<int имя_функции (int)>
Главная функция. Передача аргументов главной функции
void main( int argc, char *argv[])
«Programm arguments» раздела Project Settings "D:\Prog\dd\Debug\dd.exe".
char *argv[] эквивалентно описанию char **argv
Указатель на функцию в качестве аргумента другой функции
void qsort( void *base, size_t num, size_t width,
int (*compare)(const void *elem1, const void *elem2));
отрицательное, если *elem1 < *elem2;
положительное, если *elem1 > *elem2;
0, если *elem1 == *elem2;
/* QSORT.C: This program reads the command-line parameters and uses qsort to sort them. It then displays the sorted arguments. */
#include <stdafx.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int compS( const void *arg1, const void *arg2 );
void main( int argc, char **argv )
{
int i;
argv++; argc--;//Eliminate argv[0] from sort:
// Sort remaining args using Quicksort algorithm:
qsort((void *)argv, (size_t)argc, sizeof(char *), compS );
for( i = 0; i < argc; ++i )// Output sorted list:
printf( "%s ", argv[i] );
printf( "\n" );
}
int compS( const void *arg1, const void *arg2 )
{ /* Compare all of both strings: */
return _stricmp(*( char**) arg1, *( char**)arg2);
}
typedef unsigned int size_t;
Output: every good boy deserves favorboy deserves every favor good
Рекурсивные программы
n! = 1*2*…*n, 0!=1.
long Factorial(int n)
{
if(n < 0) return 0; // не определен – возврат нуля
if (n == 0 ) return 1;
return(n* Factorial(n - 1));
}
A() { … B(); …}
B() { … A(); …}
puts |
puts(const char *str); выводит на экран строку str. |
gets |
char* gets(char *str); вводит с экрана строку str. |
1. Функции определения длины строки.
strlen |
unsigned strlen(const char *str); вычисляет длину строки str |
strcspn |
int strcspn(const char *str1, const char *str2); определяет длину первого сегмента строки str1, содержащего символы, не входящие во множество символов строки str2 |
strspn |
int strspn(const char *str1, const char *str2); определяет длину первого сегмента строки str1, содержащего только символы из множества символов строки str2. |
2. Функции получения чисел по их символьному представлению
atof |
double atof(const char *str); преобразует строку str в вещественное число типа double. |
atoi |
int atoi(const char *str); преобразует строку str в целое число типа int. |
atol |
long atol(const char *str); преобразует строку str в целое число типа long. |
3. Функции получения символьного представления чисел
itoa |
char *itoa(int value, char *str, int radix); преобразует целое value в строку str. При изображении числа используется система счисления с основанием radix. Если основание 10 и число отрицательное – первым символом будет «-». |
ltoa |
char *ltoa(long value, char *str, int radix); преобразует длинное целое value в строку str. При изображении числа используется система счисления с основанием radix. |
ultoa |
char *ultoa(unsigned long value, char *str, int radix); преобразует беззнаковое длинное целое value в строку str. При изображении числа используется система счисления с основанием radix. |
4. Функции копирования строк
strcpy |
char * strcpy (char *sDest, const char *sSource); копирует байты строки sSource в строку sDest. |
strncpy |
char * strncpy (char *sDest, const char *sSource, int count); копирует первые count байт строки с в строку sDest. Если count меньше или равно длине sSource заключительный символ ‘\0’ автоматически не добавляется в sDest. В противном случае заключительный символ вставляется после count байт, среди которых строка sSource, дополненная пробелами. |
strdup |
char * strdup (const char *str); выделяет память и переносит в нее копию строки str. |
5. Функции конкатенации строк
strcat |
char * strcat (char *sDest, const char *sSource); приписывает строку sSource к строке sDest. |
6. Функции сравнения строк
strcmp |
char *strcmp (const char *str1, const char *str2); сравнивает строки str1 и str2. Результат отрицателен, если str1 < str2; равен 0, если str1 == str2, и положителен, если str1 > str2. |
strncmp |
char * strncmp (const char *str1, const char *str2, int count); сравнивает первые count байт строк str1 и str2. Результат отрицателен, если str1 < str2; равен 0, если str1 == str2, и положителен, если str1> str2. |
strnicmp |
char * strnicmp (const char *str1, const char *str2, int count); сравнивает первые count байт строк str1 и str2, не учитывая регистра (прописные и строчные буквы считаются одинаковыми). Результат отрицателен, если str1 < str2; равен 0, если str1 == str2, и положителен, если str1> str2. |
7. Функции поиска строк
strchr |
char * strchr (const char *str, int c); ищет в строке str первое вхождение символа c. Возвращает NULL, если символ в строке отсутствует. |
strrchr |
char * strrchr (const char *str, int c); ищет в строке str последнее вхождение символа c. Возвращает NULL, если символ в строке отсутствует. |
strstr |
char * strstr (const char *str1, const char *str2); ищет в строке str1 подстроку str2. Возвращает указатель на тот элемент в строке str1, с которого начинается подстрока str2, или NULL, если подстрока str2 в строке str1 отсутствует. |
strpbrk |
char * strpbrk (const char *str1, const char *str2); ищет в строке str1 первое вхождение любого символа из строки str2. Возвращает NULL, если такой символ в строке отсутствует. |
strtok |
char * strtok (char *str1, const char *str2); ищет в строке str1 лексемы, выделенные символами из второй строки str2. |
8. Функции преобразования строк
strlwr |
char * strlwr (const char *str); преобразует буквы верхнего регистра в строке в соответствующие буквы нижнего регистра. |
strupr |
char * strupr (const char *str); преобразует буквы нижнего регистра в строке в соответствующие буквы верхнего регистра. |
9. Функции заполнения строк
strset |
char * strset (const char *str, int c); Заполняет строку str заданным символом c. |
strnset |
char *strnset (const char *str, int c, int count); Заполняет первые count байт строки str заданным символом c. |
10. Функция для перевода символов
CharToOem |
|
#include <windows.h>
char *mesg = "cannot access file";
char *rus = "файл недоступен";
char rus1[120];
CharToOem(rus,rus1);
printf("%10s\r\n", rus1);
getch();