помогите пожалуйста. не могу скачать ms. visual studio |
Общие сведения о функциях языка С
Задание 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? К каким последствиям это может привести?
- Как следует Напишите программу, состоящую из нескольких пользовательских функций, без прототипов созданных функций?