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

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

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

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