Опубликован: 14.12.2010 | Уровень: для всех | Доступ: платный
Лекция 12:

Указатели и функции в языке программирования С

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

Задание 4

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

Пример 5. Напишите программу построения на экране дисплея графика следующей функции:

y=sin(3x)e^{\frac x 3}.

Предусмотрите возможность записи в текстовый файл графика данной функции.

Для решения примера используем средства вывода на печать форматированных данных без применения специальных графических библиотек.

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

/ Заголовочные файлы
#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.

Пример построения графика функции на консоли

Рис. 11.6. Пример построения графика функции на консоли

Задание 5

  1. Внесите в программу изменения для вывода графика в текстовый файл с именем compX.txt, где Х – номер компьютера, на котором выполняется лабораторная работа.
  2. Проанализируйте программу с целью возможного улучшения вида графика заданной функции.
  3. В программу добавьте описание кубической и параболической функций. Напишите необходимые строчки программного кода для запроса о построении графика соответствующей функции.

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

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