Опубликован: 14.12.2010 | Доступ: свободный | Студентов: 3124 / 709 | Оценка: 4.53 / 4.12 | Длительность: 26:28:00
Лекция 11:

Общие сведения о функциях языка С

< Лекция 10 || Лекция 11: 1234 || Лекция 12 >

Задание 4

  1. Подсчитайте число итераций при поиске элемента по заданному ключу.
  2. Напишите программу без заграждающего элемента. Подсчитайте число итераций при поиске элемента по заданному ключу. Сравните с числом итераций при поиске с заграждающим элементом.
  3. Сформируйте динамический одномерный массив размерностью 12*Х, и заполните его целыми случайными числами, распределенными равномерно из интервала [0; 20*X], где Х – номер компьютера, за которым выполняется лабораторная работа. Ввод ключа для поиска выполните с клавиатуры. Поиск выполните с заграждающим элементом.
  4. С учетом предыдущего пункта задания ввод ключа задайте случайным образом. Если по этому ключу элемент не найден, то программным путем организовать повторный поиск с заданием нового случайного ключа. В случае, если при 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.

Пример выделения слов из строки

Рис. 10.6. Пример выделения слов из строки

Задание 5

  1. В программу включите обработку символов запятая ",", точки с запятой ";" и точки "." в качестве разделителей слов.
  2. Введите в строку свою фамилию, имя, год рождения, место рождения, специальность, на которой вы обучаетесь, номер группы и курс обучения. Выполните вывод на консоль.
  3. С учетом предыдущего пункта выполните выделение фамилии и курс обучения.
  4. В программу включите прототип функции wordstr().

Пример 6. Написать программу расчета суммы и среднего арифметического произвольного количества данных. В качестве ключевых слов для выбора варианта расчета принять mean (среднее) и sum (сумма).

В данном примере необходимо использовать функцию с переменным числом аргументов. Формула расчета среднего арифметического (m):

m=\frac{1}{n}\sum^n_{i=1}x_i,

где n – количество числовых данных, x_i – текущее число.

Программный код решения примера

#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.

Пример выполнения программы

Рис. 10.7. Пример выполнения программы

Задание 6

  1. Напишите функцию с явным указанием количества аргументов.
  2. Включите в программу расчет исправленной выборочной дисперсии (D), которая рассчитывается по формуле.
    D=\frac{1}{n-1}\sum^n_{i=1}(x_i,-m)^2,
    где m – среднее арифметическое заданных чисел.

Контрольные вопросы

  1. Что лежит в основе всех программ, созданных на языке С?
  2. Какие типы данных может возвращать функция? И что не может возвращать?
  3. Что такое прототип функции? Какие элементы объявления функции входят в ее прототип?
  4. В чем разница между фактическими и формальными параметрами функции?
  5. Какой способ передачи параметров в функциях предусматривает синтаксис языка С?
  6. Как можно изменить значение аргумента функции в теле самой функции?
  7. Какая область видимости переменных, определенных в теле функции?
  8. Можно ли использовать функцию без параметров и без служебного слова void? К каким последствиям это может привести?
  9. Как следует Напишите программу, состоящую из нескольких пользовательских функций, без прототипов созданных функций?
< Лекция 10 || Лекция 11: 1234 || Лекция 12 >
Мухаммадюсуф Курбонов
Мухаммадюсуф Курбонов