Общие сведения о функциях языка С
Задание 4
- Подсчитайте число итераций при поиске элемента по заданному ключу.
- Напишите программу без заграждающего элемента. Подсчитайте число итераций при поиске элемента по заданному ключу. Сравните с числом итераций при поиске с заграждающим элементом.
- Сформируйте динамический одномерный массив размерностью 12*Х, и заполните его целыми случайными числами, распределенными равномерно из интервала [0; 20*X], где Х – номер компьютера, за которым выполняется лабораторная работа. Ввод ключа для поиска выполните с клавиатуры. Поиск выполните с заграждающим элементом.
- С учетом предыдущего пункта задания ввод ключа задайте случайным образом. Если по этому ключу элемент не найден, то программным путем организовать повторный поиск с заданием нового случайного ключа. В случае, если при 5*Х-кратном поиске элемент не найден, вывести сообщение об отсутствии искомого элемента по всем заданным ключам. Поиск выполнить с заграждающим элементом.
Пример 5. Напишите программу выделения слов из символьной строки, когда слова в ней разделены пробелами, и поместите каждое слово в отдельной строке свободного (вспомогательного массива) [10.4].
Программный код решения примера:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#define N 123
#define M 40
int wordstr(char *c, char **FA) {
int Ln, n = 0, i = 0;
char *wr;
char *tempstr;
Ln = strlen(c);
tempstr = (char *)calloc(Ln + 1, sizeof(char));
strcpy(tempstr, c);
wr = strtok(tempstr, " ");
Ln = strlen(wr);
FA[i] = (char *)calloc(Ln + 1, sizeof(char));
strcpy(FA[i++], wr);
n++;
while (wr = strtok(NULL, " ")) {
Ln = strlen(wr);
FA[i] = (char *) calloc(Ln + 1, sizeof(char));
strcpy(FA[i++], wr);
n++;
}
free(tempstr);
return n;
}
int main (void)
{
int i, n;
char *Farr[M];
char str[N];
printf("\n\t Enter the string of characters:\n >> ");
gets_s(str, N-1);
printf("\n\t The original string of characters:\n");
printf(" %s\n", str);
//Обращение к функции обработки строки
n = wordstr(str, Farr);
//Распечатка слов, помещенных в свободный массив
printf("\n\t The characters in a free array:");
for (i = 0; i < n; ++i)
printf("\n\t %s", Farr[i]);
//Освобождение памяти, занятую выделенными словами
for (i = 0; i < n; ++i)
{free(Farr[i]); Farr[i] = NULL;}
printf("\n\n Press any key: ");
_getch();
return 0;
}В программе использована библиотечная функция strtok(), которая выделяет слова из строки. При этом для каждого выделенного слова получаем динамическую память с помощью функции calloc(). Адрес выделенной памяти помещаем в соответствующий указатель массива свободных строк FA[].
Обратите внимание, что в функции calloc() вводится число на единицу больше, чем длина строки. Это сделано для учета символа завершения строки (или одного слова), т.е. для символа "\0"
Для исключения предупреждений о безопасной работе с функциями strcpy(), strtok() в MS Visual Studio в программе используется директива #define _CRT_SECURE_NO_WARNINGS.
Результат выполнения программы показан на рис. 10.6.
Задание 5
- В программу включите обработку символов запятая ",", точки с запятой ";" и точки "." в качестве разделителей слов.
- Введите в строку свою фамилию, имя, год рождения, место рождения, специальность, на которой вы обучаетесь, номер группы и курс обучения. Выполните вывод на консоль.
- С учетом предыдущего пункта выполните выделение фамилии и курс обучения.
- В программу включите прототип функции wordstr().
Пример 6. Написать программу расчета суммы и среднего арифметического произвольного количества данных. В качестве ключевых слов для выбора варианта расчета принять mean (среднее) и sum (сумма).
В данном примере необходимо использовать функцию с переменным числом аргументов. Формула расчета среднего арифметического (m):

где
– количество числовых данных,
– текущее число.
Программный код решения примера
#include <conio.h>
#include <string.h>
#include <stdarg.h>
#include <float.h>
/* Прототип функции с переменным числом аргументов*/
double varfun(char str[], double v1, ...);
int main(void)
{
double v1 = 10.0,
v2 = 2.5,
control;
char str[121];
printf("\n Enter one of the key words 'mean' or 'sum': ");
gets_s(str, 120);
control = varfun(str, v1, v2, 7.5, 0.0);
if (control < DBL_MAX)
printf("\n Result: %lf\n", control);
else
printf("\n Invalid input keyword.\n");
printf("\n\n ... Press any key: ");
_getch();
return 0;
}
/* Определение функции с переменным числом аргументов */
double varfun( char str[], double v1, ...) {
/* Указатель на переменные списка аргументов */
va_list parg;
double sum = v1;
double value = 0.0; /* значение аргумента */
int count = 1; /* начальное количество аргументов */
int k, p;
char *ch = "mean";
char *ch2 = "sum";
// Лексиграфическое сравнение строк
k = strcmp(str, ch);
if ( !k ) // k == 0
p = 1;
else if ( k ) // k != 0
{
k = strcmp(str, ch2);
if ( !k )
p = 2;
else
p = 0;
}
if ( p == 1 )
{
va_start(parg,v1); /* инициализация указателя parg */
/* Просмотр списка аргументов*/
while( (value = va_arg(parg, double)) != 0.0)
{
// Суммирование числовых аргументов функции varfun()
sum += value;
count++;
}
/* Завершение процесса счтывания аргументов */
va_end(parg);
return sum/count;
}
if ( p == 2 )
{
va_start(parg,v1);
while( (value = va_arg(parg, double)) != 0.0)
{
sum += value;
count++;
}
va_end(parg);
return sum;
}
return DBL_MAX;
}Возможный вариант выполнения программы показан на рис. 10.7.
Задание 6
- Напишите функцию с явным указанием количества аргументов.
- Включите в программу расчет исправленной выборочной дисперсии (D), которая рассчитывается по формуле.где

– среднее арифметическое заданных чисел.
Контрольные вопросы
- Что лежит в основе всех программ, созданных на языке С?
- Какие типы данных может возвращать функция? И что не может возвращать?
- Что такое прототип функции? Какие элементы объявления функции входят в ее прототип?
- В чем разница между фактическими и формальными параметрами функции?
- Какой способ передачи параметров в функциях предусматривает синтаксис языка С?
- Как можно изменить значение аргумента функции в теле самой функции?
- Какая область видимости переменных, определенных в теле функции?
- Можно ли использовать функцию без параметров и без служебного слова void? К каким последствиям это может привести?
- Как следует Напишите программу, состоящую из нескольких пользовательских функций, без прототипов созданных функций?

