Skip to content

Работа с функциями Си

Здравствуйте, сегодня на очереди работа с функциями Си. Для начала скажу, что функция — это самостоятельная единица программы, которая спроектирована для реализации конкретной подзадачи, короче говоря, если требуется выполнять набор одних и тех же действий в задаче, то проще будет вынести их в отдельную функцию, и когда вам понадобится выполнить этот набор, просто вызвать по имени функцию.
А вот и примеры:

Функция y = f(x) = 4x^2-8x^2+5x+1 рассматривается как набор точек на отрезке [-9.3; 15.2] c шагом 3.5. Выведите на экран координаты этих точек в две строки: на первой строке – координаты по оси Ох, на второй строке – координаты по оси Оу. Найти и вывести на экран что больше: сумма положительных значений функции или сумма модулей отрицательных значений функции на данном отрезке. Выполнить программу без использования массивов.

Код:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>

double func(double x){
    double y;
    y = 4 * pow(x,2) - 8 * pow(x,2) + 5 * x +1;
    return y;
}

int main(void) {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
	double x = 0, y = 0, mod = 0, sum = 0;
	for (x = -9.3; x <= 15.2; x += 3.5) {
		y = func(x);
		//y= 4 * pow(x,2) - 8 * pow(x,2) + 5 * x +1;
		printf(" Ox %.3lf     ", x);
		if (y >= 0){
			sum += y;
		}
		else {
			mod -= (y);
		}
	}
	printf("\n");
	for (x = -9.3; x <= 15.2; x += 3.5) {
		y =  func(x);
		//y= 4 * pow(x,2) - 8 * pow(x,2) + 5 * x +1;
		printf(" Oy %.3lf   ", y);
		}

	if ( sum < mod ){
		printf("\n");
		printf(" сумма модулей отрицательных значений%.3lf", mod);
	}
	else {
		printf("\n");
		printf(" сумма положительных значений %.3lf", sum);
	}
	return EXIT_SUCCESS;
}

В этом примере я с помощью комментариев показал, как можно использовать функцию. Что касается новых команд, ничего нового. А на счёт алгоритма, в первом цикле находим sum и mod и заодно выводим значения для оси Ox. Второй цикл просто, чтобы вывести в новой строке. Далее сравниваем и выводим наибольшую переменную.
Следующий пример:

С помощью функции void print_console(int, int) вывести на экран каждое пятое число из диапазона [-45; 67]. Затем с помощью функции void print_file(int, int) вывести в файл все числа из этого диапазона, которые заканчиваются на единицу.

Код:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void print_console();
void print_file();

int main(void) {
	int x,y;
	print_console();
	print_file();

	return EXIT_SUCCESS;
}
void print_console(){
    int x, y;
	for (x = - 45; x <= 67; x += 4){
		y = x + 4;
		if (y < 67) {
			printf("%d   ", y);
		}
	}
}

void print_file() {
    int x, y;
	FILE*file;
	file = fopen("file.txt","w");
	for (x = - 45; x <= 67; x += 1){
		y = abs(x % 10);
		if (y == 1) {
			fprintf(file,"%d   ", y);
		}
	}
	fclose(file);
}

В данном примере показано, как сначала объявляется функция, а затем описывается после основного блока (int main{}). Важно помнить, что объявление или объявление с описанием всегда должно идти до основного блока. Новых команд в этом примере нет и алгоритм не должен вас затруднить.
И последний:

Задать значения переменных из файла input.txt и вычислить результат с помощью функции double calculation(…). Итоговое значение вывести на экран. Для учета допустимости значений переменных использовать полный оператор if-else.
d = ((x + y)^0.5 − (a + b)^0.5) / ln(x^2 −b^2)

Код:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <windows.h>

double calculation(double, double, double, double);

int main(void) {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
	double x,y,a,b,d;
	FILE*input;
	input = fopen("input.txt","r");
	fscanf(input,"%lf%lf%lf%lf", &x, &y, &a, &b);
	if (x*x - b*b > 0){
		if ((x + y >= 0) && (a + b >= 0) && (log( pow(x,2)- pow(b,2)) ) != 0) {
			d = calculation(x, y, a, b);
		}
		else {
			printf("неверно введены данные\n");
		}
	}
	else printf("неверно введены данные\n");
	printf("вывод %lf", d);
	return EXIT_SUCCESS;
	fclose(input);
}
 double calculation(double x, double y, double a, double b) {
	double d;
	d=(sqrt(x+y)-sqrt(a+b)) /( log (pow(x,2)- pow(b,2)));
	return d;
}

Снимок4
В примере нет новых команд и алгоритм несложен, но нужно понимать пару тонкостей. При работе с математическими функциями внимательно проверяйте области допустимых значений для той или иной переменной, иначе либо вылетит ошибка, либо программа выдаст машинный ноль, либо ещё какую-нибудь «абру-кадабру». Как раз в этом примере и показана работа с такими областями, если значение нам не подходит для решения выводим «неверно введены данные».

Вот и всё. Пишите вопросы, комментируйте, всем ответим.

Все исходники без файлов txt.
Скачать исходники задачи — 1
Скачать исходники задачи — 2
Скачать исходники задачи — 3

Опубликовано вСи

Будьте первым, кто оставит комментарий

    Добавить комментарий

    Ваш e-mail не будет опубликован. Обязательные поля помечены *