Указатели и функции в языке программирования С
Задание 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?
- Можно ли использовать многоуровневую адресацию для функции, которая возвращает указатель на заданный тип? Если можно, то как происходит определение такой функции?
- В каком месте программы можно определить указатель на функцию?
- Имеет ли указатель на функцию прототип и определение?
- Как осуществляется вызов функции с помощью указателя?
- Как взаимосвязаны между собой объявление функции, ее определение и вызов функции?