Указатели и функции в языке программирования С
Задание 4
- Ввод массива строк осуществите с клавиатуры построчно.
- Ввод массива строк осуществите с клавиатуры одной строкой, содержащей несколько слов, разделенных пробелами, и заполните символьный массив так, чтобы в каждом элементе было по одному слову из исходной строки.
- Измените программу так, чтобы при сравнении строк не различались строчные и прописные буквы латинского алфавита.
- Произведите сортировку по возрастанию длин слов с использованием указателя на функции.
- Произведите сортировку по уменьшению длин слов с использованием указателей на функции.
Пример 5. Напишите программу построения на экране дисплея графика следующей функции:

Предусмотрите возможность записи в текстовый файл графика данной функции.
Для решения примера используем средства вывода на печать форматированных данных без применения специальных графических библиотек.
Программный код решения примера:
/ Заголовочные файлы
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
// Размеры диаграммы по ширине и высоте экрана
#define SCREENW 79
#define SCREENH 25
// Функция построения графика заданной функции
void plot (FILE *fout, double a, double b, double (*f) (double))
{
// Формальные параметры функции plot
// FILE *fout – указатель на поток вывода
// double a – левая граница оси абсцисс
// double b – правая граница оси абсцисс
// double (*f) (double) – указатель на функцию
char screen[SCREENW][SCREENH];
double x, y[SCREENW];
double ymin = 0, ymax = 0;
double hx, hy;
int i, j;
int xz, yz;
// hx – шаг по оси абсцисс
hx = (b - a) / (SCREENW - 1);
for (i = 0, x = a; i < SCREENW; ++i, x += hx) {
// вычисляем значение функции
y[i] = f (x);
// запоминаем минимальное и максимальное значения
if (y[i] < ymin) ymin = y[i];
if (y[i] > ymax) ymax = y[i];
}
hy = (ymax - ymin) / (SCREENH - 1);
yz = (int)floor (ymax / hy + 0.5);
xz = (int)floor (-a / hx + 0.5);
// рисование осей координат
for (j = 0; j < SCREENH; ++j) {
for (i = 0; i < SCREENW; ++i) {
if (j == yz && i == xz)
screen[i][j] = '+'; // '.', '?', '+'
else if (j == yz)
screen[i][j] = '-';
else if (i == xz)
screen[i][j] = '|';
else
screen[i][j] = ' ';
}
}
// рисование графика функции
for (i = 0; i < SCREENW; ++i) {
j = (int)floor ((ymax - y[i]) / hy + 0.5);
screen[i][j] = '.'; // символ начертания графика
}
// вывод результата в файл или в стандартный поток stdout
for (j = 0; j < SCREENH; ++j) {
for (i = 0; i < SCREENW; ++i)
fputc (screen[i][j], fout);
fprintf (fout, "\n");
}
}
// Заданная функция
double f (double x)
{
return sin (3.0*x) * exp (-x / 3.0);
//return x * x - 3;
}
int main (void)
{
// Вывод графика в стандартный поток (консоль)
plot (stdout, 0.0, 10.0, f);
printf("\n\n … Press any key: ");
_getch();
return 0;
}В программе используется указатель на файл, который может быть стандартным потоком, т. е. экран дисплея. В главной функции main() происходит обращение к функции рисования графика plot(), в которую вводят фактические параметры, в частности файл – это stdout, т. е. стандартный поток, 0.0 – это левая граница оси абсцисс, 10.0 – правая граница оси абсцисс, f – имя функции с описанием зависимости y = f(x).
Пример выполнения программы показан на рис. 11.6.
Задание 5
- Внесите в программу изменения для вывода графика в текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа.
- Проанализируйте программу с целью возможного улучшения вида графика заданной функции.
- В программу добавьте описание кубической и параболической функций. Напишите необходимые строчки программного кода для запроса о построении графика соответствующей функции.
Контрольные вопросы
- Каким образом можно вернуть из функции несколько значений?
- Каким образом определяется тип функции?
- Как выглядит описание функции, которая возвращает указатель на заданный тип, например, char?
- Можно ли использовать многоуровневую адресацию для функции, которая возвращает указатель на заданный тип? Если можно, то как происходит определение такой функции?
- В каком месте программы можно определить указатель на функцию?
- Имеет ли указатель на функцию прототип и определение?
- Как осуществляется вызов функции с помощью указателя?
- Как взаимосвязаны между собой объявление функции, ее определение и вызов функции?
